@hypen-space/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/chunk-5va59f7m.js +22 -0
  2. package/dist/chunk-5va59f7m.js.map +9 -0
  3. package/dist/engine.d.ts +101 -0
  4. package/dist/events.d.ts +78 -0
  5. package/dist/index.browser.d.ts +13 -0
  6. package/dist/index.d.ts +33 -0
  7. package/dist/remote/index.d.ts +6 -0
  8. package/dist/router.d.ts +93 -0
  9. package/dist/src/app.js +160 -0
  10. package/dist/src/app.js.map +10 -0
  11. package/dist/src/context.js +114 -0
  12. package/dist/src/context.js.map +10 -0
  13. package/dist/src/engine.browser.js +130 -0
  14. package/dist/src/engine.browser.js.map +10 -0
  15. package/dist/src/engine.js +101 -0
  16. package/dist/src/engine.js.map +10 -0
  17. package/dist/src/events.js +72 -0
  18. package/dist/src/events.js.map +10 -0
  19. package/dist/src/index.browser.js +51 -0
  20. package/dist/src/index.browser.js.map +9 -0
  21. package/dist/src/index.js +55 -0
  22. package/dist/src/index.js.map +9 -0
  23. package/dist/src/remote/client.js +176 -0
  24. package/dist/src/remote/client.js.map +10 -0
  25. package/dist/src/remote/index.js +9 -0
  26. package/dist/src/remote/index.js.map +9 -0
  27. package/dist/src/remote/types.js +2 -0
  28. package/dist/src/remote/types.js.map +9 -0
  29. package/dist/src/renderer.js +58 -0
  30. package/dist/src/renderer.js.map +10 -0
  31. package/dist/src/router.js +189 -0
  32. package/dist/src/router.js.map +10 -0
  33. package/dist/src/state.js +226 -0
  34. package/dist/src/state.js.map +10 -0
  35. package/dist/state.d.ts +30 -0
  36. package/package.json +124 -0
  37. package/src/app.ts +330 -0
  38. package/src/context.ts +201 -0
  39. package/src/engine.browser.ts +245 -0
  40. package/src/engine.ts +208 -0
  41. package/src/events.ts +126 -0
  42. package/src/index.browser.ts +104 -0
  43. package/src/index.ts +126 -0
  44. package/src/remote/client.ts +274 -0
  45. package/src/remote/index.ts +17 -0
  46. package/src/remote/types.ts +51 -0
  47. package/src/renderer.ts +102 -0
  48. package/src/router.ts +311 -0
  49. package/src/state.ts +363 -0
@@ -0,0 +1,176 @@
1
+ import"../../chunk-5va59f7m.js";
2
+
3
+ // src/remote/client.ts
4
+ class RemoteEngine {
5
+ ws = null;
6
+ url;
7
+ state = "disconnected";
8
+ options;
9
+ reconnectAttempts = 0;
10
+ reconnectTimer = null;
11
+ patchCallbacks = [];
12
+ stateCallbacks = [];
13
+ connectionCallbacks = [];
14
+ disconnectionCallbacks = [];
15
+ errorCallbacks = [];
16
+ currentState = null;
17
+ currentRevision = 0;
18
+ moduleName = "";
19
+ constructor(url, options = {}) {
20
+ this.url = url;
21
+ this.options = {
22
+ autoReconnect: options.autoReconnect ?? true,
23
+ reconnectInterval: options.reconnectInterval ?? 3000,
24
+ maxReconnectAttempts: options.maxReconnectAttempts ?? 10
25
+ };
26
+ }
27
+ async connect() {
28
+ if (this.state === "connected" || this.state === "connecting") {
29
+ return;
30
+ }
31
+ this.state = "connecting";
32
+ return new Promise((resolve, reject) => {
33
+ try {
34
+ this.ws = new WebSocket(this.url);
35
+ this.ws.onopen = () => {
36
+ this.state = "connected";
37
+ this.reconnectAttempts = 0;
38
+ this.connectionCallbacks.forEach((cb) => cb());
39
+ resolve();
40
+ };
41
+ this.ws.onmessage = (event) => {
42
+ this.handleMessage(event.data);
43
+ };
44
+ this.ws.onerror = () => {
45
+ this.state = "error";
46
+ const error = new Error("WebSocket error");
47
+ this.errorCallbacks.forEach((cb) => cb(error));
48
+ reject(error);
49
+ };
50
+ this.ws.onclose = () => {
51
+ this.state = "disconnected";
52
+ this.disconnectionCallbacks.forEach((cb) => cb());
53
+ this.attemptReconnect();
54
+ };
55
+ } catch (error) {
56
+ this.state = "error";
57
+ reject(error);
58
+ }
59
+ });
60
+ }
61
+ disconnect() {
62
+ if (this.reconnectTimer) {
63
+ clearTimeout(this.reconnectTimer);
64
+ this.reconnectTimer = null;
65
+ }
66
+ if (this.ws) {
67
+ this.ws.close();
68
+ this.ws = null;
69
+ }
70
+ this.state = "disconnected";
71
+ }
72
+ dispatchAction(action, payload) {
73
+ if (this.state !== "connected" || !this.ws) {
74
+ console.warn("Cannot dispatch action: not connected");
75
+ return;
76
+ }
77
+ const message = {
78
+ type: "dispatchAction",
79
+ module: this.moduleName,
80
+ action,
81
+ payload
82
+ };
83
+ this.ws.send(JSON.stringify(message));
84
+ }
85
+ onPatches(callback) {
86
+ this.patchCallbacks.push(callback);
87
+ return this;
88
+ }
89
+ onStateUpdate(callback) {
90
+ this.stateCallbacks.push(callback);
91
+ return this;
92
+ }
93
+ onConnect(callback) {
94
+ this.connectionCallbacks.push(callback);
95
+ return this;
96
+ }
97
+ onDisconnect(callback) {
98
+ this.disconnectionCallbacks.push(callback);
99
+ return this;
100
+ }
101
+ onError(callback) {
102
+ this.errorCallbacks.push(callback);
103
+ return this;
104
+ }
105
+ getConnectionState() {
106
+ return this.state;
107
+ }
108
+ getCurrentState() {
109
+ return this.currentState;
110
+ }
111
+ getRevision() {
112
+ return this.currentRevision;
113
+ }
114
+ handleMessage(data) {
115
+ try {
116
+ const message = JSON.parse(data);
117
+ switch (message.type) {
118
+ case "initialTree":
119
+ this.handleInitialTree(message);
120
+ break;
121
+ case "patch":
122
+ this.handlePatch(message);
123
+ break;
124
+ case "stateUpdate":
125
+ this.currentState = message.state;
126
+ this.stateCallbacks.forEach((cb) => cb(message.state));
127
+ break;
128
+ }
129
+ } catch (error) {
130
+ console.error("Error handling remote message:", error);
131
+ this.errorCallbacks.forEach((cb) => cb(error instanceof Error ? error : new Error(String(error))));
132
+ }
133
+ }
134
+ handleInitialTree(message) {
135
+ this.moduleName = message.module;
136
+ this.currentState = message.state;
137
+ this.currentRevision = message.revision;
138
+ if (message.patches.length > 0) {
139
+ this.patchCallbacks.forEach((cb) => cb(message.patches));
140
+ }
141
+ this.stateCallbacks.forEach((cb) => cb(message.state));
142
+ }
143
+ handlePatch(message) {
144
+ if (message.revision <= this.currentRevision) {
145
+ console.warn(`Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`);
146
+ return;
147
+ }
148
+ this.currentRevision = message.revision;
149
+ if (message.patches.length > 0) {
150
+ this.patchCallbacks.forEach((cb) => cb(message.patches));
151
+ }
152
+ }
153
+ attemptReconnect() {
154
+ if (!this.options.autoReconnect) {
155
+ return;
156
+ }
157
+ if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {
158
+ console.error("Max reconnection attempts reached");
159
+ return;
160
+ }
161
+ this.reconnectAttempts++;
162
+ console.log(`Attempting to reconnect (${this.reconnectAttempts}/${this.options.maxReconnectAttempts})...`);
163
+ this.reconnectTimer = setTimeout(() => {
164
+ this.connect().catch((error) => {
165
+ console.error("Reconnection failed:", error);
166
+ });
167
+ }, this.options.reconnectInterval);
168
+ }
169
+ }
170
+ export {
171
+ RemoteEngine
172
+ };
173
+
174
+ export { RemoteEngine };
175
+
176
+ //# debugId=81B37709564BD73564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/remote/client.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * RemoteEngine - Connect to a remote Hypen app over WebSocket\n * Platform-agnostic client (uses standard WebSocket API)\n */\n\nimport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n} from \"./types.js\";\nimport type { Patch } from \"../engine.js\";\n\nexport type RemoteConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface RemoteEngineOptions {\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n}\n\n/**\n * Client-side engine that connects to a remote Hypen app\n */\nexport class RemoteEngine {\n private ws: WebSocket | null = null;\n private url: string;\n private state: RemoteConnectionState = \"disconnected\";\n private options: Required<RemoteEngineOptions>;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Callbacks\n private patchCallbacks: Array<(patches: Patch[]) => void> = [];\n private stateCallbacks: Array<(state: any) => void> = [];\n private connectionCallbacks: Array<() => void> = [];\n private disconnectionCallbacks: Array<() => void> = [];\n private errorCallbacks: Array<(error: Error) => void> = [];\n\n // State\n private currentState: any = null;\n private currentRevision = 0;\n private moduleName: string = \"\";\n\n constructor(url: string, options: RemoteEngineOptions = {}) {\n this.url = url;\n this.options = {\n autoReconnect: options.autoReconnect ?? true,\n reconnectInterval: options.reconnectInterval ?? 3000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n };\n }\n\n /**\n * Connect to the remote server\n */\n async connect(): Promise<void> {\n if (this.state === \"connected\" || this.state === \"connecting\") {\n return;\n }\n\n this.state = \"connecting\";\n\n return new Promise((resolve, reject) => {\n try {\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n this.state = \"connected\";\n this.reconnectAttempts = 0;\n this.connectionCallbacks.forEach((cb) => cb());\n resolve();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = () => {\n this.state = \"error\";\n const error = new Error(\"WebSocket error\");\n this.errorCallbacks.forEach((cb) => cb(error));\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.state = \"disconnected\";\n this.disconnectionCallbacks.forEach((cb) => cb());\n this.attemptReconnect();\n };\n } catch (error) {\n this.state = \"error\";\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the remote server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.state = \"disconnected\";\n }\n\n /**\n * Dispatch an action to the remote server\n */\n dispatchAction(action: string, payload?: any): void {\n if (this.state !== \"connected\" || !this.ws) {\n console.warn(\"Cannot dispatch action: not connected\");\n return;\n }\n\n const message: DispatchActionMessage = {\n type: \"dispatchAction\",\n module: this.moduleName,\n action,\n payload,\n };\n\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Register callback for patches\n */\n onPatches(callback: (patches: Patch[]) => void): this {\n this.patchCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for state updates\n */\n onStateUpdate(callback: (state: any) => void): this {\n this.stateCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for connection\n */\n onConnect(callback: () => void): this {\n this.connectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for disconnection\n */\n onDisconnect(callback: () => void): this {\n this.disconnectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for errors\n */\n onError(callback: (error: Error) => void): this {\n this.errorCallbacks.push(callback);\n return this;\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): RemoteConnectionState {\n return this.state;\n }\n\n /**\n * Get current app state\n */\n getCurrentState(): any {\n return this.currentState;\n }\n\n /**\n * Get current revision\n */\n getRevision(): number {\n return this.currentRevision;\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as RemoteMessage;\n\n switch (message.type) {\n case \"initialTree\":\n this.handleInitialTree(message as InitialTreeMessage);\n break;\n\n case \"patch\":\n this.handlePatch(message as PatchMessage);\n break;\n\n case \"stateUpdate\":\n this.currentState = message.state;\n this.stateCallbacks.forEach((cb) => cb(message.state));\n break;\n }\n } catch (error) {\n console.error(\"Error handling remote message:\", error);\n this.errorCallbacks.forEach((cb) =>\n cb(error instanceof Error ? error : new Error(String(error)))\n );\n }\n }\n\n private handleInitialTree(message: InitialTreeMessage): void {\n this.moduleName = message.module;\n this.currentState = message.state;\n this.currentRevision = message.revision;\n\n // Apply initial patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n\n // Notify state callbacks\n this.stateCallbacks.forEach((cb) => cb(message.state));\n }\n\n private handlePatch(message: PatchMessage): void {\n // Check revision ordering\n if (message.revision <= this.currentRevision) {\n console.warn(\n `Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`\n );\n return;\n }\n\n this.currentRevision = message.revision;\n\n // Apply patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n }\n\n private attemptReconnect(): void {\n if (!this.options.autoReconnect) {\n return;\n }\n\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n console.error(\"Max reconnection attempts reached\");\n return;\n }\n\n this.reconnectAttempts++;\n\n console.log(\n `Attempting to reconnect (${this.reconnectAttempts}/${this.options.maxReconnectAttempts})...`\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((error) => {\n console.error(\"Reconnection failed:\", error);\n });\n }, this.options.reconnectInterval);\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "81B37709564BD73564756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,9 @@
1
+ import {
2
+ RemoteEngine
3
+ } from "./client.js";
4
+ import"../../chunk-5va59f7m.js";
5
+ export {
6
+ RemoteEngine
7
+ };
8
+
9
+ //# debugId=9506B2935A5C9A6164756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "9506B2935A5C9A6164756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# debugId=896EB198F3ECA50D64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "896EB198F3ECA50D64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,58 @@
1
+ import"../chunk-5va59f7m.js";
2
+
3
+ // src/renderer.ts
4
+ class BaseRenderer {
5
+ nodes = new Map;
6
+ getNode(id) {
7
+ return this.nodes.get(id);
8
+ }
9
+ clear() {
10
+ this.nodes.clear();
11
+ }
12
+ applyPatch(patch) {
13
+ switch (patch.type) {
14
+ case "create":
15
+ this.onCreate(patch.id, patch.elementType, patch.props || {});
16
+ break;
17
+ case "setProp":
18
+ this.onSetProp(patch.id, patch.name, patch.value);
19
+ break;
20
+ case "setText":
21
+ this.onSetText(patch.id, patch.text);
22
+ break;
23
+ case "insert":
24
+ this.onInsert(patch.parentId, patch.id, patch.beforeId);
25
+ break;
26
+ case "move":
27
+ this.onMove(patch.parentId, patch.id, patch.beforeId);
28
+ break;
29
+ case "remove":
30
+ this.onRemove(patch.id);
31
+ break;
32
+ case "attachEvent":
33
+ this.onAttachEvent(patch.id, patch.eventName);
34
+ break;
35
+ case "detachEvent":
36
+ this.onDetachEvent(patch.id, patch.eventName);
37
+ break;
38
+ }
39
+ }
40
+ }
41
+
42
+ class ConsoleRenderer {
43
+ applyPatches(patches) {
44
+ console.group("Patches:");
45
+ for (const patch of patches) {
46
+ console.log(patch);
47
+ }
48
+ console.groupEnd();
49
+ }
50
+ }
51
+ export {
52
+ ConsoleRenderer,
53
+ BaseRenderer
54
+ };
55
+
56
+ export { BaseRenderer, ConsoleRenderer };
57
+
58
+ //# debugId=8E0AF6AE64CE63D964756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/renderer.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Renderer abstraction interface\n *\n * Renderers are pluggable and can be implemented for different platforms\n * (DOM, Canvas, Native, etc.)\n */\n\nimport type { Patch } from \"./engine.js\";\n\n/**\n * Renderer interface that all platform renderers must implement\n */\nexport interface Renderer {\n /**\n * Apply a batch of patches to the render tree\n */\n applyPatches(patches: Patch[]): void;\n\n /**\n * Get a node by its ID (optional, for debugging)\n */\n getNode?(id: string): any;\n\n /**\n * Clear the entire render tree\n */\n clear?(): void;\n}\n\n/**\n * Base renderer class with common utilities\n */\nexport abstract class BaseRenderer implements Renderer {\n protected nodes: Map<string, any> = new Map();\n\n abstract applyPatches(patches: Patch[]): void;\n\n getNode(id: string): any {\n return this.nodes.get(id);\n }\n\n clear(): void {\n this.nodes.clear();\n }\n\n /**\n * Apply a single patch\n */\n protected applyPatch(patch: Patch): void {\n switch (patch.type) {\n case \"create\":\n this.onCreate(patch.id!, patch.elementType!, patch.props || {});\n break;\n case \"setProp\":\n this.onSetProp(patch.id!, patch.name!, patch.value);\n break;\n case \"setText\":\n this.onSetText(patch.id!, patch.text!);\n break;\n case \"insert\":\n this.onInsert(patch.parentId!, patch.id!, patch.beforeId);\n break;\n case \"move\":\n this.onMove(patch.parentId!, patch.id!, patch.beforeId);\n break;\n case \"remove\":\n this.onRemove(patch.id!);\n break;\n case \"attachEvent\":\n this.onAttachEvent(patch.id!, patch.eventName!);\n break;\n case \"detachEvent\":\n this.onDetachEvent(patch.id!, patch.eventName!);\n break;\n }\n }\n\n /**\n * Platform-specific patch handlers\n */\n protected abstract onCreate(id: string, elementType: string, props: Record<string, any>): void;\n protected abstract onSetProp(id: string, name: string, value: any): void;\n protected abstract onSetText(id: string, text: string): void;\n protected abstract onInsert(parentId: string, id: string, beforeId?: string): void;\n protected abstract onMove(parentId: string, id: string, beforeId?: string): void;\n protected abstract onRemove(id: string): void;\n protected abstract onAttachEvent(id: string, eventName: string): void;\n protected abstract onDetachEvent(id: string, eventName: string): void;\n}\n\n/**\n * Console/Debug renderer that logs patches\n */\nexport class ConsoleRenderer implements Renderer {\n applyPatches(patches: Patch[]): void {\n console.group(\"Patches:\");\n for (const patch of patches) {\n console.log(patch);\n }\n console.groupEnd();\n }\n}\n"
6
+ ],
7
+ "mappings": ";;;AAgCO,MAAe,aAAiC;AAAA,EAC3C,QAA0B,IAAI;AAAA,EAIxC,OAAO,CAAC,IAAiB;AAAA,IACvB,OAAO,KAAK,MAAM,IAAI,EAAE;AAAA;AAAA,EAG1B,KAAK,GAAS;AAAA,IACZ,KAAK,MAAM,MAAM;AAAA;AAAA,EAMT,UAAU,CAAC,OAAoB;AAAA,IACvC,QAAQ,MAAM;AAAA,WACP;AAAA,QACH,KAAK,SAAS,MAAM,IAAK,MAAM,aAAc,MAAM,SAAS,CAAC,CAAC;AAAA,QAC9D;AAAA,WACG;AAAA,QACH,KAAK,UAAU,MAAM,IAAK,MAAM,MAAO,MAAM,KAAK;AAAA,QAClD;AAAA,WACG;AAAA,QACH,KAAK,UAAU,MAAM,IAAK,MAAM,IAAK;AAAA,QACrC;AAAA,WACG;AAAA,QACH,KAAK,SAAS,MAAM,UAAW,MAAM,IAAK,MAAM,QAAQ;AAAA,QACxD;AAAA,WACG;AAAA,QACH,KAAK,OAAO,MAAM,UAAW,MAAM,IAAK,MAAM,QAAQ;AAAA,QACtD;AAAA,WACG;AAAA,QACH,KAAK,SAAS,MAAM,EAAG;AAAA,QACvB;AAAA,WACG;AAAA,QACH,KAAK,cAAc,MAAM,IAAK,MAAM,SAAU;AAAA,QAC9C;AAAA,WACG;AAAA,QACH,KAAK,cAAc,MAAM,IAAK,MAAM,SAAU;AAAA,QAC9C;AAAA;AAAA;AAeR;AAAA;AAKO,MAAM,gBAAoC;AAAA,EAC/C,YAAY,CAAC,SAAwB;AAAA,IACnC,QAAQ,MAAM,UAAU;AAAA,IACxB,WAAW,SAAS,SAAS;AAAA,MAC3B,QAAQ,IAAI,KAAK;AAAA,IACnB;AAAA,IACA,QAAQ,SAAS;AAAA;AAErB;",
8
+ "debugId": "8E0AF6AE64CE63D964756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,189 @@
1
+ import {
2
+ createObservableState,
3
+ getStateSnapshot
4
+ } from "./state.js";
5
+ import"../chunk-5va59f7m.js";
6
+
7
+ // src/router.ts
8
+ class HypenRouter {
9
+ state;
10
+ subscribers = new Set;
11
+ isInitialized = false;
12
+ constructor() {
13
+ this.state = createObservableState({
14
+ currentPath: "/",
15
+ params: {},
16
+ query: {},
17
+ previousPath: null
18
+ }, {
19
+ onChange: () => {
20
+ this.notifySubscribers();
21
+ }
22
+ });
23
+ if (typeof window !== "undefined") {
24
+ this.initializeBrowserSync();
25
+ }
26
+ }
27
+ initializeBrowserSync() {
28
+ const initialPath = this.getPathFromBrowser();
29
+ this.state.currentPath = initialPath;
30
+ this.state.params = {};
31
+ this.state.query = this.parseQuery();
32
+ window.addEventListener("popstate", () => {
33
+ const newPath = this.getPathFromBrowser();
34
+ this.updatePath(newPath, false);
35
+ });
36
+ window.addEventListener("hashchange", () => {
37
+ const newPath = this.getPathFromBrowser();
38
+ this.updatePath(newPath, false);
39
+ });
40
+ this.isInitialized = true;
41
+ console.log("Router initialized at:", initialPath);
42
+ }
43
+ getPathFromBrowser() {
44
+ if (typeof window === "undefined")
45
+ return "/";
46
+ const hash = window.location.hash.slice(1);
47
+ if (hash)
48
+ return hash;
49
+ return window.location.pathname;
50
+ }
51
+ parseQuery() {
52
+ if (typeof window === "undefined")
53
+ return {};
54
+ const query = {};
55
+ const searchParams = new URLSearchParams(window.location.search);
56
+ searchParams.forEach((value, key) => {
57
+ query[key] = value;
58
+ });
59
+ return query;
60
+ }
61
+ push(path) {
62
+ console.log("Router.push:", path);
63
+ this.updatePath(path, true);
64
+ }
65
+ replace(path) {
66
+ console.log("Router.replace:", path);
67
+ this.updatePath(path, true, true);
68
+ }
69
+ back() {
70
+ console.log("Router.back");
71
+ if (typeof window !== "undefined") {
72
+ window.history.back();
73
+ }
74
+ }
75
+ forward() {
76
+ console.log("Router.forward");
77
+ if (typeof window !== "undefined") {
78
+ window.history.forward();
79
+ }
80
+ }
81
+ updatePath(path, updateBrowser, replace = false) {
82
+ const oldPath = this.state.currentPath;
83
+ this.state.previousPath = oldPath;
84
+ this.state.currentPath = path;
85
+ this.state.query = this.parseQuery();
86
+ if (updateBrowser && typeof window !== "undefined") {
87
+ const url = "#" + path;
88
+ if (replace) {
89
+ window.history.replaceState(null, "", url);
90
+ } else {
91
+ window.history.pushState(null, "", url);
92
+ }
93
+ const hashChangeEvent = new HashChangeEvent("hashchange", {
94
+ oldURL: window.location.href.replace(window.location.hash, "#" + oldPath),
95
+ newURL: window.location.href
96
+ });
97
+ window.dispatchEvent(hashChangeEvent);
98
+ }
99
+ }
100
+ getCurrentPath() {
101
+ return this.state.currentPath;
102
+ }
103
+ getParams() {
104
+ return { ...this.state.params };
105
+ }
106
+ getQuery() {
107
+ return { ...this.state.query };
108
+ }
109
+ getState() {
110
+ return getStateSnapshot(this.state);
111
+ }
112
+ matchPath(pattern, path) {
113
+ if (!pattern || typeof pattern !== "string") {
114
+ return null;
115
+ }
116
+ if (!path || typeof path !== "string") {
117
+ return null;
118
+ }
119
+ if (pattern === path) {
120
+ return {
121
+ params: {},
122
+ query: this.state.query,
123
+ path
124
+ };
125
+ }
126
+ if (pattern.endsWith("/*")) {
127
+ const prefix = pattern.slice(0, -2);
128
+ if (path === prefix || path.startsWith(prefix + "/")) {
129
+ return {
130
+ params: {},
131
+ query: this.state.query,
132
+ path
133
+ };
134
+ }
135
+ return null;
136
+ }
137
+ const paramNames = [];
138
+ const regexPattern = pattern.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {
139
+ paramNames.push(name);
140
+ return "([^/]+)";
141
+ }).replace(/\*/g, ".*");
142
+ const regex = new RegExp(`^${regexPattern}$`);
143
+ const match = path.match(regex);
144
+ if (!match)
145
+ return null;
146
+ const params = {};
147
+ paramNames.forEach((name, i) => {
148
+ const value = match[i + 1];
149
+ if (value !== undefined) {
150
+ params[name] = decodeURIComponent(value);
151
+ }
152
+ });
153
+ return {
154
+ params,
155
+ query: this.state.query,
156
+ path
157
+ };
158
+ }
159
+ onNavigate(callback) {
160
+ this.subscribers.add(callback);
161
+ callback(this.getState());
162
+ return () => {
163
+ this.subscribers.delete(callback);
164
+ };
165
+ }
166
+ notifySubscribers() {
167
+ const routeState = this.getState();
168
+ this.subscribers.forEach((callback) => {
169
+ callback(routeState);
170
+ });
171
+ }
172
+ isActive(pattern) {
173
+ return this.matchPath(pattern, this.state.currentPath) !== null;
174
+ }
175
+ buildUrl(path, query) {
176
+ if (!query || Object.keys(query).length === 0) {
177
+ return path;
178
+ }
179
+ const queryString = new URLSearchParams(query).toString();
180
+ return `${path}?${queryString}`;
181
+ }
182
+ }
183
+ export {
184
+ HypenRouter
185
+ };
186
+
187
+ export { HypenRouter };
188
+
189
+ //# debugId=3DC99DC236B0D73C64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/router.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Hypen Router - Declarative routing system\n * Integrated with Hypen's reactive state management\n */\n\nimport { createObservableState, getStateSnapshot } from \"./state.js\";\n\nexport type RouteMatch = {\n params: Record<string, string>;\n query: Record<string, string>;\n path: string;\n};\n\nexport type RouteState = {\n currentPath: string;\n params: Record<string, string>;\n query: Record<string, string>;\n previousPath: string | null;\n};\n\nexport type RouteChangeCallback = (route: RouteState) => void;\n\n/**\n * Hypen Router - Manages application routing with pattern matching\n */\nexport class HypenRouter {\n private state: RouteState;\n private subscribers = new Set<RouteChangeCallback>();\n private isInitialized = false;\n\n constructor() {\n // Create observable state for reactivity\n this.state = createObservableState<RouteState>(\n {\n currentPath: \"/\",\n params: {},\n query: {},\n previousPath: null,\n },\n {\n onChange: () => {\n this.notifySubscribers();\n },\n }\n );\n\n // Initialize from browser if available\n if (typeof window !== \"undefined\") {\n this.initializeBrowserSync();\n }\n }\n\n /**\n * Initialize browser history sync\n */\n private initializeBrowserSync() {\n // Get initial path from hash or pathname\n const initialPath = this.getPathFromBrowser();\n this.state.currentPath = initialPath;\n this.state.params = {};\n this.state.query = this.parseQuery();\n\n // Listen for browser back/forward\n window.addEventListener(\"popstate\", () => {\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false); // Don't push to history again\n });\n\n // Listen for hash changes\n window.addEventListener(\"hashchange\", () => {\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false);\n });\n\n this.isInitialized = true;\n console.log(\"Router initialized at:\", initialPath);\n }\n\n /**\n * Get path from browser URL (supports both hash and pathname)\n */\n private getPathFromBrowser(): string {\n if (typeof window === \"undefined\") return \"/\";\n\n // Prefer hash-based routing for simplicity\n const hash = window.location.hash.slice(1);\n if (hash) return hash;\n\n // Fallback to pathname\n return window.location.pathname;\n }\n\n /**\n * Parse query string from URL\n */\n private parseQuery(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n\n const query: Record<string, string> = {};\n const searchParams = new URLSearchParams(window.location.search);\n\n searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return query;\n }\n\n /**\n * Navigate to a new path\n */\n push(path: string) {\n console.log(\"Router.push:\", path);\n this.updatePath(path, true);\n }\n\n /**\n * Replace current path without adding to history\n */\n replace(path: string) {\n console.log(\"Router.replace:\", path);\n this.updatePath(path, true, true);\n }\n\n /**\n * Go back in history\n */\n back() {\n console.log(\"Router.back\");\n if (typeof window !== \"undefined\") {\n window.history.back();\n }\n }\n\n /**\n * Go forward in history\n */\n forward() {\n console.log(\"Router.forward\");\n if (typeof window !== \"undefined\") {\n window.history.forward();\n }\n }\n\n /**\n * Update the current path\n */\n private updatePath(\n path: string,\n updateBrowser: boolean,\n replace: boolean = false\n ) {\n const oldPath = this.state.currentPath;\n this.state.previousPath = oldPath;\n this.state.currentPath = path;\n this.state.query = this.parseQuery();\n\n // Update browser URL if needed\n if (updateBrowser && typeof window !== \"undefined\") {\n const url = \"#\" + path;\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n\n // Manually trigger hashchange event\n const hashChangeEvent = new HashChangeEvent(\"hashchange\", {\n oldURL: window.location.href.replace(window.location.hash, \"#\" + oldPath),\n newURL: window.location.href,\n });\n window.dispatchEvent(hashChangeEvent);\n }\n }\n\n /**\n * Get current path\n */\n getCurrentPath(): string {\n return this.state.currentPath;\n }\n\n /**\n * Get current route params\n */\n getParams(): Record<string, string> {\n return { ...this.state.params };\n }\n\n /**\n * Get current query params\n */\n getQuery(): Record<string, string> {\n return { ...this.state.query };\n }\n\n /**\n * Get full route state snapshot\n */\n getState(): RouteState {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Match a pattern against a path\n */\n matchPath(pattern: string, path: string): RouteMatch | null {\n // Handle invalid inputs gracefully\n if (!pattern || typeof pattern !== 'string') {\n return null;\n }\n if (!path || typeof path !== 'string') {\n return null;\n }\n\n // Exact match\n if (pattern === path) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n\n // Wildcard match: /dashboard/* matches /dashboard/anything\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (path === prefix || path.startsWith(prefix + \"/\")) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n return null;\n }\n\n // Parameter match: /users/:id matches /users/123\n const paramNames: string[] = [];\n const regexPattern = pattern\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {\n paramNames.push(name);\n return \"([^/]+)\";\n })\n .replace(/\\*/g, \".*\");\n\n const regex = new RegExp(`^${regexPattern}$`);\n const match = path.match(regex);\n\n if (!match) return null;\n\n // Extract params\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n const value = match[i + 1];\n if (value !== undefined) {\n params[name] = decodeURIComponent(value);\n }\n });\n\n return {\n params,\n query: this.state.query,\n path,\n };\n }\n\n /**\n * Subscribe to route changes\n */\n onNavigate(callback: RouteChangeCallback): () => void {\n this.subscribers.add(callback);\n\n // Call immediately with current state\n callback(this.getState());\n\n // Return unsubscribe function\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Notify all subscribers of route change\n */\n private notifySubscribers() {\n const routeState = this.getState();\n this.subscribers.forEach((callback) => {\n callback(routeState);\n });\n }\n\n /**\n * Check if a path matches the current route\n */\n isActive(pattern: string): boolean {\n return this.matchPath(pattern, this.state.currentPath) !== null;\n }\n\n /**\n * Get a URL with query params\n */\n buildUrl(path: string, query?: Record<string, string>): string {\n if (!query || Object.keys(query).length === 0) {\n return path;\n }\n\n const queryString = new URLSearchParams(query).toString();\n return `${path}?${queryString}`;\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "3DC99DC236B0D73C64756E2164756E21",
9
+ "names": []
10
+ }