@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.
Files changed (340) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -2
  3. package/dist-types/exports/MainMenu.d.ts +2 -0
  4. package/dist-types/exports/MainMenu.d.ts.map +1 -0
  5. package/dist-types/exports/PageData.d.ts +2 -0
  6. package/dist-types/exports/PageData.d.ts.map +1 -0
  7. package/dist-types/exports/RocketCodeBlock.d.ts +2 -0
  8. package/dist-types/exports/RocketCodeBlock.d.ts.map +1 -0
  9. package/dist-types/exports/RocketIcon.d.ts +2 -0
  10. package/dist-types/exports/RocketIcon.d.ts.map +1 -0
  11. package/dist-types/exports/RocketJsDemo.d.ts +2 -0
  12. package/dist-types/exports/RocketJsDemo.d.ts.map +1 -0
  13. package/dist-types/exports/RocketRequestDemo.d.ts +2 -0
  14. package/dist-types/exports/RocketRequestDemo.d.ts.map +1 -0
  15. package/dist-types/exports/SocialPreviewPlayground.d.ts +2 -0
  16. package/dist-types/exports/SocialPreviewPlayground.d.ts.map +1 -0
  17. package/dist-types/exports/adapters/netlify.d.ts +2 -0
  18. package/dist-types/exports/adapters/netlify.d.ts.map +1 -0
  19. package/dist-types/exports/asyncMessage.d.ts +2 -0
  20. package/dist-types/exports/asyncMessage.d.ts.map +1 -0
  21. package/dist-types/exports/component-hydration.d.ts +2 -0
  22. package/dist-types/exports/component-hydration.d.ts.map +1 -0
  23. package/dist-types/exports/components/web-awesome.d.ts +3 -0
  24. package/dist-types/exports/components/web-awesome.d.ts.map +1 -0
  25. package/dist-types/exports/components.d.ts +2 -0
  26. package/dist-types/exports/components.d.ts.map +1 -0
  27. package/dist-types/exports/config.d.ts +2 -0
  28. package/dist-types/exports/config.d.ts.map +1 -0
  29. package/dist-types/exports/debounce.d.ts +2 -0
  30. package/dist-types/exports/debounce.d.ts.map +1 -0
  31. package/dist-types/exports/define/RocketCodeBlock.d.ts +2 -0
  32. package/dist-types/exports/define/RocketCodeBlock.d.ts.map +1 -0
  33. package/dist-types/exports/define/RocketIcon.d.ts +2 -0
  34. package/dist-types/exports/define/RocketIcon.d.ts.map +1 -0
  35. package/dist-types/exports/define/RocketJsDemo.d.ts +2 -0
  36. package/dist-types/exports/define/RocketJsDemo.d.ts.map +1 -0
  37. package/dist-types/exports/define/RocketRequestDemo.d.ts +2 -0
  38. package/dist-types/exports/define/RocketRequestDemo.d.ts.map +1 -0
  39. package/dist-types/exports/define/menus.d.ts +2 -0
  40. package/dist-types/exports/define/menus.d.ts.map +1 -0
  41. package/dist-types/exports/extractCode.d.ts +2 -0
  42. package/dist-types/exports/extractCode.d.ts.map +1 -0
  43. package/dist-types/exports/globalData.d.ts +2 -0
  44. package/dist-types/exports/globalData.d.ts.map +1 -0
  45. package/dist-types/exports/hydration/hydrationLoader.d.ts +2 -0
  46. package/dist-types/exports/hydration/hydrationLoader.d.ts.map +1 -0
  47. package/dist-types/exports/icons.d.ts +2 -0
  48. package/dist-types/exports/icons.d.ts.map +1 -0
  49. package/dist-types/exports/layout-helper.d.ts +2 -0
  50. package/dist-types/exports/layout-helper.d.ts.map +1 -0
  51. package/dist-types/exports/layout.d.ts +2 -0
  52. package/dist-types/exports/layout.d.ts.map +1 -0
  53. package/dist-types/exports/layouts/atlasDoc.d.ts +2 -0
  54. package/dist-types/exports/layouts/atlasDoc.d.ts.map +1 -0
  55. package/dist-types/exports/layouts/atlasHero.d.ts +2 -0
  56. package/dist-types/exports/layouts/atlasHero.d.ts.map +1 -0
  57. package/dist-types/exports/layouts/atlasNotFound.d.ts +2 -0
  58. package/dist-types/exports/layouts/atlasNotFound.d.ts.map +1 -0
  59. package/dist-types/exports/loaded-page-module.d.ts +2 -0
  60. package/dist-types/exports/loaded-page-module.d.ts.map +1 -0
  61. package/dist-types/exports/markdownHook.d.ts +2 -0
  62. package/dist-types/exports/markdownHook.d.ts.map +1 -0
  63. package/dist-types/exports/menu.d.ts +2 -0
  64. package/dist-types/exports/menu.d.ts.map +1 -0
  65. package/dist-types/exports/menus.d.ts +6 -0
  66. package/dist-types/exports/menus.d.ts.map +1 -0
  67. package/dist-types/exports/page-runtime.d.ts +2 -0
  68. package/dist-types/exports/page-runtime.d.ts.map +1 -0
  69. package/dist-types/exports/pages.d.ts +2 -0
  70. package/dist-types/exports/pages.d.ts.map +1 -0
  71. package/dist-types/exports/resolve.d.ts +2 -0
  72. package/dist-types/exports/resolve.d.ts.map +1 -0
  73. package/dist-types/exports/ssr.d.ts +2 -0
  74. package/dist-types/exports/ssr.d.ts.map +1 -0
  75. package/dist-types/exports/standalone-demo-url.d.ts +2 -0
  76. package/dist-types/exports/standalone-demo-url.d.ts.map +1 -0
  77. package/dist-types/exports/transform.d.ts +2 -0
  78. package/dist-types/exports/transform.d.ts.map +1 -0
  79. package/dist-types/exports/types/hydration.d.ts +23 -0
  80. package/dist-types/exports/types/hydration.d.ts.map +1 -0
  81. package/dist-types/exports/types/rocket.d.ts +504 -0
  82. package/dist-types/exports/types/rocket.d.ts.map +1 -0
  83. package/dist-types/exports/types.d.ts +3 -0
  84. package/dist-types/exports/types.d.ts.map +1 -0
  85. package/dist-types/exports/wds-plugin.d.ts +2 -0
  86. package/dist-types/exports/wds-plugin.d.ts.map +1 -0
  87. package/dist-types/src/PageData.d.ts +82 -0
  88. package/dist-types/src/PageData.d.ts.map +1 -0
  89. package/dist-types/src/RocketCodeBlock.d.ts +64 -0
  90. package/dist-types/src/RocketCodeBlock.d.ts.map +1 -0
  91. package/dist-types/src/RocketIcon.d.ts +35 -0
  92. package/dist-types/src/RocketIcon.d.ts.map +1 -0
  93. package/dist-types/src/RocketJsDemo.d.ts +59 -0
  94. package/dist-types/src/RocketJsDemo.d.ts.map +1 -0
  95. package/dist-types/src/RocketJsDemo.test-browser.d.ts +3 -0
  96. package/dist-types/src/RocketJsDemo.test-browser.d.ts.map +1 -0
  97. package/dist-types/src/RocketRequestDemo.d.ts +57 -0
  98. package/dist-types/src/RocketRequestDemo.d.ts.map +1 -0
  99. package/dist-types/src/RocketRequestDemo.test-browser.d.ts +3 -0
  100. package/dist-types/src/RocketRequestDemo.test-browser.d.ts.map +1 -0
  101. package/dist-types/src/SocialPreviewPlayground.d.ts +102 -0
  102. package/dist-types/src/SocialPreviewPlayground.d.ts.map +1 -0
  103. package/dist-types/src/adapters/netlify.d.ts +54 -0
  104. package/dist-types/src/adapters/netlify.d.ts.map +1 -0
  105. package/dist-types/src/asyncMessage.d.ts +14 -0
  106. package/dist-types/src/asyncMessage.d.ts.map +1 -0
  107. package/dist-types/src/cli/RocketBuild.d.ts +78 -0
  108. package/dist-types/src/cli/RocketBuild.d.ts.map +1 -0
  109. package/dist-types/src/cli/RocketCli.d.ts +17 -0
  110. package/dist-types/src/cli/RocketCli.d.ts.map +1 -0
  111. package/dist-types/src/cli/RocketInit.d.ts +22 -0
  112. package/dist-types/src/cli/RocketInit.d.ts.map +1 -0
  113. package/dist-types/src/cli/RocketStart.d.ts +45 -0
  114. package/dist-types/src/cli/RocketStart.d.ts.map +1 -0
  115. package/dist-types/src/cli/cli.d.ts +3 -0
  116. package/dist-types/src/cli/cli.d.ts.map +1 -0
  117. package/dist-types/src/component-hydration.d.ts +26 -0
  118. package/dist-types/src/component-hydration.d.ts.map +1 -0
  119. package/dist-types/src/components/FeatureList.d.ts +15 -0
  120. package/dist-types/src/components/FeatureList.d.ts.map +1 -0
  121. package/dist-types/src/components/Footer.d.ts +17 -0
  122. package/dist-types/src/components/Footer.d.ts.map +1 -0
  123. package/dist-types/src/components/Header.d.ts +6 -0
  124. package/dist-types/src/components/Header.d.ts.map +1 -0
  125. package/dist-types/src/components/RocketDrawer.d.ts +20 -0
  126. package/dist-types/src/components/RocketDrawer.d.ts.map +1 -0
  127. package/dist-types/src/components/RocketSocialLink.d.ts +30 -0
  128. package/dist-types/src/components/RocketSocialLink.d.ts.map +1 -0
  129. package/dist-types/src/components.d.ts +7 -0
  130. package/dist-types/src/components.d.ts.map +1 -0
  131. package/dist-types/src/config.d.ts +6 -0
  132. package/dist-types/src/config.d.ts.map +1 -0
  133. package/dist-types/src/debounce.d.ts +8 -0
  134. package/dist-types/src/debounce.d.ts.map +1 -0
  135. package/dist-types/src/defaultSocialPreviewTemplate.d.ts +31 -0
  136. package/dist-types/src/defaultSocialPreviewTemplate.d.ts.map +1 -0
  137. package/dist-types/src/development-page-module-loader.d.ts +15 -0
  138. package/dist-types/src/development-page-module-loader.d.ts.map +1 -0
  139. package/dist-types/src/extractCode.d.ts +5 -0
  140. package/dist-types/src/extractCode.d.ts.map +1 -0
  141. package/dist-types/src/hydration/evaluate.d.ts +20 -0
  142. package/dist-types/src/hydration/evaluate.d.ts.map +1 -0
  143. package/dist-types/src/hydration/extractStrategies.d.ts +5 -0
  144. package/dist-types/src/hydration/extractStrategies.d.ts.map +1 -0
  145. package/dist-types/src/hydration/hydrationLoader.d.ts +64 -0
  146. package/dist-types/src/hydration/hydrationLoader.d.ts.map +1 -0
  147. package/dist-types/src/icons.d.ts +182 -0
  148. package/dist-types/src/icons.d.ts.map +1 -0
  149. package/dist-types/src/layouts/atlas/atlasDocLayout.d.ts +45 -0
  150. package/dist-types/src/layouts/atlas/atlasDocLayout.d.ts.map +1 -0
  151. package/dist-types/src/layouts/atlas/atlasHeroLayout.d.ts +7 -0
  152. package/dist-types/src/layouts/atlas/atlasHeroLayout.d.ts.map +1 -0
  153. package/dist-types/src/layouts/atlas/atlasNotFoundLayout.d.ts +5 -0
  154. package/dist-types/src/layouts/atlas/atlasNotFoundLayout.d.ts.map +1 -0
  155. package/dist-types/src/layouts/layout-helper.d.ts +16 -0
  156. package/dist-types/src/layouts/layout-helper.d.ts.map +1 -0
  157. package/dist-types/src/layouts/layout.d.ts +7 -0
  158. package/dist-types/src/layouts/layout.d.ts.map +1 -0
  159. package/dist-types/src/loaded-page-module.d.ts +51 -0
  160. package/dist-types/src/loaded-page-module.d.ts.map +1 -0
  161. package/dist-types/src/main.d.ts +2 -0
  162. package/dist-types/src/main.d.ts.map +1 -0
  163. package/dist-types/src/markdownCompiler.d.ts +22 -0
  164. package/dist-types/src/markdownCompiler.d.ts.map +1 -0
  165. package/dist-types/src/markdownHook.d.ts +6 -0
  166. package/dist-types/src/markdownHook.d.ts.map +1 -0
  167. package/dist-types/src/menu.d.ts +22 -0
  168. package/dist-types/src/menu.d.ts.map +1 -0
  169. package/dist-types/src/menus/MainMenu.d.ts +23 -0
  170. package/dist-types/src/menus/MainMenu.d.ts.map +1 -0
  171. package/dist-types/src/menus/RocketMenu.d.ts +23 -0
  172. package/dist-types/src/menus/RocketMenu.d.ts.map +1 -0
  173. package/dist-types/src/menus/RocketNextPage.d.ts +18 -0
  174. package/dist-types/src/menus/RocketNextPage.d.ts.map +1 -0
  175. package/dist-types/src/menus/RocketPreviousPage.d.ts +18 -0
  176. package/dist-types/src/menus/RocketPreviousPage.d.ts.map +1 -0
  177. package/dist-types/src/menus/RocketToc.d.ts +54 -0
  178. package/dist-types/src/menus/RocketToc.d.ts.map +1 -0
  179. package/dist-types/src/menus/pageNavigation.d.ts +41 -0
  180. package/dist-types/src/menus/pageNavigation.d.ts.map +1 -0
  181. package/dist-types/src/page-pagination.d.ts +69 -0
  182. package/dist-types/src/page-pagination.d.ts.map +1 -0
  183. package/dist-types/src/page-runtime.d.ts +110 -0
  184. package/dist-types/src/page-runtime.d.ts.map +1 -0
  185. package/dist-types/src/pages.d.ts +10 -0
  186. package/dist-types/src/pages.d.ts.map +1 -0
  187. package/dist-types/src/publicAssets.d.ts +70 -0
  188. package/dist-types/src/publicAssets.d.ts.map +1 -0
  189. package/dist-types/src/requestDemoMetadata.d.ts +19 -0
  190. package/dist-types/src/requestDemoMetadata.d.ts.map +1 -0
  191. package/dist-types/src/resolve.d.ts +7 -0
  192. package/dist-types/src/resolve.d.ts.map +1 -0
  193. package/dist-types/src/siteDiscoverability.d.ts +33 -0
  194. package/dist-types/src/siteDiscoverability.d.ts.map +1 -0
  195. package/dist-types/src/siteHeadMetadata.d.ts +20 -0
  196. package/dist-types/src/siteHeadMetadata.d.ts.map +1 -0
  197. package/dist-types/src/socialPreviewImages.d.ts +186 -0
  198. package/dist-types/src/socialPreviewImages.d.ts.map +1 -0
  199. package/dist-types/src/socialPreviewTemplatePreview.d.ts +22 -0
  200. package/dist-types/src/socialPreviewTemplatePreview.d.ts.map +1 -0
  201. package/dist-types/src/ssr.d.ts +6 -0
  202. package/dist-types/src/ssr.d.ts.map +1 -0
  203. package/dist-types/src/standalone-demo-url.d.ts +60 -0
  204. package/dist-types/src/standalone-demo-url.d.ts.map +1 -0
  205. package/dist-types/src/static-page-module-loader.d.ts +15 -0
  206. package/dist-types/src/static-page-module-loader.d.ts.map +1 -0
  207. package/dist-types/src/transform.d.ts +10 -0
  208. package/dist-types/src/transform.d.ts.map +1 -0
  209. package/dist-types/src/urlLifecycle.d.ts +23 -0
  210. package/dist-types/src/urlLifecycle.d.ts.map +1 -0
  211. package/dist-types/src/wds-plugin.d.ts +15 -0
  212. package/dist-types/src/wds-plugin.d.ts.map +1 -0
  213. package/docs/assets/home-background.svg +1 -0
  214. package/docs/assets/prism-one-light.css +368 -0
  215. package/docs/assets/rocket-logo-dark-with-text-below.svg +8 -0
  216. package/docs/assets/rocket-logo-dark-with-text.svg +7 -0
  217. package/docs/assets/rocket-logo-dark.svg +7 -0
  218. package/docs/assets/rocket-logo-light-with-text-below.svg +14 -0
  219. package/docs/assets/rocket-logo-light-with-text.svg +13 -0
  220. package/docs/assets/rocket-logo-light.svg +12 -0
  221. package/docs/assets/rocket-text-no-logo.svg +3 -0
  222. package/exports/MainMenu.js +1 -0
  223. package/exports/PageData.js +1 -0
  224. package/exports/RocketCodeBlock.js +1 -0
  225. package/exports/RocketIcon.js +1 -0
  226. package/exports/RocketJsDemo.js +1 -0
  227. package/exports/RocketRequestDemo.js +1 -0
  228. package/exports/SocialPreviewPlayground.js +1 -0
  229. package/exports/adapters/netlify.js +1 -0
  230. package/exports/asyncMessage.js +1 -0
  231. package/exports/component-hydration.js +1 -0
  232. package/exports/components/web-awesome.js +63 -0
  233. package/exports/components.js +1 -0
  234. package/exports/config.js +1 -0
  235. package/exports/debounce.js +1 -0
  236. package/exports/define/RocketCodeBlock.js +2 -0
  237. package/exports/define/RocketIcon.js +3 -0
  238. package/exports/define/RocketJsDemo.js +5 -0
  239. package/exports/define/RocketRequestDemo.js +5 -0
  240. package/exports/define/menus.js +14 -0
  241. package/exports/extractCode.js +1 -0
  242. package/exports/globalData.js +1 -0
  243. package/exports/hydration/hydrationLoader.js +1 -0
  244. package/exports/icons.js +11 -0
  245. package/exports/layout-helper.js +1 -0
  246. package/exports/layout.js +1 -0
  247. package/exports/layouts/_atlas.css +3 -0
  248. package/exports/layouts/atlasDoc.js +5 -0
  249. package/exports/layouts/atlasHero.js +1 -0
  250. package/exports/layouts/atlasNotFound.js +4 -0
  251. package/exports/loaded-page-module.js +5 -0
  252. package/exports/markdownHook.js +4 -0
  253. package/exports/menu.js +4 -0
  254. package/exports/menus.js +5 -0
  255. package/exports/page-runtime.js +5 -0
  256. package/exports/pages.js +1 -0
  257. package/exports/resolve.js +1 -0
  258. package/exports/ssr.js +1 -0
  259. package/exports/standalone-demo-url.js +10 -0
  260. package/exports/transform.js +1 -0
  261. package/exports/types/hydration.ts +26 -0
  262. package/exports/types/rocket.ts +598 -0
  263. package/exports/types.ts +71 -0
  264. package/exports/wds-plugin.js +1 -0
  265. package/package.json +192 -9
  266. package/src/PageData.js +244 -0
  267. package/src/RocketCodeBlock.js +516 -0
  268. package/src/RocketIcon.js +291 -0
  269. package/src/RocketJsDemo.js +397 -0
  270. package/src/RocketJsDemo.test-browser.js +228 -0
  271. package/src/RocketRequestDemo.js +439 -0
  272. package/src/RocketRequestDemo.test-browser.js +301 -0
  273. package/src/SocialPreviewPlayground.js +573 -0
  274. package/src/adapters/netlify.js +814 -0
  275. package/src/asyncMessage.js +21 -0
  276. package/src/cli/RocketBuild.js +581 -0
  277. package/src/cli/RocketCli.js +47 -0
  278. package/src/cli/RocketInit.js +636 -0
  279. package/src/cli/RocketStart.js +145 -0
  280. package/src/cli/cli.js +7 -0
  281. package/src/component-hydration.js +86 -0
  282. package/src/components/FeatureList.js +114 -0
  283. package/src/components/Footer.js +116 -0
  284. package/src/components/Header.js +122 -0
  285. package/src/components/RocketDrawer.js +193 -0
  286. package/src/components/RocketSocialLink.js +128 -0
  287. package/src/components/assets/discord.svg +7 -0
  288. package/src/components/assets/github.svg +4 -0
  289. package/src/components/assets/gitlab.svg +1 -0
  290. package/src/components/assets/info.txt +1 -0
  291. package/src/components/assets/license.svg +3 -0
  292. package/src/components/assets/npm.svg +5 -0
  293. package/src/components/assets/slack.svg +5 -0
  294. package/src/components/assets/telegram.svg +4 -0
  295. package/src/components/assets/twitter.svg +1 -0
  296. package/src/components.js +34 -0
  297. package/src/config.js +319 -0
  298. package/src/debounce.js +21 -0
  299. package/src/defaultSocialPreviewTemplate.js +118 -0
  300. package/src/development-page-module-loader.js +29 -0
  301. package/src/extractCode.js +41 -0
  302. package/src/hydration/evaluate.js +54 -0
  303. package/src/hydration/extractStrategies.js +91 -0
  304. package/src/hydration/hydrationLoader.js +330 -0
  305. package/src/icons.js +898 -0
  306. package/src/layouts/atlas/atlasDoc.css +877 -0
  307. package/src/layouts/atlas/atlasDocLayout.js +275 -0
  308. package/src/layouts/atlas/atlasHero.css +774 -0
  309. package/src/layouts/atlas/atlasHeroLayout.js +337 -0
  310. package/src/layouts/atlas/atlasNotFound.css +365 -0
  311. package/src/layouts/atlas/atlasNotFoundLayout.js +69 -0
  312. package/src/layouts/layout-helper.js +92 -0
  313. package/src/layouts/layout.js +52 -0
  314. package/src/loaded-page-module.js +97 -0
  315. package/src/main.js +72 -0
  316. package/src/markdownCompiler.js +303 -0
  317. package/src/markdownHook.js +148 -0
  318. package/src/menu.js +210 -0
  319. package/src/menus/MainMenu.js +58 -0
  320. package/src/menus/RocketMenu.js +191 -0
  321. package/src/menus/RocketNextPage.js +25 -0
  322. package/src/menus/RocketPreviousPage.js +29 -0
  323. package/src/menus/RocketToc.js +309 -0
  324. package/src/menus/pageNavigation.js +285 -0
  325. package/src/page-pagination.js +241 -0
  326. package/src/page-runtime.js +481 -0
  327. package/src/pages.js +537 -0
  328. package/src/publicAssets.js +336 -0
  329. package/src/requestDemoMetadata.js +97 -0
  330. package/src/resolve.js +15 -0
  331. package/src/siteDiscoverability.js +184 -0
  332. package/src/siteHeadMetadata.js +69 -0
  333. package/src/socialPreviewImages.js +482 -0
  334. package/src/socialPreviewTemplatePreview.js +352 -0
  335. package/src/ssr.js +14 -0
  336. package/src/standalone-demo-url.js +147 -0
  337. package/src/static-page-module-loader.js +29 -0
  338. package/src/transform.js +720 -0
  339. package/src/urlLifecycle.js +57 -0
  340. 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
+ }