Skip to content

Commit 6a29da1

Browse files
committed
I give up, we use unknown now
1 parent 64c40e9 commit 6a29da1

File tree

8 files changed

+42
-44
lines changed

8 files changed

+42
-44
lines changed

jsEngine/api/PromptAPI.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import type { API } from 'jsEngine/api/API';
22
import { ButtonStyleType } from 'jsEngine/utils/Util';
33
import { SvelteModal } from 'jsEngine/api/prompts/SvelteModal';
4-
import { ButtonModalComponent } from 'jsEngine/api/prompts/ButtonModalComponent';
4+
import ButtonModalComponent from 'jsEngine/api/prompts/ButtonModalComponent.svelte';
55
import { Suggester } from 'jsEngine/api/prompts/Suggester';
6-
import { customMount } from 'jsEngine/utils/SvelteUtils';
6+
import { mount } from 'svelte';
7+
import type { AnySvelteComponent } from 'jsEngine/utils/SvelteUtils';
78

89
export interface ModalPromptOptions {
910
/**
@@ -69,17 +70,19 @@ export class PromptAPI {
6970
public button<T>(options: ButtonPromptOptions<T>): Promise<T | undefined> {
7071
return new Promise<T | undefined>((resolve, reject) => {
7172
try {
72-
new SvelteModal(
73+
new SvelteModal<AnySvelteComponent, unknown>(
7374
this.apiInstance.app,
7475
options,
7576
(modal, targetEl) => {
76-
return customMount<ButtonModalComponent<T>>(ButtonModalComponent, targetEl, {
77-
options,
78-
modal,
77+
return mount(ButtonModalComponent, {
78+
target: targetEl,
79+
props: {
80+
options,
81+
modal,
82+
},
7983
});
8084
},
81-
// we cast to narrow the type, so that it is inferred correctly
82-
resolve as (value: T | undefined) => void,
85+
resolve as (value: unknown) => void,
8386
).open();
8487
} catch (error) {
8588
reject(error);

jsEngine/api/prompts/ButtonModalComponent.d.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

jsEngine/api/prompts/ButtonModalComponent.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<script lang="ts" generics="T">
1+
<script lang="ts">
22
import type { ButtonPromptOptions } from 'jsEngine/api/PromptAPI';
33
import Button from 'jsEngine/utils/Button.svelte';
44
import type { SvelteModal } from './SvelteModal';
@@ -8,8 +8,8 @@
88
options,
99
modal,
1010
}: {
11-
options: ButtonPromptOptions<T>;
12-
modal: SvelteModal<any, T>;
11+
options: ButtonPromptOptions<unknown>;
12+
modal: SvelteModal<any, unknown>;
1313
} = $props();
1414
</script>
1515

jsEngine/api/prompts/SvelteModal.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
import { type App, Modal } from 'obsidian';
2-
import { type Component as SvelteComponent, unmount } from 'svelte';
2+
import { unmount } from 'svelte';
33
import type { ModalPromptOptions } from 'jsEngine/api/PromptAPI';
4+
import type { AnySvelteComponent, MountedComponent } from 'jsEngine/utils/SvelteUtils';
45

5-
export class SvelteModal<Component extends SvelteComponent, T> extends Modal {
6-
private component: ReturnType<Component> | undefined;
6+
export class SvelteModal<Component extends AnySvelteComponent, T> extends Modal {
7+
private component: MountedComponent<Component> | undefined;
78
private readonly options: ModalPromptOptions;
8-
private readonly createComponent: (modal: SvelteModal<Component, T>, targetEl: HTMLElement) => ReturnType<Component>;
9+
private readonly createComponent: (modal: SvelteModal<Component, T>, targetEl: HTMLElement) => MountedComponent<Component>;
910
private readonly onSubmit: (value: T | undefined) => void;
1011
private submitted: boolean;
1112

1213
constructor(
1314
app: App,
1415
options: ModalPromptOptions,
15-
createComponent: (modal: SvelteModal<Component, T>, targetEl: HTMLElement) => ReturnType<Component>,
16+
createComponent: (modal: SvelteModal<Component, T>, targetEl: HTMLElement) => MountedComponent<Component>,
1617
onSubmit: (value: T | undefined) => void,
1718
) {
1819
super(app);

jsEngine/engine/ExecutionStatsModal.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { type App, Modal } from 'obsidian';
22
import type JsEnginePlugin from 'jsEngine/main';
33
import ExecutionStatsComponent from 'jsEngine/engine/ExecutionStatsComponent.svelte';
44
import { type JsExecution } from 'jsEngine/engine/JsExecution';
5-
import { unmount } from 'svelte';
6-
import { customMount, type MountedComponent } from 'jsEngine/utils/SvelteUtils';
5+
import { mount, unmount } from 'svelte';
6+
import { type MountedComponent } from 'jsEngine/utils/SvelteUtils';
77

88
/**
99
* @internal
@@ -37,8 +37,11 @@ export class ExecutionStatsModal extends Modal {
3737
return;
3838
}
3939

40-
this.component = customMount(ExecutionStatsComponent, this.contentEl, {
41-
execution: this.execution,
40+
this.component = mount(ExecutionStatsComponent, {
41+
target: this.contentEl,
42+
props: {
43+
execution: this.execution,
44+
},
4245
});
4346
}
4447

jsEngine/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export * from './api/Internal';
88
export * from './api/LibAPI';
99
export * from './api/MarkdownAPI';
1010
export * from './api/MessageAPI';
11+
export * from './api/PromptAPI';
12+
export * from './api/QueryAPI';
1113
export * from './api/reactive/ReactiveComponent';
1214
export * from './api/markdown/AbstractMarkdownElement';
1315
export * from './api/markdown/AbstractMarkdownElementContainer';

jsEngine/messages/MessageDisplay.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { type App, Modal } from 'obsidian';
22
import type JsEnginePlugin from 'jsEngine/main';
33
import MessageDisplayComponent from 'jsEngine/messages/MessageDisplayComponent.svelte';
4-
import { unmount } from 'svelte';
5-
import { customMount, type MountedComponent } from 'jsEngine/utils/SvelteUtils';
4+
import { mount, unmount } from 'svelte';
5+
import { type MountedComponent } from 'jsEngine/utils/SvelteUtils';
66

77
export class MessageDisplay extends Modal {
88
/**
@@ -22,8 +22,11 @@ export class MessageDisplay extends Modal {
2222
unmount(this.component);
2323
}
2424

25-
this.component = customMount<MessageDisplayComponent>(MessageDisplayComponent, this.contentEl, {
26-
messageManager: this.plugin.messageManager,
25+
this.component = mount(MessageDisplayComponent, {
26+
target: this.contentEl,
27+
props: {
28+
messageManager: this.plugin.messageManager,
29+
},
2730
});
2831
}
2932

jsEngine/utils/SvelteUtils.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
1-
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument */
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
22

3-
import { mount, type Component, type ComponentProps, type SvelteComponent } from 'svelte';
4-
5-
export function customMount<Comp extends Component<any, any> | SvelteComponent>(
6-
component: Component<any, any> | SvelteComponent,
7-
target: HTMLElement,
8-
props: ComponentProps<Comp>,
9-
): ComponentExports<Comp> {
10-
return mount(component as any, { target, props });
11-
}
3+
import { type Component, type SvelteComponent } from 'svelte';
124

135
export type AnyRecord = Record<string, any>;
146
export type UnknownRecord = Record<string, unknown>;
7+
type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N;
158

169
export type ComponentExports<Comp extends Component<any, any> | SvelteComponent> =
17-
Comp extends SvelteComponent<any, infer Exports> ? (Exports extends any ? AnyRecord : Exports) : AnyRecord;
10+
Comp extends SvelteComponent<any, infer Exports> ? IfAny<Exports, AnyRecord, Exports> : AnyRecord;
1811

1912
export type MountedComponent<Comp extends Component<any, any> | SvelteComponent> = ComponentExports<Comp>;
13+
14+
export type AnySvelteComponent = Component<any, any>;

0 commit comments

Comments
 (0)