@phtngyn/cms 0.2.0-beta.3 → 0.2.0-beta.5
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/README.md +31 -13
- package/package.json +7 -7
- package/src/ApplicationTypes.d.ts +3 -3
- package/src/Authoring.d.ts +11 -3
- package/src/{Configuration-BU-UyGoH.js → Configuration-JQ1qyaU0.js} +347 -189
- package/src/Configuration-JQ1qyaU0.js.map +1 -0
- package/src/Configuration.d.ts +1 -1
- package/src/Content.d.ts +7 -6
- package/src/Content.js +106 -47
- package/src/Content.js.map +1 -1
- package/src/ContentTransfer-BxwswWn3.js +86 -0
- package/src/ContentTransfer-BxwswWn3.js.map +1 -0
- package/src/{ContentTransfer-CRQet3QJ.d.ts → ContentTransfer-Z9FHyLez.d.ts} +33 -9
- package/src/{DocumentEngine-ClhFXW9M.js → DocumentEngine-j6Vi7nQo.js} +279 -178
- package/src/DocumentEngine-j6Vi7nQo.js.map +1 -0
- package/src/DocumentModel.d.ts +9 -2
- package/src/DocumentModel.js +17 -4
- package/src/DocumentModel.js.map +1 -1
- package/src/{Forms-DoB56hfe.js → Forms-CX-hwmJF.js} +18 -11
- package/src/Forms-CX-hwmJF.js.map +1 -0
- package/src/{Forms-BbkE7QfC.js → Forms-CfNPTiCr.js} +2 -2
- package/src/{Forms-BbkE7QfC.js.map → Forms-CfNPTiCr.js.map} +1 -1
- package/src/Media-j1bTritO.js +112 -0
- package/src/Media-j1bTritO.js.map +1 -0
- package/src/Module.js +0 -4
- package/src/Module.js.map +1 -1
- package/src/References-CCPDAPve.js +45 -0
- package/src/References-CCPDAPve.js.map +1 -0
- package/src/{S3MediaObjects-CR3p1WTg.js → S3MediaObjects-BRuPQbxl.js} +454 -516
- package/src/S3MediaObjects-BRuPQbxl.js.map +1 -0
- package/src/cli/content.js +6 -5
- package/src/cli/content.js.map +1 -1
- package/src/cli.js +16 -3
- package/src/cli.js.map +1 -1
- package/src/{connection-D5S9Iph-.js → connection-BP80q4d-.js} +2 -2
- package/src/{connection-D5S9Iph-.js.map → connection-BP80q4d-.js.map} +1 -1
- package/src/{dev-lifecycle-D3f9-upa.js → dev-lifecycle-DdBluSiR.js} +26 -6
- package/src/dev-lifecycle-DdBluSiR.js.map +1 -0
- package/src/{installation-fZtNxtoW.js → installation-BoG8E3nJ.js} +7982 -7155
- package/src/installation-BoG8E3nJ.js.map +1 -0
- package/src/internal/authoring-catalog.js +2 -2
- package/src/internal/authoring-compiler.js +35 -9
- package/src/internal/authoring-compiler.js.map +1 -1
- package/src/internal/authoring-metadata.js +14 -5
- package/src/internal/authoring-metadata.js.map +1 -1
- package/src/internal/configuration.js +27 -3
- package/src/internal/configuration.js.map +1 -1
- package/src/internal/dev-lifecycle.js +2 -2
- package/src/internal/document-model.js +134 -43
- package/src/internal/document-model.js.map +1 -1
- package/src/internal/field-metadata.js +2 -1
- package/src/internal/field-metadata.js.map +1 -1
- package/src/internal/form-capabilities.js +1 -1
- package/src/{location-CPX7oj0o.js → location-CMNGO3lU.js} +2 -2
- package/src/{location-CPX7oj0o.js.map → location-CMNGO3lU.js.map} +1 -1
- package/src/{metadata-BEZPWh-3.js → metadata-UzZmjwxM.js} +2 -2
- package/src/{metadata-BEZPWh-3.js.map → metadata-UzZmjwxM.js.map} +1 -1
- package/src/{models-C9kF9JlQ.js → models-5j67LMqW.js} +4 -4
- package/src/{models-C9kF9JlQ.js.map → models-5j67LMqW.js.map} +1 -1
- package/src/{models-ChRxBChy.js → models-VmGmG19-.js} +42 -130
- package/src/models-VmGmG19-.js.map +1 -0
- package/src/runtime/delivery/DocumentRenderer.js +5 -1
- package/src/runtime/delivery/DocumentRenderer.js.map +1 -1
- package/src/runtime/delivery/context.js +1 -1
- package/src/runtime/delivery/document-page.js +1 -5
- package/src/runtime/delivery/document-page.js.map +1 -1
- package/src/runtime/delivery/plugin.js +34 -5
- package/src/runtime/delivery/plugin.js.map +1 -1
- package/src/runtime/delivery/preview.d.ts +1 -1
- package/src/runtime/delivery/types.d.ts +1 -1
- package/src/runtime/delivery/useCmsDocumentSeo.d.ts +2 -1
- package/src/runtime/delivery/useCmsDocumentSeo.js +5 -4
- package/src/runtime/delivery/useCmsDocumentSeo.js.map +1 -1
- package/src/runtime/forms/document.js +2 -2
- package/src/runtime/forms/useCmsForm.js +2 -2
- package/src/runtime/installation.js +1 -1
- package/src/runtime/plugin.js +1 -1
- package/src/runtime/preview/CmsStudioPreviewMarker.js +18 -4
- package/src/runtime/preview/CmsStudioPreviewMarker.js.map +1 -1
- package/src/runtime/preview/connection.js +1 -1
- package/src/runtime/preview/controller.js +65 -74
- package/src/runtime/preview/controller.js.map +1 -1
- package/src/runtime/preview/overlay.js +85 -28
- package/src/runtime/preview/overlay.js.map +1 -1
- package/src/runtime/preview/plugin.client.js +4 -4
- package/src/runtime/preview/preview.css +50 -36
- package/src/runtime/preview/protocol.d.ts +11 -5
- package/src/runtime/preview/protocol.js +17 -5
- package/src/runtime/preview/protocol.js.map +1 -1
- package/src/runtime/preview/regions.js +142 -0
- package/src/runtime/preview/regions.js.map +1 -0
- package/src/runtime/preview/store.js +1 -1
- package/src/runtime/sitemap.js +9 -10
- package/src/runtime/sitemap.js.map +1 -1
- package/src/{scalars-B2lgGUnj.js → scalars-CVZqT3L0.js} +2 -6
- package/src/scalars-CVZqT3L0.js.map +1 -0
- package/src/{store-CCsjHaZm.js → store-PKKB8xa2.js} +49 -66
- package/src/store-PKKB8xa2.js.map +1 -0
- package/src/{types-DutFRtaG.d.ts → types-DZ0IV-Ow.d.ts} +14 -3
- package/studio/CreateDocumentDialog-vQ8hDs2C.js +253 -0
- package/studio/{documentPlanning-CDb31mnl.js → documentPlanning-Bx3W9KkD.js} +12054 -12085
- package/studio/{editor-Bzlh3zXt.js → editor-P2rB7Csp.js} +11228 -11927
- package/studio/host.css +1 -1
- package/studio/host.js +23595 -24903
- package/studio/rolldown-runtime-Dy4uBu1J.js +11 -0
- package/src/Configuration-BU-UyGoH.js.map +0 -1
- package/src/ContentTransfer-BhF9G56s.js +0 -57
- package/src/ContentTransfer-BhF9G56s.js.map +0 -1
- package/src/DocumentEngine-ClhFXW9M.js.map +0 -1
- package/src/Forms-DoB56hfe.js.map +0 -1
- package/src/S3MediaObjects-CR3p1WTg.js.map +0 -1
- package/src/dev-lifecycle-D3f9-upa.js.map +0 -1
- package/src/installation-fZtNxtoW.js.map +0 -1
- package/src/models-ChRxBChy.js.map +0 -1
- package/src/runtime/preview/targets.js +0 -101
- package/src/runtime/preview/targets.js.map +0 -1
- package/src/scalars-B2lgGUnj.js.map +0 -1
- package/src/store-CCsjHaZm.js.map +0 -1
- package/studio/CreateDocumentDialog-DJ8c0WZb.js +0 -256
- package/studio/dom-to-image-more.min-D6jGGdrW.js +0 -877
- package/studio/rolldown-runtime-B0aSnxlc.js +0 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","names":[],"sources":["../../../../../src/runtime/preview/overlay.ts"],"sourcesContent":["/** Preview-only chrome stays separate from the website's layout and element styles. */\nexport function mountPreviewOverlay(root: Document, view: Window, kind: 'selection' | 'hover' = 'selection') {\n const host = root.createElement('div')\n host.setAttribute('data-cms-preview-overlay', '')\n host.setAttribute('aria-hidden', 'true')\n root.documentElement.append(host)\n let targets: ReadonlyArray<
|
|
1
|
+
{"version":3,"file":"overlay.js","names":[],"sources":["../../../../../src/runtime/preview/overlay.ts"],"sourcesContent":["import type { PreviewRegionGeometry } from './regions'\n\ninterface PreviewOverlayPresentation {\n readonly label?: string\n readonly match?: 'exact' | 'fallback'\n readonly reveal?: boolean\n}\n\n/** Preview-only chrome stays separate from the website's layout and element styles. */\nexport function mountPreviewOverlay(root: Document, view: Window, kind: 'selection' | 'hover' = 'selection') {\n const host = root.createElement('div')\n const targetAttribute = kind === 'selection' ? 'data-cms-selected' : 'data-cms-hovered'\n host.setAttribute('data-cms-preview-overlay', '')\n host.setAttribute('aria-hidden', 'true')\n root.documentElement.append(host)\n let markedElements = new Set<Element>()\n let targets: ReadonlyArray<PreviewRegionGeometry> = []\n let outlines: Array<HTMLElement> = []\n let frame = 0\n let isPending = false\n let revealFrame = 0\n\n const markTargets = (geometries: ReadonlyArray<PreviewRegionGeometry>): void => {\n for (const element of markedElements) element.removeAttribute(targetAttribute)\n markedElements = new Set(geometries.flatMap((geometry) => geometry.element() ?? []))\n\n for (const element of markedElements) element.setAttribute(targetAttribute, '')\n }\n\n const setLabelVisibility = (outline: HTMLElement, visible: boolean, labelled: boolean): boolean => {\n const showLabel = kind === 'selection' && visible && !labelled\n\n outline.toggleAttribute('data-cms-selection-label', showLabel)\n\n return labelled || showLabel\n }\n\n const position = (): void => {\n let labelled = false\n\n for (const [index, target] of targets.entries()) {\n const outline = outlines[index]\n\n if (!outline) continue\n const element = target.element()\n const rect = geometryBounds(target)\n\n const visible =\n rect !== undefined &&\n (kind !== 'hover' || !element?.hasAttribute('data-cms-selected')) &&\n rect.width > 0 &&\n rect.height > 0 &&\n rect.bottom > 0 &&\n rect.top < view.innerHeight &&\n rect.right > 0 &&\n rect.left < view.innerWidth\n\n if (!visible) {\n const retainPosition = isPending && outline.hasAttribute('data-cms-positioned')\n\n outline.hidden = !retainPosition\n labelled = setLabelVisibility(outline, retainPosition, labelled)\n\n continue\n }\n\n outline.hidden = false\n outline.setAttribute('data-cms-positioned', '')\n labelled = setLabelVisibility(outline, true, labelled)\n const left = Math.max(2, rect.left - 3)\n const right = Math.min(view.innerWidth - 2, rect.right + 3)\n outline.style.left = `${left}px`\n outline.style.top = `${rect.top - 3}px`\n outline.style.width = `${Math.max(0, right - left)}px`\n outline.style.height = `${rect.height + 6}px`\n const labelWidth = outline.querySelector<HTMLElement>('[data-cms-selection-label-content]')?.offsetWidth ?? 0\n const labelLeft = Math.max(4 - left, Math.min(0, view.innerWidth - 4 - labelWidth - left))\n\n outline.style.setProperty('--cms-label-left', `${labelLeft}px`)\n outline.style.setProperty('--cms-label-top', `${Math.max(4 - rect.top, rect.top >= 30 ? -26 : 4)}px`)\n }\n\n frame = targets.length ? view.requestAnimationFrame(position) : 0\n }\n\n return {\n setPending(value: boolean): void {\n isPending = value\n host.toggleAttribute('data-cms-pending', value)\n },\n show(geometries: ReadonlyArray<PreviewRegionGeometry>, presentation: PreviewOverlayPresentation = {}): void {\n const targetsChanged =\n geometries.length !== targets.length || geometries.some((geometry, index) => geometry !== targets[index])\n\n const labelText =\n presentation.match === 'fallback'\n ? `Nearest · ${presentation.label ?? 'selected content'}`\n : (presentation.label ?? 'Selected')\n\n if (targetsChanged) {\n if (frame) view.cancelAnimationFrame(frame)\n targets = geometries\n outlines = geometries.map(() => {\n const outline = root.createElement('div')\n outline.setAttribute(kind === 'selection' ? 'data-cms-selection-outline' : 'data-cms-hover-outline', '')\n\n if (kind === 'selection') {\n const label = root.createElement('span')\n label.setAttribute('data-cms-selection-label-content', '')\n outline.append(label)\n }\n\n return outline\n })\n host.replaceChildren(...outlines)\n position()\n }\n\n markTargets(targets)\n\n for (const outline of outlines) {\n const label = outline.querySelector<HTMLElement>('[data-cms-selection-label-content]')\n\n if (label) label.textContent = labelText\n\n if (presentation.match) outline.setAttribute('data-cms-match', presentation.match)\n else outline.removeAttribute('data-cms-match')\n\n outline.toggleAttribute('data-cms-reveal', presentation.reveal === true)\n }\n\n if (!presentation.reveal || !outlines.length) return\n\n if (revealFrame) view.cancelAnimationFrame(revealFrame)\n revealFrame = view.requestAnimationFrame(() => {\n revealFrame = view.requestAnimationFrame(() => {\n for (const outline of outlines) outline.removeAttribute('data-cms-reveal')\n revealFrame = 0\n })\n })\n },\n destroy(): void {\n if (frame) view.cancelAnimationFrame(frame)\n\n if (revealFrame) view.cancelAnimationFrame(revealFrame)\n markTargets([])\n host.remove()\n },\n }\n}\n\nfunction geometryBounds(geometry: PreviewRegionGeometry):\n | {\n readonly bottom: number\n readonly height: number\n readonly left: number\n readonly right: number\n readonly top: number\n readonly width: number\n }\n | undefined {\n const rectangles = geometry.rects()\n\n if (!rectangles.length) return undefined\n const left = Math.min(...rectangles.map((rectangle) => rectangle.left))\n const top = Math.min(...rectangles.map((rectangle) => rectangle.top))\n const right = Math.max(...rectangles.map((rectangle) => rectangle.right))\n const bottom = Math.max(...rectangles.map((rectangle) => rectangle.bottom))\n\n return { bottom, height: bottom - top, left, right, top, width: right - left }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { o as PublicPath } from "../../scalars-
|
|
2
|
-
import { t as openSitePreviewConnection } from "../../connection-
|
|
3
|
-
import { n as readPreviewLocation, r as withPreviewLocation } from "../../location-
|
|
1
|
+
import { o as PublicPath } from "../../scalars-CVZqT3L0.js";
|
|
2
|
+
import { t as openSitePreviewConnection } from "../../connection-BP80q4d-.js";
|
|
3
|
+
import { n as readPreviewLocation, r as withPreviewLocation } from "../../location-CMNGO3lU.js";
|
|
4
4
|
import { formComponentsKey } from "../delivery/blocks.js";
|
|
5
5
|
import { documentPreviewStoreKey } from "../delivery/preview.js";
|
|
6
6
|
import { mountPreviewController } from "./controller.js";
|
|
7
|
-
import { t as createStudioPreviewStore } from "../../store-
|
|
7
|
+
import { t as createStudioPreviewStore } from "../../store-PKKB8xa2.js";
|
|
8
8
|
import { Result, Schema } from "effect";
|
|
9
9
|
import { inject, watch } from "vue";
|
|
10
10
|
import { defineNuxtPlugin, navigateTo, onNuxtReady, useNuxtApp, useState } from "nuxt/app";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
[data-cms-preview-decorated] {
|
|
2
|
-
cursor:
|
|
2
|
+
cursor: default;
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
[data-cms-preview-overlay] {
|
|
@@ -15,12 +15,38 @@
|
|
|
15
15
|
box-sizing: border-box;
|
|
16
16
|
position: fixed;
|
|
17
17
|
pointer-events: none !important;
|
|
18
|
+
transition:
|
|
19
|
+
background-color 180ms cubic-bezier(0.23, 1, 0.32, 1),
|
|
20
|
+
border-color 140ms ease,
|
|
21
|
+
opacity 140ms ease;
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
[data-cms-selection-outline] {
|
|
21
|
-
border:
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
border: 2px solid #2563eb;
|
|
26
|
+
border-radius: 4px;
|
|
27
|
+
background: rgb(37 99 235 / 6%);
|
|
28
|
+
box-shadow:
|
|
29
|
+
0 0 0 1px rgb(255 255 255 / 95%),
|
|
30
|
+
0 1px 3px rgb(0 0 0 / 18%);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
[data-cms-selection-outline][data-cms-match='fallback'] {
|
|
34
|
+
border-style: dashed;
|
|
35
|
+
background: transparent;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
[data-cms-selection-outline][data-cms-reveal] {
|
|
39
|
+
background: rgb(37 99 235 / 18%);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
[data-cms-preview-overlay][data-cms-pending] [data-cms-selection-outline] {
|
|
43
|
+
opacity: 0.45;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
[data-cms-hover-outline] {
|
|
47
|
+
border: 1px solid rgb(37 99 235 / 55%);
|
|
48
|
+
border-radius: 4px;
|
|
49
|
+
box-shadow: 0 0 0 1px rgb(255 255 255 / 80%);
|
|
24
50
|
}
|
|
25
51
|
|
|
26
52
|
[data-cms-selection-outline][hidden],
|
|
@@ -28,50 +54,38 @@
|
|
|
28
54
|
display: none;
|
|
29
55
|
}
|
|
30
56
|
|
|
31
|
-
[data-cms-selection-label]
|
|
32
|
-
|
|
57
|
+
[data-cms-selection-label-content] {
|
|
58
|
+
all: initial;
|
|
59
|
+
display: none;
|
|
33
60
|
position: absolute;
|
|
34
61
|
left: var(--cms-label-left, 0px);
|
|
35
62
|
top: var(--cms-label-top, -26px);
|
|
63
|
+
box-sizing: border-box;
|
|
64
|
+
max-width: min(240px, calc(100vw - 8px));
|
|
65
|
+
overflow: hidden;
|
|
36
66
|
padding: 3px 7px;
|
|
37
|
-
border: 1px solid #fff;
|
|
38
67
|
border-radius: 4px;
|
|
39
|
-
background: #
|
|
68
|
+
background: #2563eb;
|
|
69
|
+
box-shadow: 0 0 0 1px rgb(255 255 255 / 95%);
|
|
40
70
|
color: #fff;
|
|
41
71
|
font:
|
|
42
72
|
500 11px/16px system-ui,
|
|
43
73
|
sans-serif;
|
|
74
|
+
text-overflow: ellipsis;
|
|
44
75
|
white-space: nowrap;
|
|
45
76
|
}
|
|
46
77
|
|
|
47
|
-
[data-cms-
|
|
48
|
-
|
|
49
|
-
box-sizing: border-box;
|
|
50
|
-
position: absolute;
|
|
51
|
-
width: min(12px, 40%);
|
|
52
|
-
height: min(12px, 40%);
|
|
53
|
-
border-top: 2px solid #fff;
|
|
54
|
-
border-left: 2px solid #fff;
|
|
55
|
-
pointer-events: none !important;
|
|
56
|
-
filter: drop-shadow(1px 0 #171717) drop-shadow(-1px 0 #171717) drop-shadow(0 1px #171717) drop-shadow(0 -1px #171717);
|
|
78
|
+
[data-cms-selection-label] > [data-cms-selection-label-content] {
|
|
79
|
+
display: block;
|
|
57
80
|
}
|
|
58
81
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
[data-cms-hover-corner='bottom-right'] {
|
|
69
|
-
bottom: 0;
|
|
70
|
-
right: 0;
|
|
71
|
-
transform: rotate(180deg);
|
|
72
|
-
}
|
|
73
|
-
[data-cms-hover-corner='bottom-left'] {
|
|
74
|
-
bottom: 0;
|
|
75
|
-
left: 0;
|
|
76
|
-
transform: rotate(270deg);
|
|
82
|
+
@media (prefers-reduced-motion: reduce) {
|
|
83
|
+
[data-cms-selection-outline],
|
|
84
|
+
[data-cms-hover-outline] {
|
|
85
|
+
transition: opacity 120ms ease;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
[data-cms-selection-outline][data-cms-reveal] {
|
|
89
|
+
background: rgb(37 99 235 / 6%);
|
|
90
|
+
}
|
|
77
91
|
}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
//#region src/runtime/preview/protocol.d.ts
|
|
2
2
|
export declare const CMS_PREVIEW_DECORATED_ATTRIBUTE = "data-cms-preview-decorated";
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
3
|
+
export declare const CMS_PREVIEW_EDGE_PROPERTY = "edge";
|
|
4
|
+
export declare const CMS_PREVIEW_KIND_PROPERTY = "kind";
|
|
5
5
|
export declare const CMS_PREVIEW_MARKER_TAG = "cms-studio-preview-marker";
|
|
6
|
-
export declare const
|
|
7
|
-
export
|
|
8
|
-
export type
|
|
6
|
+
export declare const CMS_PREVIEW_NODE_PROPERTY = "node";
|
|
7
|
+
export type CmsPreviewTargetKind = 'component' | 'field' | 'native';
|
|
8
|
+
export type CmsPreviewMarkerEdge = 'end' | 'start';
|
|
9
|
+
export declare function previewMarkerComment(nodeId: string, kind: CmsPreviewTargetKind, edge: CmsPreviewMarkerEdge): string;
|
|
10
|
+
export declare function parsePreviewMarkerComment(value: string): {
|
|
11
|
+
readonly edge: CmsPreviewMarkerEdge;
|
|
12
|
+
readonly kind: CmsPreviewTargetKind;
|
|
13
|
+
readonly nodeId: string;
|
|
14
|
+
} | undefined;
|
|
9
15
|
//#endregion
|
|
10
16
|
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
//#region src/runtime/preview/protocol.ts
|
|
2
2
|
const CMS_PREVIEW_DECORATED_ATTRIBUTE = "data-cms-preview-decorated";
|
|
3
|
-
const
|
|
4
|
-
const
|
|
3
|
+
const CMS_PREVIEW_EDGE_PROPERTY = "edge";
|
|
4
|
+
const CMS_PREVIEW_KIND_PROPERTY = "kind";
|
|
5
5
|
const CMS_PREVIEW_MARKER_TAG = "cms-studio-preview-marker";
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const CMS_PREVIEW_NODE_PROPERTY = "node";
|
|
7
|
+
const CMS_PREVIEW_COMMENT_PREFIX = "cms-preview";
|
|
8
|
+
function previewMarkerComment(nodeId, kind, edge) {
|
|
9
|
+
return `${CMS_PREVIEW_COMMENT_PREFIX}:${kind}:${edge}:${nodeId}`;
|
|
10
|
+
}
|
|
11
|
+
function parsePreviewMarkerComment(value) {
|
|
12
|
+
const [prefix, kind, edge, nodeId, extra] = value.split(":");
|
|
13
|
+
if (prefix !== CMS_PREVIEW_COMMENT_PREFIX || kind !== "component" && kind !== "field" && kind !== "native" || edge !== "end" && edge !== "start" || !nodeId || extra !== void 0) return void 0;
|
|
14
|
+
return {
|
|
15
|
+
edge,
|
|
16
|
+
kind,
|
|
17
|
+
nodeId
|
|
18
|
+
};
|
|
19
|
+
}
|
|
8
20
|
|
|
9
21
|
//#endregion
|
|
10
|
-
export { CMS_PREVIEW_DECORATED_ATTRIBUTE,
|
|
22
|
+
export { CMS_PREVIEW_DECORATED_ATTRIBUTE, CMS_PREVIEW_EDGE_PROPERTY, CMS_PREVIEW_KIND_PROPERTY, CMS_PREVIEW_MARKER_TAG, CMS_PREVIEW_NODE_PROPERTY, parsePreviewMarkerComment, previewMarkerComment };
|
|
11
23
|
//# sourceMappingURL=protocol.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","names":[],"sources":["../../../../../src/runtime/preview/protocol.ts"],"sourcesContent":["export const CMS_PREVIEW_DECORATED_ATTRIBUTE = 'data-cms-preview-decorated'\n\nexport const
|
|
1
|
+
{"version":3,"file":"protocol.js","names":[],"sources":["../../../../../src/runtime/preview/protocol.ts"],"sourcesContent":["export const CMS_PREVIEW_DECORATED_ATTRIBUTE = 'data-cms-preview-decorated'\n\nexport const CMS_PREVIEW_EDGE_PROPERTY = 'edge'\n\nexport const CMS_PREVIEW_KIND_PROPERTY = 'kind'\n\nexport const CMS_PREVIEW_MARKER_TAG = 'cms-studio-preview-marker'\n\nexport const CMS_PREVIEW_NODE_PROPERTY = 'node'\n\nexport type CmsPreviewTargetKind = 'component' | 'field' | 'native'\n\nexport type CmsPreviewMarkerEdge = 'end' | 'start'\n\nconst CMS_PREVIEW_COMMENT_PREFIX = 'cms-preview'\n\nexport function previewMarkerComment(nodeId: string, kind: CmsPreviewTargetKind, edge: CmsPreviewMarkerEdge): string {\n return `${CMS_PREVIEW_COMMENT_PREFIX}:${kind}:${edge}:${nodeId}`\n}\n\nexport function parsePreviewMarkerComment(value: string):\n | {\n readonly edge: CmsPreviewMarkerEdge\n readonly kind: CmsPreviewTargetKind\n readonly nodeId: string\n }\n | undefined {\n const [prefix, kind, edge, nodeId, extra] = value.split(':')\n\n if (\n prefix !== CMS_PREVIEW_COMMENT_PREFIX ||\n (kind !== 'component' && kind !== 'field' && kind !== 'native') ||\n (edge !== 'end' && edge !== 'start') ||\n !nodeId ||\n extra !== undefined\n )\n return undefined\n\n return { edge, kind, nodeId }\n}\n"],"mappings":";AAAA,MAAa,kCAAkC;AAE/C,MAAa,4BAA4B;AAEzC,MAAa,4BAA4B;AAEzC,MAAa,yBAAyB;AAEtC,MAAa,4BAA4B;AAMzC,MAAM,6BAA6B;AAEnC,SAAgB,qBAAqB,QAAgB,MAA4B,MAAoC;CACnH,OAAO,GAAG,2BAA2B,GAAG,KAAK,GAAG,KAAK,GAAG;AAC1D;AAEA,SAAgB,0BAA0B,OAM5B;CACZ,MAAM,CAAC,QAAQ,MAAM,MAAM,QAAQ,SAAS,MAAM,MAAM,GAAG;CAE3D,IACE,WAAW,8BACV,SAAS,eAAe,SAAS,WAAW,SAAS,YACrD,SAAS,SAAS,SAAS,WAC5B,CAAC,UACD,UAAU,QAEV,OAAO;CAET,OAAO;EAAE;EAAM;EAAM;CAAO;AAC9B"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { CMS_PREVIEW_DECORATED_ATTRIBUTE, parsePreviewMarkerComment } from "./protocol.js";
|
|
2
|
+
|
|
3
|
+
//#region src/runtime/preview/regions.ts
|
|
4
|
+
const TARGET_PRIORITY = {
|
|
5
|
+
component: 1,
|
|
6
|
+
field: 3,
|
|
7
|
+
native: 2
|
|
8
|
+
};
|
|
9
|
+
const COMMENT_NODE_FILTER = 128;
|
|
10
|
+
const DOCUMENT_NODE = 9;
|
|
11
|
+
/** Owns the DOM representation, hit testing and fallback resolution of semantic authoring regions. */
|
|
12
|
+
function mountPreviewRegions(root, view) {
|
|
13
|
+
const geometryCache = /* @__PURE__ */ new WeakMap();
|
|
14
|
+
const collect = (scope = root) => {
|
|
15
|
+
const targets = /* @__PURE__ */ new Map();
|
|
16
|
+
const open = [];
|
|
17
|
+
const scopeNode = scope;
|
|
18
|
+
const ownerDocument = scopeNode.nodeType === DOCUMENT_NODE ? scopeNode : scope.ownerDocument;
|
|
19
|
+
if (!ownerDocument) return [];
|
|
20
|
+
const walker = ownerDocument.createTreeWalker(scopeNode, COMMENT_NODE_FILTER);
|
|
21
|
+
let current = walker.nextNode();
|
|
22
|
+
while (current) {
|
|
23
|
+
const comment = current;
|
|
24
|
+
const marker = parsePreviewMarkerComment(comment.data);
|
|
25
|
+
if (marker?.edge === "start") open.push({
|
|
26
|
+
comment,
|
|
27
|
+
depth: open.length,
|
|
28
|
+
kind: marker.kind,
|
|
29
|
+
nodeId: marker.nodeId
|
|
30
|
+
});
|
|
31
|
+
else if (marker?.edge === "end") {
|
|
32
|
+
const start = open.at(-1);
|
|
33
|
+
if (start?.kind === marker.kind && start.nodeId === marker.nodeId) {
|
|
34
|
+
open.pop();
|
|
35
|
+
const geometry = rangeGeometry(start.comment, comment, start.depth, geometryCache);
|
|
36
|
+
const key = `${marker.kind}:${marker.nodeId}`;
|
|
37
|
+
const target = targets.get(key);
|
|
38
|
+
targets.set(key, {
|
|
39
|
+
geometries: target ? [...target.geometries, geometry] : [geometry],
|
|
40
|
+
kind: marker.kind,
|
|
41
|
+
nodeId: marker.nodeId
|
|
42
|
+
});
|
|
43
|
+
} else open.length = 0;
|
|
44
|
+
}
|
|
45
|
+
current = walker.nextNode();
|
|
46
|
+
}
|
|
47
|
+
return [...targets.values()];
|
|
48
|
+
};
|
|
49
|
+
return {
|
|
50
|
+
clear() {
|
|
51
|
+
for (const element of root.querySelectorAll(`[${CMS_PREVIEW_DECORATED_ATTRIBUTE}], [data-cms-hovered], [data-cms-selected]`)) {
|
|
52
|
+
element.removeAttribute(CMS_PREVIEW_DECORATED_ATTRIBUTE);
|
|
53
|
+
element.removeAttribute("data-cms-hovered");
|
|
54
|
+
element.removeAttribute("data-cms-selected");
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
decorate(scope) {
|
|
58
|
+
for (const target of collect(scope)) for (const geometry of target.geometries) geometry.element()?.setAttribute(CMS_PREVIEW_DECORATED_ATTRIBUTE, "");
|
|
59
|
+
},
|
|
60
|
+
hitTest(x, y, scope) {
|
|
61
|
+
const candidates = collect(scope).filter((target) => target.geometries.some((geometry) => geometry.rects().some((rect) => x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom)));
|
|
62
|
+
candidates.sort((left, right) => targetDepth(right) - targetDepth(left) || TARGET_PRIORITY[right.kind] - TARGET_PRIORITY[left.kind] || targetArea(left) - targetArea(right));
|
|
63
|
+
return candidates[0]?.nodeId;
|
|
64
|
+
},
|
|
65
|
+
locate(nodeId, fallbacks, scope) {
|
|
66
|
+
const visited = /* @__PURE__ */ new Set();
|
|
67
|
+
const targets = collect(scope);
|
|
68
|
+
let targetId = nodeId;
|
|
69
|
+
while (targetId && !visited.has(targetId)) {
|
|
70
|
+
visited.add(targetId);
|
|
71
|
+
const geometries = targets.filter((target) => target.nodeId === targetId).flatMap((target) => target.geometries);
|
|
72
|
+
if (geometries.length) return {
|
|
73
|
+
geometries,
|
|
74
|
+
nodeId: targetId
|
|
75
|
+
};
|
|
76
|
+
targetId = fallbacks[targetId];
|
|
77
|
+
}
|
|
78
|
+
return { geometries: [] };
|
|
79
|
+
},
|
|
80
|
+
nearest(geometries) {
|
|
81
|
+
const viewportCenter = view.innerHeight / 2;
|
|
82
|
+
return [...geometries].sort((left, right) => viewportDistance(left, viewportCenter, view) - viewportDistance(right, viewportCenter, view))[0]?.element();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function rangeGeometry(start, end, depth, cache) {
|
|
87
|
+
const cached = cache.get(start);
|
|
88
|
+
if (cached?.end === end && cached.geometry.depth === depth) return cached.geometry;
|
|
89
|
+
const geometry = {
|
|
90
|
+
depth,
|
|
91
|
+
element: () => rangeElement(start, end),
|
|
92
|
+
rects: () => rangeRectangles(start, end)
|
|
93
|
+
};
|
|
94
|
+
cache.set(start, {
|
|
95
|
+
end,
|
|
96
|
+
geometry
|
|
97
|
+
});
|
|
98
|
+
return geometry;
|
|
99
|
+
}
|
|
100
|
+
function rangeElement(start, end) {
|
|
101
|
+
if (!start.isConnected || !end.isConnected || start.parentNode !== end.parentNode) return void 0;
|
|
102
|
+
let current = start.nextSibling;
|
|
103
|
+
while (current && current !== end) {
|
|
104
|
+
if (current.nodeType === current.ELEMENT_NODE) return current;
|
|
105
|
+
current = current.nextSibling;
|
|
106
|
+
}
|
|
107
|
+
return start.parentElement ?? void 0;
|
|
108
|
+
}
|
|
109
|
+
function rangeRectangles(start, end) {
|
|
110
|
+
if (!start.isConnected || !end.isConnected) return [];
|
|
111
|
+
const range = start.ownerDocument.createRange();
|
|
112
|
+
try {
|
|
113
|
+
range.setStartAfter(start);
|
|
114
|
+
range.setEndBefore(end);
|
|
115
|
+
const rectangles = [...range.getClientRects()].filter(isVisibleRectangle);
|
|
116
|
+
if (rectangles.length) return rectangles;
|
|
117
|
+
} catch {}
|
|
118
|
+
const element = rangeElement(start, end);
|
|
119
|
+
return element ? [...element.getClientRects()].filter(isVisibleRectangle) : [];
|
|
120
|
+
}
|
|
121
|
+
function isVisibleRectangle(rectangle) {
|
|
122
|
+
return rectangle.width > 0 && rectangle.height > 0;
|
|
123
|
+
}
|
|
124
|
+
function targetDepth(target) {
|
|
125
|
+
return Math.max(0, ...target.geometries.map((geometry) => geometry.depth));
|
|
126
|
+
}
|
|
127
|
+
function targetArea(target) {
|
|
128
|
+
return Math.min(Infinity, ...target.geometries.flatMap((geometry) => geometry.rects().map((rect) => rect.width * rect.height)));
|
|
129
|
+
}
|
|
130
|
+
function viewportDistance(geometry, viewportCenter, view) {
|
|
131
|
+
const rectangles = geometry.rects();
|
|
132
|
+
const top = Math.min(Infinity, ...rectangles.map((rectangle) => rectangle.top));
|
|
133
|
+
const bottom = Math.max(-Infinity, ...rectangles.map((rectangle) => rectangle.bottom));
|
|
134
|
+
if (!Number.isFinite(top) || !Number.isFinite(bottom)) return Infinity;
|
|
135
|
+
const visible = bottom >= 0 && top <= view.innerHeight;
|
|
136
|
+
const distance = Math.abs((top + bottom) / 2 - viewportCenter);
|
|
137
|
+
return visible ? distance : view.innerHeight + distance;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
//#endregion
|
|
141
|
+
export { mountPreviewRegions };
|
|
142
|
+
//# sourceMappingURL=regions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regions.js","names":["element"],"sources":["../../../../../src/runtime/preview/regions.ts"],"sourcesContent":["import type { CmsPreviewTargetKind } from './protocol'\nimport { CMS_PREVIEW_DECORATED_ATTRIBUTE, parsePreviewMarkerComment } from './protocol'\n\nexport interface PreviewRegionGeometry {\n readonly depth: number\n readonly element: () => Element | undefined\n readonly rects: () => ReadonlyArray<DOMRect>\n}\n\ninterface PreviewRegionTarget {\n readonly geometries: ReadonlyArray<PreviewRegionGeometry>\n readonly kind: CmsPreviewTargetKind\n readonly nodeId: string\n}\n\nexport interface LocatedPreviewRegion {\n readonly geometries: ReadonlyArray<PreviewRegionGeometry>\n readonly nodeId?: string\n}\n\nexport interface PreviewRegionRegistry {\n readonly clear: () => void\n readonly decorate: (scope?: ParentNode) => void\n readonly hitTest: (x: number, y: number, scope?: ParentNode) => string | undefined\n readonly locate: (\n nodeId: string,\n fallbacks: Readonly<Record<string, string>>,\n scope?: ParentNode,\n ) => LocatedPreviewRegion\n readonly nearest: (geometries: ReadonlyArray<PreviewRegionGeometry>) => Element | undefined\n}\n\nconst TARGET_PRIORITY = { component: 1, field: 3, native: 2 } satisfies Record<CmsPreviewTargetKind, number>\n\nconst COMMENT_NODE_FILTER = 128\n\nconst DOCUMENT_NODE = 9\n\ninterface OpenMarker {\n readonly comment: Comment\n readonly depth: number\n readonly kind: CmsPreviewTargetKind\n readonly nodeId: string\n}\n\n/** Owns the DOM representation, hit testing and fallback resolution of semantic authoring regions. */\nexport function mountPreviewRegions(root: ParentNode, view: Window): PreviewRegionRegistry {\n const geometryCache = new WeakMap<Comment, { readonly end: Comment; readonly geometry: PreviewRegionGeometry }>()\n\n const collect = (scope: ParentNode = root): ReadonlyArray<PreviewRegionTarget> => {\n const targets = new Map<string, PreviewRegionTarget>()\n const open: Array<OpenMarker> = []\n // SAFETY: ParentNode is a DOM mixin implemented only by Document, DocumentFragment, and Element nodes.\n const scopeNode = scope as Node\n // SAFETY: A DOM node with the Document node type satisfies the Document interface.\n const ownerDocument = scopeNode.nodeType === DOCUMENT_NODE ? (scopeNode as Document) : scope.ownerDocument\n\n if (!ownerDocument) return []\n const walker = ownerDocument.createTreeWalker(scopeNode, COMMENT_NODE_FILTER)\n let current = walker.nextNode()\n\n while (current) {\n // SAFETY: The TreeWalker is restricted to comment nodes.\n const comment = current as Comment\n const marker = parsePreviewMarkerComment(comment.data)\n\n if (marker?.edge === 'start') {\n open.push({ comment, depth: open.length, kind: marker.kind, nodeId: marker.nodeId })\n } else if (marker?.edge === 'end') {\n const start = open.at(-1)\n\n if (start?.kind === marker.kind && start.nodeId === marker.nodeId) {\n open.pop()\n const geometry = rangeGeometry(start.comment, comment, start.depth, geometryCache)\n const key = `${marker.kind}:${marker.nodeId}`\n const target = targets.get(key)\n\n targets.set(key, {\n geometries: target ? [...target.geometries, geometry] : [geometry],\n kind: marker.kind,\n nodeId: marker.nodeId,\n })\n } else open.length = 0\n }\n\n current = walker.nextNode()\n }\n\n return [...targets.values()]\n }\n\n return {\n clear() {\n for (const element of root.querySelectorAll(\n `[${CMS_PREVIEW_DECORATED_ATTRIBUTE}], [data-cms-hovered], [data-cms-selected]`,\n )) {\n element.removeAttribute(CMS_PREVIEW_DECORATED_ATTRIBUTE)\n element.removeAttribute('data-cms-hovered')\n element.removeAttribute('data-cms-selected')\n }\n },\n decorate(scope) {\n for (const target of collect(scope)) {\n for (const geometry of target.geometries) geometry.element()?.setAttribute(CMS_PREVIEW_DECORATED_ATTRIBUTE, '')\n }\n },\n hitTest(x, y, scope) {\n const candidates = collect(scope).filter((target) =>\n target.geometries.some((geometry) =>\n geometry.rects().some((rect) => x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom),\n ),\n )\n\n candidates.sort(\n (left, right) =>\n targetDepth(right) - targetDepth(left) ||\n TARGET_PRIORITY[right.kind] - TARGET_PRIORITY[left.kind] ||\n targetArea(left) - targetArea(right),\n )\n\n return candidates[0]?.nodeId\n },\n locate(nodeId, fallbacks, scope) {\n const visited = new Set<string>()\n const targets = collect(scope)\n let targetId: string | undefined = nodeId\n\n while (targetId && !visited.has(targetId)) {\n visited.add(targetId)\n\n const geometries = targets.filter((target) => target.nodeId === targetId).flatMap((target) => target.geometries)\n\n if (geometries.length) return { geometries, nodeId: targetId }\n targetId = fallbacks[targetId]\n }\n\n return { geometries: [] }\n },\n nearest(geometries) {\n const viewportCenter = view.innerHeight / 2\n\n return [...geometries]\n .sort(\n (left, right) => viewportDistance(left, viewportCenter, view) - viewportDistance(right, viewportCenter, view),\n )[0]\n ?.element()\n },\n }\n}\n\nfunction rangeGeometry(\n start: Comment,\n end: Comment,\n depth: number,\n cache: WeakMap<Comment, { readonly end: Comment; readonly geometry: PreviewRegionGeometry }>,\n): PreviewRegionGeometry {\n const cached = cache.get(start)\n\n if (cached?.end === end && cached.geometry.depth === depth) return cached.geometry\n\n const geometry: PreviewRegionGeometry = {\n depth,\n element: () => rangeElement(start, end),\n rects: () => rangeRectangles(start, end),\n }\n\n cache.set(start, { end, geometry })\n\n return geometry\n}\n\nfunction rangeElement(start: Comment, end: Comment): Element | undefined {\n if (!start.isConnected || !end.isConnected || start.parentNode !== end.parentNode) return undefined\n let current = start.nextSibling\n\n while (current && current !== end) {\n if (current.nodeType === current.ELEMENT_NODE) {\n // SAFETY: The node type check establishes the Element representation.\n const element = current as Element\n\n return element\n }\n\n current = current.nextSibling\n }\n\n return start.parentElement ?? undefined\n}\n\nfunction rangeRectangles(start: Comment, end: Comment): ReadonlyArray<DOMRect> {\n if (!start.isConnected || !end.isConnected) return []\n const range = start.ownerDocument.createRange()\n\n try {\n range.setStartAfter(start)\n range.setEndBefore(end)\n\n const rectangles = [...range.getClientRects()].filter(isVisibleRectangle)\n\n if (rectangles.length) return rectangles\n } catch {}\n\n const element = rangeElement(start, end)\n\n return element ? [...element.getClientRects()].filter(isVisibleRectangle) : []\n}\n\nfunction isVisibleRectangle(rectangle: DOMRect): boolean {\n return rectangle.width > 0 && rectangle.height > 0\n}\n\nfunction targetDepth(target: PreviewRegionTarget): number {\n return Math.max(0, ...target.geometries.map((geometry) => geometry.depth))\n}\n\nfunction targetArea(target: PreviewRegionTarget): number {\n return Math.min(\n Infinity,\n ...target.geometries.flatMap((geometry) => geometry.rects().map((rect) => rect.width * rect.height)),\n )\n}\n\nfunction viewportDistance(geometry: PreviewRegionGeometry, viewportCenter: number, view: Window): number {\n const rectangles = geometry.rects()\n const top = Math.min(Infinity, ...rectangles.map((rectangle) => rectangle.top))\n const bottom = Math.max(-Infinity, ...rectangles.map((rectangle) => rectangle.bottom))\n\n if (!Number.isFinite(top) || !Number.isFinite(bottom)) return Infinity\n const visible = bottom >= 0 && top <= view.innerHeight\n const distance = Math.abs((top + bottom) / 2 - viewportCenter)\n\n return visible ? distance : view.innerHeight + distance\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { documentPreviewStoreKey } from "../delivery/preview.js";
|
|
2
|
-
import { t as createStudioPreviewStore } from "../../store-
|
|
2
|
+
import { t as createStudioPreviewStore } from "../../store-PKKB8xa2.js";
|
|
3
3
|
|
|
4
4
|
export { createStudioPreviewStore, documentPreviewStoreKey };
|
package/src/runtime/sitemap.js
CHANGED
|
@@ -1,23 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Y as SitemapEntry } from "../models-VmGmG19-.js";
|
|
2
2
|
import { i as CMS_DELIVERY_SITEMAP_PATH } from "../HttpPaths-c9nLZ9H2.js";
|
|
3
3
|
import { useCmsInstallation } from "./plugin.js";
|
|
4
4
|
import { toNuxtSitemapEntries } from "./sitemap-entries.js";
|
|
5
|
-
import {
|
|
5
|
+
import { Schema } from "effect";
|
|
6
6
|
import { createError, defineEventHandler, getRequestURL } from "h3";
|
|
7
7
|
|
|
8
8
|
//#region src/runtime/sitemap.ts
|
|
9
9
|
const SitemapDelivery = Schema.Array(SitemapEntry);
|
|
10
|
-
var sitemap_default = defineEventHandler((event) =>
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
if (!response.ok) return yield* Effect.fail(createError({
|
|
10
|
+
var sitemap_default = defineEventHandler(async (event) => {
|
|
11
|
+
const response = await (await useCmsInstallation()).fetch(new Request(new URL(CMS_DELIVERY_SITEMAP_PATH, getRequestURL(event).origin)));
|
|
12
|
+
if (!response.ok) throw createError({
|
|
14
13
|
statusCode: response.status,
|
|
15
14
|
statusMessage: "CMS sitemap delivery failed"
|
|
16
|
-
})
|
|
17
|
-
const payload =
|
|
18
|
-
const entries =
|
|
15
|
+
});
|
|
16
|
+
const payload = await response.json();
|
|
17
|
+
const entries = await Schema.decodeUnknownPromise(SitemapDelivery)(payload);
|
|
19
18
|
return toNuxtSitemapEntries(entries);
|
|
20
|
-
})
|
|
19
|
+
});
|
|
21
20
|
|
|
22
21
|
//#endregion
|
|
23
22
|
export { sitemap_default as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sitemap.js","names":[],"sources":["../../../../src/runtime/sitemap.ts"],"sourcesContent":["import { CMS_DELIVERY_SITEMAP_PATH } from '@internal/protocol/HttpPaths'\nimport { SitemapEntry } from '@internal/protocol/Seo'\nimport {
|
|
1
|
+
{"version":3,"file":"sitemap.js","names":[],"sources":["../../../../src/runtime/sitemap.ts"],"sourcesContent":["import { CMS_DELIVERY_SITEMAP_PATH } from '@internal/protocol/HttpPaths'\nimport { SitemapEntry } from '@internal/protocol/Seo'\nimport { Schema } from 'effect'\nimport { createError, defineEventHandler, getRequestURL } from 'h3'\nimport { useCmsInstallation } from './plugin'\nimport { toNuxtSitemapEntries } from './sitemap-entries'\n\nconst SitemapDelivery = Schema.Array(SitemapEntry)\n\n// oxlint-disable-next-line effecttsgo/async-function -- Nitro owns this Promise-based request lifecycle.\nexport default defineEventHandler(async (event) => {\n const installation = await useCmsInstallation()\n\n const response = await installation.fetch(\n new Request(new URL(CMS_DELIVERY_SITEMAP_PATH, getRequestURL(event).origin)),\n )\n\n if (!response.ok) {\n throw createError({\n statusCode: response.status,\n statusMessage: 'CMS sitemap delivery failed',\n })\n }\n\n const payload = await response.json()\n const entries = await Schema.decodeUnknownPromise(SitemapDelivery)(payload)\n\n return toNuxtSitemapEntries(entries)\n})\n"],"mappings":";;;;;;;;AAOA,MAAM,kBAAkB,OAAO,MAAM,YAAY;AAGjD,sBAAe,mBAAmB,OAAO,UAAU;CAGjD,MAAM,WAAW,OAAM,MAFI,mBAAmB,EAEX,CAAC,MAClC,IAAI,QAAQ,IAAI,IAAI,2BAA2B,cAAc,KAAK,CAAC,CAAC,MAAM,CAAC,CAC7E;CAEA,IAAI,CAAC,SAAS,IACZ,MAAM,YAAY;EAChB,YAAY,SAAS;EACrB,eAAe;CACjB,CAAC;CAGH,MAAM,UAAU,MAAM,SAAS,KAAK;CACpC,MAAM,UAAU,MAAM,OAAO,qBAAqB,eAAe,CAAC,CAAC,OAAO;CAE1E,OAAO,qBAAqB,OAAO;AACrC,CAAC"}
|
|
@@ -6,21 +6,17 @@ const publicPathPattern = /^\/(?!(?:[^/]+\/)*\.\.?(?:\/|$))(?:[^/?#\\]+(?:\/[^/?
|
|
|
6
6
|
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region ../protocol/src/internal/documents/scalars.ts
|
|
9
|
-
const relativeDocumentPathPattern = /^(?!(?:[^/]+\/)*\.\.?(?:\/|$))[^/?#\\]+(?:\/[^/?#\\]+)*$/u;
|
|
10
9
|
const slugPattern = /^[\p{Letter}\p{Number}][\p{Letter}\p{Number}_-]*$/u;
|
|
11
|
-
const sourcePathPattern = /^(?!\.)[^/?#\\]+(?:\/(?!\.)[^/?#\\]+)*\.(?:md|mdc)$/u;
|
|
12
10
|
const DocumentGeneration = Schema.String.check(Schema.isPattern(/^(?:0|[1-9]\d*)$/u)).pipe(Schema.brand("DocumentGeneration"));
|
|
13
11
|
const DocumentVersion = Schema.NonEmptyString.pipe(Schema.brand("DocumentVersion"));
|
|
14
12
|
const DocumentHistoryCursor = Schema.NonEmptyString.pipe(Schema.brand("DocumentHistoryCursor"));
|
|
15
13
|
const DocumentId = Schema.String.check(Schema.isUUID()).pipe(Schema.brand("DocumentId"));
|
|
16
14
|
const EditorNodeId = Schema.String.check(Schema.isUUID()).pipe(Schema.brand("EditorNodeId"));
|
|
17
15
|
const PublicPath = Schema.String.check(Schema.isPattern(publicPathPattern)).pipe(Schema.brand("PublicPath"));
|
|
18
|
-
const RelativeDocumentPath = Schema.String.check(Schema.isPattern(relativeDocumentPathPattern)).pipe(Schema.brand("RelativeDocumentPath"));
|
|
19
16
|
const RevisionId = Schema.String.check(Schema.isUUID()).pipe(Schema.brand("RevisionId"));
|
|
20
17
|
const RevisionNumber = nonNegativeInt.pipe(Schema.brand("RevisionNumber"));
|
|
21
18
|
const Slug = Schema.String.check(Schema.isPattern(slugPattern)).pipe(Schema.brand("Slug"));
|
|
22
|
-
const SourcePath = Schema.String.check(Schema.isPattern(sourcePathPattern)).pipe(Schema.brand("SourcePath"));
|
|
23
19
|
|
|
24
20
|
//#endregion
|
|
25
|
-
export { EditorNodeId as a,
|
|
26
|
-
//# sourceMappingURL=scalars-
|
|
21
|
+
export { EditorNodeId as a, RevisionNumber as c, publicPathPattern as d, DocumentVersion as i, Slug as l, DocumentHistoryCursor as n, PublicPath as o, DocumentId as r, RevisionId as s, DocumentGeneration as t, nonNegativeInt as u };
|
|
22
|
+
//# sourceMappingURL=scalars-CVZqT3L0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalars-CVZqT3L0.js","names":[],"sources":["../../../../protocol/src/internal/scalars.ts","../../../../protocol/src/internal/documents/scalars.ts"],"sourcesContent":["import { Schema } from 'effect'\n\nexport const nonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))\n\nexport const publicPathPattern = /^\\/(?!(?:[^/]+\\/)*\\.\\.?(?:\\/|$))(?:[^/?#\\\\]+(?:\\/[^/?#\\\\]+)*)?$/u\n","import { Schema } from 'effect'\nimport { nonNegativeInt, publicPathPattern } from '../scalars'\n\nconst slugPattern = /^[\\p{Letter}\\p{Number}][\\p{Letter}\\p{Number}_-]*$/u\n\nexport const DocumentGeneration = Schema.String.check(Schema.isPattern(/^(?:0|[1-9]\\d*)$/u)).pipe(\n Schema.brand('DocumentGeneration'),\n)\n\nexport type DocumentGeneration = typeof DocumentGeneration.Type\n\nexport const DocumentVersion = Schema.NonEmptyString.pipe(Schema.brand('DocumentVersion'))\n\nexport type DocumentVersion = typeof DocumentVersion.Type\n\nexport const DocumentHistoryCursor = Schema.NonEmptyString.pipe(Schema.brand('DocumentHistoryCursor'))\n\nexport type DocumentHistoryCursor = typeof DocumentHistoryCursor.Type\n\nexport const DocumentId = Schema.String.check(Schema.isUUID()).pipe(Schema.brand('DocumentId'))\n\nexport type DocumentId = typeof DocumentId.Type\n\nexport const EditorNodeId = Schema.String.check(Schema.isUUID()).pipe(Schema.brand('EditorNodeId'))\n\nexport type EditorNodeId = typeof EditorNodeId.Type\n\nexport const PublicPath = Schema.String.check(Schema.isPattern(publicPathPattern)).pipe(Schema.brand('PublicPath'))\n\nexport type PublicPath = typeof PublicPath.Type\n\nexport const RevisionId = Schema.String.check(Schema.isUUID()).pipe(Schema.brand('RevisionId'))\n\nexport type RevisionId = typeof RevisionId.Type\n\nexport const RevisionNumber = nonNegativeInt.pipe(Schema.brand('RevisionNumber'))\n\nexport type RevisionNumber = typeof RevisionNumber.Type\n\nexport const Slug = Schema.String.check(Schema.isPattern(slugPattern)).pipe(Schema.brand('Slug'))\n\nexport type Slug = typeof Slug.Type\n"],"mappings":";;;AAEA,MAAa,iBAAiB,OAAO,IAAI,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAE/E,MAAa,oBAAoB;;;;ACDjC,MAAM,cAAc;AAEpB,MAAa,qBAAqB,OAAO,OAAO,MAAM,OAAO,UAAU,mBAAmB,CAAC,CAAC,CAAC,KAC3F,OAAO,MAAM,oBAAoB,CACnC;AAIA,MAAa,kBAAkB,OAAO,eAAe,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAIzF,MAAa,wBAAwB,OAAO,eAAe,KAAK,OAAO,MAAM,uBAAuB,CAAC;AAIrG,MAAa,aAAa,OAAO,OAAO,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC;AAI9F,MAAa,eAAe,OAAO,OAAO,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,cAAc,CAAC;AAIlG,MAAa,aAAa,OAAO,OAAO,MAAM,OAAO,UAAU,iBAAiB,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC;AAIlH,MAAa,aAAa,OAAO,OAAO,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC;AAI9F,MAAa,iBAAiB,eAAe,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAIhF,MAAa,OAAO,OAAO,OAAO,MAAM,OAAO,UAAU,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,MAAM,CAAC"}
|