@rocket/js 0.0.0 → 0.1.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.
Files changed (340) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +224 -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 +13 -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 +5 -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 +170 -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 +9 -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 +14 -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 +8 -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 +545 -0
  277. package/src/cli/RocketCli.js +47 -0
  278. package/src/cli/RocketInit.js +323 -0
  279. package/src/cli/RocketStart.js +79 -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 +15 -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 +883 -0
  306. package/src/layouts/atlas/atlasDoc.css +877 -0
  307. package/src/layouts/atlas/atlasDocLayout.js +288 -0
  308. package/src/layouts/atlas/atlasHero.css +774 -0
  309. package/src/layouts/atlas/atlasHeroLayout.js +346 -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 +62 -0
  314. package/src/loaded-page-module.js +97 -0
  315. package/src/main.js +55 -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 +134 -0
  337. package/src/static-page-module-loader.js +29 -0
  338. package/src/transform.js +633 -0
  339. package/src/urlLifecycle.js +57 -0
  340. package/src/wds-plugin.js +302 -0
@@ -0,0 +1,323 @@
1
+ /* eslint-disable no-console */
2
+ import { existsSync, mkdirSync, 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 ROCKET_AGENT_SKILL_PATH = '.agents/skills/rocket/SKILL.md';
8
+
9
+ const rocketConfigSource = `/** @type {import('@rocket/js/types.js').RocketConfig} */
10
+ export default {
11
+ includeGlobs: ['docs/pages/**/*.rocket.{md,js}', 'src/**/*.rocket.{md,js}'],
12
+ };
13
+ `;
14
+
15
+ const indexPageSource = `\`\`\`js server
16
+ export const config = {
17
+ path: '/',
18
+ metadata: {
19
+ title: 'Rocket Site',
20
+ description: 'Documentation built with Rocket.',
21
+ },
22
+ };
23
+
24
+ export { layout } from '@rocket/js/layout.js';
25
+ \`\`\`
26
+
27
+ # Rocket Site
28
+
29
+ This Page is rendered by Rocket.
30
+
31
+ ## Next steps
32
+
33
+ - Edit this Page in \`docs/pages/index.rocket.md\`.
34
+ - Add general documentation Pages under \`docs/pages\`.
35
+ - Add component reference Pages next to the components they document.
36
+ - Run \`npm run build\` to verify the site.
37
+ `;
38
+
39
+ const rocketAgentSkillSource = `---
40
+ name: rocket
41
+ description: Use when editing Rocket Pages, config, layouts, component reference Pages, or build behavior in this project.
42
+ ---
43
+
44
+ # Rocket
45
+
46
+ Use this skill when working on this project's Rocket site.
47
+
48
+ ## Rules
49
+
50
+ - Read \`rocket-config.js\` before changing Pages.
51
+ - Rocket discovers Pages from \`includeGlobs\`.
52
+ - Every Page owns its public URL through \`config.path\`.
53
+ - Put general documentation Pages under \`docs/pages\`.
54
+ - Put component reference Pages next to the component they document.
55
+ - Prefer Markdown Pages for durable content.
56
+ - Use JavaScript Pages only for request-time or programmatic rendering.
57
+ - Keep Rocket changes buildable with \`npm run build\`.
58
+ `;
59
+
60
+ export class RocketInit {
61
+ /**
62
+ * @param {import('commander').Command} program
63
+ */
64
+ async setupCommand(program) {
65
+ program
66
+ .command('init')
67
+ .description('create a minimal Rocket project shape')
68
+ .action(() => {
69
+ const result = this.init();
70
+ reportInitResult(result);
71
+ });
72
+ }
73
+
74
+ /**
75
+ * @returns {RocketInitResult}
76
+ */
77
+ init() {
78
+ const packageJsonUpdate = preparePackageJsonUpdate('package.json');
79
+ /** @type {RocketInitResult} */
80
+ const result = {
81
+ created: [],
82
+ skipped: [],
83
+ packageJson: packageJsonUpdate?.summary,
84
+ missingRocketDependency: Boolean(packageJsonUpdate?.missingRocketDependency),
85
+ nextSteps: packageJsonUpdate?.nextSteps || ['npx rocket start', 'npx rocket build'],
86
+ };
87
+
88
+ if (packageJsonUpdate?.changed) {
89
+ writeJsonFile('package.json', packageJsonUpdate.packageJson);
90
+ }
91
+
92
+ writeFileIfMissing(ROCKET_CONFIG_PATH, rocketConfigSource, result);
93
+ writeFileIfMissing(INDEX_PAGE_PATH, indexPageSource, result);
94
+ writeFileIfMissing(ROCKET_AGENT_SKILL_PATH, rocketAgentSkillSource, result);
95
+
96
+ return result;
97
+ }
98
+ }
99
+
100
+ /**
101
+ * @typedef {{
102
+ * created: string[];
103
+ * skipped: string[];
104
+ * packageJson?: {
105
+ * path: string;
106
+ * updated: string[];
107
+ * skipped: string[];
108
+ * };
109
+ * missingRocketDependency: boolean;
110
+ * nextSteps: string[];
111
+ * }} RocketInitResult
112
+ */
113
+
114
+ /**
115
+ * @param {string} filePath
116
+ * @returns {{
117
+ * changed: boolean;
118
+ * packageJson: Record<string, any>;
119
+ * summary: NonNullable<RocketInitResult['packageJson']>;
120
+ * missingRocketDependency: boolean;
121
+ * nextSteps: string[];
122
+ * } | undefined}
123
+ */
124
+ function preparePackageJsonUpdate(filePath) {
125
+ if (!existsSync(filePath)) {
126
+ return undefined;
127
+ }
128
+ if (!statSync(filePath).isFile()) {
129
+ throw new Error('package.json exists but is not a file');
130
+ }
131
+
132
+ const packageJson = JSON.parse(readFileSync(filePath, 'utf8'));
133
+ if (!isPlainRecord(packageJson)) {
134
+ throw new Error('package.json must contain a JSON object');
135
+ }
136
+ if (packageJson.type === 'commonjs') {
137
+ throw new Error(
138
+ `Rocket init expects an ESM project. Found package.json type "commonjs". ` +
139
+ `Change package.json to "type": "module" before running rocket init.`,
140
+ );
141
+ }
142
+
143
+ /** @type {string[]} */
144
+ const updated = [];
145
+ /** @type {string[]} */
146
+ const skipped = [];
147
+
148
+ if (!hasOwn(packageJson, 'type')) {
149
+ packageJson.type = 'module';
150
+ updated.push('type');
151
+ } else if (packageJson.type === 'module') {
152
+ skipped.push('type');
153
+ }
154
+
155
+ if (!hasOwn(packageJson, 'scripts')) {
156
+ packageJson.scripts = {};
157
+ updated.push('scripts');
158
+ }
159
+ if (isPlainRecord(packageJson.scripts)) {
160
+ addRocketScript(packageJson.scripts, {
161
+ genericName: 'start',
162
+ fallbackName: 'rocket:start',
163
+ command: 'rocket start',
164
+ updated,
165
+ skipped,
166
+ });
167
+ addRocketScript(packageJson.scripts, {
168
+ genericName: 'build',
169
+ fallbackName: 'rocket:build',
170
+ command: 'rocket build',
171
+ updated,
172
+ skipped,
173
+ });
174
+ } else {
175
+ skipped.push('scripts');
176
+ }
177
+
178
+ return {
179
+ changed: updated.length > 0,
180
+ packageJson,
181
+ summary: {
182
+ path: filePath,
183
+ updated,
184
+ skipped,
185
+ },
186
+ missingRocketDependency: !hasPackageDependency(packageJson, '@rocket/js'),
187
+ nextSteps: rocketNextSteps(packageJson),
188
+ };
189
+ }
190
+
191
+ /**
192
+ * @param {Record<string, any>} scripts
193
+ * @param {{
194
+ * genericName: string;
195
+ * fallbackName: string;
196
+ * command: string;
197
+ * updated: string[];
198
+ * skipped: string[];
199
+ * }} options
200
+ */
201
+ function addRocketScript(scripts, { genericName, fallbackName, command, updated, skipped }) {
202
+ if (!hasOwn(scripts, genericName)) {
203
+ scripts[genericName] = command;
204
+ updated.push(`scripts.${genericName}`);
205
+ return;
206
+ }
207
+ if (scripts[genericName] === command) {
208
+ skipped.push(`scripts.${genericName}`);
209
+ return;
210
+ }
211
+ if (!hasOwn(scripts, fallbackName)) {
212
+ scripts[fallbackName] = command;
213
+ updated.push(`scripts.${fallbackName}`);
214
+ return;
215
+ }
216
+ skipped.push(`scripts.${genericName}`);
217
+ skipped.push(`scripts.${fallbackName}`);
218
+ }
219
+
220
+ /**
221
+ * @param {Record<string, any>} packageJson
222
+ * @param {string} dependencyName
223
+ * @returns {boolean}
224
+ */
225
+ function hasPackageDependency(packageJson, dependencyName) {
226
+ return ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].some(
227
+ field => isPlainRecord(packageJson[field]) && hasOwn(packageJson[field], dependencyName),
228
+ );
229
+ }
230
+
231
+ /**
232
+ * @param {Record<string, any>} packageJson
233
+ * @returns {string[]}
234
+ */
235
+ function rocketNextSteps(packageJson) {
236
+ if (!isPlainRecord(packageJson.scripts)) {
237
+ return ['npx rocket start', 'npx rocket build'];
238
+ }
239
+ return [
240
+ npmScriptCommand(packageJson.scripts, 'start', 'rocket:start', 'rocket start'),
241
+ npmScriptCommand(packageJson.scripts, 'build', 'rocket:build', 'rocket build'),
242
+ ];
243
+ }
244
+
245
+ /**
246
+ * @param {Record<string, any>} scripts
247
+ * @param {string} genericName
248
+ * @param {string} fallbackName
249
+ * @param {string} command
250
+ */
251
+ function npmScriptCommand(scripts, genericName, fallbackName, command) {
252
+ if (scripts[genericName] === command) {
253
+ return genericName === 'start' ? 'npm start' : `npm run ${genericName}`;
254
+ }
255
+ if (scripts[fallbackName] === command) {
256
+ return `npm run ${fallbackName}`;
257
+ }
258
+ return `npx rocket ${genericName}`;
259
+ }
260
+
261
+ /**
262
+ * @param {string} filePath
263
+ * @param {string} contents
264
+ * @param {RocketInitResult} result
265
+ */
266
+ function writeFileIfMissing(filePath, contents, result) {
267
+ if (existsSync(filePath)) {
268
+ result.skipped.push(filePath);
269
+ return;
270
+ }
271
+ mkdirSync(path.dirname(filePath), { recursive: true });
272
+ writeFileSync(filePath, contents);
273
+ result.created.push(filePath);
274
+ }
275
+
276
+ /**
277
+ * @param {string} filePath
278
+ * @param {Record<string, any>} value
279
+ */
280
+ function writeJsonFile(filePath, value) {
281
+ writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`);
282
+ }
283
+
284
+ /**
285
+ * @param {RocketInitResult} result
286
+ */
287
+ function reportInitResult(result) {
288
+ for (const filePath of result.created) {
289
+ console.log(`Created ${filePath}`);
290
+ }
291
+ for (const filePath of result.skipped) {
292
+ console.log(`Skipped ${filePath} (already exists)`);
293
+ }
294
+ if (result.packageJson?.updated.length) {
295
+ console.log(`Updated ${result.packageJson.path}: ${result.packageJson.updated.join(', ')}`);
296
+ } else if (result.packageJson) {
297
+ console.log(`Skipped ${result.packageJson.path} (already configured)`);
298
+ }
299
+ if (result.missingRocketDependency) {
300
+ console.log('Note: package.json does not list @rocket/js. Add it with: npm install @rocket/js');
301
+ }
302
+ console.log('');
303
+ console.log('Next steps:');
304
+ for (const step of result.nextSteps) {
305
+ console.log(` ${step}`);
306
+ }
307
+ }
308
+
309
+ /**
310
+ * @param {unknown} value
311
+ * @returns {value is Record<string, any>}
312
+ */
313
+ function isPlainRecord(value) {
314
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
315
+ }
316
+
317
+ /**
318
+ * @param {Record<string, any>} record
319
+ * @param {string} field
320
+ */
321
+ function hasOwn(record, field) {
322
+ return Object.prototype.hasOwnProperty.call(record, field);
323
+ }
@@ -0,0 +1,79 @@
1
+ /* eslint-disable no-console */
2
+ import { spawn } from 'child_process';
3
+ import { watch } from 'fs';
4
+ import { debounce } from '../debounce.js';
5
+ import path from 'path';
6
+
7
+ export class RocketStart {
8
+ /**
9
+ * @param {import('commander').Command} program
10
+ * @param {import('./RocketCli.js').RocketCli} cli
11
+ */
12
+ async setupCommand(program, cli) {
13
+ this.cli = cli;
14
+
15
+ program.command('start').action(async () => {
16
+ await cli.getConfig();
17
+ await this.start();
18
+ });
19
+ }
20
+
21
+ spawnServer() {
22
+ process.stdin.setRawMode?.(true);
23
+ return spawn(
24
+ 'node',
25
+ [path.join(import.meta.dirname, '../main.js'), this.cli?.configFilePath || ''],
26
+ {
27
+ stdio: 'inherit',
28
+ cwd: process.cwd(),
29
+ },
30
+ );
31
+ }
32
+
33
+ restartServer() {
34
+ this.server?.kill();
35
+ this.server = this.spawnServer();
36
+ console.clear();
37
+ console.log('Restarting rocket server...');
38
+ }
39
+
40
+ async start() {
41
+ this.server = this.spawnServer();
42
+
43
+ // watch config
44
+ watch(
45
+ path.join(process.cwd(), this.cli?.configFilePath || 'rocket-config.js'),
46
+ debounce(async (_, filename) => {
47
+ if (!filename) {
48
+ return;
49
+ }
50
+ this.restartServer();
51
+ }, 100),
52
+ );
53
+
54
+ // watch src
55
+ watch(
56
+ import.meta.dirname,
57
+ { recursive: true },
58
+ debounce(async (_, filename) => {
59
+ if (!filename) {
60
+ return;
61
+ }
62
+ this.restartServer();
63
+ }, 100),
64
+ );
65
+
66
+ process.stdin.on('data', data => {
67
+ const char = data.toString();
68
+ if (char === '\u0003' || char === '\u0004') {
69
+ // Ctrl+C or Ctrl+D
70
+ this.server?.kill();
71
+ process.exit(0);
72
+ } else if (char === '\u0012') {
73
+ // Ctrl+R
74
+ this.restartServer();
75
+ }
76
+ });
77
+ console.log('Restart the server with Ctrl+R');
78
+ }
79
+ }
package/src/cli/cli.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { RocketCli } from './RocketCli.js';
4
+
5
+ const cli = new RocketCli();
6
+
7
+ await cli.start();
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @typedef {import('@rocket/js/types.js').Components} Components
3
+ * @typedef {Record<string, CustomElementConstructor>} ComponentModule
4
+ * @typedef {(file: string) => Promise<ComponentModule>} LoadComponentModule
5
+ * @typedef {(file: string) => string} ResolveBrowserImport
6
+ */
7
+
8
+ /**
9
+ * @param {{
10
+ * customElementsRegistry?: CustomElementRegistry;
11
+ * loadComponentModule: LoadComponentModule;
12
+ * resolveBrowserImport: ResolveBrowserImport;
13
+ * hydrationLoaderSpecifier: string;
14
+ * }} options
15
+ * @returns {(components: Components) => Promise<string>}
16
+ */
17
+ export function createComponentHydration({
18
+ customElementsRegistry,
19
+ loadComponentModule,
20
+ resolveBrowserImport,
21
+ hydrationLoaderSpecifier,
22
+ }) {
23
+ return async function parseComponents(components) {
24
+ const serverOnlyComponents = [];
25
+ const clientComponents = [];
26
+ const hydratedComponents = [];
27
+ for (const [name, { file, className, loading }] of Object.entries(components)) {
28
+ if (loading === 'server') {
29
+ const module = await loadComponentModule(file);
30
+ serverOnlyComponents.push({ name, file, className, module });
31
+ } else if (loading === 'client') {
32
+ clientComponents.push({ name, file, className });
33
+ } else if (loading.startsWith('hydrate:')) {
34
+ const module = await loadComponentModule(file);
35
+ hydratedComponents.push({
36
+ name,
37
+ file,
38
+ className,
39
+ module,
40
+ strategy: loading.slice('hydrate:'.length),
41
+ });
42
+ }
43
+ }
44
+
45
+ const registry = customElementsRegistry || customElements;
46
+ registry.__definitions.clear();
47
+ // @ts-ignore
48
+ registry.__reverseDefinitions.clear();
49
+ for (const component of serverOnlyComponents.concat(hydratedComponents)) {
50
+ if (!component.module[component.className]) {
51
+ throw new Error(
52
+ `Component ${component.name} does not export a class named ${component.className}`,
53
+ );
54
+ }
55
+ registry.define(component.name, component.module[component.className]);
56
+ }
57
+
58
+ let clientCode = clientComponents
59
+ .map(
60
+ component =>
61
+ `import('${resolveBrowserImport(
62
+ component.file,
63
+ )}').then(module => customElements.get('${component.name}') || customElements.define('${
64
+ component.name
65
+ }', module.${component.className}));\n`,
66
+ )
67
+ .join('');
68
+ if (hydratedComponents.length) {
69
+ clientCode += [
70
+ `import {HydrationLoader} from '${hydrationLoaderSpecifier}';`,
71
+ 'const hydratedComponents = {',
72
+ ...hydratedComponents.map(
73
+ component =>
74
+ `'${component.name}': {getter: () => import('${resolveBrowserImport(
75
+ component.file,
76
+ )}').then(m => m.${component.className}),
77
+ strategy: ${JSON.stringify(component.strategy)}},`,
78
+ ),
79
+ '};',
80
+ 'const hydrationLoader = new HydrationLoader(hydratedComponents);',
81
+ 'hydrationLoader.init();',
82
+ ].join('\n');
83
+ }
84
+ return clientCode;
85
+ };
86
+ }
@@ -0,0 +1,114 @@
1
+ import { LitElement, html, css } from 'lit';
2
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
3
+
4
+ /** @typedef {import('@rocket/js/types.js').Feature} Feature */
5
+
6
+ export class FeatureList extends LitElement {
7
+ static properties = {
8
+ features: { type: Array },
9
+ };
10
+
11
+ constructor() {
12
+ super();
13
+ /** @type {Feature[]} */
14
+ this.features = [];
15
+ }
16
+
17
+ static styles = css`
18
+ :host {
19
+ display: block;
20
+ margin: 4rem auto 200px auto;
21
+ max-width: 1200px;
22
+ width: 100%;
23
+ --color-white: white;
24
+ }
25
+ .features {
26
+ display: grid;
27
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
28
+ gap: 2.5rem;
29
+ }
30
+ .feature-card {
31
+ background: var(--color-white);
32
+ padding: 2rem 3rem;
33
+ border-radius: 1rem;
34
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
35
+ transition: transform 0.2s ease-in-out;
36
+ }
37
+ .feature-card:hover {
38
+ transform: translateY(-4px);
39
+ }
40
+ .feature-card span {
41
+ font-size: 1.8rem;
42
+ margin-right: 0.5rem;
43
+ }
44
+ .feature-card h3 {
45
+ font-size: 1.6rem;
46
+ margin: 0.5rem 0;
47
+ color: var(--primary-text-color);
48
+ }
49
+ .feature-card p {
50
+ font-size: 1.2rem;
51
+ }
52
+ /* stagger every even card downwards */
53
+ .feature-card:nth-child(2n) {
54
+ transform: translateY(50%);
55
+ }
56
+ .feature-card:nth-child(2n):hover {
57
+ transform: translateY(calc(50% - 4px));
58
+ }
59
+ span svg {
60
+ width: 1em;
61
+ transform: translateY(5px);
62
+ }
63
+
64
+ @media (max-width: 910px) {
65
+ :host {
66
+ margin-bottom: 100px;
67
+ }
68
+
69
+ .features {
70
+ grid-template-columns: 1fr;
71
+ padding: 0 1.5rem;
72
+ gap: 1.5rem;
73
+ }
74
+
75
+ .feature-card {
76
+ padding: 1.5rem 2rem;
77
+ }
78
+
79
+ .feature-card:nth-child(2n) {
80
+ transform: none; /* disable stagger */
81
+ }
82
+
83
+ .feature-card:nth-child(2n):hover {
84
+ transform: translateY(-4px);
85
+ }
86
+
87
+ .feature-card h3 {
88
+ font-size: 1.4rem;
89
+ }
90
+
91
+ .feature-card p {
92
+ font-size: 1rem;
93
+ }
94
+ }
95
+ `;
96
+
97
+ render() {
98
+ return html`
99
+ <div class="features">
100
+ ${this.features.map(
101
+ card => html`
102
+ <div class="feature-card">
103
+ <h3>
104
+ <span> ${card.icon.startsWith('<svg') ? unsafeHTML(card.icon) : card.icon} </span>
105
+ ${card.title}
106
+ </h3>
107
+ <p>${card.description}</p>
108
+ </div>
109
+ `,
110
+ )}
111
+ </div>
112
+ `;
113
+ }
114
+ }