From b3bdbadf791e1ae8b98f4e5df12a360e8f1572e1 Mon Sep 17 00:00:00 2001 From: Moritz Jung Date: Fri, 14 Feb 2025 23:44:57 +0100 Subject: [PATCH 1/7] update release workflow yet again --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b2eb93a..c2879dc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,3 +52,4 @@ jobs: main.js manifest.json styles.css + JsEngine.d.ts From 86f7cdfe67e1e2ec80a118acdf7c384ae4b64495 Mon Sep 17 00:00:00 2001 From: Moritz Jung Date: Thu, 20 Feb 2025 14:04:45 +0100 Subject: [PATCH 2/7] fix obsidian-meta-bind-plugin#516 --- jsEngine/api/Internal.ts | 23 +++++++++++++++++------ jsEngine/engine/JsExecution.ts | 11 +++++++---- jsEngine/utils/Validators.ts | 6 +++--- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/jsEngine/api/Internal.ts b/jsEngine/api/Internal.ts index 154db9c..6ac8f63 100644 --- a/jsEngine/api/Internal.ts +++ b/jsEngine/api/Internal.ts @@ -145,8 +145,8 @@ export class InternalAPI { public async getContextForMarkdownCodeBlock(path: string): Promise { validateAPIArgs(z.object({ path: z.string() }), { path }); - const file = this.getFileWithExtension(path, 'md'); - const metadata = this.apiInstance.app.metadataCache.getFileCache(file); + const file = this.tryGetFileWithExtension(path, 'md'); + const metadata = file ? this.apiInstance.app.metadataCache.getFileCache(file) : undefined; return { executionSource: ExecutionSource.MarkdownCodeBlock, @@ -167,8 +167,8 @@ export class InternalAPI { public async getContextForMarkdownCallingJSFile(markdownPath: string, jsPath: string): Promise { validateAPIArgs(z.object({ markdownPath: z.string(), jsPath: z.string() }), { markdownPath, jsPath }); - const markdownFile = this.getFileWithExtension(markdownPath, 'md'); - const metadata = this.apiInstance.app.metadataCache.getFileCache(markdownFile); + const markdownFile = this.tryGetFileWithExtension(markdownPath, 'md'); + const metadata = markdownFile ? this.apiInstance.app.metadataCache.getFileCache(markdownFile) : undefined; const jsFile = this.getFileWithExtension(jsPath, 'js'); @@ -189,8 +189,8 @@ export class InternalAPI { public async getContextForMarkdownOther(path: string): Promise { validateAPIArgs(z.object({ path: z.string() }), { path }); - const file = this.getFileWithExtension(path, 'md'); - const metadata = this.apiInstance.app.metadataCache.getFileCache(file); + const file = this.tryGetFileWithExtension(path, 'md'); + const metadata = file ? this.apiInstance.app.metadataCache.getFileCache(file) : undefined; return { executionSource: ExecutionSource.MarkdownOther, @@ -279,4 +279,15 @@ export class InternalAPI { } return file; } + + private tryGetFileWithExtension(path: string, extension: string): TFile | undefined { + const file = this.apiInstance.app.vault.getAbstractFileByPath(path); + if (!file || !(file instanceof TFile)) { + return undefined; + } + if (file.extension !== extension && file.extension !== `.${extension}`) { + return undefined; + } + return file; + } } diff --git a/jsEngine/engine/JsExecution.ts b/jsEngine/engine/JsExecution.ts index e5a929a..c089ade 100644 --- a/jsEngine/engine/JsExecution.ts +++ b/jsEngine/engine/JsExecution.ts @@ -24,8 +24,9 @@ export interface MarkdownCodeBlockExecutionContext { executionSource: ExecutionSource.MarkdownCodeBlock; /** * The file that the code block is in. + * Since rendered markdown does not necessarily have an associated file, this can be undefined. */ - file: TFile; + file?: TFile; /** * The metadata of the file. */ @@ -45,8 +46,9 @@ export interface MarkdownCallingJSFileExecutionContext { executionSource: ExecutionSource.MarkdownCallingJSFile; /** * The markdown file that the JS File is called from. + * Since rendered markdown does not necessarily have an associated file, this can be undefined. */ - file: TFile; + file?: TFile; /** * The metadata of the markdown file. */ @@ -60,9 +62,10 @@ export interface MarkdownCallingJSFileExecutionContext { export interface MarkdownOtherExecutionContext { executionSource: ExecutionSource.MarkdownOther; /** - * The file that the code block is in. + * The file that the markdown is associated with. + * Since rendered markdown does not necessarily have an associated file, this can be undefined. */ - file: TFile; + file?: TFile; /** * The metadata of the file. */ diff --git a/jsEngine/utils/Validators.ts b/jsEngine/utils/Validators.ts index e6ad80e..03eec29 100644 --- a/jsEngine/utils/Validators.ts +++ b/jsEngine/utils/Validators.ts @@ -99,7 +99,7 @@ export class Validators { this.markdownCodeBlockExecutionContext = schemaForType()( z.object({ executionSource: z.literal(ExecutionSource.MarkdownCodeBlock), - file: this.tFile, + file: this.tFile.optional(), metadata: this.cachedMetadata.optional(), block: this.block.optional(), }), @@ -107,7 +107,7 @@ export class Validators { this.markdownCallingJSFileExecutionContext = schemaForType()( z.object({ executionSource: z.literal(ExecutionSource.MarkdownCallingJSFile), - file: this.tFile, + file: this.tFile.optional(), metadata: this.cachedMetadata.optional(), jsFile: this.tFile, }), @@ -115,7 +115,7 @@ export class Validators { this.markdownOtherExecutionContext = schemaForType()( z.object({ executionSource: z.literal(ExecutionSource.MarkdownOther), - file: this.tFile, + file: this.tFile.optional(), metadata: this.cachedMetadata.optional(), }), ); From 08f9ce8bb69415f7ec3f88f78514c93ed31dc4ce Mon Sep 17 00:00:00 2001 From: Moritz Jung Date: Thu, 20 Feb 2025 14:05:01 +0100 Subject: [PATCH 3/7] [auto] run release preconditions --- JsEngine.d.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/JsEngine.d.ts b/JsEngine.d.ts index 303a715..5cbf381 100644 --- a/JsEngine.d.ts +++ b/JsEngine.d.ts @@ -1005,6 +1005,7 @@ declare module 'jsEngine/api/Internal' { */ executeStartupScripts(): Promise; private getFileWithExtension; + private tryGetFileWithExtension; } } declare module 'jsEngine/api/LibAPI' { @@ -1370,8 +1371,9 @@ declare module 'jsEngine/engine/JsExecution' { executionSource: ExecutionSource.MarkdownCodeBlock; /** * The file that the code block is in. + * Since rendered markdown does not necessarily have an associated file, this can be undefined. */ - file: TFile; + file?: TFile; /** * The metadata of the file. */ @@ -1389,8 +1391,9 @@ declare module 'jsEngine/engine/JsExecution' { executionSource: ExecutionSource.MarkdownCallingJSFile; /** * The markdown file that the JS File is called from. + * Since rendered markdown does not necessarily have an associated file, this can be undefined. */ - file: TFile; + file?: TFile; /** * The metadata of the markdown file. */ @@ -1403,9 +1406,10 @@ declare module 'jsEngine/engine/JsExecution' { export interface MarkdownOtherExecutionContext { executionSource: ExecutionSource.MarkdownOther; /** - * The file that the code block is in. + * The file that the markdown is associated with. + * Since rendered markdown does not necessarily have an associated file, this can be undefined. */ - file: TFile; + file?: TFile; /** * The metadata of the file. */ From fff05749aaa23f9a775003f5828b7e747db4ed95 Mon Sep 17 00:00:00 2001 From: Moritz Jung Date: Thu, 20 Feb 2025 14:05:08 +0100 Subject: [PATCH 4/7] [auto] bump version to `0.3.1` --- manifest-beta.json | 2 +- manifest.json | 2 +- package.json | 2 +- versions.json | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/manifest-beta.json b/manifest-beta.json index aefa189..c7f8465 100644 --- a/manifest-beta.json +++ b/manifest-beta.json @@ -1,7 +1,7 @@ { "id": "js-engine", "name": "JS Engine", - "version": "0.3.0", + "version": "0.3.1", "minAppVersion": "1.4.0", "description": "Run JavaScript from within your notes.", "author": "Moritz Jung", diff --git a/manifest.json b/manifest.json index aefa189..c7f8465 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "js-engine", "name": "JS Engine", - "version": "0.3.0", + "version": "0.3.1", "minAppVersion": "1.4.0", "description": "Run JavaScript from within your notes.", "author": "Moritz Jung", diff --git a/package.json b/package.json index 061d390..4ccf6a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-js-engine-plugin", - "version": "0.3.0", + "version": "0.3.1", "description": "This plugin for obsidian allows you to use and run JavaScript from within your notes.", "main": "main.js", "scripts": { diff --git a/versions.json b/versions.json index 3082495..de6c13a 100644 --- a/versions.json +++ b/versions.json @@ -28,5 +28,6 @@ "0.2.0": "1.4.0", "0.2.1": "1.4.0", "0.2.2": "1.4.0", - "0.3.0": "1.4.0" + "0.3.0": "1.4.0", + "0.3.1": "1.4.0" } From 02bd84aac4e84cf7876aedbe9f67be88a2778b17 Mon Sep 17 00:00:00 2001 From: Moritz Jung Date: Sat, 22 Mar 2025 17:57:24 +0100 Subject: [PATCH 5/7] fix #36 --- jsEngine/JsMDRC.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/jsEngine/JsMDRC.ts b/jsEngine/JsMDRC.ts index 646e751..ec232fc 100644 --- a/jsEngine/JsMDRC.ts +++ b/jsEngine/JsMDRC.ts @@ -36,15 +36,13 @@ export class JsMDRC extends MarkdownRenderChild { } buildExecutionContext(): ExecutionContext { - // console.log(this.ctx); const file = this.getExecutionFile(); - if (file === undefined) { - throw new Error('Could not find file for execution context.'); - } + const metadata = file ? (this.plugin.app.metadataCache.getFileCache(file) ?? undefined) : undefined; + return { executionSource: ExecutionSource.MarkdownCodeBlock, file: file, - metadata: this.plugin.app.metadataCache.getFileCache(file) ?? undefined, + metadata: metadata, block: undefined, }; } From 0663e6e9db41451b4ff62ad80666727d985455cb Mon Sep 17 00:00:00 2001 From: Moritz Jung Date: Sat, 22 Mar 2025 17:57:44 +0100 Subject: [PATCH 6/7] [auto] bump version to `0.3.2` --- manifest-beta.json | 2 +- manifest.json | 2 +- package.json | 2 +- versions.json | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/manifest-beta.json b/manifest-beta.json index c7f8465..e24b753 100644 --- a/manifest-beta.json +++ b/manifest-beta.json @@ -1,7 +1,7 @@ { "id": "js-engine", "name": "JS Engine", - "version": "0.3.1", + "version": "0.3.2", "minAppVersion": "1.4.0", "description": "Run JavaScript from within your notes.", "author": "Moritz Jung", diff --git a/manifest.json b/manifest.json index c7f8465..e24b753 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "js-engine", "name": "JS Engine", - "version": "0.3.1", + "version": "0.3.2", "minAppVersion": "1.4.0", "description": "Run JavaScript from within your notes.", "author": "Moritz Jung", diff --git a/package.json b/package.json index 4ccf6a9..c8bfa82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-js-engine-plugin", - "version": "0.3.1", + "version": "0.3.2", "description": "This plugin for obsidian allows you to use and run JavaScript from within your notes.", "main": "main.js", "scripts": { diff --git a/versions.json b/versions.json index de6c13a..f1a6b46 100644 --- a/versions.json +++ b/versions.json @@ -29,5 +29,6 @@ "0.2.1": "1.4.0", "0.2.2": "1.4.0", "0.3.0": "1.4.0", - "0.3.1": "1.4.0" + "0.3.1": "1.4.0", + "0.3.2": "1.4.0" } From b1449c4c8d543bb4247fa6f2b2ca2dc68d733539 Mon Sep 17 00:00:00 2001 From: Moritz Jung Date: Thu, 14 Aug 2025 14:17:03 +0200 Subject: [PATCH 7/7] update deps; update types --- JsEngine.d.ts | 13 +++++-- bun.lockb | Bin 142188 -> 168348 bytes jsEngine/api/Internal.ts | 2 + jsEngine/api/QueryAPI.ts | 9 ++--- jsEngine/api/markdown/MarkdownString.ts | 5 ++- jsEngine/api/prompts/SvelteModal.ts | 2 +- jsEngine/engine/ExecutionStatsModal.ts | 4 +- jsEngine/engine/JsExecution.ts | 4 ++ jsEngine/engine/ResultRenderer.ts | 2 +- jsEngine/messages/MessageDisplay.ts | 4 +- jsEngine/settings/StartupScriptModal.ts | 7 ++-- jsEngine/utils/Validators.ts | 21 ++++++---- package.json | 49 ++++++++++++------------ test/placeholder.test.ts | 5 +++ 14 files changed, 74 insertions(+), 53 deletions(-) create mode 100644 test/placeholder.test.ts diff --git a/JsEngine.d.ts b/JsEngine.d.ts index 5cbf381..ed44212 100644 --- a/JsEngine.d.ts +++ b/JsEngine.d.ts @@ -158,11 +158,10 @@ declare module 'jsEngine/messages/MessageManager' { } declare module 'jsEngine/settings/StartupScriptModal' { import type JsEnginePlugin from 'jsEngine/main'; - import StartupScripts from 'jsEngine/settings/StartupScripts.svelte'; import { Modal } from 'obsidian'; export class StartupScriptsModal extends Modal { - plugin: JsEnginePlugin; - component?: ReturnType; + private readonly plugin; + private component?; constructor(plugin: JsEnginePlugin); onOpen(): void; onClose(): void; @@ -194,7 +193,8 @@ declare module 'jsEngine/api/markdown/MarkdownElementType' { } declare module 'jsEngine/api/markdown/MarkdownString' { import type { API } from 'jsEngine/api/API'; - import type { App, Component } from 'obsidian'; + import type { Component } from 'obsidian'; + import { App } from 'obsidian'; /** * A string that should be rendered as markdown by the plugin. */ @@ -689,6 +689,7 @@ declare module 'jsEngine/utils/Validators' { import { z } from 'zod'; export function schemaForType(): >(arg: S) => S; export function validateAPIArgs(validator: z.ZodType, args: T): void; + export function zodFunction(): z.ZodCustom; export class Validators { htmlElement: z.ZodType; voidFunction: z.ZodType<() => void, any, any>; @@ -1417,6 +1418,10 @@ declare module 'jsEngine/engine/JsExecution' { } export interface JSFileExecutionContext { executionSource: ExecutionSource.JSFile; + /** + * There is no associated markdown file. + */ + file: undefined; /** * The JS that is being executed. */ diff --git a/bun.lockb b/bun.lockb index e554b592ddde2ec0ee23d6bc36a2a71531996aff..5f7172f380b45df77bf17a4cc9cd37d3983d9ae1 100755 GIT binary patch delta 56039 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

@b0Z2>xg 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 diff --git a/jsEngine/api/Internal.ts b/jsEngine/api/Internal.ts index 6ac8f63..2897f99 100644 --- a/jsEngine/api/Internal.ts +++ b/jsEngine/api/Internal.ts @@ -79,6 +79,7 @@ export class InternalAPI { return await this.execute({ context: { executionSource: ExecutionSource.JSFile, + file: undefined, jsFile: file, }, ...params, @@ -212,6 +213,7 @@ export class InternalAPI { return { executionSource: ExecutionSource.JSFile, + file: undefined, jsFile: file, }; } diff --git a/jsEngine/api/QueryAPI.ts b/jsEngine/api/QueryAPI.ts index 7e8d7a8..dd9edf4 100644 --- a/jsEngine/api/QueryAPI.ts +++ b/jsEngine/api/QueryAPI.ts @@ -1,5 +1,5 @@ import type { API } from 'jsEngine/api/API'; -import { validateAPIArgs } from 'jsEngine/utils/Validators'; +import { validateAPIArgs, zodFunction } from 'jsEngine/utils/Validators'; import type { CachedMetadata, TFile } from 'obsidian'; import { getAllTags } from 'obsidian'; import { z } from 'zod'; @@ -27,7 +27,7 @@ export class QueryAPI { * ``` */ public files(query: (file: TFile) => T | undefined): T[] { - validateAPIArgs(z.object({ query: z.function().args(this.apiInstance.validators.tFile).returns(z.unknown()) }), { query }); + validateAPIArgs(z.object({ query: zodFunction() }), { query }); return this.apiInstance.app.vault .getMarkdownFiles() @@ -47,10 +47,7 @@ export class QueryAPI { public filesWithMetadata(query: (file: TFile, cache: CachedMetadata | undefined, tags: string[], frontmatterTags: string[]) => T | undefined): T[] { validateAPIArgs( z.object({ - query: z - .function() - .args(this.apiInstance.validators.tFile, this.apiInstance.validators.cachedMetadata.optional(), z.string().array(), z.string().array()) - .returns(z.unknown()), + query: zodFunction(), }), { query }, ); diff --git a/jsEngine/api/markdown/MarkdownString.ts b/jsEngine/api/markdown/MarkdownString.ts index a80e733..1b9c7a2 100644 --- a/jsEngine/api/markdown/MarkdownString.ts +++ b/jsEngine/api/markdown/MarkdownString.ts @@ -1,6 +1,7 @@ import type { API } from 'jsEngine/api/API'; import { validateAPIArgs } from 'jsEngine/utils/Validators'; -import type { App, Component } from 'obsidian'; +import type { Component } from 'obsidian'; +import { App } from 'obsidian'; import { MarkdownRenderer } from 'obsidian'; import { z } from 'zod'; @@ -22,7 +23,7 @@ export class MarkdownString { async render(app: App, element: HTMLElement, sourcePath: string, component: Component): Promise { validateAPIArgs( z.object({ - app: z.object({}), + app: z.instanceof(App), element: this.apiInstance.validators.htmlElement, sourcePath: z.string(), component: this.apiInstance.validators.component, diff --git a/jsEngine/api/prompts/SvelteModal.ts b/jsEngine/api/prompts/SvelteModal.ts index ea1658e..a32685b 100644 --- a/jsEngine/api/prompts/SvelteModal.ts +++ b/jsEngine/api/prompts/SvelteModal.ts @@ -42,7 +42,7 @@ export class SvelteModal extends Modal } if (this.component) { - unmount(this.component); + void unmount(this.component); } this.contentEl.empty(); } diff --git a/jsEngine/engine/ExecutionStatsModal.ts b/jsEngine/engine/ExecutionStatsModal.ts index 36b4e33..94ed3ac 100644 --- a/jsEngine/engine/ExecutionStatsModal.ts +++ b/jsEngine/engine/ExecutionStatsModal.ts @@ -26,7 +26,7 @@ export class ExecutionStatsModal extends Modal { public onOpen(): void { this.contentEl.empty(); if (this.component) { - unmount(this.component); + void unmount(this.component); } if (!this.contentEl.hasClass('js-engine-execution-stats-modal')) { @@ -49,7 +49,7 @@ export class ExecutionStatsModal extends Modal { public onClose(): void { this.contentEl.empty(); if (this.component) { - unmount(this.component); + void unmount(this.component); } } } diff --git a/jsEngine/engine/JsExecution.ts b/jsEngine/engine/JsExecution.ts index c089ade..a9b194a 100644 --- a/jsEngine/engine/JsExecution.ts +++ b/jsEngine/engine/JsExecution.ts @@ -74,6 +74,10 @@ export interface MarkdownOtherExecutionContext { export interface JSFileExecutionContext { executionSource: ExecutionSource.JSFile; + /** + * There is no associated markdown file. + */ + file: undefined; /** * The JS that is being executed. */ diff --git a/jsEngine/engine/ResultRenderer.ts b/jsEngine/engine/ResultRenderer.ts index 5bcdbde..c99d9a1 100644 --- a/jsEngine/engine/ResultRenderer.ts +++ b/jsEngine/engine/ResultRenderer.ts @@ -68,7 +68,7 @@ export class ResultRenderer { }); this.component.register(() => { - unmount(svelteComponent); + void unmount(svelteComponent); }); return; } diff --git a/jsEngine/messages/MessageDisplay.ts b/jsEngine/messages/MessageDisplay.ts index 38ad913..89f7dd3 100644 --- a/jsEngine/messages/MessageDisplay.ts +++ b/jsEngine/messages/MessageDisplay.ts @@ -20,7 +20,7 @@ export class MessageDisplay extends Modal { public onOpen(): void { this.contentEl.empty(); if (this.component) { - unmount(this.component); + void unmount(this.component); } this.component = mount(MessageDisplayComponent, { @@ -34,7 +34,7 @@ export class MessageDisplay extends Modal { public onClose(): void { this.contentEl.empty(); if (this.component) { - unmount(this.component); + void unmount(this.component); } } } diff --git a/jsEngine/settings/StartupScriptModal.ts b/jsEngine/settings/StartupScriptModal.ts index 6e9357d..15ccf64 100644 --- a/jsEngine/settings/StartupScriptModal.ts +++ b/jsEngine/settings/StartupScriptModal.ts @@ -1,11 +1,12 @@ import type JsEnginePlugin from 'jsEngine/main'; import StartupScripts from 'jsEngine/settings/StartupScripts.svelte'; +import type { MountedComponent } from 'jsEngine/utils/SvelteUtils'; import { Modal } from 'obsidian'; import { mount, unmount } from 'svelte'; export class StartupScriptsModal extends Modal { - plugin: JsEnginePlugin; - component?: ReturnType; + readonly plugin: JsEnginePlugin; + private component?: MountedComponent | undefined; constructor(plugin: JsEnginePlugin) { super(plugin.app); @@ -26,7 +27,7 @@ export class StartupScriptsModal extends Modal { onClose(): void { if (this.component) { - unmount(this.component); + void unmount(this.component); } } diff --git a/jsEngine/utils/Validators.ts b/jsEngine/utils/Validators.ts index 03eec29..7f8b2a2 100644 --- a/jsEngine/utils/Validators.ts +++ b/jsEngine/utils/Validators.ts @@ -51,6 +51,13 @@ export function validateAPIArgs(validator: z.ZodType, args: T): void { } } +// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type,@typescript-eslint/explicit-function-return-type +export function zodFunction() { + return z.custom(val => { + return typeof val === 'function'; + }); +} + export class Validators { htmlElement: z.ZodType; voidFunction: z.ZodType<() => void, any, any>; @@ -83,11 +90,11 @@ export class Validators { numberInputPromptOptions: z.ZodType; constructor() { - this.htmlElement = schemaForType()(z.instanceof(HTMLElement)); - this.voidFunction = schemaForType<() => void>()(z.function().args().returns(z.void())); + this.htmlElement = schemaForType()(z.any()); + this.voidFunction = schemaForType<() => void>()(zodFunction<() => void>()); this.component = schemaForType()(z.instanceof(Component)); this.tFile = schemaForType()(z.instanceof(TFile)); - this.cachedMetadata = schemaForType()(z.record(z.unknown())) as z.ZodType; + this.cachedMetadata = schemaForType()(z.record(z.string(), z.unknown())) as z.ZodType; this.block = schemaForType()( z.object({ from: z.number(), @@ -146,7 +153,7 @@ export class Validators { component: this.component, container: this.htmlElement.optional(), context: this.executionContext, - contextOverrides: z.record(z.unknown()).optional(), + contextOverrides: z.record(z.string(), z.unknown()).optional(), }), ); this.engineExecutionParamsFile = schemaForType()( @@ -154,21 +161,21 @@ export class Validators { component: this.component, container: this.htmlElement.optional(), context: z.union([this.markdownCallingJSFileExecutionContext, this.jsFileExecutionContext]).optional(), - contextOverrides: z.record(z.unknown()).optional(), + contextOverrides: z.record(z.string(), z.unknown()).optional(), }), ); this.engineExecutionParamsFileSimple = schemaForType()( z.object({ container: this.htmlElement.optional(), context: z.union([this.markdownCallingJSFileExecutionContext, this.jsFileExecutionContext]).optional(), - contextOverrides: z.record(z.unknown()).optional(), + contextOverrides: z.record(z.string(), z.unknown()).optional(), }), ); this.jsExecutionGlobalsConstructionOptions = schemaForType()( z.object({ engine: z.instanceof(API).optional(), component: this.component, - context: z.intersection(this.executionContext, z.record(z.unknown())), + context: z.intersection(this.executionContext, z.record(z.string(), z.unknown())), container: this.htmlElement.optional(), }), ); diff --git a/package.json b/package.json index c8bfa82..4b90a8a 100644 --- a/package.json +++ b/package.json @@ -23,41 +23,40 @@ "author": "Moritz Jung", "license": "GPL-3.0", "devDependencies": { - "@codemirror/autocomplete": "^6.18.2", - "@codemirror/lang-javascript": "^6.2.2", - "@codemirror/language": "^6.10.3", - "@codemirror/lint": "^6.8.2", - "@codemirror/state": "^6.4.1", - "@codemirror/view": "^6.34.1", - "@eslint/js": "^9.14.0", - "@happy-dom/global-registrator": "^15.8.0", + "@codemirror/autocomplete": "^6.18.6", + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/language": "^6.11.2", + "@codemirror/lint": "^6.8.5", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.38.1", + "@eslint/js": "^9.33.0", + "@happy-dom/global-registrator": "^18.0.1", "@tsconfig/svelte": "^5.0.4", - "@types/bun": "^1.1.13", - "builtin-modules": "^4.0.0", - "esbuild": "^0.24.0", + "@types/bun": "^1.2.20", + "builtin-modules": "^5.0.0", + "esbuild": "^0.25.9", "esbuild-plugin-copy-watch": "^2.3.1", - "esbuild-svelte": "^0.8.2", - "eslint": "^9.14.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-no-relative-import-paths": "^1.5.5", + "esbuild-svelte": "^0.9.3", + "eslint": "^9.33.0", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-no-relative-import-paths": "^1.6.1", "eslint-plugin-only-warn": "^1.1.0", "obsidian": "latest", - "prettier": "^3.3.3", - "prettier-plugin-svelte": "^3.2.7", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", "string-argv": "^0.3.2", - "svelte": "^5.1.9", - "svelte-check": "^4.0.5", + "svelte": "^5.38.1", + "svelte-check": "^4.3.1", "svelte-preprocess": "^6.0.3", "tslib": "^2.8.1", - "typedoc": "^0.26.11", - "typescript": "^5.6.3", - "typescript-eslint": "^8.12.2" + "typescript": "^5.9.2", + "typescript-eslint": "^8.39.1" }, "dependencies": { - "@codemirror/legacy-modes": "^6.4.1", + "@codemirror/legacy-modes": "^6.5.1", "@lemons_dev/parsinom": "^0.0.12", - "itertools-ts": "^1.27.1", - "zod": "^3.23.8" + "itertools-ts": "^2.2.0", + "zod": "^4.0.17" }, "trustedDependencies": [ "svelte-preprocess" diff --git a/test/placeholder.test.ts b/test/placeholder.test.ts new file mode 100644 index 0000000..a1c414e --- /dev/null +++ b/test/placeholder.test.ts @@ -0,0 +1,5 @@ +import { test, expect } from 'bun:test'; + +test('placeholder test', () => { + expect(true).toBe(true); +});