murasaki 0.2.1 → 0.4.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.
- package/dist/jsx/dom/index.d.ts +4 -0
- package/dist/jsx/dom/index.d.ts.map +1 -0
- package/dist/jsx/dom/index.js +4 -0
- package/dist/jsx/dom/index.js.map +1 -0
- package/dist/jsx/dom/native.d.ts +45 -0
- package/dist/jsx/dom/native.d.ts.map +1 -0
- package/dist/jsx/dom/native.js +88 -0
- package/dist/jsx/dom/native.js.map +1 -0
- package/dist/jsx/dom/runtime.d.ts +34 -0
- package/dist/jsx/dom/runtime.d.ts.map +1 -0
- package/dist/jsx/dom/runtime.js +303 -0
- package/dist/jsx/dom/runtime.js.map +1 -0
- package/dist/runtime/bundle.d.ts +8 -0
- package/dist/runtime/bundle.d.ts.map +1 -0
- package/dist/runtime/bundle.js +98 -0
- package/dist/runtime/bundle.js.map +1 -0
- package/dist/runtime/native.d.ts +19 -0
- package/dist/runtime/native.d.ts.map +1 -0
- package/dist/runtime/native.js +111 -0
- package/dist/runtime/native.js.map +1 -0
- package/dist/runtime/render.d.ts.map +1 -1
- package/dist/runtime/render.js +23 -5
- package/dist/runtime/render.js.map +1 -1
- package/dist/runtime/window.d.ts.map +1 -1
- package/dist/runtime/window.js +8 -0
- package/dist/runtime/window.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createElement, createRoot, Fragment, jsx, jsxDEV, jsxs, useEffect, useRef, useState, } from './runtime.ts';
|
|
2
|
+
export { useNotification, useClipboard, useShell } from './native.ts';
|
|
3
|
+
export type { NotifyOptions } from './native.ts';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jsx/dom/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,GAAG,EACH,MAAM,EACN,IAAI,EACJ,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Public surface for `import { ... } from 'murasaki/jsx/dom'`.
|
|
2
|
+
export { createElement, createRoot, Fragment, jsx, jsxDEV, jsxs, useEffect, useRef, useState, } from "./runtime.js";
|
|
3
|
+
export { useNotification, useClipboard, useShell } from "./native.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jsx/dom/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,GAAG,EACH,MAAM,EACN,IAAI,EACJ,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type NotifyOptions = {
|
|
2
|
+
title: string;
|
|
3
|
+
body?: string;
|
|
4
|
+
sound?: boolean;
|
|
5
|
+
};
|
|
6
|
+
type Bridge = {
|
|
7
|
+
notify(opts: NotifyOptions): Promise<void>;
|
|
8
|
+
clipboardWrite(text: string): Promise<void>;
|
|
9
|
+
clipboardRead(): Promise<string>;
|
|
10
|
+
openExternal(target: string): Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
declare global {
|
|
13
|
+
interface Window {
|
|
14
|
+
murasaki?: Bridge;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns a function that shows an OS notification.
|
|
19
|
+
*
|
|
20
|
+
* const notify = useNotification()
|
|
21
|
+
* notify({ title: 'Hello', body: 'from murasaki' })
|
|
22
|
+
*/
|
|
23
|
+
export declare function useNotification(): (opts: NotifyOptions) => Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Returns { read, write } for the system clipboard.
|
|
26
|
+
*
|
|
27
|
+
* const clipboard = useClipboard()
|
|
28
|
+
* clipboard.write('hello')
|
|
29
|
+
* const text = await clipboard.read()
|
|
30
|
+
*/
|
|
31
|
+
export declare function useClipboard(): {
|
|
32
|
+
read(): Promise<string>;
|
|
33
|
+
write(text: string): Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Returns { openExternal } — opens URLs / files in the system default app.
|
|
37
|
+
*
|
|
38
|
+
* const shell = useShell()
|
|
39
|
+
* shell.openExternal('https://murasaki.dev')
|
|
40
|
+
*/
|
|
41
|
+
export declare function useShell(): {
|
|
42
|
+
openExternal(target: string): Promise<void>;
|
|
43
|
+
};
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/jsx/dom/native.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C,CAAA;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB;CACF;AAOD;;;;;GAKG;AACH,wBAAgB,eAAe,KACf,MAAM,aAAa,KAAG,OAAO,CAAC,IAAI,CAAC,CASlD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY;YAEV,OAAO,CAAC,MAAM,CAAC;gBAUX,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAU3C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ;yBAEO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAUpD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Client-side React-style hooks for native APIs.
|
|
2
|
+
//
|
|
3
|
+
// All of these proxy to the Node side via window.murasaki.*, which the
|
|
4
|
+
// dev runner exposes through @webviewjs/webview's webview.expose().
|
|
5
|
+
//
|
|
6
|
+
// Safe to import server-side — every hook detects the missing bridge
|
|
7
|
+
// and degrades to no-op (notify/openExternal/clipboardWrite) or empty
|
|
8
|
+
// value (clipboardRead → '').
|
|
9
|
+
function bridge() {
|
|
10
|
+
if (typeof window === 'undefined')
|
|
11
|
+
return null;
|
|
12
|
+
return window.murasaki ?? null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Returns a function that shows an OS notification.
|
|
16
|
+
*
|
|
17
|
+
* const notify = useNotification()
|
|
18
|
+
* notify({ title: 'Hello', body: 'from murasaki' })
|
|
19
|
+
*/
|
|
20
|
+
export function useNotification() {
|
|
21
|
+
return async (opts) => {
|
|
22
|
+
const b = bridge();
|
|
23
|
+
if (!b)
|
|
24
|
+
return;
|
|
25
|
+
try {
|
|
26
|
+
await b.notify(opts);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
console.warn('[murasaki] notify failed:', e);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns { read, write } for the system clipboard.
|
|
35
|
+
*
|
|
36
|
+
* const clipboard = useClipboard()
|
|
37
|
+
* clipboard.write('hello')
|
|
38
|
+
* const text = await clipboard.read()
|
|
39
|
+
*/
|
|
40
|
+
export function useClipboard() {
|
|
41
|
+
return {
|
|
42
|
+
async read() {
|
|
43
|
+
const b = bridge();
|
|
44
|
+
if (!b)
|
|
45
|
+
return '';
|
|
46
|
+
try {
|
|
47
|
+
return await b.clipboardRead();
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
console.warn('[murasaki] clipboard.read failed:', e);
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
async write(text) {
|
|
55
|
+
const b = bridge();
|
|
56
|
+
if (!b)
|
|
57
|
+
return;
|
|
58
|
+
try {
|
|
59
|
+
await b.clipboardWrite(text);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
console.warn('[murasaki] clipboard.write failed:', e);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns { openExternal } — opens URLs / files in the system default app.
|
|
69
|
+
*
|
|
70
|
+
* const shell = useShell()
|
|
71
|
+
* shell.openExternal('https://murasaki.dev')
|
|
72
|
+
*/
|
|
73
|
+
export function useShell() {
|
|
74
|
+
return {
|
|
75
|
+
async openExternal(target) {
|
|
76
|
+
const b = bridge();
|
|
77
|
+
if (!b)
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
await b.openExternal(target);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
console.warn('[murasaki] openExternal failed:', e);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/jsx/dom/native.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,EAAE;AACF,qEAAqE;AACrE,sEAAsE;AACtE,8BAA8B;AAqB9B,SAAS,MAAM;IACb,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IAC9C,OAAO,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAA;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,EAAE,IAAmB,EAAiB,EAAE;QAClD,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;QAClB,IAAI,CAAC,CAAC;YAAE,OAAM;QACd,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAA;YACjB,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,CAAC,aAAa,EAAE,CAAA;YAChC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAA;gBACpD,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAY;YACtB,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAM;YACd,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,CAAC,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO;QACL,KAAK,CAAC,YAAY,CAAC,MAAc;YAC/B,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAM;YACd,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
type Props = Record<string, unknown>;
|
|
2
|
+
type Component = (props: Props) => Child;
|
|
3
|
+
type Child = string | number | bigint | boolean | null | undefined | JSXNodeLike | Child[];
|
|
4
|
+
interface JSXNodeLike {
|
|
5
|
+
readonly __isJSXNode: true;
|
|
6
|
+
tag: string | Component;
|
|
7
|
+
props: Props;
|
|
8
|
+
children: Child[];
|
|
9
|
+
toString?: () => string;
|
|
10
|
+
}
|
|
11
|
+
declare class JSXNode implements JSXNodeLike {
|
|
12
|
+
tag: string | Component;
|
|
13
|
+
props: Props;
|
|
14
|
+
children: Child[];
|
|
15
|
+
readonly __isJSXNode: true;
|
|
16
|
+
constructor(tag: string | Component, props: Props, children: Child[]);
|
|
17
|
+
}
|
|
18
|
+
export declare function jsx(tag: string | Component, props: Props | null): JSXNode;
|
|
19
|
+
export declare const jsxs: typeof jsx;
|
|
20
|
+
export declare const jsxDEV: typeof jsx;
|
|
21
|
+
export declare const createElement: typeof jsx;
|
|
22
|
+
export declare function Fragment(props: {
|
|
23
|
+
children?: Child;
|
|
24
|
+
}): Child;
|
|
25
|
+
export declare function useState<T>(initial: T | (() => T)): [T, (next: T | ((prev: T) => T)) => void];
|
|
26
|
+
export declare function useEffect(fn: () => void | (() => void), deps?: unknown[]): void;
|
|
27
|
+
export declare function useRef<T>(initial: T): {
|
|
28
|
+
current: T;
|
|
29
|
+
};
|
|
30
|
+
export declare function createRoot(container: HTMLElement): {
|
|
31
|
+
render(tree: Child): void;
|
|
32
|
+
};
|
|
33
|
+
export { JSXNode };
|
|
34
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/jsx/dom/runtime.ts"],"names":[],"mappings":"AAkBA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACpC,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAA;AACxC,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,EAAE,CAAA;AAE1F,UAAU,WAAW;IACnB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,KAAK,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAA;CACxB;AAED,cAAM,OAAQ,YAAW,WAAW;IAGzB,GAAG,EAAE,MAAM,GAAG,SAAS;IACvB,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK,EAAE;IAJ1B,QAAQ,CAAC,WAAW,EAAG,IAAI,CAAS;gBAE3B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,KAAK,EAAE;CAE3B;AAOD,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAUzE;AACD,eAAO,MAAM,IAAI,YAAM,CAAA;AACvB,eAAO,MAAM,MAAM,YAAM,CAAA;AACzB,eAAO,MAAM,aAAa,YAAM,CAAA;AAEhC,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,KAAK,CAE3D;AAqCD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAmB7F;AAGD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CA2B/E;AAGD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CASpD;AA0KD,wBAAgB,UAAU,CAAC,SAAS,EAAE,WAAW;iBAEhC,KAAK;EAgBrB;AAKD,OAAO,EAAE,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
// murasaki/jsx/dom — client-side runtime.
|
|
2
|
+
//
|
|
3
|
+
// Design notes (MVP):
|
|
4
|
+
// - Naive: every state change triggers a full re-render of the root.
|
|
5
|
+
// No virtual-DOM diff, no fiber. Good enough for desktop apps where
|
|
6
|
+
// trees are tiny and re-render is sub-millisecond.
|
|
7
|
+
// - Hooks: useState / useEffect / useRef. Indexed by "component slot"
|
|
8
|
+
// in render order — same as React's call-order rule, so the usual
|
|
9
|
+
// "no hooks in conditionals" applies.
|
|
10
|
+
// - Events: any prop starting with "on" + a function becomes a DOM
|
|
11
|
+
// event listener. Names normalize: onClick → "click", onChange → "change".
|
|
12
|
+
// - HMR friendly: createRoot re-uses the same container, just clears + remounts.
|
|
13
|
+
//
|
|
14
|
+
// This file is browser-only. It uses `document`, `window`, etc., so it must
|
|
15
|
+
// only be loaded via the client bundle — never imported on the Node side.
|
|
16
|
+
class JSXNode {
|
|
17
|
+
tag;
|
|
18
|
+
props;
|
|
19
|
+
children;
|
|
20
|
+
__isJSXNode = true;
|
|
21
|
+
constructor(tag, props, children) {
|
|
22
|
+
this.tag = tag;
|
|
23
|
+
this.props = props;
|
|
24
|
+
this.children = children;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function isJSXNode(v) {
|
|
28
|
+
return typeof v === 'object' && v !== null && v.__isJSXNode === true;
|
|
29
|
+
}
|
|
30
|
+
// ── jsx() factory ────────────────────────────────────────────────────
|
|
31
|
+
export function jsx(tag, props) {
|
|
32
|
+
const p = (props ?? {});
|
|
33
|
+
const rawChildren = p.children;
|
|
34
|
+
const children = Array.isArray(rawChildren)
|
|
35
|
+
? rawChildren
|
|
36
|
+
: rawChildren != null
|
|
37
|
+
? [rawChildren]
|
|
38
|
+
: [];
|
|
39
|
+
const { children: _drop, ...rest } = p;
|
|
40
|
+
return new JSXNode(tag, rest, children);
|
|
41
|
+
}
|
|
42
|
+
export const jsxs = jsx;
|
|
43
|
+
export const jsxDEV = jsx;
|
|
44
|
+
export const createElement = jsx;
|
|
45
|
+
export function Fragment(props) {
|
|
46
|
+
return props.children ?? null;
|
|
47
|
+
}
|
|
48
|
+
let currentRoot = null;
|
|
49
|
+
function getOrInitSlot(key) {
|
|
50
|
+
const slots = currentRoot.slots;
|
|
51
|
+
let slot = slots.get(key);
|
|
52
|
+
if (!slot) {
|
|
53
|
+
slot = { states: [], effects: [], refs: [] };
|
|
54
|
+
slots.set(key, slot);
|
|
55
|
+
}
|
|
56
|
+
return slot;
|
|
57
|
+
}
|
|
58
|
+
// ── useState ─────────────────────────────────────────────────────────
|
|
59
|
+
// Behavior on the server (no active root): returns the initial value with
|
|
60
|
+
// a no-op setter, so user code can be imported and SSR-rendered safely.
|
|
61
|
+
export function useState(initial) {
|
|
62
|
+
const root = currentRoot;
|
|
63
|
+
if (!root || !root.currentSlot) {
|
|
64
|
+
const v = typeof initial === 'function' ? initial() : initial;
|
|
65
|
+
return [v, () => { }];
|
|
66
|
+
}
|
|
67
|
+
const slot = root.currentSlot;
|
|
68
|
+
const idx = root.stateIdx++;
|
|
69
|
+
if (idx >= slot.states.length) {
|
|
70
|
+
slot.states[idx] = typeof initial === 'function' ? initial() : initial;
|
|
71
|
+
}
|
|
72
|
+
const set = (next) => {
|
|
73
|
+
const prev = slot.states[idx];
|
|
74
|
+
const value = typeof next === 'function' ? next(prev) : next;
|
|
75
|
+
if (Object.is(prev, value))
|
|
76
|
+
return;
|
|
77
|
+
slot.states[idx] = value;
|
|
78
|
+
scheduleRender(root);
|
|
79
|
+
};
|
|
80
|
+
return [slot.states[idx], set];
|
|
81
|
+
}
|
|
82
|
+
// ── useEffect (basic: deps-based; no-op on server) ──────────────────
|
|
83
|
+
export function useEffect(fn, deps) {
|
|
84
|
+
const root = currentRoot;
|
|
85
|
+
if (!root || !root.currentSlot)
|
|
86
|
+
return;
|
|
87
|
+
const slot = root.currentSlot;
|
|
88
|
+
const idx = root.effectIdx++;
|
|
89
|
+
const prev = slot.effects[idx];
|
|
90
|
+
const changed = !prev ||
|
|
91
|
+
!deps ||
|
|
92
|
+
!prev.deps ||
|
|
93
|
+
deps.length !== prev.deps.length ||
|
|
94
|
+
deps.some((d, i) => !Object.is(d, prev.deps?.[i]));
|
|
95
|
+
if (changed) {
|
|
96
|
+
slot.effects[idx] = {
|
|
97
|
+
deps,
|
|
98
|
+
cleanup: prev?.cleanup,
|
|
99
|
+
pending: () => {
|
|
100
|
+
prev?.cleanup?.();
|
|
101
|
+
const ret = fn();
|
|
102
|
+
if (typeof ret === 'function') {
|
|
103
|
+
slot.effects[idx].cleanup = ret;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
slot.effects[idx].cleanup = undefined;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// ── useRef (no-op-ish on server: returns a fresh ref every render) ──
|
|
113
|
+
export function useRef(initial) {
|
|
114
|
+
const root = currentRoot;
|
|
115
|
+
if (!root || !root.currentSlot)
|
|
116
|
+
return { current: initial };
|
|
117
|
+
const slot = root.currentSlot;
|
|
118
|
+
const idx = root.refIdx++;
|
|
119
|
+
if (idx >= slot.refs.length) {
|
|
120
|
+
slot.refs[idx] = { current: initial };
|
|
121
|
+
}
|
|
122
|
+
return slot.refs[idx];
|
|
123
|
+
}
|
|
124
|
+
// ── Schedule a re-render (microtask coalesce) ────────────────────────
|
|
125
|
+
function scheduleRender(root) {
|
|
126
|
+
if (root.rendering) {
|
|
127
|
+
root.pendingRender = true;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
root.pendingRender = true;
|
|
131
|
+
queueMicrotask(() => {
|
|
132
|
+
if (root.pendingRender) {
|
|
133
|
+
root.pendingRender = false;
|
|
134
|
+
mount(root);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// ── Attribute helpers ────────────────────────────────────────────────
|
|
139
|
+
const ATTR_ALIAS = {
|
|
140
|
+
className: 'class',
|
|
141
|
+
htmlFor: 'for',
|
|
142
|
+
charSet: 'charset',
|
|
143
|
+
};
|
|
144
|
+
function camelToKebab(k) {
|
|
145
|
+
if (k[0] === '-' || !/[A-Z]/.test(k))
|
|
146
|
+
return k;
|
|
147
|
+
return k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
|
|
148
|
+
}
|
|
149
|
+
function styleObjToCss(obj) {
|
|
150
|
+
let out = '';
|
|
151
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
152
|
+
if (v == null || v === false)
|
|
153
|
+
continue;
|
|
154
|
+
let val;
|
|
155
|
+
if (typeof v === 'number')
|
|
156
|
+
val = `${v}px`;
|
|
157
|
+
else if (typeof v === 'string')
|
|
158
|
+
val = v;
|
|
159
|
+
else
|
|
160
|
+
continue;
|
|
161
|
+
out += `${out ? ';' : ''}${camelToKebab(k)}:${val}`;
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
// ── DOM materializer ────────────────────────────────────────────────
|
|
166
|
+
function appendChild(parent, child, slotKey) {
|
|
167
|
+
if (child == null || child === false || child === true)
|
|
168
|
+
return;
|
|
169
|
+
if (typeof child === 'string' || typeof child === 'number' || typeof child === 'bigint') {
|
|
170
|
+
parent.appendChild(document.createTextNode(String(child)));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (Array.isArray(child)) {
|
|
174
|
+
child.forEach((c, i) => appendChild(parent, c, `${slotKey}.${i}`));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (isJSXNode(child)) {
|
|
178
|
+
parent.appendChild(toDOM(child, slotKey));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function toDOM(node, slotKey) {
|
|
182
|
+
const { tag, props, children } = node;
|
|
183
|
+
// Component / Fragment
|
|
184
|
+
if (typeof tag === 'function') {
|
|
185
|
+
const root = currentRoot;
|
|
186
|
+
const prevSlot = root.currentSlot;
|
|
187
|
+
const prevKey = root.currentSlotKey;
|
|
188
|
+
const prevStateIdx = root.stateIdx;
|
|
189
|
+
const prevEffectIdx = root.effectIdx;
|
|
190
|
+
const prevRefIdx = root.refIdx;
|
|
191
|
+
const key = `${slotKey}|${tag.name || 'Anon'}`;
|
|
192
|
+
root.currentSlotKey = key;
|
|
193
|
+
root.currentSlot = getOrInitSlot(key);
|
|
194
|
+
root.stateIdx = 0;
|
|
195
|
+
root.effectIdx = 0;
|
|
196
|
+
root.refIdx = 0;
|
|
197
|
+
const result = tag({ ...props, children: children.length === 1 ? children[0] : children });
|
|
198
|
+
root.currentSlot = prevSlot;
|
|
199
|
+
root.currentSlotKey = prevKey;
|
|
200
|
+
root.stateIdx = prevStateIdx;
|
|
201
|
+
root.effectIdx = prevEffectIdx;
|
|
202
|
+
root.refIdx = prevRefIdx;
|
|
203
|
+
const frag = document.createDocumentFragment();
|
|
204
|
+
appendChild(frag, result, key);
|
|
205
|
+
return frag;
|
|
206
|
+
}
|
|
207
|
+
// Intrinsic element
|
|
208
|
+
const el = document.createElement(tag);
|
|
209
|
+
for (const k in props) {
|
|
210
|
+
const v = props[k];
|
|
211
|
+
if (k === 'children' || k === 'key' || k === 'ref')
|
|
212
|
+
continue;
|
|
213
|
+
if (v == null || v === false)
|
|
214
|
+
continue;
|
|
215
|
+
// Event handler: onClick, onChange, onInput, ...
|
|
216
|
+
if (k.length > 2 && k[0] === 'o' && k[1] === 'n' && typeof v === 'function') {
|
|
217
|
+
const eventName = k.slice(2).toLowerCase();
|
|
218
|
+
el.addEventListener(eventName, v);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
// dangerouslySetInnerHTML
|
|
222
|
+
if (k === 'dangerouslySetInnerHTML') {
|
|
223
|
+
const html = v.__html;
|
|
224
|
+
if (typeof html === 'string')
|
|
225
|
+
el.innerHTML = html;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Style object
|
|
229
|
+
if (k === 'style' && typeof v === 'object') {
|
|
230
|
+
el.setAttribute('style', styleObjToCss(v));
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const name = ATTR_ALIAS[k] || k;
|
|
234
|
+
if (v === true) {
|
|
235
|
+
el.setAttribute(name, '');
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
el.setAttribute(name, String(v));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
children.forEach((c, i) => appendChild(el, c, `${slotKey}>${tag}.${i}`));
|
|
242
|
+
return el;
|
|
243
|
+
}
|
|
244
|
+
// ── Mount (initial + re-render) ──────────────────────────────────────
|
|
245
|
+
function mount(root) {
|
|
246
|
+
root.rendering = true;
|
|
247
|
+
currentRoot = root;
|
|
248
|
+
root.currentSlotKey = '';
|
|
249
|
+
root.currentSlot = null;
|
|
250
|
+
root.stateIdx = 0;
|
|
251
|
+
root.effectIdx = 0;
|
|
252
|
+
root.refIdx = 0;
|
|
253
|
+
// Render tree
|
|
254
|
+
const tree = root.render();
|
|
255
|
+
// Wipe container + re-fill
|
|
256
|
+
root.container.textContent = '';
|
|
257
|
+
appendChild(root.container, tree, 'root');
|
|
258
|
+
// Flush pending effects (post-render)
|
|
259
|
+
for (const slot of root.slots.values()) {
|
|
260
|
+
for (const effect of slot.effects) {
|
|
261
|
+
if (effect.pending) {
|
|
262
|
+
try {
|
|
263
|
+
effect.pending();
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
console.error(e);
|
|
267
|
+
}
|
|
268
|
+
effect.pending = undefined;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
currentRoot = null;
|
|
273
|
+
root.rendering = false;
|
|
274
|
+
if (root.pendingRender) {
|
|
275
|
+
root.pendingRender = false;
|
|
276
|
+
queueMicrotask(() => mount(root));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// ── Public createRoot ────────────────────────────────────────────────
|
|
280
|
+
export function createRoot(container) {
|
|
281
|
+
return {
|
|
282
|
+
render(tree) {
|
|
283
|
+
const root = {
|
|
284
|
+
container,
|
|
285
|
+
render: () => tree,
|
|
286
|
+
slots: new Map(),
|
|
287
|
+
currentSlotKey: '',
|
|
288
|
+
currentSlot: null,
|
|
289
|
+
stateIdx: 0,
|
|
290
|
+
effectIdx: 0,
|
|
291
|
+
refIdx: 0,
|
|
292
|
+
rendering: false,
|
|
293
|
+
pendingRender: false,
|
|
294
|
+
};
|
|
295
|
+
mount(root);
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// ── Helper for bundle entry points ──────────────────────────────────
|
|
300
|
+
// The dev runner generates an entry that imports the user's page module,
|
|
301
|
+
// calls jsx() on its default export, and hands it to createRoot.
|
|
302
|
+
export { JSXNode };
|
|
303
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/jsx/dom/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Route } from './routes.ts';
|
|
2
|
+
type BundleInput = {
|
|
3
|
+
routes: Route[];
|
|
4
|
+
rootLayoutFile: string | null;
|
|
5
|
+
};
|
|
6
|
+
export declare function bundleClient({ routes, rootLayoutFile }: BundleInput): Promise<string>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/runtime/bundle.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAsB,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA4F3F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Generates the client-side JavaScript bundle that hydrates the WebView.
|
|
2
|
+
//
|
|
3
|
+
// We synthesize an entry that:
|
|
4
|
+
// 1. imports every page module (from src/app/.../page.tsx)
|
|
5
|
+
// 2. imports the root layout (if present)
|
|
6
|
+
// 3. wires hash-based routing
|
|
7
|
+
// 4. calls createRoot on #murasaki-root and re-renders on hashchange
|
|
8
|
+
//
|
|
9
|
+
// esbuild bundles the synthesized entry through the user's filesystem
|
|
10
|
+
// (resolveDir = projectRoot), pulling in murasaki/jsx/dom and the user's
|
|
11
|
+
// own code. The output is an IIFE that runs as soon as the <script> loads.
|
|
12
|
+
import * as esbuild from 'esbuild';
|
|
13
|
+
import { projectRoot } from "../env.js";
|
|
14
|
+
export async function bundleClient({ routes, rootLayoutFile }) {
|
|
15
|
+
// Each route gets a numbered Page import so we can wire them by URL path.
|
|
16
|
+
const pageImports = routes
|
|
17
|
+
.map((r, i) => `import Page${i} from ${JSON.stringify(r.pageFile)}`)
|
|
18
|
+
.join('\n');
|
|
19
|
+
const layoutImport = rootLayoutFile
|
|
20
|
+
? `import RootLayout from ${JSON.stringify(rootLayoutFile)}`
|
|
21
|
+
: '';
|
|
22
|
+
// path → Page component map
|
|
23
|
+
const routesMap = routes.map((r, i) => ` ${JSON.stringify(r.path)}: Page${i},`).join('\n');
|
|
24
|
+
const wrap = rootLayoutFile ? 'jsx(RootLayout, { children: jsx(Page, null) })' : 'jsx(Page, null)';
|
|
25
|
+
const entry = `
|
|
26
|
+
${pageImports}
|
|
27
|
+
${layoutImport}
|
|
28
|
+
import { createRoot, jsx } from 'murasaki/jsx/dom'
|
|
29
|
+
|
|
30
|
+
const ROUTES = {
|
|
31
|
+
${routesMap}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function currentPath() {
|
|
35
|
+
const h = (typeof location !== 'undefined' && location.hash) || ''
|
|
36
|
+
return h.startsWith('#') ? (h.slice(1) || '/') : '/'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const container = document.getElementById('murasaki-root')
|
|
40
|
+
if (!container) {
|
|
41
|
+
throw new Error('[murasaki] mount point #murasaki-root not found')
|
|
42
|
+
}
|
|
43
|
+
container.textContent = ''
|
|
44
|
+
|
|
45
|
+
let _root
|
|
46
|
+
function render() {
|
|
47
|
+
const path = currentPath()
|
|
48
|
+
const Page = ROUTES[path] || ROUTES['/']
|
|
49
|
+
if (!Page) {
|
|
50
|
+
container.textContent = '404'
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
const tree = ${wrap}
|
|
54
|
+
if (!_root) _root = createRoot(container)
|
|
55
|
+
_root.render(tree)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
render()
|
|
59
|
+
window.addEventListener('hashchange', render)
|
|
60
|
+
|
|
61
|
+
// Intercept anchor clicks marked with data-murasaki-link
|
|
62
|
+
document.addEventListener('click', function (e) {
|
|
63
|
+
let t = e.target
|
|
64
|
+
while (t && t.nodeType === 1) {
|
|
65
|
+
if (t.tagName === 'A' && t.hasAttribute('data-murasaki-link')) {
|
|
66
|
+
e.preventDefault()
|
|
67
|
+
const href = t.getAttribute('data-murasaki-link')
|
|
68
|
+
if ('#' + href !== location.hash) location.hash = href
|
|
69
|
+
else render()
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
t = t.parentNode
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
`;
|
|
76
|
+
const result = await esbuild.build({
|
|
77
|
+
stdin: {
|
|
78
|
+
contents: entry,
|
|
79
|
+
loader: 'tsx',
|
|
80
|
+
resolveDir: projectRoot,
|
|
81
|
+
sourcefile: '<murasaki-client-entry>.tsx',
|
|
82
|
+
},
|
|
83
|
+
bundle: true,
|
|
84
|
+
write: false,
|
|
85
|
+
format: 'iife',
|
|
86
|
+
target: ['safari16', 'chrome120', 'firefox120'],
|
|
87
|
+
jsx: 'automatic',
|
|
88
|
+
jsxImportSource: 'murasaki',
|
|
89
|
+
minify: false,
|
|
90
|
+
sourcemap: 'inline',
|
|
91
|
+
logLevel: 'silent',
|
|
92
|
+
});
|
|
93
|
+
if (result.errors.length) {
|
|
94
|
+
throw new Error(`[murasaki] client bundle failed:\n${result.errors.map((e) => e.text).join('\n')}`);
|
|
95
|
+
}
|
|
96
|
+
return result.outputFiles[0].text;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/runtime/bundle.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,+BAA+B;AAC/B,6DAA6D;AAC7D,4CAA4C;AAC5C,gCAAgC;AAChC,uEAAuE;AACvE,EAAE;AACF,sEAAsE;AACtE,yEAAyE;AACzE,2EAA2E;AAE3E,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAQvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAe;IACxE,0EAA0E;IAC1E,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;SACnE,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE;QAC5D,CAAC,CAAC,EAAE,CAAA;IAEN,4BAA4B;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE3F,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAElG,MAAM,KAAK,GAAG;EACd,WAAW;EACX,YAAY;;;;EAIZ,SAAS;;;;;;;;;;;;;;;;;;;;;;iBAsBM,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBpB,CAAA;IAEC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;QACjC,KAAK,EAAE;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,6BAA6B;SAC1C;QACD,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC;QAC/C,GAAG,EAAE,WAAW;QAChB,eAAe,EAAE,UAAU;QAC3B,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnF,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type NotifyOptions = {
|
|
2
|
+
title: string;
|
|
3
|
+
body?: string;
|
|
4
|
+
sound?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare const nativeBridge: {
|
|
7
|
+
/** Show an OS notification. */
|
|
8
|
+
notify(opts: NotifyOptions): Promise<void>;
|
|
9
|
+
/** Copy text to the system clipboard. */
|
|
10
|
+
clipboardWrite(text: string): Promise<void>;
|
|
11
|
+
/** Read text from the system clipboard. */
|
|
12
|
+
clipboardRead(): Promise<string>;
|
|
13
|
+
/** Open a URL or file path in the system default handler (browser, etc). */
|
|
14
|
+
openExternal(target: string): Promise<void>;
|
|
15
|
+
/** Murasaki version (debug/probe). */
|
|
16
|
+
version: string;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/runtime/native.ts"],"names":[],"mappings":"AAWA,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAoCD,eAAO,MAAM,YAAY;IACvB,+BAA+B;iBACZ,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhD,yCAAyC;yBACd,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjD,2CAA2C;qBACpB,OAAO,CAAC,MAAM,CAAC;IAYtC,4EAA4E;yBACjD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,sCAAsC;;CAEvC,CAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// Native bridge exposed to the WebView under `window.murasaki`.
|
|
2
|
+
//
|
|
3
|
+
// Each function here becomes callable from client code via
|
|
4
|
+
// await window.murasaki.<name>(args)
|
|
5
|
+
// (the underlying transport is @webviewjs/webview's `webview.expose`).
|
|
6
|
+
//
|
|
7
|
+
// macOS-first; Windows/Linux paths are best-effort. All values & arguments
|
|
8
|
+
// must be JSON-serializable.
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
function runSilent(cmd, args, stdin) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const proc = spawn(cmd, args, { stdio: ['pipe', 'ignore', 'ignore'] });
|
|
13
|
+
proc.on('error', reject);
|
|
14
|
+
proc.on('exit', (code) => {
|
|
15
|
+
if (code === 0)
|
|
16
|
+
resolve();
|
|
17
|
+
else
|
|
18
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
19
|
+
});
|
|
20
|
+
if (stdin !== undefined) {
|
|
21
|
+
proc.stdin.write(stdin);
|
|
22
|
+
proc.stdin.end();
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function runCapture(cmd, args) {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const proc = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
29
|
+
let out = '';
|
|
30
|
+
proc.stdout.on('data', (chunk) => {
|
|
31
|
+
out += chunk.toString();
|
|
32
|
+
});
|
|
33
|
+
proc.on('error', reject);
|
|
34
|
+
proc.on('exit', (code) => {
|
|
35
|
+
if (code === 0)
|
|
36
|
+
resolve(out);
|
|
37
|
+
else
|
|
38
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function escapeAppleScript(s) {
|
|
43
|
+
return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
44
|
+
}
|
|
45
|
+
export const nativeBridge = {
|
|
46
|
+
/** Show an OS notification. */
|
|
47
|
+
async notify(opts) {
|
|
48
|
+
if (process.platform === 'darwin') {
|
|
49
|
+
const title = escapeAppleScript(opts.title);
|
|
50
|
+
const body = escapeAppleScript(opts.body ?? '');
|
|
51
|
+
const sound = opts.sound ? ' sound name "default"' : '';
|
|
52
|
+
const script = `display notification "${body}" with title "${title}"${sound}`;
|
|
53
|
+
await runSilent('osascript', ['-e', script]);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (process.platform === 'win32') {
|
|
57
|
+
// Best-effort PowerShell toast
|
|
58
|
+
const escaped = opts.title.replace(/"/g, '\\"');
|
|
59
|
+
const body = (opts.body ?? '').replace(/"/g, '\\"');
|
|
60
|
+
const ps = `New-BurntToastNotification -Text "${escaped}","${body}"`;
|
|
61
|
+
await runSilent('powershell', ['-Command', ps]);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Linux
|
|
65
|
+
const args = [];
|
|
66
|
+
if (opts.body)
|
|
67
|
+
args.push(opts.title, opts.body);
|
|
68
|
+
else
|
|
69
|
+
args.push(opts.title);
|
|
70
|
+
await runSilent('notify-send', args);
|
|
71
|
+
},
|
|
72
|
+
/** Copy text to the system clipboard. */
|
|
73
|
+
async clipboardWrite(text) {
|
|
74
|
+
if (process.platform === 'darwin')
|
|
75
|
+
return runSilent('pbcopy', [], text);
|
|
76
|
+
if (process.platform === 'win32')
|
|
77
|
+
return runSilent('clip', [], text);
|
|
78
|
+
// Linux: try wl-copy (Wayland) then xclip (X11)
|
|
79
|
+
try {
|
|
80
|
+
return await runSilent('wl-copy', [], text);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return runSilent('xclip', ['-selection', 'clipboard'], text);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
/** Read text from the system clipboard. */
|
|
87
|
+
async clipboardRead() {
|
|
88
|
+
if (process.platform === 'darwin')
|
|
89
|
+
return runCapture('pbpaste', []);
|
|
90
|
+
if (process.platform === 'win32') {
|
|
91
|
+
return runCapture('powershell', ['-Command', 'Get-Clipboard']);
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
return await runCapture('wl-paste', ['--no-newline']);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return runCapture('xclip', ['-selection', 'clipboard', '-o']);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
/** Open a URL or file path in the system default handler (browser, etc). */
|
|
101
|
+
async openExternal(target) {
|
|
102
|
+
const cmd = process.platform === 'darwin' ? 'open'
|
|
103
|
+
: process.platform === 'win32' ? 'cmd'
|
|
104
|
+
: 'xdg-open';
|
|
105
|
+
const args = process.platform === 'win32' ? ['/c', 'start', '', target] : [target];
|
|
106
|
+
return runSilent(cmd, args);
|
|
107
|
+
},
|
|
108
|
+
/** Murasaki version (debug/probe). */
|
|
109
|
+
version: '0.3.0',
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/runtime/native.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAmJ/C,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAUvD"}
|
package/dist/runtime/render.js
CHANGED
|
@@ -22,6 +22,7 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
22
22
|
import { pathToFileURL } from 'node:url';
|
|
23
23
|
import { APP_DIR, APP_GLOBALS_CSS, LEGACY_APP_PATH, LEGACY_GLOBALS_CSS, LEGACY_LAYOUT_PATH, } from "../env.js";
|
|
24
24
|
import { jsx, raw, renderToString } from "../jsx/runtime.js";
|
|
25
|
+
import { bundleClient } from "./bundle.js";
|
|
25
26
|
import { discoverRoutes } from "./routes.js";
|
|
26
27
|
const NO_APP_HTML = '<!doctype html><html><body style="font-family:system-ui;padding:40px;">' +
|
|
27
28
|
'<h1 style="color:#A855F7">No app found</h1>' +
|
|
@@ -177,17 +178,34 @@ async function renderAppRouter() {
|
|
|
177
178
|
const rootLayoutFile = rootLayoutPath && rootLayoutPath.endsWith('/app/layout.tsx') ? rootLayoutPath : null;
|
|
178
179
|
const rootLayoutMod = rootLayoutFile ? await loadModule(rootLayoutFile) : null;
|
|
179
180
|
const metadata = rootLayoutMod?.metadata;
|
|
180
|
-
// 2.
|
|
181
|
+
// 2. Server pre-render each page (gives a usable first paint before the
|
|
182
|
+
// client bundle boots — pre-hydration shell). Each block goes inside
|
|
183
|
+
// the mount root and is replaced by the client renderer on boot.
|
|
181
184
|
const blocks = [];
|
|
182
185
|
for (const route of routes) {
|
|
183
186
|
const inner = await renderPageInner(route, rootLayoutFile);
|
|
184
187
|
blocks.push(`<div data-murasaki-route="${escapeHtml(route.path)}" hidden>${inner}</div>`);
|
|
185
188
|
}
|
|
186
|
-
|
|
187
|
-
//
|
|
188
|
-
|
|
189
|
+
// 3. Wrap the server-rendered content + nav script in the mount container.
|
|
190
|
+
// The client bundle will clear this container on boot and re-render
|
|
191
|
+
// interactively (useState/onClick actually fire after that).
|
|
192
|
+
const mountInner = blocks.join('') + NAV_SCRIPT;
|
|
193
|
+
const mountRoot = `<div id="murasaki-root">${mountInner}</div>`;
|
|
194
|
+
// 4. Build + inline client bundle (esbuild, IIFE)
|
|
195
|
+
let clientScript = '';
|
|
196
|
+
try {
|
|
197
|
+
const code = await bundleClient({ routes, rootLayoutFile });
|
|
198
|
+
clientScript = `<script type="module" data-murasaki="client">${code}</script>`;
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
// Render an inline error overlay so the WebView shows what broke
|
|
202
|
+
const msg = escapeHtml(String(e?.message ?? e));
|
|
203
|
+
clientScript = `<script>document.body.insertAdjacentHTML('beforeend','<pre style=\\'position:fixed;inset:0;background:#1a0a33;color:#A855F7;padding:24px;font-family:SF Mono,Menlo,monospace;font-size:13px;overflow:auto;z-index:9999\\'>client bundle failed:\\n${msg.replace(/[\\'\\\\]/g, '\\\\$&')}</pre>')</script>`;
|
|
204
|
+
}
|
|
205
|
+
// 5. Render root layout with mount root + client script as children
|
|
206
|
+
const bodyContent = await renderRootLayout(rootLayoutMod, raw(mountRoot + clientScript));
|
|
189
207
|
let html = '<!doctype html>' + bodyContent;
|
|
190
|
-
//
|
|
208
|
+
// 6. Inject metadata + globals.css
|
|
191
209
|
html = injectHead(html, metadata, loadGlobalsCss());
|
|
192
210
|
return { html, metadata };
|
|
193
211
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,EAAE;AACF,YAAY;AACZ,2CAA2C;AAC3C,4EAA4E;AAC5E,yEAAyE;AACzE,+EAA+E;AAC/E,wEAAwE;AACxE,gCAAgC;AAChC,EAAE;AACF,wEAAwE;AACxE,8DAA8D;;;;;;;;;AAE9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EACL,OAAO,EACP,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAc,MAAM,aAAa,CAAA;AAExD,MAAM,WAAW,GACf,yEAAyE;IACzE,6CAA6C;IAC7C,uFAAuF,CAAA;AAEzF,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IACzD,OAAO,MAAM,kCAAC,GAAG,EAAC,CAAA;AACpB,CAAC;AAOD,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,eAAe,CAAC,KAAY,EAAE,cAA6B;IACxE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IACvB,IAAI,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAE5C,8FAA8F;IAC9F,oFAAoF;IACpF,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAA;IAC5E,uEAAuE;IACvE,sEAAsE;IACtE,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS;YAAE,SAAQ;QACxB,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,gBAAgB,CAAC,UAAyB,EAAE,IAAW;IACpE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,wDAAwD;QACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE;YAC3B,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE;gBACR,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC5D,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aAChC;SACF,CAAC,CAAA;QACF,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAA;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ClB,CAAC,IAAI,EAAE,CAAA;AAER,uEAAuE;AACvE,SAAS,cAAc;IACrB,KAAK,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACtD,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;YAChC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,uEAAuE;AACvE,SAAS,UAAU,CAAC,IAAY,EAAE,QAA8B,EAAE,GAAW;IAC3E,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,IAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,WAAW,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAClE,CAAC;IACD,IAAI,QAAQ,EAAE,WAAW,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,WAAW,CAAC,IAAI,CAAC,qCAAqC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;QACR,WAAW,CAAC,IAAI,CAAC,sCAAsC,GAAG,UAAU,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC,CAAA;IAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,CAAA;AAC9C,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,qCAAqC;IACrC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,eAAe,EAAE,CAAA;IAC1B,CAAC;IACD,qCAAqC;IACrC,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,OAAO,YAAY,EAAE,CAAA;IACvB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;AAC9B,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAErD,mDAAmD;IACnD,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IAChD,MAAM,cAAc,GAClB,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAA;IACtF,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9E,MAAM,QAAQ,GAAG,aAAa,EAAE,QAAQ,CAAA;IAExC,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAA;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAA;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,eAAO,MAAM,GAAG,aAAqD,CAAA;AA+BrE,wBAAgB,SAAS,IAAI,QAAQ,CAAC,YAAY,CAAC,CAElD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBhD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAOlC;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,OAAO,IAAI,IAAI,CAI9B"}
|
package/dist/runtime/window.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { Application, ControlFlow } from '@webviewjs/webview';
|
|
7
7
|
import { printClosed, printError, printHint, printReloaded } from "../cli/log.js";
|
|
8
8
|
import { DEFAULT_WIN_SIZE, DEFAULT_WIN_TITLE, projectRoot } from "../env.js";
|
|
9
|
+
import { nativeBridge } from "./native.js";
|
|
9
10
|
import { renderApp } from "./render.js";
|
|
10
11
|
const config = {
|
|
11
12
|
title: DEFAULT_WIN_TITLE,
|
|
@@ -58,6 +59,13 @@ export async function openWindow() {
|
|
|
58
59
|
height: config.height,
|
|
59
60
|
});
|
|
60
61
|
webview = win.createWebview({ html });
|
|
62
|
+
// Expose native bridge under window.murasaki for client hooks.
|
|
63
|
+
try {
|
|
64
|
+
webview.expose('murasaki', nativeBridge);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
printError(`Native bridge expose failed: ${e.message}`);
|
|
68
|
+
}
|
|
61
69
|
}
|
|
62
70
|
export function closeWindow() {
|
|
63
71
|
if (!win)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,iFAAiF;AACjF,4EAA4E;AAC5E,6CAA6C;AAE7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG5E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAc,CAAA;AAExC,MAAM,MAAM,GAAiB;IAC3B,KAAK,EAAE,iBAAiB;IACxB,KAAK,EAAE,gBAAgB,CAAC,KAAK;IAC7B,MAAM,EAAE,gBAAgB,CAAC,MAAM;CAChC,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;AAKrE,IAAI,GAAG,GAAyB,IAAI,CAAA;AACpC,IAAI,OAAO,GAAmB,IAAI,CAAA;AAElC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IACpB,MAAM,IAAI,GAAG,KAAK,IAAI,CAAE,KAAa,CAAC,IAAI,IAAK,KAAa,CAAC,KAAK,CAAC,CAAA;IACnE,IAAI,IAAI,KAAK,wBAAwB,EAAE,CAAC;QACtC,2EAA2E;QAC3E,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC;gBACH,GAAG,CAAC,OAAO,EAAE,CAAA;YACf,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,GAAG,GAAG,IAAI,CAAA;QACV,OAAO,GAAG,IAAI,CAAA;QACd,WAAW,EAAE,CAAA;IACf,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,SAAS,aAAa,CAAC,QAAmB;IACxC,IAAI,CAAC,QAAQ;QAAE,OAAM;IACrB,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;SAC3D,IAAI,QAAQ,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;IACtD,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;IAChE,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,GAAG,EAAE,CAAC;QACR,SAAS,CAAC,wBAAwB,CAAC,CAAA;QACnC,OAAM;IACR,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,EAAE,CAAA;IAC5C,aAAa,CAAC,QAAQ,CAAC,CAAA;IACvB,GAAG,GAAG,GAAG,CAAC,mBAAmB,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;IACF,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "murasaki",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "The desktop framework for Next.js developers. Node-powered. WebView-thin. No Rust. No Chromium.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"desktop",
|
|
@@ -42,6 +42,10 @@
|
|
|
42
42
|
"./jsx-dev-runtime": {
|
|
43
43
|
"types": "./dist/jsx/jsx-dev-runtime.d.ts",
|
|
44
44
|
"default": "./dist/jsx/jsx-dev-runtime.js"
|
|
45
|
+
},
|
|
46
|
+
"./jsx/dom": {
|
|
47
|
+
"types": "./dist/jsx/dom/index.d.ts",
|
|
48
|
+
"default": "./dist/jsx/dom/index.js"
|
|
45
49
|
}
|
|
46
50
|
},
|
|
47
51
|
"files": [
|
|
@@ -61,6 +65,7 @@
|
|
|
61
65
|
},
|
|
62
66
|
"dependencies": {
|
|
63
67
|
"@webviewjs/webview": "^0.3.2",
|
|
68
|
+
"esbuild": "^0.28.1",
|
|
64
69
|
"tsx": "^4.22.4"
|
|
65
70
|
},
|
|
66
71
|
"devDependencies": {
|