@absolutejs/absolute 0.20.0-beta.179 → 0.20.0-beta.180
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/CHANGELOG.md +23 -0
- package/changelog.json +45 -0
- package/dist/angular/browser.js +2 -2
- package/dist/angular/browser.js.map +3 -3
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/angular/index.js +21 -6
- package/dist/angular/index.js.map +6 -6
- package/dist/angular/server.js +21 -6
- package/dist/angular/server.js.map +6 -6
- package/dist/build.js +5357 -4945
- package/dist/build.js.map +27 -24
- package/dist/cli/build-fntmf42w.js +495 -0
- package/dist/cli/{buildDepVendor-qvsh6dsj.js → buildDepVendor-qnwfct22.js} +5 -3
- package/dist/cli/buildReactServerComponents-fq6mw10d.js +13 -0
- package/dist/cli/{compile-p5yv6ecp.js → compile-54rb8szn.js} +94 -125
- package/dist/cli/config/server.js +10 -5
- package/dist/cli/{dev-2hbcsvkp.js → dev-6s6g5tnk.js} +13 -14
- package/dist/cli/{expoProject-1qtw97js.js → expoProject-acgfaj3f.js} +2 -1
- package/dist/cli/generatedDir-239r7csr.js +9 -0
- package/dist/cli/{index-cksezef8.js → index-0gd30trc.js} +105 -851
- package/dist/cli/index-2wvysvjc.js +40 -0
- package/dist/cli/index-42xjh6gg.js +282 -0
- package/dist/cli/{index-qw98g1p6.js → index-47e8fwha.js} +4 -1
- package/dist/cli/index-65kqn88a.js +8 -0
- package/dist/cli/{index-2bxfhs32.js → index-6f448d7m.js} +0 -26
- package/dist/cli/index-972xxwgj.js +16 -0
- package/dist/cli/index-aqe25w4h.js +39 -0
- package/dist/cli/index-assqancr.js +51 -0
- package/dist/cli/{index-2shf4aya.js → index-c8rcfe5a.js} +4 -6
- package/dist/cli/index-cba1cemz.js +8 -0
- package/dist/cli/{index-3ff5ztt3.js → index-djkrb7pc.js} +1 -7
- package/dist/cli/index-dkfwkpc8.js +138 -0
- package/dist/cli/{index-92g14j47.js → index-dw44xa4x.js} +2 -1
- package/dist/cli/index-evsnq0n2.js +17 -0
- package/dist/cli/index-fxwf3n2v.js +224 -0
- package/dist/cli/{index-zyd80s3h.js → index-js2hksgv.js} +21 -295
- package/dist/cli/{index-bp60baze.js → index-jyap0bhv.js} +1 -1
- package/dist/cli/{index-9dzdbbfc.js → index-kx2d067c.js} +8 -6
- package/dist/cli/index-pb31zan6.js +9 -0
- package/dist/cli/index-sq0478b0.js +281 -0
- package/dist/cli/index-va274tsf.js +7 -0
- package/dist/cli/{index-yd672jyq.js → index-w6xsk8cv.js} +4 -1
- package/dist/cli/index-w79snsxv.js +461 -0
- package/dist/cli/index-x1vvn549.js +835 -0
- package/dist/cli/index-xf9sfr8a.js +243 -0
- package/dist/cli/index-ycqdxy55.js +754 -0
- package/dist/cli/index-z74cqxz0.js +131 -0
- package/dist/cli/index.js +10 -9
- package/dist/cli/{islands-6zgb7501.js → islands-17tfx8jf.js} +6 -17
- package/dist/cli/{ls-0hfx323m.js → ls-0wr74w0b.js} +10 -58
- package/dist/cli/{mobile-93vaawcz.js → mobile-hpqpy61f.js} +11 -8
- package/dist/cli/{prerender-010z771p.js → prerender-w65xp6h8.js} +2 -1
- package/dist/cli/{rewriteImports-z6629aww.js → rewriteImports-np2d2kvc.js} +4 -11
- package/dist/cli/rewriteImportsPlugin-c6hcb3x6.js +12 -0
- package/dist/cli/{start-asxb79rc.js → start-mbn2zgs2.js} +6 -4
- package/dist/cli/staticAnalyzeSpaRoutes-2nev05m1.js +8 -0
- package/dist/cli/staticAnalyzeSpaRoutes-6vgzp0rs.js +8 -0
- package/dist/cli/staticAnalyzeSpaRoutes-f85q9dqk.js +8 -0
- package/dist/cli/staticAnalyzeSpaRoutes-yakmg22g.js +7 -0
- package/dist/cli/{typecheck-m2j4tkdk.js → typecheck-488txsfc.js} +92 -18
- package/dist/cli/vueCompiler-8bzdmf08.js +7 -0
- package/dist/client/chunks/{react-khr6ewhr.js → react-g8r290b8.js} +37 -2
- package/dist/client/chunks/react-g8r290b8.js.map +10 -0
- package/dist/client/chunks/vue-zcpmka32.js +85 -0
- package/dist/client/chunks/vue-zcpmka32.js.map +10 -0
- package/dist/client/index.js +58 -10
- package/dist/client/index.js.map +4 -4
- package/dist/dev/client/handlers/vue.ts +116 -0
- package/dist/index.js +2472 -2058
- package/dist/index.js.map +26 -23
- package/dist/islands/browser.js +2 -2
- package/dist/islands/browser.js.map +3 -3
- package/dist/islands/index.js +2 -2
- package/dist/islands/index.js.map +3 -3
- package/dist/react/browser.js +2 -2
- package/dist/react/browser.js.map +3 -3
- package/dist/react/index.js +42 -11
- package/dist/react/index.js.map +10 -10
- package/dist/react/server.js +42 -11
- package/dist/react/server.js.map +10 -10
- package/dist/src/angular/ssrRender.d.ts +2 -2
- package/dist/src/angular/staticAnalyzeSpaRoutes.d.ts +6 -1
- package/dist/src/build/generateManifest.d.ts +15 -0
- package/dist/src/build/manifestKeys.d.ts +22 -0
- package/dist/src/cli/add/dependencies.d.ts +1 -1
- package/dist/src/cli/scripts/typecheck.d.ts +11 -0
- package/dist/src/client/hydrators/react.d.ts +10 -0
- package/dist/src/client/hydrators/vue.d.ts +13 -0
- package/dist/src/client/islandRuntime.d.ts +1 -1
- package/dist/src/core/islandManifest.d.ts +4 -0
- package/dist/src/core/islandPageContext.d.ts +8 -2
- package/dist/src/core/lookup.d.ts +16 -1
- package/dist/src/dev/importCost/instrument.d.ts +1 -1
- package/dist/src/dev/manifestKeysRefresher.d.ts +6 -0
- package/dist/src/dev/spaRouteRefresh.d.ts +13 -0
- package/dist/src/mobile/androidConformance.d.ts +1 -1
- package/dist/src/react/staticAnalyzeSpaRoutes.d.ts +6 -1
- package/dist/src/svelte/staticAnalyzeSpaRoutes.d.ts +1 -0
- package/dist/src/utils/logger.d.ts +5 -0
- package/dist/src/utils/spaRouteManifest.d.ts +1 -0
- package/dist/src/vue/components/Image.d.ts +4 -4
- package/dist/src/vue/components/StreamSlot.d.ts +1 -1
- package/dist/src/vue/components/SuspenseSlot.d.ts +2 -2
- package/dist/src/vue/staticAnalyzeSpaRoutes.d.ts +4 -0
- package/dist/svelte/browser.js +2 -2
- package/dist/svelte/browser.js.map +3 -3
- package/dist/svelte/index.js +25 -9
- package/dist/svelte/index.js.map +8 -8
- package/dist/svelte/server.js +25 -9
- package/dist/svelte/server.js.map +8 -8
- package/dist/types/globals.d.ts +4 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/island.d.ts +1 -1
- package/dist/types/manifest.d.ts +25 -0
- package/dist/vue/browser.js +2 -2
- package/dist/vue/browser.js.map +3 -3
- package/dist/vue/index.js +21 -6
- package/dist/vue/index.js.map +6 -6
- package/dist/vue/server.js +21 -6
- package/dist/vue/server.js.map +6 -6
- package/package.json +1 -1
- package/dist/client/chunks/react-khr6ewhr.js.map +0 -10
- package/dist/client/chunks/vue-db6ppn1f.js +0 -32
- package/dist/client/chunks/vue-db6ppn1f.js.map +0 -10
package/dist/client/index.js.map
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/core/islandManifest.ts", "../src/client/islandResolver.ts", "../src/client/streamSwap.ts", "../node_modules/zustand/esm/vanilla.mjs", "../node_modules/zustand/esm/middleware.mjs", "../src/client/islandStore.ts", "../src/core/islands.ts", "../src/core/islandStylesheet.ts", "../src/client/preserveIslandMarkup.ts", "../src/client/islandRuntime.ts", "../src/utils/formActionProtocol.ts", "../src/client/formActions.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { IslandFramework } from '../../types/island';\n\n/** Manifest key the server injects as the islands bootstrap script on any\n * page with island markers. The build records the configured\n * `islands.bootstrap` (whatever its file name) or a generated default under\n * it — see build/islandBootstrap.ts. */\nexport const ISLAND_BOOTSTRAP_MANIFEST_KEY = 'AbsoluteIslandBootstrap';\n\n/** Key a bootstrap file named `bootstrapClient.*` gets naturally, which is\n * all the server used to look for. Still honored for manifests built\n * before the reserved key existed. */\nexport const LEGACY_ISLAND_BOOTSTRAP_MANIFEST_KEY = 'BootstrapClient';\n\nconst toIslandFrameworkSegment = (framework: IslandFramework) =>\n\tframework[0]?.toUpperCase() + framework.slice(1);\n\nconst collectFrameworkIslands = (\n\tmanifest: Record<string, string>,\n\tprefix: string\n) => {\n\tconst entries: Record<string, string> = {};\n\tlet found = false;\n\n\tfor (const [key, value] of Object.entries(manifest)) {\n\t\tif (!key.startsWith(prefix)) continue;\n\n\t\tconst component = key.slice(prefix.length);\n\t\tif (!component) continue;\n\n\t\tentries[component] = value;\n\t\tfound = true;\n\t}\n\n\treturn found ? entries : undefined;\n};\n\nexport const getIslandBootstrapPath = (manifest: Record<string, string>) =>\n\tmanifest[ISLAND_BOOTSTRAP_MANIFEST_KEY] ??\n\tmanifest[LEGACY_ISLAND_BOOTSTRAP_MANIFEST_KEY];\nexport const getIslandManifestEntries = (manifest: Record<string, string>) => {\n\tconst islands: Partial<Record<IslandFramework, Record<string, string>>> =\n\t\t{};\n\tconst frameworks: IslandFramework[] = ['react', 'svelte', 'vue', 'angular'];\n\n\tfor (const framework of frameworks) {\n\t\tconst prefix = `Island${toIslandFrameworkSegment(framework)}`;\n\t\tconst entries = collectFrameworkIslands(manifest, prefix);\n\t\tif (entries) islands[framework] = entries;\n\t}\n\n\treturn islands;\n};\nexport const getIslandManifestKey = (\n\tframework: IslandFramework,\n\tcomponent: string\n) => `Island${toIslandFrameworkSegment(framework)}${component}`;\n\nconst ISLAND_STYLE_PREFIX = 'IslandStyle';\n\n/** Every island stylesheet in the manifest, by manifest key. */\nexport const getIslandStyleManifestEntries = (\n\tmanifest: Record<string, string>\n) =>\n\tObject.entries(manifest).filter(([key]) =>\n\t\tkey.startsWith(ISLAND_STYLE_PREFIX)\n\t);\n\n/** Manifest key of the stylesheet the island client pass emits for an\n * island (its Svelte/Vue component styles and any CSS it imports). The\n * server links it from every page that renders the island. */\nexport const getIslandStyleManifestKey = (\n\tframework: IslandFramework,\n\tcomponent: string\n) => `${ISLAND_STYLE_PREFIX}${toIslandFrameworkSegment(framework)}${component}`;\n",
|
|
5
|
+
"import type { IslandFramework } from '../../types/island';\n\n/** Manifest key the server injects as the islands bootstrap script on any\n * page with island markers. The build records the configured\n * `islands.bootstrap` (whatever its file name) or a generated default under\n * it — see build/islandBootstrap.ts. */\nexport const ISLAND_BOOTSTRAP_MANIFEST_KEY = 'AbsoluteIslandBootstrap';\n\n/** Key a bootstrap file named `bootstrapClient.*` gets naturally, which is\n * all the server used to look for. Still honored for manifests built\n * before the reserved key existed. */\nexport const LEGACY_ISLAND_BOOTSTRAP_MANIFEST_KEY = 'BootstrapClient';\n\n/** Window event a React page's generated index dispatches once it has\n * created the page's root. The island runtime holds a React page's\n * islands until then (see startIslands in client/islandRuntime.ts). */\nexport const REACT_PAGE_ROOT_EVENT = 'absolute:react-page-root';\n\nconst toIslandFrameworkSegment = (framework: IslandFramework) =>\n\tframework[0]?.toUpperCase() + framework.slice(1);\n\nconst collectFrameworkIslands = (\n\tmanifest: Record<string, string>,\n\tprefix: string\n) => {\n\tconst entries: Record<string, string> = {};\n\tlet found = false;\n\n\tfor (const [key, value] of Object.entries(manifest)) {\n\t\tif (!key.startsWith(prefix)) continue;\n\n\t\tconst component = key.slice(prefix.length);\n\t\tif (!component) continue;\n\n\t\tentries[component] = value;\n\t\tfound = true;\n\t}\n\n\treturn found ? entries : undefined;\n};\n\nexport const getIslandBootstrapPath = (manifest: Record<string, string>) =>\n\tmanifest[ISLAND_BOOTSTRAP_MANIFEST_KEY] ??\n\tmanifest[LEGACY_ISLAND_BOOTSTRAP_MANIFEST_KEY];\nexport const getIslandManifestEntries = (manifest: Record<string, string>) => {\n\tconst islands: Partial<Record<IslandFramework, Record<string, string>>> =\n\t\t{};\n\tconst frameworks: IslandFramework[] = ['react', 'svelte', 'vue', 'angular'];\n\n\tfor (const framework of frameworks) {\n\t\tconst prefix = `Island${toIslandFrameworkSegment(framework)}`;\n\t\tconst entries = collectFrameworkIslands(manifest, prefix);\n\t\tif (entries) islands[framework] = entries;\n\t}\n\n\treturn islands;\n};\nexport const getIslandManifestKey = (\n\tframework: IslandFramework,\n\tcomponent: string\n) => `Island${toIslandFrameworkSegment(framework)}${component}`;\n\nconst ISLAND_STYLE_PREFIX = 'IslandStyle';\n\n/** Every island stylesheet in the manifest, by manifest key. */\nexport const getIslandStyleManifestEntries = (\n\tmanifest: Record<string, string>\n) =>\n\tObject.entries(manifest).filter(([key]) =>\n\t\tkey.startsWith(ISLAND_STYLE_PREFIX)\n\t);\n\n/** Manifest key of the stylesheet the island client pass emits for an\n * island (its Svelte/Vue component styles and any CSS it imports). The\n * server links it from every page that renders the island. */\nexport const getIslandStyleManifestKey = (\n\tframework: IslandFramework,\n\tcomponent: string\n) => `${ISLAND_STYLE_PREFIX}${toIslandFrameworkSegment(framework)}${component}`;\n",
|
|
6
6
|
"import type { IslandFramework } from '../../types/island';\nimport {\n\tgetIslandManifestEntries,\n\tgetIslandManifestKey\n} from '../core/islandManifest';\n\nconst isStringRecord = (value: unknown): value is Record<string, string> =>\n\ttypeof value === 'object' &&\n\tvalue !== null &&\n\tObject.values(value).every((entry) => typeof entry === 'string');\n\n/** The manifest the server injects as `window.__ABSOLUTE_MANIFEST__` on any\n * page with islands (core/islandPageContext.ts). */\nconst readInjectedManifest = () => {\n\tconst injected: unknown = Reflect.get(globalThis, '__ABSOLUTE_MANIFEST__');\n\n\treturn isStringRecord(injected) ? injected : {};\n};\n\n/** Resolves island components from the build manifest's per-island chunks.\n * Defaults to the manifest the server injected into the page. */\nexport const createIslandManifestResolver = (\n\tmanifest: Record<string, string> = readInjectedManifest()\n) => {\n\tconst islandManifest = getIslandManifestEntries(manifest);\n\n\treturn async (framework: IslandFramework, component: string) => {\n\t\tconst modulePath =\n\t\t\tislandManifest[framework]?.[component] ??\n\t\t\tmanifest[getIslandManifestKey(framework, component)];\n\t\tif (!modulePath) return undefined;\n\n\t\tconst loadedModule = await import(modulePath);\n\n\t\treturn loadedModule.default;\n\t};\n};\n",
|
|
7
7
|
"type AbsoluteSlotWindow = Window & {\n\t__ABS_SLOT_ENQUEUE__?: (id: string, payload: unknown) => void;\n\t__ABS_SLOT_FLUSH__?: () => void;\n\t__ABS_SLOT_CONSUMERS__?: Record<\n\t\tstring,\n\t\t((payload: unknown) => boolean | void) | undefined\n\t>;\n\t__ABS_SLOT_HYDRATION_PENDING__?: boolean;\n\t__ABS_SLOT_PENDING__?: Record<string, unknown>;\n\t__ABS_SLOT_RUNTIME__?: boolean;\n};\n\nconst streamSwapRuntime = () => {\n\tconst absoluteWindow: AbsoluteSlotWindow = window;\n\tconst SLOT_PATCH_EVENT = 'absolutejs:slot-patch';\n\tif (absoluteWindow.__ABS_SLOT_RUNTIME__ === true) return;\n\tabsoluteWindow.__ABS_SLOT_RUNTIME__ = true;\n\tabsoluteWindow.__ABS_SLOT_CONSUMERS__ =\n\t\tabsoluteWindow.__ABS_SLOT_CONSUMERS__ ?? {};\n\tabsoluteWindow.__ABS_SLOT_PENDING__ =\n\t\tabsoluteWindow.__ABS_SLOT_PENDING__ ?? {};\n\tconst consumers = absoluteWindow.__ABS_SLOT_CONSUMERS__;\n\tconst pending = absoluteWindow.__ABS_SLOT_PENDING__;\n\tconst isObjectRecord = (value: unknown): value is Record<string, unknown> =>\n\t\tBoolean(value) && typeof value === 'object';\n\tconst isPatchedPendingEntry = (\n\t\tvalue: unknown\n\t): value is {\n\t\tdomPatched: true;\n\t\tpayload: unknown;\n\t} => {\n\t\tif (!isObjectRecord(value)) return false;\n\n\t\treturn value.domPatched === true && 'payload' in value;\n\t};\n\tconst unwrapPendingPayload = (value: unknown) =>\n\t\tisPatchedPendingEntry(value) ? value.payload : value;\n\tconst canApplyImmediately = () =>\n\t\tabsoluteWindow.__ABS_SLOT_HYDRATION_PENDING__ !== true;\n\tconst isAngularDeferPayload = (payload: unknown) => {\n\t\tif (!isObjectRecord(payload)) return false;\n\n\t\treturn payload.kind === 'angular-defer';\n\t};\n\tconst isVueSuspensePayload = (payload: unknown) => {\n\t\tif (!isObjectRecord(payload)) return false;\n\n\t\treturn payload.kind === 'vue-suspense';\n\t};\n\tconst resolveHtml = (payload: unknown) => {\n\t\tif (!isObjectRecord(payload)) {\n\t\t\treturn typeof payload === 'string' ? payload : '';\n\t\t}\n\t\tif (typeof payload.html === 'string') {\n\t\t\treturn payload.html;\n\t\t}\n\n\t\treturn '';\n\t};\n\n\tconst apply = (id: string, pendingEntry: unknown) => {\n\t\tconst payload = unwrapPendingPayload(pendingEntry);\n\t\tif (!canApplyImmediately()) {\n\t\t\tpending[id] = payload;\n\n\t\t\treturn;\n\t\t}\n\t\tconst consumer = consumers[id];\n\t\tif (typeof consumer !== 'function') {\n\t\t\tapplyToDom(id, payload, pendingEntry);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst handled = consumer(payload);\n\t\tif (handled !== false) {\n\t\t\tdelete pending[id];\n\n\t\t\treturn;\n\t\t}\n\n\t\tapplyToDom(id, payload, pendingEntry);\n\t};\n\tconst applyToDom = (\n\t\tid: string,\n\t\tpayload: unknown,\n\t\tpendingEntry: unknown\n\t) => {\n\t\tif (isAngularDeferPayload(payload)) {\n\t\t\tpending[id] = payload;\n\n\t\t\treturn;\n\t\t}\n\t\tconst node = document.getElementById(id);\n\t\tif (!node) {\n\t\t\tpending[id] = payload;\n\n\t\t\treturn;\n\t\t}\n\t\tconst html = resolveHtml(payload);\n\t\tif (\n\t\t\tisVueSuspensePayload(payload) &&\n\t\t\tisPatchedPendingEntry(pendingEntry)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnode.innerHTML = html;\n\t\tnode.setAttribute('data-absolute-slot-state', 'resolved');\n\t\twindow.dispatchEvent(\n\t\t\tnew CustomEvent(SLOT_PATCH_EVENT, {\n\t\t\t\tdetail: { html, id, payload }\n\t\t\t})\n\t\t);\n\t\tif (isVueSuspensePayload(payload)) {\n\t\t\tpending[id] = { domPatched: true, payload };\n\n\t\t\treturn;\n\t\t}\n\t\tdelete pending[id];\n\t};\n\n\tconst flush = () => {\n\t\tfor (const id in pending) {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(pending, id)) continue;\n\t\t\tapply(id, pending[id] ?? '');\n\t\t}\n\t};\n\n\tabsoluteWindow.__ABS_SLOT_FLUSH__ = flush;\n\tabsoluteWindow.__ABS_SLOT_ENQUEUE__ = (id: string, payload: unknown) => {\n\t\tapply(id, payload);\n\t};\n\n\tif (typeof MutationObserver === 'function') {\n\t\tconst observer = new MutationObserver(flush);\n\t\tconst root = document.documentElement ?? document.body ?? document;\n\t\tobserver.observe(root, { childList: true, subtree: true });\n\t}\n\n\tif (document.readyState === 'loading') {\n\t\tdocument.addEventListener('DOMContentLoaded', flush, { once: true });\n\t}\n\tflush();\n};\n\nconst stripFunctionWrapper = (value: string) => {\n\tconst start = value.indexOf('{');\n\tconst end = value.lastIndexOf('}');\n\tif (start < 0 || end <= start) return '';\n\n\treturn value.slice(start + 1, end);\n};\n\nexport const getStreamSwapRuntimeScript = () =>\n\t`(function(){${stripFunctionWrapper(streamSwapRuntime.toString())}})();`;\n",
|
|
8
8
|
"const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n",
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
"import type {\n\tIslandComponentDefinition,\n\tIslandRegistry,\n\tIslandRegistryInput\n} from '../../types/island';\n\nexport const defineIslandComponent = <Component>(\n\tcomponent: Component,\n\toptions: {\n\t\texport?: string;\n\t\tsource: string;\n\t}\n): IslandComponentDefinition<Component> => ({\n\tcomponent,\n\texport: options.export,\n\tsource: options.source\n});\nexport const defineIslandRegistry = <T extends IslandRegistryInput>(\n\tregistry: IslandRegistry<T>\n) => registry;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nexport const getIslandBuildReference = <Component>(\n\tcomponent: Component | IslandComponentDefinition<Component>\n) => {\n\tif (!isIslandComponentDefinition(component)) return null;\n\n\treturn {\n\t\texport: component.export,\n\t\tsource: component.source\n\t};\n};\nexport const isIslandComponentDefinition = <Component>(\n\tvalue: Component | IslandComponentDefinition<Component>\n): value is IslandComponentDefinition<Component> =>\n\tisRecord(value) &&\n\t'component' in value &&\n\t'source' in value &&\n\ttypeof value.source === 'string';\n\nexport function getIslandComponent<Component>(component: Component): Component;\nexport function getIslandComponent<Component>(\n\tcomponent: IslandComponentDefinition<Component>\n): Component;\nexport function getIslandComponent<Component>(\n\tcomponent: Component | IslandComponentDefinition<Component>\n) {\n\tif (isIslandComponentDefinition(component)) {\n\t\treturn component.component;\n\t}\n\n\treturn component;\n}\nexport const parseIslandProps = (rawProps: string | null) => {\n\tif (!rawProps) return {};\n\n\treturn JSON.parse(rawProps);\n};\nexport const serializeIslandProps = (props: unknown) =>\n\tJSON.stringify(props ?? {});\n\nexport {\n\tgetIslandManifestEntries,\n\tgetIslandManifestKey\n} from './islandManifest';\n",
|
|
12
12
|
"import type { IslandFramework } from '../../types/island';\nimport { readCspNonce } from '../utils/cspNonceRef';\nimport { getIslandStyleManifestKey } from './islandManifest';\n\n/* An island's built stylesheet, looked up where the host-side Island\n * components can see it: on the server the build manifest prepare()\n * recorded, in the browser the one the server injected into the page.\n * Shared by server and browser code, so nothing here imports server-only\n * modules. */\n\n/** Vue SSR context key under which a streamed Vue page render collects the\n * stylesheets its Islands have linked inline (see vue/islandStyleLink.ts). */\nexport const INLINE_ISLAND_STYLES_CONTEXT_KEY = '__absoluteInlineIslandStyles';\n\n/** React 19 stylesheet precedence for island stylesheets: React hoists\n * `<link rel=\"stylesheet\" precedence>` into the head and renders each href\n * once, however many islands ask for it. */\nexport const ISLAND_STYLE_PRECEDENCE = 'absolute-islands';\n\nconst ISLAND_FRAMEWORKS: readonly IslandFramework[] = [\n\t'react',\n\t'svelte',\n\t'vue',\n\t'angular'\n];\n\nconst toIslandFramework = (value: string) =>\n\tISLAND_FRAMEWORKS.find((framework) => framework === value);\n\nconst readIslandManifest = () => {\n\tconst manifest: unknown =\n\t\ttypeof window === 'undefined'\n\t\t\t? Reflect.get(globalThis, '__absoluteManifest')\n\t\t\t: Reflect.get(window, '__ABSOLUTE_MANIFEST__');\n\n\treturn typeof manifest === 'object' && manifest !== null\n\t\t? manifest\n\t\t: undefined;\n};\n\n/** The stylesheet the build emitted for an island, if it has one. */\nexport const findIslandStylesheet = (framework: string, component: string) => {\n\tconst islandFramework = toIslandFramework(framework);\n\tconst manifest = readIslandManifest();\n\tif (!islandFramework || !manifest) return undefined;\n\n\tconst key = getIslandStyleManifestKey(islandFramework, component);\n\tconst href: unknown = Reflect.get(manifest, key);\n\n\treturn typeof href === 'string' ? { href, key } : undefined;\n};\n\n/** The page's CSP nonce, for a stylesheet link a policy without 'self'\n * would otherwise refuse. On the server, the request's; in the browser,\n * read from a tag the server nonced (`.nonce`: browsers hide the\n * attribute once applied). '' when there is none. */\nexport const readIslandStyleNonce = () => {\n\tif (typeof document === 'undefined') return readCspNonce() ?? '';\n\n\treturn (\n\t\tArray.from(\n\t\t\tdocument.querySelectorAll<HTMLElement>('script[nonce]')\n\t\t).find((element) => element.nonce)?.nonce ?? ''\n\t);\n};\n",
|
|
13
13
|
"import type { RuntimeIslandRenderProps } from '../../types/island';\nimport { getIslandMarkerAttributes } from '../core/islandMarkupAttributes';\n\ntype PreservedIslandMarkup = {\n\tattributes: Record<string, string>;\n\tinnerHTML: string;\n};\n\ntype IslandMarkerElement = HTMLElement & {\n\tdataset: DOMStringMap & {\n\t\tcomponent?: string;\n\t\tframework?: string;\n\t\thydrate?: string;\n\t\tisland?: string;\n\t\tislandId?: string;\n\t\tprops?: string;\n\t};\n};\n\nconst getSnapshotMap = () => {\n\tif (typeof window === 'undefined') {\n\t\treturn null;\n\t}\n\n\twindow.__ABS_SERVER_ISLAND_HTML__ ??= new Map<\n\t\tstring,\n\t\tPreservedIslandMarkup[]\n\t>();\n\n\treturn window.__ABS_SERVER_ISLAND_HTML__;\n};\n\nconst getIslandSignature = (props: RuntimeIslandRenderProps) => {\n\tconst attributes = getIslandMarkerAttributes(props);\n\n\treturn [\n\t\tattributes['data-component'],\n\t\tattributes['data-framework'],\n\t\tattributes['data-hydrate'],\n\t\tattributes['data-props']\n\t].join('::');\n};\n\nconst isMatchingIslandElement = (\n\telement: Element,\n\tprops: RuntimeIslandRenderProps\n): element is IslandMarkerElement => {\n\tif (!(element instanceof HTMLElement)) {\n\t\treturn false;\n\t}\n\n\tconst attributes = getIslandMarkerAttributes(props);\n\n\treturn (\n\t\telement.dataset.island === 'true' &&\n\t\telement.dataset.component === attributes['data-component'] &&\n\t\telement.dataset.framework === attributes['data-framework'] &&\n\t\t(element.dataset.hydrate ?? 'load') === attributes['data-hydrate'] &&\n\t\t(element.dataset.props ?? '{}') === attributes['data-props']\n\t);\n};\n\n/* Attributes the island runtime adds while hydrating. A host framework that\n * re-creates the marker (a remount, an HMR update) must not copy them, or the\n * runtime takes the new, unhydrated marker for a hydrated one and leaves it\n * dead. */\nconst RUNTIME_ISLAND_ATTRIBUTES = new Set(['data-error', 'data-hydrated']);\n\nconst readMarkerAttributes = (element: Element) =>\n\tObject.fromEntries(\n\t\telement\n\t\t\t.getAttributeNames()\n\t\t\t.filter((name) => !RUNTIME_ISLAND_ATTRIBUTES.has(name))\n\t\t\t.map((name) => [name, element.getAttribute(name) ?? ''])\n\t);\n\nconst snapshotIslandElement = (\n\telement: HTMLElement,\n\tsnapshotMap: Map<string, PreservedIslandMarkup[]>\n) => {\n\tconst signature = [\n\t\telement.dataset.component,\n\t\telement.dataset.framework,\n\t\telement.dataset.hydrate ?? 'load',\n\t\telement.dataset.props ?? '{}'\n\t].join('::');\n\tconst existing = snapshotMap.get(signature) ?? [];\n\texisting.push({\n\t\tattributes: readMarkerAttributes(element),\n\t\tinnerHTML: element.innerHTML\n\t});\n\tsnapshotMap.set(signature, existing);\n};\n\nexport const initializeIslandMarkupSnapshot = () => {\n\tif (typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\tconst snapshotMap = getSnapshotMap();\n\tif (!snapshotMap || snapshotMap.size > 0) {\n\t\treturn;\n\t}\n\n\tconst elements = Array.from(\n\t\tdocument.querySelectorAll<HTMLElement>('[data-island=\"true\"]')\n\t);\n\tfor (const element of elements) {\n\t\tsnapshotIslandElement(element, snapshotMap);\n\t}\n};\n\nexport const preserveIslandMarkup = (props: RuntimeIslandRenderProps) => {\n\tif (typeof document === 'undefined') {\n\t\treturn {\n\t\t\tattributes: getIslandMarkerAttributes(props),\n\t\t\tinnerHTML: ''\n\t\t};\n\t}\n\n\tconst snapshotMap = getSnapshotMap();\n\tconst signature = getIslandSignature(props);\n\t// Islands that share a signature (same component, framework, hydrate mode\n\t// and serialized props) produce byte-identical SSR markup, so the first\n\t// captured snapshot is correct for every instance. Returning it\n\t// unconditionally keeps this stateless: React may call the component many\n\t// times during a single hydration (StrictMode double-render, hydration\n\t// retries, mismatch regeneration), and a per-call claim counter would run\n\t// past the snapshot list and yield empty markup — making the host render\n\t// `dangerouslySetInnerHTML={{ __html: '' }}` and wipe the island's\n\t// server-rendered DOM before the island runtime can hydrate it.\n\tconst snapshotCandidate = snapshotMap?.get(signature)?.[0];\n\tif (snapshotCandidate) {\n\t\treturn snapshotCandidate;\n\t}\n\n\t// Snapshot not captured yet (the island runtime module hasn't evaluated):\n\t// fall back to reading the live SSR DOM directly.\n\tconst liveCandidate = Array.from(\n\t\tdocument.querySelectorAll('[data-island=\"true\"]')\n\t).find((element) => isMatchingIslandElement(element, props));\n\tif (!liveCandidate) {\n\t\treturn {\n\t\t\tattributes: getIslandMarkerAttributes(props),\n\t\t\tinnerHTML: ''\n\t\t};\n\t}\n\n\treturn {\n\t\tattributes: readMarkerAttributes(liveCandidate),\n\t\tinnerHTML: liveCandidate.innerHTML\n\t};\n};\n\nconst claimedServerIslands = new WeakSet<Element>();\n\n/* A host framework whose render must reproduce a stylesheet link the server\n * streamed right before an island (Vue, see vue/islandStyleLink.ts) asks\n * here whether its island has one. Each browser-side Island instance takes\n * the first server island element with its signature that no instance has\n * taken yet (instances set up in document order while hydrating), and gets\n * the `<link data-island-style>` just before it, if any. Reading the DOM\n * keeps hydration exact whatever order the server rendered the islands in.\n * Null on a browser-only render: no server element is left to take. */\nexport const claimServerIslandStyleLink = (props: RuntimeIslandRenderProps) => {\n\tif (typeof document === 'undefined') return null;\n\n\tconst element = Array.from(\n\t\tdocument.querySelectorAll('[data-island=\"true\"]')\n\t).find(\n\t\t(candidate) =>\n\t\t\t!claimedServerIslands.has(candidate) &&\n\t\t\tisMatchingIslandElement(candidate, props)\n\t);\n\tif (!element) return null;\n\tclaimedServerIslands.add(element);\n\n\tconst previous = element.previousSibling;\n\tif (!(previous instanceof HTMLLinkElement)) return null;\n\tconst key = previous.dataset.islandStyle;\n\tconst href = previous.getAttribute('href');\n\n\treturn key && href ? { href, key } : null;\n};\n\n/* React 19 compares `dangerouslySetInnerHTML` by object identity and rewrites\n * `innerHTML` whenever the object changes. A fresh `{ __html }` per render\n * made every host re-render (state change, Fast Refresh) replace the island's\n * hydrated DOM with its server markup, leaving a dead copy on screen. One\n * object per markup string keeps the boundary untouched. */\ntype InnerHtml = { __html: string };\n\nconst innerHtmlObjects = new Map<string, InnerHtml>();\n\nexport const getStableInnerHtml = (html: string) => {\n\tconst existing = innerHtmlObjects.get(html);\n\tif (existing) return existing;\n\tconst created: InnerHtml = { __html: html };\n\tinnerHtmlObjects.set(html, created);\n\n\treturn created;\n};\n",
|
|
14
|
-
"import type { IslandFramework } from '../../types/island';\nimport { getIslandComponent, parseIslandProps } from '../core/islands';\nimport { getIslandStyleManifestKey } from '../core/islandManifest';\nimport { readIslandStyleNonce } from '../core/islandStylesheet';\nimport { initializeIslandMarkupSnapshot } from './preserveIslandMarkup';\nimport { prepareBrowserTranslationHydration } from './browserTranslation';\n\ninitializeIslandMarkupSnapshot();\n\ntype RuntimeIslandRegistry = Partial<\n\tRecord<IslandFramework, Record<string, unknown>>\n>;\n\ntype StartIslandsOptions = {\n\tregistry: RuntimeIslandRegistry;\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>;\n\troot?: ParentNode & Node;\n};\n\ntype IslandElement = HTMLElement & {\n\tdataset: DOMStringMap & {\n\t\tcomponent?: string;\n\t\terror?: string;\n\t\tframework?: IslandFramework;\n\t\thydrate?: string;\n\t\tislandId?: string;\n\t\tprops?: string;\n\t};\n};\n\nconst idleDeadline: IdleDeadline = {\n\tdidTimeout: false,\n\ttimeRemaining: () => 0\n};\n\nconst requestIdle =\n\ttypeof window !== 'undefined' && 'requestIdleCallback' in window\n\t\t? window.requestIdleCallback.bind(window)\n\t\t: (callback: IdleRequestCallback) =>\n\t\t\t\twindow.setTimeout(() => callback(idleDeadline), 1);\n\nconst isPropsRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isIslandElement = (value: EventTarget | null): value is IslandElement =>\n\tvalue instanceof HTMLElement && value.dataset.island === 'true';\n\nconst observedRoots = new WeakSet<Node>();\nconst hydratingIslands = new WeakSet<HTMLElement>();\n\nconst ISLAND_FRAMEWORKS: readonly IslandFramework[] = [\n\t'react',\n\t'svelte',\n\t'vue',\n\t'angular'\n];\n\nconst toIslandFramework = (value: string | undefined) =>\n\tISLAND_FRAMEWORKS.find((framework) => framework === value);\n\nconst readInjectedManifest = () => {\n\tconst manifest: unknown = Reflect.get(window, '__ABSOLUTE_MANIFEST__');\n\n\treturn typeof manifest === 'object' && manifest !== null\n\t\t? manifest\n\t\t: undefined;\n};\n\nconst findIslandStyleLinks = (key: string) =>\n\tArray.from(\n\t\tdocument.querySelectorAll<HTMLLinkElement>(\n\t\t\t'link[rel=\"stylesheet\"][data-island-style]'\n\t\t)\n\t).filter((link) => link.dataset.islandStyle === key);\n\nconst hasStylesheet = (href: string) => {\n\tconst target = new URL(href, document.baseURI).href;\n\n\treturn Array.from(\n\t\tdocument.querySelectorAll<HTMLLinkElement>('link[rel=\"stylesheet\"]')\n\t).some((link) => link.href === target);\n};\n\nconst createIslandStyleLink = (key: string, href: string) => {\n\tconst link = document.createElement('link');\n\tlink.rel = 'stylesheet';\n\tlink.href = href;\n\tlink.dataset.islandStyle = key;\n\tconst nonce = readIslandStyleNonce();\n\tif (nonce) link.nonce = nonce;\n\n\treturn link;\n};\n\n/* The server links the stylesheet of every island a page renders: in the\n * head of a whole document, next to the island on a streamed page (see\n * core/islandPageContext.ts). An island that arrives some other way (an\n * HTMX swap, a client-rendered fragment) links its own before it mounts:\n * a stylesheet, never an inline <style> a nonce-based CSP would block. */\nconst ensureIslandStylesheet = (framework: string, component: string) => {\n\tconst islandFramework = toIslandFramework(framework);\n\tconst manifest = readInjectedManifest();\n\tif (!islandFramework || !manifest) return;\n\n\tconst key = getIslandStyleManifestKey(islandFramework, component);\n\tconst href: unknown = Reflect.get(manifest, key);\n\tif (typeof href !== 'string' || hasStylesheet(href)) return;\n\n\tdocument.head.appendChild(createIslandStyleLink(key, href));\n};\n\n/* Dev HMR: point an island's stylesheet at its rebuilt file, wherever the\n * server put the link (the head, or next to the island on a streamed\n * page). The new link goes in right after the old one, keeping its place\n * in the cascade and its attributes (React's data-precedence), and the old\n * one leaves once the new one loads, so the island never shows unstyled. */\nconst swapIslandStylesheet = (\n\tframework: string,\n\tcomponent: string,\n\thref: string\n) => {\n\tconst islandFramework = toIslandFramework(framework);\n\tif (!islandFramework || hasStylesheet(href)) return;\n\n\tconst key = getIslandStyleManifestKey(islandFramework, component);\n\tconst previous = findIslandStyleLinks(key);\n\tconst anchor = previous[previous.length - 1];\n\tconst next = createIslandStyleLink(key, href);\n\tif (anchor) {\n\t\tfor (const { name, value } of Array.from(anchor.attributes))\n\t\t\tif (name !== 'href' && name !== 'nonce')\n\t\t\t\tnext.setAttribute(name, value);\n\t\tanchor.after(next);\n\t} else document.head.appendChild(next);\n\tconst removePrevious = () => {\n\t\tfor (const link of previous) link.remove();\n\t};\n\tnext.addEventListener('load', removePrevious, { once: true });\n\tnext.addEventListener('error', removePrevious, { once: true });\n\tconst manifest = readInjectedManifest();\n\tif (manifest) Reflect.set(manifest, key, href);\n};\n\nconst hydratePreservingBrowserTranslation = async (\n\telement: HTMLElement,\n\thydrate: () => unknown | Promise<unknown>\n) => {\n\tconst restoreTranslation = prepareBrowserTranslationHydration(element);\n\ttry {\n\t\tawait hydrate();\n\t} finally {\n\t\trestoreTranslation();\n\t}\n};\n\n// Framework-specific hydrators are dynamic-imported on first use so the\n// island runtime never statically pulls in a framework's runtime (and its\n// transitive deps) the consumer doesn't actually use. Without this, a\n// React-only project loading `@absolutejs/absolute/client` would resolve\n// every framework's peer deps — including `@angular/core` — and fail at\n// module load if any of them weren't installed.\nconst hydrateByFramework = async (\n\tregistry: RuntimeIslandRegistry,\n\tframework: IslandFramework,\n\tcomponentName: string,\n\telement: IslandElement,\n\tprops: unknown,\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>\n) => {\n\tconst propsRecord = isPropsRecord(props) ? props : undefined;\n\n\tif (framework === 'react') {\n\t\tconst { hydrateReactIsland, isReactComponent } =\n\t\t\tawait import('./hydrators/react');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.react?.[componentName]);\n\t\tif (!isReactComponent(resolvedComponent)) return;\n\n\t\thydrateReactIsland(resolvedComponent, element, propsRecord);\n\t\telement.dataset.hydrated = 'true';\n\n\t\treturn;\n\t}\n\n\tif (framework === 'svelte') {\n\t\tconst { hydrateSvelteIsland, isSvelteComponent } =\n\t\t\tawait import('./hydrators/svelte');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.svelte?.[componentName]);\n\t\tif (!isSvelteComponent(resolvedComponent)) return;\n\n\t\tawait hydratePreservingBrowserTranslation(element, () =>\n\t\t\thydrateSvelteIsland(resolvedComponent, element, propsRecord)\n\t\t);\n\t\telement.dataset.hydrated = 'true';\n\n\t\treturn;\n\t}\n\n\tif (framework === 'vue') {\n\t\tconst { hydrateVueIsland, isVueComponent } =\n\t\t\tawait import('./hydrators/vue');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.vue?.[componentName]);\n\t\tif (!isVueComponent(resolvedComponent)) return;\n\n\t\tawait hydratePreservingBrowserTranslation(element, () =>\n\t\t\thydrateVueIsland(resolvedComponent, element, propsRecord)\n\t\t);\n\t\telement.dataset.hydrated = 'true';\n\n\t\treturn;\n\t}\n\n\tif (framework === 'angular') {\n\t\tconst { mountAngularIsland, isAngularComponent } =\n\t\t\tawait import('../angular/islands');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.angular?.[componentName]);\n\t\tconst { islandId } = element.dataset;\n\t\tif (!isAngularComponent(resolvedComponent) || !islandId) return;\n\n\t\tawait hydratePreservingBrowserTranslation(element, () =>\n\t\t\tmountAngularIsland(\n\t\t\t\tresolvedComponent,\n\t\t\t\telement,\n\t\t\t\tpropsRecord ?? {},\n\t\t\t\tislandId\n\t\t\t)\n\t\t);\n\t\telement.dataset.hydrated = 'true';\n\t}\n};\n\nconst hydrateIsland = async (\n\tregistry: RuntimeIslandRegistry,\n\telement: IslandElement,\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>\n) => {\n\tif (element.dataset.hydrated === 'true' || hydratingIslands.has(element)) {\n\t\treturn;\n\t}\n\n\tconst { framework } = element.dataset;\n\tconst componentName = element.dataset.component;\n\tif (!framework || !componentName) return;\n\n\tconst props = parseIslandProps(element.getAttribute('data-props'));\n\thydratingIslands.add(element);\n\tensureIslandStylesheet(framework, componentName);\n\n\ttry {\n\t\tawait hydrateByFramework(\n\t\t\tregistry,\n\t\t\tframework,\n\t\t\tcomponentName,\n\t\t\telement,\n\t\t\tprops,\n\t\t\tresolveComponent\n\t\t);\n\t} catch (error) {\n\t\tconst message =\n\t\t\terror instanceof Error ? error.message : 'Unknown island error';\n\t\telement.dataset.error = message;\n\t\tconsole.error(\n\t\t\t`[islands] Failed to hydrate ${framework}:${componentName}`,\n\t\t\terror\n\t\t);\n\t} finally {\n\t\thydratingIslands.delete(element);\n\t}\n};\n\nconst scheduleIsland = (\n\tregistry: RuntimeIslandRegistry,\n\telement: IslandElement,\n\tobserver: IntersectionObserver | null,\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>\n) => {\n\tconst mode = element.dataset.hydrate ?? 'load';\n\tif (mode === 'none') return;\n\tif (mode === 'load') {\n\t\tvoid hydrateIsland(registry, element, resolveComponent);\n\n\t\treturn;\n\t}\n\tif (mode === 'idle') {\n\t\trequestIdle(\n\t\t\t() => void hydrateIsland(registry, element, resolveComponent)\n\t\t);\n\n\t\treturn;\n\t}\n\tif (mode === 'visible' && observer) {\n\t\tobserver.observe(element);\n\n\t\treturn;\n\t}\n\n\tvoid hydrateIsland(registry, element, resolveComponent);\n};\n\nconst collectIslandElements = (node: Node) => {\n\tconst islands: IslandElement[] = [];\n\tif (isIslandElement(node)) islands.push(node);\n\tif (!(node instanceof Element)) return islands;\n\n\tconst nested = node.querySelectorAll<IslandElement>('[data-island=\"true\"]');\n\tfor (const island of nested) {\n\t\tislands.push(island);\n\t}\n\n\treturn islands;\n};\n\ntype IslandHotUpdate = {\n\tcomponent: string;\n\tframework: string;\n\tmodulePath: string;\n\t/** The island's rebuilt stylesheet, when it has one. */\n\tstylePath?: string;\n};\n\nconst remountByFramework = async (\n\tframework: string,\n\tcomponent: unknown,\n\telement: IslandElement,\n\tprops: unknown\n) => {\n\tif (framework === 'react') {\n\t\tconst { remountReactIsland, isReactComponent } =\n\t\t\tawait import('./hydrators/react');\n\t\tif (!isReactComponent(component)) return false;\n\t\tremountReactIsland(component, element, props);\n\n\t\treturn true;\n\t}\n\tif (framework === 'svelte') {\n\t\tconst { remountSvelteIsland, isSvelteComponent } =\n\t\t\tawait import('./hydrators/svelte');\n\t\tif (!isSvelteComponent(component)) return false;\n\t\tawait remountSvelteIsland(component, element, props);\n\n\t\treturn true;\n\t}\n\tif (framework === 'vue') {\n\t\tconst { remountVueIsland, isVueComponent } =\n\t\t\tawait import('./hydrators/vue');\n\t\tif (!isVueComponent(component)) return false;\n\t\tremountVueIsland(component, element, props);\n\n\t\treturn true;\n\t}\n\n\t// Angular islands are bootstrapped applications; reload instead.\n\treturn false;\n};\n\nconst findIslandElements = (framework: string, component: string) =>\n\tArray.from(\n\t\tdocument.querySelectorAll<IslandElement>('[data-island=\"true\"]')\n\t).filter(\n\t\t(element) =>\n\t\t\telement.dataset.framework === framework &&\n\t\t\telement.dataset.component === component\n\t);\n\nconst remountIslandElement = async (\n\tupdate: IslandHotUpdate,\n\tcomponent: unknown,\n\telement: IslandElement\n) => {\n\t// Not hydrated yet (`visible`/`idle`/`none`): its first hydration\n\t// happens later; nothing on screen runs the old code.\n\tif (element.dataset.hydrated !== 'true') return true;\n\ttry {\n\t\treturn await remountByFramework(\n\t\t\tupdate.framework,\n\t\t\tcomponent,\n\t\t\telement,\n\t\t\tparseIslandProps(element.getAttribute('data-props'))\n\t\t);\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[islands] Failed to update ${update.framework}:${update.component}`,\n\t\t\terror\n\t\t);\n\n\t\treturn false;\n\t}\n};\n\nconst applyIslandHotUpdate = async (update: IslandHotUpdate) => {\n\tconst elements = findIslandElements(update.framework, update.component);\n\tif (elements.length === 0) return true;\n\n\tif (update.stylePath)\n\t\tswapIslandStylesheet(\n\t\t\tupdate.framework,\n\t\t\tupdate.component,\n\t\t\tupdate.stylePath\n\t\t);\n\tconst loadedModule: { default?: unknown } = await import(update.modulePath);\n\tconst results = await Promise.all(\n\t\telements.map((element) =>\n\t\t\tremountIslandElement(update, loadedModule.default, element)\n\t\t)\n\t);\n\n\treturn results.every(Boolean);\n};\n\n/* Dev HMR entry point (see Window['__ABS_ISLAND_HMR__']): re-mount every\n * island on this page that renders one of the rebuilt components. */\nconst applyIslandHotUpdates = async (updates: IslandHotUpdate[]) => {\n\ttry {\n\t\tconst results = await Promise.all(updates.map(applyIslandHotUpdate));\n\n\t\treturn results.every(Boolean);\n\t} catch (error) {\n\t\tconsole.error('[islands] Failed to load an updated island', error);\n\n\t\treturn false;\n\t}\n};\n\nexport const startIslands = ({\n\tregistry,\n\tresolveComponent,\n\troot = document.documentElement\n}: StartIslandsOptions) => {\n\tconst targetRoot = root instanceof Document ? root.documentElement : root;\n\tif (typeof window !== 'undefined') {\n\t\twindow.__ABS_ISLAND_HMR__ = applyIslandHotUpdates;\n\t}\n\n\tconst observer =\n\t\ttypeof IntersectionObserver === 'undefined'\n\t\t\t? null\n\t\t\t: new IntersectionObserver((entries) => {\n\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\tif (!entry.isIntersecting) continue;\n\t\t\t\t\t\tif (!isIslandElement(entry.target)) continue;\n\n\t\t\t\t\t\tobserver?.unobserve(entry.target);\n\t\t\t\t\t\tvoid hydrateIsland(\n\t\t\t\t\t\t\tregistry,\n\t\t\t\t\t\t\tentry.target,\n\t\t\t\t\t\t\tresolveComponent\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\tconst islands = targetRoot.querySelectorAll<IslandElement>(\n\t\t'[data-island=\"true\"]'\n\t);\n\tfor (const island of islands) {\n\t\tscheduleIsland(registry, island, observer, resolveComponent);\n\t}\n\n\tif (typeof MutationObserver === 'undefined') return;\n\tif (observedRoots.has(targetRoot)) return;\n\n\tconst mutationObserver = new MutationObserver((records) => {\n\t\tconst addedIslands = records.flatMap((record) =>\n\t\t\tArray.from(record.addedNodes).flatMap(collectIslandElements)\n\t\t);\n\t\tfor (const island of addedIslands) {\n\t\t\tscheduleIsland(registry, island, observer, resolveComponent);\n\t\t}\n\t});\n\n\tobservedRoots.add(targetRoot);\n\tmutationObserver.observe(targetRoot, {\n\t\tchildList: true,\n\t\tsubtree: true\n\t});\n};\n",
|
|
14
|
+
"import type { IslandFramework } from '../../types/island';\nimport { getIslandComponent, parseIslandProps } from '../core/islands';\nimport {\n\tgetIslandStyleManifestKey,\n\tREACT_PAGE_ROOT_EVENT\n} from '../core/islandManifest';\nimport { readIslandStyleNonce } from '../core/islandStylesheet';\nimport { initializeIslandMarkupSnapshot } from './preserveIslandMarkup';\nimport { prepareBrowserTranslationHydration } from './browserTranslation';\n\ninitializeIslandMarkupSnapshot();\n\ntype RuntimeIslandRegistry = Partial<\n\tRecord<IslandFramework, Record<string, unknown>>\n>;\n\ntype StartIslandsOptions = {\n\tregistry: RuntimeIslandRegistry;\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>;\n\troot?: ParentNode & Node;\n};\n\ntype IslandElement = HTMLElement & {\n\tdataset: DOMStringMap & {\n\t\tcomponent?: string;\n\t\terror?: string;\n\t\tframework?: IslandFramework;\n\t\thydrate?: string;\n\t\tislandId?: string;\n\t\tprops?: string;\n\t};\n};\n\nconst idleDeadline: IdleDeadline = {\n\tdidTimeout: false,\n\ttimeRemaining: () => 0\n};\n\nconst requestIdle =\n\ttypeof window !== 'undefined' && 'requestIdleCallback' in window\n\t\t? window.requestIdleCallback.bind(window)\n\t\t: (callback: IdleRequestCallback) =>\n\t\t\t\twindow.setTimeout(() => callback(idleDeadline), 1);\n\nconst isPropsRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isIslandElement = (value: EventTarget | null): value is IslandElement =>\n\tvalue instanceof HTMLElement && value.dataset.island === 'true';\n\nconst observedRoots = new WeakSet<Node>();\nconst hydratingIslands = new WeakSet<HTMLElement>();\n\nconst ISLAND_FRAMEWORKS: readonly IslandFramework[] = [\n\t'react',\n\t'svelte',\n\t'vue',\n\t'angular'\n];\n\nconst toIslandFramework = (value: string | undefined) =>\n\tISLAND_FRAMEWORKS.find((framework) => framework === value);\n\nconst readInjectedManifest = () => {\n\tconst manifest: unknown = Reflect.get(window, '__ABSOLUTE_MANIFEST__');\n\n\treturn typeof manifest === 'object' && manifest !== null\n\t\t? manifest\n\t\t: undefined;\n};\n\nconst findIslandStyleLinks = (key: string) =>\n\tArray.from(\n\t\tdocument.querySelectorAll<HTMLLinkElement>(\n\t\t\t'link[rel=\"stylesheet\"][data-island-style]'\n\t\t)\n\t).filter((link) => link.dataset.islandStyle === key);\n\nconst hasStylesheet = (href: string) => {\n\tconst target = new URL(href, document.baseURI).href;\n\n\treturn Array.from(\n\t\tdocument.querySelectorAll<HTMLLinkElement>('link[rel=\"stylesheet\"]')\n\t).some((link) => link.href === target);\n};\n\nconst createIslandStyleLink = (key: string, href: string) => {\n\tconst link = document.createElement('link');\n\tlink.rel = 'stylesheet';\n\tlink.href = href;\n\tlink.dataset.islandStyle = key;\n\tconst nonce = readIslandStyleNonce();\n\tif (nonce) link.nonce = nonce;\n\n\treturn link;\n};\n\n/* The server links the stylesheet of every island a page renders: in the\n * head of a whole document, next to the island on a streamed page (see\n * core/islandPageContext.ts). An island that arrives some other way (an\n * HTMX swap, a client-rendered fragment) links its own before it mounts:\n * a stylesheet, never an inline <style> a nonce-based CSP would block. */\nconst ensureIslandStylesheet = (framework: string, component: string) => {\n\tconst islandFramework = toIslandFramework(framework);\n\tconst manifest = readInjectedManifest();\n\tif (!islandFramework || !manifest) return;\n\n\tconst key = getIslandStyleManifestKey(islandFramework, component);\n\tconst href: unknown = Reflect.get(manifest, key);\n\tif (typeof href !== 'string' || hasStylesheet(href)) return;\n\n\tdocument.head.appendChild(createIslandStyleLink(key, href));\n};\n\n/* Dev HMR: point an island's stylesheet at its rebuilt file, wherever the\n * server put the link (the head, or next to the island on a streamed\n * page). The new link goes in right after the old one, keeping its place\n * in the cascade and its attributes (React's data-precedence), and the old\n * one leaves once the new one loads, so the island never shows unstyled. */\nconst swapIslandStylesheet = (\n\tframework: string,\n\tcomponent: string,\n\thref: string\n) => {\n\tconst islandFramework = toIslandFramework(framework);\n\tif (!islandFramework || hasStylesheet(href)) return;\n\n\tconst key = getIslandStyleManifestKey(islandFramework, component);\n\tconst previous = findIslandStyleLinks(key);\n\tconst anchor = previous[previous.length - 1];\n\tconst next = createIslandStyleLink(key, href);\n\tif (anchor) {\n\t\tfor (const { name, value } of Array.from(anchor.attributes))\n\t\t\tif (name !== 'href' && name !== 'nonce')\n\t\t\t\tnext.setAttribute(name, value);\n\t\tanchor.after(next);\n\t} else document.head.appendChild(next);\n\tconst removePrevious = () => {\n\t\tfor (const link of previous) link.remove();\n\t};\n\tnext.addEventListener('load', removePrevious, { once: true });\n\tnext.addEventListener('error', removePrevious, { once: true });\n\tconst manifest = readInjectedManifest();\n\tif (manifest) Reflect.set(manifest, key, href);\n};\n\nconst hydratePreservingBrowserTranslation = async (\n\telement: HTMLElement,\n\thydrate: () => unknown | Promise<unknown>\n) => {\n\tconst restoreTranslation = prepareBrowserTranslationHydration(element);\n\ttry {\n\t\tawait hydrate();\n\t} finally {\n\t\trestoreTranslation();\n\t}\n};\n\n// Framework-specific hydrators are dynamic-imported on first use so the\n// island runtime never statically pulls in a framework's runtime (and its\n// transitive deps) the consumer doesn't actually use. Without this, a\n// React-only project loading `@absolutejs/absolute/client` would resolve\n// every framework's peer deps — including `@angular/core` — and fail at\n// module load if any of them weren't installed.\nconst hydrateByFramework = async (\n\tregistry: RuntimeIslandRegistry,\n\tframework: IslandFramework,\n\tcomponentName: string,\n\telement: IslandElement,\n\tprops: unknown,\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>\n) => {\n\tconst propsRecord = isPropsRecord(props) ? props : undefined;\n\n\tif (framework === 'react') {\n\t\tconst { hydrateReactIsland, isReactComponent } =\n\t\t\tawait import('./hydrators/react');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.react?.[componentName]);\n\t\tif (!isReactComponent(resolvedComponent)) return;\n\n\t\thydrateReactIsland(resolvedComponent, element, propsRecord);\n\t\telement.dataset.hydrated = 'true';\n\n\t\treturn;\n\t}\n\n\tif (framework === 'svelte') {\n\t\tconst { hydrateSvelteIsland, isSvelteComponent } =\n\t\t\tawait import('./hydrators/svelte');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.svelte?.[componentName]);\n\t\tif (!isSvelteComponent(resolvedComponent)) return;\n\n\t\tawait hydratePreservingBrowserTranslation(element, () =>\n\t\t\thydrateSvelteIsland(resolvedComponent, element, propsRecord)\n\t\t);\n\t\telement.dataset.hydrated = 'true';\n\n\t\treturn;\n\t}\n\n\tif (framework === 'vue') {\n\t\tconst { hydrateVueIsland, isVueComponent } =\n\t\t\tawait import('./hydrators/vue');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.vue?.[componentName]);\n\t\tif (!isVueComponent(resolvedComponent)) return;\n\n\t\tawait hydratePreservingBrowserTranslation(element, () =>\n\t\t\thydrateVueIsland(resolvedComponent, element, propsRecord)\n\t\t);\n\t\telement.dataset.hydrated = 'true';\n\n\t\treturn;\n\t}\n\n\tif (framework === 'angular') {\n\t\tconst { mountAngularIsland, isAngularComponent } =\n\t\t\tawait import('../angular/islands');\n\t\tconst resolvedComponent =\n\t\t\t(await resolveComponent?.(framework, componentName)) ??\n\t\t\tgetIslandComponent(registry.angular?.[componentName]);\n\t\tconst { islandId } = element.dataset;\n\t\tif (!isAngularComponent(resolvedComponent) || !islandId) return;\n\n\t\tawait hydratePreservingBrowserTranslation(element, () =>\n\t\t\tmountAngularIsland(\n\t\t\t\tresolvedComponent,\n\t\t\t\telement,\n\t\t\t\tpropsRecord ?? {},\n\t\t\t\tislandId\n\t\t\t)\n\t\t);\n\t\telement.dataset.hydrated = 'true';\n\t}\n};\n\nconst hydrateIsland = async (\n\tregistry: RuntimeIslandRegistry,\n\telement: IslandElement,\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>\n) => {\n\tif (element.dataset.hydrated === 'true' || hydratingIslands.has(element)) {\n\t\treturn;\n\t}\n\n\tconst { framework } = element.dataset;\n\tconst componentName = element.dataset.component;\n\tif (!framework || !componentName) return;\n\n\tconst props = parseIslandProps(element.getAttribute('data-props'));\n\thydratingIslands.add(element);\n\tensureIslandStylesheet(framework, componentName);\n\n\ttry {\n\t\tawait hydrateByFramework(\n\t\t\tregistry,\n\t\t\tframework,\n\t\t\tcomponentName,\n\t\t\telement,\n\t\t\tprops,\n\t\t\tresolveComponent\n\t\t);\n\t} catch (error) {\n\t\tconst message =\n\t\t\terror instanceof Error ? error.message : 'Unknown island error';\n\t\telement.dataset.error = message;\n\t\tconsole.error(\n\t\t\t`[islands] Failed to hydrate ${framework}:${componentName}`,\n\t\t\terror\n\t\t);\n\t} finally {\n\t\thydratingIslands.delete(element);\n\t}\n};\n\nconst scheduleIsland = (\n\tregistry: RuntimeIslandRegistry,\n\telement: IslandElement,\n\tobserver: IntersectionObserver | null,\n\tresolveComponent?: (\n\t\tframework: IslandFramework,\n\t\tcomponent: string\n\t) => Promise<unknown>\n) => {\n\tconst mode = element.dataset.hydrate ?? 'load';\n\tif (mode === 'none') return;\n\tif (mode === 'load') {\n\t\tvoid hydrateIsland(registry, element, resolveComponent);\n\n\t\treturn;\n\t}\n\tif (mode === 'idle') {\n\t\trequestIdle(\n\t\t\t() => void hydrateIsland(registry, element, resolveComponent)\n\t\t);\n\n\t\treturn;\n\t}\n\tif (mode === 'visible' && observer) {\n\t\tobserver.observe(element);\n\n\t\treturn;\n\t}\n\n\tvoid hydrateIsland(registry, element, resolveComponent);\n};\n\nconst collectIslandElements = (node: Node) => {\n\tconst islands: IslandElement[] = [];\n\tif (isIslandElement(node)) islands.push(node);\n\tif (!(node instanceof Element)) return islands;\n\n\tconst nested = node.querySelectorAll<IslandElement>('[data-island=\"true\"]');\n\tfor (const island of nested) {\n\t\tislands.push(island);\n\t}\n\n\treturn islands;\n};\n\ntype IslandHotUpdate = {\n\tcomponent: string;\n\tframework: string;\n\tmodulePath: string;\n\t/** The island's rebuilt stylesheet, when it has one. */\n\tstylePath?: string;\n};\n\nconst remountByFramework = async (\n\tframework: string,\n\tcomponent: unknown,\n\telement: IslandElement,\n\tprops: unknown\n) => {\n\tif (framework === 'react') {\n\t\tconst { remountReactIsland, isReactComponent } =\n\t\t\tawait import('./hydrators/react');\n\t\tif (!isReactComponent(component)) return false;\n\t\tremountReactIsland(component, element, props);\n\n\t\treturn true;\n\t}\n\tif (framework === 'svelte') {\n\t\tconst { remountSvelteIsland, isSvelteComponent } =\n\t\t\tawait import('./hydrators/svelte');\n\t\tif (!isSvelteComponent(component)) return false;\n\t\tawait remountSvelteIsland(component, element, props);\n\n\t\treturn true;\n\t}\n\tif (framework === 'vue') {\n\t\tconst { remountVueIsland, isVueComponent } =\n\t\t\tawait import('./hydrators/vue');\n\t\tif (!isVueComponent(component)) return false;\n\t\tremountVueIsland(component, element, props);\n\n\t\treturn true;\n\t}\n\n\t// Angular islands are bootstrapped applications; reload instead.\n\treturn false;\n};\n\nconst findIslandElements = (framework: string, component: string) =>\n\tArray.from(\n\t\tdocument.querySelectorAll<IslandElement>('[data-island=\"true\"]')\n\t).filter(\n\t\t(element) =>\n\t\t\telement.dataset.framework === framework &&\n\t\t\telement.dataset.component === component\n\t);\n\nconst remountIslandElement = async (\n\tupdate: IslandHotUpdate,\n\tcomponent: unknown,\n\telement: IslandElement\n) => {\n\t// Not hydrated yet (`visible`/`idle`/`none`): its first hydration\n\t// happens later; nothing on screen runs the old code.\n\tif (element.dataset.hydrated !== 'true') return true;\n\ttry {\n\t\treturn await remountByFramework(\n\t\t\tupdate.framework,\n\t\t\tcomponent,\n\t\t\telement,\n\t\t\tparseIslandProps(element.getAttribute('data-props'))\n\t\t);\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[islands] Failed to update ${update.framework}:${update.component}`,\n\t\t\terror\n\t\t);\n\n\t\treturn false;\n\t}\n};\n\n/* Hand the rebuilt component to its framework's own HMR, which keeps the\n * island's state where that framework would on a page: React Fast Refresh\n * keeps hook state when the hooks are unchanged, Vue keeps state across a\n * template or style edit. Svelte's HMR recreates the component it swaps,\n * so a Svelte island re-mounts (its state starts over either way). False\n * sends every island to a re-mount. */\nconst updateWithFrameworkHmr = async (\n\tupdate: IslandHotUpdate,\n\tcomponent: unknown,\n\thydrated: IslandElement[],\n\tvueBefore: Record<string, unknown> | undefined\n) => {\n\tif (update.framework === 'react') {\n\t\tconst { refreshReactIslands } = await import('./hydrators/react');\n\n\t\treturn refreshReactIslands(component, hydrated);\n\t}\n\tif (update.framework !== 'vue' || !vueBefore) return false;\n\tconst { hotUpdateVueIslands } = await import('./hydrators/vue');\n\n\treturn hotUpdateVueIslands(vueBefore, component, hydrated);\n};\n\nconst updateInPlace = async (\n\tupdate: IslandHotUpdate,\n\tcomponent: unknown,\n\telements: IslandElement[],\n\tvueBefore: Record<string, unknown> | undefined\n) => {\n\t// Not hydrated yet: nothing on screen runs the old code.\n\tconst hydrated = elements.filter(\n\t\t(element) => element.dataset.hydrated === 'true'\n\t);\n\tif (hydrated.length === 0) return false;\n\ttry {\n\t\treturn await updateWithFrameworkHmr(\n\t\t\tupdate,\n\t\t\tcomponent,\n\t\t\thydrated,\n\t\t\tvueBefore\n\t\t);\n\t} catch (error) {\n\t\tconsole.warn(\n\t\t\t`[islands] ${update.framework}:${update.component} could not update in place, re-mounting`,\n\t\t\terror\n\t\t);\n\n\t\treturn false;\n\t}\n};\n\nconst applyIslandHotUpdate = async (update: IslandHotUpdate) => {\n\tconst elements = findIslandElements(update.framework, update.component);\n\tif (elements.length === 0) return true;\n\n\tif (update.stylePath)\n\t\tswapIslandStylesheet(\n\t\t\tupdate.framework,\n\t\t\tupdate.component,\n\t\t\tupdate.stylePath\n\t\t);\n\tconst vueBefore =\n\t\tupdate.framework === 'vue'\n\t\t\t? (await import('./hydrators/vue')).snapshotVueHmrComponents()\n\t\t\t: undefined;\n\tconst loadedModule: { default?: unknown } = await import(update.modulePath);\n\tif (await updateInPlace(update, loadedModule.default, elements, vueBefore))\n\t\treturn true;\n\tconst results = await Promise.all(\n\t\telements.map((element) =>\n\t\t\tremountIslandElement(update, loadedModule.default, element)\n\t\t)\n\t);\n\n\treturn results.every(Boolean);\n};\n\n/* Dev HMR entry point (see Window['__ABS_ISLAND_HMR__']): re-mount every\n * island on this page that renders one of the rebuilt components. */\nconst applyIslandHotUpdates = async (updates: IslandHotUpdate[]) => {\n\ttry {\n\t\tconst results = await Promise.all(updates.map(applyIslandHotUpdate));\n\n\t\treturn results.every(Boolean);\n\t} catch (error) {\n\t\tconsole.error('[islands] Failed to load an updated island', error);\n\n\t\treturn false;\n\t}\n};\n\n/* On a React page the page's own root must exist before any island root.\n * React DOM listens for events once per document: the first root created\n * in it marks the document as listened to, and a root created on the\n * document afterwards skips registering its listeners, so the whole page\n * (everything outside the islands) never handles an event. The islands\n * bootstrap often runs first, since the page's module graph is larger, so\n * a React page's islands wait for its root (the page's index dispatches\n * REACT_PAGE_ROOT_EVENT), or for `load`, by which time the page's script\n * has run or failed. */\nconst waitForReactPageRoot = () => {\n\tif (Reflect.get(window, '__ABS_ISLAND_HOST__') !== 'react')\n\t\treturn undefined;\n\tif (window.__REACT_ROOT__ || document.readyState === 'complete')\n\t\treturn undefined;\n\n\treturn new Promise<void>((resolve) => {\n\t\tconst done = () => {\n\t\t\twindow.removeEventListener(REACT_PAGE_ROOT_EVENT, done);\n\t\t\twindow.removeEventListener('load', done);\n\t\t\tresolve();\n\t\t};\n\t\twindow.addEventListener(REACT_PAGE_ROOT_EVENT, done);\n\t\twindow.addEventListener('load', done);\n\t});\n};\n\nconst scheduleIslands = ({\n\tregistry,\n\tresolveComponent,\n\troot = document.documentElement\n}: StartIslandsOptions) => {\n\tconst targetRoot = root instanceof Document ? root.documentElement : root;\n\n\tconst observer =\n\t\ttypeof IntersectionObserver === 'undefined'\n\t\t\t? null\n\t\t\t: new IntersectionObserver((entries) => {\n\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\tif (!entry.isIntersecting) continue;\n\t\t\t\t\t\tif (!isIslandElement(entry.target)) continue;\n\n\t\t\t\t\t\tobserver?.unobserve(entry.target);\n\t\t\t\t\t\tvoid hydrateIsland(\n\t\t\t\t\t\t\tregistry,\n\t\t\t\t\t\t\tentry.target,\n\t\t\t\t\t\t\tresolveComponent\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\tconst islands = targetRoot.querySelectorAll<IslandElement>(\n\t\t'[data-island=\"true\"]'\n\t);\n\tfor (const island of islands) {\n\t\tscheduleIsland(registry, island, observer, resolveComponent);\n\t}\n\n\tif (typeof MutationObserver === 'undefined') return;\n\tif (observedRoots.has(targetRoot)) return;\n\n\tconst mutationObserver = new MutationObserver((records) => {\n\t\tconst addedIslands = records.flatMap((record) =>\n\t\t\tArray.from(record.addedNodes).flatMap(collectIslandElements)\n\t\t);\n\t\tfor (const island of addedIslands) {\n\t\t\tscheduleIsland(registry, island, observer, resolveComponent);\n\t\t}\n\t});\n\n\tobservedRoots.add(targetRoot);\n\tmutationObserver.observe(targetRoot, {\n\t\tchildList: true,\n\t\tsubtree: true\n\t});\n};\n\nexport const startIslands = (options: StartIslandsOptions) => {\n\tif (typeof window !== 'undefined') {\n\t\twindow.__ABS_ISLAND_HMR__ = applyIslandHotUpdates;\n\t}\n\tconst pageRoot =\n\t\ttypeof window === 'undefined' ? undefined : waitForReactPageRoot();\n\tif (pageRoot) {\n\t\tvoid pageRoot.then(() => scheduleIslands(options));\n\n\t\treturn;\n\t}\n\tscheduleIslands(options);\n};\n",
|
|
15
15
|
"import type { ActionResult } from '../../types/formAction';\n\n/* The wire contract between `defineAction` (server) and the browser\n * helpers (`submitFormAction`, `enhanceForms`, `useFormAction`). Browser\n * safe: no server imports. */\n\n/* - ACTION_ERROR_ATTRIBUTE: element whose text becomes the named field's\n * error (`data-action-error=\"email\"`).\n * - ACTION_FORM_ATTRIBUTE: marks a plain <form> for `enhanceForms()` and\n * for the server's no-JS result rendering.\n * - ACTION_MESSAGE_ATTRIBUTE: element whose text becomes the form-level\n * error message.\n * - ACTION_REQUEST_HEADER: sent by the browser helpers so the action\n * answers with JSON instead of redirecting.\n * - ACTION_STATUS_ATTRIBUTE: set on the form, `success` or `error`.\n * - ACTION_SUCCESS_ATTRIBUTE: element shown (its `hidden` removed) after\n * a successful submission. */\nexport const ACTION_ERROR_ATTRIBUTE = 'data-action-error';\nexport const ACTION_FORM_ATTRIBUTE = 'data-absolute-action';\nexport const ACTION_MESSAGE_ATTRIBUTE = 'data-action-message';\nexport const ACTION_REQUEST_HEADER = 'x-absolute-action';\nexport const ACTION_STATUS_ATTRIBUTE = 'data-action-status';\nexport const ACTION_SUCCESS_ATTRIBUTE = 'data-action-success';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isStringRecord = (value: unknown) =>\n\tisRecord(value) &&\n\tObject.values(value).every((entry) => typeof entry === 'string');\n\nconst isOptionalString = (value: unknown) =>\n\tvalue === undefined || typeof value === 'string';\n\n/** True for a well-formed action result. The type parameters let callers\n * name the action's data and fields; only the shape is checked. */\nexport const isActionResult = <Data = unknown, Fields extends string = string>(\n\tvalue: unknown\n): value is ActionResult<Data, Fields> => {\n\tif (!isRecord(value)) return false;\n\tif (value.status === 'success') return isOptionalString(value.redirect);\n\n\treturn (\n\t\tvalue.status === 'error' &&\n\t\tisStringRecord(value.errors) &&\n\t\tisOptionalString(value.message)\n\t);\n};\n",
|
|
16
16
|
"import type {\n\tActionData,\n\tActionErrorState,\n\tActionFields,\n\tActionPath,\n\tActionResult,\n\tAnyFormAction\n} from '../../types/formAction';\nimport {\n\tACTION_ERROR_ATTRIBUTE,\n\tACTION_FORM_ATTRIBUTE,\n\tACTION_MESSAGE_ATTRIBUTE,\n\tACTION_REQUEST_HEADER,\n\tACTION_STATUS_ATTRIBUTE,\n\tACTION_SUCCESS_ATTRIBUTE,\n\tisActionResult\n} from '../utils/formActionProtocol';\n\n/* Browser side of form actions. `submitFormAction` posts a FormData and\n * returns the typed result; `enhanceForms` upgrades plain\n * `<form data-absolute-action>` markup (static HTML and HTMX pages) so it\n * submits without a reload. Without JavaScript the same forms post\n * normally and the server renders the result. */\n\nexport type SubmitFormActionOptions = {\n\tsignal?: AbortSignal;\n};\n\nconst failure = (message: string): ActionErrorState => ({\n\terrors: {},\n\tmessage,\n\tstatus: 'error'\n});\n\nconst readPayload = async (response: Response) => {\n\ttry {\n\t\tconst payload: unknown = await response.json();\n\n\t\treturn payload;\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n\n/** A reducer for React 19's `useActionState` (JavaScript-only: React\n * renders function form actions as `javascript:` URLs on the server; use\n * `useFormAction` for forms that also work without JavaScript). */\nexport const formActionReducer =\n\t<Action extends AnyFormAction = AnyFormAction>(path: ActionPath<Action>) =>\n\tasync (_previous: unknown, body: FormData) =>\n\t\tsubmitFormAction<Action>(path, body);\n\n/** Posts `body` to the action at `path` and returns its result. Network\n * and unexpected server failures come back as an error state with a\n * `message`; an aborted request rejects with the abort error. */\nexport const submitFormAction = async <\n\tAction extends AnyFormAction = AnyFormAction\n>(\n\tpath: ActionPath<Action>,\n\tbody: FormData,\n\toptions: SubmitFormActionOptions = {}\n) => {\n\ttype Result = ActionResult<ActionData<Action>, ActionFields<Action>>;\n\tconst response = await fetch(path, {\n\t\tbody,\n\t\tcredentials: 'same-origin',\n\t\theaders: { accept: 'application/json', [ACTION_REQUEST_HEADER]: '1' },\n\t\tmethod: 'POST',\n\t\tsignal: options.signal\n\t}).catch((error: unknown) => {\n\t\tif (options.signal?.aborted) throw error;\n\n\t\treturn undefined;\n\t});\n\tif (!response) {\n\t\tconst result: Result = failure('Network error: the form was not sent.');\n\n\t\treturn result;\n\t}\n\tconst payload = await readPayload(response);\n\tif (isActionResult<ActionData<Action>, ActionFields<Action>>(payload))\n\t\treturn payload;\n\tconst result: Result = failure(\n\t\t`The server could not handle the form (HTTP ${response.status}).`\n\t);\n\n\treturn result;\n};\n\n/* ---------------------------------------------------------------- *\n * Plain <form data-absolute-action> enhancement\n * ---------------------------------------------------------------- */\n\nexport type FormActionEventDetail = { result: ActionResult };\n\n/** Fired on the form after every enhanced submission. */\nexport const FORM_ACTION_EVENT = 'absolute:form-action';\n\nconst namedControls = (form: HTMLFormElement) =>\n\tArray.from(form.elements).filter(\n\t\t(element): element is HTMLElement & { name: string } =>\n\t\t\telement instanceof HTMLElement &&\n\t\t\t'name' in element &&\n\t\t\ttypeof element.name === 'string' &&\n\t\t\telement.name !== ''\n\t);\n\nconst markControls = (form: HTMLFormElement, result: ActionResult) => {\n\tconst errors = result.status === 'error' ? result.errors : {};\n\tconst invalid = namedControls(form).filter((control) => {\n\t\tconst message = errors[control.name];\n\t\tif (message) control.setAttribute('aria-invalid', 'true');\n\t\telse control.removeAttribute('aria-invalid');\n\n\t\treturn Boolean(message);\n\t});\n\n\treturn invalid[0];\n};\n\nconst fillErrors = (form: HTMLFormElement, result: ActionResult) => {\n\tconst errors = result.status === 'error' ? result.errors : {};\n\tform.querySelectorAll<HTMLElement>(`[${ACTION_ERROR_ATTRIBUTE}]`).forEach(\n\t\t(element) => {\n\t\t\tconst name = element.getAttribute(ACTION_ERROR_ATTRIBUTE) ?? '';\n\t\t\tconst message = errors[name] ?? '';\n\t\t\telement.textContent = message;\n\t\t\telement.hidden = message === '';\n\t\t}\n\t);\n};\n\nconst fillMessages = (form: HTMLFormElement, result: ActionResult) => {\n\tconst message = result.status === 'error' ? (result.message ?? '') : '';\n\tform.querySelectorAll<HTMLElement>(`[${ACTION_MESSAGE_ATTRIBUTE}]`).forEach(\n\t\t(element) => {\n\t\t\telement.textContent = message;\n\t\t\telement.hidden = message === '';\n\t\t}\n\t);\n\tform.querySelectorAll<HTMLElement>(`[${ACTION_SUCCESS_ATTRIBUTE}]`).forEach(\n\t\t(element) => {\n\t\t\telement.hidden = result.status !== 'success';\n\t\t}\n\t);\n};\n\n/** Writes `result` into a plain form: field errors into\n * `[data-action-error=\"field\"]`, the message into `[data-action-message]`,\n * `[data-action-success]` shown on success, `aria-invalid` on the fields\n * and `data-action-status` on the form. Focuses the first invalid field. */\nexport const applyActionResult = (\n\tform: HTMLFormElement,\n\tresult: ActionResult\n) => {\n\tform.setAttribute(ACTION_STATUS_ATTRIBUTE, result.status);\n\tfillErrors(form, result);\n\tfillMessages(form, result);\n\tconst firstInvalid = markControls(form, result);\n\tfirstInvalid?.focus();\n};\n\nconst setPending = (form: HTMLFormElement, pending: boolean) => {\n\tform.toggleAttribute('aria-busy', pending);\n\tform.toggleAttribute('data-action-pending', pending);\n\tform.querySelectorAll<HTMLButtonElement | HTMLInputElement>(\n\t\t'button[type=\"submit\"], button:not([type]), input[type=\"submit\"]'\n\t).forEach((button) => {\n\t\tbutton.disabled = pending;\n\t});\n};\n\nconst finishSubmission = (form: HTMLFormElement, result: ActionResult) => {\n\tapplyActionResult(form, result);\n\tconst detail: FormActionEventDetail = { result };\n\tform.dispatchEvent(\n\t\tnew CustomEvent(FORM_ACTION_EVENT, { bubbles: true, detail })\n\t);\n\tif (result.status !== 'success') return;\n\tif (result.redirect) window.location.assign(result.redirect);\n\telse form.reset();\n};\n\nconst formActionUrl = (form: HTMLFormElement) => {\n\tconst url = new URL(form.action, window.location.href);\n\n\treturn `${url.pathname}${url.search}`;\n};\n\n/** Submits `form` with fetch instead of a page load. Returns a function\n * that removes the enhancement. */\nexport const enhanceForm = (form: HTMLFormElement) => {\n\tlet controller: AbortController | undefined;\n\tconst submit = async (event: SubmitEvent) => {\n\t\tevent.preventDefault();\n\t\tcontroller?.abort();\n\t\tconst current = new AbortController();\n\t\tcontroller = current;\n\t\tconst body = new FormData(form, event.submitter);\n\t\tsetPending(form, true);\n\t\tconst result = await submitFormAction(formActionUrl(form), body, {\n\t\t\tsignal: current.signal\n\t\t}).catch(() => undefined);\n\t\tif (controller !== current) return;\n\t\tsetPending(form, false);\n\t\tif (result) finishSubmission(form, result);\n\t};\n\tconst listener = (event: SubmitEvent) => {\n\t\tvoid submit(event);\n\t};\n\tform.addEventListener('submit', listener);\n\n\treturn () => {\n\t\tcontroller?.abort();\n\t\tform.removeEventListener('submit', listener);\n\t};\n};\n\n/* HTMX already submits these; enhancing them too would post twice. */\nconst isHtmxForm = (form: HTMLFormElement) =>\n\tform.hasAttribute('hx-post') || form.hasAttribute('data-hx-post');\n\n/** Enhances every `<form data-absolute-action>` under `root` (except\n * `hx-post` forms, which HTMX submits). Returns a function that removes\n * the enhancements. */\nexport const enhanceForms = (root: ParentNode = document) => {\n\tconst cleanups = Array.from(\n\t\troot.querySelectorAll<HTMLFormElement>(`form[${ACTION_FORM_ATTRIBUTE}]`)\n\t)\n\t\t.filter((form) => !isHtmxForm(form))\n\t\t.map((form) => enhanceForm(form));\n\n\treturn () => cleanups.forEach((cleanup) => cleanup());\n};\n"
|
|
17
17
|
],
|
|
18
|
-
"mappings": "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",
|
|
19
|
-
"debugId": "
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "ABCC00A159C9E47464756E2164756E21",
|
|
20
20
|
"names": []
|
|
21
21
|
}
|
|
@@ -121,6 +121,109 @@ const forceReloadVueComponent = (mod: Record<string, unknown>) => {
|
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
+
/* A page that exports `routes = defineRoutes([...])` gets its router from
|
|
125
|
+
* the auto-generated setupApp, which runs once at boot. Re-importing the
|
|
126
|
+
* edited page module re-evaluates `routes` but leaves the live router on the
|
|
127
|
+
* boot-time table, so a route added to the page could not be navigated to
|
|
128
|
+
* (the router saw no match and fell back to a full page load) and a removed
|
|
129
|
+
* one still rendered. Swap the live router's table for the new one. */
|
|
130
|
+
type RouteMatch = { path: string };
|
|
131
|
+
|
|
132
|
+
type LiveVueRouter = {
|
|
133
|
+
addRoute: (route: Record<string, unknown>) => unknown;
|
|
134
|
+
clearRoutes?: () => void;
|
|
135
|
+
currentRoute: { value: { fullPath: string; matched: RouteMatch[] } };
|
|
136
|
+
options?: { routes?: unknown };
|
|
137
|
+
replace: (to: string) => Promise<unknown>;
|
|
138
|
+
resolve: (to: string) => { matched: RouteMatch[] };
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
142
|
+
typeof value === 'object' && value !== null;
|
|
143
|
+
|
|
144
|
+
const isLiveVueRouter = (value: unknown): value is LiveVueRouter =>
|
|
145
|
+
isRecord(value) &&
|
|
146
|
+
typeof value.addRoute === 'function' &&
|
|
147
|
+
typeof value.resolve === 'function' &&
|
|
148
|
+
typeof value.replace === 'function' &&
|
|
149
|
+
isRecord(value.currentRoute);
|
|
150
|
+
|
|
151
|
+
const readLiveVueRouter = () => {
|
|
152
|
+
const app = window.__VUE_APP__;
|
|
153
|
+
const config = app ? Reflect.get(app, 'config') : undefined;
|
|
154
|
+
const globals = isRecord(config)
|
|
155
|
+
? Reflect.get(config, 'globalProperties')
|
|
156
|
+
: undefined;
|
|
157
|
+
const router = isRecord(globals) ? Reflect.get(globals, '$router') : null;
|
|
158
|
+
|
|
159
|
+
return isLiveVueRouter(router) ? router : null;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/* Route shape without the component loaders: the module server re-stamps
|
|
163
|
+
* import URLs on every edit, which would make every save look like a route
|
|
164
|
+
* table change and remount the current route. */
|
|
165
|
+
const describeRoutes = (routes: unknown): unknown[] =>
|
|
166
|
+
Array.isArray(routes)
|
|
167
|
+
? routes.map((route) =>
|
|
168
|
+
isRecord(route)
|
|
169
|
+
? {
|
|
170
|
+
alias: route.alias,
|
|
171
|
+
children: describeRoutes(route.children),
|
|
172
|
+
name:
|
|
173
|
+
typeof route.name === 'symbol'
|
|
174
|
+
? String(route.name)
|
|
175
|
+
: route.name,
|
|
176
|
+
path: route.path,
|
|
177
|
+
redirect:
|
|
178
|
+
typeof route.redirect === 'function'
|
|
179
|
+
? String(route.redirect)
|
|
180
|
+
: route.redirect
|
|
181
|
+
}
|
|
182
|
+
: null
|
|
183
|
+
)
|
|
184
|
+
: [];
|
|
185
|
+
|
|
186
|
+
const routeTableSignature = (routes: unknown) =>
|
|
187
|
+
JSON.stringify(describeRoutes(routes));
|
|
188
|
+
|
|
189
|
+
const appliedRouteTables = new WeakMap<LiveVueRouter, string>();
|
|
190
|
+
|
|
191
|
+
const matchedPaths = (matched: RouteMatch[]) =>
|
|
192
|
+
matched.map((record) => record.path).join('\n');
|
|
193
|
+
|
|
194
|
+
/* Returns `reload` when the change can't be applied in place: the router
|
|
195
|
+
* predates `clearRoutes` (vue-router < 4.4), or the route the page is on no
|
|
196
|
+
* longer exists — the server now answers it 404, so load that. */
|
|
197
|
+
const syncVueRoutes = (mod: unknown) => {
|
|
198
|
+
const routes = isRecord(mod) ? mod.routes : undefined;
|
|
199
|
+
if (!Array.isArray(routes)) return 'unchanged';
|
|
200
|
+
const router = readLiveVueRouter();
|
|
201
|
+
if (!router) return 'unchanged';
|
|
202
|
+
const next = routeTableSignature(routes);
|
|
203
|
+
const previous =
|
|
204
|
+
appliedRouteTables.get(router) ??
|
|
205
|
+
routeTableSignature(router.options?.routes);
|
|
206
|
+
if (next === previous) return 'unchanged';
|
|
207
|
+
if (typeof router.clearRoutes !== 'function') return 'reload';
|
|
208
|
+
|
|
209
|
+
router.clearRoutes();
|
|
210
|
+
for (const route of routes) {
|
|
211
|
+
if (isRecord(route)) router.addRoute(route);
|
|
212
|
+
}
|
|
213
|
+
appliedRouteTables.set(router, next);
|
|
214
|
+
|
|
215
|
+
const current = router.currentRoute.value;
|
|
216
|
+
const resolved = router.resolve(current.fullPath);
|
|
217
|
+
if (resolved.matched.length === 0) return 'reload';
|
|
218
|
+
// The current location now resolves to different records (its route was
|
|
219
|
+
// edited): navigate in place so RouterView renders the new ones.
|
|
220
|
+
if (matchedPaths(resolved.matched) !== matchedPaths(current.matched)) {
|
|
221
|
+
void router.replace(current.fullPath);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return 'synced';
|
|
225
|
+
};
|
|
226
|
+
|
|
124
227
|
export const handleVueUpdate = (message: {
|
|
125
228
|
data: {
|
|
126
229
|
cssBaseName?: string;
|
|
@@ -208,6 +311,19 @@ export const handleVueUpdate = (message: {
|
|
|
208
311
|
}
|
|
209
312
|
sessionStorage.removeItem('__HMR_ACTIVE__');
|
|
210
313
|
|
|
314
|
+
if (syncVueRoutes(mod) === 'reload') {
|
|
315
|
+
sendAbsoluteHmrTiming({
|
|
316
|
+
clientStart,
|
|
317
|
+
kind: 'component',
|
|
318
|
+
outcome: 'reloaded',
|
|
319
|
+
serverMs: message.data.serverDuration,
|
|
320
|
+
updateId: message.timestamp
|
|
321
|
+
});
|
|
322
|
+
window.location.reload();
|
|
323
|
+
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
|
|
211
327
|
if (message.data.serverDuration !== undefined) {
|
|
212
328
|
sendAbsoluteHmrTiming({
|
|
213
329
|
clientStart,
|