@c9up/aurora 0.1.9 → 0.1.10

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.
@@ -18,6 +18,7 @@
18
18
  interface AuroraContainer {
19
19
  singleton(token: unknown, factory: () => unknown): void;
20
20
  resolve<T = unknown>(token: unknown): T;
21
+ has(token: unknown): boolean;
21
22
  }
22
23
  interface AuroraConfigStore {
23
24
  get<T = unknown>(key: string): T | undefined;
@@ -48,38 +48,23 @@ export default class AuroraProvider {
48
48
  setAurora(manager);
49
49
  }
50
50
  async start() {
51
- // Asset routes are registered in `start()` — after preloads —
52
- // so apps can swap aurora's pages root in a preload if they
53
- // wanted to. Non-Ream hosts (no `@c9up/ream/services/router`)
54
- // AND pre-`setRouter` boots (router proxy uninit) both
55
- // silent-return; ANY other error (slug collision, AuroraManager
56
- // crash, factory bug) propagates so real regressions surface
57
- // with a stack instead of "the asset routes just stopped
58
- // mounting".
59
- // Variable specifier so tsc does not statically resolve the optional
60
- // `@c9up/ream` peer at build time (keeps aurora agnostic /
61
- // standalone-buildable). Resolved to the host router only at runtime
62
- // when aurora actually runs inside Ream.
63
- const routerSpecifier = "@c9up/ream/services/router";
64
- let routerMod;
65
- try {
66
- routerMod = await import(routerSpecifier);
67
- }
68
- catch (err) {
69
- if (isModuleNotFound(err))
70
- return;
71
- throw err;
72
- }
51
+ // Asset routes are registered in `start()` — after preloads — so apps can
52
+ // swap aurora's pages root in a preload if they wanted to.
53
+ //
54
+ // Resolve the host router from the container, where Ream registers it as
55
+ // `'router'` (Ignitor). Reading it from the container — instead of
56
+ // importing `@c9up/ream/services/router` keeps aurora runtime-agnostic:
57
+ // a non-Ream host simply never registers `'router'`, so aurora silently
58
+ // skips its asset routes. The container yields the real Router instance
59
+ // (registered before any provider's `start()`), so route-registration
60
+ // failures (slug collision, AuroraManager crash) propagate with a stack
61
+ // instead of being misread as "the asset routes just stopped mounting".
62
+ if (!this.app.container.has("router"))
63
+ return;
64
+ const router = this.app.container.resolve("router");
73
65
  const manager = this.app.container.resolve(AuroraManager);
74
- try {
75
- routerMod.default.get("/_assets/aurora/*", adaptHandler(manager.auroraAssetsHandler()));
76
- routerMod.default.get("/_assets/pages/*", adaptHandler(manager.pageAssetsHandler()));
77
- }
78
- catch (err) {
79
- if (isRouterProxyUninit(err))
80
- return;
81
- throw err;
82
- }
66
+ router.get("/_assets/aurora/*", adaptHandler(manager.auroraAssetsHandler()));
67
+ router.get("/_assets/pages/*", adaptHandler(manager.pageAssetsHandler()));
83
68
  }
84
69
  async ready() { }
85
70
  async shutdown() { }
@@ -131,15 +116,3 @@ export default class AuroraProvider {
131
116
  function adaptHandler(handler) {
132
117
  return (ctx) => handler(ctx);
133
118
  }
134
- /** Node's ERR_MODULE_NOT_FOUND surfaces on an Error subclass with `code`. */
135
- function isModuleNotFound(err) {
136
- if (err === null || typeof err !== "object" || !("code" in err))
137
- return false;
138
- const { code } = err;
139
- return code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND";
140
- }
141
- /** Ream's router proxy throws this exact string before Ignitor wires it. */
142
- function isRouterProxyUninit(err) {
143
- return (err instanceof Error &&
144
- err.message.includes("Router accessed before initialization"));
145
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c9up/aurora",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "Aurora — reactive UI runtime for the Ream framework. Tagged-template DOM, signal-based state, isomorphic SSR + hydration, zero build step.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -31,6 +31,7 @@ import { renderToString } from "./ssr.js";
31
31
  interface AuroraContainer {
32
32
  singleton(token: unknown, factory: () => unknown): void;
33
33
  resolve<T = unknown>(token: unknown): T;
34
+ has(token: unknown): boolean;
34
35
  }
35
36
  interface AuroraConfigStore {
36
37
  get<T = unknown>(key: string): T | undefined;
@@ -76,40 +77,22 @@ export default class AuroraProvider {
76
77
  }
77
78
 
78
79
  async start(): Promise<void> {
79
- // Asset routes are registered in `start()` — after preloads —
80
- // so apps can swap aurora's pages root in a preload if they
81
- // wanted to. Non-Ream hosts (no `@c9up/ream/services/router`)
82
- // AND pre-`setRouter` boots (router proxy uninit) both
83
- // silent-return; ANY other error (slug collision, AuroraManager
84
- // crash, factory bug) propagates so real regressions surface
85
- // with a stack instead of "the asset routes just stopped
86
- // mounting".
87
- // Variable specifier so tsc does not statically resolve the optional
88
- // `@c9up/ream` peer at build time (keeps aurora agnostic /
89
- // standalone-buildable). Resolved to the host router only at runtime
90
- // when aurora actually runs inside Ream.
91
- const routerSpecifier = "@c9up/ream/services/router";
92
- let routerMod: { default: ReamRouter };
93
- try {
94
- routerMod = await import(routerSpecifier);
95
- } catch (err) {
96
- if (isModuleNotFound(err)) return;
97
- throw err;
98
- }
80
+ // Asset routes are registered in `start()` — after preloads — so apps can
81
+ // swap aurora's pages root in a preload if they wanted to.
82
+ //
83
+ // Resolve the host router from the container, where Ream registers it as
84
+ // `'router'` (Ignitor). Reading it from the container — instead of
85
+ // importing `@c9up/ream/services/router` keeps aurora runtime-agnostic:
86
+ // a non-Ream host simply never registers `'router'`, so aurora silently
87
+ // skips its asset routes. The container yields the real Router instance
88
+ // (registered before any provider's `start()`), so route-registration
89
+ // failures (slug collision, AuroraManager crash) propagate with a stack
90
+ // instead of being misread as "the asset routes just stopped mounting".
91
+ if (!this.app.container.has("router")) return;
92
+ const router = this.app.container.resolve<ReamRouter>("router");
99
93
  const manager = this.app.container.resolve<AuroraManager>(AuroraManager);
100
- try {
101
- routerMod.default.get(
102
- "/_assets/aurora/*",
103
- adaptHandler(manager.auroraAssetsHandler()),
104
- );
105
- routerMod.default.get(
106
- "/_assets/pages/*",
107
- adaptHandler(manager.pageAssetsHandler()),
108
- );
109
- } catch (err) {
110
- if (isRouterProxyUninit(err)) return;
111
- throw err;
112
- }
94
+ router.get("/_assets/aurora/*", adaptHandler(manager.auroraAssetsHandler()));
95
+ router.get("/_assets/pages/*", adaptHandler(manager.pageAssetsHandler()));
113
96
  }
114
97
 
115
98
  async ready(): Promise<void> {}
@@ -170,18 +153,3 @@ function adaptHandler(
170
153
  }) => Promise<void> {
171
154
  return (ctx) => handler(ctx);
172
155
  }
173
-
174
- /** Node's ERR_MODULE_NOT_FOUND surfaces on an Error subclass with `code`. */
175
- function isModuleNotFound(err: unknown): boolean {
176
- if (err === null || typeof err !== "object" || !("code" in err)) return false;
177
- const { code } = err;
178
- return code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND";
179
- }
180
-
181
- /** Ream's router proxy throws this exact string before Ignitor wires it. */
182
- function isRouterProxyUninit(err: unknown): boolean {
183
- return (
184
- err instanceof Error &&
185
- err.message.includes("Router accessed before initialization")
186
- );
187
- }