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.
- package/LICENSE +1 -1
- package/README.md +30 -7
- package/lib/api.js +23 -23
- package/lib/api.js.map +1 -1
- package/lib/apps/add-piral-instance-pilet.d.ts +26 -0
- package/lib/apps/add-piral-instance-pilet.js +53 -0
- package/lib/apps/add-piral-instance-pilet.js.map +1 -0
- package/lib/apps/build-pilet.d.ts +33 -2
- package/lib/apps/build-pilet.js +159 -32
- package/lib/apps/build-pilet.js.map +1 -1
- package/lib/apps/build-piral.d.ts +18 -1
- package/lib/apps/build-piral.js +68 -52
- package/lib/apps/build-piral.js.map +1 -1
- package/lib/apps/debug-pilet.d.ts +38 -2
- package/lib/apps/debug-pilet.js +150 -108
- package/lib/apps/debug-pilet.js.map +1 -1
- package/lib/apps/debug-piral.d.ts +23 -0
- package/lib/apps/debug-piral.js +63 -52
- package/lib/apps/debug-piral.js.map +1 -1
- package/lib/apps/declaration-piral.js +5 -3
- package/lib/apps/declaration-piral.js.map +1 -1
- package/lib/apps/index.d.ts +3 -0
- package/lib/apps/index.js +8 -1
- package/lib/apps/index.js.map +1 -1
- package/lib/apps/new-pilet.d.ts +7 -3
- package/lib/apps/new-pilet.js +47 -52
- package/lib/apps/new-pilet.js.map +1 -1
- package/lib/apps/new-piral.d.ts +7 -3
- package/lib/apps/new-piral.js +33 -23
- package/lib/apps/new-piral.js.map +1 -1
- package/lib/apps/pack-pilet.d.ts +9 -0
- package/lib/apps/pack-pilet.js +6 -13
- package/lib/apps/pack-pilet.js.map +1 -1
- package/lib/apps/publish-pilet.d.ts +23 -3
- package/lib/apps/publish-pilet.js +112 -62
- package/lib/apps/publish-pilet.js.map +1 -1
- package/lib/apps/publish-piral.d.ts +6 -2
- package/lib/apps/publish-piral.js +30 -26
- package/lib/apps/publish-piral.js.map +1 -1
- package/lib/apps/remove-piral-instance-pilet.d.ts +22 -0
- package/lib/apps/remove-piral-instance-pilet.js +52 -0
- package/lib/apps/remove-piral-instance-pilet.js.map +1 -0
- package/lib/apps/run-emulator-piral.d.ts +34 -0
- package/lib/apps/run-emulator-piral.js +91 -0
- package/lib/apps/run-emulator-piral.js.map +1 -0
- package/lib/apps/upgrade-pilet.d.ts +6 -2
- package/lib/apps/upgrade-pilet.js +41 -43
- package/lib/apps/upgrade-pilet.js.map +1 -1
- package/lib/apps/upgrade-piral.d.ts +2 -2
- package/lib/apps/upgrade-piral.js +21 -20
- package/lib/apps/upgrade-piral.js.map +1 -1
- package/lib/apps/validate-pilet.js +30 -36
- package/lib/apps/validate-pilet.js.map +1 -1
- package/lib/apps/validate-piral.js +13 -10
- package/lib/apps/validate-piral.js.map +1 -1
- package/lib/build/bundler-calls.d.ts +3 -0
- package/lib/build/bundler-calls.js +117 -0
- package/lib/build/bundler-calls.js.map +1 -0
- package/lib/build/run-build-pilet.d.ts +1 -0
- package/lib/build/run-build-pilet.js +65 -0
- package/lib/build/run-build-pilet.js.map +1 -0
- package/lib/build/run-build-piral.d.ts +1 -0
- package/lib/build/run-build-piral.js +67 -0
- package/lib/build/run-build-piral.js.map +1 -0
- package/lib/build/run-debug-mono-piral.d.ts +1 -0
- package/lib/build/run-debug-mono-piral.js +70 -0
- package/lib/build/run-debug-mono-piral.js.map +1 -0
- package/lib/build/run-debug-pilet.d.ts +1 -0
- package/lib/build/run-debug-pilet.js +89 -0
- package/lib/build/run-debug-pilet.js.map +1 -0
- package/lib/build/run-debug-piral.d.ts +1 -0
- package/lib/build/run-debug-piral.js +85 -0
- package/lib/build/run-debug-piral.js.map +1 -0
- package/lib/bundler.js +75 -26
- package/lib/bundler.js.map +1 -1
- package/lib/cli.js +7 -4
- package/lib/cli.js.map +1 -1
- package/lib/commands.js +266 -46
- package/lib/commands.js.map +1 -1
- package/lib/common/archive.d.ts +4 -0
- package/lib/common/archive.js +31 -10
- package/lib/common/archive.js.map +1 -1
- package/lib/common/browser.d.ts +2 -1
- package/lib/common/browser.js +17 -8
- package/lib/common/browser.js.map +1 -1
- package/lib/common/clients/index.d.ts +21 -0
- package/lib/common/clients/index.js +48 -0
- package/lib/common/clients/index.js.map +1 -0
- package/lib/common/clients/lerna.d.ts +7 -1
- package/lib/common/clients/lerna.js +93 -7
- package/lib/common/clients/lerna.js.map +1 -1
- package/lib/common/clients/npm.d.ts +6 -1
- package/lib/common/clients/npm.js +66 -18
- package/lib/common/clients/npm.js.map +1 -1
- package/lib/common/clients/pnp.d.ts +7 -0
- package/lib/common/clients/pnp.js +104 -0
- package/lib/common/clients/pnp.js.map +1 -0
- package/lib/common/clients/pnpm.d.ts +5 -0
- package/lib/common/clients/pnpm.js +55 -6
- package/lib/common/clients/pnpm.js.map +1 -1
- package/lib/common/clients/rush.d.ts +7 -0
- package/lib/common/clients/rush.js +127 -0
- package/lib/common/clients/rush.js.map +1 -0
- package/lib/common/clients/yarn.d.ts +5 -0
- package/lib/common/clients/yarn.js +57 -6
- package/lib/common/clients/yarn.js.map +1 -1
- package/lib/common/compatibility.js +14 -9
- package/lib/common/compatibility.js.map +1 -1
- package/lib/common/config.d.ts +52 -1
- package/lib/common/config.js +10 -30
- package/lib/common/config.js.map +1 -1
- package/lib/common/constants.d.ts +10 -2
- package/lib/common/constants.js +22 -4
- package/lib/common/constants.js.map +1 -1
- package/lib/common/declaration.d.ts +2 -1
- package/lib/common/declaration.js +113 -56
- package/lib/common/declaration.js.map +1 -1
- package/lib/common/emoji.d.ts +8 -0
- package/lib/common/emoji.js +10 -1
- package/lib/common/emoji.js.map +1 -1
- package/lib/common/emulator.d.ts +2 -2
- package/lib/common/emulator.js +45 -32
- package/lib/common/emulator.js.map +1 -1
- package/lib/common/enums.d.ts +0 -4
- package/lib/common/enums.js +1 -6
- package/lib/common/enums.js.map +1 -1
- package/lib/common/envs.js +16 -5
- package/lib/common/envs.js.map +1 -1
- package/lib/common/hash.d.ts +1 -0
- package/lib/common/hash.js +8 -3
- package/lib/common/hash.js.map +1 -1
- package/lib/common/http.d.ts +5 -2
- package/lib/common/http.js +65 -23
- package/lib/common/http.js.map +1 -1
- package/lib/common/importmap.d.ts +2 -0
- package/lib/common/importmap.js +202 -0
- package/lib/common/importmap.js.map +1 -0
- package/lib/common/index.d.ts +10 -0
- package/lib/common/index.js +15 -1
- package/lib/common/index.js.map +1 -1
- package/lib/common/info.d.ts +5 -0
- package/lib/common/info.js +9 -2
- package/lib/common/info.js.map +1 -1
- package/lib/common/injectors.d.ts +36 -8
- package/lib/common/injectors.js +46 -19
- package/lib/common/injectors.js.map +1 -1
- package/lib/common/inspect.d.ts +5 -3
- package/lib/common/inspect.js +15 -15
- package/lib/common/inspect.js.map +1 -1
- package/lib/common/interactive.d.ts +9 -0
- package/lib/common/interactive.js +60 -1
- package/lib/common/interactive.js.map +1 -1
- package/lib/common/io.d.ts +9 -3
- package/lib/common/io.js +219 -116
- package/lib/common/io.js.map +1 -1
- package/lib/common/language.d.ts +9 -6
- package/lib/common/language.js +68 -12
- package/lib/common/language.js.map +1 -1
- package/lib/common/log.d.ts +5 -3
- package/lib/common/log.js +34 -48
- package/lib/common/log.js.map +1 -1
- package/lib/common/npm.d.ts +17 -16
- package/lib/common/npm.js +262 -158
- package/lib/common/npm.js.map +1 -1
- package/lib/common/pack.js +47 -26
- package/lib/common/pack.js.map +1 -1
- package/lib/common/package.d.ts +43 -20
- package/lib/common/package.js +377 -213
- package/lib/common/package.js.map +1 -1
- package/lib/common/parallel.d.ts +1 -0
- package/lib/common/parallel.js +29 -0
- package/lib/common/parallel.js.map +1 -0
- package/lib/common/patcher.js +20 -20
- package/lib/common/patcher.js.map +1 -1
- package/lib/common/platform.d.ts +13 -0
- package/lib/common/platform.js +29 -0
- package/lib/common/platform.js.map +1 -0
- package/lib/common/port.d.ts +1 -0
- package/lib/common/port.js +14 -4
- package/lib/common/port.js.map +1 -1
- package/lib/common/rules.js +4 -4
- package/lib/common/rules.js.map +1 -1
- package/lib/common/scaffold.d.ts +18 -4
- package/lib/common/scaffold.js +59 -36
- package/lib/common/scaffold.js.map +1 -1
- package/lib/common/scripts.js +8 -8
- package/lib/common/scripts.js.map +1 -1
- package/lib/common/shell.d.ts +2 -0
- package/lib/common/shell.js +33 -0
- package/lib/common/shell.js.map +1 -0
- package/lib/common/spec.d.ts +29 -0
- package/lib/common/spec.js +69 -0
- package/lib/common/spec.js.map +1 -0
- package/lib/common/template.d.ts +1 -2
- package/lib/common/template.js +23 -22
- package/lib/common/template.js.map +1 -1
- package/lib/common/url.d.ts +1 -0
- package/lib/common/url.js +17 -0
- package/lib/common/url.js.map +1 -0
- package/lib/common/utils.d.ts +1 -0
- package/lib/common/utils.js +8 -0
- package/lib/common/utils.js.map +1 -0
- package/lib/common/version.d.ts +2 -0
- package/lib/common/version.js +130 -0
- package/lib/common/version.js.map +1 -0
- package/lib/common/watcher.d.ts +13 -0
- package/lib/common/watcher.js +78 -0
- package/lib/common/watcher.js.map +1 -0
- package/lib/external/index.js +59413 -57862
- package/lib/helpers.d.ts +6 -6
- package/lib/helpers.js +10 -25
- package/lib/helpers.js.map +1 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/inject.js +2 -2
- package/lib/inject.js.map +1 -1
- package/lib/injectors/pilet-injector.d.ts +75 -0
- package/lib/injectors/pilet-injector.js +246 -0
- package/lib/injectors/pilet-injector.js.map +1 -0
- package/lib/injectors/{piral.d.ts → piral-injector.d.ts} +10 -2
- package/lib/injectors/piral-injector.js +97 -0
- package/lib/injectors/piral-injector.js.map +1 -0
- package/lib/messages.d.ts +567 -47
- package/lib/messages.js +638 -51
- package/lib/messages.js.map +1 -1
- package/lib/pb-cli.js +1 -1
- package/lib/pb-cli.js.map +1 -1
- package/lib/pilet-cli.js +1 -1
- package/lib/pilet-cli.js.map +1 -1
- package/lib/piral-cli.js +1 -1
- package/lib/piral-cli.js.map +1 -1
- package/lib/platforms/node.d.ts +8 -0
- package/lib/platforms/node.js +30 -0
- package/lib/platforms/node.js.map +1 -0
- package/lib/platforms/web.d.ts +8 -0
- package/lib/platforms/web.js +120 -0
- package/lib/platforms/web.js.map +1 -0
- package/lib/plugin.js +36 -11
- package/lib/plugin.js.map +1 -1
- package/lib/questionnaire.d.ts +1 -1
- package/lib/questionnaire.js +9 -4
- package/lib/questionnaire.js.map +1 -1
- package/lib/release.d.ts +1 -1
- package/lib/release.js +38 -6
- package/lib/release.js.map +1 -1
- package/lib/resolvers.js +13 -13
- package/lib/resolvers.js.map +1 -1
- package/lib/rules/index.js +8 -8
- package/lib/rules/index.js.map +1 -1
- package/lib/rules/pilet-has-externals-as-peers.d.ts +1 -1
- package/lib/rules/pilet-has-externals-as-peers.js +9 -7
- package/lib/rules/pilet-has-externals-as-peers.js.map +1 -1
- package/lib/rules/pilet-has-no-self-reference.d.ts +1 -1
- package/lib/rules/pilet-has-no-self-reference.js +2 -2
- package/lib/rules/pilet-has-no-self-reference.js.map +1 -1
- package/lib/rules/pilet-has-no-third-party-dependency.d.ts +1 -1
- package/lib/rules/pilet-stays-small.d.ts +1 -1
- package/lib/rules/pilet-stays-small.js +4 -4
- package/lib/rules/pilet-stays-small.js.map +1 -1
- package/lib/rules/pilet-uses-latest-piral.d.ts +1 -1
- package/lib/rules/pilet-uses-latest-piral.js +18 -9
- package/lib/rules/pilet-uses-latest-piral.js.map +1 -1
- package/lib/rules/piral-depends-on-piral.d.ts +1 -1
- package/lib/rules/piral-entry-ends-with-html.d.ts +1 -1
- package/lib/rules/piral-entry-ends-with-html.js +1 -1
- package/lib/rules/piral-entry-ends-with-html.js.map +1 -1
- package/lib/rules/piral-has-valid-devDependencies.d.ts +1 -1
- package/lib/rules/piral-has-valid-externals.d.ts +1 -1
- package/lib/rules/piral-has-valid-externals.js +10 -24
- package/lib/rules/piral-has-valid-externals.js.map +1 -1
- package/lib/rules/piral-has-valid-files.d.ts +1 -1
- package/lib/rules/piral-has-valid-files.js +5 -5
- package/lib/rules/piral-has-valid-files.js.map +1 -1
- package/lib/rules/piral-has-valid-scripts.d.ts +1 -1
- package/lib/runner.js +1 -1
- package/lib/runner.js.map +1 -1
- package/lib/select.js +6 -6
- package/lib/select.js.map +1 -1
- package/lib/types/common.d.ts +88 -8
- package/lib/types/common.js.map +1 -1
- package/lib/types/index.js +5 -1
- package/lib/types/index.js.map +1 -1
- package/lib/types/internal.d.ts +12 -13
- package/lib/types/public.d.ts +89 -23
- package/package.json +19 -16
- package/src/apps/add-piral-instance-pilet.ts +98 -0
- package/src/apps/build-pilet.ts +286 -38
- package/src/apps/build-piral.test.ts +20 -7
- package/src/apps/build-piral.ts +90 -39
- package/src/apps/debug-pilet.ts +229 -123
- package/src/apps/debug-piral.ts +121 -68
- package/src/apps/declaration-piral.ts +4 -2
- package/src/apps/index.ts +3 -0
- package/src/apps/new-pilet.test.ts +28 -11
- package/src/apps/new-pilet.ts +60 -48
- package/src/apps/new-piral.test.ts +25 -13
- package/src/apps/new-piral.ts +43 -19
- package/src/apps/pack-pilet.test.ts +2 -2
- package/src/apps/pack-pilet.ts +12 -10
- package/src/apps/publish-pilet.ts +148 -43
- package/src/apps/publish-piral.ts +38 -11
- package/src/apps/remove-piral-instance-pilet.ts +92 -0
- package/src/apps/run-emulator-piral.ts +154 -0
- package/src/apps/upgrade-pilet.ts +37 -31
- package/src/apps/upgrade-piral.ts +9 -7
- package/src/apps/validate-pilet.ts +30 -22
- package/src/apps/validate-piral.ts +5 -2
- package/src/build/bundler-calls.ts +133 -0
- package/src/build/run-build-pilet.ts +91 -0
- package/src/build/run-build-piral.ts +93 -0
- package/src/build/run-debug-mono-piral.ts +86 -0
- package/src/build/run-debug-pilet.ts +116 -0
- package/src/build/run-debug-piral.ts +105 -0
- package/src/bundler.test.ts +86 -68
- package/src/bundler.ts +74 -19
- package/src/cli.ts +6 -2
- package/src/commands.ts +273 -44
- package/src/common/archive.test.ts +51 -45
- package/src/common/archive.ts +28 -1
- package/src/common/browser.test.ts +20 -10
- package/src/common/browser.ts +13 -6
- package/src/common/clients/index.ts +41 -0
- package/src/common/clients/lerna.ts +85 -1
- package/src/common/clients/npm.ts +56 -14
- package/src/common/clients/pnp.ts +84 -0
- package/src/common/clients/pnpm.ts +45 -1
- package/src/common/clients/rush.ts +118 -0
- package/src/common/clients/yarn.ts +49 -3
- package/src/common/compatibility.ts +8 -1
- package/src/common/config.ts +57 -22
- package/src/common/constants.ts +21 -3
- package/src/common/declaration.ts +124 -50
- package/src/common/emoji.ts +9 -0
- package/src/common/emulator.ts +43 -23
- package/src/common/enums.ts +0 -5
- package/src/common/envs.ts +15 -3
- package/src/common/hash.ts +5 -0
- package/src/common/http.test.ts +76 -64
- package/src/common/http.ts +88 -24
- package/src/common/importmap.ts +242 -0
- package/src/common/index.ts +10 -0
- package/src/common/info.ts +9 -1
- package/src/common/injectors.ts +49 -22
- package/src/common/inspect.ts +13 -14
- package/src/common/interactive.test.ts +6 -0
- package/src/common/interactive.ts +69 -1
- package/src/common/io.ts +199 -82
- package/src/common/language.ts +87 -10
- package/src/common/log.ts +32 -46
- package/src/common/npm.test.ts +187 -166
- package/src/common/npm.ts +263 -119
- package/src/common/pack.test.ts +11 -13
- package/src/common/pack.ts +60 -21
- package/src/common/package.test.ts +59 -49
- package/src/common/package.ts +406 -167
- package/src/common/parallel.test.ts +28 -0
- package/src/common/parallel.ts +21 -0
- package/src/common/platform.ts +31 -0
- package/src/common/port.test.ts +4 -1
- package/src/common/port.ts +10 -0
- package/src/common/rules.test.ts +3 -3
- package/src/common/scaffold.ts +69 -41
- package/src/common/scripts.ts +5 -4
- package/src/common/shell.ts +34 -0
- package/src/common/spec.ts +69 -0
- package/src/common/template.ts +20 -18
- package/src/common/url.test.ts +28 -0
- package/src/common/url.ts +15 -0
- package/src/common/utils.ts +3 -0
- package/src/common/version.test.ts +233 -0
- package/src/common/version.ts +142 -0
- package/src/common/watcher.ts +89 -0
- package/src/external/index.test.ts +2 -2
- package/src/external/index.ts +7 -3
- package/src/external/resolve.ts +29 -0
- package/src/helpers.test.ts +2 -22
- package/src/helpers.ts +21 -30
- package/src/injectors/{pilet.test.ts → pilet-injector.test.ts} +13 -4
- package/src/injectors/pilet-injector.ts +346 -0
- package/src/injectors/{piral.test.ts → piral-injector.test.ts} +14 -5
- package/src/injectors/piral-injector.ts +130 -0
- package/src/messages.ts +649 -63
- package/src/platforms/node.ts +16 -0
- package/src/platforms/web.ts +148 -0
- package/src/plugin.ts +34 -5
- package/src/questionnaire.ts +17 -3
- package/src/release.ts +47 -5
- package/src/rules/index.ts +1 -1
- package/src/rules/pilet-has-externals-as-peers.test.ts +3 -2
- package/src/rules/pilet-has-externals-as-peers.ts +9 -7
- package/src/rules/pilet-has-no-self-reference.ts +1 -1
- package/src/rules/pilet-stays-small.ts +1 -1
- package/src/rules/pilet-uses-latest-piral.ts +22 -12
- package/src/rules/piral-has-valid-externals.ts +10 -29
- package/src/types/common.ts +99 -9
- package/src/types/internal.ts +14 -14
- package/src/types/public.ts +93 -27
- package/lib/external/child.js +0 -144
- package/lib/external/classes.trie +0 -0
- package/lib/external/xdg-open +0 -1066
- package/lib/injectors/pilet.d.ts +0 -47
- package/lib/injectors/pilet.js +0 -187
- package/lib/injectors/pilet.js.map +0 -1
- package/lib/injectors/piral.js +0 -62
- package/lib/injectors/piral.js.map +0 -1
- package/src/injectors/pilet.ts +0 -219
- package/src/injectors/piral.ts +0 -76
- 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
|
+
}
|
package/src/common/port.test.ts
CHANGED
|
@@ -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
|
-
|
|
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) {
|
package/src/common/port.ts
CHANGED
|
@@ -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 });
|
package/src/common/rules.test.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ruleSummary, runRules } from './rules';
|
|
2
|
-
import chalk from '
|
|
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(
|
|
16
|
+
let consoleSpy = jest.spyOn(process.stderr, 'write');
|
|
17
17
|
ruleSummary([], []);
|
|
18
|
-
expect(consoleSpy).
|
|
18
|
+
expect(consoleSpy).toHaveBeenLastCalledWith(`${chalk.green('✔')} Validation successful. No errors or warnings.\n`);
|
|
19
19
|
|
|
20
20
|
jest.clearAllMocks();
|
|
21
21
|
ruleSummary([], ['Warning!']);
|
package/src/common/scaffold.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { join, dirname, resolve, basename } from 'path';
|
|
2
|
-
import {
|
|
3
|
-
import { ForceOverwrite
|
|
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 {
|
|
6
|
-
import {
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
}
|
package/src/common/scripts.ts
CHANGED
|
@@ -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(
|
|
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
|
+
}
|
package/src/common/template.ts
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
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 =
|
|
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
|
+
});
|