@vidra-dev/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +40 -0
  2. package/dist/appWindow.d.ts +17 -0
  3. package/dist/appWindow.d.ts.map +1 -0
  4. package/dist/appWindow.js +9 -0
  5. package/dist/appWindow.js.map +1 -0
  6. package/dist/client.d.ts +48 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +167 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/generated/app.d.ts +19 -0
  11. package/dist/generated/app.d.ts.map +1 -0
  12. package/dist/generated/app.js +12 -0
  13. package/dist/generated/app.js.map +1 -0
  14. package/dist/generated/appWindow.d.ts +48 -0
  15. package/dist/generated/appWindow.d.ts.map +1 -0
  16. package/dist/generated/appWindow.js +36 -0
  17. package/dist/generated/appWindow.js.map +1 -0
  18. package/dist/generated/clipboard.d.ts +21 -0
  19. package/dist/generated/clipboard.d.ts.map +1 -0
  20. package/dist/generated/clipboard.js +15 -0
  21. package/dist/generated/clipboard.js.map +1 -0
  22. package/dist/generated/dialogs.d.ts +35 -0
  23. package/dist/generated/dialogs.d.ts.map +1 -0
  24. package/dist/generated/dialogs.js +15 -0
  25. package/dist/generated/dialogs.js.map +1 -0
  26. package/dist/generated/filesystem.d.ts +46 -0
  27. package/dist/generated/filesystem.d.ts.map +1 -0
  28. package/dist/generated/filesystem.js +21 -0
  29. package/dist/generated/filesystem.js.map +1 -0
  30. package/dist/generated/index.d.ts +19 -0
  31. package/dist/generated/index.d.ts.map +1 -0
  32. package/dist/generated/index.js +21 -0
  33. package/dist/generated/index.js.map +1 -0
  34. package/dist/generated/notifications.d.ts +18 -0
  35. package/dist/generated/notifications.d.ts.map +1 -0
  36. package/dist/generated/notifications.js +12 -0
  37. package/dist/generated/notifications.js.map +1 -0
  38. package/dist/index.d.ts +10 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +10 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/singleton.d.ts +9 -0
  43. package/dist/singleton.d.ts.map +1 -0
  44. package/dist/singleton.js +8 -0
  45. package/dist/singleton.js.map +1 -0
  46. package/dist/transport.d.ts +54 -0
  47. package/dist/transport.d.ts.map +1 -0
  48. package/dist/transport.js +92 -0
  49. package/dist/transport.js.map +1 -0
  50. package/dist/types.d.ts +37 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +47 -0
package/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # @vidra-dev/sdk
2
+
3
+ Framework-agnostic TypeScript SDK for the [Vidra](https://github.com/rzamfiriu/vidra)
4
+ bridge between a web UI and a native .NET MAUI host.
5
+
6
+ > **Alpha.** APIs may change between 0.x releases.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install @vidra-dev/sdk
12
+ ```
13
+
14
+ Most apps are scaffolded with [`create-vidra-app`](https://www.npmjs.com/package/create-vidra-app),
15
+ which wires this up for you.
16
+
17
+ ## Usage
18
+
19
+ ```ts
20
+ import { vidra } from "@vidra-dev/sdk";
21
+
22
+ // Call a native module
23
+ const { content } = await vidra.invoke("filesystem", "readText", {
24
+ path: "/tmp/notes.txt",
25
+ });
26
+
27
+ // Listen for native events
28
+ vidra.on("app.resume", () => console.log("App resumed"));
29
+
30
+ // Discover what the host supports at runtime
31
+ const caps = await vidra.capabilities();
32
+ ```
33
+
34
+ The SDK auto-detects its transport: it uses the native message channel
35
+ (WKWebView / WebView2) inside a Vidra host, and falls back to a browser stub
36
+ when run in a plain browser so you can develop the UI without the native shell.
37
+
38
+ ## License
39
+
40
+ MIT
@@ -0,0 +1,17 @@
1
+ import type { EventHandler } from "./types.js";
2
+ import { type WindowInfo } from "./generated/appWindow.js";
3
+ export type AppWindowChangedHandler = EventHandler<WindowInfo>;
4
+ export interface ConfigureAppWindowOptions {
5
+ title?: string | null;
6
+ width?: number | null;
7
+ height?: number | null;
8
+ }
9
+ declare module "./generated/appWindow.js" {
10
+ interface AppWindowProxy {
11
+ configure(args: ConfigureAppWindowOptions): Promise<WindowInfo>;
12
+ onResized(handler: AppWindowChangedHandler): () => void;
13
+ onStateChanged(handler: AppWindowChangedHandler): () => void;
14
+ }
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=appWindow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appWindow.d.ts","sourceRoot":"","sources":["../src/appWindow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3E,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AAC/D,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,OAAO,QAAQ,0BAA0B,CAAC;IACxC,UAAU,cAAc;QACtB,SAAS,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAChE,SAAS,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,IAAI,CAAC;QACxD,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,IAAI,CAAC;KAC9D;CACF;AAcD,OAAO,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { vidra } from "./singleton.js";
2
+ import { AppWindowProxy } from "./generated/appWindow.js";
3
+ AppWindowProxy.prototype.onResized = (handler) => {
4
+ return vidra.on("appWindow.resized", handler);
5
+ };
6
+ AppWindowProxy.prototype.onStateChanged = (handler) => {
7
+ return vidra.on("appWindow.stateChanged", handler);
8
+ };
9
+ //# sourceMappingURL=appWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appWindow.js","sourceRoot":"","sources":["../src/appWindow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAmB,MAAM,0BAA0B,CAAC;AAiB3E,cAAc,CAAC,SAAS,CAAC,SAAS,GAAG,CACnC,OAAgC,EACpB,EAAE;IACd,OAAO,KAAK,CAAC,EAAE,CAAa,mBAAmB,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,cAAc,CAAC,SAAS,CAAC,cAAc,GAAG,CACxC,OAAgC,EACpB,EAAE;IACd,OAAO,KAAK,CAAC,EAAE,CAAa,wBAAwB,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { EventHandler, Capabilities, JsHandler } from "./types.js";
2
+ import { Transport } from "./transport.js";
3
+ export interface VidraClientOptions {
4
+ /** Override the transport layer (auto-detected by default). */
5
+ transport?: Transport;
6
+ /** Timeout in ms for invoke calls. Default: 30_000 */
7
+ timeout?: number;
8
+ }
9
+ export declare class VidraClient {
10
+ private _explicitTransport?;
11
+ private _transport?;
12
+ private timeout;
13
+ private pending;
14
+ private listeners;
15
+ private handlers;
16
+ constructor(options?: VidraClientOptions);
17
+ /**
18
+ * Lazily resolve the transport on first use. Preference order:
19
+ * 1. an explicitly supplied transport
20
+ * 2. the native message channel (WKWebView / WebView2) when present
21
+ * 3. the custom-scheme transport when the host marker is set
22
+ * 4. the browser-only fallback
23
+ *
24
+ * The browser fallback is intentionally never cached: a native channel can
25
+ * become available shortly after load (e.g. the WKWebView script-message
26
+ * handler registers just after the page loads), so we keep re-detecting until
27
+ * a real native transport is found.
28
+ */
29
+ private get transport();
30
+ private detectTransport;
31
+ /**
32
+ * Invoke a native module method and wait for the result.
33
+ *
34
+ * @example
35
+ * const { content } = await vidra.invoke<{ content: string }>('filesystem', 'readText', { path: '/tmp/f.txt' });
36
+ */
37
+ invoke<T = unknown>(module: string, method: string, payload?: unknown): Promise<T>;
38
+ /** Register a handler that C# can invoke via reverse RPC. Returns an unsubscribe function. */
39
+ handle<TPayload = unknown, TResult = unknown>(name: string, handler: JsHandler<TPayload, TResult>): () => void;
40
+ /** Subscribe to events pushed from C# (e.g. `app.resume`, `app.themeChanged`). */
41
+ on<T = unknown>(event: string, handler: EventHandler<T>): () => void;
42
+ /** Query which modules and methods are available on the native side. */
43
+ capabilities(): Promise<Capabilities>;
44
+ private handleResponse;
45
+ private handleEvent;
46
+ private handleReverseCall;
47
+ }
48
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,YAAY,EACZ,YAAY,EAGZ,SAAS,EACV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EAKV,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,kBAAkB,CAAC,CAAY;IACvC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,QAAQ,CAAgC;gBAEpC,OAAO,GAAE,kBAAuB;IAoB5C;;;;;;;;;;;OAWG;IACH,OAAO,KAAK,SAAS,GASpB;IAED,OAAO,CAAC,eAAe;IAMvB;;;;;OAKG;IACH,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAyBlF,8FAA8F;IAC9F,MAAM,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,GACpC,MAAM,IAAI;IAKb,kFAAkF;IAClF,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAQpE,wEAAwE;IAClE,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;IAI3C,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,WAAW;YAYL,iBAAiB;CAoChC"}
package/dist/client.js ADDED
@@ -0,0 +1,167 @@
1
+ import { CustomSchemeTransport, BrowserFallbackTransport, NativeMessageTransport, hasNativeMessageChannel, } from "./transport.js";
2
+ let _idCounter = 0;
3
+ const nextId = () => {
4
+ return `req_${++_idCounter}_${Date.now()}`;
5
+ };
6
+ export class VidraClient {
7
+ constructor(options = {}) {
8
+ this.pending = new Map();
9
+ this.listeners = new Map();
10
+ this.handlers = new Map();
11
+ this.timeout = options.timeout ?? 30000;
12
+ this._explicitTransport = options.transport;
13
+ // The C# side calls window.__vidra_callback(response) to deliver results.
14
+ window.__vidra_callback = (response) => {
15
+ this.handleResponse(response);
16
+ };
17
+ // The C# side calls window.__vidra_onevent(event) to push events.
18
+ window.__vidra_onevent = (event) => {
19
+ this.handleEvent(event);
20
+ };
21
+ // The C# side calls window.__vidra_invoke(request) for reverse RPC.
22
+ window.__vidra_invoke = (request) => {
23
+ this.handleReverseCall(request);
24
+ };
25
+ }
26
+ /**
27
+ * Lazily resolve the transport on first use. Preference order:
28
+ * 1. an explicitly supplied transport
29
+ * 2. the native message channel (WKWebView / WebView2) when present
30
+ * 3. the custom-scheme transport when the host marker is set
31
+ * 4. the browser-only fallback
32
+ *
33
+ * The browser fallback is intentionally never cached: a native channel can
34
+ * become available shortly after load (e.g. the WKWebView script-message
35
+ * handler registers just after the page loads), so we keep re-detecting until
36
+ * a real native transport is found.
37
+ */
38
+ get transport() {
39
+ if (this._explicitTransport)
40
+ return this._explicitTransport;
41
+ if (this._transport)
42
+ return this._transport;
43
+ const detected = this.detectTransport();
44
+ if (!(detected instanceof BrowserFallbackTransport)) {
45
+ this._transport = detected;
46
+ }
47
+ return detected;
48
+ }
49
+ detectTransport() {
50
+ if (hasNativeMessageChannel())
51
+ return new NativeMessageTransport();
52
+ if (isNativeHost())
53
+ return new CustomSchemeTransport();
54
+ return new BrowserFallbackTransport();
55
+ }
56
+ /**
57
+ * Invoke a native module method and wait for the result.
58
+ *
59
+ * @example
60
+ * const { content } = await vidra.invoke<{ content: string }>('filesystem', 'readText', { path: '/tmp/f.txt' });
61
+ */
62
+ invoke(module, method, payload) {
63
+ return new Promise((resolve, reject) => {
64
+ const id = nextId();
65
+ const timer = setTimeout(() => {
66
+ this.pending.delete(id);
67
+ reject(new Error(`[vidra] Timeout after ${this.timeout}ms for ${module}.${method}`));
68
+ }, this.timeout);
69
+ this.pending.set(id, {
70
+ resolve: (data) => {
71
+ clearTimeout(timer);
72
+ resolve(data);
73
+ },
74
+ reject: (err) => {
75
+ clearTimeout(timer);
76
+ reject(err);
77
+ },
78
+ });
79
+ const request = { id, module, method, payload };
80
+ this.transport.send(request);
81
+ });
82
+ }
83
+ /** Register a handler that C# can invoke via reverse RPC. Returns an unsubscribe function. */
84
+ handle(name, handler) {
85
+ this.handlers.set(name, handler);
86
+ return () => this.handlers.delete(name);
87
+ }
88
+ /** Subscribe to events pushed from C# (e.g. `app.resume`, `app.themeChanged`). */
89
+ on(event, handler) {
90
+ if (!this.listeners.has(event)) {
91
+ this.listeners.set(event, new Set());
92
+ }
93
+ this.listeners.get(event).add(handler);
94
+ return () => this.listeners.get(event)?.delete(handler);
95
+ }
96
+ /** Query which modules and methods are available on the native side. */
97
+ async capabilities() {
98
+ return this.invoke("__bridge", "capabilities");
99
+ }
100
+ handleResponse(response) {
101
+ const entry = this.pending.get(response.id);
102
+ if (!entry)
103
+ return;
104
+ this.pending.delete(response.id);
105
+ if (response.success) {
106
+ entry.resolve(response.data);
107
+ }
108
+ else {
109
+ entry.reject(new Error(response.error
110
+ ? `[${response.error.code}] ${response.error.message}`
111
+ : "Unknown native error"));
112
+ }
113
+ }
114
+ handleEvent(event) {
115
+ const handlers = this.listeners.get(event.event);
116
+ if (!handlers)
117
+ return;
118
+ for (const handler of handlers) {
119
+ try {
120
+ handler(event.data);
121
+ }
122
+ catch (e) {
123
+ console.error(`[vidra] Error in event handler for '${event.event}':`, e);
124
+ }
125
+ }
126
+ }
127
+ async handleReverseCall(request) {
128
+ const handler = this.handlers.get(request.handler);
129
+ if (!handler) {
130
+ const response = {
131
+ id: request.id,
132
+ success: false,
133
+ error: {
134
+ code: "HANDLER_NOT_FOUND",
135
+ message: `No JS handler registered for '${request.handler}'.`,
136
+ },
137
+ };
138
+ this.transport.sendReverse(response);
139
+ return;
140
+ }
141
+ try {
142
+ const result = await handler(request.payload);
143
+ const response = {
144
+ id: request.id,
145
+ success: true,
146
+ data: result,
147
+ };
148
+ this.transport.sendReverse(response);
149
+ }
150
+ catch (e) {
151
+ const response = {
152
+ id: request.id,
153
+ success: false,
154
+ error: {
155
+ code: "HANDLER_ERROR",
156
+ message: e instanceof Error ? e.message : String(e),
157
+ },
158
+ };
159
+ this.transport.sendReverse(response);
160
+ }
161
+ }
162
+ }
163
+ const isNativeHost = () => {
164
+ // The native host injects this marker before the web content loads.
165
+ return typeof window.__vidra_native !== "undefined";
166
+ };
167
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { VidraClient } from "../singleton.js";
2
+ export interface AppInfoResult {
3
+ appName: string;
4
+ packageName: string;
5
+ version: string;
6
+ build: string;
7
+ platform: string;
8
+ idiom: string;
9
+ }
10
+ export interface ThemeResult {
11
+ theme: string;
12
+ }
13
+ export declare class AppProxy {
14
+ private client;
15
+ constructor(client: VidraClient);
16
+ getInfo(): Promise<AppInfoResult>;
17
+ getTheme(): Promise<ThemeResult>;
18
+ }
19
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/generated/app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,QAAQ;IACP,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAIjC,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;CAGjC"}
@@ -0,0 +1,12 @@
1
+ export class AppProxy {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ getInfo() {
6
+ return this.client.invoke("app", "getInfo");
7
+ }
8
+ getTheme() {
9
+ return this.client.invoke("app", "getTheme");
10
+ }
11
+ }
12
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/generated/app.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACnB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import type { VidraClient } from "../singleton.js";
2
+ export interface ConfigureWindowArgs {
3
+ title: string;
4
+ width?: number | null;
5
+ height?: number | null;
6
+ }
7
+ export interface SetFullscreenArgs {
8
+ enabled: boolean;
9
+ }
10
+ export interface SetSizeArgs {
11
+ width: number;
12
+ height: number;
13
+ }
14
+ export interface SetTitleArgs {
15
+ title: string;
16
+ }
17
+ export interface WindowInfo {
18
+ title: string;
19
+ width: number;
20
+ height: number;
21
+ state: "restored" | "maximized" | "minimized" | "fullscreen";
22
+ }
23
+ export interface WindowSupport {
24
+ platform: string;
25
+ getCurrent: boolean;
26
+ configure: boolean;
27
+ setTitle: boolean;
28
+ setSize: boolean;
29
+ center: boolean;
30
+ maximize: boolean;
31
+ minimize: boolean;
32
+ restore: boolean;
33
+ setFullscreen: boolean;
34
+ }
35
+ export declare class AppWindowProxy {
36
+ private client;
37
+ constructor(client: VidraClient);
38
+ getSupport(): Promise<WindowSupport>;
39
+ getCurrent(): Promise<WindowInfo>;
40
+ setTitle(args: SetTitleArgs): Promise<WindowInfo>;
41
+ setSize(args: SetSizeArgs): Promise<WindowInfo>;
42
+ center(): Promise<WindowInfo>;
43
+ maximize(): Promise<WindowInfo>;
44
+ minimize(): Promise<WindowInfo>;
45
+ restore(): Promise<WindowInfo>;
46
+ setFullscreen(args: SetFullscreenArgs): Promise<WindowInfo>;
47
+ }
48
+ //# sourceMappingURL=appWindow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appWindow.d.ts","sourceRoot":"","sources":["../../src/generated/appWindow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;CAC9D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAIpC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAQjC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAIjD,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAI/C,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAI7B,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAI/B,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAI/B,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAI9B,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;CAG5D"}
@@ -0,0 +1,36 @@
1
+ export class AppWindowProxy {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ getSupport() {
6
+ return this.client.invoke("appWindow", "getSupport");
7
+ }
8
+ getCurrent() {
9
+ return this.client.invoke("appWindow", "getCurrent");
10
+ }
11
+ configure(args) {
12
+ return this.client.invoke("appWindow", "configure", args);
13
+ }
14
+ setTitle(args) {
15
+ return this.client.invoke("appWindow", "setTitle", args);
16
+ }
17
+ setSize(args) {
18
+ return this.client.invoke("appWindow", "setSize", args);
19
+ }
20
+ center() {
21
+ return this.client.invoke("appWindow", "center");
22
+ }
23
+ maximize() {
24
+ return this.client.invoke("appWindow", "maximize");
25
+ }
26
+ minimize() {
27
+ return this.client.invoke("appWindow", "minimize");
28
+ }
29
+ restore() {
30
+ return this.client.invoke("appWindow", "restore");
31
+ }
32
+ setFullscreen(args) {
33
+ return this.client.invoke("appWindow", "setFullscreen", args);
34
+ }
35
+ }
36
+ //# sourceMappingURL=appWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appWindow.js","sourceRoot":"","sources":["../../src/generated/appWindow.ts"],"names":[],"mappings":"AA0CA,MAAM,OAAO,cAAc;IACzB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,CAAC,IAAyB;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,QAAQ,CAAC,IAAkB;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,IAAiB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,aAAa,CAAC,IAAuB;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { VidraClient } from "../singleton.js";
2
+ export interface GetTextResult {
3
+ text: string;
4
+ }
5
+ export interface HasTextResult {
6
+ hasText: boolean;
7
+ }
8
+ export interface SetTextArgs {
9
+ text: string;
10
+ }
11
+ export interface SetTextResult {
12
+ success: boolean;
13
+ }
14
+ export declare class ClipboardProxy {
15
+ private client;
16
+ constructor(client: VidraClient);
17
+ getText(): Promise<GetTextResult>;
18
+ setText(args: SetTextArgs): Promise<SetTextResult>;
19
+ hasText(): Promise<HasTextResult>;
20
+ }
21
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/generated/clipboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAIjC,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlD,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;CAGlC"}
@@ -0,0 +1,15 @@
1
+ export class ClipboardProxy {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ getText() {
6
+ return this.client.invoke("clipboard", "getText");
7
+ }
8
+ setText(args) {
9
+ return this.client.invoke("clipboard", "setText", args);
10
+ }
11
+ hasText() {
12
+ return this.client.invoke("clipboard", "hasText");
13
+ }
14
+ }
15
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/generated/clipboard.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,cAAc;IACzB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,IAAiB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { VidraClient } from "../singleton.js";
2
+ export interface AlertArgs {
3
+ title: string;
4
+ message: string;
5
+ ok: string;
6
+ }
7
+ export interface AlertResult {
8
+ dismissed: boolean;
9
+ }
10
+ export interface ConfirmArgs {
11
+ title: string;
12
+ message: string;
13
+ accept: string;
14
+ cancel: string;
15
+ }
16
+ export interface ConfirmResult {
17
+ confirmed: boolean;
18
+ }
19
+ export interface PromptArgs {
20
+ title: string;
21
+ message: string;
22
+ accept: string;
23
+ cancel: string;
24
+ }
25
+ export interface PromptResult {
26
+ value: string;
27
+ }
28
+ export declare class DialogsProxy {
29
+ private client;
30
+ constructor(client: VidraClient);
31
+ alert(args: AlertArgs): Promise<AlertResult>;
32
+ confirm(args: ConfirmArgs): Promise<ConfirmResult>;
33
+ prompt(args: PromptArgs): Promise<PromptResult>;
34
+ }
35
+ //# sourceMappingURL=dialogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogs.d.ts","sourceRoot":"","sources":["../../src/generated/dialogs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAI5C,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlD,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CAGhD"}
@@ -0,0 +1,15 @@
1
+ export class DialogsProxy {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ alert(args) {
6
+ return this.client.invoke("dialogs", "alert", args);
7
+ }
8
+ confirm(args) {
9
+ return this.client.invoke("dialogs", "confirm", args);
10
+ }
11
+ prompt(args) {
12
+ return this.client.invoke("dialogs", "prompt", args);
13
+ }
14
+ }
15
+ //# sourceMappingURL=dialogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../src/generated/dialogs.ts"],"names":[],"mappings":"AAmCA,MAAM,OAAO,YAAY;IACvB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,KAAK,CAAC,IAAe;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,IAAiB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,IAAgB;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ import type { VidraClient } from "../singleton.js";
2
+ export interface DeleteArgs {
3
+ path: string;
4
+ }
5
+ export interface DeleteResult {
6
+ success: boolean;
7
+ }
8
+ export interface DirectoryEntry {
9
+ name: string;
10
+ isDirectory: boolean;
11
+ }
12
+ export interface ExistsArgs {
13
+ path: string;
14
+ }
15
+ export interface ExistsResult {
16
+ exists: boolean;
17
+ }
18
+ export interface ListDirectoryArgs {
19
+ path: string;
20
+ }
21
+ export interface ListDirectoryResult {
22
+ entries: DirectoryEntry[];
23
+ }
24
+ export interface ReadTextArgs {
25
+ path: string;
26
+ }
27
+ export interface ReadTextResult {
28
+ content: string;
29
+ }
30
+ export interface WriteTextArgs {
31
+ path: string;
32
+ content: string;
33
+ }
34
+ export interface WriteTextResult {
35
+ success: boolean;
36
+ }
37
+ export declare class FilesystemProxy {
38
+ private client;
39
+ constructor(client: VidraClient);
40
+ readText(args: ReadTextArgs): Promise<ReadTextResult>;
41
+ writeText(args: WriteTextArgs): Promise<WriteTextResult>;
42
+ exists(args: ExistsArgs): Promise<ExistsResult>;
43
+ delete(args: DeleteArgs): Promise<DeleteResult>;
44
+ listDirectory(args: ListDirectoryArgs): Promise<ListDirectoryResult>;
45
+ }
46
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/generated/filesystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAIrD,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAIxD,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAI/C,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAI/C,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAGrE"}
@@ -0,0 +1,21 @@
1
+ export class FilesystemProxy {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ readText(args) {
6
+ return this.client.invoke("filesystem", "readText", args);
7
+ }
8
+ writeText(args) {
9
+ return this.client.invoke("filesystem", "writeText", args);
10
+ }
11
+ exists(args) {
12
+ return this.client.invoke("filesystem", "exists", args);
13
+ }
14
+ delete(args) {
15
+ return this.client.invoke("filesystem", "delete", args);
16
+ }
17
+ listDirectory(args) {
18
+ return this.client.invoke("filesystem", "listDirectory", args);
19
+ }
20
+ }
21
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/generated/filesystem.ts"],"names":[],"mappings":"AAiDA,MAAM,OAAO,eAAe;IAC1B,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,QAAQ,CAAC,IAAkB;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS,CAAC,IAAmB;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,IAAgB;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,IAAgB;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,aAAa,CAAC,IAAuB;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { AppProxy } from "./app.js";
2
+ import { AppWindowProxy } from "./appWindow.js";
3
+ import { ClipboardProxy } from "./clipboard.js";
4
+ import { DialogsProxy } from "./dialogs.js";
5
+ import { FilesystemProxy } from "./filesystem.js";
6
+ import { NotificationsProxy } from "./notifications.js";
7
+ export declare const app: AppProxy;
8
+ export declare const appWindow: AppWindowProxy;
9
+ export declare const clipboard: ClipboardProxy;
10
+ export declare const dialogs: DialogsProxy;
11
+ export declare const filesystem: FilesystemProxy;
12
+ export declare const notifications: NotificationsProxy;
13
+ export * from "./app.js";
14
+ export * from "./appWindow.js";
15
+ export * from "./clipboard.js";
16
+ export * from "./dialogs.js";
17
+ export * from "./filesystem.js";
18
+ export * from "./notifications.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generated/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,GAAG,UAAsB,CAAC;AACvC,eAAO,MAAM,SAAS,gBAA4B,CAAC;AACnD,eAAO,MAAM,SAAS,gBAA4B,CAAC;AACnD,eAAO,MAAM,OAAO,cAA0B,CAAC;AAC/C,eAAO,MAAM,UAAU,iBAA6B,CAAC;AACrD,eAAO,MAAM,aAAa,oBAAgC,CAAC;AAE3D,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,21 @@
1
+ // Auto-generated by vidra-codegen. Do not edit.
2
+ import { vidra } from "../singleton.js";
3
+ import { AppProxy } from "./app.js";
4
+ import { AppWindowProxy } from "./appWindow.js";
5
+ import { ClipboardProxy } from "./clipboard.js";
6
+ import { DialogsProxy } from "./dialogs.js";
7
+ import { FilesystemProxy } from "./filesystem.js";
8
+ import { NotificationsProxy } from "./notifications.js";
9
+ export const app = new AppProxy(vidra);
10
+ export const appWindow = new AppWindowProxy(vidra);
11
+ export const clipboard = new ClipboardProxy(vidra);
12
+ export const dialogs = new DialogsProxy(vidra);
13
+ export const filesystem = new FilesystemProxy(vidra);
14
+ export const notifications = new NotificationsProxy(vidra);
15
+ export * from "./app.js";
16
+ export * from "./appWindow.js";
17
+ export * from "./clipboard.js";
18
+ export * from "./dialogs.js";
19
+ export * from "./filesystem.js";
20
+ export * from "./notifications.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generated/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAE3D,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { VidraClient } from "../singleton.js";
2
+ export interface RequestPermissionResult {
3
+ granted: boolean;
4
+ }
5
+ export interface ShowArgs {
6
+ title: string;
7
+ body: string;
8
+ }
9
+ export interface ShowResult {
10
+ scheduled: boolean;
11
+ }
12
+ export declare class NotificationsProxy {
13
+ private client;
14
+ constructor(client: VidraClient);
15
+ show(args: ShowArgs): Promise<ShowResult>;
16
+ requestPermission(): Promise<RequestPermissionResult>;
17
+ }
18
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/generated/notifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,kBAAkB;IACjB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAIzC,iBAAiB,IAAI,OAAO,CAAC,uBAAuB,CAAC;CAGtD"}
@@ -0,0 +1,12 @@
1
+ export class NotificationsProxy {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ show(args) {
6
+ return this.client.invoke("notifications", "show", args);
7
+ }
8
+ requestPermission() {
9
+ return this.client.invoke("notifications", "requestPermission");
10
+ }
11
+ }
12
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/generated/notifications.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,kBAAkB;IAC7B,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,IAAI,CAAC,IAAc;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export { VidraClient } from "./client.js";
2
+ export type { VidraClientOptions } from "./client.js";
3
+ export type { BridgeRequest, BridgeResponse, BridgeError, BridgeEvent, EventHandler, Capabilities, ReverseRequest, ReverseResponse, JsHandler, } from "./types.js";
4
+ export { CustomSchemeTransport, BrowserFallbackTransport, NativeMessageTransport, hasNativeMessageChannel, NATIVE_CHANNEL, } from "./transport.js";
5
+ export type { Transport } from "./transport.js";
6
+ export type { AppWindowChangedHandler, ConfigureAppWindowOptions, } from "./appWindow.js";
7
+ import "./appWindow.js";
8
+ export { vidra } from "./singleton.js";
9
+ export * from "./generated/index.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EACV,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,gBAAgB,CAAC;AAIxB,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { VidraClient } from "./client.js";
2
+ export { CustomSchemeTransport, BrowserFallbackTransport, NativeMessageTransport, hasNativeMessageChannel, NATIVE_CHANNEL, } from "./transport.js";
3
+ // Extend the generated appWindow proxy with ergonomic event helpers.
4
+ import "./appWindow.js";
5
+ // Re-export the default singleton (lives in its own module to avoid
6
+ // circular dependencies with the generated proxy barrel).
7
+ export { vidra } from "./singleton.js";
8
+ // Re-export generated typed proxies for built-in modules.
9
+ export * from "./generated/index.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa1C,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAOxB,qEAAqE;AACrE,OAAO,gBAAgB,CAAC;AAExB,oEAAoE;AACpE,0DAA0D;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,0DAA0D;AAC1D,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { VidraClient } from "./client.js";
2
+ export type { VidraClient };
3
+ /**
4
+ * Default singleton instance for convenience.
5
+ * Lives in its own module to avoid circular dependencies
6
+ * with the generated proxy barrel (generated/index.ts).
7
+ */
8
+ export declare const vidra: VidraClient;
9
+ //# sourceMappingURL=singleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../src/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;GAIG;AACH,eAAO,MAAM,KAAK,aAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { VidraClient } from "./client.js";
2
+ /**
3
+ * Default singleton instance for convenience.
4
+ * Lives in its own module to avoid circular dependencies
5
+ * with the generated proxy barrel (generated/index.ts).
6
+ */
7
+ export const vidra = new VidraClient();
8
+ //# sourceMappingURL=singleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleton.js","sourceRoot":"","sources":["../src/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { BridgeRequest, ReverseResponse } from "./types.js";
2
+ /**
3
+ * Abstraction over the JS→C# transport mechanism.
4
+ * The default implementation uses the custom-scheme navigation approach
5
+ * (`vidra://bridge?payload=...`) which the MAUI WebViewBridge intercepts.
6
+ */
7
+ export interface Transport {
8
+ send(request: BridgeRequest): void;
9
+ sendReverse(response: ReverseResponse): void;
10
+ }
11
+ /**
12
+ * The script-message handler name registered by the native host. JS posts to
13
+ * `window.webkit.messageHandlers[NATIVE_CHANNEL]` (WKWebView) or, on Windows,
14
+ * to `window.chrome.webview` (WebView2).
15
+ */
16
+ export declare const NATIVE_CHANNEL = "vidra";
17
+ interface NativePoster {
18
+ postMessage(message: string): void;
19
+ }
20
+ /** True when a first-class native message channel (WKWebView or WebView2) is
21
+ * available. Preferred over the custom-scheme transport because it has no URL
22
+ * length limit, no per-message iframe, and is binary-safe. */
23
+ export declare const hasNativeMessageChannel: () => boolean;
24
+ /**
25
+ * Transport that uses the platform's native message channel:
26
+ * - Apple (WKWebView): `window.webkit.messageHandlers.vidra.postMessage(...)`
27
+ * handled by a `WKScriptMessageHandler` on the C# side.
28
+ * - Windows (WebView2): `window.chrome.webview.postMessage(...)` handled by
29
+ * `CoreWebView2.WebMessageReceived` on the C# side.
30
+ *
31
+ * Unlike {@link CustomSchemeTransport}, payloads are not URL-encoded into a
32
+ * navigation, so large messages (e.g. file contents) are not truncated.
33
+ */
34
+ export declare class NativeMessageTransport implements Transport {
35
+ private readonly channel;
36
+ constructor(channel?: NativePoster | undefined);
37
+ send(request: BridgeRequest): void;
38
+ sendReverse(response: ReverseResponse): void;
39
+ private post;
40
+ }
41
+ export declare class CustomSchemeTransport implements Transport {
42
+ send(request: BridgeRequest): void;
43
+ sendReverse(response: ReverseResponse): void;
44
+ }
45
+ /**
46
+ * Browser-only stub that immediately resolves with a synthetic response.
47
+ * Enables UI development in a regular browser without the MAUI shell.
48
+ */
49
+ export declare class BrowserFallbackTransport implements Transport {
50
+ send(request: BridgeRequest): void;
51
+ sendReverse(_response: ReverseResponse): void;
52
+ }
53
+ export {};
54
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAkB,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjF;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAQtC,UAAU,YAAY;IACpB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAYD;;8DAE8D;AAC9D,eAAO,MAAM,uBAAuB,QAAO,OACqB,CAAC;AAEjE;;;;;;;;;GASG;AACH,qBAAa,sBAAuB,YAAW,SAAS;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,OAAO,GAAE,YAAY,GAAG,SAA8C;IASlF,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIlC,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI5C,OAAO,CAAC,IAAI;CAGb;AAED,qBAAa,qBAAsB,YAAW,SAAS;IACrD,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAUlC,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;CAS7C;AAED;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,SAAS;IACxD,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAsBlC,WAAW,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;CAG9C"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The script-message handler name registered by the native host. JS posts to
3
+ * `window.webkit.messageHandlers[NATIVE_CHANNEL]` (WKWebView) or, on Windows,
4
+ * to `window.chrome.webview` (WebView2).
5
+ */
6
+ export const NATIVE_CHANNEL = "vidra";
7
+ const appleChannel = () => {
8
+ const handler = globalThis?.webkit?.messageHandlers?.[NATIVE_CHANNEL];
9
+ return handler && typeof handler.postMessage === "function" ? handler : undefined;
10
+ };
11
+ const windowsChannel = () => {
12
+ const webview = globalThis?.chrome?.webview;
13
+ return webview && typeof webview.postMessage === "function" ? webview : undefined;
14
+ };
15
+ /** True when a first-class native message channel (WKWebView or WebView2) is
16
+ * available. Preferred over the custom-scheme transport because it has no URL
17
+ * length limit, no per-message iframe, and is binary-safe. */
18
+ export const hasNativeMessageChannel = () => appleChannel() !== undefined || windowsChannel() !== undefined;
19
+ /**
20
+ * Transport that uses the platform's native message channel:
21
+ * - Apple (WKWebView): `window.webkit.messageHandlers.vidra.postMessage(...)`
22
+ * handled by a `WKScriptMessageHandler` on the C# side.
23
+ * - Windows (WebView2): `window.chrome.webview.postMessage(...)` handled by
24
+ * `CoreWebView2.WebMessageReceived` on the C# side.
25
+ *
26
+ * Unlike {@link CustomSchemeTransport}, payloads are not URL-encoded into a
27
+ * navigation, so large messages (e.g. file contents) are not truncated.
28
+ */
29
+ export class NativeMessageTransport {
30
+ constructor(channel = appleChannel() ?? windowsChannel()) {
31
+ if (!channel) {
32
+ throw new Error("[vidra] No native message channel is available (expected WKWebView or WebView2).");
33
+ }
34
+ this.channel = channel;
35
+ }
36
+ send(request) {
37
+ this.post({ kind: "request", data: request });
38
+ }
39
+ sendReverse(response) {
40
+ this.post({ kind: "reverse", data: response });
41
+ }
42
+ post(frame) {
43
+ this.channel.postMessage(JSON.stringify(frame));
44
+ }
45
+ }
46
+ export class CustomSchemeTransport {
47
+ send(request) {
48
+ const json = JSON.stringify(request);
49
+ const encoded = encodeURIComponent(json);
50
+ const iframe = document.createElement("iframe");
51
+ iframe.style.display = "none";
52
+ iframe.src = `vidra://bridge?payload=${encoded}`;
53
+ document.body.appendChild(iframe);
54
+ setTimeout(() => iframe.remove(), 100);
55
+ }
56
+ sendReverse(response) {
57
+ const json = JSON.stringify(response);
58
+ const encoded = encodeURIComponent(json);
59
+ const iframe = document.createElement("iframe");
60
+ iframe.style.display = "none";
61
+ iframe.src = `vidra://reverse?payload=${encoded}`;
62
+ document.body.appendChild(iframe);
63
+ setTimeout(() => iframe.remove(), 100);
64
+ }
65
+ }
66
+ /**
67
+ * Browser-only stub that immediately resolves with a synthetic response.
68
+ * Enables UI development in a regular browser without the MAUI shell.
69
+ */
70
+ export class BrowserFallbackTransport {
71
+ send(request) {
72
+ console.warn(`[vidra] No native host detected. Browser stub for: ${request.module}.${request.method}`, request);
73
+ queueMicrotask(() => {
74
+ const callback = window.__vidra_callback;
75
+ if (typeof callback === "function") {
76
+ const response = {
77
+ id: request.id,
78
+ success: false,
79
+ error: {
80
+ code: "BROWSER_ONLY",
81
+ message: `Native host not available. '${request.module}.${request.method}' requires the MAUI shell.`,
82
+ },
83
+ };
84
+ callback(response);
85
+ }
86
+ });
87
+ }
88
+ sendReverse(_response) {
89
+ console.warn("[vidra] Reverse RPC is not available in browser-only mode.");
90
+ }
91
+ }
92
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface BridgeRequest {
2
+ id: string;
3
+ module: string;
4
+ method: string;
5
+ payload?: unknown;
6
+ }
7
+ export interface BridgeResponse<T = unknown> {
8
+ id: string;
9
+ success: boolean;
10
+ data?: T;
11
+ error?: BridgeError;
12
+ }
13
+ export interface BridgeError {
14
+ code: string;
15
+ message: string;
16
+ }
17
+ export interface BridgeEvent<T = unknown> {
18
+ event: string;
19
+ data?: T;
20
+ }
21
+ export type EventHandler<T = unknown> = (data: T) => void;
22
+ export type Capabilities = Record<string, string[]>;
23
+ /** Sent from C# to JS when calling a registered handler via reverse RPC. */
24
+ export interface ReverseRequest {
25
+ id: string;
26
+ handler: string;
27
+ payload?: unknown;
28
+ }
29
+ /** Sent from JS back to C# with the handler result. */
30
+ export interface ReverseResponse {
31
+ id: string;
32
+ success: boolean;
33
+ data?: unknown;
34
+ error?: BridgeError;
35
+ }
36
+ export type JsHandler<TPayload = unknown, TResult = unknown> = (payload: TPayload) => TResult | Promise<TResult>;
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,CAAC,CAAC;CACV;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAEpD,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,SAAS,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,CAC7D,OAAO,EAAE,QAAQ,KACd,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@vidra-dev/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Framework-agnostic TypeScript SDK for Vidra bridge (JS ↔ .NET MAUI)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": ["dist"],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "test": "vitest run",
14
+ "test:watch": "vitest",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "vidra",
19
+ "maui",
20
+ "webview",
21
+ "bridge",
22
+ "dotnet",
23
+ "desktop",
24
+ "react"
25
+ ],
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/rzamfiriu/vidra.git",
29
+ "directory": "src/sdk/vidra-js"
30
+ },
31
+ "homepage": "https://github.com/rzamfiriu/vidra#readme",
32
+ "bugs": {
33
+ "url": "https://github.com/rzamfiriu/vidra/issues"
34
+ },
35
+ "license": "MIT",
36
+ "engines": {
37
+ "node": ">=18"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "devDependencies": {
43
+ "jsdom": "^25.0.1",
44
+ "typescript": "^5.7.0",
45
+ "vitest": "^2.1.4"
46
+ }
47
+ }