@phtngyn/cms 0.2.0-beta.7 → 0.3.0
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/LICENSE +18 -10
- package/README.md +59 -401
- package/drizzle/20261003215543_initial/migration.sql +251 -0
- package/drizzle/20261003215543_initial/snapshot.json +1941 -0
- package/package.json +75 -71
- package/src/Authoring.d.ts +41 -49
- package/src/Authoring.js +1 -1
- package/src/Blocks-BrxSemnd.js +40 -0
- package/src/Client.d.ts +8186 -0
- package/src/Client.js +41 -0
- package/src/Collections.d.ts +142 -0
- package/src/Collections.js +142 -0
- package/src/Config-CMiwciub.js +130 -0
- package/src/Config.d.ts +172 -0
- package/src/Config.js +2 -0
- package/src/Configuration-Dk2k3OIc.js +73 -0
- package/src/DataTransfer-BmECvPHB.js +488 -0
- package/src/Database-DSsNCGft.d.ts +3 -0
- package/src/Delivery.d.ts +28 -0
- package/src/Delivery.js +7 -0
- package/src/Document-CKXMSEf1.js +293 -0
- package/src/Document-TgwYKJZM.d.ts +220 -0
- package/src/DocumentRenderer-Wz2xaNyf.js +394 -0
- package/src/EditorSchema-wrDv-id6.js +296 -0
- package/src/Fields-BegSgYhj.d.ts +166 -0
- package/src/Fields-ioGaMEh9.js +130 -0
- package/src/Forms-BuKAXQxr.d.ts +203 -0
- package/src/Forms.d.ts +48 -11
- package/src/Forms.js +342 -7
- package/src/I18n-Ckf9h0rC.js +154 -0
- package/src/I18n.d.ts +45 -2
- package/src/I18n.js +2 -1
- package/src/Image-CJWPLnhP.js +110 -0
- package/src/Links-CJYyy7rC.js +28 -0
- package/src/Links-Dx1yOni8.d.ts +28 -0
- package/src/Locales-Ch7a5xuA.js +67 -0
- package/src/Locales-jwbmJaOp.d.ts +43 -0
- package/src/Locales.d.ts +3 -0
- package/src/Locales.js +3 -0
- package/src/Media-BQ0uL4w7.d.ts +15 -0
- package/src/Media-DSyvd14o.js +87 -0
- package/src/Module.d.ts +2 -10
- package/src/Module.js +1039 -162
- package/src/Operations.d.ts +57 -0
- package/src/Operations.js +263 -0
- package/src/People-DvNZauWw.js +69 -0
- package/src/PreviewFocus-C_EelZO5.js +104 -0
- package/src/Query-C0kGJF5_.d.ts +261 -0
- package/src/RevisionPreview-IVwbJ9Wy.js +133 -0
- package/src/Routes-BaZvm2LE.js +126 -0
- package/src/Routes-DM1rRp3r.d.ts +15 -0
- package/src/S3MediaObjects-y-WacEi9.js +193 -0
- package/src/Seo-BcpqxoAs.d.ts +57 -0
- package/src/Seo-CjNUtUkj.js +254 -0
- package/src/StudioApi-CXLwwocX.js +833 -0
- package/src/StudioErrors-T5zLGQ1M.js +117 -0
- package/src/StudioErrors-kq-E44lQ.d.ts +104 -0
- package/src/StudioServer.d.ts +20 -0
- package/src/StudioServer.js +34 -0
- package/src/answers-DcTg0Xv2.js +41 -0
- package/src/cli.js +681 -187
- package/src/contracts-rprW3ZOB.js +130 -0
- package/src/forms-3xuf0Ym7.d.ts +206 -0
- package/src/localeConfiguration-BPbkLi7-.js +32 -0
- package/src/localeContext-DhF3SPvM.js +59 -0
- package/src/locales-6OD4XGIZ.js +12 -0
- package/src/nuxtDelivery-BYX_Cddb.js +466 -0
- package/src/plugin-DTYuDaQu.js +7171 -0
- package/src/previewContext-dt3ZUh-w.js +4 -0
- package/src/previewRegions-CXjk5cbP.js +145 -0
- package/src/previewSource-fb-q3ESM.js +144 -0
- package/src/rendering-D9LVeEKX.js +47 -0
- package/src/rolldown-runtime-8H4AJuhK.js +14 -0
- package/src/runtime/CmsImage.js +38 -0
- package/src/runtime/DocumentPage.vue +10 -0
- package/src/runtime/DocumentPageContent.js +48 -0
- package/src/runtime/DocumentRenderer.d.ts +129 -0
- package/src/runtime/DocumentRenderer.js +2 -0
- package/src/runtime/api.js +48 -6
- package/src/runtime/delivery/useCmsDocument.js +2 -0
- package/src/runtime/delivery/useCmsDocumentQuery.js +2 -0
- package/src/runtime/delivery/useCmsDocumentSeo.js +2 -114
- package/src/runtime/delivery/useCmsLocale.js +10 -0
- package/src/runtime/plugin.js +2 -40
- package/src/runtime/preview.css +85 -0
- package/src/runtime/preview.js +277 -0
- package/src/runtime/previewSource.js +82 -0
- package/src/runtime/revisionPrivacy.js +13 -0
- package/src/runtime/studio.js +10 -0
- package/src/runtime/studioIcons.js +36 -0
- package/src/validation-3pggwcnm.js +396 -0
- package/src/validation-DpUwPC8Y.js +224 -0
- package/studio/THIRD-PARTY-LICENSES.md +2406 -0
- package/studio/chunks/AccountPage-DL3DitDM.js +288 -0
- package/studio/chunks/AccountPage-DL3DitDM.js.br +0 -0
- package/studio/chunks/AccountPage-DL3DitDM.js.gz +0 -0
- package/studio/chunks/ActivityPage-CLqVUqTh.js +584 -0
- package/studio/chunks/ActivityPage-CLqVUqTh.js.br +0 -0
- package/studio/chunks/ActivityPage-CLqVUqTh.js.gz +0 -0
- package/studio/chunks/Alert-D0D24z_a.js +335 -0
- package/studio/chunks/Alert-D0D24z_a.js.br +0 -0
- package/studio/chunks/Alert-D0D24z_a.js.gz +0 -0
- package/studio/chunks/Badge-BBFs88TI.js +346 -0
- package/studio/chunks/Badge-BBFs88TI.js.br +0 -0
- package/studio/chunks/Badge-BBFs88TI.js.gz +0 -0
- package/studio/chunks/Button-BT3ztSPx.js +14319 -0
- package/studio/chunks/Button-BT3ztSPx.js.br +0 -0
- package/studio/chunks/Button-BT3ztSPx.js.gz +0 -0
- package/studio/chunks/Collapsible-CKnEYIlp.js +246 -0
- package/studio/chunks/Collapsible-CKnEYIlp.js.br +0 -0
- package/studio/chunks/Collapsible-CKnEYIlp.js.gz +0 -0
- package/studio/chunks/ContentInventory-D7nsFA6U.js +1745 -0
- package/studio/chunks/ContentInventory-D7nsFA6U.js.br +0 -0
- package/studio/chunks/ContentInventory-D7nsFA6U.js.gz +0 -0
- package/studio/chunks/ContentPage-DCxt6BeD.js +18 -0
- package/studio/chunks/ContentPage-DCxt6BeD.js.br +0 -0
- package/studio/chunks/ContentPage-DCxt6BeD.js.gz +0 -0
- package/studio/chunks/DashboardSearch-DjyMjJwF.js +2413 -0
- package/studio/chunks/DashboardSearch-DjyMjJwF.js.br +0 -0
- package/studio/chunks/DashboardSearch-DjyMjJwF.js.gz +0 -0
- package/studio/chunks/DocumentLocaleMenu-0EkkOr6_.js +26063 -0
- package/studio/chunks/DocumentLocaleMenu-0EkkOr6_.js.br +0 -0
- package/studio/chunks/DocumentLocaleMenu-0EkkOr6_.js.gz +0 -0
- package/studio/chunks/DropdownMenu-CA9fB0uZ.js +4400 -0
- package/studio/chunks/DropdownMenu-CA9fB0uZ.js.br +0 -0
- package/studio/chunks/DropdownMenu-CA9fB0uZ.js.gz +0 -0
- package/studio/chunks/EditorPage-D_PAYEE4.js +7799 -0
- package/studio/chunks/EditorPage-D_PAYEE4.js.br +0 -0
- package/studio/chunks/EditorPage-D_PAYEE4.js.gz +0 -0
- package/studio/chunks/FormField-CgM6l2Yn.js +198 -0
- package/studio/chunks/FormField-CgM6l2Yn.js.br +0 -0
- package/studio/chunks/FormField-CgM6l2Yn.js.gz +0 -0
- package/studio/chunks/HelpPage-C-vrFcT_.js +552 -0
- package/studio/chunks/HelpPage-C-vrFcT_.js.br +0 -0
- package/studio/chunks/HelpPage-C-vrFcT_.js.gz +0 -0
- package/studio/chunks/Kbd-Ot7TIhVZ.js +271 -0
- package/studio/chunks/Kbd-Ot7TIhVZ.js.br +0 -0
- package/studio/chunks/Kbd-Ot7TIhVZ.js.gz +0 -0
- package/studio/chunks/MediaFolderDialog-DYu-eu-q.js +101 -0
- package/studio/chunks/MediaFolderDialog-DYu-eu-q.js.br +0 -0
- package/studio/chunks/MediaFolderDialog-DYu-eu-q.js.gz +0 -0
- package/studio/chunks/MediaPage-D-jaWtdl.js +923 -0
- package/studio/chunks/MediaPage-D-jaWtdl.js.br +0 -0
- package/studio/chunks/MediaPage-D-jaWtdl.js.gz +0 -0
- package/studio/chunks/MediaPicker-BZs2wUFz.js +837 -0
- package/studio/chunks/MediaPicker-BZs2wUFz.js.br +0 -0
- package/studio/chunks/MediaPicker-BZs2wUFz.js.gz +0 -0
- package/studio/chunks/MediaUploadPanel-C7Kyg6aR.js +1173 -0
- package/studio/chunks/MediaUploadPanel-C7Kyg6aR.js.br +0 -0
- package/studio/chunks/MediaUploadPanel-C7Kyg6aR.js.gz +0 -0
- package/studio/chunks/Modal-D6hSvxHd.js +265 -0
- package/studio/chunks/Modal-D6hSvxHd.js.br +0 -0
- package/studio/chunks/Modal-D6hSvxHd.js.gz +0 -0
- package/studio/chunks/NewDocumentDialog-C8B6_r3J.js +277 -0
- package/studio/chunks/NewDocumentDialog-C8B6_r3J.js.br +0 -0
- package/studio/chunks/NewDocumentDialog-C8B6_r3J.js.gz +0 -0
- package/studio/chunks/Pagination-D9BSo5H2.js +573 -0
- package/studio/chunks/Pagination-D9BSo5H2.js.br +0 -0
- package/studio/chunks/Pagination-D9BSo5H2.js.gz +0 -0
- package/studio/chunks/PeoplePage-CWIXitBD.js +783 -0
- package/studio/chunks/PeoplePage-CWIXitBD.js.br +0 -0
- package/studio/chunks/PeoplePage-CWIXitBD.js.gz +0 -0
- package/studio/chunks/Popover-B63bkTMS.js +128 -0
- package/studio/chunks/Popover-B63bkTMS.js.br +0 -0
- package/studio/chunks/Popover-B63bkTMS.js.gz +0 -0
- package/studio/chunks/PublicationActionDialog-Cm_P0C3I.js +255 -0
- package/studio/chunks/PublicationActionDialog-Cm_P0C3I.js.br +0 -0
- package/studio/chunks/PublicationActionDialog-Cm_P0C3I.js.gz +0 -0
- package/studio/chunks/Routes-DLYHmulE.js +102 -0
- package/studio/chunks/Routes-DLYHmulE.js.br +0 -0
- package/studio/chunks/Routes-DLYHmulE.js.gz +0 -0
- package/studio/chunks/RovingFocusItem-QZNg-wWF.js +95 -0
- package/studio/chunks/RovingFocusItem-QZNg-wWF.js.br +0 -0
- package/studio/chunks/RovingFocusItem-QZNg-wWF.js.gz +0 -0
- package/studio/chunks/ScheduledPage-C0hqrkr5.js +332 -0
- package/studio/chunks/ScheduledPage-C0hqrkr5.js.br +0 -0
- package/studio/chunks/ScheduledPage-C0hqrkr5.js.gz +0 -0
- package/studio/chunks/Search-BEgCe9Aj.js +14646 -0
- package/studio/chunks/Search-BEgCe9Aj.js.br +0 -0
- package/studio/chunks/Search-BEgCe9Aj.js.gz +0 -0
- package/studio/chunks/Select-B50WZMW-.js +2145 -0
- package/studio/chunks/Select-B50WZMW-.js.br +0 -0
- package/studio/chunks/Select-B50WZMW-.js.gz +0 -0
- package/studio/chunks/SelectMenu-DSweWGMz.js +2109 -0
- package/studio/chunks/SelectMenu-DSweWGMz.js.br +0 -0
- package/studio/chunks/SelectMenu-DSweWGMz.js.gz +0 -0
- package/studio/chunks/SeoPage-CNNxGe4h.js +846 -0
- package/studio/chunks/SeoPage-CNNxGe4h.js.br +0 -0
- package/studio/chunks/SeoPage-CNNxGe4h.js.gz +0 -0
- package/studio/chunks/Skeleton-COz8dcrw.js +39 -0
- package/studio/chunks/Skeleton-COz8dcrw.js.br +2 -0
- package/studio/chunks/Skeleton-COz8dcrw.js.gz +0 -0
- package/studio/chunks/Slideover-QMMHAAys.js +289 -0
- package/studio/chunks/Slideover-QMMHAAys.js.br +0 -0
- package/studio/chunks/Slideover-QMMHAAys.js.gz +0 -0
- package/studio/chunks/StudioPage-ngEIDr5d.js +80 -0
- package/studio/chunks/StudioPage-ngEIDr5d.js.br +0 -0
- package/studio/chunks/StudioPage-ngEIDr5d.js.gz +0 -0
- package/studio/chunks/StudioPageToolbar-BwHnqyr6.js +2524 -0
- package/studio/chunks/StudioPageToolbar-BwHnqyr6.js.br +0 -0
- package/studio/chunks/StudioPageToolbar-BwHnqyr6.js.gz +0 -0
- package/studio/chunks/Switch-qKl1aDn7.js +484 -0
- package/studio/chunks/Switch-qKl1aDn7.js.br +0 -0
- package/studio/chunks/Switch-qKl1aDn7.js.gz +0 -0
- package/studio/chunks/ToolPage-DxoVAJVk.js +29 -0
- package/studio/chunks/ToolPage-DxoVAJVk.js.br +0 -0
- package/studio/chunks/ToolPage-DxoVAJVk.js.gz +0 -0
- package/studio/chunks/Tooltip-Bu15m_DB.js +693 -0
- package/studio/chunks/Tooltip-Bu15m_DB.js.br +0 -0
- package/studio/chunks/Tooltip-Bu15m_DB.js.gz +0 -0
- package/studio/chunks/TrashPage-lhqLLdoG.js +12 -0
- package/studio/chunks/TrashPage-lhqLLdoG.js.br +0 -0
- package/studio/chunks/TrashPage-lhqLLdoG.js.gz +0 -0
- package/studio/chunks/VersionsPage-Cqy6UAp9.js +2349 -0
- package/studio/chunks/VersionsPage-Cqy6UAp9.js.br +0 -0
- package/studio/chunks/VersionsPage-Cqy6UAp9.js.gz +0 -0
- package/studio/chunks/VisuallyHiddenInput-Cu8hQLRf.js +113 -0
- package/studio/chunks/VisuallyHiddenInput-Cu8hQLRf.js.br +0 -0
- package/studio/chunks/VisuallyHiddenInput-Cu8hQLRf.js.gz +0 -0
- package/studio/chunks/arrays-CUJkmV4I.js +10 -0
- package/studio/chunks/arrays-CUJkmV4I.js.br +0 -0
- package/studio/chunks/arrays-CUJkmV4I.js.gz +0 -0
- package/studio/chunks/base-DkTekJe8.js +213 -0
- package/studio/chunks/base-DkTekJe8.js.br +0 -0
- package/studio/chunks/base-DkTekJe8.js.gz +0 -0
- package/studio/chunks/content-DUGl3N4d.js +6012 -0
- package/studio/chunks/content-DUGl3N4d.js.br +0 -0
- package/studio/chunks/content-DUGl3N4d.js.gz +0 -0
- package/studio/chunks/destinations-DPIQVQa6.js +227 -0
- package/studio/chunks/destinations-DPIQVQa6.js.br +0 -0
- package/studio/chunks/destinations-DPIQVQa6.js.gz +0 -0
- package/studio/chunks/en-073cjKW4.js +152 -0
- package/studio/chunks/en-073cjKW4.js.br +0 -0
- package/studio/chunks/en-073cjKW4.js.gz +0 -0
- package/studio/chunks/en-Bn8mxPuf.js +134 -0
- package/studio/chunks/en-Bn8mxPuf.js.br +0 -0
- package/studio/chunks/en-Bn8mxPuf.js.gz +0 -0
- package/studio/chunks/en-C9OiaUDZ.js +251 -0
- package/studio/chunks/en-C9OiaUDZ.js.br +0 -0
- package/studio/chunks/en-C9OiaUDZ.js.gz +0 -0
- package/studio/chunks/en-CHAR6jzx.js +147 -0
- package/studio/chunks/en-CHAR6jzx.js.br +0 -0
- package/studio/chunks/en-CHAR6jzx.js.gz +0 -0
- package/studio/chunks/en-Cq4N1vEF.js +93 -0
- package/studio/chunks/en-Cq4N1vEF.js.br +2 -0
- package/studio/chunks/en-Cq4N1vEF.js.gz +0 -0
- package/studio/chunks/en-D2hRqlse.js +140 -0
- package/studio/chunks/en-D2hRqlse.js.br +0 -0
- package/studio/chunks/en-D2hRqlse.js.gz +0 -0
- package/studio/chunks/en-DiUC3-j6.js +144 -0
- package/studio/chunks/en-DiUC3-j6.js.br +0 -0
- package/studio/chunks/en-DiUC3-j6.js.gz +0 -0
- package/studio/chunks/english-Cs_Adu-u.js +8 -0
- package/studio/chunks/english-Cs_Adu-u.js.br +0 -0
- package/studio/chunks/english-Cs_Adu-u.js.gz +0 -0
- package/studio/chunks/esm-D6DqSiL1.js +752 -0
- package/studio/chunks/esm-D6DqSiL1.js.br +0 -0
- package/studio/chunks/esm-D6DqSiL1.js.gz +0 -0
- package/studio/chunks/externalRequest-CTzr2nDq.js +23 -0
- package/studio/chunks/externalRequest-CTzr2nDq.js.br +0 -0
- package/studio/chunks/externalRequest-CTzr2nDq.js.gz +0 -0
- package/studio/chunks/iconify-DR9ryCPv.js +1007 -0
- package/studio/chunks/iconify-DR9ryCPv.js.br +0 -0
- package/studio/chunks/iconify-DR9ryCPv.js.gz +0 -0
- package/studio/chunks/icons-D2MsAaXq.js +183 -0
- package/studio/chunks/icons-D2MsAaXq.js.br +0 -0
- package/studio/chunks/icons-D2MsAaXq.js.gz +0 -0
- package/studio/chunks/leaveGuards-D22fTGgr.js +26 -0
- package/studio/chunks/leaveGuards-D22fTGgr.js.br +0 -0
- package/studio/chunks/leaveGuards-D22fTGgr.js.gz +0 -0
- package/studio/chunks/lucideIcons-EyqyPBsX.js +238 -0
- package/studio/chunks/lucideIcons-EyqyPBsX.js.br +0 -0
- package/studio/chunks/lucideIcons-EyqyPBsX.js.gz +0 -0
- package/studio/chunks/mediaRoute--8cY8rUe.js +17 -0
- package/studio/chunks/mediaRoute--8cY8rUe.js.br +0 -0
- package/studio/chunks/mediaRoute--8cY8rUe.js.gz +0 -0
- package/studio/chunks/newDocumentPlanning-C26DHpvh.js +77 -0
- package/studio/chunks/newDocumentPlanning-C26DHpvh.js.br +0 -0
- package/studio/chunks/newDocumentPlanning-C26DHpvh.js.gz +0 -0
- package/studio/chunks/notifications-OKOLc40v.js +110 -0
- package/studio/chunks/notifications-OKOLc40v.js.br +0 -0
- package/studio/chunks/notifications-OKOLc40v.js.gz +0 -0
- package/studio/chunks/operations-CjNHyrEX.js +57 -0
- package/studio/chunks/operations-CjNHyrEX.js.br +0 -0
- package/studio/chunks/operations-CjNHyrEX.js.gz +0 -0
- package/studio/chunks/overlay-DnqFLZTc.js +1733 -0
- package/studio/chunks/overlay-DnqFLZTc.js.br +0 -0
- package/studio/chunks/overlay-DnqFLZTc.js.gz +0 -0
- package/studio/chunks/presentation-DF83w0hE.js +57 -0
- package/studio/chunks/presentation-DF83w0hE.js.br +0 -0
- package/studio/chunks/presentation-DF83w0hE.js.gz +0 -0
- package/studio/chunks/runtime-core.esm-bundler-DKFA9Rep.js +4557 -0
- package/studio/chunks/runtime-core.esm-bundler-DKFA9Rep.js.br +0 -0
- package/studio/chunks/runtime-core.esm-bundler-DKFA9Rep.js.gz +0 -0
- package/studio/chunks/searchPresentation-DFwxQkt3.js +76 -0
- package/studio/chunks/searchPresentation-DFwxQkt3.js.br +0 -0
- package/studio/chunks/searchPresentation-DFwxQkt3.js.gz +0 -0
- package/studio/chunks/status-DQv6ihkU.js +38 -0
- package/studio/chunks/status-DQv6ihkU.js.br +0 -0
- package/studio/chunks/status-DQv6ihkU.js.gz +0 -0
- package/studio/chunks/studioContext-I8HozGU1.js +4953 -0
- package/studio/chunks/studioContext-I8HozGU1.js.br +0 -0
- package/studio/chunks/studioContext-I8HozGU1.js.gz +0 -0
- package/studio/chunks/studioQueries-BR-9NT5F.js +73 -0
- package/studio/chunks/studioQueries-BR-9NT5F.js.br +0 -0
- package/studio/chunks/studioQueries-BR-9NT5F.js.gz +0 -0
- package/studio/chunks/studioSearch-ByaL-QpM.js +1095 -0
- package/studio/chunks/studioSearch-ByaL-QpM.js.br +0 -0
- package/studio/chunks/studioSearch-ByaL-QpM.js.gz +0 -0
- package/studio/chunks/useAcknowledgedDraft-0_c9sWI6.js +62 -0
- package/studio/chunks/useAcknowledgedDraft-0_c9sWI6.js.br +0 -0
- package/studio/chunks/useAcknowledgedDraft-0_c9sWI6.js.gz +0 -0
- package/studio/chunks/useApi-CUWMwLLw-B3Q3g2nf.js +189 -0
- package/studio/chunks/useApi-CUWMwLLw-B3Q3g2nf.js.br +0 -0
- package/studio/chunks/useApi-CUWMwLLw-B3Q3g2nf.js.gz +0 -0
- package/studio/chunks/useDocumentMessage-BAWvc38w.js +16 -0
- package/studio/chunks/useDocumentMessage-BAWvc38w.js.br +3 -0
- package/studio/chunks/useDocumentMessage-BAWvc38w.js.gz +0 -0
- package/studio/chunks/useFilter-DzyiTR7f.js +87 -0
- package/studio/chunks/useFilter-DzyiTR7f.js.br +0 -0
- package/studio/chunks/useFilter-DzyiTR7f.js.gz +0 -0
- package/studio/chunks/useFormControl-CL7sSCUo.js +8 -0
- package/studio/chunks/useFormControl-CL7sSCUo.js.br +0 -0
- package/studio/chunks/useFormControl-CL7sSCUo.js.gz +0 -0
- package/studio/chunks/useGraceArea-Chcy25IQ.js +154 -0
- package/studio/chunks/useGraceArea-Chcy25IQ.js.br +0 -0
- package/studio/chunks/useGraceArea-Chcy25IQ.js.gz +0 -0
- package/studio/chunks/useLeaveConfirmation-_iCSnKEp.js +44 -0
- package/studio/chunks/useLeaveConfirmation-_iCSnKEp.js.br +8 -0
- package/studio/chunks/useLeaveConfirmation-_iCSnKEp.js.gz +0 -0
- package/studio/chunks/useLinkCopy-CMjQteCy.js +35 -0
- package/studio/chunks/useLinkCopy-CMjQteCy.js.br +0 -0
- package/studio/chunks/useLinkCopy-CMjQteCy.js.gz +0 -0
- package/studio/chunks/usePointerMotion-DwRcwBNQ.js +16 -0
- package/studio/chunks/usePointerMotion-DwRcwBNQ.js.br +0 -0
- package/studio/chunks/usePointerMotion-DwRcwBNQ.js.gz +0 -0
- package/studio/chunks/useStudioNavigation-CLwtSYpb.js +298 -0
- package/studio/chunks/useStudioNavigation-CLwtSYpb.js.br +0 -0
- package/studio/chunks/useStudioNavigation-CLwtSYpb.js.gz +0 -0
- package/studio/chunks/useStudioPages-DR9qmYLg.js +79 -0
- package/studio/chunks/useStudioPages-DR9qmYLg.js.br +0 -0
- package/studio/chunks/useStudioPages-DR9qmYLg.js.gz +0 -0
- package/studio/chunks/utils-mdScC0v0.js +59 -0
- package/studio/chunks/utils-mdScC0v0.js.br +0 -0
- package/studio/chunks/utils-mdScC0v0.js.gz +0 -0
- package/studio/chunks/virtualizer-D1S0bZ4t.js +781 -0
- package/studio/chunks/virtualizer-D1S0bZ4t.js.br +0 -0
- package/studio/chunks/virtualizer-D1S0bZ4t.js.gz +0 -0
- package/studio/help/64f767fe29c2-save-and-publish.svg +7 -0
- package/studio/host.css +1 -1
- package/studio/host.css.br +0 -0
- package/studio/host.css.gz +0 -0
- package/studio/host.js +8757 -39178
- package/studio/host.js.br +0 -0
- package/studio/host.js.gz +0 -0
- package/CHANGELOG.md +0 -13
- package/bin/cms.mjs +0 -2
- package/src/ApplicationTypes.d.ts +0 -84
- package/src/ApplicationTypes.js +0 -1
- package/src/Configuration-Da5B2PVH.js +0 -1191
- package/src/Configuration-Da5B2PVH.js.map +0 -1
- package/src/Configuration.d.ts +0 -82
- package/src/Configuration.js +0 -8
- package/src/Configuration.js.map +0 -1
- package/src/Content.d.ts +0 -68
- package/src/Content.js +0 -373
- package/src/Content.js.map +0 -1
- package/src/ContentTransfer-BxwswWn3.js +0 -86
- package/src/ContentTransfer-BxwswWn3.js.map +0 -1
- package/src/ContentTransfer-Z9FHyLez.d.ts +0 -72
- package/src/DocumentEngine-hh_IGPXO.js +0 -978
- package/src/DocumentEngine-hh_IGPXO.js.map +0 -1
- package/src/DocumentModel.d.ts +0 -52
- package/src/DocumentModel.js +0 -66
- package/src/DocumentModel.js.map +0 -1
- package/src/Forms-CX-hwmJF.js +0 -391
- package/src/Forms-CX-hwmJF.js.map +0 -1
- package/src/Forms-CfNPTiCr.js +0 -110
- package/src/Forms-CfNPTiCr.js.map +0 -1
- package/src/Forms-R0HoTR-o.d.ts +0 -92
- package/src/Forms.js.map +0 -1
- package/src/HttpPaths-c9nLZ9H2.js +0 -21
- package/src/HttpPaths-c9nLZ9H2.js.map +0 -1
- package/src/I18n-zbqpWxki.d.ts +0 -29
- package/src/Media-j1bTritO.js +0 -112
- package/src/Media-j1bTritO.js.map +0 -1
- package/src/Module.js.map +0 -1
- package/src/References-CCPDAPve.js +0 -45
- package/src/References-CCPDAPve.js.map +0 -1
- package/src/S3MediaObjects-Dwhl2deX.js +0 -2742
- package/src/S3MediaObjects-Dwhl2deX.js.map +0 -1
- package/src/Seo-402YumpT.d.ts +0 -198
- package/src/cli/content.js +0 -101
- package/src/cli/content.js.map +0 -1
- package/src/cli.js.map +0 -1
- package/src/connection-BP80q4d-.js +0 -92
- package/src/connection-BP80q4d-.js.map +0 -1
- package/src/dev-lifecycle-CjDq63Ft.js +0 -535
- package/src/dev-lifecycle-CjDq63Ft.js.map +0 -1
- package/src/installation-DYNQQBD3.js +0 -9114
- package/src/installation-DYNQQBD3.js.map +0 -1
- package/src/internal/application-types.js +0 -43
- package/src/internal/application-types.js.map +0 -1
- package/src/internal/authoring-catalog.js +0 -158
- package/src/internal/authoring-catalog.js.map +0 -1
- package/src/internal/authoring-compiler.js +0 -146
- package/src/internal/authoring-compiler.js.map +0 -1
- package/src/internal/authoring-metadata.js +0 -191
- package/src/internal/authoring-metadata.js.map +0 -1
- package/src/internal/cms-config.js +0 -45
- package/src/internal/cms-config.js.map +0 -1
- package/src/internal/configuration.js +0 -228
- package/src/internal/configuration.js.map +0 -1
- package/src/internal/dev-lifecycle.js +0 -3
- package/src/internal/diagnostics.js +0 -47
- package/src/internal/diagnostics.js.map +0 -1
- package/src/internal/document-model.js +0 -376
- package/src/internal/document-model.js.map +0 -1
- package/src/internal/field-metadata.js +0 -7
- package/src/internal/field-metadata.js.map +0 -1
- package/src/internal/form-capabilities.js +0 -12
- package/src/internal/form-capabilities.js.map +0 -1
- package/src/internal/i18n.js +0 -73
- package/src/internal/i18n.js.map +0 -1
- package/src/internal/studio-app.js +0 -68
- package/src/internal/studio-app.js.map +0 -1
- package/src/location-CMNGO3lU.js +0 -35
- package/src/location-CMNGO3lU.js.map +0 -1
- package/src/metadata-DN9_K6Yl.js +0 -201
- package/src/metadata-DN9_K6Yl.js.map +0 -1
- package/src/models-5j67LMqW.js +0 -131
- package/src/models-5j67LMqW.js.map +0 -1
- package/src/models-VmGmG19-.js +0 -628
- package/src/models-VmGmG19-.js.map +0 -1
- package/src/runtime/api.js.map +0 -1
- package/src/runtime/blocks.js +0 -30
- package/src/runtime/blocks.js.map +0 -1
- package/src/runtime/collaboration.js +0 -45
- package/src/runtime/collaboration.js.map +0 -1
- package/src/runtime/delivery/DocumentField.js +0 -23
- package/src/runtime/delivery/DocumentField.js.map +0 -1
- package/src/runtime/delivery/DocumentRenderer.js +0 -61
- package/src/runtime/delivery/DocumentRenderer.js.map +0 -1
- package/src/runtime/delivery/DocumentScope.js +0 -41
- package/src/runtime/delivery/DocumentScope.js.map +0 -1
- package/src/runtime/delivery/blocks.js +0 -8
- package/src/runtime/delivery/blocks.js.map +0 -1
- package/src/runtime/delivery/context.js +0 -12
- package/src/runtime/delivery/context.js.map +0 -1
- package/src/runtime/delivery/document-page.js +0 -21
- package/src/runtime/delivery/document-page.js.map +0 -1
- package/src/runtime/delivery/document.js +0 -43
- package/src/runtime/delivery/document.js.map +0 -1
- package/src/runtime/delivery/error.js +0 -11
- package/src/runtime/delivery/error.js.map +0 -1
- package/src/runtime/delivery/plugin.js +0 -99
- package/src/runtime/delivery/plugin.js.map +0 -1
- package/src/runtime/delivery/preview.d.ts +0 -11
- package/src/runtime/delivery/preview.js +0 -6
- package/src/runtime/delivery/preview.js.map +0 -1
- package/src/runtime/delivery/types.d.ts +0 -2
- package/src/runtime/delivery/types.js +0 -1
- package/src/runtime/delivery/useCmsDocumentSeo.d.ts +0 -67
- package/src/runtime/delivery/useCmsDocumentSeo.js.map +0 -1
- package/src/runtime/delivery/useDocument.d.ts +0 -6
- package/src/runtime/delivery/useDocument.js +0 -23
- package/src/runtime/delivery/useDocument.js.map +0 -1
- package/src/runtime/delivery/useDocumentQuery.d.ts +0 -7
- package/src/runtime/delivery/useDocumentQuery.js +0 -29
- package/src/runtime/delivery/useDocumentQuery.js.map +0 -1
- package/src/runtime/forms/document.js +0 -38
- package/src/runtime/forms/document.js.map +0 -1
- package/src/runtime/forms/useCmsForm.js +0 -257
- package/src/runtime/forms/useCmsForm.js.map +0 -1
- package/src/runtime/i18n/translator.js +0 -51
- package/src/runtime/i18n/translator.js.map +0 -1
- package/src/runtime/i18n/useCmsI18n.d.ts +0 -13
- package/src/runtime/i18n/useCmsI18n.js +0 -38
- package/src/runtime/i18n/useCmsI18n.js.map +0 -1
- package/src/runtime/installation.js +0 -3
- package/src/runtime/plugin.js.map +0 -1
- package/src/runtime/preview/CmsStudioPreviewMarker.js +0 -29
- package/src/runtime/preview/CmsStudioPreviewMarker.js.map +0 -1
- package/src/runtime/preview/comark-document.js +0 -37
- package/src/runtime/preview/comark-document.js.map +0 -1
- package/src/runtime/preview/connection.js +0 -3
- package/src/runtime/preview/controller.js +0 -265
- package/src/runtime/preview/controller.js.map +0 -1
- package/src/runtime/preview/crypto.js +0 -16
- package/src/runtime/preview/crypto.js.map +0 -1
- package/src/runtime/preview/overlay.js +0 -122
- package/src/runtime/preview/overlay.js.map +0 -1
- package/src/runtime/preview/plugin.client.js +0 -68
- package/src/runtime/preview/plugin.client.js.map +0 -1
- package/src/runtime/preview/preview.css +0 -91
- package/src/runtime/preview/protocol.d.ts +0 -16
- package/src/runtime/preview/protocol.js +0 -23
- package/src/runtime/preview/protocol.js.map +0 -1
- package/src/runtime/preview/regions.js +0 -142
- package/src/runtime/preview/regions.js.map +0 -1
- package/src/runtime/preview/store.js +0 -4
- package/src/runtime/sitemap-entries.js +0 -17
- package/src/runtime/sitemap-entries.js.map +0 -1
- package/src/runtime/sitemap.js +0 -23
- package/src/runtime/sitemap.js.map +0 -1
- package/src/runtime/studio-app.js +0 -17
- package/src/runtime/studio-app.js.map +0 -1
- package/src/runtime/studio-document.js +0 -46
- package/src/runtime/studio-document.js.map +0 -1
- package/src/runtime/studio-entry.js +0 -19
- package/src/runtime/studio-entry.js.map +0 -1
- package/src/runtime/studio-navigation.js +0 -11
- package/src/runtime/studio-navigation.js.map +0 -1
- package/src/scalars-CA6kyipS.d.ts +0 -7
- package/src/scalars-CVZqT3L0.js +0 -22
- package/src/scalars-CVZqT3L0.js.map +0 -1
- package/src/store-X1e1o_MF.js +0 -209
- package/src/store-X1e1o_MF.js.map +0 -1
- package/src/types-DZ0IV-Ow.d.ts +0 -101
- package/studio/CreateDocumentDialog-BpjBYGfI.js +0 -335
- package/studio/SelectMenu-KiXwx4Y_.js +0 -34032
- package/studio/collaboration-DcK2F6v9.js +0 -4566
- package/studio/editor-P2rB7Csp.js +0 -30128
- package/studio/rolldown-runtime-Dy4uBu1J.js +0 -11
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
//#region src/internal/application-types.ts
|
|
2
|
-
function generateCmsApplicationTypes(input) {
|
|
3
|
-
const locale = union(Object.keys(input.i18n.locales));
|
|
4
|
-
const messageKey = union(Object.keys(input.i18n.messageParameters));
|
|
5
|
-
const blockName = union(input.blockNames);
|
|
6
|
-
const parameters = Object.entries(input.i18n.messageParameters).map(([key, names]) => `${JSON.stringify(key)}: { ${names.map((name) => `readonly ${JSON.stringify(name)}: string | number`).join("; ")} }`).join("; ");
|
|
7
|
-
return [
|
|
8
|
-
`import '@phtngyn/cms/ApplicationTypes'`,
|
|
9
|
-
`import '@phtngyn/cms/I18n'`,
|
|
10
|
-
`declare module '@phtngyn/cms/ApplicationTypes' {`,
|
|
11
|
-
` interface CmsApplicationRegistry {`,
|
|
12
|
-
` configuration: typeof import(${JSON.stringify(input.configurationPath)}).default`,
|
|
13
|
-
` blockName: ${blockName}`,
|
|
14
|
-
` }`,
|
|
15
|
-
`}`,
|
|
16
|
-
`declare module '@phtngyn/cms/I18n' {`,
|
|
17
|
-
` interface CmsI18nRegistry {`,
|
|
18
|
-
` locale: ${locale}`,
|
|
19
|
-
` messageKey: ${messageKey}`,
|
|
20
|
-
` messageParameters: { ${parameters} }`,
|
|
21
|
-
` }`,
|
|
22
|
-
`}`,
|
|
23
|
-
`export type CmsBlockName = import('@phtngyn/cms/ApplicationTypes').CmsBlockName`,
|
|
24
|
-
`export type CmsCollectionName = import('@phtngyn/cms/ApplicationTypes').CmsCollectionName`,
|
|
25
|
-
`export type CmsCollection<Name extends CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsCollection<Name>`,
|
|
26
|
-
`export type CmsDocumentPage<Name extends CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsDocumentPage<Name>`,
|
|
27
|
-
`export type CmsDocumentQuery<Name extends CmsCollectionName = CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsDocumentQuery<Name>`,
|
|
28
|
-
`export type CmsDocumentQuerySort<Name extends CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsDocumentQuerySort<Name>`,
|
|
29
|
-
`export type CmsFormDefinition<Name extends CmsFormName = CmsFormName> = import('@phtngyn/cms/ApplicationTypes').CmsFormDefinition<Name>`,
|
|
30
|
-
`export type CmsFormName = import('@phtngyn/cms/ApplicationTypes').CmsFormName`,
|
|
31
|
-
`export type CmsLocale = import('@phtngyn/cms/ApplicationTypes').CmsLocale`,
|
|
32
|
-
`export type CmsMessageKey = import('@phtngyn/cms/ApplicationTypes').CmsMessageKey`,
|
|
33
|
-
`export type CmsMessageParameters<Key extends CmsMessageKey> = import('@phtngyn/cms/ApplicationTypes').CmsMessageParameters<Key>`,
|
|
34
|
-
""
|
|
35
|
-
].join("\n");
|
|
36
|
-
}
|
|
37
|
-
function union(values) {
|
|
38
|
-
return [...new Set(values)].sort((left, right) => left.localeCompare(right)).map((value) => JSON.stringify(value)).join(" | ") || "never";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
//#endregion
|
|
42
|
-
export { generateCmsApplicationTypes };
|
|
43
|
-
//# sourceMappingURL=application-types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"application-types.js","names":[],"sources":["../../../../src/internal/application-types.ts"],"sourcesContent":["import type { CompiledCmsI18n } from './i18n'\n\nexport interface CmsApplicationTypeInput {\n readonly blockNames: ReadonlyArray<string>\n readonly configurationPath: string\n readonly i18n: CompiledCmsI18n\n}\n\nexport function generateCmsApplicationTypes(input: CmsApplicationTypeInput): string {\n const locale = union(Object.keys(input.i18n.locales))\n const messageKey = union(Object.keys(input.i18n.messageParameters))\n const blockName = union(input.blockNames)\n\n const parameters = Object.entries(input.i18n.messageParameters)\n .map(\n ([key, names]) =>\n `${JSON.stringify(key)}: { ${names.map((name) => `readonly ${JSON.stringify(name)}: string | number`).join('; ')} }`,\n )\n .join('; ')\n\n return [\n `import '@phtngyn/cms/ApplicationTypes'`,\n `import '@phtngyn/cms/I18n'`,\n `declare module '@phtngyn/cms/ApplicationTypes' {`,\n ` interface CmsApplicationRegistry {`,\n ` configuration: typeof import(${JSON.stringify(input.configurationPath)}).default`,\n ` blockName: ${blockName}`,\n ` }`,\n `}`,\n `declare module '@phtngyn/cms/I18n' {`,\n ` interface CmsI18nRegistry {`,\n ` locale: ${locale}`,\n ` messageKey: ${messageKey}`,\n ` messageParameters: { ${parameters} }`,\n ` }`,\n `}`,\n `export type CmsBlockName = import('@phtngyn/cms/ApplicationTypes').CmsBlockName`,\n `export type CmsCollectionName = import('@phtngyn/cms/ApplicationTypes').CmsCollectionName`,\n `export type CmsCollection<Name extends CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsCollection<Name>`,\n `export type CmsDocumentPage<Name extends CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsDocumentPage<Name>`,\n `export type CmsDocumentQuery<Name extends CmsCollectionName = CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsDocumentQuery<Name>`,\n `export type CmsDocumentQuerySort<Name extends CmsCollectionName> = import('@phtngyn/cms/ApplicationTypes').CmsDocumentQuerySort<Name>`,\n `export type CmsFormDefinition<Name extends CmsFormName = CmsFormName> = import('@phtngyn/cms/ApplicationTypes').CmsFormDefinition<Name>`,\n `export type CmsFormName = import('@phtngyn/cms/ApplicationTypes').CmsFormName`,\n `export type CmsLocale = import('@phtngyn/cms/ApplicationTypes').CmsLocale`,\n `export type CmsMessageKey = import('@phtngyn/cms/ApplicationTypes').CmsMessageKey`,\n `export type CmsMessageParameters<Key extends CmsMessageKey> = import('@phtngyn/cms/ApplicationTypes').CmsMessageParameters<Key>`,\n '',\n ].join('\\n')\n}\n\nfunction union(values: ReadonlyArray<string>): string {\n return (\n [...new Set(values)]\n .sort((left, right) => left.localeCompare(right))\n .map((value) => JSON.stringify(value))\n .join(' | ') || 'never'\n )\n}\n"],"mappings":";AAQA,SAAgB,4BAA4B,OAAwC;CAClF,MAAM,SAAS,MAAM,OAAO,KAAK,MAAM,KAAK,OAAO,CAAC;CACpD,MAAM,aAAa,MAAM,OAAO,KAAK,MAAM,KAAK,iBAAiB,CAAC;CAClE,MAAM,YAAY,MAAM,MAAM,UAAU;CAExC,MAAM,aAAa,OAAO,QAAQ,MAAM,KAAK,iBAAiB,CAAC,CAC5D,KACE,CAAC,KAAK,WACL,GAAG,KAAK,UAAU,GAAG,EAAE,MAAM,MAAM,KAAK,SAAS,YAAY,KAAK,UAAU,IAAI,EAAE,kBAAkB,CAAC,CAAC,KAAK,IAAI,EAAE,GACrH,CAAC,CACA,KAAK,IAAI;CAEZ,OAAO;EACL;EACA;EACA;EACA;EACA,oCAAoC,KAAK,UAAU,MAAM,iBAAiB,EAAE;EAC5E,kBAAkB;EAClB;EACA;EACA;EACA;EACA,eAAe;EACf,mBAAmB;EACnB,4BAA4B,WAAW;EACvC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,IAAI;AACb;AAEA,SAAS,MAAM,QAAuC;CACpD,OACE,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CACjB,MAAM,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,CAAC,CAChD,KAAK,UAAU,KAAK,UAAU,KAAK,CAAC,CAAC,CACrC,KAAK,KAAK,KAAK;AAEtB"}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { n as formAuthoring } from "../Forms-CX-hwmJF.js";
|
|
2
|
-
import { l as validateCollectionBody, n as ComponentDefinition, t as AuthoringCatalog } from "../Configuration-Da5B2PVH.js";
|
|
3
|
-
import { resolveBlockAuthoring } from "./authoring-metadata.js";
|
|
4
|
-
import { Crypto, Effect, Encoding, FileSystem, Path, Schema } from "effect";
|
|
5
|
-
import { addTemplate, addVitePlugin, updateTemplates } from "@nuxt/kit";
|
|
6
|
-
import { createCheckerByJson } from "vue-component-meta";
|
|
7
|
-
|
|
8
|
-
//#region src/internal/authoring-catalog.ts
|
|
9
|
-
/** A complete, validated snapshot shared by Vite and Nitro through ordinary imports. */
|
|
10
|
-
const registerAuthoringCatalog = Effect.fn("CmsAuthoring.register")(function* (nuxt, documents, forms = {}, onBlockNames, additionalTemplatePaths = []) {
|
|
11
|
-
const fs = yield* FileSystem.FileSystem;
|
|
12
|
-
const path = yield* Path.Path;
|
|
13
|
-
const crypto = yield* Crypto.Crypto;
|
|
14
|
-
const run = Effect.runPromiseWith(yield* Effect.context());
|
|
15
|
-
let contents = "export default { revision: \"empty\", components: [] }\n";
|
|
16
|
-
let blockContents = "export default {}\n";
|
|
17
|
-
let discovered = [];
|
|
18
|
-
let dependencies = /* @__PURE__ */ new Set();
|
|
19
|
-
let queue = Promise.resolve();
|
|
20
|
-
const servers = /* @__PURE__ */ new Set();
|
|
21
|
-
let initialized = false;
|
|
22
|
-
let rejected = false;
|
|
23
|
-
const template = addTemplate({
|
|
24
|
-
filename: "cms/authoring.mjs",
|
|
25
|
-
write: true,
|
|
26
|
-
getContents: () => contents
|
|
27
|
-
});
|
|
28
|
-
const blocks = addTemplate({
|
|
29
|
-
filename: "cms/blocks.mjs",
|
|
30
|
-
write: true,
|
|
31
|
-
getContents: () => blockContents
|
|
32
|
-
});
|
|
33
|
-
nuxt.options.alias["#cms/blocks"] = blocks.dst;
|
|
34
|
-
nuxt.options.alias["#cms/authoring"] = template.dst;
|
|
35
|
-
nuxt.hook("nitro:config", (config) => {
|
|
36
|
-
config.externals ||= {};
|
|
37
|
-
config.externals.inline ||= [];
|
|
38
|
-
config.externals.inline.push(template.dst);
|
|
39
|
-
});
|
|
40
|
-
const compile = Effect.fn("CmsAuthoring.compile")(function* () {
|
|
41
|
-
const checker = createCheckerByJson(nuxt.options.rootDir, {
|
|
42
|
-
compilerOptions: {
|
|
43
|
-
strict: true,
|
|
44
|
-
target: "ESNext",
|
|
45
|
-
module: "ESNext",
|
|
46
|
-
moduleResolution: "Bundler",
|
|
47
|
-
baseUrl: nuxt.options.rootDir,
|
|
48
|
-
paths: Object.fromEntries(Object.entries(nuxt.options.alias).map(([key, value]) => [`${key}/*`, [`${value}/*`]]))
|
|
49
|
-
},
|
|
50
|
-
files: []
|
|
51
|
-
}, { schema: true });
|
|
52
|
-
const definitions = [];
|
|
53
|
-
const registrations = [];
|
|
54
|
-
try {
|
|
55
|
-
for (const component of discovered) {
|
|
56
|
-
if (!component.filePath.endsWith(".vue") || component.filePath.includes("/node_modules/")) continue;
|
|
57
|
-
if (!(yield* fs.exists(component.filePath))) continue;
|
|
58
|
-
const source = yield* fs.readFileString(component.filePath);
|
|
59
|
-
const form = forms[component.kebabName];
|
|
60
|
-
const definition = form ? ComponentDefinition.make({
|
|
61
|
-
name: component.kebabName,
|
|
62
|
-
authoring: formAuthoring(form)
|
|
63
|
-
}) : yield* resolveBlockAuthoring(checker, component.filePath, component.kebabName, source);
|
|
64
|
-
if (!definition) continue;
|
|
65
|
-
if (definitions.some((existing) => existing.name === definition.name)) throw new Error(`Duplicate authoring block ${definition.name}.`);
|
|
66
|
-
definitions.push(definition);
|
|
67
|
-
component.global = false;
|
|
68
|
-
registrations.push({
|
|
69
|
-
name: definition.name,
|
|
70
|
-
filePath: component.filePath
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
for (const name of Object.keys(forms)) if (!definitions.some((definition) => definition.name === name)) throw new Error(`Missing Vue form renderer ${name}.`);
|
|
74
|
-
const components = definitions.sort((left, right) => left.name.localeCompare(right.name));
|
|
75
|
-
onBlockNames?.(components.filter((component) => forms[component.name] === void 0).map((component) => component.name));
|
|
76
|
-
for (const collection of documents.types) {
|
|
77
|
-
const issues = validateCollectionBody(components, collection.body);
|
|
78
|
-
if (issues.length) throw new Error(`${collection.label}: ${issues.join(" ")}`);
|
|
79
|
-
}
|
|
80
|
-
const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(Schema.Array(ComponentDefinition)))(components);
|
|
81
|
-
const revision = Encoding.encodeHex(yield* crypto.digest("SHA-256", new TextEncoder().encode(encoded)));
|
|
82
|
-
const next = `export default ${yield* Schema.encodeEffect(Schema.fromJsonString(AuthoringCatalog))({
|
|
83
|
-
revision,
|
|
84
|
-
components
|
|
85
|
-
})}\n`;
|
|
86
|
-
registrations.sort((left, right) => left.name.localeCompare(right.name));
|
|
87
|
-
const nextBlocks = [...registrations.map((component, index) => `import Block${index} from ${JSON.stringify(component.filePath)}`), `export default { ${registrations.map((component, index) => `${JSON.stringify(component.name)}: Block${index}`).join(", ")} }`].join("\n");
|
|
88
|
-
const changed = next !== contents || nextBlocks !== blockContents;
|
|
89
|
-
blockContents = nextBlocks;
|
|
90
|
-
if (rejected) {
|
|
91
|
-
rejected = false;
|
|
92
|
-
for (const server of servers) server.ws.send({
|
|
93
|
-
type: "update",
|
|
94
|
-
updates: []
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
if (!changed) return false;
|
|
98
|
-
contents = next;
|
|
99
|
-
return true;
|
|
100
|
-
} finally {
|
|
101
|
-
const discoveredDependencies = new Set(checker.getProgram()?.getSourceFiles().map((file) => path.resolve(file.fileName)).filter((file) => !file.includes("/node_modules/")));
|
|
102
|
-
dependencies = /* @__PURE__ */ new Set([...dependencies, ...discoveredDependencies]);
|
|
103
|
-
for (const server of servers) server.watcher.add([...dependencies]);
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
function rebuild() {
|
|
107
|
-
const current = queue.then(() => run(compile()));
|
|
108
|
-
queue = current.then(() => void 0, () => void 0);
|
|
109
|
-
return current;
|
|
110
|
-
}
|
|
111
|
-
function report(error) {
|
|
112
|
-
rejected = true;
|
|
113
|
-
for (const server of servers) server.ws.send({
|
|
114
|
-
type: "error",
|
|
115
|
-
err: {
|
|
116
|
-
message: error.message,
|
|
117
|
-
stack: error.stack ?? "",
|
|
118
|
-
plugin: "cms-authoring"
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
return run(Effect.logError("Authoring update rejected; keeping the last valid catalog.", error));
|
|
122
|
-
}
|
|
123
|
-
function update() {
|
|
124
|
-
return rebuild().then((changed) => changed ? updateTemplates({ filter: (candidate) => [
|
|
125
|
-
template.dst,
|
|
126
|
-
blocks.dst,
|
|
127
|
-
...additionalTemplatePaths
|
|
128
|
-
].includes(candidate.dst) }) : void 0).catch((error) => report(error instanceof Error ? error : new Error(String(error))));
|
|
129
|
-
}
|
|
130
|
-
nuxt.hook("components:extend", (components) => {
|
|
131
|
-
discovered = components;
|
|
132
|
-
const candidate = rebuild().then(() => void 0);
|
|
133
|
-
if (initialized) return candidate.catch((error) => report(error instanceof Error ? error : new Error(String(error))));
|
|
134
|
-
initialized = true;
|
|
135
|
-
return candidate;
|
|
136
|
-
});
|
|
137
|
-
addVitePlugin({
|
|
138
|
-
name: "cms-authoring-catalog",
|
|
139
|
-
configureServer(server) {
|
|
140
|
-
servers.add(server);
|
|
141
|
-
server.watcher.add([...dependencies]);
|
|
142
|
-
const changed = (filename) => {
|
|
143
|
-
const absolute = path.resolve(filename);
|
|
144
|
-
if (dependencies.has(absolute) || discovered.some((component) => component.filePath === absolute)) update();
|
|
145
|
-
};
|
|
146
|
-
server.watcher.on("change", changed);
|
|
147
|
-
server.httpServer?.once("close", () => {
|
|
148
|
-
servers.delete(server);
|
|
149
|
-
server.watcher.off("change", changed);
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
return template;
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
//#endregion
|
|
157
|
-
export { registerAuthoringCatalog };
|
|
158
|
-
//# sourceMappingURL=authoring-catalog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authoring-catalog.js","names":[],"sources":["../../../../src/internal/authoring-catalog.ts"],"sourcesContent":["import { formAuthoring } from '@internal/document/Forms'\nimport type { FormCapabilities } from '@internal/protocol/Forms'\nimport { validateCollectionBody } from '@internal/document/AuthoringSchema'\nimport type { DocumentConfiguration } from '@internal/protocol/Configuration'\nimport type { Nuxt } from '@nuxt/schema'\nimport type { Component } from '@nuxt/schema'\nimport { AuthoringCatalog, ComponentDefinition } from '@internal/protocol/Configuration'\nimport { addTemplate, addVitePlugin, updateTemplates } from '@nuxt/kit'\nimport { Crypto, Effect, Encoding, FileSystem, Path, Schema } from 'effect'\nimport { createCheckerByJson } from 'vue-component-meta'\nimport { resolveBlockAuthoring } from './authoring-metadata'\n\ntype AuthoringServer = {\n ws: {\n send: (\n payload:\n | { type: 'update'; updates: [] }\n | { type: 'error'; err: { message: string; stack: string; plugin: string } },\n ) => void\n }\n watcher: { add: (paths: string[]) => void }\n}\n\n/** A complete, validated snapshot shared by Vite and Nitro through ordinary imports. */\nexport const registerAuthoringCatalog = Effect.fn('CmsAuthoring.register')(function* (\n nuxt: Nuxt,\n documents: DocumentConfiguration,\n forms: Readonly<Record<string, FormCapabilities>> = {},\n onBlockNames?: (names: ReadonlyArray<string>) => void,\n additionalTemplatePaths: ReadonlyArray<string> = [],\n) {\n const fs = yield* FileSystem.FileSystem\n const path = yield* Path.Path\n const crypto = yield* Crypto.Crypto\n const run = Effect.runPromiseWith(yield* Effect.context<never>())\n let contents = 'export default { revision: \"empty\", components: [] }\\n'\n let blockContents = 'export default {}\\n'\n let discovered: Component[] = []\n let dependencies = new Set<string>()\n let queue = Promise.resolve()\n const servers = new Set<AuthoringServer>()\n let initialized = false\n let rejected = false\n\n const template = addTemplate({\n filename: 'cms/authoring.mjs',\n write: true,\n getContents: () => contents,\n })\n\n const blocks = addTemplate({ filename: 'cms/blocks.mjs', write: true, getContents: () => blockContents })\n nuxt.options.alias['#cms/blocks'] = blocks.dst\n nuxt.options.alias['#cms/authoring'] = template.dst\n nuxt.hook('nitro:config', (config) => {\n config.externals ||= {}\n config.externals.inline ||= []\n config.externals.inline.push(template.dst)\n })\n\n const compile = Effect.fn('CmsAuthoring.compile')(function* () {\n const checker = createCheckerByJson(\n nuxt.options.rootDir,\n {\n compilerOptions: {\n strict: true,\n target: 'ESNext',\n module: 'ESNext',\n moduleResolution: 'Bundler',\n baseUrl: nuxt.options.rootDir,\n paths: Object.fromEntries(\n Object.entries(nuxt.options.alias).map(([key, value]) => [`${key}/*`, [`${value}/*`]]),\n ),\n },\n files: [],\n },\n { schema: true },\n )\n\n const definitions: ComponentDefinition[] = []\n const registrations: { name: string; filePath: string }[] = []\n\n try {\n for (const component of discovered) {\n if (!component.filePath.endsWith('.vue') || component.filePath.includes('/node_modules/')) continue\n\n if (!(yield* fs.exists(component.filePath))) continue\n const source = yield* fs.readFileString(component.filePath)\n const form = forms[component.kebabName]\n\n const definition = form\n ? ComponentDefinition.make({ name: component.kebabName, authoring: formAuthoring(form) })\n : yield* resolveBlockAuthoring(checker, component.filePath, component.kebabName, source)\n\n if (!definition) continue\n\n if (definitions.some((existing) => existing.name === definition.name))\n throw new Error(`Duplicate authoring block ${definition.name}.`)\n definitions.push(definition)\n component.global = false\n registrations.push({ name: definition.name, filePath: component.filePath })\n }\n\n for (const name of Object.keys(forms))\n if (!definitions.some((definition) => definition.name === name))\n throw new Error(`Missing Vue form renderer ${name}.`)\n const components = definitions.sort((left, right) => left.name.localeCompare(right.name))\n onBlockNames?.(\n components.filter((component) => forms[component.name] === undefined).map((component) => component.name),\n )\n\n for (const collection of documents.types) {\n const issues = validateCollectionBody(components, collection.body)\n\n if (issues.length) throw new Error(`${collection.label}: ${issues.join(' ')}`)\n }\n\n const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(Schema.Array(ComponentDefinition)))(components)\n const revision = Encoding.encodeHex(yield* crypto.digest('SHA-256', new TextEncoder().encode(encoded)))\n const catalog = yield* Schema.encodeEffect(Schema.fromJsonString(AuthoringCatalog))({ revision, components })\n const next = `export default ${catalog}\\n`\n registrations.sort((left, right) => left.name.localeCompare(right.name))\n\n const nextBlocks = [\n ...registrations.map((component, index) => `import Block${index} from ${JSON.stringify(component.filePath)}`),\n `export default { ${registrations.map((component, index) => `${JSON.stringify(component.name)}: Block${index}`).join(', ')} }`,\n ].join('\\n')\n\n const changed = next !== contents || nextBlocks !== blockContents\n blockContents = nextBlocks\n\n if (rejected) {\n rejected = false\n\n for (const server of servers) server.ws.send({ type: 'update', updates: [] })\n }\n\n if (!changed) return false\n contents = next\n\n return true\n } finally {\n const discoveredDependencies = new Set(\n checker\n .getProgram()\n ?.getSourceFiles()\n .map((file) => path.resolve(file.fileName))\n .filter((file) => !file.includes('/node_modules/')),\n )\n\n // Keep failed candidate dependencies too, so fixing an imported type can recover the catalog.\n dependencies = new Set([...dependencies, ...discoveredDependencies])\n\n for (const server of servers) server.watcher.add([...dependencies])\n }\n })\n\n function rebuild() {\n const current = queue.then(() => run(compile()))\n queue = current.then(\n () => undefined,\n () => undefined,\n )\n\n return current\n }\n\n function report(error: Error) {\n rejected = true\n\n for (const server of servers)\n server.ws.send({\n type: 'error',\n err: { message: error.message, stack: error.stack ?? '', plugin: 'cms-authoring' },\n })\n\n return run(Effect.logError('Authoring update rejected; keeping the last valid catalog.', error))\n }\n\n function update() {\n return rebuild()\n .then((changed) =>\n changed\n ? updateTemplates({\n filter: (candidate) => [template.dst, blocks.dst, ...additionalTemplatePaths].includes(candidate.dst),\n })\n : undefined,\n )\n .catch((error) => report(error instanceof Error ? error : new Error(String(error))))\n }\n\n nuxt.hook('components:extend', (components) => {\n discovered = components\n // This hook runs inside template generation. Its caller writes the new snapshot.\n const candidate = rebuild().then(() => undefined)\n\n if (initialized)\n return candidate.catch((error) => report(error instanceof Error ? error : new Error(String(error))))\n initialized = true\n\n return candidate\n })\n addVitePlugin({\n name: 'cms-authoring-catalog',\n configureServer(server) {\n servers.add(server)\n server.watcher.add([...dependencies])\n\n const changed = (filename: string) => {\n const absolute = path.resolve(filename)\n\n if (dependencies.has(absolute) || discovered.some((component) => component.filePath === absolute)) void update()\n }\n\n server.watcher.on('change', changed)\n server.httpServer?.once('close', () => {\n servers.delete(server)\n server.watcher.off('change', changed)\n })\n },\n })\n\n return template\n})\n"],"mappings":"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"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { Schema } from "effect";
|
|
2
|
-
import { MagicString, babelParse, parse, walkIdentifiers } from "@vue/compiler-sfc";
|
|
3
|
-
|
|
4
|
-
//#region src/internal/authoring-compiler.ts
|
|
5
|
-
const authoringImport = "@phtngyn/cms/Authoring";
|
|
6
|
-
const isJsonObject = Schema.is(Schema.JsonObject);
|
|
7
|
-
function compileCmsBlock(source, filename) {
|
|
8
|
-
if (!source.includes(authoringImport)) return void 0;
|
|
9
|
-
const { descriptor, errors } = parse(source, { filename });
|
|
10
|
-
if (errors.length) throw new Error(`${filename}: ${errors.join("\n")}`);
|
|
11
|
-
if (descriptor.script?.content.includes(authoringImport)) {
|
|
12
|
-
if (babelParse(descriptor.script.content, {
|
|
13
|
-
sourceType: "module",
|
|
14
|
-
plugins: ["typescript"]
|
|
15
|
-
}).program.body.some((statement) => statement.type === "ImportDeclaration" && statement.source.value === authoringImport && statement.importKind !== "type" && statement.specifiers.some((specifier) => specifier.type !== "ImportSpecifier" || specifier.importKind !== "type"))) throw new Error(`${filename}: defineCmsBlock requires <script setup lang="ts">.`);
|
|
16
|
-
}
|
|
17
|
-
const setup = descriptor.scriptSetup;
|
|
18
|
-
if (!setup) return void 0;
|
|
19
|
-
const ast = babelParse(setup.content, {
|
|
20
|
-
sourceType: "module",
|
|
21
|
-
plugins: ["typescript"]
|
|
22
|
-
});
|
|
23
|
-
const imports = ast.program.body.filter((statement) => statement.type === "ImportDeclaration" && statement.source.value === authoringImport && statement.importKind !== "type");
|
|
24
|
-
if (!imports.length) return void 0;
|
|
25
|
-
const imported = imports[0];
|
|
26
|
-
if (imported?.type !== "ImportDeclaration") return void 0;
|
|
27
|
-
const specifier = imported.specifiers[0];
|
|
28
|
-
if (imports.length !== 1 || imported.specifiers.length !== 1 || specifier?.type !== "ImportSpecifier" || specifier.importKind === "type" || specifier.imported.type !== "Identifier" || specifier.imported.name !== "defineCmsBlock") throw new Error(`${filename}: use a dedicated named import for defineCmsBlock.`);
|
|
29
|
-
if (setup.lang !== "ts" || setup.attrs.generic) throw new Error(`${filename}: defineCmsBlock requires a non-generic <script setup lang="ts">.`);
|
|
30
|
-
const calls = ast.program.body.filter((statement) => statement.type === "ExpressionStatement" && statement.expression.type === "CallExpression" && statement.expression.callee.type === "Identifier" && statement.expression.callee.name === specifier.local.name);
|
|
31
|
-
const statement = calls[0];
|
|
32
|
-
if (calls.length !== 1 || statement?.type !== "ExpressionStatement" || statement.expression.type !== "CallExpression") throw new Error(`${filename}: defineCmsBlock must be called exactly once as a top-level statement.`);
|
|
33
|
-
const call = statement.expression;
|
|
34
|
-
const argument = call.arguments[0];
|
|
35
|
-
if (call.arguments.length !== 1 || argument?.type !== "ObjectExpression") throw new Error(`${filename}: defineCmsBlock requires one object literal.`);
|
|
36
|
-
const types = call.typeParameters?.type === "TSTypeParameterInstantiation" ? call.typeParameters.params : [];
|
|
37
|
-
if (types.length !== 2) throw new Error(`${filename}: share named Props and Slots types with defineProps and defineSlots.`);
|
|
38
|
-
const names = types.map((type) => {
|
|
39
|
-
if (type.type !== "TSTypeReference" || type.typeName.type !== "Identifier" || type.typeParameters) throw new Error(`${filename}: defineCmsBlock type arguments must be named, non-generic types.`);
|
|
40
|
-
return type.typeName.name;
|
|
41
|
-
});
|
|
42
|
-
const vueCalls = /* @__PURE__ */ new Map();
|
|
43
|
-
walkIdentifiers(ast.program, (identifier, parent, _stack, isReference) => {
|
|
44
|
-
if (!isReference) return;
|
|
45
|
-
if (identifier.name === specifier.local.name && identifier !== call.callee) throw new Error(`${filename}: defineCmsBlock may only be used in its top-level declaration.`);
|
|
46
|
-
if ((identifier.name === "defineProps" || identifier.name === "defineSlots") && parent?.type === "CallExpression" && parent.callee === identifier) vueCalls.set(identifier.name, parent);
|
|
47
|
-
});
|
|
48
|
-
for (const [index, macro] of ["defineProps", "defineSlots"].entries()) {
|
|
49
|
-
const parameters = vueCalls.get(macro)?.typeParameters;
|
|
50
|
-
const type = parameters?.type === "TSTypeParameterInstantiation" ? parameters.params[0] : void 0;
|
|
51
|
-
if (type?.type !== "TSTypeReference" || type.typeName.type !== "Identifier" || type.typeParameters !== void 0 || type.typeName.name !== names[index]) throw new Error(`${filename}: ${macro} must use the same ${names[index]} type as defineCmsBlock.`);
|
|
52
|
-
}
|
|
53
|
-
const declaration = staticObjectValue(argument, filename);
|
|
54
|
-
validateSlotOutlets(descriptor.template?.ast, declaration, filename);
|
|
55
|
-
const code = new MagicString(source);
|
|
56
|
-
for (const node of [imported, statement]) {
|
|
57
|
-
if (node.start === null || node.start === void 0 || node.end === null || node.end === void 0) throw new Error(`${filename}: missing authoring declaration source location.`);
|
|
58
|
-
code.remove(setup.loc.start.offset + node.start, setup.loc.start.offset + node.end);
|
|
59
|
-
}
|
|
60
|
-
return {
|
|
61
|
-
declaration,
|
|
62
|
-
code: code.toString(),
|
|
63
|
-
map: code.generateMap({
|
|
64
|
-
source: filename,
|
|
65
|
-
includeContent: true,
|
|
66
|
-
hires: true
|
|
67
|
-
})
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
function validateSlotOutlets(template, declaration, filename) {
|
|
71
|
-
if (!isJsonObject(declaration.slots)) return;
|
|
72
|
-
const declared = new Set(Object.keys(declaration.slots));
|
|
73
|
-
const rendered = /* @__PURE__ */ new Set();
|
|
74
|
-
function visit(node) {
|
|
75
|
-
const element = node.type === 1 ? node : void 0;
|
|
76
|
-
if (element?.tag === "slot") {
|
|
77
|
-
const slot = staticSlotName(element, filename);
|
|
78
|
-
if (declared.has(slot)) rendered.add(slot);
|
|
79
|
-
}
|
|
80
|
-
if (node.type === 0 || node.type === 1) for (const child of node.children) visit(child);
|
|
81
|
-
}
|
|
82
|
-
if (template) visit(template);
|
|
83
|
-
for (const slot of declared) if (!rendered.has(slot)) throw new Error(`${filename}: authored slot "${slot}" requires a matching <slot> outlet.`);
|
|
84
|
-
}
|
|
85
|
-
function staticSlotName(node, filename) {
|
|
86
|
-
if (node.props.some((property) => property.type === 7 && property.name === "bind" && property.arg?.type === 4 && property.arg.isStatic && property.arg.content === "name")) throw new Error(`${filename}: authored slot outlets require a static name.`);
|
|
87
|
-
return staticAttribute(node, "name") ?? "default";
|
|
88
|
-
}
|
|
89
|
-
function staticAttribute(node, name) {
|
|
90
|
-
return node.props.find((property) => property.type === 6 && property.name === name)?.value?.content;
|
|
91
|
-
}
|
|
92
|
-
function staticObjectValue(expression, filename) {
|
|
93
|
-
const entries = expression.properties.map((property) => {
|
|
94
|
-
if (property.type !== "ObjectProperty" || property.computed || property.shorthand || property.key.type !== "Identifier" && property.key.type !== "StringLiteral") throw new Error(`${filename}: authoring objects require literal named properties; spreads and methods are unsupported.`);
|
|
95
|
-
return [property.key.type === "Identifier" ? property.key.name : property.key.value, staticValue(property.value, filename)];
|
|
96
|
-
});
|
|
97
|
-
if (new Set(entries.map(([key]) => key)).size !== entries.length) throw new Error(`${filename}: duplicate authoring property.`);
|
|
98
|
-
return Object.fromEntries(entries);
|
|
99
|
-
}
|
|
100
|
-
function staticValue(expression, filename) {
|
|
101
|
-
switch (expression.type) {
|
|
102
|
-
case "StringLiteral":
|
|
103
|
-
case "BooleanLiteral": return expression.value;
|
|
104
|
-
case "NumericLiteral":
|
|
105
|
-
if (Number.isFinite(expression.value)) return expression.value;
|
|
106
|
-
break;
|
|
107
|
-
case "NullLiteral": return null;
|
|
108
|
-
case "UnaryExpression":
|
|
109
|
-
if (expression.operator === "-" && expression.argument.type === "NumericLiteral" && Number.isFinite(expression.argument.value)) return -expression.argument.value;
|
|
110
|
-
break;
|
|
111
|
-
case "ArrayExpression": return expression.elements.map((element) => {
|
|
112
|
-
if (!element || element.type === "SpreadElement") throw new Error(`${filename}: authoring arrays require literal entries.`);
|
|
113
|
-
return staticValue(element, filename);
|
|
114
|
-
});
|
|
115
|
-
case "ObjectExpression": return staticObjectValue(expression, filename);
|
|
116
|
-
}
|
|
117
|
-
throw new Error(`${filename}: authoring metadata must contain only JSON literals; ${expression.type} is unsupported.`);
|
|
118
|
-
}
|
|
119
|
-
/** Reads Vue's printed default expression without evaluating application code. */
|
|
120
|
-
function readAuthoringDefault(source, filename) {
|
|
121
|
-
const expression = babelParse(`(${source})`, {
|
|
122
|
-
sourceType: "module",
|
|
123
|
-
plugins: ["typescript"]
|
|
124
|
-
}).program.body[0];
|
|
125
|
-
if (expression?.type !== "ExpressionStatement") throw new Error(`${filename}: expected a literal Vue default.`);
|
|
126
|
-
const value = expression.expression;
|
|
127
|
-
return staticValue(value.type === "ArrowFunctionExpression" && value.body.type !== "BlockStatement" ? value.body : value, filename);
|
|
128
|
-
}
|
|
129
|
-
function cmsAuthoringPlugin() {
|
|
130
|
-
return {
|
|
131
|
-
name: "cms:authoring",
|
|
132
|
-
enforce: "pre",
|
|
133
|
-
transform(source, id) {
|
|
134
|
-
if (!id.endsWith(".vue")) return void 0;
|
|
135
|
-
const compiled = compileCmsBlock(source, id);
|
|
136
|
-
return compiled ? {
|
|
137
|
-
code: compiled.code,
|
|
138
|
-
map: compiled.map
|
|
139
|
-
} : void 0;
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
//#endregion
|
|
145
|
-
export { cmsAuthoringPlugin, compileCmsBlock, readAuthoringDefault };
|
|
146
|
-
//# sourceMappingURL=authoring-compiler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authoring-compiler.js","names":[],"sources":["../../../../src/internal/authoring-compiler.ts"],"sourcesContent":["import { babelParse, MagicString, parse, walkIdentifiers } from '@vue/compiler-sfc'\nimport { Schema } from 'effect'\n\nconst authoringImport = '@phtngyn/cms/Authoring'\n\ntype Statement = ReturnType<typeof babelParse>['program']['body'][number]\n\ntype Expression = Extract<Statement, { type: 'ExpressionStatement' }>['expression']\n\ntype Call = Extract<Expression, { type: 'CallExpression' }>\n\ntype TemplateRoot = NonNullable<NonNullable<ReturnType<typeof parse>['descriptor']['template']>['ast']>\n\ntype TemplateNode = TemplateRoot | TemplateRoot['children'][number]\n\ntype TemplateElement = Extract<TemplateNode, { type: 1 }>\n\ntype TemplateAttribute = Extract<TemplateElement['props'][number], { type: 6 }>\n\nconst isJsonObject = Schema.is(Schema.JsonObject)\n\nexport function compileCmsBlock(source: string, filename: string) {\n if (!source.includes(authoringImport)) return undefined\n const { descriptor, errors } = parse(source, { filename })\n\n if (errors.length) throw new Error(`${filename}: ${errors.join('\\n')}`)\n\n if (descriptor.script?.content.includes(authoringImport)) {\n const script = babelParse(descriptor.script.content, { sourceType: 'module', plugins: ['typescript'] })\n\n if (\n script.program.body.some(\n (statement) =>\n statement.type === 'ImportDeclaration' &&\n statement.source.value === authoringImport &&\n statement.importKind !== 'type' &&\n statement.specifiers.some(\n (specifier) => specifier.type !== 'ImportSpecifier' || specifier.importKind !== 'type',\n ),\n )\n )\n throw new Error(`${filename}: defineCmsBlock requires <script setup lang=\"ts\">.`)\n }\n\n const setup = descriptor.scriptSetup\n\n if (!setup) return undefined\n const ast = babelParse(setup.content, { sourceType: 'module', plugins: ['typescript'] })\n\n const imports = ast.program.body.filter(\n (statement) =>\n statement.type === 'ImportDeclaration' &&\n statement.source.value === authoringImport &&\n statement.importKind !== 'type',\n )\n\n if (!imports.length) return undefined\n const imported = imports[0]\n\n if (imported?.type !== 'ImportDeclaration') return undefined\n const specifier = imported.specifiers[0]\n\n if (\n imports.length !== 1 ||\n imported.specifiers.length !== 1 ||\n specifier?.type !== 'ImportSpecifier' ||\n specifier.importKind === 'type' ||\n specifier.imported.type !== 'Identifier' ||\n specifier.imported.name !== 'defineCmsBlock'\n ) {\n throw new Error(`${filename}: use a dedicated named import for defineCmsBlock.`)\n }\n\n if (setup.lang !== 'ts' || setup.attrs.generic) {\n throw new Error(`${filename}: defineCmsBlock requires a non-generic <script setup lang=\"ts\">.`)\n }\n\n const calls = ast.program.body.filter(\n (statement) =>\n statement.type === 'ExpressionStatement' &&\n statement.expression.type === 'CallExpression' &&\n statement.expression.callee.type === 'Identifier' &&\n statement.expression.callee.name === specifier.local.name,\n )\n\n const statement = calls[0]\n\n if (\n calls.length !== 1 ||\n statement?.type !== 'ExpressionStatement' ||\n statement.expression.type !== 'CallExpression'\n ) {\n throw new Error(`${filename}: defineCmsBlock must be called exactly once as a top-level statement.`)\n }\n\n const call = statement.expression\n const argument = call.arguments[0]\n\n if (call.arguments.length !== 1 || argument?.type !== 'ObjectExpression') {\n throw new Error(`${filename}: defineCmsBlock requires one object literal.`)\n }\n\n const types = call.typeParameters?.type === 'TSTypeParameterInstantiation' ? call.typeParameters.params : []\n\n if (types.length !== 2)\n throw new Error(`${filename}: share named Props and Slots types with defineProps and defineSlots.`)\n\n const names = types.map((type) => {\n if (type.type !== 'TSTypeReference' || type.typeName.type !== 'Identifier' || type.typeParameters) {\n throw new Error(`${filename}: defineCmsBlock type arguments must be named, non-generic types.`)\n }\n\n return type.typeName.name\n })\n\n const vueCalls = new Map<string, Call>()\n walkIdentifiers(ast.program, (identifier, parent, _stack, isReference) => {\n if (!isReference) return\n\n if (identifier.name === specifier.local.name && identifier !== call.callee) {\n throw new Error(`${filename}: defineCmsBlock may only be used in its top-level declaration.`)\n }\n\n if (\n (identifier.name === 'defineProps' || identifier.name === 'defineSlots') &&\n parent?.type === 'CallExpression' &&\n parent.callee === identifier\n ) {\n vueCalls.set(identifier.name, parent)\n }\n })\n\n for (const [index, macro] of ['defineProps', 'defineSlots'].entries()) {\n const vueCall = vueCalls.get(macro)\n const parameters = vueCall?.typeParameters\n const type = parameters?.type === 'TSTypeParameterInstantiation' ? parameters.params[0] : undefined\n\n if (\n type?.type !== 'TSTypeReference' ||\n type.typeName.type !== 'Identifier' ||\n type.typeParameters !== undefined ||\n type.typeName.name !== names[index]\n ) {\n throw new Error(`${filename}: ${macro} must use the same ${names[index]} type as defineCmsBlock.`)\n }\n }\n\n const declaration = staticObjectValue(argument, filename)\n validateSlotOutlets(descriptor.template?.ast, declaration, filename)\n const code = new MagicString(source)\n\n for (const node of [imported, statement]) {\n if (node.start === null || node.start === undefined || node.end === null || node.end === undefined) {\n throw new Error(`${filename}: missing authoring declaration source location.`)\n }\n\n code.remove(setup.loc.start.offset + node.start, setup.loc.start.offset + node.end)\n }\n\n return {\n declaration,\n code: code.toString(),\n map: code.generateMap({ source: filename, includeContent: true, hires: true }),\n }\n}\n\nfunction validateSlotOutlets(\n template: TemplateRoot | undefined,\n declaration: Schema.JsonObject,\n filename: string,\n): void {\n if (!isJsonObject(declaration.slots)) return\n\n const declared = new Set(Object.keys(declaration.slots))\n const rendered = new Set<string>()\n\n function visit(node: TemplateNode): void {\n const element = node.type === 1 ? node : undefined\n\n if (element?.tag === 'slot') {\n const slot = staticSlotName(element, filename)\n\n if (declared.has(slot)) rendered.add(slot)\n }\n\n if (node.type === 0 || node.type === 1) {\n for (const child of node.children) visit(child)\n }\n }\n\n if (template) visit(template)\n\n for (const slot of declared) {\n if (!rendered.has(slot)) throw new Error(`${filename}: authored slot \"${slot}\" requires a matching <slot> outlet.`)\n }\n}\n\nfunction staticSlotName(node: TemplateElement, filename: string): string {\n const dynamicName = node.props.some(\n (property) =>\n property.type === 7 &&\n property.name === 'bind' &&\n property.arg?.type === 4 &&\n property.arg.isStatic &&\n property.arg.content === 'name',\n )\n\n if (dynamicName) throw new Error(`${filename}: authored slot outlets require a static name.`)\n\n return staticAttribute(node, 'name') ?? 'default'\n}\n\nfunction staticAttribute(node: TemplateElement, name: string): string | undefined {\n return node.props.find((property): property is TemplateAttribute => property.type === 6 && property.name === name)\n ?.value?.content\n}\n\nfunction staticObjectValue(\n expression: Extract<Parameters<typeof walkIdentifiers>[0], { type: 'ObjectExpression' }>,\n filename: string,\n): Schema.JsonObject {\n const entries = expression.properties.map((property): [string, Schema.Json] => {\n if (\n property.type !== 'ObjectProperty' ||\n property.computed ||\n property.shorthand ||\n (property.key.type !== 'Identifier' && property.key.type !== 'StringLiteral')\n ) {\n throw new Error(\n `${filename}: authoring objects require literal named properties; spreads and methods are unsupported.`,\n )\n }\n\n return [\n property.key.type === 'Identifier' ? property.key.name : property.key.value,\n staticValue(property.value, filename),\n ]\n })\n\n if (new Set(entries.map(([key]) => key)).size !== entries.length)\n throw new Error(`${filename}: duplicate authoring property.`)\n\n return Object.fromEntries(entries)\n}\n\nfunction staticValue(expression: Parameters<typeof walkIdentifiers>[0], filename: string): Schema.Json {\n switch (expression.type) {\n case 'StringLiteral':\n case 'BooleanLiteral':\n return expression.value\n case 'NumericLiteral':\n if (Number.isFinite(expression.value)) return expression.value\n break\n case 'NullLiteral':\n return null\n case 'UnaryExpression':\n if (\n expression.operator === '-' &&\n expression.argument.type === 'NumericLiteral' &&\n Number.isFinite(expression.argument.value)\n ) {\n return -expression.argument.value\n }\n\n break\n case 'ArrayExpression':\n return expression.elements.map((element) => {\n if (!element || element.type === 'SpreadElement')\n throw new Error(`${filename}: authoring arrays require literal entries.`)\n\n return staticValue(element, filename)\n })\n case 'ObjectExpression':\n return staticObjectValue(expression, filename)\n }\n\n throw new Error(`${filename}: authoring metadata must contain only JSON literals; ${expression.type} is unsupported.`)\n}\n\n/** Reads Vue's printed default expression without evaluating application code. */\nexport function readAuthoringDefault(source: string, filename: string): Schema.Json {\n const expression = babelParse(`(${source})`, { sourceType: 'module', plugins: ['typescript'] }).program.body[0]\n\n if (expression?.type !== 'ExpressionStatement') throw new Error(`${filename}: expected a literal Vue default.`)\n const value = expression.expression\n\n return staticValue(\n value.type === 'ArrowFunctionExpression' && value.body.type !== 'BlockStatement' ? value.body : value,\n filename,\n )\n}\n\nexport function cmsAuthoringPlugin() {\n return {\n name: 'cms:authoring',\n enforce: 'pre' as const,\n transform(source: string, id: string) {\n if (!id.endsWith('.vue')) return undefined\n const compiled = compileCmsBlock(source, id)\n\n return compiled ? { code: compiled.code, map: compiled.map } : undefined\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { a as BlockAuthoring, c as parseAuthoringContent, n as ComponentDefinition, s as createAuthoringSchema } from "../Configuration-Da5B2PVH.js";
|
|
2
|
-
import { compileCmsBlock, readAuthoringDefault } from "./authoring-compiler.js";
|
|
3
|
-
import { Effect, Result, Schema } from "effect";
|
|
4
|
-
import ts from "typescript";
|
|
5
|
-
|
|
6
|
-
//#region src/internal/authoring-metadata.ts
|
|
7
|
-
const Presentation = Schema.Struct({
|
|
8
|
-
fields: Schema.optionalKey(Schema.Record(Schema.String, Schema.suspend(() => Presentation))),
|
|
9
|
-
blocks: Schema.optionalKey(Schema.Array(Schema.NonEmptyString)),
|
|
10
|
-
groups: Schema.optionalKey(Schema.Array(Schema.NonEmptyString)),
|
|
11
|
-
label: Schema.NonEmptyString,
|
|
12
|
-
help: Schema.optionalKey(Schema.String),
|
|
13
|
-
input: Schema.String,
|
|
14
|
-
optionLabels: Schema.optionalKey(Schema.Record(Schema.String, Schema.String)),
|
|
15
|
-
features: Schema.optionalKey(Schema.Array(Schema.Literals([
|
|
16
|
-
"bold",
|
|
17
|
-
"italic",
|
|
18
|
-
"link",
|
|
19
|
-
"bullet-list",
|
|
20
|
-
"code"
|
|
21
|
-
])))
|
|
22
|
-
});
|
|
23
|
-
const Declaration = Schema.Struct({
|
|
24
|
-
label: Schema.NonEmptyString,
|
|
25
|
-
description: Schema.optionalKey(Schema.String),
|
|
26
|
-
group: Schema.optionalKey(Schema.String),
|
|
27
|
-
icon: Schema.optionalKey(Schema.String),
|
|
28
|
-
props: Schema.Record(Schema.String, Presentation),
|
|
29
|
-
slots: Schema.Record(Schema.String, Presentation),
|
|
30
|
-
initial: Schema.optionalKey(Schema.Struct({
|
|
31
|
-
props: Schema.optionalKey(Schema.JsonObject),
|
|
32
|
-
slots: Schema.optionalKey(Schema.Record(Schema.String, Schema.Union([Schema.Struct({ text: Schema.String }), Schema.Struct({ markdown: Schema.String })])))
|
|
33
|
-
}))
|
|
34
|
-
});
|
|
35
|
-
/** Resolves one opted-in SFC. No framework metadata or executable defaults cross this seam. */
|
|
36
|
-
const resolveBlockAuthoring = Effect.fn("NuxtAuthoring.resolve")(function* (checker, filename, name, source) {
|
|
37
|
-
const compiled = compileCmsBlock(source, filename);
|
|
38
|
-
if (!compiled) return void 0;
|
|
39
|
-
const declared = yield* Schema.decodeUnknownEffect(Declaration)(compiled.declaration, { onExcessProperty: "error" });
|
|
40
|
-
checker.updateFile(filename, source);
|
|
41
|
-
const metadata = checker.getComponentMeta(filename);
|
|
42
|
-
const props = Object.entries(declared.props).map(([key, presentation]) => {
|
|
43
|
-
const prop = metadata.props.find((candidate) => candidate.name === key && !candidate.global);
|
|
44
|
-
if (!prop) throw new Error(`${filename}: unknown Vue prop ${key}.`);
|
|
45
|
-
const typeChecker = checker.getProgram()?.getTypeChecker();
|
|
46
|
-
if (!typeChecker) throw new Error(`${filename}: Vue type information is unavailable.`);
|
|
47
|
-
return resolveProp(prop.getTypeObject(), key, prop.required, presentation, typeChecker, filename, prop.default);
|
|
48
|
-
});
|
|
49
|
-
for (const prop of metadata.props) if (!prop.global && prop.required && prop.default === void 0 && !Object.hasOwn(declared.props, prop.name)) throw new Error(`${filename}: required prop ${prop.name} needs an authoring declaration and initial value.`);
|
|
50
|
-
const slotTypes = vueSlots(checker, filename);
|
|
51
|
-
const slots = [];
|
|
52
|
-
for (const [key, presentation] of Object.entries(declared.slots)) {
|
|
53
|
-
const slot = slotTypes.get(key);
|
|
54
|
-
if (!slot) throw new Error(`${filename}: unknown Vue slot ${key}.`);
|
|
55
|
-
if (slot.scoped) throw new Error(`${filename}: scoped slot ${key} cannot be authored.`);
|
|
56
|
-
const seed = declared.initial?.slots?.[key];
|
|
57
|
-
const initial = seed ? "text" in seed ? [[
|
|
58
|
-
"p",
|
|
59
|
-
{},
|
|
60
|
-
seed.text
|
|
61
|
-
]] : yield* parseAuthoringContent(seed.markdown) : void 0;
|
|
62
|
-
slots.push(yield* Schema.decodeUnknownEffect(BlockAuthoring.fields.slots.value)({
|
|
63
|
-
name: key,
|
|
64
|
-
label: presentation.label,
|
|
65
|
-
...presentation.help === void 0 ? void 0 : { help: presentation.help },
|
|
66
|
-
input: presentation.input,
|
|
67
|
-
required: slot.required,
|
|
68
|
-
features: presentation.features ?? [],
|
|
69
|
-
...presentation.blocks === void 0 ? void 0 : { blocks: presentation.blocks },
|
|
70
|
-
...presentation.groups === void 0 ? void 0 : { groups: presentation.groups },
|
|
71
|
-
...initial === void 0 ? void 0 : { initial }
|
|
72
|
-
}));
|
|
73
|
-
if (slot.required && !seed) throw new Error(`${filename}: required slot ${key} needs initial content.`);
|
|
74
|
-
}
|
|
75
|
-
for (const [key, slot] of slotTypes) if (slot.required && !Object.hasOwn(declared.slots, key)) throw new Error(`${filename}: required slot ${key} must be declared.`);
|
|
76
|
-
for (const key of Object.keys(declared.initial?.slots ?? {})) if (!slotTypes.has(key) || !Object.hasOwn(declared.slots, key)) throw new Error(`${filename}: initial content refers to undeclared slot ${key}.`);
|
|
77
|
-
const authoring = BlockAuthoring.make({
|
|
78
|
-
version: 1,
|
|
79
|
-
label: declared.label,
|
|
80
|
-
props,
|
|
81
|
-
slots,
|
|
82
|
-
initialProps: declared.initial?.props ?? {},
|
|
83
|
-
...declared.description === void 0 ? void 0 : { description: declared.description },
|
|
84
|
-
...declared.group === void 0 ? void 0 : { group: declared.group },
|
|
85
|
-
...declared.icon === void 0 ? void 0 : { icon: declared.icon }
|
|
86
|
-
});
|
|
87
|
-
createAuthoringSchema(name, authoring);
|
|
88
|
-
return ComponentDefinition.make({
|
|
89
|
-
name,
|
|
90
|
-
authoring
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
function resolveProp(raw, name, required, presentation, checker, filename, defaultSource, depth = 0) {
|
|
94
|
-
if (depth > 12) throw new Error(`${filename}: ${name} exceeds the supported property nesting depth.`);
|
|
95
|
-
const union = raw.isUnion() ? raw.types : [raw];
|
|
96
|
-
const members = union.filter((type) => !(type.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Null)));
|
|
97
|
-
const nullable = union.some((type) => Boolean(type.flags & ts.TypeFlags.Null));
|
|
98
|
-
const choices = members.flatMap((type) => type.isStringLiteral() ? [type.value] : []).sort();
|
|
99
|
-
const valueType = checker.getNonNullableType(raw);
|
|
100
|
-
let type;
|
|
101
|
-
let fields;
|
|
102
|
-
if (presentation.input === "multiselect") {
|
|
103
|
-
const item = checker.getIndexTypeOfType(valueType, ts.IndexKind.Number);
|
|
104
|
-
const itemMembers = item?.isUnion() ? item.types : item ? [item] : [];
|
|
105
|
-
if (!itemMembers.length || !itemMembers.every((member) => Boolean(member.flags & ts.TypeFlags.StringLike))) throw new Error(`${filename}: ${name} needs a string list type.`);
|
|
106
|
-
type = "string[]";
|
|
107
|
-
choices.push(...itemMembers.flatMap((member) => member.isStringLiteral() ? [member.value] : []).sort());
|
|
108
|
-
} else if (members.length && members.every((type) => Boolean(type.flags & ts.TypeFlags.StringLike))) type = "string";
|
|
109
|
-
else if (members.length === 1 && members[0]?.flags === ts.TypeFlags.Number) type = "number";
|
|
110
|
-
else if (members.length && members.every((type) => Boolean(type.flags & ts.TypeFlags.BooleanLike))) type = "boolean";
|
|
111
|
-
else if (presentation.input === "object" || presentation.input === "list") {
|
|
112
|
-
type = presentation.input === "list" ? "array" : "object";
|
|
113
|
-
const item = type === "array" ? checker.getIndexTypeOfType(valueType, ts.IndexKind.Number) : valueType;
|
|
114
|
-
if (!item || !(item.flags & ts.TypeFlags.Object) || item.getCallSignatures().length) throw new Error(`${filename}: ${name} needs an object${type === "array" ? " list" : ""} type.`);
|
|
115
|
-
if (type === "array") {
|
|
116
|
-
const id = item.getProperty("id");
|
|
117
|
-
const declaration = id?.valueDeclaration ?? id?.declarations?.[0];
|
|
118
|
-
if (!id || !declaration || id.flags & ts.SymbolFlags.Optional || checker.getTypeOfSymbolAtLocation(id, declaration).flags !== ts.TypeFlags.String) throw new Error(`${filename}: ${name} list items need a required string id for stable editing.`);
|
|
119
|
-
}
|
|
120
|
-
fields = Object.entries(presentation.fields ?? {}).map(([key, field]) => {
|
|
121
|
-
if (type === "array" && key === "id") throw new Error(`${filename}: list item ids are managed by Studio.`);
|
|
122
|
-
const property = item.getProperty(key);
|
|
123
|
-
const declaration = property?.valueDeclaration ?? property?.declarations?.[0];
|
|
124
|
-
if (!property || !declaration) throw new Error(`${filename}: unknown field ${name}.${key}.`);
|
|
125
|
-
return resolveProp(checker.getTypeOfSymbolAtLocation(property, declaration), key, !(property.flags & ts.SymbolFlags.Optional), field, checker, filename, void 0, depth + 1);
|
|
126
|
-
});
|
|
127
|
-
for (const property of item.getProperties()) {
|
|
128
|
-
if (type === "array" && property.name === "id") continue;
|
|
129
|
-
if (!(property.flags & ts.SymbolFlags.Optional) && !fields.some((field) => field.name === property.name)) throw new Error(`${filename}: required field ${name}.${property.name} needs an authoring declaration.`);
|
|
130
|
-
}
|
|
131
|
-
} else throw new Error(`${filename}: unsupported editable prop ${name}.`);
|
|
132
|
-
if (!{
|
|
133
|
-
string: [
|
|
134
|
-
"text",
|
|
135
|
-
"textarea",
|
|
136
|
-
"select",
|
|
137
|
-
"image",
|
|
138
|
-
"link",
|
|
139
|
-
"document",
|
|
140
|
-
"media"
|
|
141
|
-
],
|
|
142
|
-
number: ["number"],
|
|
143
|
-
boolean: ["toggle"],
|
|
144
|
-
"string[]": ["multiselect"],
|
|
145
|
-
object: ["object"],
|
|
146
|
-
array: ["list"]
|
|
147
|
-
}[type].includes(presentation.input) || (presentation.input === "select" || presentation.input === "multiselect") && presentation.optionLabels !== void 0 && !choices.length) throw new Error(`${filename}: ${name} has an incompatible authoring input ${presentation.input}.`);
|
|
148
|
-
for (const key of Object.keys(presentation.optionLabels ?? {})) if (!choices.includes(key)) throw new Error(`${filename}: ${key} is not a Vue union choice.`);
|
|
149
|
-
return Result.getOrThrow(Schema.decodeUnknownResult(BlockAuthoring.fields.props.value)({
|
|
150
|
-
name,
|
|
151
|
-
label: presentation.label,
|
|
152
|
-
type,
|
|
153
|
-
input: presentation.input,
|
|
154
|
-
required,
|
|
155
|
-
nullable,
|
|
156
|
-
...presentation.help === void 0 ? void 0 : { description: presentation.help },
|
|
157
|
-
...fields === void 0 ? void 0 : { fields },
|
|
158
|
-
...defaultSource === void 0 ? void 0 : { defaultValue: readAuthoringDefault(defaultSource, `${filename} prop ${name}`) },
|
|
159
|
-
options: choices.map((value) => ({
|
|
160
|
-
value,
|
|
161
|
-
label: presentation.optionLabels?.[value] ?? value
|
|
162
|
-
}))
|
|
163
|
-
}));
|
|
164
|
-
}
|
|
165
|
-
function vueSlots(checker, filename) {
|
|
166
|
-
const program = checker.getProgram();
|
|
167
|
-
const file = program?.getSourceFile(filename);
|
|
168
|
-
if (!program || !file) throw new Error(`${filename}: Vue type information is unavailable.`);
|
|
169
|
-
const typeChecker = program.getTypeChecker();
|
|
170
|
-
const result = /* @__PURE__ */ new Map();
|
|
171
|
-
function visit(node) {
|
|
172
|
-
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "defineSlots") {
|
|
173
|
-
const type = node.typeArguments?.[0];
|
|
174
|
-
if (type) for (const property of typeChecker.getTypeAtLocation(type).getProperties()) {
|
|
175
|
-
const declaration = property.valueDeclaration ?? property.declarations?.[0];
|
|
176
|
-
const signature = declaration ? typeChecker.getNonNullableType(typeChecker.getTypeOfSymbolAtLocation(property, declaration)).getCallSignatures() : [];
|
|
177
|
-
result.set(property.name, {
|
|
178
|
-
required: !(property.flags & ts.SymbolFlags.Optional),
|
|
179
|
-
scoped: signature.length !== 1 || signature.some((signature) => signature.parameters.length > 0)
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
ts.forEachChild(node, visit);
|
|
184
|
-
}
|
|
185
|
-
visit(file);
|
|
186
|
-
return result;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
//#endregion
|
|
190
|
-
export { resolveBlockAuthoring };
|
|
191
|
-
//# sourceMappingURL=authoring-metadata.js.map
|