piral-cli 0.15.0-beta.4633 → 0.15.0-beta.4672

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.
@@ -22,6 +22,7 @@ import {
22
22
  createInitialKrasConfig,
23
23
  getAvailablePort,
24
24
  combinePiletExternals,
25
+ watcherTask,
25
26
  } from '../common';
26
27
 
27
28
  export interface DebugPiletOptions {
@@ -216,131 +217,148 @@ export async function debugPilet(baseDir = process.cwd(), options: DebugPiletOpt
216
217
  } = options;
217
218
  const publicUrl = normalizePublicUrl(originalPublicUrl);
218
219
  const fullBase = resolve(process.cwd(), baseDir);
220
+ const port = await getAvailablePort(originalPort);
219
221
  setLogLevel(logLevel);
220
222
 
221
223
  await hooks.onBegin?.({ options, fullBase });
222
- progress('Reading configuration ...');
223
- const api = `${publicUrl}${config.piletApi.replace(/^\/+/, '')}`;
224
- const entryList = Array.isArray(entry) ? entry : [entry];
225
- const multi = entryList.length > 1 || entryList[0].indexOf('*') !== -1;
226
- log('generalDebug_0003', `Looking for (${multi ? 'multi' : 'single'}) "${entryList.join('", "')}" in "${fullBase}".`);
227
-
228
- const allEntries = await matchAnyPilet(fullBase, entryList);
229
- const maxListeners = Math.max(2 + allEntries.length * 2, 16);
230
- log('generalDebug_0003', `Found the following entries: ${allEntries.join(', ')}`);
231
-
232
- if (allEntries.length === 0) {
233
- fail('entryFileMissing_0077');
234
- }
235
224
 
236
- process.stderr.setMaxListeners(maxListeners);
237
- process.stdout.setMaxListeners(maxListeners);
238
- process.stdin.setMaxListeners(maxListeners);
239
-
240
- const pilets = await concurrentWorkers(allEntries, concurrency, async (entryModule) => {
241
- const targetDir = dirname(entryModule);
242
- const { peerDependencies, peerModules, root, apps, ignored, importmap } = await retrievePiletData(targetDir, app);
243
- const piralInstances = apps.map((m) => m.appPackage.name);
244
- const externals = combinePiletExternals(piralInstances, peerDependencies, peerModules, importmap);
245
- const mocks = join(targetDir, 'mocks');
246
- const dest = resolve(root, target);
247
- const outDir = dirname(dest);
248
- const outFile = basename(dest);
249
- const mocksExists = await checkExistingDirectory(mocks);
250
-
251
- await hooks.beforeBuild?.({ root, publicUrl, importmap, entryModule, schemaVersion });
252
-
253
- const bundler = await callPiletDebug(
254
- {
255
- root,
256
- piralInstances,
257
- optimizeModules,
258
- hmr,
259
- externals,
260
- targetDir,
261
- importmap,
262
- outFile,
263
- outDir,
264
- entryModule: `./${relative(root, entryModule)}`,
265
- logLevel,
266
- version: schemaVersion,
267
- ignored,
268
- _,
269
- },
270
- bundlerName,
225
+ await watcherTask(async (watcherContext) => {
226
+ progress('Reading configuration ...');
227
+ const api = `${publicUrl}${config.piletApi.replace(/^\/+/, '')}`;
228
+ const entryList = Array.isArray(entry) ? entry : [entry];
229
+ const multi = entryList.length > 1 || entryList[0].indexOf('*') !== -1;
230
+ log(
231
+ 'generalDebug_0003',
232
+ `Looking for (${multi ? 'multi' : 'single'}) "${entryList.join('", "')}" in "${fullBase}".`,
271
233
  );
272
234
 
273
- bundler.on((args) => {
274
- hooks.afterBuild?.({ ...args, root, publicUrl, importmap, entryModule, schemaVersion, bundler, outFile, outDir });
275
- });
276
-
277
- return {
278
- apps,
279
- publicUrl,
280
- externals,
281
- bundler,
282
- mocks: mocksExists ? mocks : undefined,
283
- root,
284
- };
285
- });
235
+ const allEntries = await matchAnyPilet(fullBase, entryList);
236
+ const maxListeners = Math.max(2 + allEntries.length * 2, 16);
237
+ log('generalDebug_0003', `Found the following entries: ${allEntries.join(', ')}`);
286
238
 
287
- // sanity check see #250
288
- checkSanity(pilets);
239
+ if (allEntries.length === 0) {
240
+ fail('entryFileMissing_0077');
241
+ }
289
242
 
290
- await hooks.beforeApp?.({ appInstanceDir, pilets });
291
- const appDirs = [appInstanceDir] || (await getOrMakeApps(pilets[0], logLevel));
243
+ process.stderr.setMaxListeners(maxListeners);
244
+ process.stdout.setMaxListeners(maxListeners);
245
+ process.stdin.setMaxListeners(maxListeners);
246
+
247
+ const pilets = await concurrentWorkers(allEntries, concurrency, async (entryModule) => {
248
+ const targetDir = dirname(entryModule);
249
+ const { peerDependencies, peerModules, root, apps, ignored, importmap } = await retrievePiletData(targetDir, app);
250
+ const piralInstances = apps.map((m) => m.appPackage.name);
251
+ const externals = combinePiletExternals(piralInstances, peerDependencies, peerModules, importmap);
252
+ const mocks = join(targetDir, 'mocks');
253
+ const dest = resolve(root, target);
254
+ const outDir = dirname(dest);
255
+ const outFile = basename(dest);
256
+ const mocksExists = await checkExistingDirectory(mocks);
257
+
258
+ await hooks.beforeBuild?.({ root, publicUrl, importmap, entryModule, schemaVersion });
259
+
260
+ const bundler = await callPiletDebug(
261
+ {
262
+ root,
263
+ piralInstances,
264
+ optimizeModules,
265
+ hmr,
266
+ externals,
267
+ targetDir,
268
+ importmap,
269
+ outFile,
270
+ outDir,
271
+ entryModule: `./${relative(root, entryModule)}`,
272
+ logLevel,
273
+ version: schemaVersion,
274
+ ignored,
275
+ _,
276
+ },
277
+ bundlerName,
278
+ );
292
279
 
293
- await Promise.all(
294
- appDirs.map(async (appDir) => {
295
- const appRoot = dirname(await findFile(appDir, 'package.json'));
296
- await hooks.afterApp?.({ appInstanceDir, pilets });
280
+ bundler.on((args) => {
281
+ hooks.afterBuild?.({
282
+ ...args,
283
+ root,
284
+ publicUrl,
285
+ importmap,
286
+ entryModule,
287
+ schemaVersion,
288
+ bundler,
289
+ outFile,
290
+ outDir,
291
+ });
292
+ });
297
293
 
298
- Promise.all(pilets.map((p) => p.bundler.ready())).then(() => logDone(`Ready!`));
294
+ return {
295
+ apps,
296
+ publicUrl,
297
+ externals,
298
+ bundler,
299
+ mocks: mocksExists ? mocks : undefined,
300
+ root,
301
+ };
302
+ });
299
303
 
300
- const sources = pilets.map((m) => m.mocks).filter(Boolean);
301
- const baseMocks = resolve(fullBase, 'mocks');
302
- const krasBaseConfig = resolve(fullBase, krasrc);
303
- const krasRootConfig = resolve(appRoot, krasrc);
304
- const initial = createInitialKrasConfig(baseMocks, sources, { [api]: '' }, feed);
305
- const required = {
306
- injectors: {
307
- piral: {
308
- active: false,
304
+ // sanity check see #250
305
+ checkSanity(pilets);
306
+
307
+ await hooks.beforeApp?.({ appInstanceDir, pilets });
308
+ const appDirs = [appInstanceDir] || (await getOrMakeApps(pilets[0], logLevel));
309
+
310
+ await Promise.all(
311
+ appDirs.map(async (appDir) => {
312
+ const appRoot = dirname(await findFile(appDir, 'package.json'));
313
+ await hooks.afterApp?.({ appInstanceDir, pilets });
314
+
315
+ Promise.all(pilets.map((p) => p.bundler.ready())).then(() => logDone(`Ready!`));
316
+
317
+ const sources = pilets.map((m) => m.mocks).filter(Boolean);
318
+ const baseMocks = resolve(fullBase, 'mocks');
319
+ const krasBaseConfig = resolve(fullBase, krasrc);
320
+ const krasRootConfig = resolve(appRoot, krasrc);
321
+ const initial = createInitialKrasConfig(baseMocks, sources, { [api]: '' }, feed);
322
+ const required = {
323
+ injectors: {
324
+ piral: {
325
+ active: false,
326
+ },
327
+ pilet: {
328
+ active: true,
329
+ pilets,
330
+ app: appDir,
331
+ publicUrl,
332
+ handle: ['/', api],
333
+ api,
334
+ },
309
335
  },
310
- pilet: {
311
- active: true,
312
- pilets,
313
- app: appDir,
336
+ };
337
+ const configs = [krasBaseConfig, ...pilets.map((p) => resolve(p.root, krasrc)), krasRootConfig];
338
+ const krasConfig = readKrasConfig({ port, initial, required }, ...configs);
339
+
340
+ log('generalVerbose_0004', `Using kras with configuration: ${JSON.stringify(krasConfig, undefined, 2)}`);
341
+
342
+ const krasServer = buildKrasWithCli(krasConfig);
343
+ krasServer.setMaxListeners(maxListeners);
344
+ krasServer.removeAllListeners('open');
345
+ krasServer.on(
346
+ 'open',
347
+ notifyServerOnline(
348
+ pilets.map((p) => p.bundler),
314
349
  publicUrl,
315
- handle: ['/', api],
316
- api,
317
- },
318
- },
319
- };
320
- const configs = [krasBaseConfig, ...pilets.map((p) => resolve(p.root, krasrc)), krasRootConfig];
321
- const port = await getAvailablePort(originalPort);
322
- const krasConfig = readKrasConfig({ port, initial, required }, ...configs);
323
-
324
- log('generalVerbose_0004', `Using kras with configuration: ${JSON.stringify(krasConfig, undefined, 2)}`);
325
-
326
- const krasServer = buildKrasWithCli(krasConfig);
327
- krasServer.setMaxListeners(maxListeners);
328
- krasServer.removeAllListeners('open');
329
- krasServer.on(
330
- 'open',
331
- notifyServerOnline(
332
- pilets.map((p) => p.bundler),
333
- publicUrl,
334
- krasConfig.api,
335
- ),
336
- );
350
+ krasConfig.api,
351
+ ),
352
+ );
353
+
354
+ await hooks.beforeOnline?.({ krasServer, krasConfig, open, port, api, feed, pilets, publicUrl });
355
+ await krasServer.start();
356
+ openBrowser(open, port, publicUrl, !!krasConfig.ssl);
357
+ await hooks.afterOnline?.({ krasServer, krasConfig, open, port, api, feed, pilets, publicUrl });
358
+ await new Promise((resolve) => krasServer.on('close', resolve));
359
+ }),
360
+ );
361
+ });
337
362
 
338
- await hooks.beforeOnline?.({ krasServer, krasConfig, open, port, api, feed, pilets, publicUrl });
339
- await krasServer.start();
340
- openBrowser(open, port, publicUrl, !!krasConfig.ssl);
341
- await hooks.afterOnline?.({ krasServer, krasConfig, open, port, api, feed, pilets, publicUrl });
342
- await new Promise((resolve) => krasServer.on('close', resolve));
343
- await hooks.onEnd?.({});
344
- }),
345
- );
363
+ await hooks.onEnd?.({});
346
364
  }
@@ -18,6 +18,7 @@ import {
18
18
  createInitialKrasConfig,
19
19
  getAvailablePort,
20
20
  checkExistingDirectory,
21
+ watcherTask,
21
22
  } from '../common';
22
23
 
23
24
  export interface DebugPiralOptions {
@@ -118,77 +119,83 @@ export async function debugPiral(baseDir = process.cwd(), options: DebugPiralOpt
118
119
  } = options;
119
120
  const publicUrl = normalizePublicUrl(originalPublicUrl);
120
121
  const fullBase = resolve(process.cwd(), baseDir);
122
+ const port = await getAvailablePort(originalPort);
121
123
  setLogLevel(logLevel);
122
124
 
123
125
  await hooks.onBegin?.({ options, fullBase });
124
- progress('Reading configuration ...');
125
- const entryFiles = await retrievePiralRoot(fullBase, entry);
126
- const targetDir = dirname(entryFiles);
127
- const { externals, name, root, ignored } = await retrievePiletsInfo(entryFiles);
128
- const piralInstances = [name];
129
- const dest = getDestination(entryFiles, resolve(fullBase, target));
130
-
131
- await checkCliCompatibility(root);
132
-
133
- await hooks.beforeBuild?.({ root, publicUrl, externals, entryFiles, piralInstances });
134
-
135
- const bundler = await callPiralDebug(
136
- {
137
- root,
138
- piralInstances,
139
- optimizeModules,
140
- hmr,
141
- externals,
142
- publicUrl,
143
- entryFiles,
144
- logLevel,
145
- ignored,
146
- ...dest,
147
- _,
148
- },
149
- bundlerName,
150
- );
151
-
152
- bundler.ready().then(() => logDone(`Ready!`));
153
-
154
- bundler.on((args) => {
155
- hooks.afterBuild?.({ ...args, root, publicUrl, externals, entryFiles, piralInstances, bundler, ...dest });
156
- });
157
126
 
158
- const krasBaseConfig = resolve(fullBase, krasrc);
159
- const krasRootConfig = resolve(root, krasrc);
160
- const mocks = join(targetDir, 'mocks');
161
- const baseMocks = resolve(fullBase, 'mocks');
162
- const mocksExist = await checkExistingDirectory(mocks);
163
- const sources = [mocksExist ? mocks : undefined].filter(Boolean);
164
- const initial = createInitialKrasConfig(baseMocks, sources);
165
- const required = {
166
- injectors: {
167
- piral: {
168
- active: true,
169
- handle: ['/'],
170
- feed,
127
+ await watcherTask(async (watcherContext) => {
128
+ progress('Reading configuration ...');
129
+ const entryFiles = await retrievePiralRoot(fullBase, entry);
130
+ const targetDir = dirname(entryFiles);
131
+ const { externals, name, root, ignored } = await retrievePiletsInfo(entryFiles);
132
+ const piralInstances = [name];
133
+ const dest = getDestination(entryFiles, resolve(fullBase, target));
134
+
135
+ await checkCliCompatibility(root);
136
+
137
+ await hooks.beforeBuild?.({ root, publicUrl, externals, entryFiles, piralInstances });
138
+
139
+ const bundler = await callPiralDebug(
140
+ {
141
+ root,
142
+ piralInstances,
143
+ optimizeModules,
144
+ hmr,
145
+ externals,
171
146
  publicUrl,
172
- bundler,
147
+ entryFiles,
148
+ logLevel,
149
+ ignored,
150
+ ...dest,
151
+ _,
173
152
  },
174
- pilet: {
175
- active: false,
153
+ bundlerName,
154
+ );
155
+
156
+ bundler.ready().then(() => logDone(`Ready!`));
157
+
158
+ bundler.on((args) => {
159
+ hooks.afterBuild?.({ ...args, root, publicUrl, externals, entryFiles, piralInstances, bundler, ...dest });
160
+ });
161
+
162
+ const krasBaseConfig = resolve(fullBase, krasrc);
163
+ const krasRootConfig = resolve(root, krasrc);
164
+ const mocks = join(targetDir, 'mocks');
165
+ const baseMocks = resolve(fullBase, 'mocks');
166
+
167
+
168
+ const mocksExist = await checkExistingDirectory(mocks);
169
+ const sources = [mocksExist ? mocks : undefined].filter(Boolean);
170
+ const initial = createInitialKrasConfig(baseMocks, sources);
171
+ const required = {
172
+ injectors: {
173
+ piral: {
174
+ active: true,
175
+ handle: ['/'],
176
+ feed,
177
+ publicUrl,
178
+ bundler,
179
+ },
180
+ pilet: {
181
+ active: false,
182
+ },
176
183
  },
177
- },
178
- };
179
- const port = await getAvailablePort(originalPort);
180
- const krasConfig = readKrasConfig({ port, initial, required }, krasBaseConfig, krasRootConfig);
184
+ };
185
+ const krasConfig = readKrasConfig({ port, initial, required }, krasBaseConfig, krasRootConfig);
181
186
 
182
- log('generalVerbose_0004', `Using kras with configuration: ${JSON.stringify(krasConfig, undefined, 2)}`);
187
+ log('generalVerbose_0004', `Using kras with configuration: ${JSON.stringify(krasConfig, undefined, 2)}`);
183
188
 
184
- const krasServer = buildKrasWithCli(krasConfig);
185
- krasServer.removeAllListeners('open');
186
- krasServer.on('open', notifyServerOnline([bundler], publicUrl, krasConfig.api));
189
+ const krasServer = buildKrasWithCli(krasConfig);
190
+ krasServer.removeAllListeners('open');
191
+ krasServer.on('open', notifyServerOnline([bundler], publicUrl, krasConfig.api));
192
+
193
+ await hooks.beforeOnline?.({ krasServer, krasConfig, open, port, publicUrl });
194
+ await krasServer.start();
195
+ openBrowser(open, port, publicUrl, !!krasConfig.ssl);
196
+ await hooks.afterOnline?.({ krasServer, krasConfig, open, port, publicUrl });
197
+ await new Promise((resolve) => krasServer.on('close', resolve));
198
+ });
187
199
 
188
- await hooks.beforeOnline?.({ krasServer, krasConfig, open, port, publicUrl });
189
- await krasServer.start();
190
- openBrowser(open, port, publicUrl, !!krasConfig.ssl);
191
- await hooks.afterOnline?.({ krasServer, krasConfig, open, port, publicUrl });
192
- await new Promise((resolve) => krasServer.on('close', resolve));
193
200
  await hooks.onEnd?.({});
194
201
  }
@@ -1,7 +1,6 @@
1
1
  import { resolve } from 'path';
2
2
  import { LogLevels, NpmClientType } from '../types';
3
3
  import {
4
- readJson,
5
4
  installNpmPackage,
6
5
  checkExistingDirectory,
7
6
  patchPiletPackage,
@@ -24,6 +23,7 @@ import {
24
23
  getPiralPath,
25
24
  isMonorepoPackageRef,
26
25
  getPiletScaffoldData,
26
+ retrievePiletData,
27
27
  } from '../common';
28
28
 
29
29
  export interface UpgradePiletOptions {
@@ -99,11 +99,11 @@ export async function upgradePilet(baseDir = process.cwd(), options: UpgradePile
99
99
  }
100
100
 
101
101
  const npmClient = await determineNpmClient(root, defaultNpmClient);
102
- const pckg = await readJson(root, 'package.json');
103
- const { devDependencies = {}, dependencies = {}, piral, source } = pckg;
102
+ const { apps, piletPackage } = await retrievePiletData(root);
103
+ const { devDependencies = {}, dependencies = {}, source } = piletPackage;
104
104
 
105
- if (piral && typeof piral === 'object') {
106
- const sourceName = piral.name;
105
+ for (const { appPackage } of apps) {
106
+ const sourceName = appPackage.name;
107
107
  const language = /\.jsx?$/.test(source) ? 'js' : 'ts';
108
108
 
109
109
  if (!sourceName || typeof sourceName !== 'string') {
@@ -170,9 +170,7 @@ export async function upgradePilet(baseDir = process.cwd(), options: UpgradePile
170
170
  log('generalDebug_0003', `Run: ${postUpgrade}`);
171
171
  await runScript(postUpgrade, root);
172
172
  }
173
-
174
- logDone('Pilet upgraded successfully!');
175
- } else {
176
- fail('invalidPiletPackage_0041');
177
173
  }
174
+
175
+ logDone('Pilet upgraded successfully!');
178
176
  }
@@ -124,6 +124,7 @@ export async function createPiletDeclaration(
124
124
  types: [...types, ...files],
125
125
  plugins: [createExcludePlugin([name])],
126
126
  apis: [],
127
+ noModuleDeclaration: true,
127
128
  imports: allowedImports,
128
129
  logLevel,
129
130
  logger: createLogger(),
@@ -149,6 +150,7 @@ export async function createPiralDeclaration(
149
150
  files,
150
151
  types: findDeclaredTypings(root),
151
152
  apis: findPiralBaseApi(root),
153
+ noModuleDeclaration: true,
152
154
  imports: externals,
153
155
  logLevel,
154
156
  logger: createLogger(),
@@ -30,3 +30,5 @@ export * from './scripts';
30
30
  export * from './spec';
31
31
  export * from './template';
32
32
  export * from './url';
33
+ export * from './version';
34
+ export * from './watcher';
@@ -574,7 +574,7 @@ export async function patchPiletPackage(
574
574
  log('generalDebug_0003', `Succesfully patched the pilet.json.`);
575
575
  }
576
576
 
577
- export async function getPiletPackage(
577
+ async function getPiletPackage(
578
578
  root: string,
579
579
  name: string,
580
580
  version: string,
@@ -582,11 +582,13 @@ export async function getPiletPackage(
582
582
  fromEmulator: boolean,
583
583
  newInfo?: { language: SourceLanguage; bundler: string },
584
584
  ) {
585
+ const { piralCLI = { version: cliVersion } } = piralInfo;
585
586
  const { externals, packageOverrides, ...info } = getPiletsInfo(piralInfo);
586
587
  const piralDependencies = {
587
588
  ...piralInfo.devDependencies,
588
589
  ...piralInfo.dependencies,
589
590
  };
591
+ const toolVersion = piralCLI.version;
590
592
  const typeDependencies = newInfo ? getDevDependencies(newInfo.language) : {};
591
593
  const scripts = newInfo
592
594
  ? {
@@ -617,13 +619,11 @@ export async function getPiletPackage(
617
619
  return deps;
618
620
  }, {}),
619
621
  [name]: `${version || piralInfo.version}`,
622
+ ['piral-cli']: toolVersion,
620
623
  };
621
624
 
622
625
  if (newInfo) {
623
- const bundler = newInfo.bundler;
624
- const version = `^${cliVersion}`;
625
- devDependencies['piral-cli'] = version;
626
- await appendBundler(devDependencies, bundler, version);
626
+ await appendBundler(devDependencies, newInfo.bundler, toolVersion);
627
627
  }
628
628
 
629
629
  return deepMerge(packageOverrides, {
@@ -0,0 +1,24 @@
1
+ export interface WatcherContext {
2
+ onClean(dispose: () => void): void;
3
+ watch(file: string): void;
4
+ }
5
+
6
+ export function watcherTask(cb: (watcherContext: WatcherContext) => Promise<void>) {
7
+ return new Promise<void>((resolve, reject) => {
8
+ const disposers: Array<() => void> = [];
9
+ const context: WatcherContext = {
10
+ onClean(dispose) {
11
+ disposers.push(dispose);
12
+ },
13
+ watch(file) {},
14
+ };
15
+ cb(context).then(
16
+ () => {
17
+ resolve();
18
+ },
19
+ (err) => {
20
+ reject(err);
21
+ },
22
+ );
23
+ });
24
+ }