mordoc 0.1.13 → 1.0.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 +7 -0
- package/bin/cli.js +24 -71
- package/dist/cli/asset-rewrite.d.ts +40 -0
- package/dist/cli/asset-rewrite.d.ts.map +1 -0
- package/dist/cli/asset-rewrite.js +67 -0
- package/dist/cli/asset-rewrite.js.map +1 -0
- package/dist/cli/build.d.ts +45 -15
- package/dist/cli/build.d.ts.map +1 -1
- package/dist/cli/build.js +186 -101
- package/dist/cli/build.js.map +1 -1
- package/dist/cli/dev.d.ts +26 -14
- package/dist/cli/dev.d.ts.map +1 -1
- package/dist/cli/dev.js +116 -159
- package/dist/cli/dev.js.map +1 -1
- package/dist/cli/pagefind-indexer.d.ts +15 -0
- package/dist/cli/pagefind-indexer.d.ts.map +1 -0
- package/dist/cli/pagefind-indexer.js +68 -0
- package/dist/cli/pagefind-indexer.js.map +1 -0
- package/dist/cli/paths.d.ts +26 -0
- package/dist/cli/paths.d.ts.map +1 -0
- package/dist/cli/paths.js +32 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/ssg-runner.d.ts +58 -0
- package/dist/cli/ssg-runner.d.ts.map +1 -0
- package/dist/cli/ssg-runner.js +126 -0
- package/dist/cli/ssg-runner.js.map +1 -0
- package/dist/config/assets-loader.d.ts +11 -0
- package/dist/config/assets-loader.d.ts.map +1 -0
- package/dist/config/assets-loader.js +46 -0
- package/dist/config/assets-loader.js.map +1 -0
- package/dist/config/language-loader.d.ts +11 -0
- package/dist/config/language-loader.d.ts.map +1 -0
- package/dist/config/language-loader.js +61 -0
- package/dist/config/language-loader.js.map +1 -0
- package/dist/config/language.d.ts +11 -0
- package/dist/config/language.d.ts.map +1 -0
- package/dist/config/language.js +61 -0
- package/dist/config/language.js.map +1 -0
- package/dist/config/sidenav-loader.d.ts +14 -0
- package/dist/config/sidenav-loader.d.ts.map +1 -0
- package/dist/config/sidenav-loader.js +78 -0
- package/dist/config/sidenav-loader.js.map +1 -0
- package/dist/config/site-loader.d.ts +11 -0
- package/dist/config/site-loader.d.ts.map +1 -0
- package/dist/config/site-loader.js +72 -0
- package/dist/config/site-loader.js.map +1 -0
- package/dist/config/site.d.ts +11 -0
- package/dist/config/site.d.ts.map +1 -0
- package/dist/config/site.js +72 -0
- package/dist/config/site.js.map +1 -0
- package/dist/config/topnav-loader.d.ts +10 -0
- package/dist/config/topnav-loader.d.ts.map +1 -0
- package/dist/config/topnav-loader.js +78 -0
- package/dist/config/topnav-loader.js.map +1 -0
- package/dist/config/translations-loader.d.ts +7 -0
- package/dist/config/translations-loader.d.ts.map +1 -0
- package/dist/config/translations-loader.js +51 -0
- package/dist/config/translations-loader.js.map +1 -0
- package/dist/content/content-loader.d.ts +16 -0
- package/dist/content/content-loader.d.ts.map +1 -0
- package/dist/content/content-loader.js +126 -0
- package/dist/content/content-loader.js.map +1 -0
- package/dist/content/content-parser.d.ts +12 -0
- package/dist/content/content-parser.d.ts.map +1 -0
- package/dist/content/content-parser.js +54 -0
- package/dist/content/content-parser.js.map +1 -0
- package/dist/content/content-transformer.d.ts +17 -0
- package/dist/content/content-transformer.d.ts.map +1 -0
- package/dist/content/content-transformer.js +94 -0
- package/dist/content/content-transformer.js.map +1 -0
- package/dist/content/markdoc-config.d.ts +13 -0
- package/dist/content/markdoc-config.d.ts.map +1 -0
- package/dist/content/markdoc-config.js +210 -0
- package/dist/content/markdoc-config.js.map +1 -0
- package/dist/content/slug.d.ts +26 -0
- package/dist/content/slug.d.ts.map +1 -0
- package/dist/content/slug.js +31 -0
- package/dist/content/slug.js.map +1 -0
- package/dist/pipeline.d.ts +61 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +123 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/types/assets.d.ts +15 -0
- package/dist/types/assets.d.ts.map +1 -0
- package/dist/types/assets.js +2 -0
- package/dist/types/assets.js.map +1 -0
- package/dist/types/content.d.ts +114 -32
- package/dist/types/content.d.ts.map +1 -1
- package/dist/types/content.js +1 -6
- package/dist/types/content.js.map +1 -1
- package/dist/types/language.d.ts +9 -0
- package/dist/types/language.d.ts.map +1 -0
- package/dist/types/language.js +2 -0
- package/dist/types/language.js.map +1 -0
- package/dist/types/navigation.d.ts +24 -36
- package/dist/types/navigation.d.ts.map +1 -1
- package/dist/types/navigation.js +1 -6
- package/dist/types/navigation.js.map +1 -1
- package/dist/types/pipeline.d.ts +70 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +2 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/types/site.d.ts +20 -0
- package/dist/types/site.d.ts.map +1 -0
- package/dist/types/site.js +2 -0
- package/dist/types/site.js.map +1 -0
- package/dist/utils/lang-utils.d.ts +23 -0
- package/dist/utils/lang-utils.d.ts.map +1 -0
- package/dist/utils/lang-utils.js +40 -0
- package/dist/utils/lang-utils.js.map +1 -0
- package/dist/utils/paths.d.ts +25 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +31 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/vite/plugin.d.ts +93 -0
- package/dist/vite/plugin.d.ts.map +1 -0
- package/dist/vite/plugin.js +435 -0
- package/dist/vite/plugin.js.map +1 -0
- package/package.json +46 -61
- package/src/app/App.module.css +82 -0
- package/src/app/App.tsx +95 -0
- package/src/app/content/Content.module.css +357 -0
- package/src/app/content/Content.tsx +212 -0
- package/src/app/content/callout/Callout.module.css +110 -0
- package/src/app/content/callout/Callout.tsx +82 -0
- package/src/app/content/card/Card.module.css +146 -0
- package/src/app/content/card/Card.tsx +110 -0
- package/src/app/content/card/CardGrid.module.css +22 -0
- package/src/app/content/card/CardGrid.tsx +34 -0
- package/src/app/content/code-block/CodeBlock.module.css +237 -0
- package/src/app/content/code-block/CodeBlock.tsx +123 -0
- package/src/app/content/heading/Heading.module.css +52 -0
- package/src/app/content/heading/Heading.tsx +75 -0
- package/src/app/content/image/Image.module.css +113 -0
- package/src/app/content/image/Image.tsx +98 -0
- package/src/app/content/link/ContentLink.tsx +46 -0
- package/src/app/data-context.tsx +39 -0
- package/src/app/entry-server.tsx +58 -0
- package/src/app/footer/Footer.module.css +36 -0
- package/src/app/footer/Footer.tsx +28 -0
- package/src/app/globals.d.ts +40 -0
- package/src/app/header/Header.module.css +205 -0
- package/src/app/header/Header.tsx +188 -0
- package/src/app/header/LanguagePicker.module.css +97 -0
- package/src/app/header/LanguagePicker.tsx +174 -0
- package/src/app/header/SearchBar.module.css +92 -0
- package/src/app/header/SearchBar.tsx +37 -0
- package/src/app/header/SearchModal.module.css +185 -0
- package/src/app/header/SearchModal.tsx +245 -0
- package/src/app/header/Topnav.module.css +37 -0
- package/src/app/header/Topnav.tsx +30 -0
- package/src/app/index.css +119 -0
- package/src/app/index.html +13 -0
- package/src/app/landing/LandingPage.module.css +14 -0
- package/src/app/landing/LandingPage.tsx +62 -0
- package/src/app/landing/button/Button.module.css +37 -0
- package/src/app/landing/button/Button.tsx +50 -0
- package/src/app/landing/hero/Hero.module.css +108 -0
- package/src/app/landing/hero/Hero.tsx +81 -0
- package/src/app/landing/section/Section.module.css +100 -0
- package/src/app/landing/section/Section.tsx +61 -0
- package/src/app/lang-utils.ts +11 -0
- package/src/app/main.tsx +67 -0
- package/src/app/not-found/NotFound.module.css +92 -0
- package/src/app/not-found/NotFound.tsx +34 -0
- package/src/app/routes.tsx +86 -0
- package/src/app/sidenav/Sidenav.module.css +239 -0
- package/src/app/sidenav/Sidenav.tsx +182 -0
- package/src/app/skeleton/Skeleton.module.css +100 -0
- package/src/app/skeleton/Skeleton.tsx +75 -0
- package/src/app/toc/Toc.module.css +59 -0
- package/src/app/toc/Toc.tsx +77 -0
- package/src/app/tsconfig.json +18 -0
- package/src/app/virtual-modules.d.ts +74 -0
- package/dist/assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
- package/dist/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf +0 -0
- package/dist/assets/fonts/inter/OFL.txt +0 -93
- package/dist/build/Builder.d.ts +0 -92
- package/dist/build/Builder.d.ts.map +0 -1
- package/dist/build/Builder.js +0 -394
- package/dist/build/Builder.js.map +0 -1
- package/dist/build/ClientBundler.d.ts +0 -48
- package/dist/build/ClientBundler.d.ts.map +0 -1
- package/dist/build/ClientBundler.js +0 -169
- package/dist/build/ClientBundler.js.map +0 -1
- package/dist/build/HtmlGenerator.d.ts +0 -46
- package/dist/build/HtmlGenerator.d.ts.map +0 -1
- package/dist/build/HtmlGenerator.js +0 -190
- package/dist/build/HtmlGenerator.js.map +0 -1
- package/dist/build/SearchIndexer.d.ts +0 -31
- package/dist/build/SearchIndexer.d.ts.map +0 -1
- package/dist/build/SearchIndexer.js +0 -116
- package/dist/build/SearchIndexer.js.map +0 -1
- package/dist/bundles/client.js +0 -126
- package/dist/cli/create-app.d.ts +0 -14
- package/dist/cli/create-app.d.ts.map +0 -1
- package/dist/cli/create-app.js +0 -241
- package/dist/cli/create-app.js.map +0 -1
- package/dist/client/App.d.ts +0 -17
- package/dist/client/App.d.ts.map +0 -1
- package/dist/client/App.js +0 -91
- package/dist/client/App.js.map +0 -1
- package/dist/client/contexts/ConfigContext.d.ts +0 -22
- package/dist/client/contexts/ConfigContext.d.ts.map +0 -1
- package/dist/client/contexts/ConfigContext.js +0 -27
- package/dist/client/contexts/ConfigContext.js.map +0 -1
- package/dist/client/contexts/ContentContext.d.ts +0 -31
- package/dist/client/contexts/ContentContext.d.ts.map +0 -1
- package/dist/client/contexts/ContentContext.js +0 -46
- package/dist/client/contexts/ContentContext.js.map +0 -1
- package/dist/client/contexts/SearchContext.d.ts +0 -38
- package/dist/client/contexts/SearchContext.d.ts.map +0 -1
- package/dist/client/contexts/SearchContext.js +0 -185
- package/dist/client/contexts/SearchContext.js.map +0 -1
- package/dist/client/contexts/ThemeContext.d.ts +0 -23
- package/dist/client/contexts/ThemeContext.d.ts.map +0 -1
- package/dist/client/contexts/ThemeContext.js +0 -53
- package/dist/client/contexts/ThemeContext.js.map +0 -1
- package/dist/client/hooks/useContent.d.ts +0 -12
- package/dist/client/hooks/useContent.d.ts.map +0 -1
- package/dist/client/hooks/useContent.js +0 -74
- package/dist/client/hooks/useContent.js.map +0 -1
- package/dist/client/hooks/useNavigation.d.ts +0 -15
- package/dist/client/hooks/useNavigation.d.ts.map +0 -1
- package/dist/client/hooks/useNavigation.js +0 -101
- package/dist/client/hooks/useNavigation.js.map +0 -1
- package/dist/client/hooks/useSearch.d.ts +0 -22
- package/dist/client/hooks/useSearch.d.ts.map +0 -1
- package/dist/client/hooks/useSearch.js +0 -64
- package/dist/client/hooks/useSearch.js.map +0 -1
- package/dist/client/main.d.ts +0 -5
- package/dist/client/main.d.ts.map +0 -1
- package/dist/client/main.js +0 -66
- package/dist/client/main.js.map +0 -1
- package/dist/components/Callout.d.ts +0 -9
- package/dist/components/Callout.d.ts.map +0 -1
- package/dist/components/Callout.js +0 -24
- package/dist/components/Callout.js.map +0 -1
- package/dist/components/Card.d.ts +0 -10
- package/dist/components/Card.d.ts.map +0 -1
- package/dist/components/Card.js +0 -15
- package/dist/components/Card.js.map +0 -1
- package/dist/components/CardGrid.d.ts +0 -8
- package/dist/components/CardGrid.d.ts.map +0 -1
- package/dist/components/CardGrid.js +0 -9
- package/dist/components/CardGrid.js.map +0 -1
- package/dist/components/CodeBlock.d.ts +0 -28
- package/dist/components/CodeBlock.d.ts.map +0 -1
- package/dist/components/CodeBlock.js +0 -80
- package/dist/components/CodeBlock.js.map +0 -1
- package/dist/components/ContentPage.d.ts +0 -9
- package/dist/components/ContentPage.d.ts.map +0 -1
- package/dist/components/ContentPage.js +0 -102
- package/dist/components/ContentPage.js.map +0 -1
- package/dist/components/Header.d.ts +0 -14
- package/dist/components/Header.d.ts.map +0 -1
- package/dist/components/Header.js +0 -30
- package/dist/components/Header.js.map +0 -1
- package/dist/components/Heading.d.ts +0 -16
- package/dist/components/Heading.d.ts.map +0 -1
- package/dist/components/Heading.js +0 -31
- package/dist/components/Heading.js.map +0 -1
- package/dist/components/Image.d.ts +0 -8
- package/dist/components/Image.d.ts.map +0 -1
- package/dist/components/Image.js +0 -24
- package/dist/components/Image.js.map +0 -1
- package/dist/components/Layout.d.ts +0 -14
- package/dist/components/Layout.d.ts.map +0 -1
- package/dist/components/Layout.js +0 -32
- package/dist/components/Layout.js.map +0 -1
- package/dist/components/MarkdocRenderer.d.ts +0 -15
- package/dist/components/MarkdocRenderer.d.ts.map +0 -1
- package/dist/components/MarkdocRenderer.js +0 -73
- package/dist/components/MarkdocRenderer.js.map +0 -1
- package/dist/components/MobileMenu.d.ts +0 -14
- package/dist/components/MobileMenu.d.ts.map +0 -1
- package/dist/components/MobileMenu.js +0 -45
- package/dist/components/MobileMenu.js.map +0 -1
- package/dist/components/PageNavigation.d.ts +0 -9
- package/dist/components/PageNavigation.d.ts.map +0 -1
- package/dist/components/PageNavigation.js +0 -23
- package/dist/components/PageNavigation.js.map +0 -1
- package/dist/components/SearchModal.d.ts +0 -9
- package/dist/components/SearchModal.d.ts.map +0 -1
- package/dist/components/SearchModal.js +0 -74
- package/dist/components/SearchModal.js.map +0 -1
- package/dist/components/SideNav.d.ts +0 -9
- package/dist/components/SideNav.d.ts.map +0 -1
- package/dist/components/SideNav.js +0 -66
- package/dist/components/SideNav.js.map +0 -1
- package/dist/components/TableOfContents.d.ts +0 -10
- package/dist/components/TableOfContents.d.ts.map +0 -1
- package/dist/components/TableOfContents.js +0 -151
- package/dist/components/TableOfContents.js.map +0 -1
- package/dist/config/ConfigLoader.d.ts +0 -50
- package/dist/config/ConfigLoader.d.ts.map +0 -1
- package/dist/config/ConfigLoader.js +0 -214
- package/dist/config/ConfigLoader.js.map +0 -1
- package/dist/config/StyleCompiler.d.ts +0 -17
- package/dist/config/StyleCompiler.d.ts.map +0 -1
- package/dist/config/StyleCompiler.js +0 -116
- package/dist/config/StyleCompiler.js.map +0 -1
- package/dist/config/ThemeGenerator.d.ts +0 -14
- package/dist/config/ThemeGenerator.d.ts.map +0 -1
- package/dist/config/ThemeGenerator.js +0 -129
- package/dist/config/ThemeGenerator.js.map +0 -1
- package/dist/content/ContentLoader.d.ts +0 -70
- package/dist/content/ContentLoader.d.ts.map +0 -1
- package/dist/content/ContentLoader.js +0 -146
- package/dist/content/ContentLoader.js.map +0 -1
- package/dist/content/ContentProcessor.d.ts +0 -84
- package/dist/content/ContentProcessor.d.ts.map +0 -1
- package/dist/content/ContentProcessor.js +0 -380
- package/dist/content/ContentProcessor.js.map +0 -1
- package/dist/content/RouteManager.d.ts +0 -69
- package/dist/content/RouteManager.d.ts.map +0 -1
- package/dist/content/RouteManager.js +0 -143
- package/dist/content/RouteManager.js.map +0 -1
- package/dist/styles/components/callout.d.ts +0 -11
- package/dist/styles/components/callout.d.ts.map +0 -1
- package/dist/styles/components/callout.js +0 -87
- package/dist/styles/components/callout.js.map +0 -1
- package/dist/styles/components/card.d.ts +0 -11
- package/dist/styles/components/card.d.ts.map +0 -1
- package/dist/styles/components/card.js +0 -179
- package/dist/styles/components/card.js.map +0 -1
- package/dist/styles/components/codeblock.d.ts +0 -11
- package/dist/styles/components/codeblock.d.ts.map +0 -1
- package/dist/styles/components/codeblock.js +0 -251
- package/dist/styles/components/codeblock.js.map +0 -1
- package/dist/styles/components/content.d.ts +0 -11
- package/dist/styles/components/content.d.ts.map +0 -1
- package/dist/styles/components/content.js +0 -197
- package/dist/styles/components/content.js.map +0 -1
- package/dist/styles/components/fonts.d.ts +0 -11
- package/dist/styles/components/fonts.d.ts.map +0 -1
- package/dist/styles/components/fonts.js +0 -34
- package/dist/styles/components/fonts.js.map +0 -1
- package/dist/styles/components/header.d.ts +0 -11
- package/dist/styles/components/header.d.ts.map +0 -1
- package/dist/styles/components/header.js +0 -293
- package/dist/styles/components/header.js.map +0 -1
- package/dist/styles/components/heading.d.ts +0 -11
- package/dist/styles/components/heading.d.ts.map +0 -1
- package/dist/styles/components/heading.js +0 -115
- package/dist/styles/components/heading.js.map +0 -1
- package/dist/styles/components/layout.d.ts +0 -11
- package/dist/styles/components/layout.d.ts.map +0 -1
- package/dist/styles/components/layout.js +0 -79
- package/dist/styles/components/layout.js.map +0 -1
- package/dist/styles/components/mobilemenu.d.ts +0 -11
- package/dist/styles/components/mobilemenu.d.ts.map +0 -1
- package/dist/styles/components/mobilemenu.js +0 -112
- package/dist/styles/components/mobilemenu.js.map +0 -1
- package/dist/styles/components/reset.d.ts +0 -11
- package/dist/styles/components/reset.d.ts.map +0 -1
- package/dist/styles/components/reset.js +0 -131
- package/dist/styles/components/reset.js.map +0 -1
- package/dist/styles/components/searchmodal.d.ts +0 -11
- package/dist/styles/components/searchmodal.d.ts.map +0 -1
- package/dist/styles/components/searchmodal.js +0 -333
- package/dist/styles/components/searchmodal.js.map +0 -1
- package/dist/styles/components/sidenav.d.ts +0 -11
- package/dist/styles/components/sidenav.d.ts.map +0 -1
- package/dist/styles/components/sidenav.js +0 -212
- package/dist/styles/components/sidenav.js.map +0 -1
- package/dist/styles/components/toc.d.ts +0 -11
- package/dist/styles/components/toc.d.ts.map +0 -1
- package/dist/styles/components/toc.js +0 -120
- package/dist/styles/components/toc.js.map +0 -1
- package/dist/styles/components/typography.d.ts +0 -11
- package/dist/styles/components/typography.d.ts.map +0 -1
- package/dist/styles/components/typography.js +0 -248
- package/dist/styles/components/typography.js.map +0 -1
- package/dist/styles/components/utility.d.ts +0 -11
- package/dist/styles/components/utility.d.ts.map +0 -1
- package/dist/styles/components/utility.js +0 -231
- package/dist/styles/components/utility.js.map +0 -1
- package/dist/styles/types.d.ts +0 -79
- package/dist/styles/types.d.ts.map +0 -1
- package/dist/styles/types.js +0 -7
- package/dist/styles/types.js.map +0 -1
- package/dist/styles/utils.d.ts +0 -21
- package/dist/styles/utils.d.ts.map +0 -1
- package/dist/styles/utils.js +0 -50
- package/dist/styles/utils.js.map +0 -1
- package/dist/styles/variables/main.d.ts +0 -15
- package/dist/styles/variables/main.d.ts.map +0 -1
- package/dist/styles/variables/main.js +0 -116
- package/dist/styles/variables/main.js.map +0 -1
- package/dist/types/config.d.ts +0 -43
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -7
- package/dist/types/config.js.map +0 -1
- package/dist/utils/language-utils.d.ts +0 -41
- package/dist/utils/language-utils.d.ts.map +0 -1
- package/dist/utils/language-utils.js +0 -79
- package/dist/utils/language-utils.js.map +0 -1
- package/dist/utils/slugify.d.ts +0 -20
- package/dist/utils/slugify.d.ts.map +0 -1
- package/dist/utils/slugify.js +0 -44
- package/dist/utils/slugify.js.map +0 -1
- package/templates/default/config/favicon.ico +0 -0
- package/templates/default/config/logo-dark.png +0 -0
- package/templates/default/config/logo.png +0 -0
- package/templates/default/config/sidenav.yaml +0 -36
- package/templates/default/config/site.json +0 -16
- package/templates/default/config/styles/main.json +0 -6
- package/templates/default/config/styles/typography.json +0 -6
- package/templates/default/content/en/changelog.md +0 -35
- package/templates/default/content/en/faq.md +0 -50
- package/templates/default/content/en/field-manual/engines.md +0 -59
- package/templates/default/content/en/field-manual/relativity.md +0 -46
- package/templates/default/content/en/field-manual/safety.md +0 -44
- package/templates/default/content/en/field-manual.md +0 -22
- package/templates/default/content/en/flight-school/navigation.md +0 -61
- package/templates/default/content/en/flight-school/primer.md +0 -64
- package/templates/default/content/en/flight-school.md +0 -48
- package/templates/default/content/en/index.md +0 -83
- package/templates/default/content/en/ship-systems/flux-sails.md +0 -33
- package/templates/default/content/en/ship-systems/photonic-core.md +0 -39
- package/templates/default/content/en/ship-systems.md +0 -25
- package/templates/default/package.json +0 -21
- package/templates/default/public/icons/academy.svg +0 -15
- package/templates/default/public/icons/manual.svg +0 -16
- package/templates/default/public/icons/relativity.svg +0 -16
- package/templates/default/public/icons/systems.svg +0 -14
- package/templates/default/public/icons/warning.svg +0 -14
- package/templates/default/public/images/flux-sails.svg +0 -33
- package/templates/default/public/images/photonic-core.svg +0 -44
- package/templates/default/public/images/starwake.svg +0 -49
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
import type { MordocData } from '../types/pipeline.js';
|
|
3
|
+
/**
|
|
4
|
+
* The set of "eager" virtual module IDs this plugin exposes.
|
|
5
|
+
*
|
|
6
|
+
* Eager = loaded up-front by the React client shell. They hold the
|
|
7
|
+
* configs, a lightweight per-page route index, and a map of per-route
|
|
8
|
+
* lazy loaders. None of them carry the heavy per-page content.
|
|
9
|
+
*
|
|
10
|
+
* Per-route page chunks live under the `virtual:mordoc/page/<routePath>`
|
|
11
|
+
* prefix ({@link PAGE_MODULE_PREFIX}) and are loaded on navigation via
|
|
12
|
+
* the `virtual:mordoc/page-loaders` map.
|
|
13
|
+
*/
|
|
14
|
+
export declare const EAGER_VIRTUAL_IDS: readonly ["virtual:mordoc/site", "virtual:mordoc/language", "virtual:mordoc/navigation", "virtual:mordoc/assets", "virtual:mordoc/pages-index", "virtual:mordoc/page-loaders", "virtual:mordoc/translations"];
|
|
15
|
+
export type EagerVirtualId = typeof EAGER_VIRTUAL_IDS[number];
|
|
16
|
+
/**
|
|
17
|
+
* Prefix for lazy per-route page modules.
|
|
18
|
+
*
|
|
19
|
+
* The full id is `${PAGE_MODULE_PREFIX}${routePath}`. Because every
|
|
20
|
+
* routePath starts with `/`, concatenation yields clean ids like
|
|
21
|
+
* `virtual:mordoc/page/flight-manual/safety`, and the root route `/`
|
|
22
|
+
* yields `virtual:mordoc/page/` (trailing slash). No sentinels needed.
|
|
23
|
+
*/
|
|
24
|
+
export declare const PAGE_MODULE_PREFIX = "virtual:mordoc/page";
|
|
25
|
+
/**
|
|
26
|
+
* Builds the JS source for a given *eager* virtual module.
|
|
27
|
+
* Returns null if the id isn't one of ours.
|
|
28
|
+
*
|
|
29
|
+
* Pure function — no I/O, no Vite dependency. The plugin's `load` hook
|
|
30
|
+
* uses it at runtime; the `validate` CLI uses it to preview output for
|
|
31
|
+
* inspection without spinning up a dev server.
|
|
32
|
+
*
|
|
33
|
+
* Most cases emit plain `export default ${JSON.stringify(...)}` — a JSON
|
|
34
|
+
* literal is also a valid JS expression, and renderable trees are plain
|
|
35
|
+
* Markdoc Tag objects, also JSON-safe. The `page-loaders` case diverges
|
|
36
|
+
* because it must emit literal `import()` expressions rather than data.
|
|
37
|
+
*
|
|
38
|
+
* Lazy per-route modules (`virtual:mordoc/page/<routePath>`) go through
|
|
39
|
+
* {@link generatePageModule} instead.
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateVirtualModule(id: string, data: MordocData): string | null;
|
|
42
|
+
/**
|
|
43
|
+
* Builds the JS source for the lazy `virtual:mordoc/page/<routePath>`
|
|
44
|
+
* module that carries a single page's full `PageData`. Returns null if
|
|
45
|
+
* no page matches the given routePath.
|
|
46
|
+
*
|
|
47
|
+
* Pure function, mirrors {@link generateVirtualModule} for the lazy side.
|
|
48
|
+
*/
|
|
49
|
+
export declare function generatePageModule(routePath: string, data: MordocData): string | null;
|
|
50
|
+
export interface MordocVitePluginOptions {
|
|
51
|
+
/** Absolute path to the user's project root. */
|
|
52
|
+
projectRoot: string;
|
|
53
|
+
/**
|
|
54
|
+
* Pre-loaded pipeline output. When provided, the plugin skips its own
|
|
55
|
+
* `runPipeline(projectRoot)` call in `buildStart` and uses this value
|
|
56
|
+
* directly.
|
|
57
|
+
*
|
|
58
|
+
* The build command runs Vite twice (once for the client, once for the
|
|
59
|
+
* SSR entry) and both passes need the same `MordocData`. Letting the
|
|
60
|
+
* caller compute it once and inject it here avoids running the pipeline
|
|
61
|
+
* twice per build, and gives the build command a single point at which
|
|
62
|
+
* to mutate the data (e.g. rewriting asset paths) before either Vite
|
|
63
|
+
* pass starts.
|
|
64
|
+
*
|
|
65
|
+
* Dev path passes `projectRoot` only; this remains unset and the
|
|
66
|
+
* plugin runs the pipeline itself, exactly as before.
|
|
67
|
+
*/
|
|
68
|
+
data?: MordocData;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Vite plugin that exposes a Mordoc project's data to the React client
|
|
72
|
+
* via virtual modules.
|
|
73
|
+
*
|
|
74
|
+
* Lifecycle:
|
|
75
|
+
* - `buildStart`: runs the pipeline once and caches the result.
|
|
76
|
+
* Fires in both dev (when the server starts) and prod (before bundling).
|
|
77
|
+
* - `resolveId` / `load`: serves the cached data as virtual ES modules.
|
|
78
|
+
* Eager modules (configs, route index, loader map) resolve by exact id.
|
|
79
|
+
* Lazy per-route page modules resolve by `PAGE_MODULE_PREFIX` match.
|
|
80
|
+
* - `configureServer` (dev only, when `data` is not injected): watches
|
|
81
|
+
* `content/` and `config/`, refreshes the in-memory pipeline cache,
|
|
82
|
+
* triggers `reloadModule` for config-only eager updates, runs `runPipeline`
|
|
83
|
+
* when the route set may change, and sends a **full document reload** after
|
|
84
|
+
* granular `.md` edits so React Router picks up fresh loader data (invalidate
|
|
85
|
+
* lazy virtuals for SSR, then **full document reload**).
|
|
86
|
+
*
|
|
87
|
+
* Asset paths: in dev, `virtual:mordoc/assets` emits `/_assets/<basename>`
|
|
88
|
+
* web URLs and `configureServer` registers a middleware that serves those
|
|
89
|
+
* files from `<projectRoot>/config/assets/`. In build, `copyAndRewriteAssets`
|
|
90
|
+
* handles the rewrite before the plugin receives the data.
|
|
91
|
+
*/
|
|
92
|
+
export declare function mordocVitePlugin(options: MordocVitePluginOptions): Plugin;
|
|
93
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/vite/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAYlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,+MAQpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAmGxD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAmBjF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAIrF;AAwKD,MAAM,WAAW,uBAAuB;IACtC,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;;;;OAcG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAgIzE"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { loadAssets } from '../config/assets-loader.js';
|
|
4
|
+
import { loadSiteConfig } from '../config/site-loader.js';
|
|
5
|
+
import { loadNavigation, loadNavTranslations, pagesRouteSignature, replaceTransformedPage, reparsePage, runPipeline, } from '../pipeline.js';
|
|
6
|
+
/**
|
|
7
|
+
* The set of "eager" virtual module IDs this plugin exposes.
|
|
8
|
+
*
|
|
9
|
+
* Eager = loaded up-front by the React client shell. They hold the
|
|
10
|
+
* configs, a lightweight per-page route index, and a map of per-route
|
|
11
|
+
* lazy loaders. None of them carry the heavy per-page content.
|
|
12
|
+
*
|
|
13
|
+
* Per-route page chunks live under the `virtual:mordoc/page/<routePath>`
|
|
14
|
+
* prefix ({@link PAGE_MODULE_PREFIX}) and are loaded on navigation via
|
|
15
|
+
* the `virtual:mordoc/page-loaders` map.
|
|
16
|
+
*/
|
|
17
|
+
export const EAGER_VIRTUAL_IDS = [
|
|
18
|
+
'virtual:mordoc/site',
|
|
19
|
+
'virtual:mordoc/language',
|
|
20
|
+
'virtual:mordoc/navigation',
|
|
21
|
+
'virtual:mordoc/assets',
|
|
22
|
+
'virtual:mordoc/pages-index',
|
|
23
|
+
'virtual:mordoc/page-loaders',
|
|
24
|
+
'virtual:mordoc/translations',
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Prefix for lazy per-route page modules.
|
|
28
|
+
*
|
|
29
|
+
* The full id is `${PAGE_MODULE_PREFIX}${routePath}`. Because every
|
|
30
|
+
* routePath starts with `/`, concatenation yields clean ids like
|
|
31
|
+
* `virtual:mordoc/page/flight-manual/safety`, and the root route `/`
|
|
32
|
+
* yields `virtual:mordoc/page/` (trailing slash). No sentinels needed.
|
|
33
|
+
*/
|
|
34
|
+
export const PAGE_MODULE_PREFIX = 'virtual:mordoc/page';
|
|
35
|
+
/** Vite/Rollup convention: virtual modules are addressed with a leading null byte. */
|
|
36
|
+
const RESOLVED_PREFIX = '\0';
|
|
37
|
+
/** Virtual module ID for the user's optional config/theme.css. */
|
|
38
|
+
const THEME_CSS_ID = 'virtual:mordoc/theme';
|
|
39
|
+
/** Resolved ID used when config/theme.css does not exist — load returns empty. */
|
|
40
|
+
const RESOLVED_THEME_CSS_EMPTY = '\0virtual:mordoc/theme';
|
|
41
|
+
const EAGER_SET = new Set(EAGER_VIRTUAL_IDS);
|
|
42
|
+
/**
|
|
43
|
+
* Rewrites absolute disk paths in `ResolvedAssets` to `/_assets/<basename>`
|
|
44
|
+
* web URLs so the browser can fetch them from the dev middleware.
|
|
45
|
+
*/
|
|
46
|
+
function rewriteAssetsForDev(assets) {
|
|
47
|
+
const toUrl = (p) => p ? `/_assets/${path.basename(p)}` : null;
|
|
48
|
+
return {
|
|
49
|
+
favicon: toUrl(assets.favicon),
|
|
50
|
+
logo: toUrl(assets.logo),
|
|
51
|
+
logoDark: toUrl(assets.logoDark),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** True if `id` is a lazy per-route page module id (after prefix). */
|
|
55
|
+
function isPageModuleId(id) {
|
|
56
|
+
return id.startsWith(PAGE_MODULE_PREFIX + '/');
|
|
57
|
+
}
|
|
58
|
+
/** Extracts the routePath back out of a lazy page module id. */
|
|
59
|
+
function routePathFromPageModuleId(id) {
|
|
60
|
+
return id.slice(PAGE_MODULE_PREFIX.length);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Projects a `TransformedPage` down to its route identity.
|
|
64
|
+
*
|
|
65
|
+
* Everything else the page carries (frontmatter, TOC, renderable tree)
|
|
66
|
+
* ships with the per-route lazy chunk that the shell only fetches on
|
|
67
|
+
* navigation. See the rationale in the `PageMeta` type's doc comment.
|
|
68
|
+
*/
|
|
69
|
+
function toPageMeta(page) {
|
|
70
|
+
const meta = {
|
|
71
|
+
routePath: page.entry.routePath,
|
|
72
|
+
language: page.entry.language,
|
|
73
|
+
};
|
|
74
|
+
if (page.frontmatter.layout === 'landing') {
|
|
75
|
+
meta.layout = 'landing';
|
|
76
|
+
}
|
|
77
|
+
return meta;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Projects a `TransformedPage` into the shape shipped by the per-route
|
|
81
|
+
* lazy module — i.e. the payload of `virtual:mordoc/page/<routePath>`.
|
|
82
|
+
*/
|
|
83
|
+
function toPageData(page) {
|
|
84
|
+
return {
|
|
85
|
+
renderable: page.renderable,
|
|
86
|
+
frontmatter: page.frontmatter,
|
|
87
|
+
toc: page.toc,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Builds the JS source for the `virtual:mordoc/page-loaders` module.
|
|
92
|
+
*
|
|
93
|
+
* Unlike the other eager modules this one can't just JSON-stringify its
|
|
94
|
+
* payload: it needs to emit real JS containing a literal `import()`
|
|
95
|
+
* expression per route. Emitting literals (rather than one dynamic
|
|
96
|
+
* `import(\`…${routePath}\`)` at the call site) is what lets Vite/Rollup
|
|
97
|
+
* statically analyze, code-split, and preload each route's chunk.
|
|
98
|
+
*
|
|
99
|
+
* Output shape:
|
|
100
|
+
* export default {
|
|
101
|
+
* "/": () => import("virtual:mordoc/page/"),
|
|
102
|
+
* "/flight-manual": () => import("virtual:mordoc/page/flight-manual"),
|
|
103
|
+
* ...
|
|
104
|
+
* };
|
|
105
|
+
*
|
|
106
|
+
* `JSON.stringify` is used for both the object keys and the import
|
|
107
|
+
* specifiers — valid JSON strings are valid JS strings, so it handles
|
|
108
|
+
* any escaping the routePath might require.
|
|
109
|
+
*/
|
|
110
|
+
function generatePageLoadersSource(data) {
|
|
111
|
+
if (data.pages.length === 0) {
|
|
112
|
+
return 'export default {};';
|
|
113
|
+
}
|
|
114
|
+
const entries = data.pages.map((page) => {
|
|
115
|
+
const routePath = page.entry.routePath;
|
|
116
|
+
const key = JSON.stringify(routePath);
|
|
117
|
+
const specifier = JSON.stringify(`${PAGE_MODULE_PREFIX}${routePath}`);
|
|
118
|
+
return ` ${key}: () => import(${specifier})`;
|
|
119
|
+
});
|
|
120
|
+
return `export default {\n${entries.join(',\n')}\n};`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Builds the JS source for a given *eager* virtual module.
|
|
124
|
+
* Returns null if the id isn't one of ours.
|
|
125
|
+
*
|
|
126
|
+
* Pure function — no I/O, no Vite dependency. The plugin's `load` hook
|
|
127
|
+
* uses it at runtime; the `validate` CLI uses it to preview output for
|
|
128
|
+
* inspection without spinning up a dev server.
|
|
129
|
+
*
|
|
130
|
+
* Most cases emit plain `export default ${JSON.stringify(...)}` — a JSON
|
|
131
|
+
* literal is also a valid JS expression, and renderable trees are plain
|
|
132
|
+
* Markdoc Tag objects, also JSON-safe. The `page-loaders` case diverges
|
|
133
|
+
* because it must emit literal `import()` expressions rather than data.
|
|
134
|
+
*
|
|
135
|
+
* Lazy per-route modules (`virtual:mordoc/page/<routePath>`) go through
|
|
136
|
+
* {@link generatePageModule} instead.
|
|
137
|
+
*/
|
|
138
|
+
export function generateVirtualModule(id, data) {
|
|
139
|
+
switch (id) {
|
|
140
|
+
case 'virtual:mordoc/site':
|
|
141
|
+
return `export default ${JSON.stringify(data.site)};`;
|
|
142
|
+
case 'virtual:mordoc/language':
|
|
143
|
+
return `export default ${JSON.stringify(data.language)};`;
|
|
144
|
+
case 'virtual:mordoc/navigation':
|
|
145
|
+
return `export default ${JSON.stringify(data.navigation)};`;
|
|
146
|
+
case 'virtual:mordoc/assets':
|
|
147
|
+
return `export default ${JSON.stringify(data.assets)};`;
|
|
148
|
+
case 'virtual:mordoc/pages-index':
|
|
149
|
+
return `export default ${JSON.stringify(data.pages.map(toPageMeta))};`;
|
|
150
|
+
case 'virtual:mordoc/page-loaders':
|
|
151
|
+
return generatePageLoadersSource(data);
|
|
152
|
+
case 'virtual:mordoc/translations':
|
|
153
|
+
return `export default ${JSON.stringify(data.translations)};`;
|
|
154
|
+
default:
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Builds the JS source for the lazy `virtual:mordoc/page/<routePath>`
|
|
160
|
+
* module that carries a single page's full `PageData`. Returns null if
|
|
161
|
+
* no page matches the given routePath.
|
|
162
|
+
*
|
|
163
|
+
* Pure function, mirrors {@link generateVirtualModule} for the lazy side.
|
|
164
|
+
*/
|
|
165
|
+
export function generatePageModule(routePath, data) {
|
|
166
|
+
const page = data.pages.find((p) => p.entry.routePath === routePath);
|
|
167
|
+
if (!page)
|
|
168
|
+
return null;
|
|
169
|
+
return `export default ${JSON.stringify(toPageData(page))};`;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* absPath must be normalized absolute path.
|
|
173
|
+
*/
|
|
174
|
+
function forwardProjectRel(projectRoot, absPath) {
|
|
175
|
+
const rel = path.relative(projectRoot, absPath).split(path.sep).join('/');
|
|
176
|
+
if (rel.startsWith('..'))
|
|
177
|
+
return null;
|
|
178
|
+
return rel;
|
|
179
|
+
}
|
|
180
|
+
function resolvedVirtualId(virtualId) {
|
|
181
|
+
return RESOLVED_PREFIX + virtualId;
|
|
182
|
+
}
|
|
183
|
+
async function reloadVirtualModule(server, virtualId) {
|
|
184
|
+
const resolvedId = resolvedVirtualId(virtualId);
|
|
185
|
+
// Invalidate in the client module graph + trigger HMR
|
|
186
|
+
const clientMod = server.moduleGraph.getModuleById(resolvedId);
|
|
187
|
+
if (clientMod) {
|
|
188
|
+
server.moduleGraph.invalidateModule(clientMod);
|
|
189
|
+
}
|
|
190
|
+
// Invalidate in the SSR module graph so ssrLoadModule re-runs load()
|
|
191
|
+
const ssrMod = server.environments.ssr.moduleGraph.getModuleById(resolvedId);
|
|
192
|
+
if (ssrMod) {
|
|
193
|
+
server.environments.ssr.moduleGraph.invalidateModule(ssrMod);
|
|
194
|
+
}
|
|
195
|
+
// Trigger HMR for the client side
|
|
196
|
+
if (clientMod) {
|
|
197
|
+
await server.reloadModule(clientMod);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async function reloadAllMordocVirtualModules(server, pages) {
|
|
201
|
+
for (const id of EAGER_VIRTUAL_IDS) {
|
|
202
|
+
await reloadVirtualModule(server, id);
|
|
203
|
+
}
|
|
204
|
+
for (const page of pages) {
|
|
205
|
+
await reloadVirtualModule(server, `${PAGE_MODULE_PREFIX}${page.entry.routePath}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** Applies a debounced batch of `content/` + `config/` file events for dev HMR. */
|
|
209
|
+
async function applyMordocWatchBatch(server, projectRoot, batch, getData, setData) {
|
|
210
|
+
const data = getData();
|
|
211
|
+
if (!data || batch.size === 0)
|
|
212
|
+
return;
|
|
213
|
+
const rels = [...batch.keys()]
|
|
214
|
+
.map((abs) => ({ abs, rel: forwardProjectRel(projectRoot, abs) }))
|
|
215
|
+
.filter((x) => x.rel !== null);
|
|
216
|
+
const contentEvents = rels.filter(({ rel }) => rel.startsWith('content/'));
|
|
217
|
+
const configEvents = rels.filter(({ rel }) => rel.startsWith('config/'));
|
|
218
|
+
const hasContentStructural = contentEvents.some(({ abs }) => batch.get(abs) !== 'change');
|
|
219
|
+
// Any new/removed path under content ⇒ re-run pipeline.
|
|
220
|
+
if (hasContentStructural) {
|
|
221
|
+
await rerunPipelineForDev(server, projectRoot, getData, setData);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (configEvents.some(({ rel }) => rel === 'config/language.json')) {
|
|
225
|
+
await rerunPipelineForDev(server, projectRoot, getData, setData);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const siteRel = 'config/site.json';
|
|
229
|
+
if (configEvents.some(({ rel }) => rel === siteRel)) {
|
|
230
|
+
const site = await loadSiteConfig(projectRoot);
|
|
231
|
+
if (site.defaultLanguage !== data.site.defaultLanguage) {
|
|
232
|
+
await rerunPipelineForDev(server, projectRoot, getData, setData);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
data.site = site;
|
|
236
|
+
await reloadVirtualModule(server, 'virtual:mordoc/site');
|
|
237
|
+
}
|
|
238
|
+
const isNavStructureChange = configEvents.some(({ rel }) => rel.startsWith('config/navigation/') &&
|
|
239
|
+
!rel.startsWith('config/navigation/translations/'));
|
|
240
|
+
const isTranslationsChange = configEvents.some(({ rel }) => rel.startsWith('config/navigation/translations/'));
|
|
241
|
+
if (isNavStructureChange) {
|
|
242
|
+
data.navigation = await loadNavigation(projectRoot);
|
|
243
|
+
await reloadVirtualModule(server, 'virtual:mordoc/navigation');
|
|
244
|
+
}
|
|
245
|
+
if (isTranslationsChange) {
|
|
246
|
+
data.translations = await loadNavTranslations(projectRoot, data.language?.languages ?? [data.site.defaultLanguage], data.site.defaultLanguage);
|
|
247
|
+
await reloadVirtualModule(server, 'virtual:mordoc/translations');
|
|
248
|
+
}
|
|
249
|
+
const isAssetsPath = (rel) => rel === 'config/assets' || rel.startsWith('config/assets/');
|
|
250
|
+
if (configEvents.some(({ rel }) => isAssetsPath(rel))) {
|
|
251
|
+
data.assets = await loadAssets(projectRoot);
|
|
252
|
+
await reloadVirtualModule(server, 'virtual:mordoc/assets');
|
|
253
|
+
}
|
|
254
|
+
// Invalidate the lazy virtual module so Vite drops the stale cached version,
|
|
255
|
+
// then trigger a full browser reload so React Router re-runs the route loader
|
|
256
|
+
// against the freshly patched data.
|
|
257
|
+
const reparsedVirtualIds = [];
|
|
258
|
+
for (const { abs, rel } of contentEvents) {
|
|
259
|
+
if (batch.get(abs) !== 'change')
|
|
260
|
+
continue;
|
|
261
|
+
if (!rel.toLowerCase().endsWith('.md'))
|
|
262
|
+
continue;
|
|
263
|
+
const page = data.pages.find((p) => path.normalize(p.entry.filePath) === abs);
|
|
264
|
+
if (!page) {
|
|
265
|
+
await rerunPipelineForDev(server, projectRoot, getData, setData);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const reparsed = await reparsePage(page.entry);
|
|
269
|
+
replaceTransformedPage(data, reparsed);
|
|
270
|
+
reparsedVirtualIds.push(`${PAGE_MODULE_PREFIX}${reparsed.entry.routePath}`);
|
|
271
|
+
}
|
|
272
|
+
if (reparsedVirtualIds.length > 0) {
|
|
273
|
+
for (const virtualId of reparsedVirtualIds) {
|
|
274
|
+
await reloadVirtualModule(server, virtualId);
|
|
275
|
+
}
|
|
276
|
+
server.ws.send({ type: 'full-reload', path: '*' });
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
async function rerunPipelineForDev(server, projectRoot, getData, setData) {
|
|
280
|
+
const prev = getData();
|
|
281
|
+
if (!prev)
|
|
282
|
+
return;
|
|
283
|
+
const prevSig = pagesRouteSignature(prev.pages);
|
|
284
|
+
const next = await runPipeline(projectRoot);
|
|
285
|
+
const nextSig = pagesRouteSignature(next.pages);
|
|
286
|
+
setData(next);
|
|
287
|
+
if (prevSig !== nextSig) {
|
|
288
|
+
server.ws.send({ type: 'full-reload', path: '*' });
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
await reloadAllMordocVirtualModules(server, next.pages);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Vite plugin that exposes a Mordoc project's data to the React client
|
|
295
|
+
* via virtual modules.
|
|
296
|
+
*
|
|
297
|
+
* Lifecycle:
|
|
298
|
+
* - `buildStart`: runs the pipeline once and caches the result.
|
|
299
|
+
* Fires in both dev (when the server starts) and prod (before bundling).
|
|
300
|
+
* - `resolveId` / `load`: serves the cached data as virtual ES modules.
|
|
301
|
+
* Eager modules (configs, route index, loader map) resolve by exact id.
|
|
302
|
+
* Lazy per-route page modules resolve by `PAGE_MODULE_PREFIX` match.
|
|
303
|
+
* - `configureServer` (dev only, when `data` is not injected): watches
|
|
304
|
+
* `content/` and `config/`, refreshes the in-memory pipeline cache,
|
|
305
|
+
* triggers `reloadModule` for config-only eager updates, runs `runPipeline`
|
|
306
|
+
* when the route set may change, and sends a **full document reload** after
|
|
307
|
+
* granular `.md` edits so React Router picks up fresh loader data (invalidate
|
|
308
|
+
* lazy virtuals for SSR, then **full document reload**).
|
|
309
|
+
*
|
|
310
|
+
* Asset paths: in dev, `virtual:mordoc/assets` emits `/_assets/<basename>`
|
|
311
|
+
* web URLs and `configureServer` registers a middleware that serves those
|
|
312
|
+
* files from `<projectRoot>/config/assets/`. In build, `copyAndRewriteAssets`
|
|
313
|
+
* handles the rewrite before the plugin receives the data.
|
|
314
|
+
*/
|
|
315
|
+
export function mordocVitePlugin(options) {
|
|
316
|
+
// Seed the cache from the caller if data was injected; otherwise it
|
|
317
|
+
// gets filled by buildStart's own runPipeline call. Either way, every
|
|
318
|
+
// hook below sees a populated `data` by the time it runs.
|
|
319
|
+
let data = options.data ?? null;
|
|
320
|
+
return {
|
|
321
|
+
name: 'mordoc',
|
|
322
|
+
async buildStart() {
|
|
323
|
+
// Skip the pipeline if the caller already supplied data — the build
|
|
324
|
+
// command does this so the client and SSR Vite passes share one
|
|
325
|
+
// pipeline result. Dev (no `data`) still runs it here.
|
|
326
|
+
if (!data) {
|
|
327
|
+
data = await runPipeline(options.projectRoot);
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
configureServer(server) {
|
|
331
|
+
if (options.data) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const projectRoot = options.projectRoot;
|
|
335
|
+
let debounceTimer = null;
|
|
336
|
+
const pending = new Map();
|
|
337
|
+
const flush = async () => {
|
|
338
|
+
debounceTimer = null;
|
|
339
|
+
if (pending.size === 0)
|
|
340
|
+
return;
|
|
341
|
+
if (!data) {
|
|
342
|
+
debounceTimer = setTimeout(flush, 50);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const batch = new Map(pending);
|
|
346
|
+
pending.clear();
|
|
347
|
+
try {
|
|
348
|
+
await applyMordocWatchBatch(server, projectRoot, batch, () => data, (next) => {
|
|
349
|
+
data = next;
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
console.error('[mordoc] watch update failed:', err);
|
|
354
|
+
try {
|
|
355
|
+
const recovered = await runPipeline(projectRoot);
|
|
356
|
+
data = recovered;
|
|
357
|
+
await reloadAllMordocVirtualModules(server, recovered.pages);
|
|
358
|
+
server.ws.send({ type: 'full-reload', path: '*' });
|
|
359
|
+
}
|
|
360
|
+
catch (recoverErr) {
|
|
361
|
+
console.error('[mordoc] watch recovery failed:', recoverErr);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
const schedule = (absPath, event) => {
|
|
366
|
+
pending.set(absPath, event);
|
|
367
|
+
if (debounceTimer)
|
|
368
|
+
clearTimeout(debounceTimer);
|
|
369
|
+
debounceTimer = setTimeout(flush, 75);
|
|
370
|
+
};
|
|
371
|
+
server.watcher.add(path.join(projectRoot, 'content'));
|
|
372
|
+
server.watcher.add(path.join(projectRoot, 'config'));
|
|
373
|
+
server.watcher.on('all', (event, rawPath) => {
|
|
374
|
+
if (event !== 'add' && event !== 'change' && event !== 'unlink')
|
|
375
|
+
return;
|
|
376
|
+
const absPath = path.normalize(String(rawPath));
|
|
377
|
+
const rel = forwardProjectRel(projectRoot, absPath);
|
|
378
|
+
if (!rel)
|
|
379
|
+
return;
|
|
380
|
+
if (!rel.startsWith('content/') && !rel.startsWith('config/'))
|
|
381
|
+
return;
|
|
382
|
+
schedule(absPath, event);
|
|
383
|
+
});
|
|
384
|
+
},
|
|
385
|
+
resolveId(id) {
|
|
386
|
+
if (id === THEME_CSS_ID) {
|
|
387
|
+
const themePath = path.join(options.projectRoot, 'config', 'theme.css');
|
|
388
|
+
return fs.existsSync(themePath) ? themePath : RESOLVED_THEME_CSS_EMPTY;
|
|
389
|
+
}
|
|
390
|
+
if (EAGER_SET.has(id) || isPageModuleId(id)) {
|
|
391
|
+
return RESOLVED_PREFIX + id;
|
|
392
|
+
}
|
|
393
|
+
return null;
|
|
394
|
+
},
|
|
395
|
+
load(id) {
|
|
396
|
+
if (id === RESOLVED_THEME_CSS_EMPTY)
|
|
397
|
+
return '';
|
|
398
|
+
if (!id.startsWith(RESOLVED_PREFIX))
|
|
399
|
+
return null;
|
|
400
|
+
const virtualId = id.slice(RESOLVED_PREFIX.length);
|
|
401
|
+
const isEager = EAGER_SET.has(virtualId);
|
|
402
|
+
const isPage = isPageModuleId(virtualId);
|
|
403
|
+
if (!isEager && !isPage)
|
|
404
|
+
return null;
|
|
405
|
+
if (!data) {
|
|
406
|
+
// buildStart populates `data` before any load can happen; this
|
|
407
|
+
// guard exists only to surface an unexpected lifecycle ordering
|
|
408
|
+
// rather than silently emit a broken module.
|
|
409
|
+
throw new Error(`mordoc plugin: load("${id}") called before buildStart populated data.`);
|
|
410
|
+
}
|
|
411
|
+
if (isEager) {
|
|
412
|
+
// In dev (no injected data), rewrite asset disk paths to /_assets/ URLs
|
|
413
|
+
// so the browser can fetch them via the dev asset middleware.
|
|
414
|
+
if (virtualId === 'virtual:mordoc/assets' && !options.data) {
|
|
415
|
+
return generateVirtualModule(virtualId, {
|
|
416
|
+
...data,
|
|
417
|
+
assets: rewriteAssetsForDev(data.assets),
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
return generateVirtualModule(virtualId, data);
|
|
421
|
+
}
|
|
422
|
+
const routePath = routePathFromPageModuleId(virtualId);
|
|
423
|
+
const source = generatePageModule(routePath, data);
|
|
424
|
+
if (source === null) {
|
|
425
|
+
// Reaching here means a consumer imported a page module for a
|
|
426
|
+
// routePath that isn't in the pipeline output. The static
|
|
427
|
+
// `page-loaders` map only emits entries for known pages, so this
|
|
428
|
+
// should be unreachable in normal operation.
|
|
429
|
+
throw new Error(`mordoc plugin: no page found for routePath "${routePath}" (id: ${id}).`);
|
|
430
|
+
}
|
|
431
|
+
return source;
|
|
432
|
+
},
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/vite/plugin.ts"],"names":[],"mappings":"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"}
|