@aphexcms/cms-core 9.2.0 → 9.2.1
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/cli/generate-types.d.ts.map +1 -1
- package/dist/cli/generate-types.js +8 -3
- package/dist/cli/generate-types.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -0
- package/dist/components/AdminApp.svelte +27 -11
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentEditor.svelte +548 -21
- package/dist/components/admin/DocumentEditor.svelte.d.ts +6 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/SchemaField.svelte +1 -1
- package/dist/components/admin/fields/ArrayField.svelte +2 -2
- package/dist/components/admin/fields/ImageField.svelte +85 -27
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/ImageBlockModal.svelte +133 -0
- package/dist/components/admin/fields/richtext/ImageBlockModal.svelte.d.ts +14 -0
- package/dist/components/admin/fields/richtext/ImageBlockModal.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +2 -2
- package/dist/components/admin/fields/richtext/RichtextField.svelte +156 -11
- package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/svelte-node-view.js +11 -0
- package/dist/lib/client/index.d.ts +1 -0
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +4 -0
- package/dist/lib/client/index.js.map +1 -1
- package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
- package/dist/lib/components/admin/fields/richtext/svelte-node-view.js +11 -0
- package/dist/lib/components/admin/fields/richtext/svelte-node-view.js.map +1 -1
- package/dist/lib/preview/assets.d.ts +19 -0
- package/dist/lib/preview/assets.d.ts.map +1 -0
- package/dist/lib/preview/assets.js +60 -0
- package/dist/lib/preview/assets.js.map +1 -0
- package/dist/lib/preview/perspective.d.ts +20 -0
- package/dist/lib/preview/perspective.d.ts.map +1 -0
- package/dist/lib/preview/perspective.js +21 -0
- package/dist/lib/preview/perspective.js.map +1 -0
- package/dist/lib/preview/stega.d.ts +25 -0
- package/dist/lib/preview/stega.d.ts.map +1 -0
- package/dist/lib/preview/stega.js +168 -0
- package/dist/lib/preview/stega.js.map +1 -0
- package/dist/lib/richtext-context.svelte.d.ts +18 -0
- package/dist/lib/richtext-context.svelte.d.ts.map +1 -0
- package/dist/lib/richtext-context.svelte.js +13 -0
- package/dist/lib/richtext-context.svelte.js.map +1 -0
- package/dist/lib/server/index.d.ts +1 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +2 -0
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/services/asset-service.d.ts +12 -0
- package/dist/lib/services/asset-service.d.ts.map +1 -1
- package/dist/lib/services/asset-service.js +32 -0
- package/dist/lib/services/asset-service.js.map +1 -1
- package/dist/lib/types/asset.d.ts +15 -0
- package/dist/lib/types/asset.d.ts.map +1 -1
- package/dist/lib/types/config.d.ts +7 -0
- package/dist/lib/types/config.d.ts.map +1 -1
- package/dist/lib/types/schemas.d.ts +17 -0
- package/dist/lib/types/schemas.d.ts.map +1 -1
- package/dist/lib/utils/preview.d.ts +4 -0
- package/dist/lib/utils/preview.d.ts.map +1 -1
- package/dist/lib/utils/preview.js +7 -0
- package/dist/lib/utils/preview.js.map +1 -1
- package/dist/preview/assets.d.ts +19 -0
- package/dist/preview/assets.d.ts.map +1 -0
- package/dist/preview/assets.js +59 -0
- package/dist/preview/perspective.d.ts +20 -0
- package/dist/preview/perspective.d.ts.map +1 -0
- package/dist/preview/perspective.js +20 -0
- package/dist/preview/stega.d.ts +25 -0
- package/dist/preview/stega.d.ts.map +1 -0
- package/dist/preview/stega.js +167 -0
- package/dist/richtext-context.svelte.d.ts +18 -0
- package/dist/richtext-context.svelte.d.ts.map +1 -0
- package/dist/richtext-context.svelte.js +12 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/services/asset-service.d.ts +12 -0
- package/dist/services/asset-service.d.ts.map +1 -1
- package/dist/services/asset-service.js +32 -0
- package/dist/types/asset.d.ts +15 -0
- package/dist/types/asset.d.ts.map +1 -1
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/schemas.d.ts +17 -0
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/utils/preview.d.ts +4 -0
- package/dist/utils/preview.d.ts.map +1 -1
- package/dist/utils/preview.js +7 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/client/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,oEAAoE;AAEpE,gDAAgD;AAChD,cAAc,gBAAgB,CAAC;AAG/B,4CAA4C;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAE1C,+DAA+D;AAC/D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,uDAAuD;AACvD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,uDAAuD;AACvD,OAAO,EACN,qBAAqB,EACrB,cAAc,EAEd,MAAM,+BAA+B,CAAC;AAEvC,8CAA8C;AAC9C,cAAc,uBAAuB,CAAC;AAEtC,qDAAqD;AACrD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEzE,gBAAgB;AAChB,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE1F,mBAAmB;AACnB,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAE7F,mCAAmC;AACnC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,cAAc,CAAC;AAG7B,uEAAuE;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,2DAA2D;AAC3D,OAAO,EACN,aAAa,EAEb,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6DAA6D,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/client/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,oEAAoE;AAEpE,gDAAgD;AAChD,cAAc,gBAAgB,CAAC;AAG/B,4CAA4C;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAE1C,+DAA+D;AAC/D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,uDAAuD;AACvD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,uDAAuD;AACvD,OAAO,EACN,qBAAqB,EACrB,cAAc,EAEd,MAAM,+BAA+B,CAAC;AAEvC,8CAA8C;AAC9C,cAAc,uBAAuB,CAAC;AAEtC,qDAAqD;AACrD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEzE,gBAAgB;AAChB,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE1F,mBAAmB;AACnB,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAE7F,mCAAmC;AACnC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,cAAc,CAAC;AAG7B,uEAAuE;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,2DAA2D;AAC3D,OAAO,EACN,aAAa,EAEb,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6DAA6D,CAAC;AAE3G,yFAAyF;AACzF,0FAA0F;AAC1F,4EAA4E;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svelte-node-view.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/components/admin/fields/richtext/svelte-node-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAKvE,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAK,IAAI,EACvF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,IAEvB,OAAO,qBAAqB,KAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"svelte-node-view.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/components/admin/fields/richtext/svelte-node-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAKvE,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAK,IAAI,EACvF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,IAEvB,OAAO,qBAAqB,KAAG,mBAAmB,CAyE1D"}
|
|
@@ -38,7 +38,18 @@ export function SvelteNodeViewRenderer(onEdit, onDelete) {
|
|
|
38
38
|
update(node) {
|
|
39
39
|
if (node.type.name !== 'portableTextObject')
|
|
40
40
|
return false;
|
|
41
|
+
const prevType = nodeAttrs._type;
|
|
42
|
+
const prevRef = nodeAttrs.data?.asset?._ref;
|
|
41
43
|
nodeAttrs = node.attrs;
|
|
44
|
+
const nextType = nodeAttrs._type;
|
|
45
|
+
const nextRef = nodeAttrs.data?.asset?._ref;
|
|
46
|
+
// Image views re-fetch their asset on mount, so a blind remount makes the
|
|
47
|
+
// thumbnail flash (or briefly disappear) on every keystroke/selection. Skip
|
|
48
|
+
// the remount when the image is visually unchanged — alt edits don't touch the
|
|
49
|
+
// thumbnail. Other block types still remount so their content stays in sync.
|
|
50
|
+
if (prevType === 'image' && nextType === 'image' && prevRef === nextRef) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
42
53
|
unmount(currentComponent);
|
|
43
54
|
currentComponent = mountView();
|
|
44
55
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svelte-node-view.js","sourceRoot":"","sources":["../../../../../../src/lib/components/admin/fields/richtext/svelte-node-view.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,sBAAsB,MAAM,iCAAiC,CAAC;AACrE,OAAO,qBAAqB,MAAM,gCAAgC,CAAC;AAEnE,MAAM,UAAU,sBAAsB,CACrC,MAAuF,EACvF,QAA+B;IAE/B,OAAO,CAAC,KAA4B,EAAuB,EAAE;QAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,YAAY,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,YAAY,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC;QAElC,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAEjC,SAAS,gBAAgB;YACxB,OAAO,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAC;QACrF,CAAC;QAED,SAAS,SAAS;YACjB,OAAO,KAAK,CAAC,gBAAgB,EAAE,EAAE;gBAChC,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE;oBACN,IAAI,EAAE,SAAS,CAAC,KAAK;oBACrB,OAAO,EAAE,SAAS,CAAC,IAAI;oBACvB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,GAAG,EAAE;wBACZ,MAAM,CAAC;4BACN,KAAK,EAAE,SAAS,CAAC,KAAK;4BACtB,IAAI,EAAE,SAAS,CAAC,IAAI;4BACpB,IAAI,EAAE,SAAS,CAAC,IAAI;yBACpB,CAAC,CAAC;oBACJ,CAAC;oBACD,QAAQ,EAAE,GAAG,EAAE;wBACd,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBAC1B,CAAC;iBACD;aACD,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,gBAAgB,GAAG,SAAS,EAAE,CAAC;QAEnC,OAAO;YACN,GAAG,EAAE,OAAO;YACZ,MAAM,CAAC,IAAI;gBACV,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,oBAAoB;oBAAE,OAAO,KAAK,CAAC;gBAC1D,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;gBACvB,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAC1B,gBAAgB,GAAG,SAAS,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACb,CAAC;YACD,UAAU;gBACT,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACnD,CAAC;YACD,YAAY;gBACX,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACtD,CAAC;YACD,OAAO;gBACN,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC3B,CAAC;YACD,SAAS;gBACR,OAAO,IAAI,CAAC;YACb,CAAC;YACD,cAAc;gBACb,OAAO,IAAI,CAAC;YACb,CAAC;SACD,CAAC;IACH,CAAC,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"svelte-node-view.js","sourceRoot":"","sources":["../../../../../../src/lib/components/admin/fields/richtext/svelte-node-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A resolved asset's renderable data. */
|
|
2
|
+
export interface ResolvedAsset {
|
|
3
|
+
url: string;
|
|
4
|
+
alt?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Collect every asset `_ref` reachable in a value. Image and file fields, and
|
|
8
|
+
* portable-text image blocks, all carry `{ asset: { _ref } }`, so one generic walk
|
|
9
|
+
* covers them — callers never enumerate field paths by hand.
|
|
10
|
+
*/
|
|
11
|
+
export declare function collectAssetRefs(value: unknown, acc?: Set<string>): Set<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Inject resolved `{ url, alt }` onto every `{ asset: { _ref } }` in a value, in place.
|
|
14
|
+
* After this, `image.asset.url` / `image.asset.alt` are populated so the frontend reads
|
|
15
|
+
* them directly. Mutates the value — pass a clone (e.g. `$state.snapshot`) if the input
|
|
16
|
+
* must be preserved. Refs absent from `resolved` are left untouched.
|
|
17
|
+
*/
|
|
18
|
+
export declare function injectAssetData(value: unknown, resolved: ReadonlyMap<string, ResolvedAsset>): void;
|
|
19
|
+
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/lib/preview/assets.ts"],"names":[],"mappings":"AAYA,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAW1F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAC1C,IAAI,CAgBN"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Asset URL injection — the single source of truth for "make a document's images
|
|
2
|
+
// renderable". Aphex asset URLs aren't derivable from the `_ref` alone, so before a
|
|
3
|
+
// document can be rendered (server-side on a public route, or client-side in the live
|
|
4
|
+
// preview) each `{ asset: { _ref } }` has to be resolved to its URL/alt and have those
|
|
5
|
+
// woven back into the document.
|
|
6
|
+
//
|
|
7
|
+
// This module owns the *walk* (collect refs / inject results). The *resolution* of a
|
|
8
|
+
// ref → { url, alt } differs by environment — the server uses `AssetService`, the editor
|
|
9
|
+
// uses the assets API client — so it's supplied by the caller. Keeping the walk in one
|
|
10
|
+
// place means SSR and live preview produce documents of the exact same shape:
|
|
11
|
+
// `image.asset.url` is always populated, and the frontend never needs a side-channel map.
|
|
12
|
+
/**
|
|
13
|
+
* Collect every asset `_ref` reachable in a value. Image and file fields, and
|
|
14
|
+
* portable-text image blocks, all carry `{ asset: { _ref } }`, so one generic walk
|
|
15
|
+
* covers them — callers never enumerate field paths by hand.
|
|
16
|
+
*/
|
|
17
|
+
export function collectAssetRefs(value, acc = new Set()) {
|
|
18
|
+
if (!value || typeof value !== 'object')
|
|
19
|
+
return acc;
|
|
20
|
+
if (Array.isArray(value)) {
|
|
21
|
+
for (const v of value)
|
|
22
|
+
collectAssetRefs(v, acc);
|
|
23
|
+
return acc;
|
|
24
|
+
}
|
|
25
|
+
const obj = value;
|
|
26
|
+
const ref = obj.asset?._ref;
|
|
27
|
+
if (typeof ref === 'string')
|
|
28
|
+
acc.add(ref);
|
|
29
|
+
for (const key in obj)
|
|
30
|
+
collectAssetRefs(obj[key], acc);
|
|
31
|
+
return acc;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Inject resolved `{ url, alt }` onto every `{ asset: { _ref } }` in a value, in place.
|
|
35
|
+
* After this, `image.asset.url` / `image.asset.alt` are populated so the frontend reads
|
|
36
|
+
* them directly. Mutates the value — pass a clone (e.g. `$state.snapshot`) if the input
|
|
37
|
+
* must be preserved. Refs absent from `resolved` are left untouched.
|
|
38
|
+
*/
|
|
39
|
+
export function injectAssetData(value, resolved) {
|
|
40
|
+
if (!value || typeof value !== 'object')
|
|
41
|
+
return;
|
|
42
|
+
if (Array.isArray(value)) {
|
|
43
|
+
for (const v of value)
|
|
44
|
+
injectAssetData(v, resolved);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const obj = value;
|
|
48
|
+
const asset = obj.asset;
|
|
49
|
+
if (asset && typeof asset === 'object' && typeof asset._ref === 'string') {
|
|
50
|
+
const hit = resolved.get(asset._ref);
|
|
51
|
+
if (hit) {
|
|
52
|
+
asset.url = hit.url;
|
|
53
|
+
if (hit.alt != null)
|
|
54
|
+
asset.alt = hit.alt;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const key in obj)
|
|
58
|
+
injectAssetData(obj[key], resolved);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/lib/preview/assets.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,oFAAoF;AACpF,sFAAsF;AACtF,uFAAuF;AACvF,gCAAgC;AAChC,EAAE;AACF,qFAAqF;AACrF,yFAAyF;AACzF,uFAAuF;AACvF,8EAA8E;AAC9E,0FAA0F;AAQ1F;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,MAAmB,IAAI,GAAG,EAAE;IAC5E,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,GAAG,GAAI,GAAG,CAAC,KAAwC,EAAE,IAAI,CAAC;IAChE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,GAAG;QAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC9B,KAAc,EACd,QAA4C;IAE5C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO;IACR,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAmE,CAAC;IACtF,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1E,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YACpB,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI;gBAAE,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;QAC1C,CAAC;IACF,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,GAAG;QAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Auth } from '../types/auth.js';
|
|
2
|
+
export type PreviewPerspective = 'draft' | 'published';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the content perspective for a SvelteKit load function.
|
|
5
|
+
*
|
|
6
|
+
* Returns `'draft'` only when the `?aphex-preview` query param is present
|
|
7
|
+
* AND the request carries a valid authenticated session — so unauthenticated
|
|
8
|
+
* visitors who manually append the param always get published content.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // +page.server.ts
|
|
12
|
+
* import { getPreviewPerspective } from '@aphexcms/cms-core/server';
|
|
13
|
+
*
|
|
14
|
+
* export const load = async ({ locals, url }) => {
|
|
15
|
+
* const perspective = getPreviewPerspective(locals.auth, url);
|
|
16
|
+
* const post = await api.findOne({ perspective });
|
|
17
|
+
* };
|
|
18
|
+
*/
|
|
19
|
+
export declare function getPreviewPerspective(auth: Auth | undefined, url: URL): PreviewPerspective;
|
|
20
|
+
//# sourceMappingURL=perspective.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perspective.d.ts","sourceRoot":"","sources":["../../../src/lib/preview/perspective.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,WAAW,CAAC;AAEvD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,kBAAkB,CAG1F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the content perspective for a SvelteKit load function.
|
|
3
|
+
*
|
|
4
|
+
* Returns `'draft'` only when the `?aphex-preview` query param is present
|
|
5
|
+
* AND the request carries a valid authenticated session — so unauthenticated
|
|
6
|
+
* visitors who manually append the param always get published content.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // +page.server.ts
|
|
10
|
+
* import { getPreviewPerspective } from '@aphexcms/cms-core/server';
|
|
11
|
+
*
|
|
12
|
+
* export const load = async ({ locals, url }) => {
|
|
13
|
+
* const perspective = getPreviewPerspective(locals.auth, url);
|
|
14
|
+
* const post = await api.findOne({ perspective });
|
|
15
|
+
* };
|
|
16
|
+
*/
|
|
17
|
+
export function getPreviewPerspective(auth, url) {
|
|
18
|
+
const isAuthenticated = auth?.type === 'session';
|
|
19
|
+
return url.searchParams.has('aphex-preview') && isAuthenticated ? 'draft' : 'published';
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=perspective.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perspective.js","sourceRoot":"","sources":["../../../src/lib/preview/perspective.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAsB,EAAE,GAAQ;IACrE,MAAM,eAAe,GAAG,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC;IACjD,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Field } from '../types/schemas.js';
|
|
2
|
+
/**
|
|
3
|
+
* Remove all stega-encoded data from a string or deep JSON structure.
|
|
4
|
+
* Use in <svelte:head> (title, meta), alt text, aria-labels — anywhere the raw
|
|
5
|
+
* string is needed without invisible characters.
|
|
6
|
+
*/
|
|
7
|
+
export declare function stegaClean<T>(value: T): T;
|
|
8
|
+
/** Decode the stega payload from a string. Returns null if not encoded. */
|
|
9
|
+
export declare function stegaDecode(value: string): {
|
|
10
|
+
field: string;
|
|
11
|
+
blockIndex?: number;
|
|
12
|
+
blockKey?: string;
|
|
13
|
+
arrayIndex?: number;
|
|
14
|
+
objectPath?: string;
|
|
15
|
+
} | null;
|
|
16
|
+
/**
|
|
17
|
+
* Recursively encode all string-bearing fields in a document with their top-level
|
|
18
|
+
* field name. Handles: string/text/url, string arrays, object subfields, and
|
|
19
|
+
* portable text blocks (including custom block types like callout, codeBlock).
|
|
20
|
+
*
|
|
21
|
+
* Every nested string always encodes the *top-level* field name so that clicking
|
|
22
|
+
* in the preview navigates to the correct editor field.
|
|
23
|
+
*/
|
|
24
|
+
export declare function stegaEncodeDocument(data: Record<string, unknown>, fields: Field[]): Record<string, unknown>;
|
|
25
|
+
//# sourceMappingURL=stega.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stega.d.ts","sourceRoot":"","sources":["../../../src/lib/preview/stega.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,qBAAqB,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAEzC;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAUP;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,KAAK,EAAE,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { vercelStegaCombine, vercelStegaClean, vercelStegaDecode } from '@vercel/stega';
|
|
2
|
+
/**
|
|
3
|
+
* Remove all stega-encoded data from a string or deep JSON structure.
|
|
4
|
+
* Use in <svelte:head> (title, meta), alt text, aria-labels — anywhere the raw
|
|
5
|
+
* string is needed without invisible characters.
|
|
6
|
+
*/
|
|
7
|
+
export function stegaClean(value) {
|
|
8
|
+
return vercelStegaClean(value);
|
|
9
|
+
}
|
|
10
|
+
/** Decode the stega payload from a string. Returns null if not encoded. */
|
|
11
|
+
export function stegaDecode(value) {
|
|
12
|
+
return (vercelStegaDecode(value) ?? null);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Recursively encode all string-bearing fields in a document with their top-level
|
|
16
|
+
* field name. Handles: string/text/url, string arrays, object subfields, and
|
|
17
|
+
* portable text blocks (including custom block types like callout, codeBlock).
|
|
18
|
+
*
|
|
19
|
+
* Every nested string always encodes the *top-level* field name so that clicking
|
|
20
|
+
* in the preview navigates to the correct editor field.
|
|
21
|
+
*/
|
|
22
|
+
export function stegaEncodeDocument(data, fields) {
|
|
23
|
+
const result = { ...data };
|
|
24
|
+
for (const field of fields) {
|
|
25
|
+
const val = result[field.name];
|
|
26
|
+
if (val == null)
|
|
27
|
+
continue;
|
|
28
|
+
// objectPath is undefined at root — each field IS the top-level, no sub-path needed
|
|
29
|
+
result[field.name] = encodeFieldValue(val, field, field.name, undefined);
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Internal helpers — topLevel is always the document root field name so the
|
|
35
|
+
// editor knows which field to scroll to; objectPath carries the dotted sub-path
|
|
36
|
+
// so the editor can drill into nested inputs.
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
function encodeFieldValue(val, field, topLevel, objectPath) {
|
|
39
|
+
if (val == null)
|
|
40
|
+
return val;
|
|
41
|
+
const path = objectPath ? `${objectPath}.${field.name}` : field.name;
|
|
42
|
+
switch (field.type) {
|
|
43
|
+
case 'string':
|
|
44
|
+
case 'text':
|
|
45
|
+
case 'url':
|
|
46
|
+
if (typeof val === 'string' && val) {
|
|
47
|
+
const payload = { field: topLevel };
|
|
48
|
+
// Only include objectPath for nested fields (not the top-level field itself)
|
|
49
|
+
if (objectPath)
|
|
50
|
+
payload.objectPath = path;
|
|
51
|
+
return vercelStegaCombine(val, payload);
|
|
52
|
+
}
|
|
53
|
+
return val;
|
|
54
|
+
case 'array':
|
|
55
|
+
if (!Array.isArray(val))
|
|
56
|
+
return val;
|
|
57
|
+
// Only forward objectPath when truly nested (inside an object); top-level
|
|
58
|
+
// arrays must NOT get an objectPath or the arrayIndex navigation branch is skipped.
|
|
59
|
+
return encodeArray(val, field.of, topLevel, objectPath ? path : undefined);
|
|
60
|
+
case 'object':
|
|
61
|
+
if (typeof val !== 'object' || !field.fields)
|
|
62
|
+
return val;
|
|
63
|
+
return encodeObject(val, field.fields, topLevel, path);
|
|
64
|
+
// image, file, reference, slug, number, boolean, date, datetime — not text, skip.
|
|
65
|
+
// Image click-to-edit is handled at render time (the frontend stega-encodes the
|
|
66
|
+
// *effective* alt — override or asset default — so every image is clickable, not
|
|
67
|
+
// just ones with a per-placement override).
|
|
68
|
+
default:
|
|
69
|
+
return val;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function encodeArray(items, of, topLevel, objectPath) {
|
|
73
|
+
const hasBlock = of.some((t) => t.type === 'block');
|
|
74
|
+
const firstType = of[0]?.type;
|
|
75
|
+
if (hasBlock) {
|
|
76
|
+
// Portable text — encode spans within blocks and string fields in custom block types
|
|
77
|
+
return encodePortableText(items, of, topLevel);
|
|
78
|
+
}
|
|
79
|
+
if (firstType === 'string' || firstType === 'text') {
|
|
80
|
+
// Primitive string array (e.g. tags) — include the item's array index
|
|
81
|
+
return items.map((item, arrayIndex) => {
|
|
82
|
+
if (typeof item !== 'string' || !item)
|
|
83
|
+
return item;
|
|
84
|
+
const payload = { field: topLevel, arrayIndex };
|
|
85
|
+
if (objectPath)
|
|
86
|
+
payload.objectPath = objectPath;
|
|
87
|
+
return vercelStegaCombine(item, payload);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Array of inline objects — encode each item's string fields
|
|
91
|
+
if (of[0]?.fields) {
|
|
92
|
+
return items.map((item, arrayIndex) => {
|
|
93
|
+
if (!item || typeof item !== 'object')
|
|
94
|
+
return item;
|
|
95
|
+
const obj = item;
|
|
96
|
+
const typeRef = of.find((t) => t.name === obj._type || t.type === obj._type) ?? of[0];
|
|
97
|
+
if (!typeRef?.fields)
|
|
98
|
+
return item;
|
|
99
|
+
const itemPath = objectPath ? `${objectPath}[${arrayIndex}]` : `[${arrayIndex}]`;
|
|
100
|
+
return encodeObject(obj, typeRef.fields, topLevel, itemPath);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return items;
|
|
104
|
+
}
|
|
105
|
+
function encodeObject(obj, fields, topLevel, objectPath) {
|
|
106
|
+
const result = { ...obj };
|
|
107
|
+
for (const field of fields) {
|
|
108
|
+
const val = result[field.name];
|
|
109
|
+
if (val == null)
|
|
110
|
+
continue;
|
|
111
|
+
result[field.name] = encodeFieldValue(val, field, topLevel, objectPath);
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
/** Encode portable text: spans in standard blocks + string fields in custom block types. */
|
|
116
|
+
function encodePortableText(blocks, of, topLevel) {
|
|
117
|
+
return blocks.map((block, blockIndex) => {
|
|
118
|
+
if (!block || typeof block !== 'object')
|
|
119
|
+
return block;
|
|
120
|
+
const b = block;
|
|
121
|
+
if (b._type === 'block' && Array.isArray(b.children)) {
|
|
122
|
+
// Standard text block — encode each span's text with its block index so the
|
|
123
|
+
// editor can position the cursor at the exact block when clicked.
|
|
124
|
+
return {
|
|
125
|
+
...b,
|
|
126
|
+
children: b.children.map((child) => {
|
|
127
|
+
if (!child || typeof child !== 'object')
|
|
128
|
+
return child;
|
|
129
|
+
const span = child;
|
|
130
|
+
if (span._type === 'span' && typeof span.text === 'string' && span.text) {
|
|
131
|
+
return {
|
|
132
|
+
...span,
|
|
133
|
+
text: vercelStegaCombine(span.text, { field: topLevel, blockIndex })
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return child;
|
|
137
|
+
})
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Built-in image block — click-to-edit is stamped at render time (the frontend
|
|
141
|
+
// stega-encodes the effective alt with this block's _key), so no encoding here.
|
|
142
|
+
if (b._type === 'image')
|
|
143
|
+
return block;
|
|
144
|
+
// Custom block type (callout, codeBlock, etc.) — encode string fields, carrying
|
|
145
|
+
// blockIndex so clicking them opens the block's edit modal in the editor.
|
|
146
|
+
const typeRef = of.find((t) => t.name === b._type || t.type === b._type);
|
|
147
|
+
if (typeRef?.fields) {
|
|
148
|
+
return encodeCustomBlock(b, typeRef.fields, topLevel, blockIndex);
|
|
149
|
+
}
|
|
150
|
+
return block;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/** Encode string fields of a custom block with { field, blockIndex, blockKey } so the editor can open the modal. */
|
|
154
|
+
function encodeCustomBlock(obj, fields, topLevel, blockIndex) {
|
|
155
|
+
const result = { ...obj };
|
|
156
|
+
const blockKey = typeof obj._key === 'string' ? obj._key : undefined;
|
|
157
|
+
for (const field of fields) {
|
|
158
|
+
const val = result[field.name];
|
|
159
|
+
if (!val)
|
|
160
|
+
continue;
|
|
161
|
+
if ((field.type === 'string' || field.type === 'text' || field.type === 'url') &&
|
|
162
|
+
typeof val === 'string') {
|
|
163
|
+
result[field.name] = vercelStegaCombine(val, { field: topLevel, blockIndex, blockKey });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=stega.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stega.js","sourceRoot":"","sources":["../../../src/lib/preview/stega.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Editor } from '@tiptap/core';
|
|
2
|
+
/**
|
|
3
|
+
* A registered richtext editor plus the imperative hooks DocumentEditor needs for
|
|
4
|
+
* click-to-edit — e.g. opening the link popover after dropping the caret in a link,
|
|
5
|
+
* rather than relying on the editor's transaction heuristic to notice the selection move.
|
|
6
|
+
*/
|
|
7
|
+
export interface RichtextEditorHandle {
|
|
8
|
+
editor: Editor;
|
|
9
|
+
/** Open the link action popover for the link at the current selection. */
|
|
10
|
+
openLinkPopover: () => void;
|
|
11
|
+
}
|
|
12
|
+
type EditorRegistry = Map<string, RichtextEditorHandle>;
|
|
13
|
+
/** Call once in DocumentEditor to create the registry. */
|
|
14
|
+
export declare function setRichtextEditorRegistry(): EditorRegistry;
|
|
15
|
+
/** Call in RichtextField to register/unregister the editor handle. */
|
|
16
|
+
export declare function getRichtextEditorRegistry(): EditorRegistry | null;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=richtext-context.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"richtext-context.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/richtext-context.svelte.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,eAAe,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,KAAK,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAExD,0DAA0D;AAC1D,wBAAgB,yBAAyB,IAAI,cAAc,CAI1D;AAED,sEAAsE;AACtE,wBAAgB,yBAAyB,IAAI,cAAc,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
const KEY = Symbol('aphex:richtext-editors');
|
|
3
|
+
/** Call once in DocumentEditor to create the registry. */
|
|
4
|
+
export function setRichtextEditorRegistry() {
|
|
5
|
+
const registry = new Map();
|
|
6
|
+
setContext(KEY, registry);
|
|
7
|
+
return registry;
|
|
8
|
+
}
|
|
9
|
+
/** Call in RichtextField to register/unregister the editor handle. */
|
|
10
|
+
export function getRichtextEditorRegistry() {
|
|
11
|
+
return getContext(KEY) ?? null;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=richtext-context.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"richtext-context.svelte.js","sourceRoot":"","sources":["../../src/lib/richtext-context.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGhD,MAAM,GAAG,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAe7C,0DAA0D;AAC1D,MAAM,UAAU,yBAAyB;IACxC,MAAM,QAAQ,GAAmB,IAAI,GAAG,EAAE,CAAC;IAC3C,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1B,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,yBAAyB;IACxC,OAAO,UAAU,CAAiB,GAAG,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC"}
|
|
@@ -18,6 +18,7 @@ export { GET as serveAssetCDN } from '../routes/assets-cdn.js';
|
|
|
18
18
|
export { createAphexApi, mountAphexBuiltins, toHonoHandler, type AphexEnv } from './api/index.js';
|
|
19
19
|
export * from '../schema-utils/index.js';
|
|
20
20
|
export { createHashForPublishing } from '../utils/content-hash.js';
|
|
21
|
+
export { getPreviewPerspective, type PreviewPerspective } from '../preview/perspective.js';
|
|
21
22
|
export { createGraphQLHandler, type GraphQLConfig, type GraphQLSettings, type GraphQLHandlerResult } from '../graphql/index.js';
|
|
22
23
|
export { LocalAPI, createLocalAPI, getLocalAPI, CollectionAPI, SingletonOperationError, PermissionChecker, PermissionError, type Collections, type SingletonCollection, type LocalAPIContext, type CreateOptions, type UpdateOptions } from '../local-api/index.js';
|
|
23
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxF,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG/F,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EACN,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxF,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG/F,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGxF,OAAO,EACN,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,oBAAoB,CAAC"}
|
package/dist/lib/server/index.js
CHANGED
|
@@ -36,6 +36,8 @@ export { createAphexApi, mountAphexBuiltins, toHonoHandler } from './api/index.j
|
|
|
36
36
|
export * from '../schema-utils/index.js';
|
|
37
37
|
// Content hash utilities (server-side)
|
|
38
38
|
export { createHashForPublishing } from '../utils/content-hash.js';
|
|
39
|
+
// Preview utilities
|
|
40
|
+
export { getPreviewPerspective } from '../preview/perspective.js';
|
|
39
41
|
// GraphQL (built-in, enabled by default)
|
|
40
42
|
export { createGraphQLHandler } from '../graphql/index.js';
|
|
41
43
|
// Local API (unified operations layer)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,+DAA+D;AAE/D,sDAAsD;AACtD,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AAEpE,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAEpE,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,6CAA6C;AAC7C,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAqB,MAAM,UAAU,CAAC;AAExF,qFAAqF;AACrF,cAAc,wBAAwB,CAAC;AAEvC,kCAAkC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAE7C,iDAAiD;AACjD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,4EAA4E;AAC5E,wEAAwE;AACxE,oEAAoE;AACpE,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE5D,0EAA0E;AAC1E,gDAAgD;AAChD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAE/F,mBAAmB;AACnB,cAAc,uBAAuB,CAAC;AAEtC,uCAAuC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,yCAAyC;AACzC,OAAO,EACN,oBAAoB,EAIpB,MAAM,kBAAkB,CAAC;AAE1B,uCAAuC;AACvC,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EAMf,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,+DAA+D;AAE/D,sDAAsD;AACtD,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AAEpE,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAEpE,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,6CAA6C;AAC7C,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAqB,MAAM,UAAU,CAAC;AAExF,qFAAqF;AACrF,cAAc,wBAAwB,CAAC;AAEvC,kCAAkC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAE7C,iDAAiD;AACjD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,4EAA4E;AAC5E,wEAAwE;AACxE,oEAAoE;AACpE,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE5D,0EAA0E;AAC1E,gDAAgD;AAChD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAE/F,mBAAmB;AACnB,cAAc,uBAAuB,CAAC;AAEtC,uCAAuC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,oBAAoB;AACpB,OAAO,EAAE,qBAAqB,EAA2B,MAAM,wBAAwB,CAAC;AAExF,yCAAyC;AACzC,OAAO,EACN,oBAAoB,EAIpB,MAAM,kBAAkB,CAAC;AAE1B,uCAAuC;AACvC,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EAMf,MAAM,oBAAoB,CAAC"}
|
|
@@ -40,6 +40,18 @@ export declare class AssetService {
|
|
|
40
40
|
* Find asset by ID
|
|
41
41
|
*/
|
|
42
42
|
findAssetById(organizationId: string, id: string): Promise<Asset | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Hydrate one or more documents in place so their images are renderable: every
|
|
45
|
+
* `{ asset: { _ref } }` reachable in the docs gets its `url` (and default `alt`)
|
|
46
|
+
* injected. This is what a public route's `load` calls before returning a document —
|
|
47
|
+
* the frontend then reads `image.asset.url` directly, with no side-channel map. The
|
|
48
|
+
* live editor preview performs the identical injection client-side, so SSR and preview
|
|
49
|
+
* documents share one shape.
|
|
50
|
+
*
|
|
51
|
+
* Mutates the passed documents (they're request-scoped query results). Refs are
|
|
52
|
+
* resolved once and de-duped across all docs in a single batch.
|
|
53
|
+
*/
|
|
54
|
+
injectAssetUrls(organizationId: string, ...docs: unknown[]): Promise<void>;
|
|
43
55
|
/**
|
|
44
56
|
* Find asset by ID globally (bypasses organization filter for public asset access)
|
|
45
57
|
* Only available on PostgreSQL adapter with RLS bypass
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/asset-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"asset-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/asset-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAI5C,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACnB,CAAC;CACF;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;gBADR,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,eAAe;IAGlC;;OAEG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC;IAsFhF;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI9E;;;;;;;;;;OAUG;IACG,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhF;;;OAGG;IACG,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAmB5D;;OAEG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAItF;;;;;OAKG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BvE;;OAEG;IACG,mBAAmB,CACxB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GACC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIxB;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QACpD,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;IAeF;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;KAClB,CAAC;CAWF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Asset service - orchestrates storage and database operations
|
|
2
2
|
import sharp from 'sharp';
|
|
3
3
|
import { cmsLogger } from '../utils/logger.js';
|
|
4
|
+
import { collectAssetRefs, injectAssetData } from '../preview/assets.js';
|
|
4
5
|
/**
|
|
5
6
|
* Asset service - coordinates storage and database operations
|
|
6
7
|
* Maintains separation of concerns while providing unified asset management
|
|
@@ -99,6 +100,37 @@ export class AssetService {
|
|
|
99
100
|
async findAssetById(organizationId, id) {
|
|
100
101
|
return await this.database.findAssetById(organizationId, id);
|
|
101
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Hydrate one or more documents in place so their images are renderable: every
|
|
105
|
+
* `{ asset: { _ref } }` reachable in the docs gets its `url` (and default `alt`)
|
|
106
|
+
* injected. This is what a public route's `load` calls before returning a document —
|
|
107
|
+
* the frontend then reads `image.asset.url` directly, with no side-channel map. The
|
|
108
|
+
* live editor preview performs the identical injection client-side, so SSR and preview
|
|
109
|
+
* documents share one shape.
|
|
110
|
+
*
|
|
111
|
+
* Mutates the passed documents (they're request-scoped query results). Refs are
|
|
112
|
+
* resolved once and de-duped across all docs in a single batch.
|
|
113
|
+
*/
|
|
114
|
+
async injectAssetUrls(organizationId, ...docs) {
|
|
115
|
+
const refs = new Set();
|
|
116
|
+
for (const doc of docs)
|
|
117
|
+
collectAssetRefs(doc, refs);
|
|
118
|
+
if (refs.size === 0)
|
|
119
|
+
return;
|
|
120
|
+
const resolved = new Map();
|
|
121
|
+
await Promise.all([...refs].map(async (ref) => {
|
|
122
|
+
try {
|
|
123
|
+
const asset = await this.findAssetById(organizationId, ref);
|
|
124
|
+
if (asset?.url)
|
|
125
|
+
resolved.set(ref, { url: asset.url, alt: asset.alt ?? undefined });
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Missing/erroring asset — leave it unresolved; the image simply won't render.
|
|
129
|
+
}
|
|
130
|
+
}));
|
|
131
|
+
for (const doc of docs)
|
|
132
|
+
injectAssetData(doc, resolved);
|
|
133
|
+
}
|
|
102
134
|
/**
|
|
103
135
|
* Find asset by ID globally (bypasses organization filter for public asset access)
|
|
104
136
|
* Only available on PostgreSQL adapter with RLS bypass
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-service.js","sourceRoot":"","sources":["../../../src/lib/services/asset-service.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"asset-service.js","sourceRoot":"","sources":["../../../src/lib/services/asset-service.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAsB,MAAM,mBAAmB,CAAC;AA8B1F;;;GAGG;AACH,MAAM,OAAO,YAAY;IAEf;IACA;IAFT,YACS,OAAuB,EACvB,QAAyB;QADzB,YAAO,GAAP,OAAO,CAAgB;QACvB,aAAQ,GAAR,QAAQ,CAAiB;IAC/B,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,cAAsB,EAAE,IAAqB;QAC9D,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAExE,0CAA0C;QAC1C,IAAI,KAAyB,CAAC;QAC9B,IAAI,MAA0B,CAAC;QAC/B,IAAI,QAAQ,GAAQ;YACnB,8CAA8C;YAC9C,GAAG,IAAI,CAAC,QAAQ;SAChB,CAAC;QAEF,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACJ,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;oBAC9C,gBAAgB,EAAE,WAAW;iBAC7B,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACd,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC;gBAC5B,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;gBAE9B,2CAA2C;gBAC3C,QAAQ,GAAG;oBACV,GAAG,QAAQ,EAAE,gCAAgC;oBAC7C,MAAM,EAAE,aAAa,CAAC,MAAM;oBAC5B,KAAK,EAAE,aAAa,CAAC,KAAK;oBAC1B,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,OAAO,EAAE,aAAa,CAAC,OAAO;oBAC9B,UAAU,EAAE,aAAa,CAAC,UAAU;oBACpC,QAAQ,EAAE,aAAa,CAAC,QAAQ;iBAChC,CAAC;gBAEF,qBAAqB;gBACrB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;gBAClF,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QACF,CAAC;QAED,sCAAsC;QACtC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAC5C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,gBAAgB;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SACf,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC7C,SAAS;gBACT,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,gBAAgB;gBACpE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,EAAE,WAAW,CAAC,GAAG,IAAI,EAAE,EAAE,oCAAoC;gBAChE,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACjC,cAAc;gBACd,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;gBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;gBAC1C,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,SAAS;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;gBACxC,SAAS,EAAE,IAAI,CAAC,SAAS;aACzB,CAAC,CAAC;YAEH,gFAAgF;YAChF,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,UAAU,KAAK,CAAC,EAAE,IAAI,kBAAkB,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAElF,0CAA0C;gBAC1C,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5E,CAAC;YAED,OAAO,KAAK,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,mDAAmD;YACnD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,cAAsB,EAAE,EAAU;QACrD,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,eAAe,CAAC,cAAsB,EAAE,GAAG,IAAe;QAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAE5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;QAClD,MAAM,OAAO,CAAC,GAAG,CAChB,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3B,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;gBAC5D,IAAI,KAAK,EAAE,GAAG;oBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;YACpF,CAAC;YAAC,MAAM,CAAC;gBACR,+EAA+E;YAChF,CAAC;QACF,CAAC,CAAC,CACF,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB,CAAC,EAAU;QACnC,6CAA6C;QAC7C,IACC,qBAAqB,IAAI,IAAI,CAAC,QAAQ;YACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,KAAK,UAAU,EACtD,CAAC;YACF,SAAS,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACzE,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,0BAA0B;QAC1B,SAAS,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QAC5F,SAAS,CAAC,IAAI,CAAC,uCAAuC,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxF,SAAS,CAAC,IAAI,CACb,mCAAmC,EACnC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAChE,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,cAAsB,EAAE,UAAwB,EAAE;QAClE,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,cAAsB,EAAE,EAAU;QACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACd,CAAC;QAED,kCAAkC;QAClC,gEAAgE;QAChE,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChD,oCAAoC;YACpC,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,IAAI,CAAC,uCAAuC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC;QACF,CAAC;aAAM,CAAC;YACP,qEAAqE;YACrE,SAAS,CAAC,IAAI,CACb,SAAS,EAAE,mBAAmB,KAAK,CAAC,cAAc,6BAA6B,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK;gBACpG,WAAW,KAAK,CAAC,IAAI,2BAA2B,CACjD,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACxB,cAAsB,EACtB,EAAU,EACV,QAMC;QAED,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,cAAsB;QAMzC,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,cAAc,CAAC;SAChD,CAAC,CAAC;QAEH,OAAO;YACN,WAAW;YACX,WAAW,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC;YACpC,UAAU,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC;YAClC,SAAS;SACT,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QAIpB,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3D,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;SACzB,CAAC,CAAC;QAEH,OAAO;YACN,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,eAAe;SACzB,CAAC;IACH,CAAC;CACD"}
|
|
@@ -50,6 +50,15 @@ export interface NewAsset {
|
|
|
50
50
|
export interface ImageAsset {
|
|
51
51
|
_type: 'reference';
|
|
52
52
|
_ref: string;
|
|
53
|
+
/**
|
|
54
|
+
* Resolved public URL. NOT part of stored data — it's injected at render time
|
|
55
|
+
* (by `AssetService.injectAssetUrls` server-side, and by the editor's live preview
|
|
56
|
+
* client-side) so the frontend can read `image.asset.url` directly. Absent until then.
|
|
57
|
+
*/
|
|
58
|
+
url?: string;
|
|
59
|
+
/** The asset's default alt text, injected alongside `url`. Per-placement overrides live
|
|
60
|
+
* on `ImageValue.alt`; render precedence is `value.alt || asset.alt`. */
|
|
61
|
+
alt?: string;
|
|
53
62
|
}
|
|
54
63
|
export interface ImageCrop {
|
|
55
64
|
top: number;
|
|
@@ -68,6 +77,12 @@ export interface ImageValue {
|
|
|
68
77
|
asset: ImageAsset;
|
|
69
78
|
crop?: ImageCrop;
|
|
70
79
|
hotspot?: ImageHotspot;
|
|
80
|
+
/**
|
|
81
|
+
* Per-placement alt text — the single source of truth for this image's
|
|
82
|
+
* description. Edited on the image field (not the asset), and the string that
|
|
83
|
+
* carries visual-editing stega so the rendered <img alt> becomes click-to-edit.
|
|
84
|
+
*/
|
|
85
|
+
alt?: string;
|
|
71
86
|
[key: string]: any;
|
|
72
87
|
}
|
|
73
88
|
export interface FileAsset {
|