@janga/norna 0.7.18 → 0.7.23
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 +22 -12
- package/astro.config.mjs +25 -0
- package/bin/norna-cli.mjs +8 -2
- package/package.json +60 -13
- package/schemas/category.schema.json +20 -0
- package/schemas/config.schema.json +22 -14
- package/schemas/content-frontmatter.schema.json +25 -5
- package/schemas/manifest.json +2 -1
- package/schemas/page-theme.schema.json +58 -30
- package/schemas/sitewide-content.schema.json +20 -19
- package/schemas/theme.schema.json +542 -243
- package/scripts/add-site-node.mjs +251 -0
- package/scripts/check-config.mjs +32 -4
- package/scripts/deploy-site.mjs +5 -9
- package/scripts/dev-local.mjs +175 -112
- package/scripts/generate-images.mjs +11 -15
- package/scripts/generate-schemas.mjs +4 -1
- package/scripts/init-site.mjs +35 -0
- package/scripts/lib/astro-command.mjs +14 -9
- package/scripts/lib/content-sync-apply.mjs +34 -0
- package/scripts/lib/content-sync-plan.mjs +179 -0
- package/scripts/lib/editor-language-service.mjs +156 -177
- package/scripts/lib/heading-ids.mjs +4 -2
- package/scripts/lib/image-presentation.mjs +2 -0
- package/scripts/lib/markdown-links.mjs +182 -0
- package/scripts/lib/navigation-model.mjs +36 -19
- package/scripts/lib/norna-markdown-blocks.mjs +65 -145
- package/scripts/lib/norna-markdown-render-plugin.mjs +37 -0
- package/scripts/lib/object.mjs +28 -0
- package/scripts/lib/page-aliases.mjs +164 -0
- package/scripts/lib/page-markdown.mjs +332 -0
- package/scripts/lib/presentation-contract.mjs +266 -0
- package/scripts/lib/presentation-palette-metadata.mjs +51 -0
- package/scripts/lib/presentation.mjs +508 -79
- package/scripts/lib/project-config.mjs +78 -10
- package/scripts/lib/schema-definitions.mjs +67 -16
- package/scripts/lib/schema-editor-metadata.mjs +126 -24
- package/scripts/lib/schema-value-definitions.mjs +30 -12
- package/scripts/lib/site-content.mjs +46 -239
- package/scripts/lib/site-link-graph.mjs +326 -0
- package/scripts/lib/site-page-urls.mjs +10 -0
- package/scripts/lib/site-paths.mjs +2 -3
- package/scripts/lib/site-structure.mjs +189 -0
- package/scripts/lib/sitemap.mjs +34 -0
- package/scripts/lib/theme-presets.mjs +118 -119
- package/scripts/lib/theme-profiles.mjs +223 -0
- package/scripts/lib/typography.mjs +220 -35
- package/scripts/lib/yaml-config.mjs +50 -6
- package/scripts/lib/yaml-indentation.mjs +86 -0
- package/scripts/show-typography.mjs +2 -3
- package/scripts/sync-content-sections.mjs +158 -244
- package/scripts/sync-site-public.mjs +23 -2
- package/src/components/CodeBlockCopyScript.astro +92 -0
- package/src/components/DisplaySettings.astro +107 -0
- package/src/components/ImageCarousel.astro +38 -13
- package/src/components/NavigationPageTree.astro +103 -88
- package/src/components/PageAliasRedirect.astro +49 -0
- package/src/components/PageContentsNavigation.astro +21 -0
- package/src/components/SectionNavigationScript.astro +112 -2
- package/src/components/SiteBreadcrumbs.astro +15 -12
- package/src/components/SiteNavigation.astro +104 -41
- package/src/components/SitePage.astro +76 -40
- package/src/components/SiteSection.astro +40 -191
- package/src/components/SiteTreeNavigation.astro +10 -10
- package/src/content.config.ts +5 -2
- package/src/layouts/BaseLayout.astro +55 -9
- package/src/lib/generatedImages.ts +0 -7
- package/src/lib/readerPreferencesScript.mjs +141 -0
- package/src/lib/sectionContent.ts +119 -201
- package/src/lib/siteNavigation.ts +36 -18
- package/src/lib/sitePages.ts +92 -20
- package/src/pages/[...slug].astro +35 -8
- package/src/styles/content.css +494 -0
- package/src/styles/foundations.css +284 -0
- package/src/styles/global.css +6 -2047
- package/src/styles/media.css +523 -0
- package/src/styles/navigation.css +495 -0
- package/src/styles/page-layout.css +437 -0
- package/src/styles/responsive.css +525 -0
- package/starters/basic/README.md +3 -3
- package/docs/README.md +0 -137
- package/docs/assets/norna-dog-shelter.jpg +0 -0
- package/docs/commands.md +0 -189
- package/docs/configuration.md +0 -142
- package/docs/content.md +0 -351
- package/docs/design/command-organization.md +0 -414
- package/docs/design/navigation-and-theme-plan.md +0 -186
- package/docs/design/norna-diagram-design.md +0 -159
- package/docs/design/site-examples-structure.md +0 -119
- package/docs/engine-development.md +0 -215
- package/docs/getting-started.md +0 -206
- package/docs/how-to/embedded-site.md +0 -35
- package/docs/images-and-metadata.md +0 -188
- package/docs/local-development.md +0 -82
- package/docs/pages.md +0 -190
- package/docs/public-files.md +0 -118
- package/docs/publishing.md +0 -117
- package/docs/requirements.md +0 -54
- package/docs/site-files.md +0 -152
- package/docs/sitewide-content.md +0 -73
- package/docs/theme.md +0 -237
- package/docs/typography.md +0 -168
- package/examples/README.md +0 -49
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +0 -35
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +0 -97
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +0 -852
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs +0 -4
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content-modules.mjs +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content.d.ts +0 -183
- package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +0 -8
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +0 -13
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +0 -36
- package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +0 -5
- package/examples/complete-sites/dog-shelter-multi-page/.astro/types.d.ts +0 -2
- package/examples/complete-sites/dog-shelter-multi-page/README.md +0 -24
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +0 -74
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/package.json +0 -3
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +0 -98
- package/examples/complete-sites/dog-shelter-multi-page/site/config.yaml +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/000-home/content.md +0 -23
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/000-home/images/shelter-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/content.md +0 -21
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rex.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rover.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/content.md +0 -22
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/images/adoption-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/public/favicon.svg +0 -10
- package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +0 -9
- package/examples/complete-sites/dog-shelter-multi-page/site/public/robots.txt +0 -2
- package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +0 -4
- package/examples/complete-sites/dog-shelter-multi-page/site/theme.yaml +0 -1
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +0 -35
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +0 -97
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +0 -852
- package/examples/complete-sites/dog-shelter-single-page/.astro/content-assets.mjs +0 -4
- package/examples/complete-sites/dog-shelter-single-page/.astro/content-modules.mjs +0 -1
- package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +0 -183
- package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +0 -1
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +0 -8
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +0 -13
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +0 -18
- package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +0 -5
- package/examples/complete-sites/dog-shelter-single-page/.astro/types.d.ts +0 -2
- package/examples/complete-sites/dog-shelter-single-page/README.md +0 -24
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +0 -74
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/package.json +0 -3
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +0 -50
- package/examples/complete-sites/dog-shelter-single-page/site/config.yaml +0 -1
- package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/content.md +0 -37
- package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/images/foster-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/images/rescue-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-single-page/site/public/favicon.svg +0 -10
- package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +0 -9
- package/examples/complete-sites/dog-shelter-single-page/site/public/robots.txt +0 -2
- package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +0 -4
- package/examples/complete-sites/dog-shelter-single-page/site/theme.yaml +0 -1
- package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +0 -35
- package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +0 -97
- package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +0 -844
- package/examples/feature-demos/media-and-surfaces/.astro/content-assets.mjs +0 -4
- package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +0 -1
- package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +0 -183
- package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +0 -1
- package/examples/feature-demos/media-and-surfaces/.astro/dev.log +0 -14
- package/examples/feature-demos/media-and-surfaces/.astro/settings.json +0 -5
- package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +0 -2
- package/examples/feature-demos/media-and-surfaces/README.md +0 -21
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +0 -80
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js +0 -1389
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/package.json +0 -3
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +0 -66
- package/examples/feature-demos/media-and-surfaces/site/config.yaml +0 -1
- package/examples/feature-demos/media-and-surfaces/site/pages/000-home/content.md +0 -15
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/content.md +0 -71
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-carousel.svg +0 -11
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-stack.svg +0 -9
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-surfaces.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-one.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-three.svg +0 -13
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-two.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-one.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-two.svg +0 -9
- package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/content.md +0 -42
- package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +0 -2
- package/examples/feature-demos/media-and-surfaces/site/public/robots.txt +0 -2
- package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
- package/examples/feature-demos/media-and-surfaces/site/theme.yaml +0 -1
- package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +0 -59
- package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +0 -138
- package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +0 -755
- package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +0 -1
- package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +0 -1
- package/examples/feature-demos/sitewide-content/.astro/content.d.ts +0 -183
- package/examples/feature-demos/sitewide-content/.astro/data-store.json +0 -1
- package/examples/feature-demos/sitewide-content/.astro/dev.json +0 -13
- package/examples/feature-demos/sitewide-content/.astro/dev.log +0 -18
- package/examples/feature-demos/sitewide-content/.astro/settings.json +0 -5
- package/examples/feature-demos/sitewide-content/.astro/types.d.ts +0 -2
- package/examples/feature-demos/sitewide-content/README.md +0 -26
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +0 -74
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +0 -3
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +0 -1
- package/examples/feature-demos/sitewide-content/site/config.yaml +0 -1
- package/examples/feature-demos/sitewide-content/site/pages/000-home/content.md +0 -17
- package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +0 -17
- package/examples/feature-demos/sitewide-content/site/pages/020-notices/content.md +0 -23
- package/examples/feature-demos/sitewide-content/site/pages/030-footer/content.md +0 -18
- package/examples/feature-demos/sitewide-content/site/public/logo.svg +0 -6
- package/examples/feature-demos/sitewide-content/site/public/robots.txt +0 -2
- package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +0 -14
- package/examples/feature-demos/sitewide-content/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-documentation/README.md +0 -16
- package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-documentation/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/content.md +0 -30
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/black-schnauzer.jpg +0 -0
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/retriever-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/schnauzer-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-documentation/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-documentation/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-documentation/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-portfolio/README.md +0 -16
- package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/content.md +0 -31
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/puppy-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/shepherd-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/white-puppy.jpg +0 -0
- package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-portfolio/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-project/.astro/collections/routeTheme.schema.json +0 -746
- package/examples/feature-demos/theme-preset-project/.astro/collections/site.schema.json +0 -59
- package/examples/feature-demos/theme-preset-project/.astro/collections/sitewide.schema.json +0 -138
- package/examples/feature-demos/theme-preset-project/.astro/collections/theme.schema.json +0 -755
- package/examples/feature-demos/theme-preset-project/.astro/content-assets.mjs +0 -4
- package/examples/feature-demos/theme-preset-project/.astro/content-modules.mjs +0 -1
- package/examples/feature-demos/theme-preset-project/.astro/content.d.ts +0 -183
- package/examples/feature-demos/theme-preset-project/.astro/data-store.json +0 -1
- package/examples/feature-demos/theme-preset-project/.astro/dev-local.json +0 -8
- package/examples/feature-demos/theme-preset-project/.astro/dev.json +0 -15
- package/examples/feature-demos/theme-preset-project/.astro/dev.log +0 -164
- package/examples/feature-demos/theme-preset-project/.astro/settings.json +0 -5
- package/examples/feature-demos/theme-preset-project/.astro/types.d.ts +0 -2
- package/examples/feature-demos/theme-preset-project/README.md +0 -16
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/_metadata.json +0 -80
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/embla-carousel.js +0 -1389
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/embla-carousel.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/package.json +0 -3
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-project/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/content.md +0 -31
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/boxer-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/grass-puppy.jpg +0 -0
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/grey-street-dog.jpg +0 -0
- package/examples/feature-demos/theme-preset-project/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-project/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-statement/README.md +0 -16
- package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-statement/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/content.md +0 -31
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/black-pedigree.jpg +0 -0
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/sheepdog-grass.jpg +0 -0
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/sheepdog-wide.jpg +0 -0
- package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-statement/site/theme.yaml +0 -1
- package/fixtures/basic/site/.norna/generated-images.json +0 -1
- package/fixtures/basic/site/config.yaml +0 -1
- package/fixtures/basic/site/pages/000-home/content.md +0 -14
- package/fixtures/basic/site/pages/000-home/images/.gitkeep +0 -1
- package/fixtures/basic/site/public/robots.txt +0 -2
- package/fixtures/basic/site/sitewide-content.yaml +0 -3
- package/fixtures/basic/site/theme.yaml +0 -1
- package/fixtures/content-model-v2/.astro/collections/site.schema.json +0 -776
- package/fixtures/content-model-v2/.astro/collections/theme.schema.json +0 -668
- package/fixtures/content-model-v2/.astro/content-assets.mjs +0 -4
- package/fixtures/content-model-v2/.astro/content-modules.mjs +0 -1
- package/fixtures/content-model-v2/.astro/content.d.ts +0 -175
- package/fixtures/content-model-v2/.astro/data-store.json +0 -1
- package/fixtures/content-model-v2/.astro/dev-local.json +0 -8
- package/fixtures/content-model-v2/.astro/dev.json +0 -13
- package/fixtures/content-model-v2/.astro/dev.log +0 -231
- package/fixtures/content-model-v2/.astro/settings.json +0 -5
- package/fixtures/content-model-v2/.astro/types.d.ts +0 -2
- package/fixtures/content-model-v2/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
- package/fixtures/content-model-v2/dist/_astro/SitePage.BbfZub4g.css +0 -1
- package/fixtures/content-model-v2/dist/guide/index.html +0 -3
- package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-971.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-971.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-971.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-960.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-768.webp +0 -0
- package/fixtures/content-model-v2/dist/index.html +0 -8
- package/fixtures/content-model-v2/node_modules/.vite/deps/_metadata.json +0 -80
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
- package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js +0 -1389
- package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
- package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
- package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/package.json +0 -3
- package/fixtures/content-model-v2/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
- package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
- package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
- package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
- package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
- package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
- package/fixtures/content-model-v2/site/.norna/generated-images.json +0 -210
- package/fixtures/content-model-v2/site/config.yaml +0 -1
- package/fixtures/content-model-v2/site/pages/000-home/content.md +0 -79
- package/fixtures/content-model-v2/site/pages/000-home/images/adopt.svg +0 -9
- package/fixtures/content-model-v2/site/pages/000-home/images/detail.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/duplicate.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/foster.svg +0 -12
- package/fixtures/content-model-v2/site/pages/000-home/images/hero.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/image.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/slide-one.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/slide-three.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/slide-two.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/010-guide/content.md +0 -18
- package/fixtures/content-model-v2/site/pages/010-guide/images/duplicate.jpg +0 -0
- package/fixtures/content-model-v2/site/theme.yaml +0 -4
- package/fixtures/nested-pages/.astro/collections/site.schema.json +0 -35
- package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +0 -97
- package/fixtures/nested-pages/.astro/collections/theme.schema.json +0 -844
- package/fixtures/nested-pages/.astro/content-assets.mjs +0 -4
- package/fixtures/nested-pages/.astro/content-modules.mjs +0 -1
- package/fixtures/nested-pages/.astro/content.d.ts +0 -183
- package/fixtures/nested-pages/.astro/data-store.json +0 -1
- package/fixtures/nested-pages/.astro/dev-local.json +0 -8
- package/fixtures/nested-pages/.astro/dev.log +0 -1128
- package/fixtures/nested-pages/.astro/settings.json +0 -5
- package/fixtures/nested-pages/.astro/types.d.ts +0 -2
- package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +0 -74
- package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
- package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
- package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
- package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
- package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/package.json +0 -3
- package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
- package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
- package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
- package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
- package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
- package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
- package/fixtures/nested-pages/site/.norna/generated-images.json +0 -10
- package/fixtures/nested-pages/site/config.yaml +0 -3
- package/fixtures/nested-pages/site/pages/000-home/content.md +0 -15
- package/fixtures/nested-pages/site/pages/010-guides/content.md +0 -15
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +0 -21
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +0 -21
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +0 -18
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +0 -2
- package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +0 -11
- package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +0 -9
- package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +0 -7
- package/fixtures/nested-pages/site/pages/020-reference/content.md +0 -10
- package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +0 -11
- package/fixtures/nested-pages/site/theme.yaml +0 -1
- package/scripts/build-pages.mjs +0 -69
- package/scripts/lib/example-sites.mjs +0 -49
- package/scripts/lib/frontmatter-yaml.mjs +0 -113
- package/scripts/lib/git-status.mjs +0 -7
- package/scripts/release.mjs +0 -153
- package/scripts/test-banner-visibility.mjs +0 -80
- package/scripts/test-ci-lockfile.mjs +0 -65
- package/scripts/test-cli-discovery.mjs +0 -124
- package/scripts/test-client-javascript.mjs +0 -225
- package/scripts/test-content-check.mjs +0 -621
- package/scripts/test-content-model-v2.mjs +0 -1693
- package/scripts/test-documentation.mjs +0 -189
- package/scripts/test-editor-language-service.mjs +0 -305
- package/scripts/test-engine-commands.mjs +0 -204
- package/scripts/test-examples.mjs +0 -53
- package/scripts/test-heading-ids.mjs +0 -68
- package/scripts/test-navigation-model.mjs +0 -63
- package/scripts/test-navigation-preview.mjs +0 -108
- package/scripts/test-navigation.mjs +0 -157
- package/scripts/test-nested-pages.mjs +0 -125
- package/scripts/test-package-check.mjs +0 -500
- package/scripts/test-page-model.mjs +0 -108
- package/scripts/test-project-config.mjs +0 -139
- package/scripts/test-schemas.mjs +0 -169
- package/scripts/test-site-public.mjs +0 -85
- package/scripts/test-theme-presets.mjs +0 -188
- package/src/components/SiteNotesScript.astro +0 -43
- package/starters/project/.github/workflows/deploy.yml +0 -64
- package/starters/project/README.md +0 -84
- package/starters/project/package-lock.json +0 -4296
- package/starters/project/package.json +0 -37
- package/starters/project/site/config.yaml +0 -1
- package/starters/project/site/pages/000-home/content.md +0 -119
- package/starters/project/site/pages/010-guide/content.md +0 -80
- package/starters/project/site/public/robots.txt +0 -2
- package/starters/project/site/sitewide-content.yaml +0 -3
- package/starters/project/site/theme.yaml +0 -1
- package/tsconfig.json +0 -5
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import { spawnSync } from 'node:child_process';
|
|
3
|
-
import { mkdir, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
import { getShortGitStatusPath, parseShortGitStatus } from './lib/git-status.mjs';
|
|
8
|
-
import { typographyProfiles, typographyRhythms } from './lib/typography.mjs';
|
|
9
|
-
|
|
10
|
-
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
11
|
-
const cliPath = path.join(repoRoot, 'bin', 'norna.mjs');
|
|
12
|
-
const packageJson = JSON.parse(await readFile(path.join(repoRoot, 'package.json'), 'utf8'));
|
|
13
|
-
const tempRoot = await mkdtemp(path.join(tmpdir(), 'norna-engine-commands-'));
|
|
14
|
-
|
|
15
|
-
const runCli = (args, options = {}) => spawnSync(process.execPath, [cliPath, ...args], {
|
|
16
|
-
cwd: repoRoot,
|
|
17
|
-
encoding: 'utf8',
|
|
18
|
-
...options,
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
const releaseStatus = parseShortGitStatus(' M package-lock.json\n M schemas/theme.schema.json\n');
|
|
23
|
-
assert.deepEqual(releaseStatus, [' M package-lock.json', ' M schemas/theme.schema.json']);
|
|
24
|
-
assert.equal(getShortGitStatusPath(releaseStatus[0]), 'package-lock.json');
|
|
25
|
-
|
|
26
|
-
const versionResult = runCli(['engine:version']);
|
|
27
|
-
assert.equal(versionResult.status, 0, versionResult.stderr || versionResult.stdout);
|
|
28
|
-
assert.match(versionResult.stdout, /norna engine:version/);
|
|
29
|
-
assert.match(versionResult.stdout, new RegExp(`Installed norna: ${packageJson.version.replaceAll('.', '\\.')}`));
|
|
30
|
-
assert.match(versionResult.stdout, /Installed Astro: /);
|
|
31
|
-
|
|
32
|
-
const deployHelpResult = runCli(['deploy', '--help']);
|
|
33
|
-
assert.equal(deployHelpResult.status, 0, deployHelpResult.stderr || deployHelpResult.stdout);
|
|
34
|
-
assert.match(deployHelpResult.stdout, /already committed default branch/);
|
|
35
|
-
const deployWatchHelpResult = runCli(['deploy:watch', '--help']);
|
|
36
|
-
assert.equal(deployWatchHelpResult.status, 0, deployWatchHelpResult.stderr || deployWatchHelpResult.stdout);
|
|
37
|
-
assert.match(deployWatchHelpResult.stdout, /Default: current repository/);
|
|
38
|
-
assert.match(deployWatchHelpResult.stdout, /Default: repository default branch/);
|
|
39
|
-
assert.match(deployWatchHelpResult.stdout, /Default: deploy\.yml/);
|
|
40
|
-
|
|
41
|
-
const directSiteRoot = path.join(tempRoot, 'current-directory-site');
|
|
42
|
-
await mkdir(path.join(directSiteRoot, 'pages', '000-home'), { recursive: true });
|
|
43
|
-
await writeFile(path.join(directSiteRoot, 'config.yaml'), 'url: https://example.com/\n');
|
|
44
|
-
await writeFile(path.join(directSiteRoot, 'pages', '000-home', 'content.md'), '# Direct Site\n\n## Intro {#intro}\n\nText.\n');
|
|
45
|
-
const directSiteProjectRoot = await realpath(tempRoot);
|
|
46
|
-
const directSiteDoctorResult = runCli(['doctor'], {
|
|
47
|
-
cwd: directSiteRoot,
|
|
48
|
-
});
|
|
49
|
-
assert.equal(directSiteDoctorResult.status, 0, directSiteDoctorResult.stderr || directSiteDoctorResult.stdout);
|
|
50
|
-
assert.ok(directSiteDoctorResult.stdout.includes(`Site project root: ${directSiteProjectRoot}`));
|
|
51
|
-
assert.match(directSiteDoctorResult.stdout, /Site directory: current-directory-site/);
|
|
52
|
-
|
|
53
|
-
const initializedSiteRoot = path.join(tempRoot, 'initialized-site');
|
|
54
|
-
const initResult = runCli(['init', initializedSiteRoot]);
|
|
55
|
-
assert.equal(initResult.status, 0, initResult.stderr || initResult.stdout);
|
|
56
|
-
assert.match(initResult.stdout, /Created norna site at /);
|
|
57
|
-
assert.match(initResult.stdout, /npm run norna:dev/);
|
|
58
|
-
|
|
59
|
-
const initializedPackageJson = JSON.parse(await readFile(path.join(initializedSiteRoot, 'package.json'), 'utf8'));
|
|
60
|
-
assert.equal(initializedPackageJson.dependencies['@janga/norna'], packageJson.version);
|
|
61
|
-
assert.equal(initializedPackageJson.scripts['norna:check'], 'norna check');
|
|
62
|
-
assert.equal(initializedPackageJson.scripts['norna:engine:update'], 'norna engine:update');
|
|
63
|
-
assert.equal(initializedPackageJson.scripts['norna:engine:version'], 'norna engine:version');
|
|
64
|
-
assert.equal(initializedPackageJson.scripts['norna:theme:presets'], 'norna theme:presets');
|
|
65
|
-
assert.equal(initializedPackageJson.scripts['norna:theme:export'], 'norna theme:export');
|
|
66
|
-
assert.equal(initializedPackageJson.scripts['engine:update'], undefined);
|
|
67
|
-
assert.equal(initializedPackageJson.scripts['engine:version'], undefined);
|
|
68
|
-
const checkResult = runCli(['--site-dir', path.join(initializedSiteRoot, 'site'), 'check']);
|
|
69
|
-
assert.equal(checkResult.status, 0, checkResult.stderr || checkResult.stdout);
|
|
70
|
-
assert.match(checkResult.stdout, /Config check passed\./);
|
|
71
|
-
assert.match(checkResult.stdout, /Content check passed\./);
|
|
72
|
-
|
|
73
|
-
const profilesResult = runCli(['typography', 'profiles']);
|
|
74
|
-
assert.equal(profilesResult.status, 0, profilesResult.stderr || profilesResult.stdout);
|
|
75
|
-
assert.match(profilesResult.stdout, /restrained:/);
|
|
76
|
-
assert.match(profilesResult.stdout, /reading:/);
|
|
77
|
-
assert.match(profilesResult.stdout, /rhythms:/);
|
|
78
|
-
assert.match(profilesResult.stdout, /normal:/);
|
|
79
|
-
for (const [profileName, profile] of Object.entries(typographyProfiles)) {
|
|
80
|
-
for (const [level, heading] of Object.entries(profile.headings)) {
|
|
81
|
-
assert.equal(heading.size, 'medium', `${profileName} ${level} should use medium size`);
|
|
82
|
-
assert.ok([400, 500, 600, 700].includes(heading.weight), `${profileName} ${level} should use a supported weight`);
|
|
83
|
-
}
|
|
84
|
-
assert.equal(profile.body.size, 'medium', `${profileName} body should use medium size`);
|
|
85
|
-
assert.ok(['narrow', 'normal', 'wide'].includes(profile.body.width), `${profileName} body should use a supported width`);
|
|
86
|
-
assert.equal(profile.caption.size, 'medium', `${profileName} caption should use medium size`);
|
|
87
|
-
}
|
|
88
|
-
for (const [rhythmName, rhythm] of Object.entries(typographyRhythms)) {
|
|
89
|
-
for (const [level, heading] of Object.entries(rhythm.headings)) {
|
|
90
|
-
assert.match(heading.spacingBefore, /^(0|[\d.]+em)$/, `${rhythmName} ${level} spacingBefore should be text-relative`);
|
|
91
|
-
assert.match(heading.spacingAfter, /^[\d.]+em$/, `${rhythmName} ${level} spacingAfter should be text-relative`);
|
|
92
|
-
}
|
|
93
|
-
assert.match(rhythm.body.paragraphSpacing, /^[\d.]+em$/, `${rhythmName} body paragraphSpacing should be text-relative`);
|
|
94
|
-
assert.match(rhythm.caption.spacingBefore, /^[\d.]+em$/, `${rhythmName} caption spacingBefore should be text-relative`);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const showResult = runCli(['--site-dir', path.join(initializedSiteRoot, 'site'), 'typography', 'show']);
|
|
98
|
-
assert.equal(showResult.status, 0, showResult.stderr || showResult.stdout);
|
|
99
|
-
assert.match(showResult.stdout, /theme:/);
|
|
100
|
-
assert.match(showResult.stdout, /pages:/);
|
|
101
|
-
assert.match(showResult.stdout, /\s+\/:/);
|
|
102
|
-
assert.match(showResult.stdout, /value: reading/);
|
|
103
|
-
assert.match(showResult.stdout, /source: "site\/theme\.yaml"/);
|
|
104
|
-
assert.match(showResult.stdout, /intro:/);
|
|
105
|
-
|
|
106
|
-
const initAgainResult = runCli(['init', initializedSiteRoot]);
|
|
107
|
-
assert.notEqual(initAgainResult.status, 0);
|
|
108
|
-
assert.match(initAgainResult.stderr, /Target directory must be empty/);
|
|
109
|
-
|
|
110
|
-
const customStandaloneSiteRoot = path.join(tempRoot, 'custom-standalone-site');
|
|
111
|
-
const customStandaloneInitResult = runCli(['init', customStandaloneSiteRoot, '--type', 'standalone', '--site-dir', 'presentation']);
|
|
112
|
-
assert.equal(customStandaloneInitResult.status, 0, customStandaloneInitResult.stderr || customStandaloneInitResult.stdout);
|
|
113
|
-
const customStandalonePackageJson = JSON.parse(await readFile(path.join(customStandaloneSiteRoot, 'package.json'), 'utf8'));
|
|
114
|
-
assert.equal(customStandalonePackageJson.scripts.dev, 'npm run norna:dev --');
|
|
115
|
-
assert.equal(customStandalonePackageJson.scripts.build, 'npm run norna:build');
|
|
116
|
-
assert.equal(customStandalonePackageJson.scripts['norna:dev'], 'norna --site-dir presentation dev:local');
|
|
117
|
-
assert.equal(customStandalonePackageJson.scripts['norna:check'], 'norna --site-dir presentation check');
|
|
118
|
-
assert.equal(customStandalonePackageJson.scripts['norna:build'], 'norna --site-dir presentation build');
|
|
119
|
-
await readFile(path.join(customStandaloneSiteRoot, 'presentation', 'pages', '000-home', 'content.md'));
|
|
120
|
-
await readFile(path.join(customStandaloneSiteRoot, 'presentation', 'config.yaml'));
|
|
121
|
-
await readFile(path.join(customStandaloneSiteRoot, 'presentation', 'theme.yaml'));
|
|
122
|
-
|
|
123
|
-
const mixedProjectRoot = path.join(tempRoot, 'mixed-project');
|
|
124
|
-
await mkdir(mixedProjectRoot, { recursive: true });
|
|
125
|
-
await writeFile(path.join(mixedProjectRoot, 'package.json'), `${JSON.stringify({
|
|
126
|
-
name: 'mixed-project',
|
|
127
|
-
private: true,
|
|
128
|
-
type: 'module',
|
|
129
|
-
scripts: {
|
|
130
|
-
build: 'node build-app.mjs',
|
|
131
|
-
},
|
|
132
|
-
}, null, 2)}\n`);
|
|
133
|
-
const embeddedInitResult = runCli(['init', '.', '--type', 'embedded', '--site-dir', 'presentation'], {
|
|
134
|
-
cwd: mixedProjectRoot,
|
|
135
|
-
});
|
|
136
|
-
assert.equal(embeddedInitResult.status, 0, embeddedInitResult.stderr || embeddedInitResult.stdout);
|
|
137
|
-
assert.match(embeddedInitResult.stdout, /Added norna site directory at /);
|
|
138
|
-
const mixedPackageJson = JSON.parse(await readFile(path.join(mixedProjectRoot, 'package.json'), 'utf8'));
|
|
139
|
-
assert.equal(mixedPackageJson.dependencies['@janga/norna'], packageJson.version);
|
|
140
|
-
assert.equal(mixedPackageJson.scripts.build, 'node build-app.mjs');
|
|
141
|
-
assert.equal(mixedPackageJson.scripts.dev, undefined);
|
|
142
|
-
assert.equal(mixedPackageJson.scripts['norna:dev'], 'norna --site-dir presentation dev:local');
|
|
143
|
-
assert.equal(mixedPackageJson.scripts['norna:check'], 'norna --site-dir presentation check');
|
|
144
|
-
assert.equal(mixedPackageJson.scripts['norna:engine:update'], 'norna --site-dir presentation engine:update');
|
|
145
|
-
assert.equal(mixedPackageJson.scripts['norna:engine:version'], 'norna --site-dir presentation engine:version');
|
|
146
|
-
await readFile(path.join(mixedProjectRoot, 'presentation', 'pages', '000-home', 'content.md'));
|
|
147
|
-
await readFile(path.join(mixedProjectRoot, 'presentation', 'config.yaml'));
|
|
148
|
-
await readFile(path.join(mixedProjectRoot, 'presentation', 'theme.yaml'));
|
|
149
|
-
|
|
150
|
-
const conflictProjectRoot = path.join(tempRoot, 'conflict-project');
|
|
151
|
-
await mkdir(conflictProjectRoot, { recursive: true });
|
|
152
|
-
await writeFile(path.join(conflictProjectRoot, 'package.json'), `${JSON.stringify({
|
|
153
|
-
name: 'conflict-project',
|
|
154
|
-
private: true,
|
|
155
|
-
scripts: {
|
|
156
|
-
'norna:dev': 'vite --host 0.0.0.0',
|
|
157
|
-
},
|
|
158
|
-
}, null, 2)}\n`);
|
|
159
|
-
const conflictInitResult = runCli(['init', '.', '--type', 'embedded', '--site-dir', 'presentation'], {
|
|
160
|
-
cwd: conflictProjectRoot,
|
|
161
|
-
});
|
|
162
|
-
assert.notEqual(conflictInitResult.status, 0);
|
|
163
|
-
assert.match(conflictInitResult.stderr, /Refusing to overwrite existing npm scripts/);
|
|
164
|
-
assert.match(conflictInitResult.stderr, /norna:dev/);
|
|
165
|
-
|
|
166
|
-
const standaloneIntoExistingProjectResult = runCli(['init', '.', '--type', 'standalone'], {
|
|
167
|
-
cwd: mixedProjectRoot,
|
|
168
|
-
});
|
|
169
|
-
assert.notEqual(standaloneIntoExistingProjectResult.status, 0);
|
|
170
|
-
assert.match(standaloneIntoExistingProjectResult.stderr, /use --type embedded/);
|
|
171
|
-
|
|
172
|
-
const updateFromEngineResult = runCli(['engine:update', '--skip-checks']);
|
|
173
|
-
assert.notEqual(updateFromEngineResult.status, 0);
|
|
174
|
-
assert.match(updateFromEngineResult.stderr, /must be run from a site repository/);
|
|
175
|
-
|
|
176
|
-
const releaseHelpResult = spawnSync(process.execPath, [path.join(repoRoot, 'scripts', 'release.mjs'), 'patch', '--help'], {
|
|
177
|
-
cwd: repoRoot,
|
|
178
|
-
encoding: 'utf8',
|
|
179
|
-
});
|
|
180
|
-
assert.equal(releaseHelpResult.status, 0, releaseHelpResult.stderr || releaseHelpResult.stdout);
|
|
181
|
-
assert.match(releaseHelpResult.stdout, /Usage: node scripts\/release\.mjs/);
|
|
182
|
-
const releaseSource = await readFile(path.join(repoRoot, 'scripts', 'release.mjs'), 'utf8');
|
|
183
|
-
const releaseSteps = [
|
|
184
|
-
"['version', releaseType, '--no-git-tag-version']",
|
|
185
|
-
"['run', 'schemas:generate']",
|
|
186
|
-
"['test']",
|
|
187
|
-
"['commit', '-m', `Release ${releaseTag}`]",
|
|
188
|
-
"['tag', '-a', releaseTag, '-m', `Release ${releaseTag}`]",
|
|
189
|
-
"['run', 'release:publish']",
|
|
190
|
-
"['push', '--follow-tags']",
|
|
191
|
-
];
|
|
192
|
-
for (const step of releaseSteps) assert.ok(releaseSource.includes(step), `Missing release step: ${step}`);
|
|
193
|
-
for (let index = 1; index < releaseSteps.length; index += 1) {
|
|
194
|
-
assert.ok(
|
|
195
|
-
releaseSource.indexOf(releaseSteps[index - 1]) < releaseSource.indexOf(releaseSteps[index]),
|
|
196
|
-
`Release step is out of order: ${releaseSteps[index]}`,
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
assert.match(releaseSource, /rollbackPreparedRelease/);
|
|
200
|
-
|
|
201
|
-
console.log('ok - engine commands report versions, initialize sites, guard engine self-updates, and document release usage');
|
|
202
|
-
} finally {
|
|
203
|
-
await rm(tempRoot, { force: true, recursive: true });
|
|
204
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
import { getExampleSites } from './lib/example-sites.mjs';
|
|
8
|
-
import { runInherit } from './lib/run-command.mjs';
|
|
9
|
-
|
|
10
|
-
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
11
|
-
const cliPath = path.join(root, 'bin', 'norna.mjs');
|
|
12
|
-
const examples = await getExampleSites(root);
|
|
13
|
-
|
|
14
|
-
const discoveryRoot = await mkdtemp(path.join(tmpdir(), 'norna-example-discovery-'));
|
|
15
|
-
try {
|
|
16
|
-
for (const category of ['complete-sites', 'feature-demos']) {
|
|
17
|
-
await mkdir(path.join(discoveryRoot, 'examples', category), { recursive: true });
|
|
18
|
-
}
|
|
19
|
-
const validSite = path.join(discoveryRoot, 'examples', 'complete-sites', 'valid', 'site');
|
|
20
|
-
await mkdir(path.join(validSite, 'pages', '000-home'), { recursive: true });
|
|
21
|
-
await writeFile(path.join(validSite, 'config.yaml'), 'url: https://example.com/\n');
|
|
22
|
-
await writeFile(path.join(validSite, 'pages', '000-home', 'content.md'), '# Example\n');
|
|
23
|
-
await mkdir(path.join(
|
|
24
|
-
discoveryRoot,
|
|
25
|
-
'examples',
|
|
26
|
-
'feature-demos',
|
|
27
|
-
'removed-example',
|
|
28
|
-
'site',
|
|
29
|
-
'.norna',
|
|
30
|
-
'public',
|
|
31
|
-
'images',
|
|
32
|
-
'generated',
|
|
33
|
-
), { recursive: true });
|
|
34
|
-
|
|
35
|
-
const discovered = await getExampleSites(discoveryRoot);
|
|
36
|
-
assert.deepEqual(discovered.map(({ name }) => name), ['valid']);
|
|
37
|
-
} finally {
|
|
38
|
-
await rm(discoveryRoot, { recursive: true, force: true });
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
for (const example of examples) {
|
|
42
|
-
console.log(`\nBuilding ${example.siteLabel}`);
|
|
43
|
-
await runInherit(process.execPath, [cliPath, '--site-dir', example.siteLabel, 'build'], { cwd: root });
|
|
44
|
-
|
|
45
|
-
if (['svg', 'png', 'jpg', 'jpeg'].some((extension) => existsSync(path.join(example.siteDirectory, 'public', `logo.${extension}`)))) {
|
|
46
|
-
const homepageHtml = await readFile(path.join(root, 'dist', 'index.html'), 'utf8');
|
|
47
|
-
if (!homepageHtml.includes('class="site-brand-logo"')) {
|
|
48
|
-
throw new Error(`Example ${example.siteLabel} has a logo file that is not rendered on its homepage.`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
console.log(`\nok - built ${examples.length} example sites`);
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import {
|
|
3
|
-
formatHeadingIdentifierIssue,
|
|
4
|
-
getHeadingIdentifierIssues,
|
|
5
|
-
getMarkdownHeadings,
|
|
6
|
-
slugifyHeadingText,
|
|
7
|
-
} from './lib/heading-ids.mjs';
|
|
8
|
-
|
|
9
|
-
assert.equal(slugifyHeadingText('Förstå Norna'), 'forsta-norna');
|
|
10
|
-
assert.equal(slugifyHeadingText('Café Über Straße'), 'cafe-uber-strasse');
|
|
11
|
-
assert.equal(slugifyHeadingText('Smørrebrød & œuvre'), 'smorrebrod-oeuvre');
|
|
12
|
-
assert.equal(slugifyHeadingText("What's new?"), 'whats-new');
|
|
13
|
-
|
|
14
|
-
const { headings } = await getMarkdownHeadings(`# Page title
|
|
15
|
-
|
|
16
|
-
## A **bold** [heading](https://example.com)
|
|
17
|
-
|
|
18
|
-
### Café details
|
|
19
|
-
|
|
20
|
-
## Renamed heading {#stable-id}
|
|
21
|
-
|
|
22
|
-
\`\`\`md
|
|
23
|
-
## Not a heading
|
|
24
|
-
\`\`\`
|
|
25
|
-
`);
|
|
26
|
-
|
|
27
|
-
assert.deepEqual(
|
|
28
|
-
headings.map(({ depth, explicitId, id, title }) => ({ depth, explicitId, id, title })),
|
|
29
|
-
[
|
|
30
|
-
{ depth: 1, explicitId: null, id: null, title: 'Page title' },
|
|
31
|
-
{ depth: 2, explicitId: null, id: 'a-bold-heading', title: 'A bold heading' },
|
|
32
|
-
{ depth: 3, explicitId: null, id: 'cafe-details', title: 'Café details' },
|
|
33
|
-
{ depth: 2, explicitId: 'stable-id', id: 'stable-id', title: 'Renamed heading' },
|
|
34
|
-
],
|
|
35
|
-
);
|
|
36
|
-
assert.deepEqual(getHeadingIdentifierIssues(headings), []);
|
|
37
|
-
|
|
38
|
-
const collision = await getMarkdownHeadings(`# Page
|
|
39
|
-
|
|
40
|
-
## Förstå
|
|
41
|
-
|
|
42
|
-
### Forsta
|
|
43
|
-
`);
|
|
44
|
-
assert.equal(getHeadingIdentifierIssues(collision.headings)[0]?.code, 'duplicate-heading-id');
|
|
45
|
-
assert.equal(
|
|
46
|
-
formatHeadingIdentifierIssue(getHeadingIdentifierIssues(collision.headings)[0], 'site/pages/000-home/content.md'),
|
|
47
|
-
[
|
|
48
|
-
'site/pages/000-home/content.md: Two headings resolve to id "forsta".',
|
|
49
|
-
'- line 3: "Förstå"',
|
|
50
|
-
'- line 5: "Forsta"',
|
|
51
|
-
'Add a unique explicit id to at least one heading, for example {#forsta-details}.',
|
|
52
|
-
].join('\n'),
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
const invalid = await getMarkdownHeadings(`# Page
|
|
56
|
-
|
|
57
|
-
## Symbols 🎉
|
|
58
|
-
|
|
59
|
-
### 日本語
|
|
60
|
-
|
|
61
|
-
## Explicit {#Not Valid}
|
|
62
|
-
`);
|
|
63
|
-
assert.deepEqual(
|
|
64
|
-
getHeadingIdentifierIssues(invalid.headings).map(({ code }) => code),
|
|
65
|
-
['empty-heading-id', 'invalid-heading-id'],
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
console.log('Heading id tests passed.');
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import {
|
|
3
|
-
getAutomaticNavigationMode,
|
|
4
|
-
navigationModeNames,
|
|
5
|
-
resolveNavigationModel,
|
|
6
|
-
} from './lib/navigation-model.mjs';
|
|
7
|
-
|
|
8
|
-
const home = (headings = []) => ({
|
|
9
|
-
isHome: true,
|
|
10
|
-
listed: true,
|
|
11
|
-
depth: 1,
|
|
12
|
-
headings,
|
|
13
|
-
});
|
|
14
|
-
const page = (headings = [], overrides = {}) => ({
|
|
15
|
-
isHome: false,
|
|
16
|
-
listed: true,
|
|
17
|
-
depth: 1,
|
|
18
|
-
headings,
|
|
19
|
-
...overrides,
|
|
20
|
-
});
|
|
21
|
-
const h2 = { depth: 2 };
|
|
22
|
-
const h3 = { depth: 3 };
|
|
23
|
-
|
|
24
|
-
assert.deepEqual(navigationModeNames, ['automatic', 'sections', 'top', 'tree']);
|
|
25
|
-
assert.equal(getAutomaticNavigationMode([home([h2, h3])]), 'sections');
|
|
26
|
-
assert.equal(getAutomaticNavigationMode([home([h2]), page([h2])]), 'top');
|
|
27
|
-
assert.equal(getAutomaticNavigationMode([home([h2]), page([h2, h3])]), 'tree');
|
|
28
|
-
assert.equal(
|
|
29
|
-
getAutomaticNavigationMode([home([h2]), page([h2, h3], { listed: false })]),
|
|
30
|
-
'sections',
|
|
31
|
-
);
|
|
32
|
-
assert.equal(
|
|
33
|
-
getAutomaticNavigationMode([home([h2]), page([], { depth: 2 })]),
|
|
34
|
-
'top',
|
|
35
|
-
);
|
|
36
|
-
assert.equal(
|
|
37
|
-
getAutomaticNavigationMode([home([h2]), page([h2], { depth: 2 })]),
|
|
38
|
-
'tree',
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
for (const mode of ['sections', 'top', 'tree']) {
|
|
42
|
-
const resolved = resolveNavigationModel({
|
|
43
|
-
mode,
|
|
44
|
-
pages: [home([h2]), page([h2, h3])],
|
|
45
|
-
});
|
|
46
|
-
assert.equal(resolved.requestedMode, mode);
|
|
47
|
-
assert.equal(resolved.mode, mode);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const automatic = resolveNavigationModel({
|
|
51
|
-
pages: [home([h2]), page([h2, h3])],
|
|
52
|
-
});
|
|
53
|
-
assert.equal(automatic.requestedMode, 'automatic');
|
|
54
|
-
assert.equal(automatic.mode, 'tree');
|
|
55
|
-
assert.equal(automatic.listedPageCount, 2);
|
|
56
|
-
assert.equal(automatic.maximumDepth, 3);
|
|
57
|
-
|
|
58
|
-
assert.throws(
|
|
59
|
-
() => resolveNavigationModel({ mode: 'sidebar', pages: [home()] }),
|
|
60
|
-
/Unknown navigation mode "sidebar".*automatic, sections, top, tree/,
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
console.log('Navigation model test passed.');
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
|
|
3
|
-
const root = process.cwd();
|
|
4
|
-
const host = 'localhost';
|
|
5
|
-
const port = 4322;
|
|
6
|
-
const url = `http://${host}:${port}/`;
|
|
7
|
-
const probeUrls = [url, `http://127.0.0.1:${port}/`, `http://[::1]:${port}/`];
|
|
8
|
-
const npmBin = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
9
|
-
|
|
10
|
-
const sleep = (milliseconds) => new Promise((resolve) => {
|
|
11
|
-
setTimeout(resolve, milliseconds);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
const runInherit = (command, args, options = {}) => new Promise((resolve, reject) => {
|
|
15
|
-
const child = spawn(command, args, {
|
|
16
|
-
cwd: root,
|
|
17
|
-
stdio: 'inherit',
|
|
18
|
-
...options,
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
child.once('error', reject);
|
|
22
|
-
child.once('exit', (code, signal) => {
|
|
23
|
-
if (code === 0) {
|
|
24
|
-
resolve();
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const commandText = [command, ...args].join(' ');
|
|
29
|
-
reject(new Error(signal
|
|
30
|
-
? `${commandText} exited with signal ${signal}.`
|
|
31
|
-
: `${commandText} exited with code ${code}.`));
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const isReachable = async () => {
|
|
36
|
-
for (const probeUrl of probeUrls) {
|
|
37
|
-
try {
|
|
38
|
-
const response = await fetch(probeUrl, { signal: AbortSignal.timeout(1_000) });
|
|
39
|
-
await response.arrayBuffer();
|
|
40
|
-
return response.ok;
|
|
41
|
-
} catch {
|
|
42
|
-
// Try the next loopback address.
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return false;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const waitForPreview = async (previewProcess) => {
|
|
50
|
-
const startedAt = Date.now();
|
|
51
|
-
const timeoutMs = 30_000;
|
|
52
|
-
|
|
53
|
-
while (Date.now() - startedAt < timeoutMs) {
|
|
54
|
-
if (previewProcess.exitCode !== null) {
|
|
55
|
-
throw new Error(`astro preview exited before ${url} became reachable.`);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (await isReachable()) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
await sleep(500);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
throw new Error(`Timed out waiting for ${url}`);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const stopPreview = async (previewProcess) => {
|
|
69
|
-
if (!previewProcess || previewProcess.exitCode !== null) return;
|
|
70
|
-
|
|
71
|
-
previewProcess.kill('SIGTERM');
|
|
72
|
-
|
|
73
|
-
const stopped = await Promise.race([
|
|
74
|
-
new Promise((resolve) => {
|
|
75
|
-
previewProcess.once('exit', () => resolve(true));
|
|
76
|
-
}),
|
|
77
|
-
sleep(5_000).then(() => false),
|
|
78
|
-
]);
|
|
79
|
-
|
|
80
|
-
if (!stopped && previewProcess.exitCode === null) {
|
|
81
|
-
previewProcess.kill('SIGKILL');
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
let previewProcess;
|
|
86
|
-
|
|
87
|
-
try {
|
|
88
|
-
await runInherit(npmBin, ['run', 'build']);
|
|
89
|
-
|
|
90
|
-
previewProcess = spawn(npmBin, ['run', 'astro', '--', 'preview', '--host', host, '--port', String(port)], {
|
|
91
|
-
cwd: root,
|
|
92
|
-
stdio: 'inherit',
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
previewProcess.once('error', (error) => {
|
|
96
|
-
throw error;
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
await waitForPreview(previewProcess);
|
|
100
|
-
await runInherit(npmBin, ['exec', '--', 'playwright', 'test', 'tests/navigation-preview.spec.ts'], {
|
|
101
|
-
env: {
|
|
102
|
-
...process.env,
|
|
103
|
-
PLAYWRIGHT_BASE_URL: url,
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
} finally {
|
|
107
|
-
await stopPreview(previewProcess);
|
|
108
|
-
}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import net from 'node:net';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
|
|
6
|
-
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
7
|
-
const cliPath = path.join(root, 'bin', 'norna.mjs');
|
|
8
|
-
const host = '127.0.0.1';
|
|
9
|
-
const npmBin = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
10
|
-
const cliArguments = process.argv.slice(2);
|
|
11
|
-
const siteDirOptionIndex = cliArguments.indexOf('--site-dir');
|
|
12
|
-
const configuredSiteDir = siteDirOptionIndex === -1
|
|
13
|
-
? path.join('examples', 'feature-demos', 'media-and-surfaces', 'site')
|
|
14
|
-
: cliArguments[siteDirOptionIndex + 1];
|
|
15
|
-
if (!configuredSiteDir || configuredSiteDir.startsWith('--')) {
|
|
16
|
-
throw new Error('Use --site-dir <path> to select a navigation test site.');
|
|
17
|
-
}
|
|
18
|
-
if (siteDirOptionIndex !== -1) cliArguments.splice(siteDirOptionIndex, 2);
|
|
19
|
-
const navigationDemoSiteDir = path.resolve(root, configuredSiteDir);
|
|
20
|
-
const testTargets = cliArguments;
|
|
21
|
-
const playwrightTargets = testTargets.length > 0 ? testTargets : ['tests/navigation.spec.ts'];
|
|
22
|
-
|
|
23
|
-
const sleep = (milliseconds) => new Promise((resolve) => {
|
|
24
|
-
setTimeout(resolve, milliseconds);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const getAvailablePort = () => new Promise((resolve, reject) => {
|
|
28
|
-
const server = net.createServer();
|
|
29
|
-
server.unref();
|
|
30
|
-
server.once('error', reject);
|
|
31
|
-
server.listen(0, host, () => {
|
|
32
|
-
const address = server.address();
|
|
33
|
-
const port = typeof address === 'object' && address ? address.port : null;
|
|
34
|
-
server.close((error) => {
|
|
35
|
-
if (error) {
|
|
36
|
-
reject(error);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
resolve(port);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
const port = await getAvailablePort();
|
|
45
|
-
if (!port) throw new Error('Could not reserve a port for the navigation test server.');
|
|
46
|
-
const url = `http://${host}:${port}/`;
|
|
47
|
-
|
|
48
|
-
const isReachable = async () => {
|
|
49
|
-
try {
|
|
50
|
-
const response = await fetch(url, { signal: AbortSignal.timeout(1_000) });
|
|
51
|
-
await response.arrayBuffer();
|
|
52
|
-
return response.ok;
|
|
53
|
-
} catch {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const waitForServer = async (serverProcess) => {
|
|
59
|
-
const startedAt = Date.now();
|
|
60
|
-
const timeoutMs = 30_000;
|
|
61
|
-
|
|
62
|
-
while (Date.now() - startedAt < timeoutMs) {
|
|
63
|
-
if (serverProcess.exitCode !== null) {
|
|
64
|
-
throw new Error(`Navigation test server exited before ${url} became reachable.`);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (await isReachable()) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
await sleep(500);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
throw new Error(`Timed out waiting for ${url}`);
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const runInherit = (command, args, options = {}) => new Promise((resolve, reject) => {
|
|
78
|
-
const child = spawn(command, args, {
|
|
79
|
-
cwd: root,
|
|
80
|
-
stdio: 'inherit',
|
|
81
|
-
...options,
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
child.once('error', reject);
|
|
85
|
-
child.once('exit', (code, signal) => {
|
|
86
|
-
if (code === 0) {
|
|
87
|
-
resolve();
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const commandText = [command, ...args].join(' ');
|
|
92
|
-
reject(new Error(signal
|
|
93
|
-
? `${commandText} exited with signal ${signal}.`
|
|
94
|
-
: `${commandText} exited with code ${code}.`));
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
const startServer = async () => {
|
|
99
|
-
await runInherit(process.execPath, [cliPath, 'site:public'], {
|
|
100
|
-
cwd: navigationDemoSiteDir,
|
|
101
|
-
});
|
|
102
|
-
await runInherit(process.execPath, [cliPath, 'images'], {
|
|
103
|
-
cwd: navigationDemoSiteDir,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
const serverProcess = spawn(process.execPath, [
|
|
107
|
-
cliPath,
|
|
108
|
-
'astro',
|
|
109
|
-
'dev',
|
|
110
|
-
'--ignore-lock',
|
|
111
|
-
'--host',
|
|
112
|
-
host,
|
|
113
|
-
'--port',
|
|
114
|
-
String(port),
|
|
115
|
-
], {
|
|
116
|
-
cwd: navigationDemoSiteDir,
|
|
117
|
-
stdio: 'inherit',
|
|
118
|
-
env: {
|
|
119
|
-
...process.env,
|
|
120
|
-
ASTRO_DEV_BACKGROUND: '0',
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
serverProcess.once('error', (error) => {
|
|
124
|
-
throw error;
|
|
125
|
-
});
|
|
126
|
-
await waitForServer(serverProcess);
|
|
127
|
-
|
|
128
|
-
return serverProcess;
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
const stopServer = async (serverProcess) => {
|
|
132
|
-
if (!serverProcess || serverProcess.exitCode !== null) return;
|
|
133
|
-
|
|
134
|
-
serverProcess.kill('SIGTERM');
|
|
135
|
-
const stopped = await Promise.race([
|
|
136
|
-
new Promise((resolve) => serverProcess.once('exit', () => resolve(true))),
|
|
137
|
-
sleep(5_000).then(() => false),
|
|
138
|
-
]);
|
|
139
|
-
|
|
140
|
-
if (!stopped && serverProcess.exitCode === null) {
|
|
141
|
-
serverProcess.kill('SIGKILL');
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
let serverProcess;
|
|
146
|
-
|
|
147
|
-
try {
|
|
148
|
-
serverProcess = await startServer();
|
|
149
|
-
await runInherit(npmBin, ['exec', '--', 'playwright', 'test', ...playwrightTargets], {
|
|
150
|
-
env: {
|
|
151
|
-
...process.env,
|
|
152
|
-
PLAYWRIGHT_BASE_URL: url,
|
|
153
|
-
},
|
|
154
|
-
});
|
|
155
|
-
} finally {
|
|
156
|
-
await stopServer(serverProcess);
|
|
157
|
-
}
|