@textjs/app 0.0.0-stage → 1.0.3
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/README.md +34 -2
- package/bin/text.js +29 -0
- package/bin/text.ts +13 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/cli/build.d.ts +39 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +157 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/config.d.ts +22 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +73 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dev.d.ts +12 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +49 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +192 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run.d.ts +31 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +111 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/start.d.ts +14 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +183 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/ui.d.ts +35 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +73 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +93 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +143 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +44 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +26 -0
- package/dist/context.js.map +1 -0
- package/dist/dev-errors.d.ts +68 -0
- package/dist/dev-errors.d.ts.map +1 -0
- package/dist/dev-errors.js +121 -0
- package/dist/dev-errors.js.map +1 -0
- package/dist/devtools.d.ts +64 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +186 -0
- package/dist/devtools.js.map +1 -0
- package/dist/frame-mirror.d.ts +19 -0
- package/dist/frame-mirror.d.ts.map +1 -0
- package/dist/frame-mirror.js +141 -0
- package/dist/frame-mirror.js.map +1 -0
- package/dist/frame-protocol.d.ts +175 -0
- package/dist/frame-protocol.d.ts.map +1 -0
- package/dist/frame-protocol.js +369 -0
- package/dist/frame-protocol.js.map +1 -0
- package/dist/history.d.ts +54 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +152 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +32 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +54 -0
- package/dist/link.js.map +1 -0
- package/dist/live-player.d.ts +83 -0
- package/dist/live-player.d.ts.map +1 -0
- package/dist/live-player.js +413 -0
- package/dist/live-player.js.map +1 -0
- package/dist/live-protocol.d.ts +132 -0
- package/dist/live-protocol.d.ts.map +1 -0
- package/dist/live-protocol.js +278 -0
- package/dist/live-protocol.js.map +1 -0
- package/dist/live-stub.d.ts +10 -0
- package/dist/live-stub.d.ts.map +1 -0
- package/dist/live-stub.js +32 -0
- package/dist/live-stub.js.map +1 -0
- package/dist/mcp/cli.d.ts +22 -0
- package/dist/mcp/cli.d.ts.map +1 -0
- package/dist/mcp/cli.js +177 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/mcp/frame.d.ts +58 -0
- package/dist/mcp/frame.d.ts.map +1 -0
- package/dist/mcp/frame.js +169 -0
- package/dist/mcp/frame.js.map +1 -0
- package/dist/mcp/index.d.ts +15 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +15 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/inspect.d.ts +95 -0
- package/dist/mcp/inspect.d.ts.map +1 -0
- package/dist/mcp/inspect.js +386 -0
- package/dist/mcp/inspect.js.map +1 -0
- package/dist/mcp/keys.d.ts +20 -0
- package/dist/mcp/keys.d.ts.map +1 -0
- package/dist/mcp/keys.js +87 -0
- package/dist/mcp/keys.js.map +1 -0
- package/dist/mcp/logs.d.ts +63 -0
- package/dist/mcp/logs.d.ts.map +1 -0
- package/dist/mcp/logs.js +217 -0
- package/dist/mcp/logs.js.map +1 -0
- package/dist/mcp/server.d.ts +64 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +485 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +230 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +742 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/navigation-errors.d.ts +28 -0
- package/dist/navigation-errors.d.ts.map +1 -0
- package/dist/navigation-errors.js +43 -0
- package/dist/navigation-errors.js.map +1 -0
- package/dist/navigation.d.ts +21 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +33 -0
- package/dist/navigation.js.map +1 -0
- package/dist/router.d.ts +76 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +296 -0
- package/dist/router.js.map +1 -0
- package/dist/routing.d.ts +101 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +286 -0
- package/dist/routing.js.map +1 -0
- package/dist/server/adapters/build-step.d.ts +34 -0
- package/dist/server/adapters/build-step.d.ts.map +1 -0
- package/dist/server/adapters/build-step.js +112 -0
- package/dist/server/adapters/build-step.js.map +1 -0
- package/dist/server/adapters/bun.d.ts +8 -0
- package/dist/server/adapters/bun.d.ts.map +1 -0
- package/dist/server/adapters/bun.js +89 -0
- package/dist/server/adapters/bun.js.map +1 -0
- package/dist/server/adapters/bundle.d.ts +21 -0
- package/dist/server/adapters/bundle.d.ts.map +1 -0
- package/dist/server/adapters/bundle.js +86 -0
- package/dist/server/adapters/bundle.js.map +1 -0
- package/dist/server/adapters/cloudflare.d.ts +29 -0
- package/dist/server/adapters/cloudflare.d.ts.map +1 -0
- package/dist/server/adapters/cloudflare.js +105 -0
- package/dist/server/adapters/cloudflare.js.map +1 -0
- package/dist/server/adapters/index.d.ts +10 -0
- package/dist/server/adapters/index.d.ts.map +1 -0
- package/dist/server/adapters/index.js +24 -0
- package/dist/server/adapters/index.js.map +1 -0
- package/dist/server/adapters/runtime-node.d.ts +16 -0
- package/dist/server/adapters/runtime-node.d.ts.map +1 -0
- package/dist/server/adapters/runtime-node.js +29 -0
- package/dist/server/adapters/runtime-node.js.map +1 -0
- package/dist/server/adapters/runtime.d.ts +42 -0
- package/dist/server/adapters/runtime.d.ts.map +1 -0
- package/dist/server/adapters/runtime.js +115 -0
- package/dist/server/adapters/runtime.js.map +1 -0
- package/dist/server/adapters/shared.d.ts +66 -0
- package/dist/server/adapters/shared.d.ts.map +1 -0
- package/dist/server/adapters/shared.js +124 -0
- package/dist/server/adapters/shared.js.map +1 -0
- package/dist/server/adapters/static.d.ts +9 -0
- package/dist/server/adapters/static.d.ts.map +1 -0
- package/dist/server/adapters/static.js +70 -0
- package/dist/server/adapters/static.js.map +1 -0
- package/dist/server/adapters/vercel.d.ts +43 -0
- package/dist/server/adapters/vercel.d.ts.map +1 -0
- package/dist/server/adapters/vercel.js +119 -0
- package/dist/server/adapters/vercel.js.map +1 -0
- package/dist/server/bun-jsx.d.ts +18 -0
- package/dist/server/bun-jsx.d.ts.map +1 -0
- package/dist/server/bun-jsx.js +56 -0
- package/dist/server/bun-jsx.js.map +1 -0
- package/dist/server/cache-route.d.ts +38 -0
- package/dist/server/cache-route.d.ts.map +1 -0
- package/dist/server/cache-route.js +109 -0
- package/dist/server/cache-route.js.map +1 -0
- package/dist/server/cache.d.ts +131 -0
- package/dist/server/cache.d.ts.map +1 -0
- package/dist/server/cache.js +409 -0
- package/dist/server/cache.js.map +1 -0
- package/dist/server/frames.d.ts +45 -0
- package/dist/server/frames.d.ts.map +1 -0
- package/dist/server/frames.js +294 -0
- package/dist/server/frames.js.map +1 -0
- package/dist/server/http.d.ts +80 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +453 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/jsx-dev-runtime.d.ts +5 -0
- package/dist/server/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/server/jsx-dev-runtime.js +6 -0
- package/dist/server/jsx-dev-runtime.js.map +1 -0
- package/dist/server/jsx-runtime.d.ts +10 -0
- package/dist/server/jsx-runtime.d.ts.map +1 -0
- package/dist/server/jsx-runtime.js +11 -0
- package/dist/server/jsx-runtime.js.map +1 -0
- package/dist/server/live-app.d.ts +87 -0
- package/dist/server/live-app.d.ts.map +1 -0
- package/dist/server/live-app.js +307 -0
- package/dist/server/live-app.js.map +1 -0
- package/dist/server/live-build.d.ts +70 -0
- package/dist/server/live-build.d.ts.map +1 -0
- package/dist/server/live-build.js +222 -0
- package/dist/server/live-build.js.map +1 -0
- package/dist/server/live-dev.d.ts +62 -0
- package/dist/server/live-dev.d.ts.map +1 -0
- package/dist/server/live-dev.js +313 -0
- package/dist/server/live-dev.js.map +1 -0
- package/dist/server/live-manifest.d.ts +23 -0
- package/dist/server/live-manifest.d.ts.map +1 -0
- package/dist/server/live-manifest.js +7 -0
- package/dist/server/live-manifest.js.map +1 -0
- package/dist/server/live-prod.d.ts +30 -0
- package/dist/server/live-prod.d.ts.map +1 -0
- package/dist/server/live-prod.js +97 -0
- package/dist/server/live-prod.js.map +1 -0
- package/dist/server/live-routes.d.ts +72 -0
- package/dist/server/live-routes.d.ts.map +1 -0
- package/dist/server/live-routes.js +274 -0
- package/dist/server/live-routes.js.map +1 -0
- package/dist/server/live-web.d.ts +16 -0
- package/dist/server/live-web.d.ts.map +1 -0
- package/dist/server/live-web.js +159 -0
- package/dist/server/live-web.js.map +1 -0
- package/dist/server/live.d.ts +138 -0
- package/dist/server/live.d.ts.map +1 -0
- package/dist/server/live.js +542 -0
- package/dist/server/live.js.map +1 -0
- package/dist/server/middleware-node.d.ts +48 -0
- package/dist/server/middleware-node.d.ts.map +1 -0
- package/dist/server/middleware-node.js +167 -0
- package/dist/server/middleware-node.js.map +1 -0
- package/dist/server/middleware-runtime.d.ts +97 -0
- package/dist/server/middleware-runtime.d.ts.map +1 -0
- package/dist/server/middleware-runtime.js +447 -0
- package/dist/server/middleware-runtime.js.map +1 -0
- package/dist/server/middleware.d.ts +145 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +365 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/ppr.d.ts +22 -0
- package/dist/server/ppr.d.ts.map +1 -0
- package/dist/server/ppr.js +58 -0
- package/dist/server/ppr.js.map +1 -0
- package/dist/server/scan.d.ts +48 -0
- package/dist/server/scan.d.ts.map +1 -0
- package/dist/server/scan.js +161 -0
- package/dist/server/scan.js.map +1 -0
- package/dist/server/server-components.d.ts +65 -0
- package/dist/server/server-components.d.ts.map +1 -0
- package/dist/server/server-components.js +215 -0
- package/dist/server/server-components.js.map +1 -0
- package/dist/terminal.d.ts +5 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +5 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +5 -0
- package/dist/testing.js.map +1 -0
- package/dist/vite-plugin.d.ts +51 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +403 -0
- package/dist/vite-plugin.js.map +1 -0
- package/package.json +130 -4
- package/src/cli/build.ts +182 -0
- package/src/cli/config.ts +72 -0
- package/src/cli/dev.ts +54 -0
- package/src/cli/index.ts +185 -0
- package/src/cli/run.ts +124 -0
- package/src/cli/start.ts +194 -0
- package/src/cli/ui.ts +93 -0
- package/src/client.tsx +122 -0
- package/src/config.ts +155 -0
- package/src/context.ts +69 -0
- package/src/dev-errors.ts +167 -0
- package/src/devtools.tsx +419 -0
- package/src/frame-mirror.ts +145 -0
- package/src/frame-protocol.ts +435 -0
- package/src/history.ts +201 -0
- package/src/index.ts +9 -0
- package/src/link.tsx +108 -0
- package/src/live-player.ts +449 -0
- package/src/live-protocol.ts +317 -0
- package/src/live-stub.tsx +32 -0
- package/src/mcp/cli.ts +188 -0
- package/src/mcp/frame.ts +224 -0
- package/src/mcp/index.ts +15 -0
- package/src/mcp/inspect.ts +445 -0
- package/src/mcp/keys.ts +86 -0
- package/src/mcp/logs.ts +225 -0
- package/src/mcp/server.ts +595 -0
- package/src/mcp/session.ts +821 -0
- package/src/navigation-errors.ts +60 -0
- package/src/navigation.ts +44 -0
- package/src/router.tsx +497 -0
- package/src/routing.ts +344 -0
- package/src/server/adapters/build-step.ts +135 -0
- package/src/server/adapters/bun.ts +92 -0
- package/src/server/adapters/bundle.ts +97 -0
- package/src/server/adapters/cloudflare.ts +111 -0
- package/src/server/adapters/index.ts +29 -0
- package/src/server/adapters/runtime-node.ts +34 -0
- package/src/server/adapters/runtime.ts +145 -0
- package/src/server/adapters/shared.ts +159 -0
- package/src/server/adapters/static.ts +68 -0
- package/src/server/adapters/vercel.ts +149 -0
- package/src/server/bun-jsx.ts +65 -0
- package/src/server/cache-route.ts +139 -0
- package/src/server/cache.ts +498 -0
- package/src/server/frames.ts +326 -0
- package/src/server/http.ts +467 -0
- package/src/server/jsx-dev-runtime.ts +9 -0
- package/src/server/jsx-runtime.ts +13 -0
- package/src/server/live-app.tsx +374 -0
- package/src/server/live-build.ts +258 -0
- package/src/server/live-dev.ts +357 -0
- package/src/server/live-manifest.ts +25 -0
- package/src/server/live-prod.ts +120 -0
- package/src/server/live-routes.ts +298 -0
- package/src/server/live-web.ts +170 -0
- package/src/server/live.ts +551 -0
- package/src/server/middleware-node.ts +168 -0
- package/src/server/middleware-runtime.ts +478 -0
- package/src/server/middleware.ts +451 -0
- package/src/server/ppr.ts +62 -0
- package/src/server/scan.ts +190 -0
- package/src/server/server-components.ts +224 -0
- package/src/terminal.ts +5 -0
- package/src/testing.ts +5 -0
- package/src/vite-plugin.ts +413 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@textjs/app/frame-protocol` — the wire format `text dev` uses to mirror a
|
|
3
|
+
* running app's console frames to editors (the VS Code Live Preview) and to
|
|
4
|
+
* forward keyboard input back.
|
|
5
|
+
*
|
|
6
|
+
* Browser tab ──(Vite HMR socket: `textjs:frame`)──▶ dev server ──(SSE `/__textjs/frames`)──▶ editor
|
|
7
|
+
* Editor ──(POST `/__textjs/input`)──▶ dev server ──(HMR: `textjs:input`)──▶ browser tab
|
|
8
|
+
*
|
|
9
|
+
* Frames are row deltas: only rows whose spans changed since the previous
|
|
10
|
+
* message are sent, each with a small per-message style table. Pure and
|
|
11
|
+
* dependency-free so the editor bundle can share it.
|
|
12
|
+
*/
|
|
13
|
+
export const FRAME_PROTOCOL_VERSION = 1;
|
|
14
|
+
/** Server-sent events stream of {@link WireFrame} messages (dev only, loopback only). */
|
|
15
|
+
export const FRAMES_PATH = "/__textjs/frames";
|
|
16
|
+
/** `POST` an {@link InputMessage} as JSON. */
|
|
17
|
+
export const INPUT_PATH = "/__textjs/input";
|
|
18
|
+
/** `GET` a {@link DevStatus} JSON document. */
|
|
19
|
+
export const STATUS_PATH = "/__textjs/status";
|
|
20
|
+
/** Browser → server: an encoded frame. */
|
|
21
|
+
export const HMR_FRAME_EVENT = "textjs:frame";
|
|
22
|
+
/** Server → browser: `{ active: boolean }`, whether anyone is watching. */
|
|
23
|
+
export const HMR_MIRROR_EVENT = "textjs:mirror";
|
|
24
|
+
/** Server → browser: an {@link InputMessage}. */
|
|
25
|
+
export const HMR_INPUT_EVENT = "textjs:input";
|
|
26
|
+
/** Browser → server: sent on boot and reconnect; the server replies with {@link HMR_MIRROR_EVENT}. */
|
|
27
|
+
export const HMR_HELLO_EVENT = "textjs:hello";
|
|
28
|
+
/** Required on `POST /__textjs/input` (with a JSON body) so cross-site simple requests are rejected. */
|
|
29
|
+
export const MIRROR_HEADER = "x-textjs-mirror";
|
|
30
|
+
export const FLAG_BOLD = 1;
|
|
31
|
+
export const FLAG_DIM = 2;
|
|
32
|
+
export const FLAG_ITALIC = 4;
|
|
33
|
+
export const FLAG_UNDERLINE = 8;
|
|
34
|
+
export const FLAG_STRIKETHROUGH = 16;
|
|
35
|
+
export const FLAG_INVERSE = 32;
|
|
36
|
+
export const FLAG_ALLOW_LINK = 64;
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Spans
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
export function spanFlags(s) {
|
|
41
|
+
return ((s.bold ? FLAG_BOLD : 0) |
|
|
42
|
+
(s.dim ? FLAG_DIM : 0) |
|
|
43
|
+
(s.italic ? FLAG_ITALIC : 0) |
|
|
44
|
+
(s.underline ? FLAG_UNDERLINE : 0) |
|
|
45
|
+
(s.strikethrough ? FLAG_STRIKETHROUGH : 0) |
|
|
46
|
+
(s.inverse ? FLAG_INVERSE : 0) |
|
|
47
|
+
(s.allowLink ? FLAG_ALLOW_LINK : 0));
|
|
48
|
+
}
|
|
49
|
+
/** A {@link StyledSpan} rebuilt from wire data. Packed colors are not transmitted (they read `0`). */
|
|
50
|
+
export function toStyledSpan(text, width, style) {
|
|
51
|
+
const [fgCss, bgCss, f] = style;
|
|
52
|
+
return {
|
|
53
|
+
text,
|
|
54
|
+
width,
|
|
55
|
+
fg: 0,
|
|
56
|
+
bg: 0,
|
|
57
|
+
attrs: f,
|
|
58
|
+
fgCss,
|
|
59
|
+
bgCss,
|
|
60
|
+
bold: (f & FLAG_BOLD) !== 0,
|
|
61
|
+
dim: (f & FLAG_DIM) !== 0,
|
|
62
|
+
italic: (f & FLAG_ITALIC) !== 0,
|
|
63
|
+
underline: (f & FLAG_UNDERLINE) !== 0,
|
|
64
|
+
strikethrough: (f & FLAG_STRIKETHROUGH) !== 0,
|
|
65
|
+
inverse: (f & FLAG_INVERSE) !== 0,
|
|
66
|
+
allowLink: (f & FLAG_ALLOW_LINK) !== 0,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function rowKey(spans) {
|
|
70
|
+
let k = "";
|
|
71
|
+
for (const s of spans)
|
|
72
|
+
k += `${s.fgCss ?? ""}\u0001${s.bgCss ?? ""}\u0001${spanFlags(s)}\u0001${s.width}\u0001${s.text}\u0002`;
|
|
73
|
+
return k;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Stateful encoder: the first call (and the first after `reset()` or a resize)
|
|
77
|
+
* emits a full frame, later calls emit only changed rows. Returns `null` when
|
|
78
|
+
* nothing changed and no meta changed.
|
|
79
|
+
*/
|
|
80
|
+
export class FrameEncoder {
|
|
81
|
+
keys = [];
|
|
82
|
+
width = -1;
|
|
83
|
+
height = -1;
|
|
84
|
+
seq = 0;
|
|
85
|
+
metaKey = "";
|
|
86
|
+
reset() {
|
|
87
|
+
this.keys = [];
|
|
88
|
+
this.width = -1;
|
|
89
|
+
this.height = -1;
|
|
90
|
+
this.metaKey = "";
|
|
91
|
+
}
|
|
92
|
+
encode(frame, options = {}) {
|
|
93
|
+
const full = frame.width !== this.width || frame.height !== this.height;
|
|
94
|
+
if (full) {
|
|
95
|
+
this.width = frame.width;
|
|
96
|
+
this.height = frame.height;
|
|
97
|
+
this.keys = new Array(frame.height).fill("\u0000");
|
|
98
|
+
}
|
|
99
|
+
const styles = [];
|
|
100
|
+
const styleIds = new Map();
|
|
101
|
+
const rows = [];
|
|
102
|
+
for (let y = 0; y < frame.height; y++) {
|
|
103
|
+
const spans = frame.rows[y] ?? [];
|
|
104
|
+
const key = rowKey(spans);
|
|
105
|
+
if (!full && key === this.keys[y])
|
|
106
|
+
continue;
|
|
107
|
+
this.keys[y] = key;
|
|
108
|
+
const wire = [];
|
|
109
|
+
for (const s of spans) {
|
|
110
|
+
const flags = spanFlags(s);
|
|
111
|
+
const sk = `${s.fgCss ?? ""}\u0001${s.bgCss ?? ""}\u0001${flags}`;
|
|
112
|
+
let id = styleIds.get(sk);
|
|
113
|
+
if (id === undefined) {
|
|
114
|
+
id = styles.length;
|
|
115
|
+
styles.push([s.fgCss, s.bgCss, flags]);
|
|
116
|
+
styleIds.set(sk, id);
|
|
117
|
+
}
|
|
118
|
+
wire.push(s.width === s.text.length ? [s.text, id] : [s.text, id, s.width]);
|
|
119
|
+
}
|
|
120
|
+
rows.push([y, wire]);
|
|
121
|
+
}
|
|
122
|
+
const metaKey = options.meta ? JSON.stringify(options.meta) : "";
|
|
123
|
+
const metaChanged = metaKey !== this.metaKey;
|
|
124
|
+
this.metaKey = metaKey;
|
|
125
|
+
if (rows.length === 0 && !metaChanged)
|
|
126
|
+
return null;
|
|
127
|
+
const out = { v: FRAME_PROTOCOL_VERSION, seq: ++this.seq, width: frame.width, height: frame.height, full, styles, rows };
|
|
128
|
+
if (options.source !== undefined)
|
|
129
|
+
out.source = options.source;
|
|
130
|
+
if (options.meta)
|
|
131
|
+
out.meta = options.meta;
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Encode a complete frame without delta state (for late subscribers). */
|
|
136
|
+
export function encodeFullFrame(frame, options = {}) {
|
|
137
|
+
const out = new FrameEncoder().encode(frame, options);
|
|
138
|
+
if (options.seq !== undefined)
|
|
139
|
+
out.seq = options.seq;
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
/** Applies {@link WireFrame} messages to rebuild the current {@link StyledFrame}. */
|
|
143
|
+
export class FrameDecoder {
|
|
144
|
+
frame = null;
|
|
145
|
+
meta = {};
|
|
146
|
+
seq = 0;
|
|
147
|
+
/** Returns the updated frame, or `null` when a delta arrives before any full frame. */
|
|
148
|
+
apply(msg) {
|
|
149
|
+
if (msg.v !== FRAME_PROTOCOL_VERSION)
|
|
150
|
+
throw new Error(`Unsupported frame protocol v${String(msg.v)} (expected v${FRAME_PROTOCOL_VERSION}).`);
|
|
151
|
+
let rows;
|
|
152
|
+
if (msg.full || this.frame === null || this.frame.width !== msg.width || this.frame.height !== msg.height) {
|
|
153
|
+
if (!msg.full)
|
|
154
|
+
return null;
|
|
155
|
+
rows = Array.from({ length: msg.height }, () => []);
|
|
156
|
+
}
|
|
157
|
+
else
|
|
158
|
+
rows = this.frame.rows.slice();
|
|
159
|
+
for (const [y, spans] of msg.rows) {
|
|
160
|
+
if (y < 0 || y >= msg.height)
|
|
161
|
+
continue;
|
|
162
|
+
rows[y] = spans.map(([text, id, width]) => toStyledSpan(text, width ?? text.length, msg.styles[id] ?? [null, null, 0]));
|
|
163
|
+
}
|
|
164
|
+
this.frame = { width: msg.width, height: msg.height, rows };
|
|
165
|
+
this.seq = msg.seq;
|
|
166
|
+
if (msg.meta)
|
|
167
|
+
this.meta = { ...this.meta, ...msg.meta };
|
|
168
|
+
return this.frame;
|
|
169
|
+
}
|
|
170
|
+
reset() {
|
|
171
|
+
this.frame = null;
|
|
172
|
+
this.meta = {};
|
|
173
|
+
this.seq = 0;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Whether frames from a tab with `next` meta should become the mirrored
|
|
178
|
+
* ("active") source instead of the current one. A focused tab is never
|
|
179
|
+
* displaced by an unfocused one (background tabs that animate keep sending
|
|
180
|
+
* frames), so the preview and forwarded keystrokes stay on the tab in use.
|
|
181
|
+
*/
|
|
182
|
+
export function shouldSwitchSource(current, next) {
|
|
183
|
+
return current === null || next.focused === true || current.focused !== true;
|
|
184
|
+
}
|
|
185
|
+
/** Plain text of a frame (trailing whitespace trimmed), for tests and copy. */
|
|
186
|
+
export function frameToText(frame) {
|
|
187
|
+
return frame.rows
|
|
188
|
+
.map((r) => r.map((s) => s.text).join("").replace(/\s+$/, ""))
|
|
189
|
+
.join("\n")
|
|
190
|
+
.replace(/\n+$/, "");
|
|
191
|
+
}
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
// Validation
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
const MAX_TEXT = 64 * 1024;
|
|
196
|
+
function isObj(v) {
|
|
197
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
198
|
+
}
|
|
199
|
+
/** Validate an untrusted {@link InputMessage}. Returns a clean copy or `null`. */
|
|
200
|
+
export function parseInputMessage(value) {
|
|
201
|
+
if (!isObj(value))
|
|
202
|
+
return null;
|
|
203
|
+
const b = (k) => value[k] === true;
|
|
204
|
+
switch (value.type) {
|
|
205
|
+
case "key": {
|
|
206
|
+
const key = value.key;
|
|
207
|
+
if (typeof key !== "string" || key.length === 0 || key.length > 32)
|
|
208
|
+
return null;
|
|
209
|
+
const code = typeof value.code === "string" && value.code.length <= 32 ? value.code : undefined;
|
|
210
|
+
const msg = { type: "key", key, ctrlKey: b("ctrlKey"), metaKey: b("metaKey"), shiftKey: b("shiftKey"), altKey: b("altKey") };
|
|
211
|
+
if (code !== undefined)
|
|
212
|
+
msg.code = code;
|
|
213
|
+
if (b("repeat"))
|
|
214
|
+
msg.repeat = true;
|
|
215
|
+
return msg;
|
|
216
|
+
}
|
|
217
|
+
case "paste":
|
|
218
|
+
return typeof value.text === "string" && value.text.length <= MAX_TEXT ? { type: "paste", text: value.text } : null;
|
|
219
|
+
case "wheel": {
|
|
220
|
+
const n = (k) => (typeof value[k] === "number" && Number.isFinite(value[k]) ? Math.max(-10_000, Math.min(10_000, value[k])) : 0);
|
|
221
|
+
const mode = value.deltaMode === 1 || value.deltaMode === 2 ? value.deltaMode : 0;
|
|
222
|
+
return { type: "wheel", deltaX: n("deltaX"), deltaY: n("deltaY"), deltaMode: mode };
|
|
223
|
+
}
|
|
224
|
+
case "navigate": {
|
|
225
|
+
const href = value.href;
|
|
226
|
+
// Same-app paths only: never let a forwarded message send the tab elsewhere.
|
|
227
|
+
if (typeof href !== "string" || href.length > 2048 || !href.startsWith("/") || href.startsWith("//") || href.includes("\\"))
|
|
228
|
+
return null;
|
|
229
|
+
return { type: "navigate", href };
|
|
230
|
+
}
|
|
231
|
+
default:
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const HEX_COLOR = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
|
|
236
|
+
function isCssColor(v) {
|
|
237
|
+
return v === null || (typeof v === "string" && HEX_COLOR.test(v));
|
|
238
|
+
}
|
|
239
|
+
/** Largest grid side, style table and total span text accepted in one frame. */
|
|
240
|
+
export const MAX_GRID = 1000;
|
|
241
|
+
export const MAX_STYLES = 4096;
|
|
242
|
+
export const MAX_FRAME_TEXT = 1024 * 1024;
|
|
243
|
+
export const MAX_TITLE = 512;
|
|
244
|
+
export const MAX_PATH = 2048;
|
|
245
|
+
const isInt = (v, min, max) => Number.isInteger(v) && v >= min && v <= max;
|
|
246
|
+
/** A same-app pathname: starts with one `/`, no backslashes, bounded. */
|
|
247
|
+
export function isAppPath(v) {
|
|
248
|
+
return typeof v === "string" && v.length <= MAX_PATH && v.startsWith("/") && !v.startsWith("//") && !v.includes("\\");
|
|
249
|
+
}
|
|
250
|
+
/** `""` or `/segment[/segment…]` without a trailing slash. */
|
|
251
|
+
export function isBasePath(v) {
|
|
252
|
+
return v === "" || (isAppPath(v) && v.length <= 256 && !v.endsWith("/") && !/[?#]/.test(v));
|
|
253
|
+
}
|
|
254
|
+
/** Validate untrusted {@link FrameMeta}; returns a copy of the known fields or `null`. */
|
|
255
|
+
export function parseFrameMeta(value) {
|
|
256
|
+
if (!isObj(value))
|
|
257
|
+
return null;
|
|
258
|
+
const meta = {};
|
|
259
|
+
if (value.path !== undefined) {
|
|
260
|
+
if (!isAppPath(value.path))
|
|
261
|
+
return null;
|
|
262
|
+
meta.path = value.path;
|
|
263
|
+
}
|
|
264
|
+
if (value.title !== undefined) {
|
|
265
|
+
if (typeof value.title !== "string")
|
|
266
|
+
return null;
|
|
267
|
+
meta.title = value.title.slice(0, MAX_TITLE);
|
|
268
|
+
}
|
|
269
|
+
if (value.focused !== undefined) {
|
|
270
|
+
if (typeof value.focused !== "boolean")
|
|
271
|
+
return null;
|
|
272
|
+
meta.focused = value.focused;
|
|
273
|
+
}
|
|
274
|
+
return meta;
|
|
275
|
+
}
|
|
276
|
+
/** Validate a frame source id (one per browser tab). */
|
|
277
|
+
export function isSourceId(v) {
|
|
278
|
+
return typeof v === "string" && v.length >= 1 && v.length <= 64;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Validate an untrusted {@link WireFrame} (structure, bounds and hex-only
|
|
282
|
+
* colors) and return a clean copy, or `null`. Rows must lie inside the grid,
|
|
283
|
+
* spans must have a positive width that fits it and reference a style, and
|
|
284
|
+
* `meta` keeps only `path`, `title` and `focused`.
|
|
285
|
+
*/
|
|
286
|
+
export function parseWireFrame(value) {
|
|
287
|
+
if (!isObj(value))
|
|
288
|
+
return null;
|
|
289
|
+
if (value.v !== FRAME_PROTOCOL_VERSION || !isInt(value.seq, 0, Number.MAX_SAFE_INTEGER) || typeof value.full !== "boolean")
|
|
290
|
+
return null;
|
|
291
|
+
const { width, height } = value;
|
|
292
|
+
if (!isInt(width, 1, MAX_GRID) || !isInt(height, 1, MAX_GRID))
|
|
293
|
+
return null;
|
|
294
|
+
if (value.source !== undefined && !isSourceId(value.source))
|
|
295
|
+
return null;
|
|
296
|
+
if (!Array.isArray(value.styles) || !Array.isArray(value.rows))
|
|
297
|
+
return null;
|
|
298
|
+
if (value.styles.length > MAX_STYLES || value.rows.length > height)
|
|
299
|
+
return null;
|
|
300
|
+
const styles = [];
|
|
301
|
+
for (const s of value.styles) {
|
|
302
|
+
if (!Array.isArray(s) || s.length !== 3)
|
|
303
|
+
return null;
|
|
304
|
+
if (!isCssColor(s[0]) || !isCssColor(s[1]) || !isInt(s[2], 0, 0xffff))
|
|
305
|
+
return null;
|
|
306
|
+
styles.push([s[0], s[1], s[2]]);
|
|
307
|
+
}
|
|
308
|
+
let text = 0;
|
|
309
|
+
const rows = [];
|
|
310
|
+
for (const r of value.rows) {
|
|
311
|
+
if (!Array.isArray(r) || r.length !== 2 || !isInt(r[0], 0, height - 1) || !Array.isArray(r[1]))
|
|
312
|
+
return null;
|
|
313
|
+
const spans = r[1];
|
|
314
|
+
if (spans.length > width)
|
|
315
|
+
return null;
|
|
316
|
+
const out = [];
|
|
317
|
+
for (const sp of spans) {
|
|
318
|
+
if (!Array.isArray(sp) || (sp.length !== 2 && sp.length !== 3))
|
|
319
|
+
return null;
|
|
320
|
+
const [t, id, w] = sp;
|
|
321
|
+
if (typeof t !== "string" || !isInt(id, 0, styles.length - 1))
|
|
322
|
+
return null;
|
|
323
|
+
if (sp.length === 3 ? !isInt(w, 1, width) : t.length < 1 || t.length > width)
|
|
324
|
+
return null;
|
|
325
|
+
text += t.length;
|
|
326
|
+
if (text > MAX_FRAME_TEXT)
|
|
327
|
+
return null;
|
|
328
|
+
out.push(sp.length === 3 ? [t, id, w] : [t, id]);
|
|
329
|
+
}
|
|
330
|
+
rows.push([r[0], out]);
|
|
331
|
+
}
|
|
332
|
+
const frame = { v: FRAME_PROTOCOL_VERSION, seq: value.seq, width, height, full: value.full, styles, rows };
|
|
333
|
+
if (value.source !== undefined)
|
|
334
|
+
frame.source = value.source;
|
|
335
|
+
if (value.meta !== undefined) {
|
|
336
|
+
const meta = parseFrameMeta(value.meta);
|
|
337
|
+
if (!meta)
|
|
338
|
+
return null;
|
|
339
|
+
frame.meta = meta;
|
|
340
|
+
}
|
|
341
|
+
return frame;
|
|
342
|
+
}
|
|
343
|
+
/** Whether `value` is a valid {@link WireFrame} (see {@link parseWireFrame}). */
|
|
344
|
+
export function isWireFrame(value) {
|
|
345
|
+
return parseWireFrame(value) !== null;
|
|
346
|
+
}
|
|
347
|
+
/** Validate an untrusted {@link DevStatus} (from `/__textjs/status` or the stream). */
|
|
348
|
+
export function parseDevStatus(value) {
|
|
349
|
+
if (!isObj(value) || value.name !== "textjs")
|
|
350
|
+
return null;
|
|
351
|
+
if (typeof value.version !== "string" || value.version.length > 64 || typeof value.root !== "string" || value.root.length > 4096)
|
|
352
|
+
return null;
|
|
353
|
+
const count = (v) => (isInt(v, 0, 1_000_000) ? v : 0);
|
|
354
|
+
let grid = null;
|
|
355
|
+
if (isObj(value.grid) && isInt(value.grid.width, 1, MAX_GRID) && isInt(value.grid.height, 1, MAX_GRID))
|
|
356
|
+
grid = { width: value.grid.width, height: value.grid.height };
|
|
357
|
+
return {
|
|
358
|
+
name: "textjs",
|
|
359
|
+
version: value.version,
|
|
360
|
+
root: value.root,
|
|
361
|
+
clients: count(value.clients),
|
|
362
|
+
sources: count(value.sources),
|
|
363
|
+
watchers: count(value.watchers),
|
|
364
|
+
grid,
|
|
365
|
+
path: isAppPath(value.path) ? value.path : null,
|
|
366
|
+
basePath: isBasePath(value.basePath) ? value.basePath : "",
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=frame-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-protocol.js","sourceRoot":"","sources":["../src/frame-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router histories: `window.history` (pushState / replaceState / popstate)
|
|
3
|
+
* and an in-memory history for tests and embedded previews.
|
|
4
|
+
*/
|
|
5
|
+
export interface RouterLocation {
|
|
6
|
+
pathname: string;
|
|
7
|
+
/** Including the leading `?` (or `""`). */
|
|
8
|
+
search: string;
|
|
9
|
+
/** Including the leading `#` (or `""`). */
|
|
10
|
+
hash: string;
|
|
11
|
+
/** `pathname + search + hash`. */
|
|
12
|
+
href: string;
|
|
13
|
+
/** Unique per history entry. */
|
|
14
|
+
key: string;
|
|
15
|
+
}
|
|
16
|
+
export type HistoryAction = "push" | "replace" | "pop";
|
|
17
|
+
export interface RouterHistory {
|
|
18
|
+
readonly location: RouterLocation;
|
|
19
|
+
readonly action: HistoryAction;
|
|
20
|
+
push(href: string, state?: unknown): void;
|
|
21
|
+
replace(href: string, state?: unknown): void;
|
|
22
|
+
go(delta: number): void;
|
|
23
|
+
back(): void;
|
|
24
|
+
forward(): void;
|
|
25
|
+
/** Subscribe to location changes (returns an unsubscribe function). */
|
|
26
|
+
listen(listener: (location: RouterLocation, action: HistoryAction) => void): () => void;
|
|
27
|
+
/** Stable getter for `useSyncExternalStore`. */
|
|
28
|
+
getLocation(): RouterLocation;
|
|
29
|
+
/** Turn an app href into a document URL (applies `basePath`). */
|
|
30
|
+
createHref(href: string): string;
|
|
31
|
+
dispose?(): void;
|
|
32
|
+
}
|
|
33
|
+
/** Parse an app-relative href against the current pathname. */
|
|
34
|
+
export declare function parseHref(href: string, from?: string): Omit<RouterLocation, "key">;
|
|
35
|
+
/** `true` for absolute URLs on another origin (`https://…`, `mailto:`). */
|
|
36
|
+
export declare function isExternalHref(href: string, origin?: string): boolean;
|
|
37
|
+
export interface MemoryHistory extends RouterHistory {
|
|
38
|
+
readonly entries: readonly RouterLocation[];
|
|
39
|
+
readonly index: number;
|
|
40
|
+
}
|
|
41
|
+
export interface MemoryHistoryOptions {
|
|
42
|
+
initialEntries?: string[];
|
|
43
|
+
initialIndex?: number;
|
|
44
|
+
}
|
|
45
|
+
/** An in-memory history: full App Router navigation without touching `window.location`. */
|
|
46
|
+
export declare function createMemoryHistory(initial?: string | MemoryHistoryOptions): MemoryHistory;
|
|
47
|
+
export interface BrowserHistoryOptions {
|
|
48
|
+
/** Mount point, e.g. `"/console"`. */
|
|
49
|
+
basePath?: string;
|
|
50
|
+
window?: Window;
|
|
51
|
+
}
|
|
52
|
+
/** Sync the App Router with `window.location` and the browser Back / Forward buttons. */
|
|
53
|
+
export declare function createBrowserHistory(options?: BrowserHistoryOptions): RouterHistory;
|
|
54
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;IAChB,uEAAuE;IACvE,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxF,gDAAgD;IAChD,WAAW,IAAI,cAAc,CAAC;IAC9B,iEAAiE;IACjE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB;AAKD,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAM/E;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAQrE;AAiBD,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAM,GAAG,oBAA0B,GAAG,aAAa,CAkD/F;AAED,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,aAAa,CAsDvF"}
|
package/dist/history.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router histories: `window.history` (pushState / replaceState / popstate)
|
|
3
|
+
* and an in-memory history for tests and embedded previews.
|
|
4
|
+
*/
|
|
5
|
+
import { normalizeBasePath } from "./config.js";
|
|
6
|
+
let keyCounter = 0;
|
|
7
|
+
const nextKey = () => (++keyCounter).toString(36);
|
|
8
|
+
/** Parse an app-relative href against the current pathname. */
|
|
9
|
+
export function parseHref(href, from = "/") {
|
|
10
|
+
const url = new URL(href, `http://text.local${from.startsWith("/") ? from : `/${from}`}`);
|
|
11
|
+
let pathname = url.pathname.replace(/\/{2,}/g, "/");
|
|
12
|
+
if (pathname.length > 1 && pathname.endsWith("/"))
|
|
13
|
+
pathname = pathname.slice(0, -1);
|
|
14
|
+
const search = url.search === "?" ? "" : url.search;
|
|
15
|
+
return { pathname, search, hash: url.hash, href: pathname + search + url.hash };
|
|
16
|
+
}
|
|
17
|
+
/** `true` for absolute URLs on another origin (`https://…`, `mailto:`). */
|
|
18
|
+
export function isExternalHref(href, origin) {
|
|
19
|
+
if (!/^[a-z][a-z0-9+.-]*:/i.test(href) && !href.startsWith("//"))
|
|
20
|
+
return false;
|
|
21
|
+
if (origin === undefined)
|
|
22
|
+
return true;
|
|
23
|
+
try {
|
|
24
|
+
return new URL(href, origin).origin !== origin;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function makeLocation(href, from) {
|
|
31
|
+
return { ...parseHref(href, from), key: nextKey() };
|
|
32
|
+
}
|
|
33
|
+
class Emitter {
|
|
34
|
+
listeners = new Set();
|
|
35
|
+
listen(listener) {
|
|
36
|
+
this.listeners.add(listener);
|
|
37
|
+
return () => this.listeners.delete(listener);
|
|
38
|
+
}
|
|
39
|
+
emit(location, action) {
|
|
40
|
+
for (const l of [...this.listeners])
|
|
41
|
+
l(location, action);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** An in-memory history: full App Router navigation without touching `window.location`. */
|
|
45
|
+
export function createMemoryHistory(initial = "/") {
|
|
46
|
+
const opts = typeof initial === "string" ? { initialEntries: [initial] } : initial;
|
|
47
|
+
const raw = opts.initialEntries && opts.initialEntries.length > 0 ? opts.initialEntries : ["/"];
|
|
48
|
+
let entries = raw.map((h) => makeLocation(h, "/"));
|
|
49
|
+
let index = Math.max(0, Math.min(entries.length - 1, opts.initialIndex ?? entries.length - 1));
|
|
50
|
+
let action = "pop";
|
|
51
|
+
const emitter = new Emitter();
|
|
52
|
+
const current = () => entries[index];
|
|
53
|
+
const go = (delta) => {
|
|
54
|
+
const next = Math.max(0, Math.min(entries.length - 1, index + delta));
|
|
55
|
+
if (next === index)
|
|
56
|
+
return;
|
|
57
|
+
index = next;
|
|
58
|
+
action = "pop";
|
|
59
|
+
emitter.emit(current(), action);
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
get location() {
|
|
63
|
+
return current();
|
|
64
|
+
},
|
|
65
|
+
get action() {
|
|
66
|
+
return action;
|
|
67
|
+
},
|
|
68
|
+
get entries() {
|
|
69
|
+
return entries;
|
|
70
|
+
},
|
|
71
|
+
get index() {
|
|
72
|
+
return index;
|
|
73
|
+
},
|
|
74
|
+
getLocation: () => current(),
|
|
75
|
+
createHref: (href) => parseHref(href, current().pathname).href,
|
|
76
|
+
push(href) {
|
|
77
|
+
const loc = makeLocation(href, current().pathname);
|
|
78
|
+
entries = [...entries.slice(0, index + 1), loc];
|
|
79
|
+
index = entries.length - 1;
|
|
80
|
+
action = "push";
|
|
81
|
+
emitter.emit(loc, action);
|
|
82
|
+
},
|
|
83
|
+
replace(href) {
|
|
84
|
+
const loc = makeLocation(href, current().pathname);
|
|
85
|
+
entries = entries.slice();
|
|
86
|
+
entries[index] = loc;
|
|
87
|
+
action = "replace";
|
|
88
|
+
emitter.emit(loc, action);
|
|
89
|
+
},
|
|
90
|
+
go,
|
|
91
|
+
back: () => go(-1),
|
|
92
|
+
forward: () => go(1),
|
|
93
|
+
listen: (l) => emitter.listen(l),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Sync the App Router with `window.location` and the browser Back / Forward buttons. */
|
|
97
|
+
export function createBrowserHistory(options = {}) {
|
|
98
|
+
const win = options.window ?? (typeof window !== "undefined" ? window : undefined);
|
|
99
|
+
if (!win)
|
|
100
|
+
return createMemoryHistory("/");
|
|
101
|
+
const base = normalizeBasePath(options.basePath);
|
|
102
|
+
const emitter = new Emitter();
|
|
103
|
+
let action = "pop";
|
|
104
|
+
const strip = (pathname) => {
|
|
105
|
+
if (base && (pathname === base || pathname.startsWith(`${base}/`)))
|
|
106
|
+
return pathname.slice(base.length) || "/";
|
|
107
|
+
return pathname;
|
|
108
|
+
};
|
|
109
|
+
const read = () => {
|
|
110
|
+
const l = win.location;
|
|
111
|
+
const state = win.history.state;
|
|
112
|
+
return { ...parseHref(strip(l.pathname) + l.search + l.hash, "/"), key: state?.__textjs ?? "default" };
|
|
113
|
+
};
|
|
114
|
+
let current = read();
|
|
115
|
+
const createHref = (href) => base + parseHref(href, current.pathname).href;
|
|
116
|
+
const onPop = () => {
|
|
117
|
+
current = read();
|
|
118
|
+
action = "pop";
|
|
119
|
+
emitter.emit(current, action);
|
|
120
|
+
};
|
|
121
|
+
win.addEventListener("popstate", onPop);
|
|
122
|
+
const write = (href, state, kind) => {
|
|
123
|
+
const key = nextKey();
|
|
124
|
+
const data = { ...(typeof state === "object" && state !== null ? state : {}), __textjs: key };
|
|
125
|
+
const url = createHref(href);
|
|
126
|
+
if (kind === "push")
|
|
127
|
+
win.history.pushState(data, "", url);
|
|
128
|
+
else
|
|
129
|
+
win.history.replaceState(data, "", url);
|
|
130
|
+
current = { ...parseHref(href, current.pathname), key };
|
|
131
|
+
action = kind;
|
|
132
|
+
emitter.emit(current, action);
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
get location() {
|
|
136
|
+
return current;
|
|
137
|
+
},
|
|
138
|
+
get action() {
|
|
139
|
+
return action;
|
|
140
|
+
},
|
|
141
|
+
getLocation: () => current,
|
|
142
|
+
createHref,
|
|
143
|
+
push: (href, state) => write(href, state, "push"),
|
|
144
|
+
replace: (href, state) => write(href, state, "replace"),
|
|
145
|
+
go: (delta) => win.history.go(delta),
|
|
146
|
+
back: () => win.history.back(),
|
|
147
|
+
forward: () => win.history.forward(),
|
|
148
|
+
listen: (l) => emitter.listen(l),
|
|
149
|
+
dispose: () => win.removeEventListener("popstate", onPop),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ▼ Text.js — The Console Framework for the Web.
|
|
3
|
+
*/
|
|
4
|
+
export * from "@textjs/react";
|
|
5
|
+
export { VERSION, ENGINE_NAME, BRAND_MARK } from "@textjs/core";
|
|
6
|
+
export { defineConfig, type TextConfig, type Metadata, type ViewportConfig, type Rewrite, type ProxyTarget } from "./config.js";
|
|
7
|
+
export { useAppTheme, type AppShellState } from "./context.js";
|
|
8
|
+
export type { PageProps, LayoutProps, ErrorComponentProps } from "./router.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAC7H,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ▼ Text.js — The Console Framework for the Web.
|
|
3
|
+
*/
|
|
4
|
+
export * from "@textjs/react";
|
|
5
|
+
export { VERSION, ENGINE_NAME, BRAND_MARK } from "@textjs/core";
|
|
6
|
+
export { defineConfig } from "./config.js";
|
|
7
|
+
export { useAppTheme } from "./context.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAuF,MAAM,UAAU,CAAC;AAC7H,OAAO,EAAE,WAAW,EAAsB,MAAM,WAAW,CAAC"}
|