piral-cli 1.0.0-pre.2296 → 1.0.1-beta.5640

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 (408) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +30 -7
  3. package/lib/api.js +23 -23
  4. package/lib/api.js.map +1 -1
  5. package/lib/apps/add-piral-instance-pilet.d.ts +26 -0
  6. package/lib/apps/add-piral-instance-pilet.js +53 -0
  7. package/lib/apps/add-piral-instance-pilet.js.map +1 -0
  8. package/lib/apps/build-pilet.d.ts +33 -2
  9. package/lib/apps/build-pilet.js +159 -32
  10. package/lib/apps/build-pilet.js.map +1 -1
  11. package/lib/apps/build-piral.d.ts +18 -1
  12. package/lib/apps/build-piral.js +68 -52
  13. package/lib/apps/build-piral.js.map +1 -1
  14. package/lib/apps/debug-pilet.d.ts +38 -2
  15. package/lib/apps/debug-pilet.js +150 -108
  16. package/lib/apps/debug-pilet.js.map +1 -1
  17. package/lib/apps/debug-piral.d.ts +23 -0
  18. package/lib/apps/debug-piral.js +63 -52
  19. package/lib/apps/debug-piral.js.map +1 -1
  20. package/lib/apps/declaration-piral.js +5 -3
  21. package/lib/apps/declaration-piral.js.map +1 -1
  22. package/lib/apps/index.d.ts +3 -0
  23. package/lib/apps/index.js +8 -1
  24. package/lib/apps/index.js.map +1 -1
  25. package/lib/apps/new-pilet.d.ts +7 -3
  26. package/lib/apps/new-pilet.js +47 -52
  27. package/lib/apps/new-pilet.js.map +1 -1
  28. package/lib/apps/new-piral.d.ts +7 -3
  29. package/lib/apps/new-piral.js +33 -23
  30. package/lib/apps/new-piral.js.map +1 -1
  31. package/lib/apps/pack-pilet.d.ts +9 -0
  32. package/lib/apps/pack-pilet.js +6 -13
  33. package/lib/apps/pack-pilet.js.map +1 -1
  34. package/lib/apps/publish-pilet.d.ts +23 -3
  35. package/lib/apps/publish-pilet.js +112 -62
  36. package/lib/apps/publish-pilet.js.map +1 -1
  37. package/lib/apps/publish-piral.d.ts +6 -2
  38. package/lib/apps/publish-piral.js +30 -26
  39. package/lib/apps/publish-piral.js.map +1 -1
  40. package/lib/apps/remove-piral-instance-pilet.d.ts +22 -0
  41. package/lib/apps/remove-piral-instance-pilet.js +52 -0
  42. package/lib/apps/remove-piral-instance-pilet.js.map +1 -0
  43. package/lib/apps/run-emulator-piral.d.ts +34 -0
  44. package/lib/apps/run-emulator-piral.js +91 -0
  45. package/lib/apps/run-emulator-piral.js.map +1 -0
  46. package/lib/apps/upgrade-pilet.d.ts +6 -2
  47. package/lib/apps/upgrade-pilet.js +41 -43
  48. package/lib/apps/upgrade-pilet.js.map +1 -1
  49. package/lib/apps/upgrade-piral.d.ts +2 -2
  50. package/lib/apps/upgrade-piral.js +21 -20
  51. package/lib/apps/upgrade-piral.js.map +1 -1
  52. package/lib/apps/validate-pilet.js +30 -36
  53. package/lib/apps/validate-pilet.js.map +1 -1
  54. package/lib/apps/validate-piral.js +13 -10
  55. package/lib/apps/validate-piral.js.map +1 -1
  56. package/lib/build/bundler-calls.d.ts +3 -0
  57. package/lib/build/bundler-calls.js +117 -0
  58. package/lib/build/bundler-calls.js.map +1 -0
  59. package/lib/build/run-build-pilet.d.ts +1 -0
  60. package/lib/build/run-build-pilet.js +65 -0
  61. package/lib/build/run-build-pilet.js.map +1 -0
  62. package/lib/build/run-build-piral.d.ts +1 -0
  63. package/lib/build/run-build-piral.js +67 -0
  64. package/lib/build/run-build-piral.js.map +1 -0
  65. package/lib/build/run-debug-mono-piral.d.ts +1 -0
  66. package/lib/build/run-debug-mono-piral.js +70 -0
  67. package/lib/build/run-debug-mono-piral.js.map +1 -0
  68. package/lib/build/run-debug-pilet.d.ts +1 -0
  69. package/lib/build/run-debug-pilet.js +89 -0
  70. package/lib/build/run-debug-pilet.js.map +1 -0
  71. package/lib/build/run-debug-piral.d.ts +1 -0
  72. package/lib/build/run-debug-piral.js +85 -0
  73. package/lib/build/run-debug-piral.js.map +1 -0
  74. package/lib/bundler.js +75 -26
  75. package/lib/bundler.js.map +1 -1
  76. package/lib/cli.js +7 -4
  77. package/lib/cli.js.map +1 -1
  78. package/lib/commands.js +266 -46
  79. package/lib/commands.js.map +1 -1
  80. package/lib/common/archive.d.ts +4 -0
  81. package/lib/common/archive.js +31 -10
  82. package/lib/common/archive.js.map +1 -1
  83. package/lib/common/browser.d.ts +2 -1
  84. package/lib/common/browser.js +17 -8
  85. package/lib/common/browser.js.map +1 -1
  86. package/lib/common/clients/index.d.ts +21 -0
  87. package/lib/common/clients/index.js +48 -0
  88. package/lib/common/clients/index.js.map +1 -0
  89. package/lib/common/clients/lerna.d.ts +7 -1
  90. package/lib/common/clients/lerna.js +93 -7
  91. package/lib/common/clients/lerna.js.map +1 -1
  92. package/lib/common/clients/npm.d.ts +6 -1
  93. package/lib/common/clients/npm.js +66 -18
  94. package/lib/common/clients/npm.js.map +1 -1
  95. package/lib/common/clients/pnp.d.ts +7 -0
  96. package/lib/common/clients/pnp.js +104 -0
  97. package/lib/common/clients/pnp.js.map +1 -0
  98. package/lib/common/clients/pnpm.d.ts +5 -0
  99. package/lib/common/clients/pnpm.js +55 -6
  100. package/lib/common/clients/pnpm.js.map +1 -1
  101. package/lib/common/clients/rush.d.ts +7 -0
  102. package/lib/common/clients/rush.js +127 -0
  103. package/lib/common/clients/rush.js.map +1 -0
  104. package/lib/common/clients/yarn.d.ts +5 -0
  105. package/lib/common/clients/yarn.js +57 -6
  106. package/lib/common/clients/yarn.js.map +1 -1
  107. package/lib/common/compatibility.js +14 -9
  108. package/lib/common/compatibility.js.map +1 -1
  109. package/lib/common/config.d.ts +52 -1
  110. package/lib/common/config.js +10 -30
  111. package/lib/common/config.js.map +1 -1
  112. package/lib/common/constants.d.ts +10 -2
  113. package/lib/common/constants.js +22 -4
  114. package/lib/common/constants.js.map +1 -1
  115. package/lib/common/declaration.d.ts +2 -1
  116. package/lib/common/declaration.js +113 -56
  117. package/lib/common/declaration.js.map +1 -1
  118. package/lib/common/emoji.d.ts +8 -0
  119. package/lib/common/emoji.js +10 -1
  120. package/lib/common/emoji.js.map +1 -1
  121. package/lib/common/emulator.d.ts +2 -2
  122. package/lib/common/emulator.js +45 -32
  123. package/lib/common/emulator.js.map +1 -1
  124. package/lib/common/enums.d.ts +0 -4
  125. package/lib/common/enums.js +1 -6
  126. package/lib/common/enums.js.map +1 -1
  127. package/lib/common/envs.js +16 -5
  128. package/lib/common/envs.js.map +1 -1
  129. package/lib/common/hash.d.ts +1 -0
  130. package/lib/common/hash.js +8 -3
  131. package/lib/common/hash.js.map +1 -1
  132. package/lib/common/http.d.ts +5 -2
  133. package/lib/common/http.js +65 -23
  134. package/lib/common/http.js.map +1 -1
  135. package/lib/common/importmap.d.ts +2 -0
  136. package/lib/common/importmap.js +202 -0
  137. package/lib/common/importmap.js.map +1 -0
  138. package/lib/common/index.d.ts +10 -0
  139. package/lib/common/index.js +15 -1
  140. package/lib/common/index.js.map +1 -1
  141. package/lib/common/info.d.ts +5 -0
  142. package/lib/common/info.js +9 -2
  143. package/lib/common/info.js.map +1 -1
  144. package/lib/common/injectors.d.ts +36 -8
  145. package/lib/common/injectors.js +46 -19
  146. package/lib/common/injectors.js.map +1 -1
  147. package/lib/common/inspect.d.ts +5 -3
  148. package/lib/common/inspect.js +15 -15
  149. package/lib/common/inspect.js.map +1 -1
  150. package/lib/common/interactive.d.ts +9 -0
  151. package/lib/common/interactive.js +60 -1
  152. package/lib/common/interactive.js.map +1 -1
  153. package/lib/common/io.d.ts +9 -3
  154. package/lib/common/io.js +219 -116
  155. package/lib/common/io.js.map +1 -1
  156. package/lib/common/language.d.ts +9 -6
  157. package/lib/common/language.js +68 -12
  158. package/lib/common/language.js.map +1 -1
  159. package/lib/common/log.d.ts +5 -3
  160. package/lib/common/log.js +34 -48
  161. package/lib/common/log.js.map +1 -1
  162. package/lib/common/npm.d.ts +17 -16
  163. package/lib/common/npm.js +262 -158
  164. package/lib/common/npm.js.map +1 -1
  165. package/lib/common/pack.js +47 -26
  166. package/lib/common/pack.js.map +1 -1
  167. package/lib/common/package.d.ts +43 -20
  168. package/lib/common/package.js +377 -213
  169. package/lib/common/package.js.map +1 -1
  170. package/lib/common/parallel.d.ts +1 -0
  171. package/lib/common/parallel.js +29 -0
  172. package/lib/common/parallel.js.map +1 -0
  173. package/lib/common/patcher.js +20 -20
  174. package/lib/common/patcher.js.map +1 -1
  175. package/lib/common/platform.d.ts +13 -0
  176. package/lib/common/platform.js +29 -0
  177. package/lib/common/platform.js.map +1 -0
  178. package/lib/common/port.d.ts +1 -0
  179. package/lib/common/port.js +14 -4
  180. package/lib/common/port.js.map +1 -1
  181. package/lib/common/rules.js +4 -4
  182. package/lib/common/rules.js.map +1 -1
  183. package/lib/common/scaffold.d.ts +18 -4
  184. package/lib/common/scaffold.js +59 -36
  185. package/lib/common/scaffold.js.map +1 -1
  186. package/lib/common/scripts.js +8 -8
  187. package/lib/common/scripts.js.map +1 -1
  188. package/lib/common/shell.d.ts +2 -0
  189. package/lib/common/shell.js +33 -0
  190. package/lib/common/shell.js.map +1 -0
  191. package/lib/common/spec.d.ts +29 -0
  192. package/lib/common/spec.js +69 -0
  193. package/lib/common/spec.js.map +1 -0
  194. package/lib/common/template.d.ts +1 -2
  195. package/lib/common/template.js +23 -22
  196. package/lib/common/template.js.map +1 -1
  197. package/lib/common/url.d.ts +1 -0
  198. package/lib/common/url.js +17 -0
  199. package/lib/common/url.js.map +1 -0
  200. package/lib/common/utils.d.ts +1 -0
  201. package/lib/common/utils.js +8 -0
  202. package/lib/common/utils.js.map +1 -0
  203. package/lib/common/version.d.ts +2 -0
  204. package/lib/common/version.js +130 -0
  205. package/lib/common/version.js.map +1 -0
  206. package/lib/common/watcher.d.ts +13 -0
  207. package/lib/common/watcher.js +78 -0
  208. package/lib/common/watcher.js.map +1 -0
  209. package/lib/external/index.js +59413 -57862
  210. package/lib/helpers.d.ts +6 -6
  211. package/lib/helpers.js +10 -25
  212. package/lib/helpers.js.map +1 -1
  213. package/lib/index.js +5 -1
  214. package/lib/index.js.map +1 -1
  215. package/lib/inject.js +2 -2
  216. package/lib/inject.js.map +1 -1
  217. package/lib/injectors/pilet-injector.d.ts +75 -0
  218. package/lib/injectors/pilet-injector.js +246 -0
  219. package/lib/injectors/pilet-injector.js.map +1 -0
  220. package/lib/injectors/{piral.d.ts → piral-injector.d.ts} +10 -2
  221. package/lib/injectors/piral-injector.js +97 -0
  222. package/lib/injectors/piral-injector.js.map +1 -0
  223. package/lib/messages.d.ts +567 -47
  224. package/lib/messages.js +638 -51
  225. package/lib/messages.js.map +1 -1
  226. package/lib/pb-cli.js +1 -1
  227. package/lib/pb-cli.js.map +1 -1
  228. package/lib/pilet-cli.js +1 -1
  229. package/lib/pilet-cli.js.map +1 -1
  230. package/lib/piral-cli.js +1 -1
  231. package/lib/piral-cli.js.map +1 -1
  232. package/lib/platforms/node.d.ts +8 -0
  233. package/lib/platforms/node.js +30 -0
  234. package/lib/platforms/node.js.map +1 -0
  235. package/lib/platforms/web.d.ts +8 -0
  236. package/lib/platforms/web.js +120 -0
  237. package/lib/platforms/web.js.map +1 -0
  238. package/lib/plugin.js +36 -11
  239. package/lib/plugin.js.map +1 -1
  240. package/lib/questionnaire.d.ts +1 -1
  241. package/lib/questionnaire.js +9 -4
  242. package/lib/questionnaire.js.map +1 -1
  243. package/lib/release.d.ts +1 -1
  244. package/lib/release.js +38 -6
  245. package/lib/release.js.map +1 -1
  246. package/lib/resolvers.js +13 -13
  247. package/lib/resolvers.js.map +1 -1
  248. package/lib/rules/index.js +8 -8
  249. package/lib/rules/index.js.map +1 -1
  250. package/lib/rules/pilet-has-externals-as-peers.d.ts +1 -1
  251. package/lib/rules/pilet-has-externals-as-peers.js +9 -7
  252. package/lib/rules/pilet-has-externals-as-peers.js.map +1 -1
  253. package/lib/rules/pilet-has-no-self-reference.d.ts +1 -1
  254. package/lib/rules/pilet-has-no-self-reference.js +2 -2
  255. package/lib/rules/pilet-has-no-self-reference.js.map +1 -1
  256. package/lib/rules/pilet-has-no-third-party-dependency.d.ts +1 -1
  257. package/lib/rules/pilet-stays-small.d.ts +1 -1
  258. package/lib/rules/pilet-stays-small.js +4 -4
  259. package/lib/rules/pilet-stays-small.js.map +1 -1
  260. package/lib/rules/pilet-uses-latest-piral.d.ts +1 -1
  261. package/lib/rules/pilet-uses-latest-piral.js +18 -9
  262. package/lib/rules/pilet-uses-latest-piral.js.map +1 -1
  263. package/lib/rules/piral-depends-on-piral.d.ts +1 -1
  264. package/lib/rules/piral-entry-ends-with-html.d.ts +1 -1
  265. package/lib/rules/piral-entry-ends-with-html.js +1 -1
  266. package/lib/rules/piral-entry-ends-with-html.js.map +1 -1
  267. package/lib/rules/piral-has-valid-devDependencies.d.ts +1 -1
  268. package/lib/rules/piral-has-valid-externals.d.ts +1 -1
  269. package/lib/rules/piral-has-valid-externals.js +10 -24
  270. package/lib/rules/piral-has-valid-externals.js.map +1 -1
  271. package/lib/rules/piral-has-valid-files.d.ts +1 -1
  272. package/lib/rules/piral-has-valid-files.js +5 -5
  273. package/lib/rules/piral-has-valid-files.js.map +1 -1
  274. package/lib/rules/piral-has-valid-scripts.d.ts +1 -1
  275. package/lib/runner.js +1 -1
  276. package/lib/runner.js.map +1 -1
  277. package/lib/select.js +6 -6
  278. package/lib/select.js.map +1 -1
  279. package/lib/types/common.d.ts +88 -8
  280. package/lib/types/common.js.map +1 -1
  281. package/lib/types/index.js +5 -1
  282. package/lib/types/index.js.map +1 -1
  283. package/lib/types/internal.d.ts +12 -13
  284. package/lib/types/public.d.ts +89 -23
  285. package/package.json +19 -16
  286. package/src/apps/add-piral-instance-pilet.ts +98 -0
  287. package/src/apps/build-pilet.ts +286 -38
  288. package/src/apps/build-piral.test.ts +20 -7
  289. package/src/apps/build-piral.ts +90 -39
  290. package/src/apps/debug-pilet.ts +229 -123
  291. package/src/apps/debug-piral.ts +121 -68
  292. package/src/apps/declaration-piral.ts +4 -2
  293. package/src/apps/index.ts +3 -0
  294. package/src/apps/new-pilet.test.ts +28 -11
  295. package/src/apps/new-pilet.ts +60 -48
  296. package/src/apps/new-piral.test.ts +25 -13
  297. package/src/apps/new-piral.ts +43 -19
  298. package/src/apps/pack-pilet.test.ts +2 -2
  299. package/src/apps/pack-pilet.ts +12 -10
  300. package/src/apps/publish-pilet.ts +148 -43
  301. package/src/apps/publish-piral.ts +38 -11
  302. package/src/apps/remove-piral-instance-pilet.ts +92 -0
  303. package/src/apps/run-emulator-piral.ts +154 -0
  304. package/src/apps/upgrade-pilet.ts +37 -31
  305. package/src/apps/upgrade-piral.ts +9 -7
  306. package/src/apps/validate-pilet.ts +30 -22
  307. package/src/apps/validate-piral.ts +5 -2
  308. package/src/build/bundler-calls.ts +133 -0
  309. package/src/build/run-build-pilet.ts +91 -0
  310. package/src/build/run-build-piral.ts +93 -0
  311. package/src/build/run-debug-mono-piral.ts +86 -0
  312. package/src/build/run-debug-pilet.ts +116 -0
  313. package/src/build/run-debug-piral.ts +105 -0
  314. package/src/bundler.test.ts +86 -68
  315. package/src/bundler.ts +74 -19
  316. package/src/cli.ts +6 -2
  317. package/src/commands.ts +273 -44
  318. package/src/common/archive.test.ts +51 -45
  319. package/src/common/archive.ts +28 -1
  320. package/src/common/browser.test.ts +20 -10
  321. package/src/common/browser.ts +13 -6
  322. package/src/common/clients/index.ts +41 -0
  323. package/src/common/clients/lerna.ts +85 -1
  324. package/src/common/clients/npm.ts +56 -14
  325. package/src/common/clients/pnp.ts +84 -0
  326. package/src/common/clients/pnpm.ts +45 -1
  327. package/src/common/clients/rush.ts +118 -0
  328. package/src/common/clients/yarn.ts +49 -3
  329. package/src/common/compatibility.ts +8 -1
  330. package/src/common/config.ts +57 -22
  331. package/src/common/constants.ts +21 -3
  332. package/src/common/declaration.ts +124 -50
  333. package/src/common/emoji.ts +9 -0
  334. package/src/common/emulator.ts +43 -23
  335. package/src/common/enums.ts +0 -5
  336. package/src/common/envs.ts +15 -3
  337. package/src/common/hash.ts +5 -0
  338. package/src/common/http.test.ts +76 -64
  339. package/src/common/http.ts +88 -24
  340. package/src/common/importmap.ts +242 -0
  341. package/src/common/index.ts +10 -0
  342. package/src/common/info.ts +9 -1
  343. package/src/common/injectors.ts +49 -22
  344. package/src/common/inspect.ts +13 -14
  345. package/src/common/interactive.test.ts +6 -0
  346. package/src/common/interactive.ts +69 -1
  347. package/src/common/io.ts +199 -82
  348. package/src/common/language.ts +87 -10
  349. package/src/common/log.ts +32 -46
  350. package/src/common/npm.test.ts +187 -166
  351. package/src/common/npm.ts +263 -119
  352. package/src/common/pack.test.ts +11 -13
  353. package/src/common/pack.ts +60 -21
  354. package/src/common/package.test.ts +59 -49
  355. package/src/common/package.ts +406 -167
  356. package/src/common/parallel.test.ts +28 -0
  357. package/src/common/parallel.ts +21 -0
  358. package/src/common/platform.ts +31 -0
  359. package/src/common/port.test.ts +4 -1
  360. package/src/common/port.ts +10 -0
  361. package/src/common/rules.test.ts +3 -3
  362. package/src/common/scaffold.ts +69 -41
  363. package/src/common/scripts.ts +5 -4
  364. package/src/common/shell.ts +34 -0
  365. package/src/common/spec.ts +69 -0
  366. package/src/common/template.ts +20 -18
  367. package/src/common/url.test.ts +28 -0
  368. package/src/common/url.ts +15 -0
  369. package/src/common/utils.ts +3 -0
  370. package/src/common/version.test.ts +233 -0
  371. package/src/common/version.ts +142 -0
  372. package/src/common/watcher.ts +89 -0
  373. package/src/external/index.test.ts +2 -2
  374. package/src/external/index.ts +7 -3
  375. package/src/external/resolve.ts +29 -0
  376. package/src/helpers.test.ts +2 -22
  377. package/src/helpers.ts +21 -30
  378. package/src/injectors/{pilet.test.ts → pilet-injector.test.ts} +13 -4
  379. package/src/injectors/pilet-injector.ts +346 -0
  380. package/src/injectors/{piral.test.ts → piral-injector.test.ts} +14 -5
  381. package/src/injectors/piral-injector.ts +130 -0
  382. package/src/messages.ts +649 -63
  383. package/src/platforms/node.ts +16 -0
  384. package/src/platforms/web.ts +148 -0
  385. package/src/plugin.ts +34 -5
  386. package/src/questionnaire.ts +17 -3
  387. package/src/release.ts +47 -5
  388. package/src/rules/index.ts +1 -1
  389. package/src/rules/pilet-has-externals-as-peers.test.ts +3 -2
  390. package/src/rules/pilet-has-externals-as-peers.ts +9 -7
  391. package/src/rules/pilet-has-no-self-reference.ts +1 -1
  392. package/src/rules/pilet-stays-small.ts +1 -1
  393. package/src/rules/pilet-uses-latest-piral.ts +22 -12
  394. package/src/rules/piral-has-valid-externals.ts +10 -29
  395. package/src/types/common.ts +99 -9
  396. package/src/types/internal.ts +14 -14
  397. package/src/types/public.ts +93 -27
  398. package/lib/external/child.js +0 -144
  399. package/lib/external/classes.trie +0 -0
  400. package/lib/external/xdg-open +0 -1066
  401. package/lib/injectors/pilet.d.ts +0 -47
  402. package/lib/injectors/pilet.js +0 -187
  403. package/lib/injectors/pilet.js.map +0 -1
  404. package/lib/injectors/piral.js +0 -62
  405. package/lib/injectors/piral.js.map +0 -1
  406. package/src/injectors/pilet.ts +0 -219
  407. package/src/injectors/piral.ts +0 -76
  408. package/templates/piral-index.js.ejs +0 -16
@@ -0,0 +1,346 @@
1
+ import { URL } from 'url';
2
+ import { join } from 'path';
3
+ import { EventEmitter } from 'events';
4
+ import { readFileSync, existsSync, statSync } from 'fs';
5
+ import { KrasInjector, KrasResponse, KrasRequest, KrasInjectorConfig, KrasConfiguration, KrasResult } from 'kras';
6
+ import { log } from '../common/log';
7
+ import { getPiletSpecMeta } from '../common/spec';
8
+ import { config as commonConfig } from '../common/config';
9
+ import { axios, mime, jju } from '../external';
10
+ import { Bundler } from '../types';
11
+
12
+ interface Pilet {
13
+ bundler: Bundler;
14
+ root: string;
15
+ getMeta(basePath: string): PiletMetadata;
16
+ }
17
+
18
+ export interface PiletInjectorConfig extends KrasInjectorConfig {
19
+ /**
20
+ * The pilets to serve.
21
+ */
22
+ pilets: Array<Pilet>;
23
+ /**
24
+ * The base URL for the app shell / portal to be used.
25
+ */
26
+ publicUrl: string;
27
+ /**
28
+ * The base URL for the pilet assets to be used.
29
+ */
30
+ assetUrl?: string;
31
+ /**
32
+ * Defines if properties from the feed (if given) meta response should be taken over to local pilets.
33
+ */
34
+ mergeConfig?: boolean;
35
+ /**
36
+ * The additional metadata file to consider for the pilets.
37
+ */
38
+ meta: string;
39
+ /**
40
+ * The API path - usually somethin like `/$pilet-api`.
41
+ */
42
+ api: string;
43
+ /**
44
+ * The directory of the app (usually Piral instance emulator) to serve.
45
+ */
46
+ app?: string;
47
+ /**
48
+ * The remote feed to merge into.
49
+ */
50
+ feed?: string;
51
+ /**
52
+ * The additional headers to include.
53
+ */
54
+ headers?: Record<string, string>;
55
+ }
56
+
57
+ interface PiletMetadata {
58
+ name?: string;
59
+ config?: Record<string, any>;
60
+ [key: string]: unknown;
61
+ }
62
+
63
+ function getMetaOverride(root: string, metaFile: string) {
64
+ if (metaFile) {
65
+ const metaPath = join(root, metaFile);
66
+
67
+ if (existsSync(metaPath)) {
68
+ return jju.parse(readFileSync(metaPath, 'utf8'));
69
+ }
70
+ }
71
+
72
+ return undefined;
73
+ }
74
+
75
+ function fillPiletMeta(pilet: Pilet, metaFile: string, subPath: string) {
76
+ const { root, bundler } = pilet;
77
+ const packagePath = join(root, 'package.json');
78
+ const def = jju.parse(readFileSync(packagePath, 'utf8'));
79
+ const file = bundler.bundle.name.replace(/^[\/\\]/, '');
80
+ const target = join(bundler.bundle.dir, file);
81
+ const metaOverride = getMetaOverride(root, metaFile);
82
+
83
+ pilet.getMeta = (parentPath) => {
84
+ const basePath = `${parentPath}${subPath}`;
85
+ const url = new URL(file, basePath);
86
+
87
+ return {
88
+ custom: def.custom,
89
+ config: def.piletConfig,
90
+ ...metaOverride,
91
+ name: def.name,
92
+ version: def.version,
93
+ link: `${url.href}?updated=${Date.now()}`,
94
+ ...getPiletSpecMeta(target, basePath),
95
+ };
96
+ };
97
+ }
98
+
99
+ async function loadFeed(feed: string) {
100
+ try {
101
+ const response = await axios.default.get<{ items?: Array<PiletMetadata> } | Array<PiletMetadata> | PiletMetadata>(
102
+ feed,
103
+ );
104
+
105
+ if (Array.isArray(response.data)) {
106
+ return response.data;
107
+ } else if (Array.isArray(response.data?.items)) {
108
+ return response.data.items;
109
+ } else {
110
+ return [response.data];
111
+ }
112
+ } catch (e) {
113
+ log('generalWarning_0001', `Couldn't load feed at ${feed}.`);
114
+ }
115
+ }
116
+
117
+ export default class PiletInjector implements KrasInjector {
118
+ public config: PiletInjectorConfig;
119
+ private serverConfig: KrasConfiguration;
120
+ private indexPath: string;
121
+
122
+ constructor(config: PiletInjectorConfig, serverConfig: KrasConfiguration, core: EventEmitter) {
123
+ this.config = config;
124
+ this.serverConfig = serverConfig;
125
+
126
+ if (this.config.active) {
127
+ const { pilets, api, publicUrl, assetUrl } = config;
128
+ this.indexPath = `${publicUrl}index.html`;
129
+ const cbs = {};
130
+
131
+ core.on('user-connected', (e) => {
132
+ const baseUrl = assetUrl || e.req.headers.origin;
133
+
134
+ if (e.target === '*' && e.url === api.substring(1)) {
135
+ cbs[e.id] = {
136
+ baseUrl,
137
+ notify: (msg: string) => e.ws.send(msg),
138
+ };
139
+ }
140
+ });
141
+
142
+ core.on('user-disconnected', (e) => {
143
+ delete cbs[e.id];
144
+ });
145
+
146
+ pilets.forEach((p, i) =>
147
+ p.bundler.on(() => {
148
+ fillPiletMeta(p, config.meta, `/${i}/`);
149
+
150
+ for (const id of Object.keys(cbs)) {
151
+ const { baseUrl, notify } = cbs[id];
152
+ const meta = this.getPiletMeta(baseUrl, p);
153
+ notify(meta);
154
+ }
155
+ }),
156
+ );
157
+ }
158
+ }
159
+
160
+ get active() {
161
+ return this.config.active;
162
+ }
163
+
164
+ set active(value) {
165
+ this.config.active = value;
166
+ }
167
+
168
+ get name() {
169
+ return 'pilet-injector';
170
+ }
171
+
172
+ getOptions() {
173
+ return {};
174
+ }
175
+
176
+ setOptions() {}
177
+
178
+ getPiletApi(baseUrl: string) {
179
+ const { api } = this.config;
180
+
181
+ if (/^https?:/.test(api)) {
182
+ return api;
183
+ } else if (baseUrl) {
184
+ return `${baseUrl}${api}`;
185
+ } else {
186
+ const { ssl, port } = this.serverConfig;
187
+ const { host } = commonConfig;
188
+ return `${ssl ? 'https' : 'http'}://${host}:${port}${api}`;
189
+ }
190
+ }
191
+
192
+ getPiletMeta(baseUrl: string, pilet: Pilet) {
193
+ const basePath = this.getPiletApi(baseUrl);
194
+ return JSON.stringify(pilet.getMeta(basePath));
195
+ }
196
+
197
+ async getIndexMeta(baseUrl: string) {
198
+ const { pilets, feed } = this.config;
199
+ const basePath = this.getPiletApi(baseUrl);
200
+ const localPilets = pilets.map((pilet) => pilet.getMeta?.(basePath)).filter(Boolean);
201
+ const mergedPilets = this.mergePilets(localPilets, await this.loadRemoteFeed(feed));
202
+ return JSON.stringify(mergedPilets);
203
+ }
204
+
205
+ async loadRemoteFeed(feed?: string | Array<string>): Promise<Array<Array<PiletMetadata>>> {
206
+ if (feed) {
207
+ const feeds = Array.isArray(feed) ? feed : [feed];
208
+ return await Promise.all(feeds.map(loadFeed));
209
+ }
210
+ }
211
+
212
+ mergePilets(localPilets: Array<PiletMetadata>, remoteFeeds: Array<Array<PiletMetadata>>) {
213
+ if (!remoteFeeds || !Array.isArray(remoteFeeds)) {
214
+ return localPilets;
215
+ }
216
+
217
+ const { mergeConfig = false } = this.config;
218
+ const names = localPilets.map((pilet) => pilet.name);
219
+ const merged = [...localPilets];
220
+
221
+ for (const remotePilets of remoteFeeds) {
222
+ if (!Array.isArray(remotePilets)) {
223
+ continue;
224
+ }
225
+
226
+ const newPilets = remotePilets.filter((pilet) => {
227
+ if (!pilet || typeof pilet !== 'object') {
228
+ return false;
229
+ }
230
+
231
+ const name = pilet.name;
232
+ const isNew = name !== undefined && !names.includes(name);
233
+
234
+ if (!isNew && mergeConfig) {
235
+ const existing = merged.find((m) => m.name === name);
236
+
237
+ if (existing.config === undefined) {
238
+ existing.config = pilet.config;
239
+ } else if (pilet.config !== undefined) {
240
+ Object.assign(existing.config, pilet.config);
241
+ }
242
+ }
243
+
244
+ return isNew;
245
+ });
246
+
247
+ names.push(...newPilets.map((p) => p.name));
248
+ merged.push(...newPilets);
249
+ }
250
+
251
+ return merged;
252
+ }
253
+
254
+ sendContent(content: Buffer | string, type: string, url: string): KrasResponse {
255
+ const { headers } = this.config;
256
+
257
+ return {
258
+ injector: { name: this.name },
259
+ headers: {
260
+ ...headers,
261
+ 'content-type': type,
262
+ 'cache-control': 'no-cache, no-store, must-revalidate',
263
+ pragma: 'no-cache',
264
+ expires: '0',
265
+ },
266
+ status: { code: 200 },
267
+ url,
268
+ content,
269
+ };
270
+ }
271
+
272
+ sendFile(target: string, url: string): KrasResponse {
273
+ const content = readFileSync(target);
274
+ const type = mime.getType(target) ?? 'application/octet-stream';
275
+ return this.sendContent(content, type, url);
276
+ }
277
+
278
+ async sendResponse(path: string, url: string, baseUrl: string): Promise<KrasResult> {
279
+ const { pilets } = this.config;
280
+ const [index, ...rest] = path.split('/');
281
+ const pilet = pilets[+index];
282
+ const bundler = pilet?.bundler;
283
+
284
+ if (!path) {
285
+ await bundler?.ready();
286
+ const content = await this.getIndexMeta(baseUrl);
287
+ return this.sendContent(content, 'application/json', url);
288
+ } else {
289
+ return bundler?.ready().then(() => {
290
+ const target = join(bundler.bundle.dir, rest.join('/'));
291
+
292
+ if (existsSync(target) && statSync(target).isFile()) {
293
+ return this.sendFile(target, url);
294
+ }
295
+ });
296
+ }
297
+ }
298
+
299
+ sendIndexFile(target: string, url: string, baseUrl: string): KrasResponse {
300
+ const indexHtml = readFileSync(target, 'utf8');
301
+
302
+ // mechanism to inject server side debug piletApi config into piral emulator
303
+ const windowInjectionScript = `window['dbg:pilet-api'] = '${this.getPiletApi(baseUrl)}';`;
304
+ const findStr = `<script`;
305
+ const replaceStr = `<script>/* Pilet Debugging Emulator Config Injection */${windowInjectionScript}</script><script`;
306
+ const content = indexHtml.replace(`${findStr}`, `${replaceStr}`);
307
+
308
+ return this.sendContent(content, mime.getType(target), url);
309
+ }
310
+
311
+ handle(req: KrasRequest): KrasResponse {
312
+ const { app, api, publicUrl, assetUrl } = this.config;
313
+ const baseUrl =
314
+ assetUrl || (req.headers.host ? `${req.encrypted ? 'https' : 'http'}://${req.headers.host}` : undefined);
315
+
316
+ if (!req.target) {
317
+ if (req.url.startsWith(publicUrl)) {
318
+ const path = req.url.substring(publicUrl.length).split('?')[0];
319
+
320
+ if (app) {
321
+ const target = join(app, path);
322
+
323
+ if (existsSync(target) && statSync(target).isFile()) {
324
+ if (req.url === this.indexPath) {
325
+ return this.sendIndexFile(target, req.url, baseUrl);
326
+ }
327
+
328
+ return this.sendFile(target, req.url);
329
+ }
330
+ }
331
+
332
+ if (req.url !== this.indexPath) {
333
+ return this.handle({
334
+ ...req,
335
+ url: this.indexPath,
336
+ });
337
+ }
338
+ }
339
+
340
+ return undefined;
341
+ } else if (req.target === api) {
342
+ const path = req.url.substring(1).split('?')[0];
343
+ return this.sendResponse(path, req.url, baseUrl);
344
+ }
345
+ }
346
+ }
@@ -1,5 +1,6 @@
1
- import PiralInjector, { PiralInjectorConfig } from './piral';
1
+ import PiralInjector from './piral-injector';
2
2
  import { KrasRequest, KrasResult } from 'kras';
3
+ import { EventEmitter } from 'events';
3
4
 
4
5
  const bundlerMock = {
5
6
  pending: true,
@@ -34,9 +35,11 @@ describe('Piral-CLI piral injector', () => {
34
35
  };
35
36
  const config = {
36
37
  bundler,
38
+ publicUrl: '/',
37
39
  active: true,
40
+ headers: {},
38
41
  };
39
- const injector = new PiralInjector(config);
42
+ const injector = new PiralInjector(config, undefined, new EventEmitter());
40
43
  expect(injector.active).toBeTruthy();
41
44
  });
42
45
 
@@ -44,9 +47,11 @@ describe('Piral-CLI piral injector', () => {
44
47
  // Arrange
45
48
  const config = {
46
49
  bundler: bundlerMock,
50
+ publicUrl: '/',
47
51
  active: true,
52
+ headers: {},
48
53
  };
49
- const injector = new PiralInjector(config);
54
+ const injector = new PiralInjector(config, undefined, new EventEmitter());
50
55
 
51
56
  // Act
52
57
  injector.active = false;
@@ -62,9 +67,11 @@ describe('Piral-CLI piral injector', () => {
62
67
  // Arrange
63
68
  const config = {
64
69
  bundler: bundlerMock,
70
+ publicUrl: '/',
65
71
  active: true,
72
+ headers: {},
66
73
  };
67
- const injector = new PiralInjector(config);
74
+ const injector = new PiralInjector(config, undefined, new EventEmitter());
68
75
 
69
76
  // Act
70
77
  const res = injector.sendResponse('some/nice/invalid/path', 'sometarget.file', 'someDir', 'localhost:1234');
@@ -77,9 +84,11 @@ describe('Piral-CLI piral injector', () => {
77
84
  // Arrange
78
85
  const config = {
79
86
  bundler: bundlerMock,
87
+ publicUrl: '/',
80
88
  active: true,
89
+ headers: {},
81
90
  };
82
- const injector = new PiralInjector(config);
91
+ const injector = new PiralInjector(config, undefined, new EventEmitter());
83
92
  const request: KrasRequest = {
84
93
  content: 'someFakeContent',
85
94
  headers: {},
@@ -0,0 +1,130 @@
1
+ import { join } from 'path';
2
+ import { EventEmitter } from 'events';
3
+ import { readFileSync, existsSync, statSync } from 'fs';
4
+ import { KrasInjector, KrasResponse, KrasRequest, KrasInjectorConfig, KrasConfiguration } from 'kras';
5
+ import { mime } from '../external';
6
+ import { Bundler } from '../types';
7
+
8
+ /**
9
+ * The maximum amount of retries when sending a response
10
+ */
11
+ const maxRetrySendResponse = 4;
12
+
13
+ export interface PiralInjectorConfig extends KrasInjectorConfig {
14
+ bundler: Bundler;
15
+ publicUrl: string;
16
+ feed?: string;
17
+ headers?: Record<string, string>;
18
+ }
19
+
20
+ export default class PiralInjector implements KrasInjector {
21
+ public config: PiralInjectorConfig;
22
+
23
+ constructor(options: PiralInjectorConfig, _config: KrasConfiguration, core: EventEmitter) {
24
+ this.config = options;
25
+
26
+ if (this.config.active) {
27
+ const api = '/$events';
28
+ const cbs = {};
29
+
30
+ core.on('user-connected', (e) => {
31
+ if (e.target === '*' && e.url === api.substring(1)) {
32
+ cbs[e.id] = (msg: string) => e.ws.send(msg);
33
+ }
34
+ });
35
+
36
+ core.on('user-disconnected', (e) => {
37
+ delete cbs[e.id];
38
+ });
39
+
40
+ this.config.bundler.on((args) => {
41
+ for (const id of Object.keys(cbs)) {
42
+ cbs[id](JSON.stringify(args));
43
+ }
44
+ });
45
+ }
46
+ }
47
+
48
+ get active() {
49
+ return this.config.active;
50
+ }
51
+
52
+ set active(value) {
53
+ this.config.active = value;
54
+ }
55
+
56
+ get name() {
57
+ return 'piral-injector';
58
+ }
59
+
60
+ getOptions() {
61
+ return {};
62
+ }
63
+
64
+ setOptions() {}
65
+
66
+ sendContent(content: Buffer | string, type: string, url: string): KrasResponse {
67
+ const { headers } = this.config;
68
+ return {
69
+ injector: { name: this.name },
70
+ headers: {
71
+ ...headers,
72
+ 'content-type': type,
73
+ 'cache-control': 'no-cache, no-store, must-revalidate',
74
+ pragma: 'no-cache',
75
+ expires: '0',
76
+ },
77
+ status: { code: 200 },
78
+ url,
79
+ content,
80
+ };
81
+ }
82
+
83
+ sendIndexFile(target: string, url: string): KrasResponse {
84
+ const indexHtml = readFileSync(target, 'utf8');
85
+ const { feed } = this.config;
86
+
87
+ if (feed) {
88
+ // mechanism to inject server side debug piletApi config into piral emulator
89
+ const windowInjectionScript = `window['dbg:pilet-api'] = '${feed}';`;
90
+ const findStr = `<script`;
91
+ const replaceStr = `<script>/* Pilet Debugging Emulator Config Injection */${windowInjectionScript}</script><script`;
92
+ const content = indexHtml.replace(`${findStr}`, `${replaceStr}`);
93
+ return this.sendContent(content, mime.getType(target), url);
94
+ }
95
+
96
+ return this.sendContent(indexHtml, mime.getType(target), url);
97
+ }
98
+
99
+ sendResponse(path: string, target: string, dir: string, url: string, recursionDepth = 0): KrasResponse {
100
+ if (recursionDepth > maxRetrySendResponse) {
101
+ return undefined;
102
+ }
103
+
104
+ const { bundler } = this.config;
105
+ const newTarget = join(bundler.bundle.dir, bundler.bundle.name);
106
+
107
+ if (!path || !existsSync(target) || !statSync(target).isFile()) {
108
+ return this.sendResponse(bundler.bundle.name, newTarget, dir, url, recursionDepth + 1);
109
+ } else if (target === newTarget) {
110
+ return this.sendIndexFile(target, url);
111
+ }
112
+
113
+ const type = mime.getType(target) ?? 'application/octet-stream';
114
+ return this.sendContent(readFileSync(target), type, url);
115
+ }
116
+
117
+ handle(req: KrasRequest): KrasResponse {
118
+ if (!req.target) {
119
+ const { bundler, publicUrl } = this.config;
120
+
121
+ if (req.url.startsWith(publicUrl) || `${req.url}/` === publicUrl) {
122
+ const pathLength = publicUrl.length || 1;
123
+ const path = req.url.substring(pathLength);
124
+ const dir = bundler.bundle.dir;
125
+ const target = join(dir, path.split('?')[0]);
126
+ return bundler.ready().then(() => this.sendResponse(path, target, dir, req.url));
127
+ }
128
+ }
129
+ }
130
+ }