Merge branch 'develop'
This commit is contained in:
@@ -7,7 +7,6 @@ module.exports = {
|
||||
singleQuote: true,
|
||||
arrowParens: 'avoid',
|
||||
bracketSameLine: true,
|
||||
svelteStrictMode: true,
|
||||
svelteBracketNewLine: false,
|
||||
svelteAllowShorthand: true,
|
||||
svelteIndentScriptAndStyle: true,
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { build } from 'esbuild'
|
||||
import sveltePlugin from 'esbuild-svelte'
|
||||
import sveltePreprocess from 'svelte-preprocess'
|
||||
import { copy } from 'esbuild-plugin-copy'
|
||||
import esbuild from 'esbuild'
|
||||
import process from 'process'
|
||||
import builtins from 'builtin-modules'
|
||||
import esbuildSvelte from 'esbuild-svelte'
|
||||
import { sveltePreprocess } from 'svelte-preprocess'
|
||||
import path from 'path'
|
||||
import { copy } from 'esbuild-plugin-copy'
|
||||
|
||||
const banner = `/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
@@ -14,7 +14,7 @@ if you want to view the source, please visit the github repository of this plugi
|
||||
|
||||
const prod = process.argv[2] === 'production'
|
||||
|
||||
build({
|
||||
const context = await esbuild.context({
|
||||
banner: {
|
||||
js: banner,
|
||||
},
|
||||
@@ -24,54 +24,42 @@ build({
|
||||
'obsidian',
|
||||
'electron',
|
||||
'@codemirror/autocomplete',
|
||||
'@codemirror/closebrackets',
|
||||
'@codemirror/collab',
|
||||
'@codemirror/commands',
|
||||
'@codemirror/comment',
|
||||
'@codemirror/fold',
|
||||
'@codemirror/gutter',
|
||||
'@codemirror/highlight',
|
||||
'@codemirror/history',
|
||||
'@codemirror/language',
|
||||
'@codemirror/lint',
|
||||
'@codemirror/matchbrackets',
|
||||
'@codemirror/panel',
|
||||
'@codemirror/rangeset',
|
||||
'@codemirror/rectangular-selection',
|
||||
'@codemirror/search',
|
||||
'@codemirror/state',
|
||||
'@codemirror/stream-parser',
|
||||
'@codemirror/text',
|
||||
'@codemirror/tooltip',
|
||||
'@codemirror/view',
|
||||
'@lezer/common',
|
||||
'@lezer/highlight',
|
||||
'@lezer/lr',
|
||||
...builtins,
|
||||
],
|
||||
outfile: path.join('./dist', 'main.js'),
|
||||
plugins: [
|
||||
sveltePlugin({
|
||||
esbuildSvelte({
|
||||
compilerOptions: { css: 'injected' },
|
||||
preprocess: sveltePreprocess(),
|
||||
}),
|
||||
copy({
|
||||
assets:{
|
||||
from: ['./assets/styles.css', 'manifest.json'],
|
||||
to: ['./'],
|
||||
},
|
||||
}),
|
||||
{
|
||||
name: 'resolve-minisearch',
|
||||
setup(build) {
|
||||
build.onResolve({ filter: /^minisearch$/ }, () => {
|
||||
return { path: path.resolve('node_modules/minisearch/src/MiniSearch.ts') };
|
||||
});
|
||||
},
|
||||
},
|
||||
from: ['manifest.json','./assets/styles.css'],
|
||||
to: ['./']
|
||||
}
|
||||
})
|
||||
],
|
||||
format: 'cjs',
|
||||
watch: !prod,
|
||||
target: 'chrome98',
|
||||
logLevel: 'info',
|
||||
sourcemap: prod ? false : 'inline',
|
||||
treeShaking: true,
|
||||
minify: prod,
|
||||
legalComments: 'none',
|
||||
}).catch(() => process.exit(1))
|
||||
})
|
||||
|
||||
if (prod) {
|
||||
await context.rebuild()
|
||||
process.exit(0)
|
||||
} else {
|
||||
await context.watch()
|
||||
}
|
||||
|
||||
17
package.json
17
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "scambier.obsidian-search",
|
||||
"version": "1.26.1",
|
||||
"version": "1.27.0-beta.1",
|
||||
"description": "A search engine for Obsidian",
|
||||
"main": "dist/main.js",
|
||||
"scripts": {
|
||||
@@ -24,19 +24,19 @@
|
||||
"@types/pako": "^2.0.3",
|
||||
"babel-jest": "^27.5.1",
|
||||
"builtin-modules": "^3.3.0",
|
||||
"esbuild": "0.14.0",
|
||||
"esbuild": "0.17.19",
|
||||
"esbuild-plugin-copy": "1.3.0",
|
||||
"esbuild-svelte": "0.7.1",
|
||||
"esbuild-svelte": "^0.9.2",
|
||||
"jest": "^27.5.1",
|
||||
"obsidian": "1.7.2",
|
||||
"prettier": "^2.8.8",
|
||||
"prettier-plugin-svelte": "^2.10.1",
|
||||
"svelte": "^3.59.2",
|
||||
"svelte-check": "^2.10.3",
|
||||
"svelte": "^5.23.2",
|
||||
"svelte-check": "^4.1.5",
|
||||
"svelte-jester": "^2.3.2",
|
||||
"svelte-preprocess": "^4.10.7",
|
||||
"svelte-preprocess": "^6.0.3",
|
||||
"tslib": "2.3.1",
|
||||
"typescript": "^4.9.5",
|
||||
"typescript": "^5.8.2",
|
||||
"vite": "^3.2.11"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -46,7 +46,8 @@
|
||||
"markdown-link-extractor": "^4.0.2",
|
||||
"minisearch": "7.1.0",
|
||||
"pure-md5": "^0.1.14",
|
||||
"search-query-parser": "^1.6.0"
|
||||
"search-query-parser": "^1.6.0",
|
||||
"svelte-multiselect": "github:janosh/svelte-multiselect"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
|
||||
824
pnpm-lock.yaml
generated
824
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -191,7 +191,7 @@
|
||||
{/each}
|
||||
{:else}
|
||||
<div style="text-align: center;">
|
||||
We found 0 result for your search here.
|
||||
We found 0 results for your search here.
|
||||
</div>
|
||||
{/if}
|
||||
</ModalContainer>
|
||||
|
||||
@@ -30,27 +30,34 @@
|
||||
import type OmnisearchPlugin from '../main'
|
||||
import LazyLoader from './lazy-loader/LazyLoader.svelte'
|
||||
|
||||
export let modal: OmnisearchVaultModal
|
||||
export let previousQuery: string | undefined
|
||||
export let plugin: OmnisearchPlugin
|
||||
let {
|
||||
modal,
|
||||
previousQuery,
|
||||
plugin,
|
||||
}: {
|
||||
modal: OmnisearchVaultModal
|
||||
previousQuery?: string | undefined
|
||||
plugin: OmnisearchPlugin
|
||||
} = $props()
|
||||
|
||||
let selectedIndex = 0
|
||||
let selectedIndex = $state(0)
|
||||
let historySearchIndex = 0
|
||||
let searchQuery: string | undefined
|
||||
let resultNotes: ResultNote[] = []
|
||||
let searchQuery = $state(previousQuery ?? '')
|
||||
let resultNotes: ResultNote[] = $state([])
|
||||
let query: Query
|
||||
let indexingStepDesc = ''
|
||||
let searching = true
|
||||
let indexingStepDesc = $state('')
|
||||
let searching = $state(true)
|
||||
let refInput: InputSearch | undefined
|
||||
let openInNewPaneKey: string
|
||||
let openInCurrentPaneKey: string
|
||||
let createInNewPaneKey: string
|
||||
let createInCurrentPaneKey: string
|
||||
let openInNewLeafKey: string = getCtrlKeyLabel() + getAltKeyLabel() + ' ↵'
|
||||
let openInNewPaneKey: string = $state('')
|
||||
let openInCurrentPaneKey: string = $state('')
|
||||
let createInNewPaneKey: string = $state('')
|
||||
let createInCurrentPaneKey: string = $state('')
|
||||
let openInNewLeafKey: string = `${getCtrlKeyLabel()} ${getAltKeyLabel()} ↵`
|
||||
|
||||
$: selectedNote = resultNotes[selectedIndex]
|
||||
$: searchQuery = searchQuery ?? previousQuery
|
||||
$: if (plugin.settings.openInNewPane) {
|
||||
const selectedNote = $derived(resultNotes[selectedIndex])
|
||||
|
||||
$effect(() => {
|
||||
if (plugin.settings.openInNewPane) {
|
||||
openInNewPaneKey = '↵'
|
||||
openInCurrentPaneKey = getCtrlKeyLabel() + ' ↵'
|
||||
createInNewPaneKey = 'Shift ↵'
|
||||
@@ -61,13 +68,17 @@
|
||||
createInNewPaneKey = getCtrlKeyLabel() + ' Shift ↵'
|
||||
createInCurrentPaneKey = 'Shift ↵'
|
||||
}
|
||||
$: if (searchQuery) {
|
||||
})
|
||||
|
||||
$effect(() => {
|
||||
if (searchQuery) {
|
||||
updateResultsDebounced()
|
||||
} else {
|
||||
searching = false
|
||||
resultNotes = []
|
||||
}
|
||||
$: {
|
||||
})
|
||||
$effect(() => {
|
||||
switch ($indexingStep) {
|
||||
case IndexingStepType.LoadingCache:
|
||||
indexingStepDesc = 'Loading cache...'
|
||||
@@ -87,7 +98,7 @@
|
||||
indexingStepDesc = ''
|
||||
break
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
onMount(async () => {
|
||||
eventBus.enable('vault')
|
||||
@@ -305,17 +316,17 @@
|
||||
</script>
|
||||
|
||||
<InputSearch
|
||||
bind:this="{refInput}"
|
||||
plugin="{plugin}"
|
||||
initialValue="{searchQuery}"
|
||||
on:input="{e => (searchQuery = e.detail)}"
|
||||
bind:this={refInput}
|
||||
{plugin}
|
||||
initialValue={searchQuery}
|
||||
on:input={e => (searchQuery = e.detail)}
|
||||
placeholder="Omnisearch - Vault">
|
||||
<div class="omnisearch-input-container__buttons">
|
||||
{#if plugin.settings.showCreateButton}
|
||||
<button on:click="{onClickCreateNote}">Create note</button>
|
||||
<button on:click={onClickCreateNote}>Create note</button>
|
||||
{/if}
|
||||
{#if Platform.isMobile}
|
||||
<button on:click="{switchToInFileModal}">In-File search</button>
|
||||
<button on:click={switchToInFileModal}>In-File search</button>
|
||||
{/if}
|
||||
</div>
|
||||
</InputSearch>
|
||||
@@ -329,24 +340,24 @@
|
||||
<ModalContainer>
|
||||
{#each resultNotes as result, i}
|
||||
<LazyLoader
|
||||
height="{100}"
|
||||
offset="{500}"
|
||||
keep="{true}"
|
||||
fadeOption="{{ delay: 0, duration: 0 }}">
|
||||
height={100}
|
||||
offset={500}
|
||||
keep={true}
|
||||
fadeOption={{ delay: 0, duration: 0 }}>
|
||||
<ResultItemVault
|
||||
plugin="{plugin}"
|
||||
selected="{i === selectedIndex}"
|
||||
note="{result}"
|
||||
on:mousemove="{_ => (selectedIndex = i)}"
|
||||
on:click="{onClick}"
|
||||
on:auxclick="{evt => {
|
||||
{plugin}
|
||||
selected={i === selectedIndex}
|
||||
note={result}
|
||||
on:mousemove={_ => (selectedIndex = i)}
|
||||
on:click={onClick}
|
||||
on:auxclick={evt => {
|
||||
if (evt.button == 1) openNoteInNewPane()
|
||||
}}" />
|
||||
}} />
|
||||
</LazyLoader>
|
||||
{/each}
|
||||
<div style="text-align: center;">
|
||||
{#if !resultNotes.length && searchQuery && !searching}
|
||||
We found 0 result for your search here.
|
||||
We found 0 results for your search here.
|
||||
{#if plugin.settings.simpleSearch && searchQuery
|
||||
.split(SPACE_OR_PUNCTUATION)
|
||||
.some(w => w.length < 3)}
|
||||
@@ -408,7 +419,7 @@
|
||||
<span>to insert a link</span>
|
||||
</div>
|
||||
<div class="prompt-instruction">
|
||||
<span class="prompt-instruction-command">Ctrl g</span>
|
||||
<span class="prompt-instruction-command">{getCtrlKeyLabel()} g</span>
|
||||
<span>to toggle excerpts</span>
|
||||
</div>
|
||||
<div class="prompt-instruction">
|
||||
|
||||
@@ -4,6 +4,7 @@ import ModalVault from './ModalVault.svelte'
|
||||
import ModalInFile from './ModalInFile.svelte'
|
||||
import { Action, eventBus, EventNames, isInputComposition } from '../globals'
|
||||
import type OmnisearchPlugin from '../main'
|
||||
import { mount, unmount } from 'svelte'
|
||||
|
||||
abstract class OmnisearchModal extends Modal {
|
||||
protected constructor(plugin: OmnisearchPlugin) {
|
||||
@@ -119,7 +120,7 @@ abstract class OmnisearchModal extends Modal {
|
||||
})
|
||||
|
||||
// Open in background
|
||||
this.scope.register(['Ctrl'], 'O', e => {
|
||||
this.scope.register(['Mod'], 'O', e => {
|
||||
if (!isInputComposition()) {
|
||||
// Check if the user is still typing
|
||||
e.preventDefault()
|
||||
@@ -143,7 +144,7 @@ abstract class OmnisearchModal extends Modal {
|
||||
})
|
||||
|
||||
// Context
|
||||
this.scope.register(['Ctrl'], 'G', _e => {
|
||||
this.scope.register(['Mod'], 'G', _e => {
|
||||
eventBus.emit(EventNames.ToggleExcerpts)
|
||||
})
|
||||
}
|
||||
@@ -170,7 +171,7 @@ export class OmnisearchVaultModal extends OmnisearchModal {
|
||||
: null
|
||||
|
||||
// Instantiate and display the Svelte component
|
||||
const cmp = new ModalVault({
|
||||
const cmp = mount(ModalVault, {
|
||||
target: this.modalEl,
|
||||
props: {
|
||||
plugin,
|
||||
@@ -178,10 +179,11 @@ export class OmnisearchVaultModal extends OmnisearchModal {
|
||||
previousQuery: query || selectedText || previous || '',
|
||||
},
|
||||
})
|
||||
|
||||
this.onClose = () => {
|
||||
// Since the component is manually created,
|
||||
// we also need to manually destroy it
|
||||
cmp.$destroy()
|
||||
unmount(cmp)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -196,7 +198,7 @@ export class OmnisearchInFileModal extends OmnisearchModal {
|
||||
) {
|
||||
super(plugin)
|
||||
|
||||
const cmp = new ModalInFile({
|
||||
const cmp = mount(ModalInFile, {
|
||||
target: this.modalEl,
|
||||
props: {
|
||||
plugin,
|
||||
@@ -215,7 +217,7 @@ export class OmnisearchInFileModal extends OmnisearchModal {
|
||||
if (parent) {
|
||||
parent.containerEl.toggleVisibility(true)
|
||||
}
|
||||
cmp.$destroy()
|
||||
unmount(cmp)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
13
src/main.ts
13
src/main.ts
@@ -53,7 +53,7 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
public readonly searchHistory = new SearchHistory(this)
|
||||
|
||||
private ribbonButton?: HTMLElement
|
||||
private refreshIndexCallback?: () => void
|
||||
private refreshIndexCallback?: (ev: FocusEvent) => any
|
||||
|
||||
constructor(app: App, manifest: PluginManifest) {
|
||||
super(app, manifest)
|
||||
@@ -116,10 +116,8 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
// Listeners to keep the search index up-to-date
|
||||
this.registerEvent(
|
||||
this.app.vault.on('create', file => {
|
||||
if (
|
||||
file instanceof TFile &&
|
||||
this.notesIndexer.isFileIndexable(file.path)
|
||||
) {
|
||||
if (!(file instanceof TFile)) return
|
||||
if (this.notesIndexer.isFileIndexable(file.path)) {
|
||||
logVerbose('Indexing new file', file.path)
|
||||
searchEngine.addFromPaths([file.path])
|
||||
this.embedsRepository.refreshEmbedsForNote(file.path)
|
||||
@@ -128,6 +126,7 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
)
|
||||
this.registerEvent(
|
||||
this.app.vault.on('delete', file => {
|
||||
if (!(file instanceof TFile)) return
|
||||
logVerbose('Removing file', file.path)
|
||||
this.documentsRepository.removeDocument(file.path)
|
||||
searchEngine.removeFromPaths([file.path])
|
||||
@@ -136,6 +135,7 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
)
|
||||
this.registerEvent(
|
||||
this.app.vault.on('modify', async file => {
|
||||
if (!(file instanceof TFile)) return
|
||||
if (this.notesIndexer.isFileIndexable(file.path)) {
|
||||
this.notesIndexer.flagNoteForReindex(file)
|
||||
}
|
||||
@@ -144,6 +144,7 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
)
|
||||
this.registerEvent(
|
||||
this.app.vault.on('rename', async (file, oldPath) => {
|
||||
if (!(file instanceof TFile)) return
|
||||
if (this.notesIndexer.isFileIndexable(file.path)) {
|
||||
logVerbose('Renaming file', file.path)
|
||||
this.documentsRepository.removeDocument(oldPath)
|
||||
@@ -160,7 +161,7 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
this.refreshIndexCallback = this.notesIndexer.refreshIndex.bind(
|
||||
this.notesIndexer
|
||||
)
|
||||
addEventListener('blur', this.refreshIndexCallback)
|
||||
addEventListener('blur', this.refreshIndexCallback!)
|
||||
removeEventListener
|
||||
|
||||
await this.executeFirstLaunchTasks()
|
||||
|
||||
@@ -67,7 +67,16 @@ export class DocumentsRepository {
|
||||
}
|
||||
logVerbose('Generating IndexedDocument from', path)
|
||||
await this.addDocument(path)
|
||||
return this.documents.get(path)!
|
||||
const document = this.documents.get(path)
|
||||
|
||||
// Only happens if the cache is corrupted
|
||||
if (!document) {
|
||||
console.error('Omnisearch', path, 'cannot be read')
|
||||
this.countError()
|
||||
}
|
||||
|
||||
// The document might be undefined, but this shouldn't stop the search from mostly working
|
||||
return document!
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -219,7 +228,8 @@ export class DocumentsRepository {
|
||||
if (this.plugin.settings.displayTitle === '#heading') {
|
||||
displayTitle = metadata?.headings?.find(h => h.level === 1)?.heading ?? ''
|
||||
} else {
|
||||
displayTitle = metadata?.frontmatter?.[this.plugin.settings.displayTitle] ?? ''
|
||||
displayTitle =
|
||||
metadata?.frontmatter?.[this.plugin.settings.displayTitle] ?? ''
|
||||
}
|
||||
const tags = getTagsFromMetadata(metadata)
|
||||
return {
|
||||
@@ -247,10 +257,11 @@ export class DocumentsRepository {
|
||||
}
|
||||
|
||||
private countError(): void {
|
||||
if (++this.errorsCount > 5 && !this.errorsWarned) {
|
||||
if (++this.errorsCount >= 3 && !this.errorsWarned) {
|
||||
this.errorsWarned = true
|
||||
new Notice(
|
||||
'Omnisearch ⚠️ There might be an issue with your cache. You should clean it in Omnisearch settings and restart Obsidian.'
|
||||
'Omnisearch ⚠️ There might be an issue with your cache. You should clean it in Omnisearch settings and restart Obsidian.',
|
||||
0
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ export class SettingsTab extends PluginSettingTab {
|
||||
new Setting(containerEl)
|
||||
.setName('Enable verbose logging')
|
||||
.setDesc(
|
||||
"Adds a LOT of logs for debugging purposes. Don't forget to disable it."
|
||||
'Adds a LOT of logs for debugging purposes. You also need to enable "Verbose" logging in the console to see these logs.'
|
||||
)
|
||||
.addToggle(toggle =>
|
||||
toggle.setValue(settings.verboseLogging).onChange(async v => {
|
||||
|
||||
@@ -23,55 +23,13 @@ export class TextProcessor {
|
||||
return text
|
||||
}
|
||||
try {
|
||||
// Text to highlight
|
||||
const smartMatches = new RegExp(
|
||||
matches
|
||||
.map(
|
||||
// This regex will match the word (with \b word boundary)
|
||||
// \b doesn't detect non-alphabetical character's word boundary, so we need to escape it
|
||||
matchItem => {
|
||||
const escaped = escapeRegExp(matchItem.match)
|
||||
return `\\b${escaped}\\b${
|
||||
!/[a-zA-Z]/.test(matchItem.match) ? `|${escaped}` : ''
|
||||
}`
|
||||
}
|
||||
)
|
||||
.join('|'),
|
||||
'giu'
|
||||
)
|
||||
|
||||
// Replacer function that will highlight the matches
|
||||
const replacer = (match: string) => {
|
||||
const matchInfo = matches.find(info =>
|
||||
match.match(
|
||||
return text.replace(
|
||||
new RegExp(
|
||||
`\\b${escapeRegExp(info.match)}\\b${
|
||||
!/[a-zA-Z]/.test(info.match)
|
||||
? `|${escapeRegExp(info.match)}`
|
||||
: ''
|
||||
}`,
|
||||
`(${matches.map(item => escapeRegExp(item.match)).join('|')})`,
|
||||
'giu'
|
||||
),
|
||||
`<span class="${highlightClass}">$1</span>`
|
||||
)
|
||||
)
|
||||
)
|
||||
if (matchInfo) {
|
||||
return `<span class="${highlightClass}">${match}</span>`
|
||||
}
|
||||
return match
|
||||
}
|
||||
|
||||
// Effectively highlight the text
|
||||
let newText = text.replace(smartMatches, replacer)
|
||||
|
||||
// If the text didn't change (= nothing to highlight), re-run the regex but just replace the matches without the word boundary
|
||||
if (newText === text) {
|
||||
const dumbMatches = new RegExp(
|
||||
matches.map(matchItem => escapeRegExp(matchItem.match)).join('|'),
|
||||
'giu'
|
||||
)
|
||||
newText = text.replace(dumbMatches, replacer)
|
||||
}
|
||||
return newText
|
||||
} catch (e) {
|
||||
console.error('Omnisearch - Error in highlightText()', e)
|
||||
return text
|
||||
@@ -101,7 +59,12 @@ export class TextProcessor {
|
||||
* @param reg
|
||||
* @param query
|
||||
*/
|
||||
public getMatches(text: string, words: string[], query?: Query): SearchMatch[] {
|
||||
public getMatches(
|
||||
text: string,
|
||||
words: string[],
|
||||
query?: Query
|
||||
): SearchMatch[] {
|
||||
words = words.map(escapeHTML)
|
||||
const reg = this.stringsToRegex(words)
|
||||
const originalText = text
|
||||
// text = text.toLowerCase().replace(new RegExp(SEPARATORS, 'gu'), ' ')
|
||||
@@ -199,4 +162,3 @@ export function escapeHTML(html: string): string {
|
||||
.replaceAll('"', '"')
|
||||
.replaceAll("'", ''')
|
||||
}
|
||||
|
||||
|
||||
@@ -1,31 +1,27 @@
|
||||
{
|
||||
"extends": "@tsconfig/svelte/tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"types": [
|
||||
"svelte",
|
||||
"node",
|
||||
"jest"
|
||||
],
|
||||
"strict": true,
|
||||
"noUncheckedIndexedAccess": false,
|
||||
"verbatimModuleSyntax": true,
|
||||
"skipLibCheck": true,
|
||||
"baseUrl": ".",
|
||||
"inlineSourceMap": true,
|
||||
"inlineSources": true,
|
||||
"module": "ESNext",
|
||||
"target": "ES2021",
|
||||
"allowJs": true,
|
||||
"noImplicitAny": true,
|
||||
"moduleResolution": "node",
|
||||
"importHelpers": true,
|
||||
"resolveJsonModule": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"isolatedModules": true,
|
||||
"strictNullChecks": true,
|
||||
"lib": [
|
||||
"DOM",
|
||||
"ES2021"
|
||||
],
|
||||
"paths": {
|
||||
"minisearch": ["node_modules/minisearch/src/MiniSearch.ts"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
"**/*.ts",
|
||||
"src/__tests__/event-bus-tests.mts"
|
||||
"**/*.svelte"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user