@absolutejs/absolute 0.19.0-beta.295 → 0.19.0-beta.297
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/browser.js +63 -11
- package/dist/react/browser.js.map +6 -5
- package/dist/src/client/preserveIslandMarkup.d.ts +17 -0
- package/dist/src/vue/Island.browser.d.ts +13 -0
- package/dist/src/vue/browser.d.ts +1 -0
- package/dist/vue/browser.js +88 -6
- package/dist/vue/browser.js.map +6 -4
- package/dist/vue/index.js +62 -11
- package/dist/vue/index.js.map +5 -4
- package/package.json +1 -1
package/dist/react/browser.js
CHANGED
|
@@ -141,23 +141,75 @@ var init_islandMarkupAttributes = __esm(() => {
|
|
|
141
141
|
init_islands();
|
|
142
142
|
});
|
|
143
143
|
|
|
144
|
-
// src/
|
|
144
|
+
// src/client/preserveIslandMarkup.ts
|
|
145
145
|
init_islandMarkupAttributes();
|
|
146
|
+
var getClaimMap = () => {
|
|
147
|
+
if (typeof window === "undefined") {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
window.__ABS_CLAIMED_ISLAND_MARKUP__ ??= new Map;
|
|
151
|
+
return window.__ABS_CLAIMED_ISLAND_MARKUP__;
|
|
152
|
+
};
|
|
153
|
+
var getIslandSignature = (props) => {
|
|
154
|
+
const attributes = getIslandMarkerAttributes(props);
|
|
155
|
+
return [
|
|
156
|
+
attributes["data-component"],
|
|
157
|
+
attributes["data-framework"],
|
|
158
|
+
attributes["data-hydrate"],
|
|
159
|
+
attributes["data-props"]
|
|
160
|
+
].join("::");
|
|
161
|
+
};
|
|
162
|
+
var isMatchingIslandElement = (element, props) => {
|
|
163
|
+
if (!(element instanceof HTMLElement)) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
const attributes = getIslandMarkerAttributes(props);
|
|
167
|
+
return element.dataset.island === "true" && element.dataset.component === attributes["data-component"] && element.dataset.framework === attributes["data-framework"] && (element.dataset.hydrate ?? "load") === attributes["data-hydrate"] && (element.dataset.props ?? "{}") === attributes["data-props"];
|
|
168
|
+
};
|
|
169
|
+
var preserveIslandMarkup = (props) => {
|
|
170
|
+
if (typeof document === "undefined") {
|
|
171
|
+
return {
|
|
172
|
+
attributes: getIslandMarkerAttributes(props),
|
|
173
|
+
innerHTML: ""
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const claimMap = getClaimMap();
|
|
177
|
+
const signature = getIslandSignature(props);
|
|
178
|
+
const claimedCount = claimMap?.get(signature) ?? 0;
|
|
179
|
+
const candidates = Array.from(document.querySelectorAll('[data-island="true"]')).filter((element) => isMatchingIslandElement(element, props));
|
|
180
|
+
const candidate = candidates[claimedCount];
|
|
181
|
+
if (claimMap) {
|
|
182
|
+
claimMap.set(signature, claimedCount + 1);
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
attributes: getIslandMarkerAttributes(props),
|
|
186
|
+
innerHTML: candidate?.innerHTML ?? ""
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// src/react/createIsland.browser.tsx
|
|
146
191
|
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
147
192
|
var createIsland = (_registry) => {
|
|
148
|
-
const Island = (props) =>
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
193
|
+
const Island = (props) => {
|
|
194
|
+
const { attributes, innerHTML } = preserveIslandMarkup(props);
|
|
195
|
+
return /* @__PURE__ */ jsxDEV("div", {
|
|
196
|
+
...attributes,
|
|
197
|
+
dangerouslySetInnerHTML: { __html: innerHTML },
|
|
198
|
+
suppressHydrationWarning: true
|
|
199
|
+
}, undefined, false, undefined, this);
|
|
200
|
+
};
|
|
152
201
|
return Island;
|
|
153
202
|
};
|
|
154
203
|
// src/react/Island.browser.tsx
|
|
155
|
-
init_islandMarkupAttributes();
|
|
156
204
|
import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
|
|
157
|
-
var Island = (props) =>
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
205
|
+
var Island = (props) => {
|
|
206
|
+
const { attributes, innerHTML } = preserveIslandMarkup(props);
|
|
207
|
+
return /* @__PURE__ */ jsxDEV2("div", {
|
|
208
|
+
...attributes,
|
|
209
|
+
dangerouslySetInnerHTML: { __html: innerHTML },
|
|
210
|
+
suppressHydrationWarning: true
|
|
211
|
+
}, undefined, false, undefined, this);
|
|
212
|
+
};
|
|
161
213
|
// src/react/hooks/useIslandState.ts
|
|
162
214
|
import {
|
|
163
215
|
useSyncExternalStore
|
|
@@ -252,5 +304,5 @@ export {
|
|
|
252
304
|
Island
|
|
253
305
|
};
|
|
254
306
|
|
|
255
|
-
//# debugId=
|
|
307
|
+
//# debugId=D221870BA533367A64756E2164756E21
|
|
256
308
|
//# sourceMappingURL=browser.js.map
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/core/islandManifest.ts", "../src/core/islands.ts", "../src/core/islandMarkupAttributes.ts", "../src/react/createIsland.browser.tsx", "../src/react/Island.browser.tsx", "../src/react/hooks/useIslandState.ts", "../src/client/islandState.ts"],
|
|
3
|
+
"sources": ["../src/core/islandManifest.ts", "../src/core/islands.ts", "../src/core/islandMarkupAttributes.ts", "../src/client/preserveIslandMarkup.ts", "../src/react/createIsland.browser.tsx", "../src/react/Island.browser.tsx", "../src/react/hooks/useIslandState.ts", "../src/client/islandState.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { IslandFramework } from '../../types/island';\n\nconst toIslandFrameworkSegment = (framework: IslandFramework) =>\n\tframework[0]?.toUpperCase() + framework.slice(1);\n\nexport const getIslandManifestKey = (\n\tframework: IslandFramework,\n\tcomponent: string\n) => `Island${toIslandFrameworkSegment(framework)}${component}`;\n\nexport const getIslandManifestEntries = (\n\tmanifest: Record<string, string>\n) => {\n\tconst islands: Partial<Record<IslandFramework, Record<string, string>>> = {};\n\tconst frameworks: IslandFramework[] = [\n\t\t'react',\n\t\t'svelte',\n\t\t'vue',\n\t\t'angular'\n\t];\n\n\tfor (const framework of frameworks) {\n\t\tconst prefix = `Island${toIslandFrameworkSegment(framework)}`;\n\t\tfor (const [key, value] of Object.entries(manifest)) {\n\t\t\tif (!key.startsWith(prefix)) continue;\n\n\t\t\tconst component = key.slice(prefix.length);\n\t\t\tif (!component) continue;\n\n\t\t\tconst frameworkEntries = islands[framework] ?? {};\n\t\t\tframeworkEntries[component] = value;\n\t\t\tislands[framework] = frameworkEntries;\n\t\t}\n\t}\n\n\treturn islands;\n};\n",
|
|
6
6
|
"import type {\n\tIslandComponentDefinition,\n\tIslandRegistry,\n\tIslandRegistryInput\n} from '../../types/island';\n\nexport const defineIslandRegistry = <T extends IslandRegistryInput>(\n\tregistry: IslandRegistry<T>\n) => registry;\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});\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\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}\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};\n\nexport const serializeIslandProps = (props: unknown) =>\n\tJSON.stringify(props ?? {});\n\nexport const parseIslandProps = (rawProps: string | null) => {\n\tif (!rawProps) return {};\n\n\treturn JSON.parse(rawProps);\n};\n\nexport { getIslandManifestEntries, getIslandManifestKey } from './islandManifest';\n",
|
|
7
7
|
"import type {\n\tRuntimeIslandRenderProps\n} from '../../types/island';\nimport { serializeIslandProps } from './islands';\n\ntype IslandMarkerAttributes = {\n\t'data-component': string;\n\t'data-framework': string;\n\t'data-hydrate': string;\n\t'data-island': 'true';\n\t'data-island-id'?: string;\n\t'data-props': string;\n};\n\nexport const getIslandMarkerAttributes = (\n\tprops: RuntimeIslandRenderProps,\n\tislandId?: string\n): IslandMarkerAttributes => ({\n\t'data-component': props.component,\n\t'data-framework': props.framework,\n\t'data-hydrate': props.hydrate ?? 'load',\n\t'data-island': 'true',\n\t...(islandId ? { 'data-island-id': islandId } : {}),\n\t'data-props': serializeIslandProps(props.props)\n});\n\nconst escapeHtmlAttribute = (value: string) =>\n\tvalue\n\t\t.replaceAll('&', '&')\n\t\t.replaceAll('\"', '"')\n\t\t.replaceAll('<', '<')\n\t\t.replaceAll('>', '>');\n\nexport const serializeIslandAttributes = (\n\tattributes: IslandMarkerAttributes\n) =>\n\tObject.entries(attributes)\n\t\t.map(([key, value]) => `${key}=\"${escapeHtmlAttribute(value)}\"`)\n\t\t.join(' ');\n\n",
|
|
8
|
-
"import type {
|
|
9
|
-
"import type { JSX } from 'react';\nimport type {
|
|
8
|
+
"import type { RuntimeIslandRenderProps } from '../../types/island';\nimport { getIslandMarkerAttributes } from '../core/islandMarkupAttributes';\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\tprops?: string;\n\t};\n};\n\ndeclare global {\n\tinterface Window {\n\t\t__ABS_CLAIMED_ISLAND_MARKUP__?: Map<string, number>;\n\t}\n}\n\nconst getClaimMap = () => {\n\tif (typeof window === 'undefined') {\n\t\treturn null;\n\t}\n\n\twindow.__ABS_CLAIMED_ISLAND_MARKUP__ ??= new Map<string, number>();\n\n\treturn window.__ABS_CLAIMED_ISLAND_MARKUP__;\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\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 claimMap = getClaimMap();\n\tconst signature = getIslandSignature(props);\n\tconst claimedCount = claimMap?.get(signature) ?? 0;\n\tconst candidates = Array.from(\n\t\tdocument.querySelectorAll('[data-island=\"true\"]')\n\t).filter((element) => isMatchingIslandElement(element, props));\n\tconst candidate = candidates[claimedCount];\n\tif (claimMap) {\n\t\tclaimMap.set(signature, claimedCount + 1);\n\t}\n\n\treturn {\n\t\tattributes: getIslandMarkerAttributes(props),\n\t\tinnerHTML: candidate?.innerHTML ?? ''\n\t};\n};\n",
|
|
9
|
+
"import type { JSX } from 'react';\nimport type {\n\tIslandRegistry,\n\tIslandRegistryInput,\n\tTypedIslandRenderProps\n} from '../../types/island';\nimport { preserveIslandMarkup } from '../client/preserveIslandMarkup';\n\nexport const createIsland = <T extends IslandRegistryInput>(\n\t_registry: IslandRegistry<T>\n) => {\n\tconst Island = (props: TypedIslandRenderProps<T>): JSX.Element => {\n\t\tconst { attributes, innerHTML } = preserveIslandMarkup(props);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\t{...attributes}\n\t\t\t\tdangerouslySetInnerHTML={{ __html: innerHTML }}\n\t\t\t\tsuppressHydrationWarning\n\t\t\t/>\n\t\t);\n\t};\n\n\treturn Island;\n};\n",
|
|
10
|
+
"import type { JSX } from 'react';\nimport type { RuntimeIslandRenderProps } from '../../types/island';\nimport { preserveIslandMarkup } from '../client/preserveIslandMarkup';\n\nexport const Island = (props: RuntimeIslandRenderProps): JSX.Element => {\n\tconst { attributes, innerHTML } = preserveIslandMarkup(props);\n\n\treturn (\n\t\t<div\n\t\t\t{...attributes}\n\t\t\tdangerouslySetInnerHTML={{ __html: innerHTML }}\n\t\t\tsuppressHydrationWarning\n\t\t/>\n\t);\n};\n",
|
|
10
11
|
"import {\n\tuseSyncExternalStore,\n\ttype Dispatch,\n\ttype SetStateAction\n} from 'react';\nimport {\n\treadIslandState,\n\tsubscribeIslandState,\n\tupdateIslandState\n} from '../../client/islandState';\n\nexport const useIslandState = <T>(\n\tkey: string,\n\tfallback: T\n): [T, Dispatch<SetStateAction<T>>] => {\n\tconst value = useSyncExternalStore(\n\t\t(listener) => subscribeIslandState(key, listener),\n\t\t() => readIslandState(key, fallback),\n\t\t() => fallback\n\t);\n\n\tconst setValue: Dispatch<SetStateAction<T>> = (nextValue) => {\n\t\tupdateIslandState(key, fallback, nextValue);\n\t};\n\n\treturn [value, setValue];\n};\n",
|
|
11
12
|
"type IslandStateKey = string;\n\ntype IslandStateValue = unknown;\n\ntype IslandStateListener = () => void;\n\ntype IslandStateUpdater<T> = T | ((value: T) => T);\n\ntype IslandStateSnapshot = Record<IslandStateKey, IslandStateValue>;\n\nconst isIslandStateUpdater = <T>(\n\tvalue: IslandStateUpdater<T>\n): value is (value: T) => T => typeof value === 'function';\n\ndeclare global {\n\tvar __ABS_ISLAND_STATE_STORE__: IslandStateStore | undefined;\n\tvar __ABS_ISLAND_STATE__: IslandStateSnapshot | undefined;\n}\n\nclass IslandStateStore {\n\tprivate listeners = new Map<IslandStateKey, Set<IslandStateListener>>();\n\n\tprivate state: Record<IslandStateKey, any> = {};\n\n\tget<T>(key: IslandStateKey, fallback: T): T {\n\t\tif (key in this.state) {\n\t\t\treturn this.state[key];\n\t\t}\n\n\t\treturn fallback;\n\t}\n\n\tinitialize(nextState: IslandStateSnapshot) {\n\t\tfor (const [key, value] of Object.entries(nextState)) {\n\t\t\tif (key in this.state) continue;\n\t\t\tthis.state[key] = value;\n\t\t}\n\t}\n\n\tset<T>(key: IslandStateKey, value: T) {\n\t\tthis.state[key] = value;\n\t\tglobalThis.__ABS_ISLAND_STATE__ = {\n\t\t\t...(globalThis.__ABS_ISLAND_STATE__ ?? {}),\n\t\t\t[key]: value\n\t\t};\n\t\tthis.emit(key);\n\t\treturn value;\n\t}\n\n\tsubscribe(key: IslandStateKey, listener: IslandStateListener) {\n\t\tconst listeners = this.listeners.get(key) ?? new Set<IslandStateListener>();\n\t\tlisteners.add(listener);\n\t\tthis.listeners.set(key, listeners);\n\n\t\treturn () => {\n\t\t\tconst current = this.listeners.get(key);\n\t\t\tif (!current) return;\n\n\t\t\tcurrent.delete(listener);\n\t\t\tif (current.size === 0) {\n\t\t\t\tthis.listeners.delete(key);\n\t\t\t}\n\t\t};\n\t}\n\n\tupdate<T>(key: IslandStateKey, fallback: T, updater: IslandStateUpdater<T>) {\n\t\tconst previous = this.get(key, fallback);\n\t\tconst nextValue =\n\t\t\tisIslandStateUpdater(updater)\n\t\t\t\t? updater(previous)\n\t\t\t\t: updater;\n\n\t\treturn this.set(key, nextValue);\n\t}\n\n\tprivate emit(key: IslandStateKey) {\n\t\tconst listeners = this.listeners.get(key);\n\t\tif (!listeners) return;\n\n\t\tfor (const listener of listeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n}\n\nconst getGlobalIslandStateStore = () => {\n\tglobalThis.__ABS_ISLAND_STATE_STORE__ ??= new IslandStateStore();\n\n\tif (globalThis.__ABS_ISLAND_STATE__) {\n\t\tglobalThis.__ABS_ISLAND_STATE_STORE__.initialize(\n\t\t\tglobalThis.__ABS_ISLAND_STATE__\n\t\t);\n\t}\n\n\treturn globalThis.__ABS_ISLAND_STATE_STORE__;\n};\n\nexport const initializeIslandState = (state: IslandStateSnapshot) => {\n\tglobalThis.__ABS_ISLAND_STATE__ = {\n\t\t...(globalThis.__ABS_ISLAND_STATE__ ?? {}),\n\t\t...state\n\t};\n\n\tgetGlobalIslandStateStore().initialize(state);\n};\n\nexport const readIslandState = <T>(key: IslandStateKey, fallback: T) =>\n\tgetGlobalIslandStateStore().get(key, fallback);\n\nexport const setIslandState = <T>(key: IslandStateKey, value: T) =>\n\tgetGlobalIslandStateStore().set(key, value);\n\nexport const subscribeIslandState = (\n\tkey: IslandStateKey,\n\tlistener: IslandStateListener\n) => getGlobalIslandStateStore().subscribe(key, listener);\n\nexport const updateIslandState = <T>(\n\tkey: IslandStateKey,\n\tfallback: T,\n\tupdater: IslandStateUpdater<T>\n) => getGlobalIslandStateStore().update(key, fallback, updater);\n"
|
|
12
13
|
],
|
|
13
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEM,2BAA2B,CAAC,cACjC,UAAU,IAAI,YAAY,IAAI,UAAU,MAAM,CAAC,GAEnC,uBAAuB,CACnC,WACA,cACI,SAAS,yBAAyB,SAAS,IAAI,aAEvC,2BAA2B,CACvC,aACI;AAAA,EACJ,MAAM,UAAoE,CAAC;AAAA,EAC3E,MAAM,aAAgC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EAEA,WAAW,aAAa,YAAY;AAAA,IACnC,MAAM,SAAS,SAAS,yBAAyB,SAAS;AAAA,IAC1D,YAAY,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAAG;AAAA,MACpD,IAAI,CAAC,IAAI,WAAW,MAAM;AAAA,QAAG;AAAA,MAE7B,MAAM,YAAY,IAAI,MAAM,OAAO,MAAM;AAAA,MACzC,IAAI,CAAC;AAAA,QAAW;AAAA,MAEhB,MAAM,mBAAmB,QAAQ,cAAc,CAAC;AAAA,MAChD,iBAAiB,aAAa;AAAA,MAC9B,QAAQ,aAAa;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;;;ACED,SAAS,kBAA6B,CAC5C,WACC;AAAA,EACD,IAAI,4BAA4B,SAAS,GAAG;AAAA,IAC3C,OAAO,UAAU;AAAA,EAClB;AAAA,EAEA,OAAO;AAAA;AAAA,IAtCK,uBAAuB,CACnC,aACI,UAEQ,wBAAwB,CACpC,WACA,aAI2C;AAAA,EAC3C;AAAA,EACA,QAAQ,QAAQ;AAAA,EAChB,QAAQ,QAAQ;AACjB,IAEM,WAAW,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU,MAE3B,8BAA8B,CAC1C,UAEA,SAAS,KAAK,MACd,eAAe,WACf,YAAY,UACZ,OAAO,MAAM,WAAW,UAgBZ,0BAA0B,CACtC,cACI;AAAA,EACJ,IAAI,CAAC,4BAA4B,SAAS;AAAA,IAAG,OAAO;AAAA,EAEpD,OAAO;AAAA,IACN,QAAQ,UAAU;AAAA,IAClB,QAAQ,UAAU;AAAA,EACnB;AAAA,GAGY,uBAAuB,CAAC,UACpC,KAAK,UAAU,SAAS,CAAC,CAAC,GAEd,mBAAmB,CAAC,aAA4B;AAAA,EAC5D,IAAI,CAAC;AAAA,IAAU,OAAO,CAAC;AAAA,EAEvB,OAAO,KAAK,MAAM,QAAQ;AAAA;AAAA;;;IClDd,4BAA4B,CACxC,OACA,cAC6B;AAAA,EAC7B,kBAAkB,MAAM;AAAA,EACxB,kBAAkB,MAAM;AAAA,EACxB,gBAAgB,MAAM,WAAW;AAAA,EACjC,eAAe;AAAA,KACX,WAAW,EAAE,kBAAkB,SAAS,IAAI,CAAC;AAAA,EACjD,cAAc,qBAAqB,MAAM,KAAK;AAC/C,IAEM,sBAAsB,CAAC,UAC5B,MACE,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,GAEZ,4BAA4B,CACxC,eAEA,OAAO,QAAQ,UAAU,EACvB,IAAI,EAAE,KAAK,WAAW,GAAG,QAAQ,oBAAoB,KAAK,IAAI,EAC9D,KAAK,GAAG;AAAA;AAAA,EAnCX;AAAA;;;
|
|
14
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "D221870BA533367A64756E2164756E21",
|
|
15
16
|
"names": []
|
|
16
17
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RuntimeIslandRenderProps } from '../../types/island';
|
|
2
|
+
declare global {
|
|
3
|
+
interface Window {
|
|
4
|
+
__ABS_CLAIMED_ISLAND_MARKUP__?: Map<string, number>;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export declare const preserveIslandMarkup: (props: RuntimeIslandRenderProps) => {
|
|
8
|
+
attributes: {
|
|
9
|
+
'data-component': string;
|
|
10
|
+
'data-framework': string;
|
|
11
|
+
'data-hydrate': string;
|
|
12
|
+
'data-island': "true";
|
|
13
|
+
'data-island-id'?: string;
|
|
14
|
+
'data-props': string;
|
|
15
|
+
};
|
|
16
|
+
innerHTML: string;
|
|
17
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const Island: import("vue").DefineComponent<{
|
|
2
|
+
component: string;
|
|
3
|
+
framework: import("..").IslandFramework;
|
|
4
|
+
hydrate?: import("..").IslandHydrate | undefined;
|
|
5
|
+
props: Record<string, unknown>;
|
|
6
|
+
}, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
|
|
9
|
+
component: string;
|
|
10
|
+
framework: import("..").IslandFramework;
|
|
11
|
+
hydrate?: import("..").IslandHydrate | undefined;
|
|
12
|
+
props: Record<string, unknown>;
|
|
13
|
+
}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
package/dist/vue/browser.js
CHANGED
|
@@ -142,8 +142,55 @@ var init_islandMarkupAttributes = __esm(() => {
|
|
|
142
142
|
});
|
|
143
143
|
|
|
144
144
|
// src/vue/createIsland.browser.ts
|
|
145
|
-
init_islandMarkupAttributes();
|
|
146
145
|
import { defineComponent, h } from "vue";
|
|
146
|
+
|
|
147
|
+
// src/client/preserveIslandMarkup.ts
|
|
148
|
+
init_islandMarkupAttributes();
|
|
149
|
+
var getClaimMap = () => {
|
|
150
|
+
if (typeof window === "undefined") {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
window.__ABS_CLAIMED_ISLAND_MARKUP__ ??= new Map;
|
|
154
|
+
return window.__ABS_CLAIMED_ISLAND_MARKUP__;
|
|
155
|
+
};
|
|
156
|
+
var getIslandSignature = (props) => {
|
|
157
|
+
const attributes = getIslandMarkerAttributes(props);
|
|
158
|
+
return [
|
|
159
|
+
attributes["data-component"],
|
|
160
|
+
attributes["data-framework"],
|
|
161
|
+
attributes["data-hydrate"],
|
|
162
|
+
attributes["data-props"]
|
|
163
|
+
].join("::");
|
|
164
|
+
};
|
|
165
|
+
var isMatchingIslandElement = (element, props) => {
|
|
166
|
+
if (!(element instanceof HTMLElement)) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
const attributes = getIslandMarkerAttributes(props);
|
|
170
|
+
return element.dataset.island === "true" && element.dataset.component === attributes["data-component"] && element.dataset.framework === attributes["data-framework"] && (element.dataset.hydrate ?? "load") === attributes["data-hydrate"] && (element.dataset.props ?? "{}") === attributes["data-props"];
|
|
171
|
+
};
|
|
172
|
+
var preserveIslandMarkup = (props) => {
|
|
173
|
+
if (typeof document === "undefined") {
|
|
174
|
+
return {
|
|
175
|
+
attributes: getIslandMarkerAttributes(props),
|
|
176
|
+
innerHTML: ""
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const claimMap = getClaimMap();
|
|
180
|
+
const signature = getIslandSignature(props);
|
|
181
|
+
const claimedCount = claimMap?.get(signature) ?? 0;
|
|
182
|
+
const candidates = Array.from(document.querySelectorAll('[data-island="true"]')).filter((element) => isMatchingIslandElement(element, props));
|
|
183
|
+
const candidate = candidates[claimedCount];
|
|
184
|
+
if (claimMap) {
|
|
185
|
+
claimMap.set(signature, claimedCount + 1);
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
attributes: getIslandMarkerAttributes(props),
|
|
189
|
+
innerHTML: candidate?.innerHTML ?? ""
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// src/vue/createIsland.browser.ts
|
|
147
194
|
var defineRuntimeIslandComponent = (setup) => defineComponent({
|
|
148
195
|
name: "AbsoluteIsland",
|
|
149
196
|
props: {
|
|
@@ -167,12 +214,46 @@ var defineRuntimeIslandComponent = (setup) => defineComponent({
|
|
|
167
214
|
setup
|
|
168
215
|
});
|
|
169
216
|
var createIsland = (_registry) => defineRuntimeIslandComponent((props) => {
|
|
170
|
-
const
|
|
217
|
+
const { attributes, innerHTML } = preserveIslandMarkup(props);
|
|
171
218
|
return () => h("div", {
|
|
172
|
-
...
|
|
173
|
-
"data-allow-mismatch": ""
|
|
219
|
+
...attributes,
|
|
220
|
+
"data-allow-mismatch": "",
|
|
221
|
+
innerHTML
|
|
174
222
|
});
|
|
175
223
|
});
|
|
224
|
+
// src/vue/Island.browser.ts
|
|
225
|
+
import { defineComponent as defineComponent2, h as h2 } from "vue";
|
|
226
|
+
var Island = defineComponent2({
|
|
227
|
+
name: "AbsoluteIsland",
|
|
228
|
+
props: {
|
|
229
|
+
component: {
|
|
230
|
+
required: true,
|
|
231
|
+
type: String
|
|
232
|
+
},
|
|
233
|
+
framework: {
|
|
234
|
+
required: true,
|
|
235
|
+
type: String
|
|
236
|
+
},
|
|
237
|
+
hydrate: {
|
|
238
|
+
required: false,
|
|
239
|
+
type: String
|
|
240
|
+
},
|
|
241
|
+
props: {
|
|
242
|
+
required: true,
|
|
243
|
+
type: Object
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
setup(props) {
|
|
247
|
+
return () => {
|
|
248
|
+
const { attributes, innerHTML } = preserveIslandMarkup(props);
|
|
249
|
+
return h2("div", {
|
|
250
|
+
...attributes,
|
|
251
|
+
"data-allow-mismatch": "",
|
|
252
|
+
innerHTML
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
});
|
|
176
257
|
// src/vue/useIslandState.ts
|
|
177
258
|
import {
|
|
178
259
|
customRef,
|
|
@@ -282,8 +363,9 @@ var useIslandState = (key, fallback) => {
|
|
|
282
363
|
};
|
|
283
364
|
export {
|
|
284
365
|
useIslandState,
|
|
285
|
-
createIsland
|
|
366
|
+
createIsland,
|
|
367
|
+
Island
|
|
286
368
|
};
|
|
287
369
|
|
|
288
|
-
//# debugId=
|
|
370
|
+
//# debugId=F010A820B6EAF6D164756E2164756E21
|
|
289
371
|
//# sourceMappingURL=browser.js.map
|
package/dist/vue/browser.js.map
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/core/islandManifest.ts", "../src/core/islands.ts", "../src/core/islandMarkupAttributes.ts", "../src/vue/createIsland.browser.ts", "../src/vue/useIslandState.ts", "../src/client/islandState.ts"],
|
|
3
|
+
"sources": ["../src/core/islandManifest.ts", "../src/core/islands.ts", "../src/core/islandMarkupAttributes.ts", "../src/vue/createIsland.browser.ts", "../src/client/preserveIslandMarkup.ts", "../src/vue/Island.browser.ts", "../src/vue/useIslandState.ts", "../src/client/islandState.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { IslandFramework } from '../../types/island';\n\nconst toIslandFrameworkSegment = (framework: IslandFramework) =>\n\tframework[0]?.toUpperCase() + framework.slice(1);\n\nexport const getIslandManifestKey = (\n\tframework: IslandFramework,\n\tcomponent: string\n) => `Island${toIslandFrameworkSegment(framework)}${component}`;\n\nexport const getIslandManifestEntries = (\n\tmanifest: Record<string, string>\n) => {\n\tconst islands: Partial<Record<IslandFramework, Record<string, string>>> = {};\n\tconst frameworks: IslandFramework[] = [\n\t\t'react',\n\t\t'svelte',\n\t\t'vue',\n\t\t'angular'\n\t];\n\n\tfor (const framework of frameworks) {\n\t\tconst prefix = `Island${toIslandFrameworkSegment(framework)}`;\n\t\tfor (const [key, value] of Object.entries(manifest)) {\n\t\t\tif (!key.startsWith(prefix)) continue;\n\n\t\t\tconst component = key.slice(prefix.length);\n\t\t\tif (!component) continue;\n\n\t\t\tconst frameworkEntries = islands[framework] ?? {};\n\t\t\tframeworkEntries[component] = value;\n\t\t\tislands[framework] = frameworkEntries;\n\t\t}\n\t}\n\n\treturn islands;\n};\n",
|
|
6
6
|
"import type {\n\tIslandComponentDefinition,\n\tIslandRegistry,\n\tIslandRegistryInput\n} from '../../types/island';\n\nexport const defineIslandRegistry = <T extends IslandRegistryInput>(\n\tregistry: IslandRegistry<T>\n) => registry;\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});\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\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}\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};\n\nexport const serializeIslandProps = (props: unknown) =>\n\tJSON.stringify(props ?? {});\n\nexport const parseIslandProps = (rawProps: string | null) => {\n\tif (!rawProps) return {};\n\n\treturn JSON.parse(rawProps);\n};\n\nexport { getIslandManifestEntries, getIslandManifestKey } from './islandManifest';\n",
|
|
7
7
|
"import type {\n\tRuntimeIslandRenderProps\n} from '../../types/island';\nimport { serializeIslandProps } from './islands';\n\ntype IslandMarkerAttributes = {\n\t'data-component': string;\n\t'data-framework': string;\n\t'data-hydrate': string;\n\t'data-island': 'true';\n\t'data-island-id'?: string;\n\t'data-props': string;\n};\n\nexport const getIslandMarkerAttributes = (\n\tprops: RuntimeIslandRenderProps,\n\tislandId?: string\n): IslandMarkerAttributes => ({\n\t'data-component': props.component,\n\t'data-framework': props.framework,\n\t'data-hydrate': props.hydrate ?? 'load',\n\t'data-island': 'true',\n\t...(islandId ? { 'data-island-id': islandId } : {}),\n\t'data-props': serializeIslandProps(props.props)\n});\n\nconst escapeHtmlAttribute = (value: string) =>\n\tvalue\n\t\t.replaceAll('&', '&')\n\t\t.replaceAll('\"', '"')\n\t\t.replaceAll('<', '<')\n\t\t.replaceAll('>', '>');\n\nexport const serializeIslandAttributes = (\n\tattributes: IslandMarkerAttributes\n) =>\n\tObject.entries(attributes)\n\t\t.map(([key, value]) => `${key}=\"${escapeHtmlAttribute(value)}\"`)\n\t\t.join(' ');\n\n",
|
|
8
|
-
"import { defineComponent, h } from 'vue';\nimport type {\n\tIslandRegistry,\n\tIslandRegistryInput,\n\tRuntimeIslandRenderProps,\n\tTypedIslandRenderProps\n} from '../../types/island';\nimport {
|
|
8
|
+
"import { defineComponent, h } from 'vue';\nimport type {\n\tIslandRegistry,\n\tIslandRegistryInput,\n\tRuntimeIslandRenderProps,\n\tTypedIslandRenderProps\n} from '../../types/island';\nimport { preserveIslandMarkup } from '../client/preserveIslandMarkup';\n\ntype VueIslandComponent<T extends IslandRegistryInput> = new () => {\n\t$props: TypedIslandRenderProps<T>;\n};\n\nconst defineRuntimeIslandComponent = (\n\tsetup: (props: RuntimeIslandRenderProps) => () => ReturnType<typeof h>\n): any =>\n\tdefineComponent({\n\t\tname: 'AbsoluteIsland',\n\t\tprops: {\n\t\t\tcomponent: {\n\t\t\t\trequired: true,\n\t\t\t\ttype: String\n\t\t\t},\n\t\t\tframework: {\n\t\t\t\trequired: true,\n\t\t\t\ttype: String\n\t\t\t},\n\t\t\thydrate: {\n\t\t\t\trequired: false,\n\t\t\t\ttype: String\n\t\t\t},\n\t\t\tprops: {\n\t\t\t\trequired: true,\n\t\t\t\ttype: Object\n\t\t\t}\n\t\t},\n\t\tsetup\n\t});\n\nexport const createIsland = <T extends IslandRegistryInput>(\n\t_registry: IslandRegistry<T>\n): VueIslandComponent<T> =>\n\tdefineRuntimeIslandComponent((props) => {\n\t\tconst { attributes, innerHTML } = preserveIslandMarkup(props);\n\n\t\treturn () =>\n\t\t\th('div', {\n\t\t\t\t...attributes,\n\t\t\t\t'data-allow-mismatch': '',\n\t\t\t\tinnerHTML\n\t\t\t});\n\t});\n",
|
|
9
|
+
"import type { RuntimeIslandRenderProps } from '../../types/island';\nimport { getIslandMarkerAttributes } from '../core/islandMarkupAttributes';\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\tprops?: string;\n\t};\n};\n\ndeclare global {\n\tinterface Window {\n\t\t__ABS_CLAIMED_ISLAND_MARKUP__?: Map<string, number>;\n\t}\n}\n\nconst getClaimMap = () => {\n\tif (typeof window === 'undefined') {\n\t\treturn null;\n\t}\n\n\twindow.__ABS_CLAIMED_ISLAND_MARKUP__ ??= new Map<string, number>();\n\n\treturn window.__ABS_CLAIMED_ISLAND_MARKUP__;\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\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 claimMap = getClaimMap();\n\tconst signature = getIslandSignature(props);\n\tconst claimedCount = claimMap?.get(signature) ?? 0;\n\tconst candidates = Array.from(\n\t\tdocument.querySelectorAll('[data-island=\"true\"]')\n\t).filter((element) => isMatchingIslandElement(element, props));\n\tconst candidate = candidates[claimedCount];\n\tif (claimMap) {\n\t\tclaimMap.set(signature, claimedCount + 1);\n\t}\n\n\treturn {\n\t\tattributes: getIslandMarkerAttributes(props),\n\t\tinnerHTML: candidate?.innerHTML ?? ''\n\t};\n};\n",
|
|
10
|
+
"import { defineComponent, h } from 'vue';\nimport type { RuntimeIslandRenderProps } from '../../types/island';\nimport { preserveIslandMarkup } from '../client/preserveIslandMarkup';\n\nexport const Island = defineComponent({\n\tname: 'AbsoluteIsland',\n\tprops: {\n\t\tcomponent: {\n\t\t\trequired: true,\n\t\t\ttype: String\n\t\t},\n\t\tframework: {\n\t\t\trequired: true,\n\t\t\ttype: String\n\t\t},\n\t\thydrate: {\n\t\t\trequired: false,\n\t\t\ttype: String\n\t\t},\n\t\tprops: {\n\t\t\trequired: true,\n\t\t\ttype: Object\n\t\t}\n\t},\n\tsetup(props: RuntimeIslandRenderProps) {\n\t\treturn () => {\n\t\t\tconst { attributes, innerHTML } = preserveIslandMarkup(props);\n\n\t\t\treturn h('div', {\n\t\t\t\t...attributes,\n\t\t\t\t'data-allow-mismatch': '',\n\t\t\t\tinnerHTML\n\t\t\t});\n\t\t};\n\t}\n});\n",
|
|
9
11
|
"import {\n\tcustomRef,\n\tonBeforeUnmount,\n\ttype Ref\n} from 'vue';\nimport {\n\treadIslandState,\n\tsubscribeIslandState,\n\tupdateIslandState\n} from '../client/islandState';\n\nexport const useIslandState = <T>(key: string, fallback: T): Ref<T> => {\n\tlet current = readIslandState(key, fallback);\n\tlet unsubscribe = () => {};\n\n\tconst state = customRef<T>((track, trigger) => {\n\t\tunsubscribe = subscribeIslandState(key, () => {\n\t\t\tcurrent = readIslandState(key, fallback);\n\t\t\ttrigger();\n\t\t});\n\n\t\treturn {\n\t\t\tget() {\n\t\t\t\ttrack();\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tcurrent = value;\n\t\t\t\tupdateIslandState(key, fallback, value);\n\t\t\t\ttrigger();\n\t\t\t}\n\t\t};\n\t});\n\n\tonBeforeUnmount(() => {\n\t\tunsubscribe();\n\t});\n\n\treturn state;\n};\n",
|
|
10
12
|
"type IslandStateKey = string;\n\ntype IslandStateValue = unknown;\n\ntype IslandStateListener = () => void;\n\ntype IslandStateUpdater<T> = T | ((value: T) => T);\n\ntype IslandStateSnapshot = Record<IslandStateKey, IslandStateValue>;\n\nconst isIslandStateUpdater = <T>(\n\tvalue: IslandStateUpdater<T>\n): value is (value: T) => T => typeof value === 'function';\n\ndeclare global {\n\tvar __ABS_ISLAND_STATE_STORE__: IslandStateStore | undefined;\n\tvar __ABS_ISLAND_STATE__: IslandStateSnapshot | undefined;\n}\n\nclass IslandStateStore {\n\tprivate listeners = new Map<IslandStateKey, Set<IslandStateListener>>();\n\n\tprivate state: Record<IslandStateKey, any> = {};\n\n\tget<T>(key: IslandStateKey, fallback: T): T {\n\t\tif (key in this.state) {\n\t\t\treturn this.state[key];\n\t\t}\n\n\t\treturn fallback;\n\t}\n\n\tinitialize(nextState: IslandStateSnapshot) {\n\t\tfor (const [key, value] of Object.entries(nextState)) {\n\t\t\tif (key in this.state) continue;\n\t\t\tthis.state[key] = value;\n\t\t}\n\t}\n\n\tset<T>(key: IslandStateKey, value: T) {\n\t\tthis.state[key] = value;\n\t\tglobalThis.__ABS_ISLAND_STATE__ = {\n\t\t\t...(globalThis.__ABS_ISLAND_STATE__ ?? {}),\n\t\t\t[key]: value\n\t\t};\n\t\tthis.emit(key);\n\t\treturn value;\n\t}\n\n\tsubscribe(key: IslandStateKey, listener: IslandStateListener) {\n\t\tconst listeners = this.listeners.get(key) ?? new Set<IslandStateListener>();\n\t\tlisteners.add(listener);\n\t\tthis.listeners.set(key, listeners);\n\n\t\treturn () => {\n\t\t\tconst current = this.listeners.get(key);\n\t\t\tif (!current) return;\n\n\t\t\tcurrent.delete(listener);\n\t\t\tif (current.size === 0) {\n\t\t\t\tthis.listeners.delete(key);\n\t\t\t}\n\t\t};\n\t}\n\n\tupdate<T>(key: IslandStateKey, fallback: T, updater: IslandStateUpdater<T>) {\n\t\tconst previous = this.get(key, fallback);\n\t\tconst nextValue =\n\t\t\tisIslandStateUpdater(updater)\n\t\t\t\t? updater(previous)\n\t\t\t\t: updater;\n\n\t\treturn this.set(key, nextValue);\n\t}\n\n\tprivate emit(key: IslandStateKey) {\n\t\tconst listeners = this.listeners.get(key);\n\t\tif (!listeners) return;\n\n\t\tfor (const listener of listeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n}\n\nconst getGlobalIslandStateStore = () => {\n\tglobalThis.__ABS_ISLAND_STATE_STORE__ ??= new IslandStateStore();\n\n\tif (globalThis.__ABS_ISLAND_STATE__) {\n\t\tglobalThis.__ABS_ISLAND_STATE_STORE__.initialize(\n\t\t\tglobalThis.__ABS_ISLAND_STATE__\n\t\t);\n\t}\n\n\treturn globalThis.__ABS_ISLAND_STATE_STORE__;\n};\n\nexport const initializeIslandState = (state: IslandStateSnapshot) => {\n\tglobalThis.__ABS_ISLAND_STATE__ = {\n\t\t...(globalThis.__ABS_ISLAND_STATE__ ?? {}),\n\t\t...state\n\t};\n\n\tgetGlobalIslandStateStore().initialize(state);\n};\n\nexport const readIslandState = <T>(key: IslandStateKey, fallback: T) =>\n\tgetGlobalIslandStateStore().get(key, fallback);\n\nexport const setIslandState = <T>(key: IslandStateKey, value: T) =>\n\tgetGlobalIslandStateStore().set(key, value);\n\nexport const subscribeIslandState = (\n\tkey: IslandStateKey,\n\tlistener: IslandStateListener\n) => getGlobalIslandStateStore().subscribe(key, listener);\n\nexport const updateIslandState = <T>(\n\tkey: IslandStateKey,\n\tfallback: T,\n\tupdater: IslandStateUpdater<T>\n) => getGlobalIslandStateStore().update(key, fallback, updater);\n"
|
|
11
13
|
],
|
|
12
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEM,2BAA2B,CAAC,cACjC,UAAU,IAAI,YAAY,IAAI,UAAU,MAAM,CAAC,GAEnC,uBAAuB,CACnC,WACA,cACI,SAAS,yBAAyB,SAAS,IAAI,aAEvC,2BAA2B,CACvC,aACI;AAAA,EACJ,MAAM,UAAoE,CAAC;AAAA,EAC3E,MAAM,aAAgC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EAEA,WAAW,aAAa,YAAY;AAAA,IACnC,MAAM,SAAS,SAAS,yBAAyB,SAAS;AAAA,IAC1D,YAAY,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAAG;AAAA,MACpD,IAAI,CAAC,IAAI,WAAW,MAAM;AAAA,QAAG;AAAA,MAE7B,MAAM,YAAY,IAAI,MAAM,OAAO,MAAM;AAAA,MACzC,IAAI,CAAC;AAAA,QAAW;AAAA,MAEhB,MAAM,mBAAmB,QAAQ,cAAc,CAAC;AAAA,MAChD,iBAAiB,aAAa;AAAA,MAC9B,QAAQ,aAAa;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;;;ACED,SAAS,kBAA6B,CAC5C,WACC;AAAA,EACD,IAAI,4BAA4B,SAAS,GAAG;AAAA,IAC3C,OAAO,UAAU;AAAA,EAClB;AAAA,EAEA,OAAO;AAAA;AAAA,IAtCK,uBAAuB,CACnC,aACI,UAEQ,wBAAwB,CACpC,WACA,aAI2C;AAAA,EAC3C;AAAA,EACA,QAAQ,QAAQ;AAAA,EAChB,QAAQ,QAAQ;AACjB,IAEM,WAAW,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU,MAE3B,8BAA8B,CAC1C,UAEA,SAAS,KAAK,MACd,eAAe,WACf,YAAY,UACZ,OAAO,MAAM,WAAW,UAgBZ,0BAA0B,CACtC,cACI;AAAA,EACJ,IAAI,CAAC,4BAA4B,SAAS;AAAA,IAAG,OAAO;AAAA,EAEpD,OAAO;AAAA,IACN,QAAQ,UAAU;AAAA,IAClB,QAAQ,UAAU;AAAA,EACnB;AAAA,GAGY,uBAAuB,CAAC,UACpC,KAAK,UAAU,SAAS,CAAC,CAAC,GAEd,mBAAmB,CAAC,aAA4B;AAAA,EAC5D,IAAI,CAAC;AAAA,IAAU,OAAO,CAAC;AAAA,EAEvB,OAAO,KAAK,MAAM,QAAQ;AAAA;AAAA;;;IClDd,4BAA4B,CACxC,OACA,cAC6B;AAAA,EAC7B,kBAAkB,MAAM;AAAA,EACxB,kBAAkB,MAAM;AAAA,EACxB,gBAAgB,MAAM,WAAW;AAAA,EACjC,eAAe;AAAA,KACX,WAAW,EAAE,kBAAkB,SAAS,IAAI,CAAC;AAAA,EACjD,cAAc,qBAAqB,MAAM,KAAK;AAC/C,IAEM,sBAAsB,CAAC,UAC5B,MACE,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,GAEZ,4BAA4B,CACxC,eAEA,OAAO,QAAQ,UAAU,EACvB,IAAI,EAAE,KAAK,WAAW,GAAG,QAAQ,oBAAoB,KAAK,IAAI,EAC9D,KAAK,GAAG;AAAA;AAAA,EAnCX;AAAA;;;
|
|
13
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "F010A820B6EAF6D164756E2164756E21",
|
|
14
16
|
"names": []
|
|
15
17
|
}
|
package/dist/vue/index.js
CHANGED
|
@@ -484,10 +484,10 @@ var routePropsCache, cacheRouteData = (pagePath, data) => {
|
|
|
484
484
|
} finally {
|
|
485
485
|
console.log = origLog;
|
|
486
486
|
}
|
|
487
|
-
}, renderAngularApp = async (deps, PageComponent, providers,
|
|
487
|
+
}, renderAngularApp = async (deps, PageComponent, providers, document2) => {
|
|
488
488
|
const bootstrap = (context) => deps.bootstrapApplication(PageComponent, { providers }, context);
|
|
489
489
|
return withSuppressedAngularDevLogs(() => deps.renderApplication(bootstrap, {
|
|
490
|
-
document,
|
|
490
|
+
document: document2,
|
|
491
491
|
platformProviders: [],
|
|
492
492
|
url: "/"
|
|
493
493
|
}));
|
|
@@ -29827,9 +29827,9 @@ var angularIslandSelector = "abs-angular-island", getAngularIslandSelector = (_i
|
|
|
29827
29827
|
{ provide: deps.APP_BASE_HREF, useValue: "/" },
|
|
29828
29828
|
{ provide: propsToken, useValue: props }
|
|
29829
29829
|
];
|
|
29830
|
-
const
|
|
29830
|
+
const document2 = `<!DOCTYPE html><html><body><${selector}></${selector}></body></html>`;
|
|
29831
29831
|
const html = await withSuppressedAngularDevLogs(() => deps.renderApplication((context) => deps.bootstrapApplication(WrapperComponent, { providers }, context), {
|
|
29832
|
-
document,
|
|
29832
|
+
document: document2,
|
|
29833
29833
|
platformProviders: [],
|
|
29834
29834
|
url: "/"
|
|
29835
29835
|
}));
|
|
@@ -30660,10 +30660,58 @@ var createIsland = (registry) => defineRuntimeIslandComponent((props) => {
|
|
|
30660
30660
|
// src/vue/index.ts
|
|
30661
30661
|
init_pageHandler();
|
|
30662
30662
|
|
|
30663
|
+
// src/vue/Island.ts
|
|
30664
|
+
import { defineComponent as defineComponent2, h as h3, onServerPrefetch as onServerPrefetch2 } from "vue";
|
|
30665
|
+
|
|
30666
|
+
// src/client/preserveIslandMarkup.ts
|
|
30667
|
+
init_islandMarkupAttributes();
|
|
30668
|
+
var getClaimMap = () => {
|
|
30669
|
+
if (typeof window === "undefined") {
|
|
30670
|
+
return null;
|
|
30671
|
+
}
|
|
30672
|
+
window.__ABS_CLAIMED_ISLAND_MARKUP__ ??= new Map;
|
|
30673
|
+
return window.__ABS_CLAIMED_ISLAND_MARKUP__;
|
|
30674
|
+
};
|
|
30675
|
+
var getIslandSignature = (props) => {
|
|
30676
|
+
const attributes = getIslandMarkerAttributes(props);
|
|
30677
|
+
return [
|
|
30678
|
+
attributes["data-component"],
|
|
30679
|
+
attributes["data-framework"],
|
|
30680
|
+
attributes["data-hydrate"],
|
|
30681
|
+
attributes["data-props"]
|
|
30682
|
+
].join("::");
|
|
30683
|
+
};
|
|
30684
|
+
var isMatchingIslandElement = (element2, props) => {
|
|
30685
|
+
if (!(element2 instanceof HTMLElement)) {
|
|
30686
|
+
return false;
|
|
30687
|
+
}
|
|
30688
|
+
const attributes = getIslandMarkerAttributes(props);
|
|
30689
|
+
return element2.dataset.island === "true" && element2.dataset.component === attributes["data-component"] && element2.dataset.framework === attributes["data-framework"] && (element2.dataset.hydrate ?? "load") === attributes["data-hydrate"] && (element2.dataset.props ?? "{}") === attributes["data-props"];
|
|
30690
|
+
};
|
|
30691
|
+
var preserveIslandMarkup = (props) => {
|
|
30692
|
+
if (typeof document === "undefined") {
|
|
30693
|
+
return {
|
|
30694
|
+
attributes: getIslandMarkerAttributes(props),
|
|
30695
|
+
innerHTML: ""
|
|
30696
|
+
};
|
|
30697
|
+
}
|
|
30698
|
+
const claimMap = getClaimMap();
|
|
30699
|
+
const signature = getIslandSignature(props);
|
|
30700
|
+
const claimedCount = claimMap?.get(signature) ?? 0;
|
|
30701
|
+
const candidates = Array.from(document.querySelectorAll('[data-island="true"]')).filter((element2) => isMatchingIslandElement(element2, props));
|
|
30702
|
+
const candidate = candidates[claimedCount];
|
|
30703
|
+
if (claimMap) {
|
|
30704
|
+
claimMap.set(signature, claimedCount + 1);
|
|
30705
|
+
}
|
|
30706
|
+
return {
|
|
30707
|
+
attributes: getIslandMarkerAttributes(props),
|
|
30708
|
+
innerHTML: candidate?.innerHTML ?? ""
|
|
30709
|
+
};
|
|
30710
|
+
};
|
|
30711
|
+
|
|
30663
30712
|
// src/vue/Island.ts
|
|
30664
30713
|
init_islandMarkupAttributes();
|
|
30665
30714
|
init_renderIslandMarkup();
|
|
30666
|
-
import { defineComponent as defineComponent2, h as h3, onServerPrefetch as onServerPrefetch2 } from "vue";
|
|
30667
30715
|
var defineRuntimeIslandComponent2 = (setup) => defineComponent2({
|
|
30668
30716
|
name: "AbsoluteIsland",
|
|
30669
30717
|
props: {
|
|
@@ -30695,11 +30743,14 @@ var Island = defineRuntimeIslandComponent2((props) => {
|
|
|
30695
30743
|
markerAttributes = result.attributes;
|
|
30696
30744
|
html = result.html;
|
|
30697
30745
|
});
|
|
30698
|
-
return () =>
|
|
30699
|
-
|
|
30700
|
-
|
|
30701
|
-
|
|
30702
|
-
|
|
30746
|
+
return () => {
|
|
30747
|
+
const preserved = isBrowser ? preserveIslandMarkup(props) : null;
|
|
30748
|
+
return h3("div", {
|
|
30749
|
+
...preserved?.attributes ?? markerAttributes,
|
|
30750
|
+
"data-allow-mismatch": "",
|
|
30751
|
+
innerHTML: isBrowser ? preserved?.innerHTML : html
|
|
30752
|
+
});
|
|
30753
|
+
};
|
|
30703
30754
|
});
|
|
30704
30755
|
// src/vue/useIslandState.ts
|
|
30705
30756
|
import {
|
|
@@ -30815,5 +30866,5 @@ export {
|
|
|
30815
30866
|
Island
|
|
30816
30867
|
};
|
|
30817
30868
|
|
|
30818
|
-
//# debugId=
|
|
30869
|
+
//# debugId=56D61F3E4ECE529264756E2164756E21
|
|
30819
30870
|
//# sourceMappingURL=index.js.map
|