From 3596bdbfd1d0fcf0a1ca71618079c51ce0ab0064 Mon Sep 17 00:00:00 2001 From: DecafDev <40307803+decaf-dev@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:26:01 -0600 Subject: [PATCH] Append to split content (#14) * feat: add append to split content setting * test: add tests * chore: bump version --- README.md | 34 ++++ __mocks__/obsidian.ts | 1 + bun.lockb | Bin 63888 -> 165117 bytes jest.config.js | 8 + manifest.json | 2 +- package.json | 6 +- src/main.ts | 112 ++----------- src/obsidian/note-splitter-settings-tab.ts | 10 ++ src/splitter/remove-frontmatter-block.ts | 4 + src/splitter/sanitize-file-name.ts | 22 +++ src/splitter/split-by-delimiter.ts | 102 ++++++++++++ src/splitter/truncate-file-name.ts | 15 ++ src/types.ts | 18 +++ src/utils.ts | 37 ----- test/integration/split-by-delimiter.test.ts | 170 ++++++++++++++++++++ test/unit/remove-frontmatter-block.test.ts | 19 +++ test/unit/sanitize-file-name.test.ts | 47 ++++++ test/unit/truncate-file-name.test.ts | 26 +++ tsconfig.json | 4 +- versions.json | 3 +- 20 files changed, 502 insertions(+), 138 deletions(-) create mode 100644 __mocks__/obsidian.ts create mode 100644 jest.config.js create mode 100644 src/splitter/remove-frontmatter-block.ts create mode 100644 src/splitter/sanitize-file-name.ts create mode 100644 src/splitter/split-by-delimiter.ts create mode 100644 src/splitter/truncate-file-name.ts create mode 100644 src/types.ts delete mode 100644 src/utils.ts create mode 100644 test/integration/split-by-delimiter.test.ts create mode 100644 test/unit/remove-frontmatter-block.test.ts create mode 100644 test/unit/sanitize-file-name.test.ts create mode 100644 test/unit/truncate-file-name.test.ts diff --git a/README.md b/README.md index 6ce12f6..a3318d8 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,40 @@ If disabled, a timestamp will be used as the title e.g. `note-splitter-170259191 > [!NOTE] > Disabled by default. +### Append to split content + +This text will be appended to each section of split content. + +**Example:** + +Suppose you have two sentences and your delimiter is set to a period (`.`). + +```markdown +This is sentence 1. This is sentence 2. +``` + +The split content would result in: + +```markdown +This is sentence 1 +``` + +```markdown +This is sentence 2 +``` + +If you want to retain the period at the end of each sentence, simply add a period into the input field of this setting. + +The updated result would be: + +```markdown +This is sentence 1. +``` + +```markdown +This is sentence 2. +``` + ### Delete original If enabled, the original note will be deleted after a successful split. diff --git a/__mocks__/obsidian.ts b/__mocks__/obsidian.ts new file mode 100644 index 0000000..490db5e --- /dev/null +++ b/__mocks__/obsidian.ts @@ -0,0 +1 @@ +export const normalizePath = jest.fn((path) => path); diff --git a/bun.lockb b/bun.lockb index 74bd8e4ec72886f5545315f4620b4cfc10cff3c5..a7b7ff6cf7bd8dd21cd91602a316677697302347 100755 GIT binary patch literal 165117 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 U$d^pEcV+&-X7Vi{4l0=qWs;SrLWha-i| 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 delta 12336 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/src/$1", + }, +}; diff --git a/manifest.json b/manifest.json index a3a3bc4..5a7f845 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "note-splitter", "name": "Note Splitter", - "version": "1.1.1", + "version": "1.2.0", "minAppVersion": "0.15.0", "description": "Split a note into individual notes based on a delimiter.", "author": "DecafDev", diff --git a/package.json b/package.json index 188f323..01b2503 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "name": "obsidian-note-splitter", - "version": "1.1.1", + "version": "1.2.0", "description": "Split notes based on a delimiter", "main": "main.js", "scripts": { "dev": "node esbuild.config.mjs", "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "test": "jest --config jest.config.js", "format": "prettier --write .", "version": "node version-bump.mjs && git add manifest.json versions.json" }, @@ -13,13 +14,16 @@ "author": "DecafDev", "license": "MIT", "devDependencies": { + "@types/jest": "^29.5.12", "@types/node": "^16.11.6", "@typescript-eslint/eslint-plugin": "5.29.0", "@typescript-eslint/parser": "5.29.0", "builtin-modules": "3.3.0", "esbuild": "0.17.3", + "jest": "^29.7.0", "obsidian": "latest", "prettier": "^3.3.2", + "ts-jest": "^29.2.4", "tslib": "2.4.0", "typescript": "4.7.4" } diff --git a/src/main.ts b/src/main.ts index a28e715..c029695 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,18 +1,13 @@ -import { MarkdownView, Notice, Plugin, TFile, normalizePath } from "obsidian"; -import { escapeInvalidFileNameChars, removeFrontmatterBlock, trimForFileName } from "./utils"; +import { MarkdownView, Notice, Plugin } from "obsidian"; import NoteSplitterSettingsTab from "./obsidian/note-splitter-settings-tab"; - -interface NoteSplitterSettings { - saveFolderPath: string; - useContentAsTitle: boolean; - delimiter: string; - deleteOriginalNote: boolean; -} +import { splitByDelimiter } from "./splitter/split-by-delimiter"; +import { NodeFileSystem, NoteSplitterSettings, Notifier } from "./types"; const DEFAULT_SETTINGS: NoteSplitterSettings = { saveFolderPath: "note-splitter", useContentAsTitle: false, delimiter: "\\n", + appendToSplitContent: "", deleteOriginalNote: false, }; @@ -40,101 +35,24 @@ export default class NoteSplitterPlugin extends Plugin { return; } - if (view.getMode() !== 'source') { - new Notice("Please switch to editing mode to split the note."); + if (view.getMode() !== "source") { + new Notice("Please switch to editing mode to split this note."); return; } - this.splitNoteByDelimiter(file); + const fileSystem: NodeFileSystem = { + create: (filePath, content) => this.app.vault.create(filePath, content), + createFolder: (folderPath) => this.app.vault.createFolder(folderPath), + delete: (file) => this.app.vault.delete(file), + read: (file) => this.app.vault.read(file), + }; + const notifier: Notifier = (message: string) => new Notice(message); + await splitByDelimiter(fileSystem, notifier, file, this.settings); }, }); } - onunload() { } - - private async splitNoteByDelimiter(file: TFile) { - //Obsidian will store `\n`` as `\\n` in the settings - const delimiter = this.settings.delimiter.replace(/\\n/g, "\n"); - - if (delimiter === "") { - new Notice("No delimiter set. Please set a delimiter in the settings."); - return; - } - - const data = await this.app.vault.cachedRead(file); - - const dataWithoutFrontmatter = removeFrontmatterBlock(data); - if (dataWithoutFrontmatter === "") { - new Notice("No content to split."); - return; - } - - const splitContent = dataWithoutFrontmatter - .split(delimiter) - .map((content) => content.trim()) - .filter((content) => content !== ""); - - if (splitContent.length === 0) { - new Notice("No content to split."); - return; - } - - if (splitContent.length === 1) { - new Notice("Only one piece of content found. Nothing to split."); - return; - } - - const folderPath = - this.settings.saveFolderPath || - file.parent?.path || - this.settings.saveFolderPath; - - try { - await this.app.vault.createFolder(folderPath); - } catch (err) { - //Folder already exists - } - - let filesCreated = 0; - for (const [i, content] of splitContent.entries()) { - let fileName = content.split("\n")[0]; - if (this.settings.useContentAsTitle) { - fileName = escapeInvalidFileNameChars(fileName); - fileName = trimForFileName(fileName, ".md"); - } else { - fileName = `split-note-${Date.now() + i}`; - } - - const filePath = normalizePath(`${folderPath}/${fileName}.md`); - - try { - await this.app.vault.create(filePath, content); - filesCreated++; - } catch (err) { - if (err.message.includes("already exists")) { - const newFilePath = `${folderPath}/Split conflict ${crypto.randomUUID()}.md`; - try { - await this.app.vault.create(newFilePath, content); - filesCreated++; - } catch (err) { - console.error(err); - new Notice(`Error creating file: ${err.message}`); - } - continue; - } - new Notice(`Error creating file: ${err.message}`); - console.log(err); - } - } - - if (filesCreated === splitContent.length && this.settings.deleteOriginalNote) { - await this.app.vault.delete(file); - } - - new Notice( - "Split into " + filesCreated + " note" + (filesCreated > 1 ? "s" : "") + ".", - ); - } + onunload() {} async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); diff --git a/src/obsidian/note-splitter-settings-tab.ts b/src/obsidian/note-splitter-settings-tab.ts index cf449da..e63a729 100644 --- a/src/obsidian/note-splitter-settings-tab.ts +++ b/src/obsidian/note-splitter-settings-tab.ts @@ -48,6 +48,16 @@ export default class NoteSplitterSettingsTab extends PluginSettingTab { }), ); + new Setting(containerEl) + .setName("Append to split content") + .setDesc("Text to append to the split content.") + .addText((text) => + text.setValue(this.plugin.settings.appendToSplitContent).onChange(async (value) => { + this.plugin.settings.appendToSplitContent = value; + await this.plugin.saveSettings(); + }), + ); + new Setting(containerEl) .setName("Delete original") .setDesc("Delete the original note after a successful split.") diff --git a/src/splitter/remove-frontmatter-block.ts b/src/splitter/remove-frontmatter-block.ts new file mode 100644 index 0000000..285f68e --- /dev/null +++ b/src/splitter/remove-frontmatter-block.ts @@ -0,0 +1,4 @@ +export const removeFrontmatterBlock = (content: string) => { + const FRONTMATTER_REGEX = /^---[\s\S]*?---/; + return content.replace(FRONTMATTER_REGEX, "").trim(); +}; diff --git a/src/splitter/sanitize-file-name.ts b/src/splitter/sanitize-file-name.ts new file mode 100644 index 0000000..da65d15 --- /dev/null +++ b/src/splitter/sanitize-file-name.ts @@ -0,0 +1,22 @@ +/** + * Sanitizes a file name for use in a file system + */ +export const sanitizeFileName = (name: string) => { + // Replace colon with hyphen + name = name.replace(/:/g, "-"); + // Replace back slash with space + name = name.replace(/\\/g, " "); + // Replace forward slash with space + name = name.replace(/\//g, " "); + // Replace carrot with nothing + name = name.replace(/\^/g, ""); + // Replace left bracket with nothing + name = name.replace(/\[/g, ""); + // Replace right bracket with nothing + name = name.replace(/\]/g, ""); + // Replace hash tag with nothing + name = name.replace(/#/g, ""); + // Replace pipe with nothing + name = name.replace(/\|/g, ""); + return name.trim(); +}; diff --git a/src/splitter/split-by-delimiter.ts b/src/splitter/split-by-delimiter.ts new file mode 100644 index 0000000..30fa78c --- /dev/null +++ b/src/splitter/split-by-delimiter.ts @@ -0,0 +1,102 @@ +import { normalizePath, TFile } from "obsidian"; +import { removeFrontmatterBlock } from "./remove-frontmatter-block"; +import { sanitizeFileName } from "./sanitize-file-name"; +import { truncateFileName } from "./truncate-file-name"; +import { NodeFileSystem, NoteSplitterSettings, Notifier } from "src/types"; + +export const splitByDelimiter = async ( + fileSystem: NodeFileSystem, + notify: Notifier, + file: TFile, + { + delimiter, + saveFolderPath, + useContentAsTitle, + appendToSplitContent, + deleteOriginalNote, + }: Pick< + NoteSplitterSettings, + | "saveFolderPath" + | "delimiter" + | "useContentAsTitle" + | "appendToSplitContent" + | "deleteOriginalNote" + >, +) => { + const escapedDelimiter = delimiter.replace(/\\n/g, "\n"); + + if (escapedDelimiter === "") { + notify("No delimiter set. Please set a delimiter in the settings."); + return; + } + + const data = await fileSystem.read(file); + const dataWithoutFrontmatter = removeFrontmatterBlock(data); + if (dataWithoutFrontmatter === "") { + notify("No content to split."); + return; + } + + const splitContent = dataWithoutFrontmatter + .split(escapedDelimiter) + .map((content) => content.trim()) + .filter((content) => content !== ""); + + if (splitContent.length === 1) { + notify("Only one section of content found. Nothing to split."); + return; + } + + const folderPath = saveFolderPath || ""; + + try { + await fileSystem.createFolder(folderPath); + } catch (err) { + // Folder already exists + } + + let filesCreated = 0; + for (const [i, originalContent] of splitContent.entries()) { + let updatedContent = originalContent; + if (appendToSplitContent.length > 0) { + updatedContent += appendToSplitContent; + } + + let fileName = ""; + if (useContentAsTitle) { + fileName = originalContent.split("\n")[0] + ".md"; + } else { + fileName = `split-note-${Date.now() + i}.md`; + } + + fileName = sanitizeFileName(fileName); + fileName = truncateFileName(fileName); + + const filePath = normalizePath(`${folderPath}/${fileName}`); + + try { + await fileSystem.create(filePath, updatedContent); + filesCreated++; + } catch (err) { + if (err.message.includes("already exists")) { + const newFilePath = `${folderPath}/Split conflict ${crypto.randomUUID()}.md`; + try { + await fileSystem.create(newFilePath, updatedContent); + filesCreated++; + } catch (err) { + console.error(err); + notify(`Error creating file: ${err.message}`); + } + continue; + } + notify(`Error creating file: ${err.message}`); + console.log(err); + } + } + + if (deleteOriginalNote && filesCreated === splitContent.length) { + await fileSystem.delete(file); + } + + notify("Split into " + filesCreated + " note" + (filesCreated > 1 ? "s" : "") + "."); +}; diff --git a/src/splitter/truncate-file-name.ts b/src/splitter/truncate-file-name.ts new file mode 100644 index 0000000..98ee941 --- /dev/null +++ b/src/splitter/truncate-file-name.ts @@ -0,0 +1,15 @@ +/** + * Truncates the string to the maximum length allowed for a file name + */ +export const truncateFileName = (name: string) => { + const MAX_LENGTH = 255; + + const splitArr = name.split("."); + if (splitArr.length < 2) { + throw new Error("Invalid file name"); + } + + const baseName = splitArr[0]; + const extension = splitArr[1]; + return baseName.substring(0, MAX_LENGTH - extension.length - 1) + "." + splitArr[1]; +}; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..1a9e2df --- /dev/null +++ b/src/types.ts @@ -0,0 +1,18 @@ +import { TFile, TFolder } from "obsidian"; + +export interface NoteSplitterSettings { + saveFolderPath: string; + useContentAsTitle: boolean; + delimiter: string; + appendToSplitContent: string; + deleteOriginalNote: boolean; +} + +export interface NodeFileSystem { + read(file: TFile): Promise; + create(filePath: string, content: string): Promise; + createFolder(folderPath: string): Promise; + delete(file: TFile): Promise; +} + +export type Notifier = (message: string) => void; diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index c8e10d5..0000000 --- a/src/utils.ts +++ /dev/null @@ -1,37 +0,0 @@ -export const removeFrontmatterBlock = (data: string) => { - // Define the regular expression for the frontmatter block - const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---/; - return data.replace(FRONTMATTER_REGEX, "").trim(); -}; - -/** - * Escapes characters invalid for a file name - * @param value - */ -export const escapeInvalidFileNameChars = (value: string) => { - // Replace colon with hyphen - value = value.replace(/:/g, "-"); - // Replace back slash with space - value = value.replace(/\\/g, " "); - // Replace forward slash with space - value = value.replace(/\//g, " "); - // Replace carrot with nothing - value = value.replace(/\^/g, ""); - // Replace left bracket with nothing - value = value.replace(/\[/g, ""); - // Replace right bracket with nothing - value = value.replace(/\]/g, ""); - // Replace hash tag with nothing - value = value.replace(/#/g, ""); - // Replace pipe with nothing - value = value.replace(/\|/g, ""); - return value; -}; - -/** - * Trims the string to the maximum length allowed for a file name - */ -export const trimForFileName = (value: string, extension: string) => { - const MAX_LENGTH = 255; - return value.substring(0, MAX_LENGTH - extension.length - 1); -}; diff --git a/test/integration/split-by-delimiter.test.ts b/test/integration/split-by-delimiter.test.ts new file mode 100644 index 0000000..9efeaf3 --- /dev/null +++ b/test/integration/split-by-delimiter.test.ts @@ -0,0 +1,170 @@ +import { TFile } from "obsidian"; +import { splitByDelimiter } from "src/splitter/split-by-delimiter"; +import { NodeFileSystem, Notifier } from "src/types"; + +const mockFileSystem: NodeFileSystem = { + read: jest.fn((file: TFile) => { + if (file.path === "file1.md") { + return Promise.resolve("---\nkey:value\n---\n"); + } else if (file.path === "file2.md") { + return Promise.resolve("This is my content"); + } else { + return Promise.resolve("This is sentence 1\nThis is sentence 2"); + } + }), + create: jest.fn(), + createFolder: jest.fn(), + delete: jest.fn(), +}; + +const mockNotifier: Notifier = jest.fn(); + +describe("splitByDelimiter", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should notify if no delimiter is set", async () => { + // Arrange + const file = { + path: "file1.md", + } as TFile; + + await splitByDelimiter(mockFileSystem, mockNotifier, file, { + delimiter: "", + saveFolderPath: "", + useContentAsTitle: false, + appendToSplitContent: "", + deleteOriginalNote: false, + }); + + expect(mockNotifier).toHaveBeenCalledWith(expect.stringContaining("No delimiter")); + }); + + it("should notify if there is no content is set", async () => { + // Arrange + const file = { + path: "file1.md", + } as TFile; + + await splitByDelimiter(mockFileSystem, mockNotifier, file, { + delimiter: "\n", + saveFolderPath: "", + useContentAsTitle: false, + appendToSplitContent: "", + deleteOriginalNote: false, + }); + + expect(mockNotifier).toHaveBeenCalledWith(expect.stringContaining("No content")); + }); + + it("should notify if only one section is found", async () => { + // Arrange + const file = { + path: "file2.md", + } as TFile; + + await splitByDelimiter(mockFileSystem, mockNotifier, file, { + delimiter: "\n", + saveFolderPath: "", + useContentAsTitle: false, + appendToSplitContent: "", + deleteOriginalNote: false, + }); + + expect(mockNotifier).toHaveBeenCalledWith(expect.stringContaining("one section")); + }); + + it("should split into 2 files", async () => { + // Arrange + const file = { + path: "file3.md", + } as TFile; + + await splitByDelimiter(mockFileSystem, mockNotifier, file, { + delimiter: "\n", + saveFolderPath: "", + useContentAsTitle: false, + appendToSplitContent: "", + deleteOriginalNote: false, + }); + + expect(mockFileSystem.read).toHaveBeenCalledTimes(1); + expect(mockFileSystem.create).toHaveBeenCalledTimes(2); + expect(mockFileSystem.create).toHaveBeenCalledWith( + expect.stringContaining("split-note"), + "This is sentence 1", + ); + expect(mockFileSystem.create).toHaveBeenCalledWith( + expect.stringContaining("split-note"), + "This is sentence 2", + ); + expect(mockFileSystem.delete).not.toHaveBeenCalled(); + expect(mockNotifier).toHaveBeenCalledWith(expect.stringContaining("2 notes")); + }); + + it("should delete the original note when the setting is true", async () => { + // Arrange + const file = { + path: "file3.md", + } as TFile; + + await splitByDelimiter(mockFileSystem, mockNotifier, file, { + delimiter: "\n", + saveFolderPath: "", + useContentAsTitle: false, + appendToSplitContent: "", + deleteOriginalNote: true, + }); + + expect(mockFileSystem.delete).toHaveBeenCalledWith(file); + }); + + it("should append to split content", async () => { + // Arrange + const file = { + path: "file3.md", + } as TFile; + + await splitByDelimiter(mockFileSystem, mockNotifier, file, { + delimiter: "\n", + saveFolderPath: "", + useContentAsTitle: false, + appendToSplitContent: ".", + deleteOriginalNote: false, + }); + + expect(mockFileSystem.create).toHaveBeenCalledWith( + expect.stringContaining("split-note"), + "This is sentence 1.", + ); + expect(mockFileSystem.create).toHaveBeenCalledWith( + expect.stringContaining("split-note"), + "This is sentence 2.", + ); + }); + + it("should use content as title", async () => { + // Arrange + const file = { + path: "file3.md", + } as TFile; + + await splitByDelimiter(mockFileSystem, mockNotifier, file, { + delimiter: "\n", + saveFolderPath: "", + useContentAsTitle: true, + appendToSplitContent: "", + deleteOriginalNote: false, + }); + + expect(mockFileSystem.create).toHaveBeenCalledWith( + expect.stringContaining("sentence 1"), + "This is sentence 1", + ); + expect(mockFileSystem.create).toHaveBeenCalledWith( + expect.stringContaining("sentence 2"), + "This is sentence 2", + ); + }); +}); diff --git a/test/unit/remove-frontmatter-block.test.ts b/test/unit/remove-frontmatter-block.test.ts new file mode 100644 index 0000000..91a4546 --- /dev/null +++ b/test/unit/remove-frontmatter-block.test.ts @@ -0,0 +1,19 @@ +import { removeFrontmatterBlock } from "src/splitter/remove-frontmatter-block"; + +describe("removeFrontmatterBlock", () => { + it("should remove frontmatter block", () => { + // Arrange + const content = `--- + key1: value + key2: value + --- + + This is some text`; + + // Act + const result = removeFrontmatterBlock(content); + + // Assert + expect(result).toEqual("This is some text"); + }); +}); diff --git a/test/unit/sanitize-file-name.test.ts b/test/unit/sanitize-file-name.test.ts new file mode 100644 index 0000000..c6e837e --- /dev/null +++ b/test/unit/sanitize-file-name.test.ts @@ -0,0 +1,47 @@ +import { sanitizeFileName } from "src/splitter/sanitize-file-name"; + +describe("sanitizeFileName", () => { + it("should replace colon with hyphen", () => { + // Arrange + const content = "file:name"; + + // Act + const result = sanitizeFileName(content); + + // Assert + expect(result).toEqual("file-name"); + }); + + it("should replace backslash with space", () => { + // Arrange + const content = "file\\name"; + + // Act + const result = sanitizeFileName(content); + + // Assert + expect(result).toEqual("file name"); + }); + + it("should replace forward slash with space", () => { + // Arrange + const content = "file//name"; + + // Act + const result = sanitizeFileName(content); + + // Assert + expect(result).toEqual("file name"); + }); + + it("should remove invalid characters", () => { + // Arrange + const content = "file name #|^[]"; + + // Act + const result = sanitizeFileName(content); + + // Assert + expect(result).toEqual("file name"); + }); +}); diff --git a/test/unit/truncate-file-name.test.ts b/test/unit/truncate-file-name.test.ts new file mode 100644 index 0000000..1fb896a --- /dev/null +++ b/test/unit/truncate-file-name.test.ts @@ -0,0 +1,26 @@ +import { truncateFileName } from "src/splitter/truncate-file-name"; + +describe("truncateFileName", () => { + it("should throw an error if the file name is invalid", () => { + // Arrange + const fileName = "file"; + + // Act + const action = () => truncateFileName(fileName); + + // Assert + expect(action).toThrow(); + }); + + it("should truncate the string to 255 characters", () => { + // Arrange + const fileName = "a".repeat(260) + ".md"; + + // Act + const result = truncateFileName(fileName); + + // Assert + expect(result.length).toEqual(255); + expect(result.endsWith(".md")).toEqual(true); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index c3939c0..100c501 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,9 @@ "importHelpers": true, "isolatedModules": true, "strictNullChecks": true, - "lib": ["DOM", "ES5", "ES6", "ES7"] + "esModuleInterop": true, + "lib": ["DOM", "ES5", "ES6", "ES7"], + "types": ["jest"] }, "include": ["**/*.ts"] } diff --git a/versions.json b/versions.json index bf0e1b0..cd1f624 100644 --- a/versions.json +++ b/versions.json @@ -11,5 +11,6 @@ "0.6.0": "0.15.0", "1.0.0": "0.15.0", "1.1.0": "0.15.0", - "1.1.1": "0.15.0" + "1.1.1": "0.15.0", + "1.2.0": "0.15.0" }