piral-cli 1.0.0-pre.2217 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,28 @@
1
+ import { concurrentWorkers } from './parallel';
2
+
3
+ describe('Concurrent Workers', () => {
4
+ it('Can run against no entries', async () => {
5
+ const result = await concurrentWorkers([], 10, () => Promise.resolve('foo'));
6
+ expect(result).toEqual([]);
7
+ });
8
+
9
+ it('Can run against single entry', async () => {
10
+ const result = await concurrentWorkers(['bar'], 10, (item) => Promise.resolve('foo' + item));
11
+ expect(result).toEqual(['foobar']);
12
+ });
13
+
14
+ it('Can run against less entries than concurrency', async () => {
15
+ const result = await concurrentWorkers(['bar', 'rba', 'abr', 'rab', 'arb', 'bra'], 10, (item) => Promise.resolve('foo' + item));
16
+ expect(result).toEqual(['foobar', 'foorba', 'fooabr', 'foorab', 'fooarb', 'foobra']);
17
+ });
18
+
19
+ it('Can run against more entries than concurrency', async () => {
20
+ const result = await concurrentWorkers(['bar', 'rba', 'abr', 'rab', 'arb', 'bra'], 2, (item) => Promise.resolve('foo' + item));
21
+ expect(result).toEqual(['foobar', 'foorba', 'fooabr', 'foorab', 'fooarb', 'foobra']);
22
+ });
23
+
24
+ it('Can run against equal entries than concurrency', async () => {
25
+ const result = await concurrentWorkers(['bar', 'rba', 'abr', 'rab', 'arb', 'bra'], 6, (item) => Promise.resolve('foo' + item));
26
+ expect(result).toEqual(['foobar', 'foorba', 'fooabr', 'foorab', 'fooarb', 'foobra']);
27
+ });
28
+ });
@@ -0,0 +1,21 @@
1
+ export async function concurrentWorkers<T, R>(
2
+ items: Array<T>,
3
+ concurrency: number,
4
+ worker: (item: T, index: number) => Promise<R>,
5
+ ): Promise<Array<R>> {
6
+ const maxItems = items.length;
7
+ const results: Array<R> = new Array(maxItems);
8
+ let offset = 0;
9
+
10
+ await Promise.all(
11
+ items.slice(0, concurrency).map(async () => {
12
+ while (offset < maxItems) {
13
+ const i = offset++;
14
+ const item = items[i];
15
+ results[i] = await worker(item, i);
16
+ }
17
+ }),
18
+ );
19
+
20
+ return results;
21
+ }
@@ -0,0 +1,31 @@
1
+ import { fail } from './log';
2
+ import { PlatformStartShellOptions, PlatformStartModuleOptions } from '../types';
3
+
4
+ export interface WebPlatformSettings {
5
+ platform: 'web';
6
+ }
7
+
8
+ export interface NodePlatformSettings {
9
+ platform: 'node';
10
+ }
11
+
12
+ export type PlatformSettings = WebPlatformSettings | NodePlatformSettings;
13
+
14
+ export interface PlatformTarget {
15
+ startShell(options: PlatformStartShellOptions): Promise<void>;
16
+ startModule(options: PlatformStartModuleOptions): Promise<void>;
17
+ }
18
+
19
+ export function configurePlatform(target: Partial<PlatformSettings> = {}): PlatformTarget {
20
+ const { platform = 'web', ...options } = target;
21
+
22
+ if (platform === 'web') {
23
+ const { setup } = require('../platforms/web');
24
+ return setup(options);
25
+ } else if (platform === 'node') {
26
+ const { setup } = require('../platforms/node');
27
+ return setup(options);
28
+ }
29
+
30
+ return fail('platformNotSupported_0190', platform);
31
+ }
@@ -4,7 +4,10 @@ const defaultPort = 12345;
4
4
  const error = Error('RangeError: Port should be >= 0 and < 65536.');
5
5
 
6
6
  jest.mock('../external', () => ({
7
- getPort: (options: any) => {
7
+ ora() {
8
+ return {};
9
+ },
10
+ getPort(options: any) {
8
11
  if (options == undefined) {
9
12
  return Promise.resolve(defaultPort);
10
13
  } else if (options && options.port && options.port > 65536) {
@@ -1,6 +1,16 @@
1
1
  import { log } from './log';
2
2
  import { getPort } from '../external';
3
3
 
4
+ export async function getAvailablePort(defaultPort: number) {
5
+ const selectedPort = await getFreePort(defaultPort);
6
+
7
+ if (selectedPort !== defaultPort) {
8
+ log('portNotFree_0047', selectedPort, defaultPort);
9
+ }
10
+
11
+ return selectedPort;
12
+ }
13
+
4
14
  export async function getFreePort(preferred?: number) {
5
15
  log('generalDebug_0003', `Looking for a free port. Preferred port: ${preferred}`);
6
16
  const port = await getPort(preferred && { port: preferred });
@@ -1,5 +1,5 @@
1
1
  import { ruleSummary, runRules } from './rules';
2
- import chalk from 'chalk';
2
+ import { chalk } from '../external';
3
3
 
4
4
  const rule = {
5
5
  run: jest.fn(),
@@ -13,9 +13,9 @@ describe('Rules Module', () => {
13
13
  };
14
14
  expect(runException).toThrow(Error('[0080] Validation failed. Found 1 error(s).'));
15
15
 
16
- let consoleSpy = jest.spyOn(console, 'log');
16
+ let consoleSpy = jest.spyOn(process.stderr, 'write');
17
17
  ruleSummary([], []);
18
- expect(consoleSpy).toHaveBeenCalledWith(`✨ ${chalk.green.bold('Validation successful. No errors or warnings.')}`);
18
+ expect(consoleSpy).toHaveBeenLastCalledWith(`${chalk.green('✔')} Validation successful. No errors or warnings.\n`);
19
19
 
20
20
  jest.clearAllMocks();
21
21
  ruleSummary([], ['Warning!']);
@@ -1,9 +1,10 @@
1
- import { join, dirname, resolve, basename } from 'path';
2
- import { installPackage } from './clients/npm';
3
- import { ForceOverwrite, SourceLanguage } from './enums';
1
+ import { join, dirname, resolve, basename, isAbsolute } from 'path';
2
+ import { installNpmPackageFromOptionalRegistry } from './npm';
3
+ import { ForceOverwrite } from './enums';
4
4
  import { createDirectory, createFileIfNotExists, updateExistingJson } from './io';
5
- import { log, fail } from './log';
6
- import { Framework } from '../types';
5
+ import { cliVersion, isWindows } from './info';
6
+ import { log, fail, getLogLevel } from './log';
7
+ import { Framework, SourceLanguage } from '../types';
7
8
 
8
9
  interface TemplateFile {
9
10
  path: string;
@@ -11,8 +12,9 @@ interface TemplateFile {
11
12
  }
12
13
 
13
14
  function getTemplatePackage(templatePackageName: string) {
14
- const idx = templatePackageName.indexOf('@');
15
- const normalizedName = idx > 0 ? templatePackageName.substr(0, idx) : templatePackageName;
15
+ const idx = templatePackageName.indexOf('@', 1);
16
+ const normalizedName =
17
+ idx > 0 && !isAbsolute(templatePackageName) ? templatePackageName.substring(0, idx) : templatePackageName;
16
18
 
17
19
  try {
18
20
  return require(normalizedName);
@@ -29,14 +31,32 @@ async function getTemplateFiles(
29
31
  registry: string,
30
32
  root: string,
31
33
  data: Record<string, any>,
34
+ forceOverwrite: ForceOverwrite,
32
35
  ): Promise<Array<TemplateFile>> {
33
- await installPackage(templatePackageName, __dirname, '--registry', registry);
36
+ // debug in monorepo such as "../templates/pilet-template-react/lib/index.js"
37
+ if (templatePackageName.startsWith('.')) {
38
+ templatePackageName = resolve(process.cwd(), templatePackageName);
39
+ } else {
40
+ if (templatePackageName.indexOf('@', 1) === -1) {
41
+ templatePackageName = `${templatePackageName}@latest`;
42
+ }
43
+
44
+ await installNpmPackageFromOptionalRegistry(templatePackageName, __dirname, registry);
45
+ }
46
+
34
47
  const templateRunner = getTemplatePackage(templatePackageName);
48
+ const logLevel = getLogLevel();
49
+ const details = {
50
+ forceOverwrite,
51
+ cliVersion,
52
+ isWindows,
53
+ logLevel,
54
+ };
35
55
 
36
56
  if (typeof templateRunner === 'function') {
37
- return await templateRunner(root, data);
57
+ return await templateRunner(root, data, details);
38
58
  } else if ('default' in templateRunner && typeof templateRunner.default === 'function') {
39
- return await templateRunner.default(root, data);
59
+ return await templateRunner.default(root, data, details);
40
60
  } else {
41
61
  fail(
42
62
  'generalError_0002',
@@ -76,68 +96,76 @@ function writeFiles(root: string, files: Array<TemplateFile>, forceOverwrite: Fo
76
96
  }
77
97
 
78
98
  function getTemplatePackageName(type: 'piral' | 'pilet', template: string) {
79
- if (template.indexOf('/') === -1) {
99
+ if (template.indexOf('/') === -1 && !template.startsWith('.')) {
80
100
  return `@smapiot/${type}-template-${template}`;
81
101
  }
82
102
 
83
103
  return template;
84
104
  }
85
105
 
86
- function getLanguageName(language: SourceLanguage) {
87
- switch (language) {
88
- case SourceLanguage.js:
89
- return 'js';
90
- case SourceLanguage.ts:
91
- default:
92
- return 'ts';
93
- }
94
- }
95
-
96
- export async function scaffoldPiralSourceFiles(
97
- template: string,
98
- registry: string,
106
+ export function getPiralScaffoldData(
99
107
  language: SourceLanguage,
100
108
  root: string,
101
109
  app: string,
102
110
  packageName: Framework,
103
- forceOverwrite: ForceOverwrite,
104
111
  variables: Record<string, string>,
105
112
  ) {
106
113
  const src = dirname(join(root, app));
114
+ return {
115
+ ...variables,
116
+ root,
117
+ src,
118
+ language,
119
+ packageName,
120
+ reactVersion: parseInt(variables.reactVersion) || 18,
121
+ reactRouterVersion: parseInt(variables.reactRouterVersion) || 5,
122
+ } as const;
123
+ }
124
+
125
+ export async function scaffoldPiralSourceFiles(
126
+ template: string,
127
+ registry: string,
128
+ data: ReturnType<typeof getPiralScaffoldData>,
129
+ forceOverwrite: ForceOverwrite,
130
+ ) {
131
+ const { src, root } = data;
107
132
  const templatePackageName = getTemplatePackageName('piral', template);
108
133
 
109
134
  await createDirectory(src);
110
135
 
111
- const files = await getTemplateFiles(templatePackageName, registry, root, {
112
- ...variables,
113
- src,
114
- language: getLanguageName(language),
115
- packageName,
116
- });
136
+ const files = await getTemplateFiles(templatePackageName, registry, root, data, forceOverwrite);
117
137
 
118
138
  await writeFiles(root, files, forceOverwrite);
119
139
  }
120
140
 
121
- export async function scaffoldPiletSourceFiles(
122
- template: string,
123
- registry: string,
141
+ export function getPiletScaffoldData(
124
142
  language: SourceLanguage,
125
143
  root: string,
126
144
  sourceName: string,
127
- forceOverwrite: ForceOverwrite,
128
145
  variables: Record<string, string>,
129
146
  ) {
130
147
  const src = join(root, 'src');
148
+ return {
149
+ ...variables,
150
+ root,
151
+ src,
152
+ language,
153
+ sourceName,
154
+ } as const;
155
+ }
156
+
157
+ export async function scaffoldPiletSourceFiles(
158
+ template: string,
159
+ registry: string,
160
+ data: ReturnType<typeof getPiletScaffoldData>,
161
+ forceOverwrite: ForceOverwrite,
162
+ ) {
163
+ const { src, root } = data;
131
164
  const templatePackageName = getTemplatePackageName('pilet', template);
132
165
 
133
166
  await createDirectory(src);
134
167
 
135
- const files = await getTemplateFiles(templatePackageName, registry, root, {
136
- ...variables,
137
- src,
138
- language: getLanguageName(language),
139
- sourceName,
140
- });
168
+ const files = await getTemplateFiles(templatePackageName, registry, root, data, forceOverwrite);
141
169
 
142
170
  await writeFiles(root, files, forceOverwrite);
143
171
  }
@@ -15,11 +15,10 @@ function resolveWinPath(specialFolder: string, subPath: string): string | undefi
15
15
  }
16
16
 
17
17
  export function runScript(script: string, cwd = process.cwd(), output: NodeJS.WritableStream = process.stdout) {
18
- const bin = resolve('./node_modules/.bin');
18
+ const bin = resolve(cwd, './node_modules/.bin');
19
19
  const sep = isWindows ? ';' : ':';
20
20
  const env = Object.assign({}, process.env);
21
21
 
22
- env.PATH = `${bin}${sep}${env.PATH}`;
23
22
  log('generalDebug_0003', `Running "${script}" in "${cwd}" ("${bin}").`);
24
23
 
25
24
  if (isWindows) {
@@ -29,11 +28,13 @@ export function runScript(script: string, cwd = process.cwd(), output: NodeJS.Wr
29
28
  resolveWinPath('AppData', 'npm'),
30
29
  resolveWinPath('ProgramFiles', 'nodejs'),
31
30
  resolveWinPath('ProgramFiles(x86)', 'nodejs'),
32
- ...env.PATH.split(';'),
31
+ ...(env.Path || env.PATH || '').split(';'),
33
32
  ];
34
- env.PATH = newPaths.filter(Boolean).join(sep);
33
+ env.PATH = newPaths.filter((path) => path && path.length > 0).join(sep);
35
34
  }
36
35
 
36
+ env.PATH = `${bin}${sep}${env.PATH}`;
37
+
37
38
  return new Promise<void>((resolve, reject) => {
38
39
  const error = new MemoryStream();
39
40
  const opt = { end: false };
@@ -0,0 +1,34 @@
1
+ import { progress } from './log';
2
+ import {
3
+ combinePackageRef,
4
+ dissectPackageName,
5
+ getPackageName,
6
+ getPackageVersion,
7
+ installNpmPackage,
8
+ isLinkedPackage,
9
+ } from './npm';
10
+ import { NpmClientType } from '../types';
11
+
12
+ export async function installPiralInstance(
13
+ usedSource: string,
14
+ baseDir: string,
15
+ rootDir: string,
16
+ npmClient: NpmClientType,
17
+ ): Promise<[name: string, version: string]> {
18
+ const [sourceName, sourceVersion, hadVersion, type] = await dissectPackageName(baseDir, usedSource);
19
+ const isLocal = isLinkedPackage(sourceName, type, hadVersion, rootDir);
20
+
21
+ if (!isLocal) {
22
+ const packageRef = combinePackageRef(sourceName, sourceVersion, type);
23
+
24
+ progress(`Installing npm package %s ...`, packageRef);
25
+ await installNpmPackage(npmClient, packageRef, rootDir, '--save-dev', '--save-exact');
26
+ } else {
27
+ progress(`Using locally available npm package %s ...`, sourceName);
28
+ }
29
+
30
+ const packageName = await getPackageName(rootDir, sourceName, type);
31
+ const packageVersion = getPackageVersion(hadVersion, sourceName, sourceVersion, type, rootDir);
32
+
33
+ return [packageName, packageVersion];
34
+ }
@@ -0,0 +1,69 @@
1
+ import { existsSync, readFileSync, statSync } from 'fs';
2
+ import { computeHash, computeIntegrity } from './hash';
3
+
4
+ const checkV1 = /^\/\/\s*@pilet\s+v:1\s*\(([A-Za-z0-9\_\:\-]+)\)/;
5
+ const checkV2 = /^\/\/\s*@pilet\s+v:2\s*(?:\(([A-Za-z0-9\_\:\-]+),\s*(.*)\))?/;
6
+ const checkV3 = /^\/\/\s*@pilet\s+v:3\s*(?:\(([A-Za-z0-9\_\:\-]+),\s*(.*)\))?/;
7
+ const isUrl = /^https?:\/\//;
8
+
9
+ function getDependencies(deps: string, basePath: string) {
10
+ try {
11
+ const depMap = JSON.parse(deps);
12
+
13
+ if (depMap && typeof depMap === 'object') {
14
+ return Object.keys(depMap).reduce((obj, depName) => {
15
+ const depUrl = depMap[depName];
16
+
17
+ if (typeof depUrl === 'string') {
18
+ const url = isUrl.test(depUrl) ? depUrl : `${basePath}${depUrl}`;
19
+ obj[depName] = url;
20
+ }
21
+
22
+ return obj;
23
+ }, {});
24
+ }
25
+ } catch {}
26
+
27
+ return {};
28
+ }
29
+
30
+ export function getPiletSpecMeta(target: string, basePath: string) {
31
+ if (existsSync(target) && statSync(target).isFile()) {
32
+ const content = readFileSync(target, 'utf8');
33
+
34
+ if (checkV1.test(content)) {
35
+ // uses single argument; requireRef (required)
36
+ const [, requireRef] = checkV1.exec(content);
37
+ return {
38
+ spec: 'v1',
39
+ requireRef,
40
+ integrity: computeIntegrity(content),
41
+ };
42
+ } else if (checkV2.test(content)) {
43
+ // uses two arguments; requireRef and dependencies as JSON (required)
44
+ const [, requireRef, plainDependencies] = checkV2.exec(content);
45
+ return {
46
+ spec: 'v2',
47
+ requireRef,
48
+ dependencies: getDependencies(plainDependencies, basePath),
49
+ };
50
+ } else if (checkV3.test(content)) {
51
+ // uses two arguments; requireRef and dependencies as JSON (required)
52
+ const [, requireRef, plainDependencies] = checkV3.exec(content);
53
+ return {
54
+ spec: 'v3',
55
+ requireRef,
56
+ dependencies: getDependencies(plainDependencies, basePath),
57
+ };
58
+ } else {
59
+ // uses no arguments
60
+ return {
61
+ spec: 'v0',
62
+ hash: computeHash(content),
63
+ noCache: true,
64
+ };
65
+ }
66
+ }
67
+
68
+ return {};
69
+ }
@@ -1,30 +1,32 @@
1
- import { renderFile } from 'ejs';
2
- import { resolve } from 'path';
3
- import { log } from './log';
4
1
  import { ForceOverwrite } from './enums';
5
2
  import { createFileIfNotExists } from './io';
6
3
 
7
- export function fillTemplate(name: string, data: any = {}) {
8
- const path = resolve(__dirname, '..', '..', 'templates', `${name}.ejs`);
9
- return new Promise<string>((resolve, reject) => {
10
- log('generalDebug_0003', `Rendering template "{name}" in "${path}".`);
11
- renderFile(path, data, (err, str) => {
12
- if (err) {
13
- reject(err);
14
- } else {
15
- resolve(str);
16
- }
17
- });
18
- });
4
+ function fillTemplate(data: any = {}) {
5
+ return `if (process.env.NODE_ENV === 'test') {
6
+ // behavior for the test environment, we'll try to make it work
7
+
8
+ if (typeof window !== 'undefined') {
9
+ require('./${data.outFile}');
10
+ const ctx = window['dbg:piral'];
11
+ const dependencies = (ctx && ctx.pilets && ctx.pilets.getDependencies({})) || {};
12
+ module.exports = dependencies['${data.name}'] || {};
13
+ } else {
14
+ console.error('Your test environment does not define "window". Please make sure to provide a proper environment.');
15
+ module.exports = {};
16
+ }
17
+ } else {
18
+ // under "normal" circumstances disallow such an import
19
+ throw new Error("This file should not be included anywhere. Usually, this means you've imported the Piral instance directly.");
20
+ }
21
+ `;
19
22
  }
20
23
 
21
- export async function createFileFromTemplateIfNotExists(
22
- prefix: string,
24
+ export async function createPiralStubIndexIfNotExists(
23
25
  targetDir: string,
24
26
  fileName: string,
25
27
  forceOverwrite?: ForceOverwrite,
26
28
  data?: any,
27
29
  ) {
28
- const content = await fillTemplate(`${prefix}-${fileName}`, data);
30
+ const content = fillTemplate(data);
29
31
  await createFileIfNotExists(targetDir, fileName, content, forceOverwrite);
30
32
  }
@@ -0,0 +1,28 @@
1
+ import { normalizePublicUrl } from './url';
2
+
3
+ describe('Url Module', () => {
4
+ it('normalizePublicUrl always returns at least /', () => {
5
+ const result = normalizePublicUrl('');
6
+ expect(result).toBe('/');
7
+ });
8
+
9
+ it('normalizePublicUrl makes URLs end with /', async () => {
10
+ const result = normalizePublicUrl('/foo');
11
+ expect(result).toBe('/foo/');
12
+ });
13
+
14
+ it('normalizePublicUrl makes URLs start with /', async () => {
15
+ const result = normalizePublicUrl('foo/');
16
+ expect(result).toBe('/foo/');
17
+ });
18
+
19
+ it('normalizePublicUrl makes URLs start and end with /', async () => {
20
+ const result = normalizePublicUrl('foo');
21
+ expect(result).toBe('/foo/');
22
+ });
23
+
24
+ it('normalizePublicUrl leaves good URLs as-is', async () => {
25
+ const result = normalizePublicUrl('/foo/bar/1.2.3/');
26
+ expect(result).toBe('/foo/bar/1.2.3/');
27
+ });
28
+ });
@@ -0,0 +1,15 @@
1
+ export function normalizePublicUrl(url: string) {
2
+ if (!url) {
3
+ return '/';
4
+ }
5
+
6
+ if (!url.endsWith('/')) {
7
+ url = `${url}/`;
8
+ }
9
+
10
+ if (!url.startsWith('/')) {
11
+ url = `/${url}`;
12
+ }
13
+
14
+ return url;
15
+ }
@@ -0,0 +1,3 @@
1
+ export function onlyUnique<T>(value: T, index: number, self: Array<T>) {
2
+ return self.indexOf(value) === index;
3
+ }