From b74c49567d08281a573fbcc58288928d2907e2e3 Mon Sep 17 00:00:00 2001 From: Maris Date: Mon, 24 Jun 2024 16:51:20 +0200 Subject: [PATCH] update structure, add suggestor --- esbuild.config.mjs | 2 +- manifest.json | 2 +- openlegaldataparser.ts | 27 ----- openlegaldataparserJS.js | 25 ----- package-lock.json | 182 +++++++++++++++++++++++++++++++++ package.json | 3 +- src/api/opld.ts | 53 ++++++++++ law-view.ts => src/law-view.ts | 0 src/lawSuggester.ts | 68 ++++++++++++ main.ts => src/main.ts | 77 +++----------- styles.css | 16 +++ tsconfig.json | 6 +- 12 files changed, 341 insertions(+), 120 deletions(-) delete mode 100644 openlegaldataparser.ts delete mode 100644 openlegaldataparserJS.js create mode 100644 src/api/opld.ts rename law-view.ts => src/law-view.ts (100%) create mode 100644 src/lawSuggester.ts rename main.ts => src/main.ts (54%) diff --git a/esbuild.config.mjs b/esbuild.config.mjs index b13282b..be2cafe 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -15,7 +15,7 @@ const context = await esbuild.context({ banner: { js: banner, }, - entryPoints: ["main.ts"], + entryPoints: ["src/main.ts"], bundle: true, external: [ "obsidian", diff --git a/manifest.json b/manifest.json index f24bfdd..821fc7f 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "version": "1.0.0", "minAppVersion": "0.15.0", "description": "bliblablub", - "author": "Silas", + "author": "Silas Schimmel & Maris Beer", "authorUrl": "https://obsidian.md", "fundingUrl": "https://obsidian.md/pricing", "isDesktopOnly": false diff --git a/openlegaldataparser.ts b/openlegaldataparser.ts deleted file mode 100644 index 8901620..0000000 --- a/openlegaldataparser.ts +++ /dev/null @@ -1,27 +0,0 @@ -import axios from 'axios'; - -// Configure API key authorization: api_key -const apiKey = "6e6a95bf6f99b1430ce89239aad0fd41e6159583" -// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) -//api_key.apiKeyPrefix['Authorization'] = "Token" - -var callback = function(error: string, data: string, response: string) { - - if (error) { - console.log(apiKey); - console.error(error); - } else { - console.log('API called successfully. Returned data: ' + data); - } -}; - -export function getData(search: string) { - const url = 'https://de.openlegaldata.io/api/laws/search/?format=json' - - return axios.get(`https://cors-anywhere.herokuapp.com/${url}&text=${encodeURIComponent(search)}`, { - headers: { - Authorization: apiKey - } - }) - -} \ No newline at end of file diff --git a/openlegaldataparserJS.js b/openlegaldataparserJS.js deleted file mode 100644 index 294a6d4..0000000 --- a/openlegaldataparserJS.js +++ /dev/null @@ -1,25 +0,0 @@ -var OldpApi = require('oldp-api'); - -export const testlaw = OldpApi.LawSearch("1"); - -var defaultClient = OldpApi.ApiClient.instance; - -// Configure API key authorization: api_key -var api_key = defaultClient.authentications['api_key']; -api_key.apiKey = "6e6a95bf6f99b1430ce89239aad0fd41e6159583" -// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) -//api_key.apiKeyPrefix['Authorization'] = "Token" - -var api = new OldpApi.AnnotationLabelsApi() - -var data = new OldpApi.AnnotationLabel(); // {AnnotationLabel} - - -var callback = function(error, data, response) { - if (error) { - console.error(error); - } else { - console.log('API called successfully. Returned data: ' + data); - } -}; -api.annotationLabelsCreate(data, callback); diff --git a/package-lock.json b/package-lock.json index cee50eb..29e749a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "axios": "^1.7.2", + "cheerio": "^1.0.0-rc.12", "oldp-api": "^0.1.0" }, "devDependencies": { @@ -879,6 +880,11 @@ "dev": true, "peer": true }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -959,6 +965,42 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1030,6 +1072,32 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1103,6 +1171,68 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -1737,6 +1867,24 @@ "node": ">= 0.4" } }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -2028,6 +2176,17 @@ "dev": true, "peer": true }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -2131,6 +2290,29 @@ "node": ">=6" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", diff --git a/package.json b/package.json index ff46ff0..4fcb4ab 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "obsidian-sample-plugin", "version": "1.0.0", "description": "This is a sample plugin for Obsidian (https://obsidian.md)", - "main": "main.js", + "main": "src/main", "scripts": { "dev": "node esbuild.config.mjs", "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", @@ -23,6 +23,7 @@ }, "dependencies": { "axios": "^1.7.2", + "cheerio": "^1.0.0-rc.12", "oldp-api": "^0.1.0" } } diff --git a/src/api/opld.ts b/src/api/opld.ts new file mode 100644 index 0000000..795170a --- /dev/null +++ b/src/api/opld.ts @@ -0,0 +1,53 @@ +import axios from "axios"; +import * as cheerio from 'cheerio'; + +export interface OldpSearchResponseItem { + link: string; + title: string; + snippet: string; +} + +export class OldpApi { + private readonly corsProxyUrl = 'https://cors-anywhere.herokuapp.com' + private readonly baseUrl = 'https://de.openlegaldata.io'; + + constructor() {} + + private async getRawSearchResults(searchTerm: string): Promise { + try { + const url = `${this.baseUrl}/search/?selected_facets=facet_model_name_exact%3ALaw&q=${encodeURIComponent(searchTerm)}` + const response = await axios.get(`${this.corsProxyUrl}/${url}`); + const html = response.data; + return html; + } catch (error) { + console.error('Error fetching search results:', error); + return null; + } + } + + private parseSearchResults(data: string): OldpSearchResponseItem[] { + const webDocument = cheerio.load(data); + const searchItems: OldpSearchResponseItem[] = []; + + webDocument('.search-items li').each((index, element) => { + const link = `${this.baseUrl}${webDocument(element).find('a').attr('href')}`; + const title = (webDocument(element).find('h4').text()).replace('(Law)', ''); + const snippet = webDocument(element).find('.search-snippet').text(); + + searchItems.push({ + link, + title, + snippet + }); + }); + + return searchItems; + } + + public async search(searchTerm: string): Promise { + const rawSearchResult = await this.getRawSearchResults(searchTerm); + if (rawSearchResult === null) return []; + + return this.parseSearchResults(rawSearchResult); + } +} \ No newline at end of file diff --git a/law-view.ts b/src/law-view.ts similarity index 100% rename from law-view.ts rename to src/law-view.ts diff --git a/src/lawSuggester.ts b/src/lawSuggester.ts new file mode 100644 index 0000000..31f5687 --- /dev/null +++ b/src/lawSuggester.ts @@ -0,0 +1,68 @@ +import LawRefPlugin from "./main"; +import { Editor, EditorPosition, EditorSuggest, EditorSuggestContext, EditorSuggestTriggerInfo, TFile } from "obsidian"; +import { OldpApi, OldpSearchResponseItem } from "./api/opld"; + +export default class LawSuggester extends EditorSuggest { + private readonly oldpApi = new OldpApi(); + plugin: LawRefPlugin; + // todo: probably refactor this? + queryRegex = new RegExp(/(?:(?<=^|\n)|(?<=\s))§[-\w]+(?=\s|$)/gi); + + constructor(plugin: LawRefPlugin) { + super(plugin.app); + this.plugin = plugin; + } + + onTrigger(cursor: EditorPosition, editor: Editor, _: TFile): EditorSuggestTriggerInfo | null { + // todo: probably refactor selection + const sub = editor.getLine(cursor.line).slice(0, cursor.ch); + const matches = sub.match(this.queryRegex); + if (matches === null || matches.groups === null || matches.groups?.sc === null) return null; + + if (matches != null) console.log('matches', matches); + + return { + end: cursor, + start: { + ch: sub.lastIndexOf(matches.groups?.sc ?? ''), + line: cursor.line, + }, + // always get latest + query: matches[matches.length - 1], + } + } + + async getSuggestions(context: EditorSuggestContext): Promise { + // TODO: fix bug where when you change something in the string at e.g. char 2 it only triggers rerender for substring + console.log('query', context.query?.replace('§', '').replace('-', ' ').replace('_', ' ')) + + const query = context.query?.replace('§', '').replace('-', ' ').replace('_', ' '); + + // don't execute if input length is under 2 + if(query?.length < 2) return []; + + return await this.oldpApi.search(query); + } + + renderSuggestion(suggestion: OldpSearchResponseItem, el: HTMLElement): void { + // TODO refactor appearence and hover + const outer = el.createDiv({ cls: "lawRef-suggestion-container" }); + let shortcodeDiv = createDiv({ title: `${suggestion.snippet}` }) + shortcodeDiv.setText(suggestion.title); + outer.appendChild(shortcodeDiv) + } + + selectSuggestion(suggestion: OldpSearchResponseItem, evt: MouseEvent | KeyboardEvent): void { + // TODO: implement me + /* if(!this.context) return; + const { start, end } = this.context; + const shortcode = suggestion.names.includes(suggestion.matchedName) ? suggestion.matchedName : suggestion.names[0] + const outEm = suggestion.names.some(n => windowsSupportedFirstChar.includes(n)) && suggestion.emoji.split("").length > 1 + ? suggestion.emoji.split("")[0] + : suggestion.emoji; + const repl = this.plugin.settings.immediateReplace ? outEm : `:${shortcode}: `; + + this.context.editor.replaceRange(repl, start, end); + this.plugin.updateHistory(suggestion.matchedName); */ + } +} \ No newline at end of file diff --git a/main.ts b/src/main.ts similarity index 54% rename from main.ts rename to src/main.ts index 154fd91..a2e6b1f 100644 --- a/main.ts +++ b/src/main.ts @@ -1,6 +1,7 @@ -import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting, Vault, Workspace, WorkspaceLeaf, parseFrontMatterEntry } from 'obsidian'; -import { VIEW_TYPE_EXAMPLE, ExampleView } from 'law-view'; -import { getData } from 'openlegaldataparser'; +import { App, Modal, Notice, Plugin, PluginSettingTab, Setting, Vault, Workspace, WorkspaceLeaf, MarkdownPostProcessorContext } from 'obsidian'; +import { VIEW_TYPE_EXAMPLE } from './law-view'; +import { OldpApi } from './api/opld'; +import LawSuggester from './lawSuggester'; // Remember to rename these classes and interfaces! @@ -12,68 +13,13 @@ const DEFAULT_SETTINGS: MyPluginSettings = { mySetting: 'default' } -export default class MyPlugin extends Plugin { +export default class LawRefPlugin extends Plugin { settings: MyPluginSettings; + private readonly OldpApi = new OldpApi(); async onload() { await this.loadSettings(); - //register law review view - this.registerView( - VIEW_TYPE_EXAMPLE, - (leaf) => new ExampleView(leaf) - ); - - // This creates an icon in the left ribbon. - const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => { - // Called when the user clicks the icon. - new Notice('This is a not notice!'); - this.activateView(); - }); - // Perform additional things with the ribbon - ribbonIconEl.addClass('my-plugin-ribbon-class'); - - // This adds a status bar item to the bottom of the app. Does not work on mobile apps. - const statusBarItemEl = this.addStatusBarItem(); - statusBarItemEl.setText('Status Bar Text'); - - // This adds a simple command that can be triggered anywhere - this.addCommand({ - id: 'open-sample-modal-simple', - name: 'Open sample modal (simple)', - callback: () => { - new SampleModal(this.app).open(); - } - }); - // This adds an editor command that can perform some operation on the current editor instance - this.addCommand({ - id: 'sample-editor-command', - name: 'Sample editor command', - editorCallback: (editor: Editor, view: MarkdownView) => { - console.log(editor.getSelection()); - editor.replaceSelection('Sample Editor Command'); - } - }); - // This adds a complex command that can check whether the current state of the app allows execution of the command - this.addCommand({ - id: 'open-sample-modal-complex', - name: 'Open sample modal (complex)', - checkCallback: (checking: boolean) => { - // Conditions to check - const markdownView = this.app.workspace.getActiveViewOfType(MarkdownView); - if (markdownView) { - // If checking is true, we're simply "checking" if the command can be run. - // If checking is false, then we want to actually perform the operation. - if (!checking) { - new SampleModal(this.app).open(); - } - - // This command will only show up in Command Palette when the check function returns true - return true; - } - } - }); - // This adds a settings tab so the user can configure various aspects of the plugin this.addSettingTab(new SampleSettingTab(this.app, this)); @@ -85,6 +31,10 @@ export default class MyPlugin extends Plugin { // When registering intervals, this function will automatically clear the interval when the plugin is disabled. this.registerInterval(window.setInterval(() => console.log('setInterval'), 5 * 60 * 1000)); + + // register suggestor on § key + this.registerEditorSuggest(new LawSuggester(this)) + } onunload() { @@ -120,8 +70,9 @@ export default class MyPlugin extends Plugin { if (!metadata) return console.log("no metadata"); let returner = metadata.frontmatter; if (returner) { + const oldpApi = new OldpApi(); console.log(returner['§']); - console.log(await getData(returner['§'][0])); + console.log(await oldpApi.search(returner['§'])); } } @@ -152,9 +103,9 @@ class SampleModal extends Modal { } class SampleSettingTab extends PluginSettingTab { - plugin: MyPlugin; + plugin: LawRefPlugin; - constructor(app: App, plugin: MyPlugin) { + constructor(app: App, plugin: LawRefPlugin) { super(app, plugin); this.plugin = plugin; } diff --git a/styles.css b/styles.css index 71cc60f..32243c4 100644 --- a/styles.css +++ b/styles.css @@ -6,3 +6,19 @@ available in the app when your plugin is enabled. If your plugin does not need CSS, delete this file. */ + +.lawRef-suggestion-container { + display: flex; + place-content: space-between; + } + + .lawRef-suggestion-entry { + border-top: solid var(--background-secondary) 1px; + padding-left: 10px; + } + + .ES-suggestion-item { + border-top: solid var(--background-secondary) 1px; + padding-left: 10px; + } + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index f8a7c81..08ac784 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,13 @@ { "compilerOptions": { - "baseUrl": ".", + "baseUrl": "./", "inlineSourceMap": true, "inlineSources": true, "module": "ESNext", "target": "ES6", "allowJs": true, "noImplicitAny": true, + "outDir": "./dist", "moduleResolution": "node", "importHelpers": true, "isolatedModules": true, @@ -19,5 +20,6 @@ ] }, "include": [ - "**/*.ts" ] + "**/*.ts" + ] }