@rindo/core 2.17.0 → 2.17.2-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/cli/config-flags.d.ts +110 -0
- package/cli/index.cjs +612 -220
- package/cli/index.d.ts +2 -1
- package/cli/index.js +612 -220
- package/cli/package.json +1 -1
- package/compiler/package.json +1 -1
- package/compiler/rindo.js +391 -178
- package/compiler/rindo.min.js +2 -2
- package/dependencies.json +1 -1
- package/dev-server/client/index.js +1 -1
- package/dev-server/client/package.json +1 -1
- package/dev-server/connector.html +2 -2
- package/dev-server/index.js +1 -1
- package/dev-server/package.json +1 -1
- package/dev-server/server-process.js +2 -2
- package/internal/app-data/package.json +1 -1
- package/internal/client/css-shim.js +1 -1
- package/internal/client/dom.js +1 -1
- package/internal/client/index.js +11 -6
- package/internal/client/package.json +1 -1
- package/internal/client/patch-browser.js +1 -1
- package/internal/client/patch-esm.js +1 -1
- package/internal/client/shadow-css.js +1 -1
- package/internal/hydrate/index.js +2 -2
- package/internal/hydrate/package.json +1 -1
- package/internal/package.json +1 -1
- package/internal/rindo-private.d.ts +2 -2
- package/internal/rindo-public-compiler.d.ts +67 -48
- package/internal/testing/index.js +1 -1
- package/internal/testing/package.json +1 -1
- package/mock-doc/index.cjs +26 -3
- package/mock-doc/index.d.ts +10 -0
- package/mock-doc/index.js +26 -3
- package/mock-doc/package.json +1 -1
- package/package.json +5 -3
- package/screenshot/package.json +1 -1
- package/sys/node/index.js +4 -4
- package/sys/node/package.json +1 -1
- package/sys/node/worker.js +1 -1
- package/testing/index.d.ts +1 -1
- package/testing/index.js +49 -25
- package/testing/jest/jest-config.d.ts +1 -1
- package/testing/jest/jest-runner.d.ts +3 -2
- package/testing/jest/jest-screenshot.d.ts +1 -1
- package/testing/mocks.d.ts +27 -2
- package/testing/package.json +1 -1
- package/testing/puppeteer/puppeteer-browser.d.ts +2 -2
- package/testing/testing-utils.d.ts +74 -2
- package/testing/testing.d.ts +2 -2
package/cli/index.js
CHANGED
|
@@ -1,8 +1,50 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
Rindo CLI v2.17.0 | MIT Licensed | https://rindojs.web.app
|
|
2
|
+
Rindo CLI v2.17.2-0 | MIT Licensed | https://rindojs.web.app
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* This sets the log level hierarchy for our terminal logger, ranging from
|
|
6
|
+
* most to least verbose.
|
|
7
|
+
*
|
|
8
|
+
* Ordering the levels like this lets us easily check whether we should log a
|
|
9
|
+
* message at a given time. For instance, if the log level is set to `'warn'`,
|
|
10
|
+
* then anything passed to the logger with level `'warn'` or `'error'` should
|
|
11
|
+
* be logged, but we should _not_ log anything with level `'info'` or `'debug'`.
|
|
12
|
+
*
|
|
13
|
+
* If we have a current log level `currentLevel` and a message with level
|
|
14
|
+
* `msgLevel` is passed to the logger, we can determine whether or not we should
|
|
15
|
+
* log it by checking if the log level on the message is further up or at the
|
|
16
|
+
* same level in the hierarchy than `currentLevel`, like so:
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* LOG_LEVELS.indexOf(msgLevel) >= LOG_LEVELS.indexOf(currentLevel)
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* NOTE: for the reasons described above, do not change the order of the entries
|
|
23
|
+
* in this array without good reason!
|
|
24
|
+
*/
|
|
25
|
+
const LOG_LEVELS = ['debug', 'info', 'warn', 'error'];
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Convert a string from PascalCase to dash-case
|
|
29
|
+
*
|
|
30
|
+
* @param str the string to convert
|
|
31
|
+
* @returns a converted string
|
|
32
|
+
*/
|
|
33
|
+
const toDashCase = (str) => str
|
|
34
|
+
.replace(/([A-Z0-9])/g, (match) => ` ${match[0]}`)
|
|
35
|
+
.trim()
|
|
36
|
+
.split(' ')
|
|
37
|
+
.join('-')
|
|
38
|
+
.toLowerCase();
|
|
39
|
+
/**
|
|
40
|
+
* Convert a string from dash-case / kebab-case to PascalCase (or CamelCase,
|
|
41
|
+
* or whatever you call it!)
|
|
42
|
+
*
|
|
43
|
+
* @param str a string to convert
|
|
44
|
+
* @returns a converted string
|
|
45
|
+
*/
|
|
46
|
+
const dashToPascalCase = (str) => str
|
|
47
|
+
.toLowerCase()
|
|
6
48
|
.split('-')
|
|
7
49
|
.map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
|
|
8
50
|
.join('');
|
|
@@ -275,22 +317,223 @@ const validateComponentTag = (tag) => {
|
|
|
275
317
|
return undefined;
|
|
276
318
|
};
|
|
277
319
|
|
|
278
|
-
|
|
320
|
+
/**
|
|
321
|
+
* All the Boolean options supported by the Rindo CLI
|
|
322
|
+
*/
|
|
323
|
+
const BOOLEAN_CLI_ARGS = [
|
|
324
|
+
'build',
|
|
325
|
+
'cache',
|
|
326
|
+
'checkVersion',
|
|
327
|
+
'ci',
|
|
328
|
+
'compare',
|
|
329
|
+
'debug',
|
|
330
|
+
'dev',
|
|
331
|
+
'devtools',
|
|
332
|
+
'docs',
|
|
333
|
+
'e2e',
|
|
334
|
+
'es5',
|
|
335
|
+
'esm',
|
|
336
|
+
'headless',
|
|
337
|
+
'help',
|
|
338
|
+
'log',
|
|
339
|
+
'open',
|
|
340
|
+
'prerender',
|
|
341
|
+
'prerenderExternal',
|
|
342
|
+
'prod',
|
|
343
|
+
'profile',
|
|
344
|
+
'serviceWorker',
|
|
345
|
+
'screenshot',
|
|
346
|
+
'serve',
|
|
347
|
+
'skipNodeCheck',
|
|
348
|
+
'spec',
|
|
349
|
+
'ssr',
|
|
350
|
+
'stats',
|
|
351
|
+
'updateScreenshot',
|
|
352
|
+
'verbose',
|
|
353
|
+
'version',
|
|
354
|
+
'watch',
|
|
355
|
+
// JEST CLI OPTIONS
|
|
356
|
+
'all',
|
|
357
|
+
'automock',
|
|
358
|
+
'bail',
|
|
359
|
+
// 'cache', Rindo already supports this argument
|
|
360
|
+
'changedFilesWithAncestor',
|
|
361
|
+
// 'ci', Rindo already supports this argument
|
|
362
|
+
'clearCache',
|
|
363
|
+
'clearMocks',
|
|
364
|
+
'collectCoverage',
|
|
365
|
+
'color',
|
|
366
|
+
'colors',
|
|
367
|
+
'coverage',
|
|
368
|
+
// 'debug', Rindo already supports this argument
|
|
369
|
+
'detectLeaks',
|
|
370
|
+
'detectOpenHandles',
|
|
371
|
+
'errorOnDeprecated',
|
|
372
|
+
'expand',
|
|
373
|
+
'findRelatedTests',
|
|
374
|
+
'forceExit',
|
|
375
|
+
'init',
|
|
376
|
+
'injectGlobals',
|
|
377
|
+
'json',
|
|
378
|
+
'lastCommit',
|
|
379
|
+
'listTests',
|
|
380
|
+
'logHeapUsage',
|
|
381
|
+
'noStackTrace',
|
|
382
|
+
'notify',
|
|
383
|
+
'onlyChanged',
|
|
384
|
+
'onlyFailures',
|
|
385
|
+
'passWithNoTests',
|
|
386
|
+
'resetMocks',
|
|
387
|
+
'resetModules',
|
|
388
|
+
'restoreMocks',
|
|
389
|
+
'runInBand',
|
|
390
|
+
'runTestsByPath',
|
|
391
|
+
'showConfig',
|
|
392
|
+
'silent',
|
|
393
|
+
'skipFilter',
|
|
394
|
+
'testLocationInResults',
|
|
395
|
+
'updateSnapshot',
|
|
396
|
+
'useStderr',
|
|
397
|
+
// 'verbose', Rindo already supports this argument
|
|
398
|
+
// 'version', Rindo already supports this argument
|
|
399
|
+
// 'watch', Rindo already supports this argument
|
|
400
|
+
'watchAll',
|
|
401
|
+
'watchman',
|
|
402
|
+
];
|
|
403
|
+
/**
|
|
404
|
+
* All the Number options supported by the Rindo CLI
|
|
405
|
+
*/
|
|
406
|
+
const NUMBER_CLI_ARGS = [
|
|
407
|
+
'port',
|
|
408
|
+
// JEST CLI ARGS
|
|
409
|
+
'maxConcurrency',
|
|
410
|
+
'testTimeout',
|
|
411
|
+
];
|
|
412
|
+
/**
|
|
413
|
+
* All the String options supported by the Rindo CLI
|
|
414
|
+
*/
|
|
415
|
+
const STRING_CLI_ARGS = [
|
|
416
|
+
'address',
|
|
417
|
+
'config',
|
|
418
|
+
'docsApi',
|
|
419
|
+
'docsJson',
|
|
420
|
+
'emulate',
|
|
421
|
+
'root',
|
|
422
|
+
'screenshotConnector',
|
|
423
|
+
// JEST CLI ARGS
|
|
424
|
+
'cacheDirectory',
|
|
425
|
+
'changedSince',
|
|
426
|
+
'collectCoverageFrom',
|
|
427
|
+
// 'config', Rindo already supports this argument
|
|
428
|
+
'coverageDirectory',
|
|
429
|
+
'coverageThreshold',
|
|
430
|
+
'env',
|
|
431
|
+
'filter',
|
|
432
|
+
'globalSetup',
|
|
433
|
+
'globalTeardown',
|
|
434
|
+
'globals',
|
|
435
|
+
'haste',
|
|
436
|
+
'moduleNameMapper',
|
|
437
|
+
'notifyMode',
|
|
438
|
+
'outputFile',
|
|
439
|
+
'preset',
|
|
440
|
+
'prettierPath',
|
|
441
|
+
'resolver',
|
|
442
|
+
'rootDir',
|
|
443
|
+
'runner',
|
|
444
|
+
'testEnvironment',
|
|
445
|
+
'testEnvironmentOptions',
|
|
446
|
+
'testFailureExitCode',
|
|
447
|
+
'testNamePattern',
|
|
448
|
+
'testResultsProcessor',
|
|
449
|
+
'testRunner',
|
|
450
|
+
'testSequencer',
|
|
451
|
+
'testURL',
|
|
452
|
+
'timers',
|
|
453
|
+
'transform',
|
|
454
|
+
// ARRAY ARGS
|
|
455
|
+
'collectCoverageOnlyFrom',
|
|
456
|
+
'coveragePathIgnorePatterns',
|
|
457
|
+
'coverageReporters',
|
|
458
|
+
'moduleDirectories',
|
|
459
|
+
'moduleFileExtensions',
|
|
460
|
+
'modulePathIgnorePatterns',
|
|
461
|
+
'modulePaths',
|
|
462
|
+
'projects',
|
|
463
|
+
'reporters',
|
|
464
|
+
'roots',
|
|
465
|
+
'selectProjects',
|
|
466
|
+
'setupFiles',
|
|
467
|
+
'setupFilesAfterEnv',
|
|
468
|
+
'snapshotSerializers',
|
|
469
|
+
'testMatch',
|
|
470
|
+
'testPathIgnorePatterns',
|
|
471
|
+
'testPathPattern',
|
|
472
|
+
'testRegex',
|
|
473
|
+
'transformIgnorePatterns',
|
|
474
|
+
'unmockedModulePathPatterns',
|
|
475
|
+
'watchPathIgnorePatterns',
|
|
476
|
+
];
|
|
477
|
+
/**
|
|
478
|
+
* All the CLI arguments which may have string or number values
|
|
479
|
+
*
|
|
480
|
+
* `maxWorkers` is an argument which is used both by Rindo _and_ by Jest,
|
|
481
|
+
* which means that we need to support parsing both string and number values.
|
|
482
|
+
*/
|
|
483
|
+
const STRING_NUMBER_CLI_ARGS = ['maxWorkers'];
|
|
484
|
+
/**
|
|
485
|
+
* All the LogLevel-type options supported by the Rindo CLI
|
|
486
|
+
*
|
|
487
|
+
* This is a bit silly since there's only one such argument atm,
|
|
488
|
+
* but this approach lets us make sure that we're handling all
|
|
489
|
+
* our arguments in a type-safe way.
|
|
490
|
+
*/
|
|
491
|
+
const LOG_LEVEL_CLI_ARGS = ['logLevel'];
|
|
492
|
+
/**
|
|
493
|
+
* For a small subset of CLI options we support a short alias e.g. `'h'` for `'help'`
|
|
494
|
+
*/
|
|
495
|
+
const CLI_ARG_ALIASES = {
|
|
496
|
+
config: 'c',
|
|
497
|
+
help: 'h',
|
|
498
|
+
port: 'p',
|
|
499
|
+
version: 'v',
|
|
500
|
+
};
|
|
501
|
+
/**
|
|
502
|
+
* Helper function for initializing a `ConfigFlags` object. Provide any overrides
|
|
503
|
+
* for default values and off you go!
|
|
504
|
+
*
|
|
505
|
+
* @param init an object with any overrides for default values
|
|
506
|
+
* @returns a complete CLI flag object
|
|
507
|
+
*/
|
|
508
|
+
const createConfigFlags = (init = {}) => {
|
|
279
509
|
const flags = {
|
|
280
510
|
task: null,
|
|
281
511
|
args: [],
|
|
282
512
|
knownArgs: [],
|
|
283
|
-
unknownArgs:
|
|
513
|
+
unknownArgs: [],
|
|
514
|
+
...init,
|
|
284
515
|
};
|
|
516
|
+
return flags;
|
|
517
|
+
};
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Parse command line arguments into a structured `ConfigFlags` object
|
|
521
|
+
*
|
|
522
|
+
* @param args an array of config flags
|
|
523
|
+
* @param sys an optional compiler system
|
|
524
|
+
* @returns a structured ConfigFlags object
|
|
525
|
+
*/
|
|
526
|
+
const parseFlags = (args, sys) => {
|
|
527
|
+
const flags = createConfigFlags();
|
|
285
528
|
// cmd line has more priority over npm scripts cmd
|
|
286
|
-
flags.args = args.slice();
|
|
529
|
+
flags.args = Array.isArray(args) ? args.slice() : [];
|
|
287
530
|
if (flags.args.length > 0 && flags.args[0] && !flags.args[0].startsWith('-')) {
|
|
288
531
|
flags.task = flags.args[0];
|
|
289
532
|
}
|
|
290
|
-
parseArgs(flags, flags.args
|
|
533
|
+
parseArgs(flags, flags.args);
|
|
291
534
|
if (sys && sys.name === 'node') {
|
|
292
535
|
const envArgs = getNpmConfigEnvArgs(sys);
|
|
293
|
-
parseArgs(flags, envArgs
|
|
536
|
+
parseArgs(flags, envArgs);
|
|
294
537
|
envArgs.forEach((envArg) => {
|
|
295
538
|
if (!flags.args.includes(envArg)) {
|
|
296
539
|
flags.args.push(envArg);
|
|
@@ -309,185 +552,230 @@ const parseFlags = (args, sys) => {
|
|
|
309
552
|
return flags;
|
|
310
553
|
};
|
|
311
554
|
/**
|
|
312
|
-
* Parse command line arguments that are
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
555
|
+
* Parse command line arguments that are enumerated in the `config-flags`
|
|
556
|
+
* module. Handles leading dashes on arguments, aliases that are defined for a
|
|
557
|
+
* small number of arguments, and parsing values for non-boolean arguments
|
|
558
|
+
* (e.g. port number for the dev server).
|
|
316
559
|
*
|
|
317
|
-
* @param flags
|
|
318
|
-
* @param args
|
|
319
|
-
* @param knownArgs an array to which all recognized, legal arguments are added
|
|
560
|
+
* @param flags a ConfigFlags object to which parsed arguments will be added
|
|
561
|
+
* @param args an array of command-line arguments to parse
|
|
320
562
|
*/
|
|
321
|
-
const parseArgs = (flags, args
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
563
|
+
const parseArgs = (flags, args) => {
|
|
564
|
+
BOOLEAN_CLI_ARGS.forEach((argName) => parseBooleanArg(flags, args, argName));
|
|
565
|
+
STRING_CLI_ARGS.forEach((argName) => parseStringArg(flags, args, argName));
|
|
566
|
+
NUMBER_CLI_ARGS.forEach((argName) => parseNumberArg(flags, args, argName));
|
|
567
|
+
STRING_NUMBER_CLI_ARGS.forEach((argName) => parseStringNumberArg(flags, args, argName));
|
|
568
|
+
LOG_LEVEL_CLI_ARGS.forEach((argName) => parseLogLevelArg(flags, args, argName));
|
|
569
|
+
};
|
|
570
|
+
/**
|
|
571
|
+
* Parse a boolean CLI argument. For these, we support the following formats:
|
|
572
|
+
*
|
|
573
|
+
* - `--booleanArg`
|
|
574
|
+
* - `--boolean-arg`
|
|
575
|
+
* - `--noBooleanArg`
|
|
576
|
+
* - `--no-boolean-arg`
|
|
577
|
+
*
|
|
578
|
+
* The final two variants should be parsed to a value of `false` on the config
|
|
579
|
+
* object.
|
|
580
|
+
*
|
|
581
|
+
* @param flags the config flags object, while we'll modify
|
|
582
|
+
* @param args our CLI arguments
|
|
583
|
+
* @param configCaseName the argument we want to look at right now
|
|
584
|
+
*/
|
|
585
|
+
const parseBooleanArg = (flags, args, configCaseName) => {
|
|
586
|
+
// we support both dash-case and PascalCase versions of the parameter
|
|
587
|
+
// argName is 'configCase' version which can be found in BOOLEAN_ARG_OPTS
|
|
588
|
+
const alias = CLI_ARG_ALIASES[configCaseName];
|
|
589
|
+
const dashCaseName = toDashCase(configCaseName);
|
|
590
|
+
if (typeof flags[configCaseName] !== 'boolean') {
|
|
591
|
+
flags[configCaseName] = null;
|
|
592
|
+
}
|
|
593
|
+
args.forEach((cmdArg) => {
|
|
594
|
+
let value;
|
|
595
|
+
if (cmdArg === `--${configCaseName}` || cmdArg === `--${dashCaseName}`) {
|
|
596
|
+
value = true;
|
|
327
597
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
flags[flagKey] = true;
|
|
331
|
-
knownArgs.push(cmdArg);
|
|
332
|
-
}
|
|
333
|
-
else if (cmdArg === `--${flagKey}`) {
|
|
334
|
-
flags[flagKey] = true;
|
|
335
|
-
knownArgs.push(cmdArg);
|
|
336
|
-
}
|
|
337
|
-
else if (cmdArg === `--no-${booleanName}`) {
|
|
338
|
-
flags[flagKey] = false;
|
|
339
|
-
knownArgs.push(cmdArg);
|
|
340
|
-
}
|
|
341
|
-
else if (cmdArg === `--no${dashToPascalCase(booleanName)}`) {
|
|
342
|
-
flags[flagKey] = false;
|
|
343
|
-
knownArgs.push(cmdArg);
|
|
344
|
-
}
|
|
345
|
-
else if (alias && cmdArg === `-${alias}`) {
|
|
346
|
-
flags[flagKey] = true;
|
|
347
|
-
knownArgs.push(cmdArg);
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
});
|
|
351
|
-
STRING_ARG_OPTS.forEach((stringName) => {
|
|
352
|
-
const alias = ARG_OPTS_ALIASES[stringName];
|
|
353
|
-
const flagKey = configCase(stringName);
|
|
354
|
-
if (typeof flags[flagKey] !== 'string') {
|
|
355
|
-
flags[flagKey] = null;
|
|
598
|
+
else if (cmdArg === `--no-${dashCaseName}` || cmdArg === `--no${dashToPascalCase(dashCaseName)}`) {
|
|
599
|
+
value = false;
|
|
356
600
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
knownArgs.push(cmdArg);
|
|
364
|
-
}
|
|
365
|
-
else if (cmdArg === `--${stringName}`) {
|
|
366
|
-
flags[flagKey] = args[i + 1];
|
|
367
|
-
knownArgs.push(cmdArg);
|
|
368
|
-
knownArgs.push(args[i + 1]);
|
|
369
|
-
}
|
|
370
|
-
else if (cmdArg === `--${flagKey}`) {
|
|
371
|
-
flags[flagKey] = args[i + 1];
|
|
372
|
-
knownArgs.push(cmdArg);
|
|
373
|
-
knownArgs.push(args[i + 1]);
|
|
374
|
-
}
|
|
375
|
-
else if (cmdArg.startsWith(`--${flagKey}=`)) {
|
|
376
|
-
const values = cmdArg.split('=');
|
|
377
|
-
values.shift();
|
|
378
|
-
flags[flagKey] = values.join('=');
|
|
379
|
-
knownArgs.push(cmdArg);
|
|
380
|
-
}
|
|
381
|
-
else if (alias) {
|
|
382
|
-
if (cmdArg.startsWith(`-${alias}=`)) {
|
|
383
|
-
const values = cmdArg.split('=');
|
|
384
|
-
values.shift();
|
|
385
|
-
flags[flagKey] = values.join('=');
|
|
386
|
-
knownArgs.push(cmdArg);
|
|
387
|
-
}
|
|
388
|
-
else if (cmdArg === `-${alias}`) {
|
|
389
|
-
flags[flagKey] = args[i + 1];
|
|
390
|
-
knownArgs.push(args[i + 1]);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
601
|
+
else if (alias && cmdArg === `-${alias}`) {
|
|
602
|
+
value = true;
|
|
603
|
+
}
|
|
604
|
+
if (value !== undefined && cmdArg !== undefined) {
|
|
605
|
+
flags[configCaseName] = value;
|
|
606
|
+
flags.knownArgs.push(cmdArg);
|
|
393
607
|
}
|
|
394
608
|
});
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
609
|
+
};
|
|
610
|
+
/**
|
|
611
|
+
* Parse a string CLI argument
|
|
612
|
+
*
|
|
613
|
+
* @param flags the config flags object, while we'll modify
|
|
614
|
+
* @param args our CLI arguments
|
|
615
|
+
* @param configCaseName the argument we want to look at right now
|
|
616
|
+
*/
|
|
617
|
+
const parseStringArg = (flags, args, configCaseName) => {
|
|
618
|
+
if (typeof flags[configCaseName] !== 'string') {
|
|
619
|
+
flags[configCaseName] = null;
|
|
620
|
+
}
|
|
621
|
+
const { value, matchingArg } = getValue(args, configCaseName);
|
|
622
|
+
if (value !== undefined && matchingArg !== undefined) {
|
|
623
|
+
flags[configCaseName] = value;
|
|
624
|
+
flags.knownArgs.push(matchingArg);
|
|
625
|
+
flags.knownArgs.push(value);
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
/**
|
|
629
|
+
* Parse a number CLI argument
|
|
630
|
+
*
|
|
631
|
+
* @param flags the config flags object, while we'll modify
|
|
632
|
+
* @param args our CLI arguments
|
|
633
|
+
* @param configCaseName the argument we want to look at right now
|
|
634
|
+
*/
|
|
635
|
+
const parseNumberArg = (flags, args, configCaseName) => {
|
|
636
|
+
if (typeof flags[configCaseName] !== 'number') {
|
|
637
|
+
flags[configCaseName] = null;
|
|
638
|
+
}
|
|
639
|
+
const { value, matchingArg } = getValue(args, configCaseName);
|
|
640
|
+
if (value !== undefined && matchingArg !== undefined) {
|
|
641
|
+
flags[configCaseName] = parseInt(value, 10);
|
|
642
|
+
flags.knownArgs.push(matchingArg);
|
|
643
|
+
flags.knownArgs.push(value);
|
|
644
|
+
}
|
|
645
|
+
};
|
|
646
|
+
/**
|
|
647
|
+
* Parse a CLI argument which may be either a string or a number
|
|
648
|
+
*
|
|
649
|
+
* @param flags the config flags object, while we'll modify
|
|
650
|
+
* @param args our CLI arguments
|
|
651
|
+
* @param configCaseName the argument we want to look at right now
|
|
652
|
+
*/
|
|
653
|
+
const parseStringNumberArg = (flags, args, configCaseName) => {
|
|
654
|
+
if (!['number', 'string'].includes(typeof flags[configCaseName])) {
|
|
655
|
+
flags[configCaseName] = null;
|
|
656
|
+
}
|
|
657
|
+
const { value, matchingArg } = getValue(args, configCaseName);
|
|
658
|
+
if (value !== undefined && matchingArg !== undefined) {
|
|
659
|
+
if (CLI_ARG_STRING_REGEX.test(value)) {
|
|
660
|
+
// if it matches the regex we treat it like a string
|
|
661
|
+
flags[configCaseName] = value;
|
|
400
662
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
663
|
+
else {
|
|
664
|
+
// it was a number, great!
|
|
665
|
+
flags[configCaseName] = Number(value);
|
|
666
|
+
}
|
|
667
|
+
flags.knownArgs.push(matchingArg);
|
|
668
|
+
flags.knownArgs.push(value);
|
|
669
|
+
}
|
|
670
|
+
};
|
|
671
|
+
/**
|
|
672
|
+
* We use this regular expression to detect CLI parameters which
|
|
673
|
+
* should be parsed as string values (as opposed to numbers) for
|
|
674
|
+
* the argument types for which we support both a string and a
|
|
675
|
+
* number value.
|
|
676
|
+
*
|
|
677
|
+
* The regex tests for the presence of at least one character which is
|
|
678
|
+
* _not_ a digit (`\d`), a period (`\.`), or one of the characters `"e"`,
|
|
679
|
+
* `"E"`, `"+"`, or `"-"` (the latter four characters are necessary to
|
|
680
|
+
* support the admittedly unlikely use of scientific notation, like `"4e+0"`
|
|
681
|
+
* for `4`).
|
|
682
|
+
*
|
|
683
|
+
* Thus we'll match a string like `"50%"`, but not a string like `"50"` or
|
|
684
|
+
* `"5.0"`. If it matches a given string we conclude that the string should
|
|
685
|
+
* be parsed as a string literal, rather than using `Number` to convert it
|
|
686
|
+
* to a number.
|
|
687
|
+
*/
|
|
688
|
+
const CLI_ARG_STRING_REGEX = /[^\d\.Ee\+\-]+/g;
|
|
689
|
+
/**
|
|
690
|
+
* Parse a LogLevel CLI argument. These can be only a specific
|
|
691
|
+
* set of strings, so this function takes care of validating that
|
|
692
|
+
* the value is correct.
|
|
693
|
+
*
|
|
694
|
+
* @param flags the config flags object, while we'll modify
|
|
695
|
+
* @param args our CLI arguments
|
|
696
|
+
* @param configCaseName the argument we want to look at right now
|
|
697
|
+
*/
|
|
698
|
+
const parseLogLevelArg = (flags, args, configCaseName) => {
|
|
699
|
+
if (typeof flags[configCaseName] !== 'string') {
|
|
700
|
+
flags[configCaseName] = null;
|
|
701
|
+
}
|
|
702
|
+
const { value, matchingArg } = getValue(args, configCaseName);
|
|
703
|
+
if (value !== undefined && matchingArg !== undefined && isLogLevel(value)) {
|
|
704
|
+
flags[configCaseName] = value;
|
|
705
|
+
flags.knownArgs.push(matchingArg);
|
|
706
|
+
flags.knownArgs.push(value);
|
|
707
|
+
}
|
|
708
|
+
};
|
|
709
|
+
/**
|
|
710
|
+
* Helper for pulling values out from the raw array of CLI arguments. This logic
|
|
711
|
+
* is shared between a few different types of CLI args.
|
|
712
|
+
*
|
|
713
|
+
* We look for arguments in the following formats:
|
|
714
|
+
*
|
|
715
|
+
* - `--my-cli-argument value`
|
|
716
|
+
* - `--my-cli-argument=value`
|
|
717
|
+
* - `--myCliArgument value`
|
|
718
|
+
* - `--myCliArgument=value`
|
|
719
|
+
*
|
|
720
|
+
* We also check for shortened aliases, which we define for a few arguments.
|
|
721
|
+
*
|
|
722
|
+
* @param args the CLI args we're dealing with
|
|
723
|
+
* @param configCaseName the ConfigFlag key which we're looking to pull out a value for
|
|
724
|
+
* @returns the value for the flag as well as the exact string which it matched from
|
|
725
|
+
* the user input.
|
|
726
|
+
*/
|
|
727
|
+
const getValue = (args, configCaseName) => {
|
|
728
|
+
// for some CLI args we have a short alias, like 'c' for 'config'
|
|
729
|
+
const alias = CLI_ARG_ALIASES[configCaseName];
|
|
730
|
+
// we support supplying arguments in both dash-case and configCase
|
|
731
|
+
// for ease of use
|
|
732
|
+
const dashCaseName = toDashCase(configCaseName);
|
|
733
|
+
let value;
|
|
734
|
+
let matchingArg;
|
|
735
|
+
args.forEach((arg, i) => {
|
|
736
|
+
if (arg.startsWith(`--${dashCaseName}=`) || arg.startsWith(`--${configCaseName}=`)) {
|
|
737
|
+
value = getEqualsValue(arg);
|
|
738
|
+
matchingArg = arg;
|
|
739
|
+
}
|
|
740
|
+
else if (arg === `--${dashCaseName}` || arg === `--${configCaseName}`) {
|
|
741
|
+
value = args[i + 1];
|
|
742
|
+
matchingArg = arg;
|
|
743
|
+
}
|
|
744
|
+
else if (alias) {
|
|
745
|
+
if (arg.startsWith(`-${alias}=`)) {
|
|
746
|
+
value = getEqualsValue(arg);
|
|
747
|
+
matchingArg = arg;
|
|
422
748
|
}
|
|
423
|
-
else if (alias) {
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
values.shift();
|
|
427
|
-
flags[flagKey] = parseInt(values.join(''), 10);
|
|
428
|
-
knownArgs.push(cmdArg);
|
|
429
|
-
}
|
|
430
|
-
else if (cmdArg === `-${alias}`) {
|
|
431
|
-
flags[flagKey] = parseInt(args[i + 1], 10);
|
|
432
|
-
knownArgs.push(args[i + 1]);
|
|
433
|
-
}
|
|
749
|
+
else if (arg === `-${alias}`) {
|
|
750
|
+
value = args[i + 1];
|
|
751
|
+
matchingArg = arg;
|
|
434
752
|
}
|
|
435
753
|
}
|
|
436
754
|
});
|
|
755
|
+
return { value, matchingArg };
|
|
437
756
|
};
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
'prerender-external',
|
|
461
|
-
'prod',
|
|
462
|
-
'profile',
|
|
463
|
-
'service-worker',
|
|
464
|
-
'screenshot',
|
|
465
|
-
'serve',
|
|
466
|
-
'skip-node-check',
|
|
467
|
-
'spec',
|
|
468
|
-
'ssr',
|
|
469
|
-
'stats',
|
|
470
|
-
'update-screenshot',
|
|
471
|
-
'verbose',
|
|
472
|
-
'version',
|
|
473
|
-
'watch',
|
|
474
|
-
];
|
|
475
|
-
const NUMBER_ARG_OPTS = ['max-workers', 'port'];
|
|
476
|
-
const STRING_ARG_OPTS = [
|
|
477
|
-
'address',
|
|
478
|
-
'config',
|
|
479
|
-
'docs-json',
|
|
480
|
-
'emulate',
|
|
481
|
-
'log-level',
|
|
482
|
-
'root',
|
|
483
|
-
'screenshot-connector',
|
|
484
|
-
];
|
|
485
|
-
const ARG_OPTS_ALIASES = {
|
|
486
|
-
config: 'c',
|
|
487
|
-
help: 'h',
|
|
488
|
-
port: 'p',
|
|
489
|
-
version: 'v',
|
|
490
|
-
};
|
|
757
|
+
/**
|
|
758
|
+
* When a parameter is set in the format `--foobar=12` at the CLI (as opposed to
|
|
759
|
+
* `--foobar 12`) we want to get the value after the `=` sign
|
|
760
|
+
*
|
|
761
|
+
* @param commandArgument the arg in question
|
|
762
|
+
* @returns the value after the `=`
|
|
763
|
+
*/
|
|
764
|
+
const getEqualsValue = (commandArgument) => commandArgument.split('=').slice(1).join('=');
|
|
765
|
+
/**
|
|
766
|
+
* Small helper for getting type-system-level assurance that a `string` can be
|
|
767
|
+
* narrowed to a `LogLevel`
|
|
768
|
+
*
|
|
769
|
+
* @param maybeLogLevel the string to check
|
|
770
|
+
* @returns whether this is a `LogLevel`
|
|
771
|
+
*/
|
|
772
|
+
const isLogLevel = (maybeLogLevel) =>
|
|
773
|
+
// unfortunately `includes` is typed on `ReadonlyArray<T>` as `(el: T):
|
|
774
|
+
// boolean` so a `string` cannot be passed to `includes` on a
|
|
775
|
+
// `ReadonlyArray` 😢 thus we `as any`
|
|
776
|
+
//
|
|
777
|
+
// see microsoft/TypeScript#31018 for some discussion of this
|
|
778
|
+
LOG_LEVELS.includes(maybeLogLevel);
|
|
491
779
|
const getNpmConfigEnvArgs = (sys) => {
|
|
492
780
|
// process.env.npm_config_argv
|
|
493
781
|
// {"remain":["4444"],"cooked":["run","serve","--port","4444"],"original":["run","serve","--port","4444"]}
|
|
@@ -508,7 +796,7 @@ const getNpmConfigEnvArgs = (sys) => {
|
|
|
508
796
|
const dependencies = [
|
|
509
797
|
{
|
|
510
798
|
name: "@rindo/core",
|
|
511
|
-
version: "2.17.0",
|
|
799
|
+
version: "2.17.2-0",
|
|
512
800
|
main: "compiler/rindo.js",
|
|
513
801
|
resources: [
|
|
514
802
|
"package.json",
|
|
@@ -833,16 +1121,16 @@ const tryFn = async (fn, ...args) => {
|
|
|
833
1121
|
}
|
|
834
1122
|
return null;
|
|
835
1123
|
};
|
|
836
|
-
const isInteractive = (sys,
|
|
837
|
-
var _a;
|
|
1124
|
+
const isInteractive = (sys, flags, object) => {
|
|
838
1125
|
const terminalInfo = object ||
|
|
839
1126
|
Object.freeze({
|
|
840
1127
|
tty: sys.isTTY() ? true : false,
|
|
841
|
-
ci: ['CI', 'BUILD_ID', 'BUILD_NUMBER', 'BITBUCKET_COMMIT', 'CODEBUILD_BUILD_ARN'].filter((v) => !!sys.getEnvironmentVar(v)).length > 0 || !!
|
|
1128
|
+
ci: ['CI', 'BUILD_ID', 'BUILD_NUMBER', 'BITBUCKET_COMMIT', 'CODEBUILD_BUILD_ARN'].filter((v) => !!sys.getEnvironmentVar(v)).length > 0 || !!flags.ci,
|
|
842
1129
|
});
|
|
843
1130
|
return terminalInfo.tty && !terminalInfo.ci;
|
|
844
1131
|
};
|
|
845
1132
|
const UUID_REGEX = new RegExp(/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i);
|
|
1133
|
+
// Plucked from https://github.com/navify/jigra/blob/HEAD/cli/src/util/uuid.ts
|
|
846
1134
|
function uuidv4() {
|
|
847
1135
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
848
1136
|
const r = (Math.random() * 16) | 0;
|
|
@@ -862,19 +1150,19 @@ async function readJson(sys, path) {
|
|
|
862
1150
|
}
|
|
863
1151
|
/**
|
|
864
1152
|
* Does the command have the debug flag?
|
|
865
|
-
* @param
|
|
1153
|
+
* @param flags The configuration flags passed into the Rindo command
|
|
866
1154
|
* @returns true if --debug has been passed, otherwise false
|
|
867
1155
|
*/
|
|
868
|
-
function hasDebug(
|
|
869
|
-
return
|
|
1156
|
+
function hasDebug(flags) {
|
|
1157
|
+
return flags.debug;
|
|
870
1158
|
}
|
|
871
1159
|
/**
|
|
872
1160
|
* Does the command have the verbose and debug flags?
|
|
873
|
-
* @param
|
|
1161
|
+
* @param flags The configuration flags passed into the Rindo command
|
|
874
1162
|
* @returns true if both --debug and --verbose have been passed, otherwise false
|
|
875
1163
|
*/
|
|
876
|
-
function hasVerbose(
|
|
877
|
-
return
|
|
1164
|
+
function hasVerbose(flags) {
|
|
1165
|
+
return flags.verbose && hasDebug(flags);
|
|
878
1166
|
}
|
|
879
1167
|
|
|
880
1168
|
/**
|
|
@@ -885,7 +1173,7 @@ function hasVerbose(config) {
|
|
|
885
1173
|
* @returns true if telemetry should be sent, false otherwise
|
|
886
1174
|
*/
|
|
887
1175
|
async function shouldTrack(config, sys, ci) {
|
|
888
|
-
return !ci && isInteractive(sys, config) && (await checkTelemetry(sys));
|
|
1176
|
+
return !ci && isInteractive(sys, config.flags) && (await checkTelemetry(sys));
|
|
889
1177
|
}
|
|
890
1178
|
|
|
891
1179
|
const isTest$1 = () => process.env.JEST_WORKER_ID !== undefined;
|
|
@@ -956,11 +1244,10 @@ const WWW = 'www';
|
|
|
956
1244
|
*
|
|
957
1245
|
* @param sys The system where the command is invoked
|
|
958
1246
|
* @param config The config passed into the Rindo command
|
|
959
|
-
* @param logger The tool used to do logging
|
|
960
1247
|
* @param coreCompiler The compiler used to do builds
|
|
961
1248
|
* @param result The results of a compiler build.
|
|
962
1249
|
*/
|
|
963
|
-
async function telemetryBuildFinishedAction(sys, config,
|
|
1250
|
+
async function telemetryBuildFinishedAction(sys, config, coreCompiler, result) {
|
|
964
1251
|
const tracking = await shouldTrack(config, sys, config.flags.ci);
|
|
965
1252
|
if (!tracking) {
|
|
966
1253
|
return;
|
|
@@ -968,21 +1255,19 @@ async function telemetryBuildFinishedAction(sys, config, logger, coreCompiler, r
|
|
|
968
1255
|
const component_count = Object.keys(result.componentGraph).length;
|
|
969
1256
|
const data = await prepareData(coreCompiler, config, sys, result.duration, component_count);
|
|
970
1257
|
await sendMetric(sys, config, 'rindo_cli_command', data);
|
|
971
|
-
logger.debug(`${logger.blue('Telemetry')}: ${logger.gray(JSON.stringify(data))}`);
|
|
1258
|
+
config.logger.debug(`${config.logger.blue('Telemetry')}: ${config.logger.gray(JSON.stringify(data))}`);
|
|
972
1259
|
}
|
|
973
1260
|
/**
|
|
974
1261
|
* A function to wrap a compiler task function around. Will send telemetry if, and only if, the machine allows.
|
|
975
1262
|
*
|
|
976
1263
|
* @param sys The system where the command is invoked
|
|
977
1264
|
* @param config The config passed into the Rindo command
|
|
978
|
-
* @param logger The tool used to do logging
|
|
979
1265
|
* @param coreCompiler The compiler used to do builds
|
|
980
1266
|
* @param action A Promise-based function to call in order to get the duration of any given command.
|
|
981
1267
|
* @returns void
|
|
982
1268
|
*/
|
|
983
|
-
async function telemetryAction(sys, config,
|
|
984
|
-
|
|
985
|
-
const tracking = await shouldTrack(config, sys, !!((_a = config === null || config === void 0 ? void 0 : config.flags) === null || _a === void 0 ? void 0 : _a.ci));
|
|
1269
|
+
async function telemetryAction(sys, config, coreCompiler, action) {
|
|
1270
|
+
const tracking = await shouldTrack(config, sys, !!config.flags.ci);
|
|
986
1271
|
let duration = undefined;
|
|
987
1272
|
let error;
|
|
988
1273
|
if (action) {
|
|
@@ -1002,7 +1287,7 @@ async function telemetryAction(sys, config, logger, coreCompiler, action) {
|
|
|
1002
1287
|
}
|
|
1003
1288
|
const data = await prepareData(coreCompiler, config, sys, duration);
|
|
1004
1289
|
await sendMetric(sys, config, 'rindo_cli_command', data);
|
|
1005
|
-
logger.debug(`${logger.blue('Telemetry')}: ${logger.gray(JSON.stringify(data))}`);
|
|
1290
|
+
config.logger.debug(`${config.logger.blue('Telemetry')}: ${config.logger.gray(JSON.stringify(data))}`);
|
|
1006
1291
|
if (error) {
|
|
1007
1292
|
throw error;
|
|
1008
1293
|
}
|
|
@@ -1170,7 +1455,7 @@ async function getInstalledPackages(sys, config) {
|
|
|
1170
1455
|
return { packages, packagesNoVersions };
|
|
1171
1456
|
}
|
|
1172
1457
|
catch (err) {
|
|
1173
|
-
hasDebug(config) && console.error(err);
|
|
1458
|
+
hasDebug(config.flags) && console.error(err);
|
|
1174
1459
|
return { packages, packagesNoVersions };
|
|
1175
1460
|
}
|
|
1176
1461
|
}
|
|
@@ -1272,15 +1557,15 @@ async function sendTelemetry(sys, config, data) {
|
|
|
1272
1557
|
},
|
|
1273
1558
|
body: JSON.stringify(body),
|
|
1274
1559
|
});
|
|
1275
|
-
hasVerbose(config) &&
|
|
1560
|
+
hasVerbose(config.flags) &&
|
|
1276
1561
|
console.debug('\nSent %O metric to events service (status: %O)', data.name, response.status, '\n');
|
|
1277
1562
|
if (response.status !== 204) {
|
|
1278
|
-
hasVerbose(config) &&
|
|
1563
|
+
hasVerbose(config.flags) &&
|
|
1279
1564
|
console.debug('\nBad response from events service. Request body: %O', response.body.toString(), '\n');
|
|
1280
1565
|
}
|
|
1281
1566
|
}
|
|
1282
1567
|
catch (e) {
|
|
1283
|
-
hasVerbose(config) && console.debug('Telemetry request failed:', e);
|
|
1568
|
+
hasVerbose(config.flags) && console.debug('Telemetry request failed:', e);
|
|
1284
1569
|
}
|
|
1285
1570
|
}
|
|
1286
1571
|
/**
|
|
@@ -1337,7 +1622,7 @@ const taskBuild = async (coreCompiler, config, sys) => {
|
|
|
1337
1622
|
const results = await compiler.build();
|
|
1338
1623
|
// TODO: make this parameter no longer optional, remove the surrounding if statement
|
|
1339
1624
|
if (sys) {
|
|
1340
|
-
await telemetryBuildFinishedAction(sys, config,
|
|
1625
|
+
await telemetryBuildFinishedAction(sys, config, coreCompiler, results);
|
|
1341
1626
|
}
|
|
1342
1627
|
await compiler.destroy();
|
|
1343
1628
|
if (results.hasError) {
|
|
@@ -1375,7 +1660,8 @@ const IS_NODE_ENV = typeof global !== 'undefined' &&
|
|
|
1375
1660
|
typeof require === 'function' &&
|
|
1376
1661
|
!!global.process &&
|
|
1377
1662
|
typeof __filename === 'string' &&
|
|
1378
|
-
(!global.origin || typeof global.origin !== 'string');
|
|
1663
|
+
(!global.origin || typeof global.origin !== 'string');
|
|
1664
|
+
const IS_BROWSER_ENV = typeof location !== 'undefined' && typeof navigator !== 'undefined' && typeof XMLHttpRequest !== 'undefined';
|
|
1379
1665
|
|
|
1380
1666
|
/**
|
|
1381
1667
|
* Task to generate component boilerplate and write it to disk. This task can
|
|
@@ -1569,7 +1855,8 @@ export class ${toPascalCase(tagName)} {
|
|
|
1569
1855
|
`;
|
|
1570
1856
|
};
|
|
1571
1857
|
/**
|
|
1572
|
-
* Get the boilerplate for style
|
|
1858
|
+
* Get the boilerplate for style for a generated component
|
|
1859
|
+
* @returns a boilerplate CSS block
|
|
1573
1860
|
*/
|
|
1574
1861
|
const getStyleUrlBoilerplate = () => `:host {
|
|
1575
1862
|
display: block;
|
|
@@ -1623,10 +1910,17 @@ describe('${tagName}', () => {
|
|
|
1623
1910
|
*/
|
|
1624
1911
|
const toPascalCase = (str) => str.split('-').reduce((res, part) => res + part[0].toUpperCase() + part.slice(1), '');
|
|
1625
1912
|
|
|
1626
|
-
|
|
1913
|
+
/**
|
|
1914
|
+
* Entrypoint for the Telemetry task
|
|
1915
|
+
* @param flags configuration flags provided to Rindo when a task was called (either this task or a task that invokes
|
|
1916
|
+
* telemetry)
|
|
1917
|
+
* @param sys the abstraction for interfacing with the operating system
|
|
1918
|
+
* @param logger a logging implementation to log the results out to the user
|
|
1919
|
+
*/
|
|
1920
|
+
const taskTelemetry = async (flags, sys, logger) => {
|
|
1627
1921
|
const prompt = logger.dim(sys.details.platform === 'windows' ? '>' : '$');
|
|
1628
|
-
const isEnabling =
|
|
1629
|
-
const isDisabling =
|
|
1922
|
+
const isEnabling = flags.args.includes('on');
|
|
1923
|
+
const isDisabling = flags.args.includes('off');
|
|
1630
1924
|
const INFORMATION = `Opt in or our of telemetry. Information about the data we collect is available on our website: ${logger.bold('https://rindojs.web.app/telemetry')}`;
|
|
1631
1925
|
const THANK_YOU = `Thank you for helping to make Rindo better! 💖`;
|
|
1632
1926
|
const ENABLED_MESSAGE = `${logger.green('Enabled')}. ${THANK_YOU}\n\n`;
|
|
@@ -1655,7 +1949,14 @@ const taskTelemetry = async (config, sys, logger) => {
|
|
|
1655
1949
|
`);
|
|
1656
1950
|
};
|
|
1657
1951
|
|
|
1658
|
-
|
|
1952
|
+
/**
|
|
1953
|
+
* Entrypoint for the Help task, providing Rindo usage context to the user
|
|
1954
|
+
* @param flags configuration flags provided to Rindo when a task was call (either this task or a task that invokes
|
|
1955
|
+
* telemetry)
|
|
1956
|
+
* @param logger a logging implementation to log the results out to the user
|
|
1957
|
+
* @param sys the abstraction for interfacing with the operating system
|
|
1958
|
+
*/
|
|
1959
|
+
const taskHelp = async (flags, logger, sys) => {
|
|
1659
1960
|
const prompt = logger.dim(sys.details.platform === 'windows' ? '>' : '$');
|
|
1660
1961
|
console.log(`
|
|
1661
1962
|
${logger.bold('Build:')} ${logger.dim('Build components for development or production.')}
|
|
@@ -1688,7 +1989,7 @@ const taskHelp = async (config, logger, sys) => {
|
|
|
1688
1989
|
`);
|
|
1689
1990
|
// TODO: make this parameter no longer optional, remove the surrounding if statement
|
|
1690
1991
|
if (sys) {
|
|
1691
|
-
await taskTelemetry(
|
|
1992
|
+
await taskTelemetry(flags, sys, logger);
|
|
1692
1993
|
}
|
|
1693
1994
|
console.log(`
|
|
1694
1995
|
${logger.bold('Examples:')}
|
|
@@ -1745,6 +2046,95 @@ const taskServe = async (config) => {
|
|
|
1745
2046
|
});
|
|
1746
2047
|
};
|
|
1747
2048
|
|
|
2049
|
+
/**
|
|
2050
|
+
* Creates an instance of a logger
|
|
2051
|
+
* @returns the new logger instance
|
|
2052
|
+
*/
|
|
2053
|
+
const createLogger = () => {
|
|
2054
|
+
let useColors = IS_BROWSER_ENV;
|
|
2055
|
+
let level = 'info';
|
|
2056
|
+
return {
|
|
2057
|
+
enableColors: (uc) => (useColors = uc),
|
|
2058
|
+
getLevel: () => level,
|
|
2059
|
+
setLevel: (l) => (level = l),
|
|
2060
|
+
emoji: (e) => e,
|
|
2061
|
+
info: console.log.bind(console),
|
|
2062
|
+
warn: console.warn.bind(console),
|
|
2063
|
+
error: console.error.bind(console),
|
|
2064
|
+
debug: console.debug.bind(console),
|
|
2065
|
+
red: (msg) => msg,
|
|
2066
|
+
green: (msg) => msg,
|
|
2067
|
+
yellow: (msg) => msg,
|
|
2068
|
+
blue: (msg) => msg,
|
|
2069
|
+
magenta: (msg) => msg,
|
|
2070
|
+
cyan: (msg) => msg,
|
|
2071
|
+
gray: (msg) => msg,
|
|
2072
|
+
bold: (msg) => msg,
|
|
2073
|
+
dim: (msg) => msg,
|
|
2074
|
+
bgRed: (msg) => msg,
|
|
2075
|
+
createTimeSpan: (_startMsg, _debug = false) => ({
|
|
2076
|
+
duration: () => 0,
|
|
2077
|
+
finish: () => 0,
|
|
2078
|
+
}),
|
|
2079
|
+
printDiagnostics(diagnostics) {
|
|
2080
|
+
diagnostics.forEach((diagnostic) => logDiagnostic(diagnostic, useColors));
|
|
2081
|
+
},
|
|
2082
|
+
};
|
|
2083
|
+
};
|
|
2084
|
+
const logDiagnostic = (diagnostic, useColors) => {
|
|
2085
|
+
let color = BLUE;
|
|
2086
|
+
let prefix = 'Build';
|
|
2087
|
+
let msg = '';
|
|
2088
|
+
if (diagnostic.level === 'error') {
|
|
2089
|
+
color = RED;
|
|
2090
|
+
prefix = 'Error';
|
|
2091
|
+
}
|
|
2092
|
+
else if (diagnostic.level === 'warn') {
|
|
2093
|
+
color = YELLOW;
|
|
2094
|
+
prefix = 'Warning';
|
|
2095
|
+
}
|
|
2096
|
+
if (diagnostic.header) {
|
|
2097
|
+
prefix = diagnostic.header;
|
|
2098
|
+
}
|
|
2099
|
+
const filePath = diagnostic.relFilePath || diagnostic.absFilePath;
|
|
2100
|
+
if (filePath) {
|
|
2101
|
+
msg += filePath;
|
|
2102
|
+
if (typeof diagnostic.lineNumber === 'number' && diagnostic.lineNumber > 0) {
|
|
2103
|
+
msg += ', line ' + diagnostic.lineNumber;
|
|
2104
|
+
if (typeof diagnostic.columnNumber === 'number' && diagnostic.columnNumber > 0) {
|
|
2105
|
+
msg += ', column ' + diagnostic.columnNumber;
|
|
2106
|
+
}
|
|
2107
|
+
}
|
|
2108
|
+
msg += '\n';
|
|
2109
|
+
}
|
|
2110
|
+
msg += diagnostic.messageText;
|
|
2111
|
+
if (diagnostic.lines && diagnostic.lines.length > 0) {
|
|
2112
|
+
diagnostic.lines.forEach((l) => {
|
|
2113
|
+
msg += '\n' + l.lineNumber + ': ' + l.text;
|
|
2114
|
+
});
|
|
2115
|
+
msg += '\n';
|
|
2116
|
+
}
|
|
2117
|
+
if (useColors) {
|
|
2118
|
+
const styledPrefix = [
|
|
2119
|
+
'%c' + prefix,
|
|
2120
|
+
`background: ${color}; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;`,
|
|
2121
|
+
];
|
|
2122
|
+
console.log(...styledPrefix, msg);
|
|
2123
|
+
}
|
|
2124
|
+
else if (diagnostic.level === 'error') {
|
|
2125
|
+
console.error(msg);
|
|
2126
|
+
}
|
|
2127
|
+
else if (diagnostic.level === 'warn') {
|
|
2128
|
+
console.warn(msg);
|
|
2129
|
+
}
|
|
2130
|
+
else {
|
|
2131
|
+
console.log(msg);
|
|
2132
|
+
}
|
|
2133
|
+
};
|
|
2134
|
+
const YELLOW = `#f39c12`;
|
|
2135
|
+
const RED = `#c0392b`;
|
|
2136
|
+
const BLUE = `#3498db`;
|
|
2137
|
+
|
|
1748
2138
|
const run = async (init) => {
|
|
1749
2139
|
const { args, logger, sys } = init;
|
|
1750
2140
|
try {
|
|
@@ -1760,7 +2150,7 @@ const run = async (init) => {
|
|
|
1760
2150
|
sys.applyGlobalPatch(sys.getCurrentDirectory());
|
|
1761
2151
|
}
|
|
1762
2152
|
if (task === 'help' || flags.help) {
|
|
1763
|
-
await taskHelp({
|
|
2153
|
+
await taskHelp(createConfigFlags({ task: 'help', args }), logger, sys);
|
|
1764
2154
|
return;
|
|
1765
2155
|
}
|
|
1766
2156
|
startupLog(logger, task);
|
|
@@ -1786,7 +2176,7 @@ const run = async (init) => {
|
|
|
1786
2176
|
startupLogVersion(logger, task, coreCompiler);
|
|
1787
2177
|
loadedCompilerLog(sys, logger, flags, coreCompiler);
|
|
1788
2178
|
if (task === 'info') {
|
|
1789
|
-
await telemetryAction(sys, { flags: { task: 'info' },
|
|
2179
|
+
await telemetryAction(sys, { flags: createConfigFlags({ task: 'info' }), logger }, coreCompiler, async () => {
|
|
1790
2180
|
await taskInfo(coreCompiler, sys, logger);
|
|
1791
2181
|
});
|
|
1792
2182
|
return;
|
|
@@ -1809,7 +2199,7 @@ const run = async (init) => {
|
|
|
1809
2199
|
sys.applyGlobalPatch(validated.config.rootDir);
|
|
1810
2200
|
}
|
|
1811
2201
|
await sys.ensureResources({ rootDir: validated.config.rootDir, logger, dependencies: dependencies });
|
|
1812
|
-
await telemetryAction(sys, validated.config,
|
|
2202
|
+
await telemetryAction(sys, validated.config, coreCompiler, async () => {
|
|
1813
2203
|
await runTask(coreCompiler, validated.config, task, sys);
|
|
1814
2204
|
});
|
|
1815
2205
|
}
|
|
@@ -1822,40 +2212,42 @@ const run = async (init) => {
|
|
|
1822
2212
|
}
|
|
1823
2213
|
};
|
|
1824
2214
|
const runTask = async (coreCompiler, config, task, sys) => {
|
|
1825
|
-
|
|
1826
|
-
|
|
2215
|
+
var _a, _b;
|
|
2216
|
+
const logger = (_a = config.logger) !== null && _a !== void 0 ? _a : createLogger();
|
|
2217
|
+
const strictConfig = { ...config, flags: createConfigFlags((_b = config.flags) !== null && _b !== void 0 ? _b : { task }), logger };
|
|
2218
|
+
strictConfig.outputTargets = strictConfig.outputTargets || [];
|
|
1827
2219
|
switch (task) {
|
|
1828
2220
|
case 'build':
|
|
1829
|
-
await taskBuild(coreCompiler,
|
|
2221
|
+
await taskBuild(coreCompiler, strictConfig, sys);
|
|
1830
2222
|
break;
|
|
1831
2223
|
case 'docs':
|
|
1832
|
-
await taskDocs(coreCompiler,
|
|
2224
|
+
await taskDocs(coreCompiler, strictConfig);
|
|
1833
2225
|
break;
|
|
1834
2226
|
case 'generate':
|
|
1835
2227
|
case 'g':
|
|
1836
|
-
await taskGenerate(coreCompiler,
|
|
2228
|
+
await taskGenerate(coreCompiler, strictConfig);
|
|
1837
2229
|
break;
|
|
1838
2230
|
case 'help':
|
|
1839
|
-
await taskHelp(
|
|
2231
|
+
await taskHelp(strictConfig.flags, strictConfig.logger, sys);
|
|
1840
2232
|
break;
|
|
1841
2233
|
case 'prerender':
|
|
1842
|
-
await taskPrerender(coreCompiler,
|
|
2234
|
+
await taskPrerender(coreCompiler, strictConfig);
|
|
1843
2235
|
break;
|
|
1844
2236
|
case 'serve':
|
|
1845
|
-
await taskServe(
|
|
2237
|
+
await taskServe(strictConfig);
|
|
1846
2238
|
break;
|
|
1847
2239
|
case 'telemetry':
|
|
1848
2240
|
// TODO: make this parameter no longer optional, remove the surrounding if statement
|
|
1849
2241
|
if (sys) {
|
|
1850
|
-
await taskTelemetry(
|
|
2242
|
+
await taskTelemetry(strictConfig.flags, sys, strictConfig.logger);
|
|
1851
2243
|
}
|
|
1852
2244
|
break;
|
|
1853
2245
|
case 'version':
|
|
1854
2246
|
console.log(coreCompiler.version);
|
|
1855
2247
|
break;
|
|
1856
2248
|
default:
|
|
1857
|
-
|
|
1858
|
-
await taskHelp(
|
|
2249
|
+
strictConfig.logger.error(`${strictConfig.logger.emoji('❌ ')}Invalid rindo command, please see the options below:`);
|
|
2250
|
+
await taskHelp(strictConfig.flags, strictConfig.logger, sys);
|
|
1859
2251
|
return config.sys.exit(1);
|
|
1860
2252
|
}
|
|
1861
2253
|
};
|