@rocket/js 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +233 -2
- package/dist-types/exports/MainMenu.d.ts +2 -0
- package/dist-types/exports/MainMenu.d.ts.map +1 -0
- package/dist-types/exports/PageData.d.ts +2 -0
- package/dist-types/exports/PageData.d.ts.map +1 -0
- package/dist-types/exports/RocketCodeBlock.d.ts +2 -0
- package/dist-types/exports/RocketCodeBlock.d.ts.map +1 -0
- package/dist-types/exports/RocketIcon.d.ts +2 -0
- package/dist-types/exports/RocketIcon.d.ts.map +1 -0
- package/dist-types/exports/RocketJsDemo.d.ts +2 -0
- package/dist-types/exports/RocketJsDemo.d.ts.map +1 -0
- package/dist-types/exports/RocketRequestDemo.d.ts +2 -0
- package/dist-types/exports/RocketRequestDemo.d.ts.map +1 -0
- package/dist-types/exports/SocialPreviewPlayground.d.ts +2 -0
- package/dist-types/exports/SocialPreviewPlayground.d.ts.map +1 -0
- package/dist-types/exports/adapters/netlify.d.ts +2 -0
- package/dist-types/exports/adapters/netlify.d.ts.map +1 -0
- package/dist-types/exports/asyncMessage.d.ts +2 -0
- package/dist-types/exports/asyncMessage.d.ts.map +1 -0
- package/dist-types/exports/component-hydration.d.ts +2 -0
- package/dist-types/exports/component-hydration.d.ts.map +1 -0
- package/dist-types/exports/components/web-awesome.d.ts +3 -0
- package/dist-types/exports/components/web-awesome.d.ts.map +1 -0
- package/dist-types/exports/components.d.ts +2 -0
- package/dist-types/exports/components.d.ts.map +1 -0
- package/dist-types/exports/config.d.ts +2 -0
- package/dist-types/exports/config.d.ts.map +1 -0
- package/dist-types/exports/debounce.d.ts +2 -0
- package/dist-types/exports/debounce.d.ts.map +1 -0
- package/dist-types/exports/define/RocketCodeBlock.d.ts +2 -0
- package/dist-types/exports/define/RocketCodeBlock.d.ts.map +1 -0
- package/dist-types/exports/define/RocketIcon.d.ts +2 -0
- package/dist-types/exports/define/RocketIcon.d.ts.map +1 -0
- package/dist-types/exports/define/RocketJsDemo.d.ts +2 -0
- package/dist-types/exports/define/RocketJsDemo.d.ts.map +1 -0
- package/dist-types/exports/define/RocketRequestDemo.d.ts +2 -0
- package/dist-types/exports/define/RocketRequestDemo.d.ts.map +1 -0
- package/dist-types/exports/define/menus.d.ts +2 -0
- package/dist-types/exports/define/menus.d.ts.map +1 -0
- package/dist-types/exports/extractCode.d.ts +2 -0
- package/dist-types/exports/extractCode.d.ts.map +1 -0
- package/dist-types/exports/globalData.d.ts +2 -0
- package/dist-types/exports/globalData.d.ts.map +1 -0
- package/dist-types/exports/hydration/hydrationLoader.d.ts +2 -0
- package/dist-types/exports/hydration/hydrationLoader.d.ts.map +1 -0
- package/dist-types/exports/icons.d.ts +2 -0
- package/dist-types/exports/icons.d.ts.map +1 -0
- package/dist-types/exports/layout-helper.d.ts +2 -0
- package/dist-types/exports/layout-helper.d.ts.map +1 -0
- package/dist-types/exports/layout.d.ts +2 -0
- package/dist-types/exports/layout.d.ts.map +1 -0
- package/dist-types/exports/layouts/atlasDoc.d.ts +2 -0
- package/dist-types/exports/layouts/atlasDoc.d.ts.map +1 -0
- package/dist-types/exports/layouts/atlasHero.d.ts +2 -0
- package/dist-types/exports/layouts/atlasHero.d.ts.map +1 -0
- package/dist-types/exports/layouts/atlasNotFound.d.ts +2 -0
- package/dist-types/exports/layouts/atlasNotFound.d.ts.map +1 -0
- package/dist-types/exports/loaded-page-module.d.ts +2 -0
- package/dist-types/exports/loaded-page-module.d.ts.map +1 -0
- package/dist-types/exports/markdownHook.d.ts +2 -0
- package/dist-types/exports/markdownHook.d.ts.map +1 -0
- package/dist-types/exports/menu.d.ts +2 -0
- package/dist-types/exports/menu.d.ts.map +1 -0
- package/dist-types/exports/menus.d.ts +6 -0
- package/dist-types/exports/menus.d.ts.map +1 -0
- package/dist-types/exports/page-runtime.d.ts +2 -0
- package/dist-types/exports/page-runtime.d.ts.map +1 -0
- package/dist-types/exports/pages.d.ts +2 -0
- package/dist-types/exports/pages.d.ts.map +1 -0
- package/dist-types/exports/resolve.d.ts +2 -0
- package/dist-types/exports/resolve.d.ts.map +1 -0
- package/dist-types/exports/ssr.d.ts +2 -0
- package/dist-types/exports/ssr.d.ts.map +1 -0
- package/dist-types/exports/standalone-demo-url.d.ts +2 -0
- package/dist-types/exports/standalone-demo-url.d.ts.map +1 -0
- package/dist-types/exports/transform.d.ts +2 -0
- package/dist-types/exports/transform.d.ts.map +1 -0
- package/dist-types/exports/types/hydration.d.ts +23 -0
- package/dist-types/exports/types/hydration.d.ts.map +1 -0
- package/dist-types/exports/types/rocket.d.ts +504 -0
- package/dist-types/exports/types/rocket.d.ts.map +1 -0
- package/dist-types/exports/types.d.ts +3 -0
- package/dist-types/exports/types.d.ts.map +1 -0
- package/dist-types/exports/wds-plugin.d.ts +2 -0
- package/dist-types/exports/wds-plugin.d.ts.map +1 -0
- package/dist-types/src/PageData.d.ts +82 -0
- package/dist-types/src/PageData.d.ts.map +1 -0
- package/dist-types/src/RocketCodeBlock.d.ts +64 -0
- package/dist-types/src/RocketCodeBlock.d.ts.map +1 -0
- package/dist-types/src/RocketIcon.d.ts +35 -0
- package/dist-types/src/RocketIcon.d.ts.map +1 -0
- package/dist-types/src/RocketJsDemo.d.ts +59 -0
- package/dist-types/src/RocketJsDemo.d.ts.map +1 -0
- package/dist-types/src/RocketJsDemo.test-browser.d.ts +3 -0
- package/dist-types/src/RocketJsDemo.test-browser.d.ts.map +1 -0
- package/dist-types/src/RocketRequestDemo.d.ts +57 -0
- package/dist-types/src/RocketRequestDemo.d.ts.map +1 -0
- package/dist-types/src/RocketRequestDemo.test-browser.d.ts +3 -0
- package/dist-types/src/RocketRequestDemo.test-browser.d.ts.map +1 -0
- package/dist-types/src/SocialPreviewPlayground.d.ts +102 -0
- package/dist-types/src/SocialPreviewPlayground.d.ts.map +1 -0
- package/dist-types/src/adapters/netlify.d.ts +54 -0
- package/dist-types/src/adapters/netlify.d.ts.map +1 -0
- package/dist-types/src/asyncMessage.d.ts +14 -0
- package/dist-types/src/asyncMessage.d.ts.map +1 -0
- package/dist-types/src/cli/RocketBuild.d.ts +78 -0
- package/dist-types/src/cli/RocketBuild.d.ts.map +1 -0
- package/dist-types/src/cli/RocketCli.d.ts +17 -0
- package/dist-types/src/cli/RocketCli.d.ts.map +1 -0
- package/dist-types/src/cli/RocketInit.d.ts +22 -0
- package/dist-types/src/cli/RocketInit.d.ts.map +1 -0
- package/dist-types/src/cli/RocketStart.d.ts +45 -0
- package/dist-types/src/cli/RocketStart.d.ts.map +1 -0
- package/dist-types/src/cli/cli.d.ts +3 -0
- package/dist-types/src/cli/cli.d.ts.map +1 -0
- package/dist-types/src/component-hydration.d.ts +26 -0
- package/dist-types/src/component-hydration.d.ts.map +1 -0
- package/dist-types/src/components/FeatureList.d.ts +15 -0
- package/dist-types/src/components/FeatureList.d.ts.map +1 -0
- package/dist-types/src/components/Footer.d.ts +17 -0
- package/dist-types/src/components/Footer.d.ts.map +1 -0
- package/dist-types/src/components/Header.d.ts +6 -0
- package/dist-types/src/components/Header.d.ts.map +1 -0
- package/dist-types/src/components/RocketDrawer.d.ts +20 -0
- package/dist-types/src/components/RocketDrawer.d.ts.map +1 -0
- package/dist-types/src/components/RocketSocialLink.d.ts +30 -0
- package/dist-types/src/components/RocketSocialLink.d.ts.map +1 -0
- package/dist-types/src/components.d.ts +7 -0
- package/dist-types/src/components.d.ts.map +1 -0
- package/dist-types/src/config.d.ts +6 -0
- package/dist-types/src/config.d.ts.map +1 -0
- package/dist-types/src/debounce.d.ts +8 -0
- package/dist-types/src/debounce.d.ts.map +1 -0
- package/dist-types/src/defaultSocialPreviewTemplate.d.ts +31 -0
- package/dist-types/src/defaultSocialPreviewTemplate.d.ts.map +1 -0
- package/dist-types/src/development-page-module-loader.d.ts +15 -0
- package/dist-types/src/development-page-module-loader.d.ts.map +1 -0
- package/dist-types/src/extractCode.d.ts +5 -0
- package/dist-types/src/extractCode.d.ts.map +1 -0
- package/dist-types/src/hydration/evaluate.d.ts +20 -0
- package/dist-types/src/hydration/evaluate.d.ts.map +1 -0
- package/dist-types/src/hydration/extractStrategies.d.ts +5 -0
- package/dist-types/src/hydration/extractStrategies.d.ts.map +1 -0
- package/dist-types/src/hydration/hydrationLoader.d.ts +64 -0
- package/dist-types/src/hydration/hydrationLoader.d.ts.map +1 -0
- package/dist-types/src/icons.d.ts +182 -0
- package/dist-types/src/icons.d.ts.map +1 -0
- package/dist-types/src/layouts/atlas/atlasDocLayout.d.ts +45 -0
- package/dist-types/src/layouts/atlas/atlasDocLayout.d.ts.map +1 -0
- package/dist-types/src/layouts/atlas/atlasHeroLayout.d.ts +7 -0
- package/dist-types/src/layouts/atlas/atlasHeroLayout.d.ts.map +1 -0
- package/dist-types/src/layouts/atlas/atlasNotFoundLayout.d.ts +5 -0
- package/dist-types/src/layouts/atlas/atlasNotFoundLayout.d.ts.map +1 -0
- package/dist-types/src/layouts/layout-helper.d.ts +16 -0
- package/dist-types/src/layouts/layout-helper.d.ts.map +1 -0
- package/dist-types/src/layouts/layout.d.ts +7 -0
- package/dist-types/src/layouts/layout.d.ts.map +1 -0
- package/dist-types/src/loaded-page-module.d.ts +51 -0
- package/dist-types/src/loaded-page-module.d.ts.map +1 -0
- package/dist-types/src/main.d.ts +2 -0
- package/dist-types/src/main.d.ts.map +1 -0
- package/dist-types/src/markdownCompiler.d.ts +22 -0
- package/dist-types/src/markdownCompiler.d.ts.map +1 -0
- package/dist-types/src/markdownHook.d.ts +6 -0
- package/dist-types/src/markdownHook.d.ts.map +1 -0
- package/dist-types/src/menu.d.ts +22 -0
- package/dist-types/src/menu.d.ts.map +1 -0
- package/dist-types/src/menus/MainMenu.d.ts +23 -0
- package/dist-types/src/menus/MainMenu.d.ts.map +1 -0
- package/dist-types/src/menus/RocketMenu.d.ts +23 -0
- package/dist-types/src/menus/RocketMenu.d.ts.map +1 -0
- package/dist-types/src/menus/RocketNextPage.d.ts +18 -0
- package/dist-types/src/menus/RocketNextPage.d.ts.map +1 -0
- package/dist-types/src/menus/RocketPreviousPage.d.ts +18 -0
- package/dist-types/src/menus/RocketPreviousPage.d.ts.map +1 -0
- package/dist-types/src/menus/RocketToc.d.ts +54 -0
- package/dist-types/src/menus/RocketToc.d.ts.map +1 -0
- package/dist-types/src/menus/pageNavigation.d.ts +41 -0
- package/dist-types/src/menus/pageNavigation.d.ts.map +1 -0
- package/dist-types/src/page-pagination.d.ts +69 -0
- package/dist-types/src/page-pagination.d.ts.map +1 -0
- package/dist-types/src/page-runtime.d.ts +110 -0
- package/dist-types/src/page-runtime.d.ts.map +1 -0
- package/dist-types/src/pages.d.ts +10 -0
- package/dist-types/src/pages.d.ts.map +1 -0
- package/dist-types/src/publicAssets.d.ts +70 -0
- package/dist-types/src/publicAssets.d.ts.map +1 -0
- package/dist-types/src/requestDemoMetadata.d.ts +19 -0
- package/dist-types/src/requestDemoMetadata.d.ts.map +1 -0
- package/dist-types/src/resolve.d.ts +7 -0
- package/dist-types/src/resolve.d.ts.map +1 -0
- package/dist-types/src/siteDiscoverability.d.ts +33 -0
- package/dist-types/src/siteDiscoverability.d.ts.map +1 -0
- package/dist-types/src/siteHeadMetadata.d.ts +20 -0
- package/dist-types/src/siteHeadMetadata.d.ts.map +1 -0
- package/dist-types/src/socialPreviewImages.d.ts +186 -0
- package/dist-types/src/socialPreviewImages.d.ts.map +1 -0
- package/dist-types/src/socialPreviewTemplatePreview.d.ts +22 -0
- package/dist-types/src/socialPreviewTemplatePreview.d.ts.map +1 -0
- package/dist-types/src/ssr.d.ts +6 -0
- package/dist-types/src/ssr.d.ts.map +1 -0
- package/dist-types/src/standalone-demo-url.d.ts +60 -0
- package/dist-types/src/standalone-demo-url.d.ts.map +1 -0
- package/dist-types/src/static-page-module-loader.d.ts +15 -0
- package/dist-types/src/static-page-module-loader.d.ts.map +1 -0
- package/dist-types/src/transform.d.ts +10 -0
- package/dist-types/src/transform.d.ts.map +1 -0
- package/dist-types/src/urlLifecycle.d.ts +23 -0
- package/dist-types/src/urlLifecycle.d.ts.map +1 -0
- package/dist-types/src/wds-plugin.d.ts +15 -0
- package/dist-types/src/wds-plugin.d.ts.map +1 -0
- package/docs/assets/home-background.svg +1 -0
- package/docs/assets/prism-one-light.css +368 -0
- package/docs/assets/rocket-logo-dark-with-text-below.svg +8 -0
- package/docs/assets/rocket-logo-dark-with-text.svg +7 -0
- package/docs/assets/rocket-logo-dark.svg +7 -0
- package/docs/assets/rocket-logo-light-with-text-below.svg +14 -0
- package/docs/assets/rocket-logo-light-with-text.svg +13 -0
- package/docs/assets/rocket-logo-light.svg +12 -0
- package/docs/assets/rocket-text-no-logo.svg +3 -0
- package/exports/MainMenu.js +1 -0
- package/exports/PageData.js +1 -0
- package/exports/RocketCodeBlock.js +1 -0
- package/exports/RocketIcon.js +1 -0
- package/exports/RocketJsDemo.js +1 -0
- package/exports/RocketRequestDemo.js +1 -0
- package/exports/SocialPreviewPlayground.js +1 -0
- package/exports/adapters/netlify.js +1 -0
- package/exports/asyncMessage.js +1 -0
- package/exports/component-hydration.js +1 -0
- package/exports/components/web-awesome.js +63 -0
- package/exports/components.js +1 -0
- package/exports/config.js +1 -0
- package/exports/debounce.js +1 -0
- package/exports/define/RocketCodeBlock.js +2 -0
- package/exports/define/RocketIcon.js +3 -0
- package/exports/define/RocketJsDemo.js +5 -0
- package/exports/define/RocketRequestDemo.js +5 -0
- package/exports/define/menus.js +14 -0
- package/exports/extractCode.js +1 -0
- package/exports/globalData.js +1 -0
- package/exports/hydration/hydrationLoader.js +1 -0
- package/exports/icons.js +11 -0
- package/exports/layout-helper.js +1 -0
- package/exports/layout.js +1 -0
- package/exports/layouts/_atlas.css +3 -0
- package/exports/layouts/atlasDoc.js +5 -0
- package/exports/layouts/atlasHero.js +1 -0
- package/exports/layouts/atlasNotFound.js +4 -0
- package/exports/loaded-page-module.js +5 -0
- package/exports/markdownHook.js +4 -0
- package/exports/menu.js +4 -0
- package/exports/menus.js +5 -0
- package/exports/page-runtime.js +5 -0
- package/exports/pages.js +1 -0
- package/exports/resolve.js +1 -0
- package/exports/ssr.js +1 -0
- package/exports/standalone-demo-url.js +10 -0
- package/exports/transform.js +1 -0
- package/exports/types/hydration.ts +26 -0
- package/exports/types/rocket.ts +598 -0
- package/exports/types.ts +71 -0
- package/exports/wds-plugin.js +1 -0
- package/package.json +192 -9
- package/src/PageData.js +244 -0
- package/src/RocketCodeBlock.js +516 -0
- package/src/RocketIcon.js +291 -0
- package/src/RocketJsDemo.js +397 -0
- package/src/RocketJsDemo.test-browser.js +228 -0
- package/src/RocketRequestDemo.js +439 -0
- package/src/RocketRequestDemo.test-browser.js +301 -0
- package/src/SocialPreviewPlayground.js +573 -0
- package/src/adapters/netlify.js +814 -0
- package/src/asyncMessage.js +21 -0
- package/src/cli/RocketBuild.js +581 -0
- package/src/cli/RocketCli.js +47 -0
- package/src/cli/RocketInit.js +636 -0
- package/src/cli/RocketStart.js +145 -0
- package/src/cli/cli.js +7 -0
- package/src/component-hydration.js +86 -0
- package/src/components/FeatureList.js +114 -0
- package/src/components/Footer.js +116 -0
- package/src/components/Header.js +122 -0
- package/src/components/RocketDrawer.js +193 -0
- package/src/components/RocketSocialLink.js +128 -0
- package/src/components/assets/discord.svg +7 -0
- package/src/components/assets/github.svg +4 -0
- package/src/components/assets/gitlab.svg +1 -0
- package/src/components/assets/info.txt +1 -0
- package/src/components/assets/license.svg +3 -0
- package/src/components/assets/npm.svg +5 -0
- package/src/components/assets/slack.svg +5 -0
- package/src/components/assets/telegram.svg +4 -0
- package/src/components/assets/twitter.svg +1 -0
- package/src/components.js +34 -0
- package/src/config.js +319 -0
- package/src/debounce.js +21 -0
- package/src/defaultSocialPreviewTemplate.js +118 -0
- package/src/development-page-module-loader.js +29 -0
- package/src/extractCode.js +41 -0
- package/src/hydration/evaluate.js +54 -0
- package/src/hydration/extractStrategies.js +91 -0
- package/src/hydration/hydrationLoader.js +330 -0
- package/src/icons.js +898 -0
- package/src/layouts/atlas/atlasDoc.css +877 -0
- package/src/layouts/atlas/atlasDocLayout.js +275 -0
- package/src/layouts/atlas/atlasHero.css +774 -0
- package/src/layouts/atlas/atlasHeroLayout.js +337 -0
- package/src/layouts/atlas/atlasNotFound.css +365 -0
- package/src/layouts/atlas/atlasNotFoundLayout.js +69 -0
- package/src/layouts/layout-helper.js +92 -0
- package/src/layouts/layout.js +52 -0
- package/src/loaded-page-module.js +97 -0
- package/src/main.js +72 -0
- package/src/markdownCompiler.js +303 -0
- package/src/markdownHook.js +148 -0
- package/src/menu.js +210 -0
- package/src/menus/MainMenu.js +58 -0
- package/src/menus/RocketMenu.js +191 -0
- package/src/menus/RocketNextPage.js +25 -0
- package/src/menus/RocketPreviousPage.js +29 -0
- package/src/menus/RocketToc.js +309 -0
- package/src/menus/pageNavigation.js +285 -0
- package/src/page-pagination.js +241 -0
- package/src/page-runtime.js +481 -0
- package/src/pages.js +537 -0
- package/src/publicAssets.js +336 -0
- package/src/requestDemoMetadata.js +97 -0
- package/src/resolve.js +15 -0
- package/src/siteDiscoverability.js +184 -0
- package/src/siteHeadMetadata.js +69 -0
- package/src/socialPreviewImages.js +482 -0
- package/src/socialPreviewTemplatePreview.js +352 -0
- package/src/ssr.js +14 -0
- package/src/standalone-demo-url.js +147 -0
- package/src/static-page-module-loader.js +29 -0
- package/src/transform.js +720 -0
- package/src/urlLifecycle.js +57 -0
- package/src/wds-plugin.js +307 -0
|
@@ -0,0 +1,636 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
|
|
5
|
+
const ROCKET_CONFIG_PATH = 'rocket-config.js';
|
|
6
|
+
const INDEX_PAGE_PATH = 'docs/pages/index.rocket.md';
|
|
7
|
+
const SHARED_DATA_PATH = 'docs/pages/sharedData.js';
|
|
8
|
+
const DOCS_PAGE_PATH = 'docs/pages/docs.rocket.md';
|
|
9
|
+
const JAVASCRIPT_DEMO_PAGE_PATH = 'docs/pages/javascript-demo.rocket.md';
|
|
10
|
+
const REQUEST_DEMO_PAGE_PATH = 'docs/pages/request-demo.rocket.md';
|
|
11
|
+
const SITE_STATUS_PAGE_PATH = 'docs/pages/site-status.rocket.js';
|
|
12
|
+
const ROCKET_AGENT_SKILL_PATH = '.agents/skills/rocket/SKILL.md';
|
|
13
|
+
const EXISTING_ROCKET_PAGE_NOISE_THRESHOLD = 3;
|
|
14
|
+
const STARTER_PAGE_FILES = [
|
|
15
|
+
SHARED_DATA_PATH,
|
|
16
|
+
INDEX_PAGE_PATH,
|
|
17
|
+
DOCS_PAGE_PATH,
|
|
18
|
+
JAVASCRIPT_DEMO_PAGE_PATH,
|
|
19
|
+
REQUEST_DEMO_PAGE_PATH,
|
|
20
|
+
SITE_STATUS_PAGE_PATH,
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const rocketConfigSource = `/** @type {import('@rocket/js/types.js').RocketConfig} */
|
|
24
|
+
export default {
|
|
25
|
+
includeGlobs: ['docs/pages/**/*.rocket.{md,js}', 'src/**/*.rocket.{md,js}'],
|
|
26
|
+
};
|
|
27
|
+
`;
|
|
28
|
+
|
|
29
|
+
const sharedDataSource = `import { resolve } from '@rocket/js/resolve.js';
|
|
30
|
+
|
|
31
|
+
export const headerData = {
|
|
32
|
+
logo: [
|
|
33
|
+
resolve('@rocket/js/docs/assets/rocket-logo-light.svg', import.meta),
|
|
34
|
+
resolve('@rocket/js/docs/assets/rocket-text-no-logo.svg', import.meta),
|
|
35
|
+
],
|
|
36
|
+
homeLink: '/',
|
|
37
|
+
navLinks: [
|
|
38
|
+
{ text: 'Docs', href: '/docs' },
|
|
39
|
+
{ text: 'Demos', href: '/javascript-demo' },
|
|
40
|
+
],
|
|
41
|
+
socials: [],
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** @type {import('@rocket/js/types.js').FooterSection[]} */
|
|
45
|
+
export const footerData = [];
|
|
46
|
+
|
|
47
|
+
export const heroData = {
|
|
48
|
+
headerData,
|
|
49
|
+
footerData,
|
|
50
|
+
heroMainData: {
|
|
51
|
+
logoNoText: resolve('@rocket/js/docs/assets/rocket-logo-light.svg', import.meta),
|
|
52
|
+
eyebrow: 'ROCKET STARTER',
|
|
53
|
+
title: 'Rocket Site',
|
|
54
|
+
body: 'A static documentation site built with Rocket Pages and Atlas layouts.',
|
|
55
|
+
documentationLink: '/docs',
|
|
56
|
+
documentationText: 'Read the docs',
|
|
57
|
+
setupLink: '/javascript-demo',
|
|
58
|
+
setupText: 'View demos',
|
|
59
|
+
installLabel: 'Build',
|
|
60
|
+
installCommand: 'npm run build',
|
|
61
|
+
},
|
|
62
|
+
whyRocketData: [
|
|
63
|
+
{
|
|
64
|
+
icon: 'file-earmark-text',
|
|
65
|
+
title: 'Plain Pages',
|
|
66
|
+
description: 'Author durable content in Markdown and keep routes explicit.',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
icon: 'play-btn',
|
|
70
|
+
title: 'Live Demos',
|
|
71
|
+
description: 'Use JavaScript Demos for browser examples with standalone URLs.',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
icon: 'arrow-left-right',
|
|
75
|
+
title: 'Request Demos',
|
|
76
|
+
description: 'Show concrete same-site responses without leaving the docs.',
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
quickStartData: {
|
|
80
|
+
title: 'Quick start',
|
|
81
|
+
subtitle: 'From this project:',
|
|
82
|
+
command: ['npm start', 'npm run build'],
|
|
83
|
+
description: 'Edit docs/pages, then run the build before publishing.',
|
|
84
|
+
},
|
|
85
|
+
workflowData: {
|
|
86
|
+
title: 'Starter workflow',
|
|
87
|
+
steps: [
|
|
88
|
+
{
|
|
89
|
+
icon: 'pencil-square',
|
|
90
|
+
title: 'Edit Pages',
|
|
91
|
+
description: 'Update the Markdown and JavaScript Pages under docs/pages.',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
icon: 'terminal',
|
|
95
|
+
title: 'Build',
|
|
96
|
+
description: 'Run npm run build and fix any errors before publishing.',
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export const docData = {
|
|
103
|
+
headerData,
|
|
104
|
+
footerData,
|
|
105
|
+
navigationIconServerBudget: 35,
|
|
106
|
+
};
|
|
107
|
+
`;
|
|
108
|
+
|
|
109
|
+
const indexPageSource = `\`\`\`js server
|
|
110
|
+
export const config = {
|
|
111
|
+
path: '/',
|
|
112
|
+
metadata: {
|
|
113
|
+
title: 'Rocket Site',
|
|
114
|
+
description: 'Documentation built with Rocket.',
|
|
115
|
+
},
|
|
116
|
+
menu: {
|
|
117
|
+
iconName: 'house',
|
|
118
|
+
order: 0,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
import { atlasHeroLayout, atlasHeroComponents } from '@rocket/js/layouts/atlasHero.js';
|
|
123
|
+
import { heroData } from './sharedData.js';
|
|
124
|
+
|
|
125
|
+
export const components = atlasHeroComponents;
|
|
126
|
+
export const layout = pageData => atlasHeroLayout(pageData, heroData);
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
# Rocket Site
|
|
130
|
+
|
|
131
|
+
This starter is rendered with Rocket's Atlas hero layout.
|
|
132
|
+
|
|
133
|
+
## Next steps
|
|
134
|
+
|
|
135
|
+
- Edit this Page in \`docs/pages/index.rocket.md\`.
|
|
136
|
+
- Edit the shared Atlas data in \`docs/pages/sharedData.js\`.
|
|
137
|
+
- Add general documentation Pages under \`docs/pages\` with the Atlas docs layout.
|
|
138
|
+
- Add component reference Pages next to the components they document under \`src\`.
|
|
139
|
+
- Run \`npm run build\` to verify the site.
|
|
140
|
+
`;
|
|
141
|
+
|
|
142
|
+
const docsPageSource = `\`\`\`js server
|
|
143
|
+
export const config = {
|
|
144
|
+
path: '/docs',
|
|
145
|
+
metadata: {
|
|
146
|
+
title: 'Docs',
|
|
147
|
+
description: 'A first Atlas docs Page generated by rocket init.',
|
|
148
|
+
},
|
|
149
|
+
menu: {
|
|
150
|
+
iconName: 'book',
|
|
151
|
+
order: 10,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
import { atlasDocLayout, atlasDocComponents } from '@rocket/js/layouts/atlasDoc.js';
|
|
156
|
+
import { docData } from './sharedData.js';
|
|
157
|
+
|
|
158
|
+
export const components = atlasDocComponents;
|
|
159
|
+
export const layout = pageData => atlasDocLayout(pageData, docData);
|
|
160
|
+
\`\`\`
|
|
161
|
+
|
|
162
|
+
# Docs
|
|
163
|
+
|
|
164
|
+
This Page uses Rocket's package-provided Atlas docs layout.
|
|
165
|
+
|
|
166
|
+
## Authoring Pages
|
|
167
|
+
|
|
168
|
+
Every Page owns its URL with \`config.path\`. General documentation Pages belong under
|
|
169
|
+
\`docs/pages\`, and component reference Pages can live next to the source files they document.
|
|
170
|
+
|
|
171
|
+
## Navigation Icons
|
|
172
|
+
|
|
173
|
+
Atlas docs navigation reads \`menu.iconName\` from Page config. Use Bootstrap Icon names for Pages
|
|
174
|
+
that appear in the left navigation.
|
|
175
|
+
`;
|
|
176
|
+
|
|
177
|
+
const javascriptDemoPageSource = `\`\`\`js server
|
|
178
|
+
export const config = {
|
|
179
|
+
path: '/javascript-demo',
|
|
180
|
+
metadata: {
|
|
181
|
+
title: 'JavaScript Demo',
|
|
182
|
+
description: 'A starter JavaScript Demo with a generated Standalone Demo URL.',
|
|
183
|
+
},
|
|
184
|
+
menu: {
|
|
185
|
+
iconName: 'window',
|
|
186
|
+
order: 20,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
import { atlasDocLayout, atlasDocComponents } from '@rocket/js/layouts/atlasDoc.js';
|
|
191
|
+
import { docData } from './sharedData.js';
|
|
192
|
+
|
|
193
|
+
export const components = atlasDocComponents;
|
|
194
|
+
export const layout = pageData => atlasDocLayout(pageData, docData);
|
|
195
|
+
\`\`\`
|
|
196
|
+
|
|
197
|
+
# JavaScript Demo
|
|
198
|
+
|
|
199
|
+
Use a \`js demo\` block for browser-rendered examples. Rocket also generates a Standalone Demo URL
|
|
200
|
+
at \`/javascript-demo/_demo/starterButton/\`.
|
|
201
|
+
|
|
202
|
+
\`\`\`js demo label="docs/pages/javascript-demo.rocket.md"
|
|
203
|
+
import { html } from 'lit';
|
|
204
|
+
|
|
205
|
+
export const starterButton = () => html\`<button type="button">Rocket demo</button>\`;
|
|
206
|
+
\`\`\`
|
|
207
|
+
`;
|
|
208
|
+
|
|
209
|
+
const requestDemoPageSource = `\`\`\`js server
|
|
210
|
+
export const config = {
|
|
211
|
+
path: '/request-demo',
|
|
212
|
+
metadata: {
|
|
213
|
+
title: 'Request Demo',
|
|
214
|
+
description: 'A starter Request Demo pointed at a concrete static JSON Page.',
|
|
215
|
+
},
|
|
216
|
+
menu: {
|
|
217
|
+
iconName: 'arrow-left-right',
|
|
218
|
+
order: 30,
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
import { atlasDocLayout, atlasDocComponents } from '@rocket/js/layouts/atlasDoc.js';
|
|
223
|
+
import { docData } from './sharedData.js';
|
|
224
|
+
|
|
225
|
+
export const components = atlasDocComponents;
|
|
226
|
+
export const layout = pageData => atlasDocLayout(pageData, docData);
|
|
227
|
+
\`\`\`
|
|
228
|
+
|
|
229
|
+
# Request Demo
|
|
230
|
+
|
|
231
|
+
Use a Request Demo when readers need to inspect a same-site \`GET\` response. Static Request Demo
|
|
232
|
+
examples should point at concrete paths and avoid query-dependent output.
|
|
233
|
+
|
|
234
|
+
\`\`\`js request-demo url="/api/site-status.json" label="docs/pages/site-status.rocket.js" height=220
|
|
235
|
+
export const config = {
|
|
236
|
+
path: '/api/site-status.json',
|
|
237
|
+
metadata: { title: 'Site Status' },
|
|
238
|
+
menu: false,
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
export default function siteStatusPage() {
|
|
242
|
+
return {
|
|
243
|
+
status: 'ready',
|
|
244
|
+
generatedBy: 'Rocket',
|
|
245
|
+
pages: ['/docs', '/javascript-demo', '/request-demo'],
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
\`\`\`
|
|
249
|
+
`;
|
|
250
|
+
|
|
251
|
+
const siteStatusPageSource = `export const config = {
|
|
252
|
+
path: '/api/site-status.json',
|
|
253
|
+
metadata: { title: 'Site Status' },
|
|
254
|
+
menu: false,
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
export default function siteStatusPage() {
|
|
258
|
+
return {
|
|
259
|
+
status: 'ready',
|
|
260
|
+
generatedBy: 'Rocket',
|
|
261
|
+
pages: ['/docs', '/javascript-demo', '/request-demo'],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
`;
|
|
265
|
+
|
|
266
|
+
const STARTER_PAGE_SOURCES = new Map([
|
|
267
|
+
[SHARED_DATA_PATH, sharedDataSource],
|
|
268
|
+
[INDEX_PAGE_PATH, indexPageSource],
|
|
269
|
+
[DOCS_PAGE_PATH, docsPageSource],
|
|
270
|
+
[JAVASCRIPT_DEMO_PAGE_PATH, javascriptDemoPageSource],
|
|
271
|
+
[REQUEST_DEMO_PAGE_PATH, requestDemoPageSource],
|
|
272
|
+
[SITE_STATUS_PAGE_PATH, siteStatusPageSource],
|
|
273
|
+
]);
|
|
274
|
+
|
|
275
|
+
const rocketAgentSkillSource = `---
|
|
276
|
+
name: rocket
|
|
277
|
+
description: Use when editing Rocket Pages, config, layouts, component reference Pages, or build behavior in this project.
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
# Rocket
|
|
281
|
+
|
|
282
|
+
## Rules
|
|
283
|
+
|
|
284
|
+
- Read \`rocket-config.js\` first; Page discovery follows \`includeGlobs\`.
|
|
285
|
+
- Every Page owns its URL through \`config.path\`; put general docs in \`docs/pages\` and component docs next to the component.
|
|
286
|
+
- Prefer Markdown for durable content; use JavaScript Pages for request-time or programmatic output.
|
|
287
|
+
- Prefer interactive examples for component and behavior docs; use \`js demo\` when readers benefit from trying the UI.
|
|
288
|
+
- Prefer Atlas docs layouts: \`atlasDocLayout\` for docs, \`atlasHeroLayout\` for a standalone docs home, with matching \`components\` exports.
|
|
289
|
+
- Markdown using Rocket custom elements needs a \`components\` export; use Atlas component maps or \`rocketDemoComponents\`.
|
|
290
|
+
- Add \`menu.iconName\` to Atlas docs navigation Pages so the left navigation has icons.
|
|
291
|
+
- Direct layout re-exports are supported when no local wrapper function is needed.
|
|
292
|
+
- Custom layouts rendering \`rocket-icon\` need \`addBootstrapIconLibrary(pageData)\` before \`document()\`.
|
|
293
|
+
- Static JavaScript Pages render once per concrete path; query/header/cookie/live-data output needs \`render: 'server'\`.
|
|
294
|
+
- Static Request Demos should target concrete non-query URLs.
|
|
295
|
+
- After adding a \`js demo\`, verify the parent Page and Standalone Demo URL \`/page/_demo/demoName/\`.
|
|
296
|
+
- Keep \`npm run build\` passing; record Rocket package issues separately from local workarounds.
|
|
297
|
+
`;
|
|
298
|
+
|
|
299
|
+
export class RocketInit {
|
|
300
|
+
/**
|
|
301
|
+
* @param {import('commander').Command} program
|
|
302
|
+
*/
|
|
303
|
+
async setupCommand(program) {
|
|
304
|
+
program
|
|
305
|
+
.command('init')
|
|
306
|
+
.description('create a Rocket docs starter')
|
|
307
|
+
.action(() => {
|
|
308
|
+
const result = this.init();
|
|
309
|
+
reportInitResult(result);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* @returns {RocketInitResult}
|
|
315
|
+
*/
|
|
316
|
+
init() {
|
|
317
|
+
const packageJsonUpdate = preparePackageJsonUpdate('package.json');
|
|
318
|
+
/** @type {RocketInitResult} */
|
|
319
|
+
const result = {
|
|
320
|
+
created: [],
|
|
321
|
+
skipped: [],
|
|
322
|
+
packageJson: packageJsonUpdate?.summary,
|
|
323
|
+
missingRocketDependency: Boolean(packageJsonUpdate?.missingRocketDependency),
|
|
324
|
+
nextSteps: packageJsonUpdate?.nextSteps || ['npx rocket start', 'npx rocket build'],
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
if (packageJsonUpdate?.changed) {
|
|
328
|
+
writeJsonFile('package.json', packageJsonUpdate.packageJson);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const shouldCreateStarterPages =
|
|
332
|
+
existingRocketPageFileCount(process.cwd()) < EXISTING_ROCKET_PAGE_NOISE_THRESHOLD;
|
|
333
|
+
|
|
334
|
+
writeFileIfMissing(ROCKET_CONFIG_PATH, rocketConfigSource, result);
|
|
335
|
+
if (shouldCreateStarterPages) {
|
|
336
|
+
for (const filePath of STARTER_PAGE_FILES) {
|
|
337
|
+
writeFileIfMissing(filePath, STARTER_PAGE_SOURCES.get(filePath) || '', result);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
writeFileIfMissing(ROCKET_AGENT_SKILL_PATH, rocketAgentSkillSource, result);
|
|
341
|
+
|
|
342
|
+
return result;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* @typedef {{
|
|
348
|
+
* created: string[];
|
|
349
|
+
* skipped: string[];
|
|
350
|
+
* packageJson?: {
|
|
351
|
+
* path: string;
|
|
352
|
+
* updated: string[];
|
|
353
|
+
* skipped: string[];
|
|
354
|
+
* };
|
|
355
|
+
* missingRocketDependency: boolean;
|
|
356
|
+
* nextSteps: string[];
|
|
357
|
+
* }} RocketInitResult
|
|
358
|
+
*/
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* @param {string} filePath
|
|
362
|
+
* @returns {{
|
|
363
|
+
* changed: boolean;
|
|
364
|
+
* packageJson: Record<string, any>;
|
|
365
|
+
* summary: NonNullable<RocketInitResult['packageJson']>;
|
|
366
|
+
* missingRocketDependency: boolean;
|
|
367
|
+
* nextSteps: string[];
|
|
368
|
+
* } | undefined}
|
|
369
|
+
*/
|
|
370
|
+
function preparePackageJsonUpdate(filePath) {
|
|
371
|
+
if (!existsSync(filePath)) {
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
374
|
+
if (!statSync(filePath).isFile()) {
|
|
375
|
+
throw new Error('package.json exists but is not a file');
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const packageJson = JSON.parse(readFileSync(filePath, 'utf8'));
|
|
379
|
+
if (!isPlainRecord(packageJson)) {
|
|
380
|
+
throw new Error('package.json must contain a JSON object');
|
|
381
|
+
}
|
|
382
|
+
if (packageJson.type === 'commonjs') {
|
|
383
|
+
throw new Error(
|
|
384
|
+
`Rocket init expects an ESM project. Found package.json type "commonjs". ` +
|
|
385
|
+
`Change package.json to "type": "module" before running rocket init.`,
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/** @type {string[]} */
|
|
390
|
+
const updated = [];
|
|
391
|
+
/** @type {string[]} */
|
|
392
|
+
const skipped = [];
|
|
393
|
+
|
|
394
|
+
if (!hasOwn(packageJson, 'type')) {
|
|
395
|
+
packageJson.type = 'module';
|
|
396
|
+
updated.push('type');
|
|
397
|
+
} else if (packageJson.type === 'module') {
|
|
398
|
+
skipped.push('type');
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
if (!hasOwn(packageJson, 'scripts')) {
|
|
402
|
+
packageJson.scripts = {};
|
|
403
|
+
updated.push('scripts');
|
|
404
|
+
}
|
|
405
|
+
if (isPlainRecord(packageJson.scripts)) {
|
|
406
|
+
addRocketScript(packageJson.scripts, {
|
|
407
|
+
genericName: 'start',
|
|
408
|
+
fallbackName: 'rocket:start',
|
|
409
|
+
command: 'rocket start',
|
|
410
|
+
updated,
|
|
411
|
+
skipped,
|
|
412
|
+
});
|
|
413
|
+
addRocketScript(packageJson.scripts, {
|
|
414
|
+
genericName: 'build',
|
|
415
|
+
fallbackName: 'rocket:build',
|
|
416
|
+
command: 'rocket build',
|
|
417
|
+
updated,
|
|
418
|
+
skipped,
|
|
419
|
+
});
|
|
420
|
+
} else {
|
|
421
|
+
skipped.push('scripts');
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
return {
|
|
425
|
+
changed: updated.length > 0,
|
|
426
|
+
packageJson,
|
|
427
|
+
summary: {
|
|
428
|
+
path: filePath,
|
|
429
|
+
updated,
|
|
430
|
+
skipped,
|
|
431
|
+
},
|
|
432
|
+
missingRocketDependency: !hasPackageDependency(packageJson, '@rocket/js'),
|
|
433
|
+
nextSteps: rocketNextSteps(packageJson),
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* @param {Record<string, any>} scripts
|
|
439
|
+
* @param {{
|
|
440
|
+
* genericName: string;
|
|
441
|
+
* fallbackName: string;
|
|
442
|
+
* command: string;
|
|
443
|
+
* updated: string[];
|
|
444
|
+
* skipped: string[];
|
|
445
|
+
* }} options
|
|
446
|
+
*/
|
|
447
|
+
function addRocketScript(scripts, { genericName, fallbackName, command, updated, skipped }) {
|
|
448
|
+
if (!hasOwn(scripts, genericName)) {
|
|
449
|
+
scripts[genericName] = command;
|
|
450
|
+
updated.push(`scripts.${genericName}`);
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
if (scriptRunsRocketCommand(scripts[genericName], genericName)) {
|
|
454
|
+
skipped.push(`scripts.${genericName}`);
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
if (!hasOwn(scripts, fallbackName)) {
|
|
458
|
+
scripts[fallbackName] = command;
|
|
459
|
+
updated.push(`scripts.${fallbackName}`);
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
skipped.push(`scripts.${genericName}`);
|
|
463
|
+
skipped.push(`scripts.${fallbackName}`);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* @param {Record<string, any>} packageJson
|
|
468
|
+
* @param {string} dependencyName
|
|
469
|
+
* @returns {boolean}
|
|
470
|
+
*/
|
|
471
|
+
function hasPackageDependency(packageJson, dependencyName) {
|
|
472
|
+
return ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].some(
|
|
473
|
+
field => isPlainRecord(packageJson[field]) && hasOwn(packageJson[field], dependencyName),
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* @param {Record<string, any>} packageJson
|
|
479
|
+
* @returns {string[]}
|
|
480
|
+
*/
|
|
481
|
+
function rocketNextSteps(packageJson) {
|
|
482
|
+
if (!isPlainRecord(packageJson.scripts)) {
|
|
483
|
+
return ['npx rocket start', 'npx rocket build'];
|
|
484
|
+
}
|
|
485
|
+
return [
|
|
486
|
+
npmScriptCommand(packageJson.scripts, 'start', 'rocket:start'),
|
|
487
|
+
npmScriptCommand(packageJson.scripts, 'build', 'rocket:build'),
|
|
488
|
+
];
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* @param {Record<string, any>} scripts
|
|
493
|
+
* @param {string} genericName
|
|
494
|
+
* @param {string} fallbackName
|
|
495
|
+
*/
|
|
496
|
+
function npmScriptCommand(scripts, genericName, fallbackName) {
|
|
497
|
+
if (scriptRunsRocketCommand(scripts[genericName], genericName)) {
|
|
498
|
+
return genericName === 'start' ? 'npm start' : `npm run ${genericName}`;
|
|
499
|
+
}
|
|
500
|
+
if (scriptRunsRocketCommand(scripts[fallbackName], genericName)) {
|
|
501
|
+
return `npm run ${fallbackName}`;
|
|
502
|
+
}
|
|
503
|
+
return `npx rocket ${genericName}`;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* @param {unknown} script
|
|
508
|
+
* @param {string} commandName
|
|
509
|
+
* @returns {boolean}
|
|
510
|
+
*/
|
|
511
|
+
function scriptRunsRocketCommand(script, commandName) {
|
|
512
|
+
if (typeof script !== 'string') {
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
const shellBoundary = '[\\s"\\\'`;&|()]';
|
|
516
|
+
return new RegExp(
|
|
517
|
+
`(^|${shellBoundary})(?:npx\\s+)?rocket\\s+${commandName}(?=$|${shellBoundary})`,
|
|
518
|
+
).test(script);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* @param {string} directory
|
|
523
|
+
* @returns {number}
|
|
524
|
+
*/
|
|
525
|
+
function existingRocketPageFileCount(directory) {
|
|
526
|
+
if (!existsSync(directory)) {
|
|
527
|
+
return 0;
|
|
528
|
+
}
|
|
529
|
+
return countRocketPageFiles(directory, { count: 0 });
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* @param {string} directory
|
|
534
|
+
* @param {{ count: number }} state
|
|
535
|
+
* @returns {number}
|
|
536
|
+
*/
|
|
537
|
+
function countRocketPageFiles(directory, state) {
|
|
538
|
+
if (state.count >= EXISTING_ROCKET_PAGE_NOISE_THRESHOLD) {
|
|
539
|
+
return state.count;
|
|
540
|
+
}
|
|
541
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
542
|
+
if (shouldIgnoreRocketPageScanEntry(entry.name)) {
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
const entryPath = path.join(directory, entry.name);
|
|
546
|
+
if (entry.isDirectory()) {
|
|
547
|
+
countRocketPageFiles(entryPath, state);
|
|
548
|
+
} else if (isRocketPageFile(entry.name)) {
|
|
549
|
+
state.count += 1;
|
|
550
|
+
}
|
|
551
|
+
if (state.count >= EXISTING_ROCKET_PAGE_NOISE_THRESHOLD) {
|
|
552
|
+
return state.count;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
return state.count;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* @param {string} name
|
|
560
|
+
* @returns {boolean}
|
|
561
|
+
*/
|
|
562
|
+
function shouldIgnoreRocketPageScanEntry(name) {
|
|
563
|
+
return ['.git', '.netlify', 'coverage', 'dist', 'node_modules', 'temp'].includes(name);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* @param {string} fileName
|
|
568
|
+
* @returns {boolean}
|
|
569
|
+
*/
|
|
570
|
+
function isRocketPageFile(fileName) {
|
|
571
|
+
return fileName.endsWith('.rocket.md') || fileName.endsWith('.rocket.js');
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/**
|
|
575
|
+
* @param {string} filePath
|
|
576
|
+
* @param {string} contents
|
|
577
|
+
* @param {RocketInitResult} result
|
|
578
|
+
*/
|
|
579
|
+
function writeFileIfMissing(filePath, contents, result) {
|
|
580
|
+
if (existsSync(filePath)) {
|
|
581
|
+
result.skipped.push(filePath);
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
585
|
+
writeFileSync(filePath, contents);
|
|
586
|
+
result.created.push(filePath);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* @param {string} filePath
|
|
591
|
+
* @param {Record<string, any>} value
|
|
592
|
+
*/
|
|
593
|
+
function writeJsonFile(filePath, value) {
|
|
594
|
+
writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* @param {RocketInitResult} result
|
|
599
|
+
*/
|
|
600
|
+
function reportInitResult(result) {
|
|
601
|
+
for (const filePath of result.created) {
|
|
602
|
+
console.log(`Created ${filePath}`);
|
|
603
|
+
}
|
|
604
|
+
for (const filePath of result.skipped) {
|
|
605
|
+
console.log(`Skipped ${filePath} (already exists)`);
|
|
606
|
+
}
|
|
607
|
+
if (result.packageJson?.updated.length) {
|
|
608
|
+
console.log(`Updated ${result.packageJson.path}: ${result.packageJson.updated.join(', ')}`);
|
|
609
|
+
} else if (result.packageJson) {
|
|
610
|
+
console.log(`Skipped ${result.packageJson.path} (already configured)`);
|
|
611
|
+
}
|
|
612
|
+
if (result.missingRocketDependency) {
|
|
613
|
+
console.log('Note: package.json does not list @rocket/js. Add it with: npm install @rocket/js');
|
|
614
|
+
}
|
|
615
|
+
console.log('');
|
|
616
|
+
console.log('Next steps:');
|
|
617
|
+
for (const step of result.nextSteps) {
|
|
618
|
+
console.log(` ${step}`);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* @param {unknown} value
|
|
624
|
+
* @returns {value is Record<string, any>}
|
|
625
|
+
*/
|
|
626
|
+
function isPlainRecord(value) {
|
|
627
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* @param {Record<string, any>} record
|
|
632
|
+
* @param {string} field
|
|
633
|
+
*/
|
|
634
|
+
function hasOwn(record, field) {
|
|
635
|
+
return Object.prototype.hasOwnProperty.call(record, field);
|
|
636
|
+
}
|