@sprucelabs/spruce-cli 14.24.2 → 14.24.6
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/CHANGELOG.md +32 -0
- package/build/__tests__/behavioral/RegisteringEventsOnBoot.test.js +24 -28
- package/build/__tests__/behavioral/RegisteringEventsOnBoot.test.js.map +1 -1
- package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.d.ts +1 -1
- package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.js +10 -14
- package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.js.map +1 -1
- package/build/__tests__/behavioral/skill/UpgradingASkill.test.d.ts +1 -1
- package/build/__tests__/behavioral/skill/UpgradingASkill.test.js +23 -12
- package/build/__tests__/behavioral/skill/UpgradingASkill.test.js.map +1 -1
- package/build/__tests__/behavioral/skill/UpgradingASkill2.test.d.ts +1 -1
- package/build/__tests__/behavioral/skill/UpgradingASkill2.test.js +20 -10
- package/build/__tests__/behavioral/skill/UpgradingASkill2.test.js.map +1 -1
- package/build/features/error/ErrorFeature.js.map +1 -1
- package/build/features/error/writers/ErrorWriter.js +29 -6
- package/build/features/error/writers/ErrorWriter.js.map +1 -1
- package/build/features/event/EventFeature.d.ts +3 -1
- package/build/features/event/EventFeature.js +46 -29
- package/build/features/event/EventFeature.js.map +1 -1
- package/build/features/event/stores/EventStore.d.ts +2 -1
- package/build/features/event/stores/EventStore.js +33 -22
- package/build/features/event/stores/EventStore.js.map +1 -1
- package/build/features/node/NodeFeature.d.ts +2 -1
- package/build/features/node/NodeFeature.js +86 -34
- package/build/features/node/NodeFeature.js.map +1 -1
- package/build/features/node/actions/UpgradeAction.js +9 -21
- package/build/features/node/actions/UpgradeAction.js.map +1 -1
- package/build/features/test/actions/TestAction.js +1 -1
- package/build/features/test/actions/TestAction.js.map +1 -1
- package/build/interfaces/TerminalInterface.js +7 -7
- package/build/interfaces/TerminalInterface.js.map +1 -1
- package/package.json +31 -30
- package/src/__tests__/behavioral/RegisteringEventsOnBoot.test.ts +20 -23
- package/src/__tests__/behavioral/events/KeepingEventsInSync2.test.ts +2 -5
- package/src/__tests__/behavioral/skill/UpgradingASkill.test.ts +30 -7
- package/src/__tests__/behavioral/skill/UpgradingASkill2.test.ts +10 -1
- package/src/features/error/ErrorFeature.ts +2 -0
- package/src/features/error/writers/ErrorWriter.ts +3 -1
- package/src/features/event/EventFeature.ts +32 -14
- package/src/features/event/stores/EventStore.ts +12 -4
- package/src/features/node/NodeFeature.ts +34 -1
- package/src/features/node/actions/UpgradeAction.ts +2 -11
- package/src/features/test/actions/TestAction.ts +4 -1
- package/src/interfaces/TerminalInterface.ts +5 -5
|
@@ -74,7 +74,7 @@ var UpgradeAction = /*#__PURE__*/function (_AbstractAction) {
|
|
|
74
74
|
key: "execute",
|
|
75
75
|
value: function () {
|
|
76
76
|
var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(options) {
|
|
77
|
-
var normalizedOptions, dependencyResults
|
|
77
|
+
var normalizedOptions, dependencyResults;
|
|
78
78
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
79
79
|
while (1) {
|
|
80
80
|
switch (_context.prev = _context.next) {
|
|
@@ -95,36 +95,24 @@ var UpgradeAction = /*#__PURE__*/function (_AbstractAction) {
|
|
|
95
95
|
|
|
96
96
|
case 7:
|
|
97
97
|
dependencyResults = _context.sent;
|
|
98
|
-
_context.
|
|
99
|
-
return this.Service('command').execute('yarn clean.build');
|
|
100
|
-
|
|
101
|
-
case 10:
|
|
102
|
-
_context.next = 12;
|
|
103
|
-
return this.Service('command').execute('yarn build.dev');
|
|
104
|
-
|
|
105
|
-
case 12:
|
|
106
|
-
results = {
|
|
107
|
-
summaryLines: ['Build folder cleared.', 'Build complete.']
|
|
108
|
-
};
|
|
109
|
-
results = _action["default"].mergeActionResults(results, dependencyResults, {
|
|
98
|
+
return _context.abrupt("return", _action["default"].mergeActionResults(dependencyResults, {
|
|
110
99
|
headline: 'Upgrade'
|
|
111
|
-
});
|
|
112
|
-
return _context.abrupt("return", results);
|
|
100
|
+
}));
|
|
113
101
|
|
|
114
|
-
case
|
|
115
|
-
_context.prev =
|
|
102
|
+
case 9:
|
|
103
|
+
_context.prev = 9;
|
|
116
104
|
|
|
117
105
|
_InFlightEntertainment["default"].stop();
|
|
118
106
|
|
|
119
|
-
this.ui.renderHero('
|
|
120
|
-
return _context.finish(
|
|
107
|
+
this.ui.renderHero('Upgrade');
|
|
108
|
+
return _context.finish(9);
|
|
121
109
|
|
|
122
|
-
case
|
|
110
|
+
case 13:
|
|
123
111
|
case "end":
|
|
124
112
|
return _context.stop();
|
|
125
113
|
}
|
|
126
114
|
}
|
|
127
|
-
}, _callee, this, [[3,,
|
|
115
|
+
}, _callee, this, [[3,, 9, 13]]);
|
|
128
116
|
}));
|
|
129
117
|
|
|
130
118
|
function execute(_x) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/features/node/actions/UpgradeAction.ts"],"names":["UpgradeAction","upgradeSkillActionSchema","options","normalizedOptions","validateAndNormalizeOptions","updateScripts","shouldConfirm","upgradeMode","InFlightEntertainment","start","reInstallPackageDependencies","dependencyResults","
|
|
1
|
+
{"version":3,"sources":["../../../../src/features/node/actions/UpgradeAction.ts"],"names":["UpgradeAction","upgradeSkillActionSchema","options","normalizedOptions","validateAndNormalizeOptions","updateScripts","shouldConfirm","upgradeMode","InFlightEntertainment","start","reInstallPackageDependencies","dependencyResults","actionUtil","mergeActionResults","headline","stop","ui","renderHero","Action","execute","featureInstaller","getInstalledFeatures","features","scripts","feature","scriptUpdater","ScriptUpdater","FromFeature","parent","latestScripts","update","shouldConfirmIfScriptExistsButIsDifferent","AbstractAction"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;IAOqBA,a;;;;;;;;;;;;;;;0GACO,4B;sGACJC,+B;uGACC,CAAC,SAAD,EAAY,QAAZ,C;;;;;;;mGAExB,iBAAqBC,OAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AACOC,gBAAAA,iBADP,GAC2B,KAAKC,2BAAL,CAAiCF,OAAjC,CAD3B;AAAA;AAAA,uBAGO,KAAKG,aAAL,CAAmB;AACxBC,kBAAAA,aAAa,EAAEH,iBAAiB,CAACI,WAAlB,KAAkC;AADzB,iBAAnB,CAHP;;AAAA;AAAA;;AAQEC,kDAAsBC,KAAtB,CAA4B,CAC3B,0BAD2B,EAE3B,wDAF2B,EAG3B,QAH2B,CAA5B;;AARF;AAAA,uBAckC,KAAKC,4BAAL,EAdlC;;AAAA;AAcQC,gBAAAA,iBAdR;AAAA,iDAgBSC,mBAAWC,kBAAX,CAA8BF,iBAA9B,EAAiD;AACvDG,kBAAAA,QAAQ,EAAE;AAD6C,iBAAjD,CAhBT;;AAAA;AAAA;;AAoBEN,kDAAsBO,IAAtB;;AAEA,qBAAKC,EAAL,CAAQC,UAAR,CAAmB,SAAnB;AAtBF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;wHA0BA;AAAA;AAAA;AAAA;AAAA;AAAA,kDACQ,KAAKC,MAAL,CAAY,MAAZ,EAAoB,oBAApB,EAA0CC,OAA1C,CAAkD,EAAlD,CADR;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;yGAIA,kBAA4BjB,OAA5B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBACwB,KAAKkB,gBAAL,CAAsBC,oBAAtB,EADxB;;AAAA;AACOC,gBAAAA,QADP;AAGKC,gBAAAA,OAHL,GAGoC,EAHpC;AAAA,uDAKuBD,QALvB;;AAAA;AAKC,sEAAgC;AAArBE,oBAAAA,OAAqB;AAC/BD,oBAAAA,OAAO,mCACHA,OADG,GAEHC,OAAO,CAACD,OAFL,CAAP;AAIA;AAVF;AAAA;AAAA;AAAA;AAAA;;AAYOE,gBAAAA,aAZP,GAYuBC,0BAAcC,WAAd,CAA0B,KAAKC,MAA/B,EAAuC;AAC5DC,kBAAAA,aAAa,EAAEN;AAD6C,iBAAvC,CAZvB;AAAA;AAAA,uBAgBOE,aAAa,CAACK,MAAd,CAAqB;AAC1BC,kBAAAA,yCAAyC,EAAE7B,OAAO,CAACI;AADzB,iBAArB,CAhBP;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;EAnC0C0B,2B","sourcesContent":["import { SchemaValues } from '@sprucelabs/schema'\nimport { SpruceSchemas } from '#spruce/schemas/schemas.types'\nimport upgradeSkillActionSchema from '#spruce/schemas/spruceCli/v2020_07_22/upgradeSkillOptions.schema'\nimport InFlightEntertainment from '../../../InFlightEntertainment'\nimport ScriptUpdater from '../../../updaters/ScriptUpdater'\nimport actionUtil from '../../../utilities/action.utility'\nimport AbstractAction from '../../AbstractAction'\nimport { FeatureActionResponse } from '../../features.types'\n\ntype OptionsSchema =\n\tSpruceSchemas.SpruceCli.v2020_07_22.UpgradeSkillOptionsSchema\ntype Options = SchemaValues<OptionsSchema>\n\nexport default class UpgradeAction extends AbstractAction<OptionsSchema> {\n\tpublic invocationMessage = 'Upgrading your skill... 💪'\n\tpublic optionsSchema = upgradeSkillActionSchema\n\tpublic commandAliases = ['upgrade', 'update']\n\n\tpublic async execute(options: Options): Promise<FeatureActionResponse> {\n\t\tconst normalizedOptions = this.validateAndNormalizeOptions(options)\n\n\t\tawait this.updateScripts({\n\t\t\tshouldConfirm: normalizedOptions.upgradeMode !== 'forceEverything',\n\t\t})\n\n\t\ttry {\n\t\t\tInFlightEntertainment.start([\n\t\t\t\t\"Let's start the upgrade!\",\n\t\t\t\t'While things are going, see if you can beat 1k points!',\n\t\t\t\t'Go!!!!',\n\t\t\t])\n\n\t\t\tconst dependencyResults = await this.reInstallPackageDependencies()\n\n\t\t\treturn actionUtil.mergeActionResults(dependencyResults, {\n\t\t\t\theadline: 'Upgrade',\n\t\t\t})\n\t\t} finally {\n\t\t\tInFlightEntertainment.stop()\n\n\t\t\tthis.ui.renderHero('Upgrade')\n\t\t}\n\t}\n\n\tprivate async reInstallPackageDependencies() {\n\t\treturn this.Action('node', 'updateDependencies').execute({})\n\t}\n\n\tprivate async updateScripts(options: { shouldConfirm: boolean }) {\n\t\tconst features = await this.featureInstaller.getInstalledFeatures()\n\n\t\tlet scripts: Record<string, any> = {}\n\n\t\tfor (const feature of features) {\n\t\t\tscripts = {\n\t\t\t\t...scripts,\n\t\t\t\t...feature.scripts,\n\t\t\t}\n\t\t}\n\n\t\tconst scriptUpdater = ScriptUpdater.FromFeature(this.parent, {\n\t\t\tlatestScripts: scripts,\n\t\t})\n\n\t\tawait scriptUpdater.update({\n\t\t\tshouldConfirmIfScriptExistsButIsDifferent: options.shouldConfirm,\n\t\t})\n\t}\n}\n"],"file":"UpgradeAction.js"}
|
|
@@ -279,7 +279,7 @@ var TestAction = /*#__PURE__*/function (_AbstractAction) {
|
|
|
279
279
|
value: function doWeCareAboutThisFileChanging(path) {
|
|
280
280
|
var ext = _path["default"].extname(path);
|
|
281
281
|
|
|
282
|
-
if (path.search('testDirsAndFiles') > -1) {
|
|
282
|
+
if (path.search('testDirsAndFiles') > -1 || path.search('.change_cache') > -1) {
|
|
283
283
|
return false;
|
|
284
284
|
}
|
|
285
285
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/features/test/actions/TestAction.ts"],"names":["optionsSchema","testOptionsSchema","TestAction","options","totalTestFiles","watchMode","settings","Service","get","normalizedOptions","validateAndNormalizeOptions","pattern","shouldReportWhileRunning","inspect","shouldHoldAtStart","shouldReturnImmediately","originalInspect","hasWatchEverBeenEnabled","testReporter","TestReporter","cwd","status","isDebugging","filterPattern","undefined","handleRestart","bind","handleStartStop","handleQuit","handleRerunTestFile","handleOpenTestFile","handleFilterPatternChange","handleToggleDebug","handletoggleStandardWatch","handleToggleSmartWatch","start","watcher","getFeature","startWatching","delay","emitter","on","handleFileChange","runnerStatus","promise","startTestRunner","meta","test","emit","reporter","testResults","stopWatching","destroy","actionResponse","summaryLines","totalTests","totalPassed","totalFailed","totalSkipped","totalTodo","errors","generateErrorsFromTestResults","payload","changes","shouldRestart","filesWeCareAbout","change","values","path","name","doWeCareAboutThisFileChanging","setStatusLabel","push","fileChangeTimeout","clearTimeout","startCountdownTimer","watchDelaySec","setTimeout","smartFilter","generateFilterFromChangedFiles","length","restart","filter","file","search","map","fileToFilterPattern","join","ext","pathUtil","extname","setIsDebugging","setWatchMode","mode","kill","setFilterPattern","filename","basename","replace","dirname","split","sep","pop","holdPromiseResolve","testRunner","fileName","openTestFile","waitForStart","lastTestResults","setStatus","stopCountdownTimer","TestRunner","commandService","firstUpdate","reset","results","failed","testFiles","find","updateResults","render","appendError","message","run","debugPort","hasFailedTests","hasSkippedTests","Promise","resolve","diskUtil","resolvePath","forEach","tests","errorMessages","err","mapErrorResultToSpruceError","SpruceError","code","testName","errorMessage","AbstractAction"],"mappings":"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","sourcesContent":["import pathUtil from 'path'\nimport { SpruceSchemas } from '@sprucelabs/mercury-types'\nimport { SchemaValues } from '@sprucelabs/schema'\nimport { diskUtil } from '@sprucelabs/spruce-skill-utils'\nimport open from 'open'\nimport testOptionsSchema from '#spruce/schemas/spruceCli/v2020_07_22/testOptions.schema'\nimport SpruceError from '../../../errors/SpruceError'\nimport AbstractAction from '../../AbstractAction'\nimport { FeatureActionResponse, ActionOptions } from '../../features.types'\nimport WatchFeature from '../../watch/WatchFeature'\nimport {\n\tSpruceTestFile,\n\tSpruceTestFileTest,\n\tSpruceTestResults,\n} from '../test.types'\nimport TestReporter, { WatchMode } from '../TestReporter'\nimport TestRunner from '../TestRunner'\n\nexport const optionsSchema = testOptionsSchema\n\nexport type OptionsSchema = typeof optionsSchema\n\ntype DidChangePayload =\n\tSchemaValues<SpruceSchemas.SpruceCli.v2020_07_22.WatcherDidDetectChangesEmitPayloadSchema>\n\nexport default class TestAction extends AbstractAction<OptionsSchema> {\n\tpublic optionsSchema = optionsSchema\n\tpublic invocationMessage = 'Starting tests... 🛡'\n\n\tprivate testReporter?: TestReporter | undefined\n\tprivate testRunner?: TestRunner\n\tprivate runnerStatus: 'hold' | 'quit' | 'run' | 'restart' = 'hold'\n\tprivate pattern: string | undefined\n\tprivate inspect?: number | null\n\tprivate holdPromiseResolve?: () => void\n\tprivate lastTestResults: SpruceTestResults = { totalTestFiles: 0 }\n\tprivate originalInspect!: number\n\tprivate watcher?: WatchFeature\n\tprivate watchMode: WatchMode = 'off'\n\tprivate fileChangeTimeout?: number\n\tprivate hasWatchEverBeenEnabled = false\n\n\tprivate readonly watchDelaySec = 2\n\n\tpublic constructor(options: ActionOptions) {\n\t\tsuper(options)\n\t}\n\n\tpublic async execute(\n\t\toptions: SchemaValues<OptionsSchema>\n\t): Promise<FeatureActionResponse> {\n\t\tif (!options.watchMode) {\n\t\t\tconst settings = this.Service('settings')\n\t\t\toptions.watchMode = settings.get('test.watchMode') ?? 'off'\n\t\t}\n\n\t\tconst normalizedOptions = this.validateAndNormalizeOptions(options)\n\n\t\tconst {\n\t\t\tpattern,\n\t\t\tshouldReportWhileRunning,\n\t\t\tinspect,\n\t\t\tshouldHoldAtStart,\n\t\t\twatchMode,\n\t\t\tshouldReturnImmediately,\n\t\t} = normalizedOptions\n\n\t\tthis.originalInspect = inspect ?? 5200\n\t\tthis.inspect = inspect\n\t\tthis.pattern = pattern\n\t\tthis.hasWatchEverBeenEnabled = watchMode !== 'off'\n\t\tthis.watchMode = watchMode as WatchMode\n\n\t\tif (shouldReportWhileRunning) {\n\t\t\tthis.testReporter = new TestReporter({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\twatchMode: this.watchMode,\n\t\t\t\tstatus: shouldHoldAtStart ? 'stopped' : 'ready',\n\t\t\t\tisDebugging: !!inspect,\n\t\t\t\tfilterPattern: pattern ?? undefined,\n\t\t\t\thandleRestart: this.handleRestart.bind(this),\n\t\t\t\thandleStartStop: this.handleStartStop.bind(this),\n\t\t\t\thandleQuit: this.handleQuit.bind(this),\n\t\t\t\thandleRerunTestFile: this.handleRerunTestFile.bind(this),\n\t\t\t\thandleOpenTestFile: this.handleOpenTestFile.bind(this),\n\t\t\t\thandleFilterPatternChange: this.handleFilterPatternChange.bind(this),\n\t\t\t\thandleToggleDebug: this.handleToggleDebug.bind(this),\n\t\t\t\thandletoggleStandardWatch: this.handletoggleStandardWatch.bind(this),\n\t\t\t\thandleToggleSmartWatch: this.handleToggleSmartWatch?.bind(this),\n\t\t\t})\n\n\t\t\tawait this.testReporter.start()\n\t\t}\n\n\t\tthis.watcher = this.getFeature('watch') as WatchFeature\n\t\tvoid this.watcher.startWatching({ delay: 0 })\n\n\t\tawait this.emitter.on(\n\t\t\t'watcher.did-detect-change',\n\t\t\tthis.handleFileChange.bind(this)\n\t\t)\n\n\t\tthis.runnerStatus = shouldHoldAtStart ? 'hold' : 'run'\n\n\t\tconst promise = this.startTestRunner(normalizedOptions)\n\n\t\tif (shouldReturnImmediately) {\n\t\t\treturn {\n\t\t\t\tmeta: {\n\t\t\t\t\tpromise,\n\t\t\t\t\ttest: this,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tvoid this.emitter.emit('test.reporter-did-boot', {\n\t\t\treporter: this,\n\t\t})\n\n\t\tconst testResults = await promise\n\n\t\tawait this.watcher?.stopWatching()\n\t\tawait this.testReporter?.destroy()\n\n\t\tconst actionResponse: FeatureActionResponse = {\n\t\t\tmeta: { testResults },\n\t\t\tsummaryLines: [\n\t\t\t\t`Test files: ${testResults.totalTestFiles}`,\n\t\t\t\t`Tests: ${testResults.totalTests ?? '0'}`,\n\t\t\t\t`Passed: ${testResults.totalPassed ?? '0'}`,\n\t\t\t\t`Failed: ${testResults.totalFailed ?? '0'}`,\n\t\t\t\t`Skipped: ${testResults.totalSkipped ?? '0'}`,\n\t\t\t\t`Todo: ${testResults.totalTodo ?? '0'}`,\n\t\t\t],\n\t\t}\n\n\t\tif (testResults.totalFailed ?? 0 > 0) {\n\t\t\tactionResponse.errors = this.generateErrorsFromTestResults(testResults)\n\t\t}\n\n\t\treturn actionResponse\n\t}\n\n\tprivate handleFileChange(payload: DidChangePayload) {\n\t\tif (\n\t\t\tthis.watchMode === 'off' ||\n\t\t\t!(this.runnerStatus === 'run' || this.runnerStatus == 'hold')\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { changes } = payload\n\n\t\tlet shouldRestart = false\n\t\tconst filesWeCareAbout: string[] = []\n\n\t\tfor (const change of changes) {\n\t\t\tconst { path, name } = change.values\n\n\t\t\tif (this.doWeCareAboutThisFileChanging(path)) {\n\t\t\t\tthis.testReporter?.setStatusLabel(`Built file: ${name}`)\n\t\t\t\tshouldRestart = true\n\t\t\t\tfilesWeCareAbout.push(path)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (shouldRestart) {\n\t\t\tif (this.fileChangeTimeout) {\n\t\t\t\tclearTimeout(this.fileChangeTimeout)\n\t\t\t}\n\n\t\t\tthis.testReporter?.startCountdownTimer(this.watchDelaySec)\n\t\t\tthis.fileChangeTimeout = setTimeout(() => {\n\t\t\t\tif (this.watchMode === 'smart') {\n\t\t\t\t\tconst smartFilter =\n\t\t\t\t\t\tthis.generateFilterFromChangedFiles(filesWeCareAbout)\n\t\t\t\t\tif (smartFilter.length > 0) {\n\t\t\t\t\t\tthis.handleFilterPatternChange(smartFilter)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.restart()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.restart()\n\t\t\t\t}\n\t\t\t}, this.watchDelaySec * 1000) as any\n\t\t}\n\t}\n\n\tprivate generateFilterFromChangedFiles(filesWeCareAbout: string[]): string {\n\t\tconst filter = filesWeCareAbout\n\t\t\t.filter((file) => file.search('test.js') > -1)\n\t\t\t.map((file) => this.fileToFilterPattern(file))\n\t\t\t.join(' ')\n\n\t\treturn filter\n\t}\n\n\tprivate doWeCareAboutThisFileChanging(path: string) {\n\t\tconst ext = pathUtil.extname(path)\n\n\t\tif (path.search('testDirsAndFiles') > -1) {\n\t\t\treturn false\n\t\t}\n\n\t\tif (ext === '.js') {\n\t\t\treturn true\n\t\t}\n\n\t\treturn false\n\t}\n\n\tprivate handleToggleDebug() {\n\t\tif (this.inspect) {\n\t\t\tthis.inspect = undefined\n\t\t} else {\n\t\t\tthis.inspect = this.originalInspect\n\t\t}\n\n\t\tthis.testReporter?.setIsDebugging(!!this.inspect)\n\t\tthis.restart()\n\t}\n\n\tprivate handletoggleStandardWatch() {\n\t\tif (this.watchMode === 'standard') {\n\t\t\tthis.testReporter?.setWatchMode('off')\n\t\t} else {\n\t\t\tthis.setWatchMode('standard')\n\t\t}\n\t}\n\n\tprivate handleToggleSmartWatch() {\n\t\tif (this.watchMode === 'smart') {\n\t\t\tthis.setWatchMode('off')\n\t\t} else {\n\t\t\tthis.setWatchMode('smart')\n\t\t}\n\t}\n\n\tpublic setWatchMode(mode: WatchMode) {\n\t\tthis.watchMode = mode\n\t\tthis.testReporter?.setWatchMode(mode)\n\t\tthis.hasWatchEverBeenEnabled = true\n\t}\n\n\tprivate restart() {\n\t\tthis.runnerStatus = 'restart'\n\t\tthis.kill()\n\t}\n\n\tprivate handleQuit() {\n\t\tthis.runnerStatus = 'quit'\n\t\tthis.kill()\n\t}\n\n\tprivate handleRerunTestFile(file: string) {\n\t\tconst name = this.fileToFilterPattern(file)\n\n\t\tthis.testReporter?.setFilterPattern(name)\n\t\tthis.handleFilterPatternChange(name)\n\t}\n\n\tprivate fileToFilterPattern(file: string) {\n\t\tconst filename = pathUtil\n\t\t\t.basename(file, '.ts')\n\t\t\t.replace('.tsx', '')\n\t\t\t.replace('.js', '')\n\t\tconst dirname = pathUtil.dirname(file).split(pathUtil.sep).pop() ?? ''\n\n\t\tconst name = pathUtil.join(dirname, filename)\n\t\treturn name\n\t}\n\n\tprivate handleFilterPatternChange(filterPattern?: string) {\n\t\tthis.pattern = filterPattern\n\t\tthis.testReporter?.setFilterPattern(filterPattern)\n\n\t\tthis.restart()\n\t}\n\n\tprivate handleStartStop() {\n\t\tif (this.runnerStatus === 'hold') {\n\t\t\tthis.runnerStatus = 'run'\n\t\t\tthis.holdPromiseResolve?.()\n\t\t\tthis.holdPromiseResolve = undefined\n\t\t} else if (this.runnerStatus === 'run') {\n\t\t\tthis.runnerStatus = 'hold'\n\t\t\tthis.kill()\n\t\t}\n\t}\n\n\tprivate handleRestart() {\n\t\tthis.restart()\n\t}\n\n\tpublic kill() {\n\t\tthis.testRunner?.kill()\n\t\tthis.holdPromiseResolve?.()\n\t\tthis.holdPromiseResolve = undefined\n\t}\n\n\tprivate async handleOpenTestFile(fileName: string) {\n\t\tawait this.openTestFile(fileName)\n\t}\n\n\tprivate async startTestRunner(\n\t\toptions: SchemaValues<OptionsSchema>\n\t): Promise<SpruceTestResults> {\n\t\tif (this.runnerStatus === 'hold') {\n\t\t\tawait this.waitForStart()\n\t\t}\n\n\t\tif (this.runnerStatus === 'quit') {\n\t\t\treturn this.lastTestResults\n\t\t}\n\n\t\tthis.testReporter?.setStatus('ready')\n\t\tthis.testReporter?.stopCountdownTimer()\n\n\t\tthis.testRunner = new TestRunner({\n\t\t\tcwd: this.cwd,\n\t\t\tcommandService: this.Service('command'),\n\t\t})\n\n\t\tlet firstUpdate = true\n\n\t\tif (this.testReporter) {\n\t\t\tawait this.testRunner.on('did-update', (payload) => {\n\t\t\t\tif (firstUpdate) {\n\t\t\t\t\tfirstUpdate = false\n\t\t\t\t\tthis.testReporter?.setStatus('running')\n\t\t\t\t\tthis.testReporter?.reset()\n\t\t\t\t}\n\n\t\t\t\tif (this.watchMode === 'smart' && payload.results.totalFailed > 0) {\n\t\t\t\t\tconst failed = payload.results.testFiles.find(\n\t\t\t\t\t\t(file: any) => file.status === 'failed'\n\t\t\t\t\t)\n\n\t\t\t\t\tif (failed) {\n\t\t\t\t\t\tconst pattern = this.fileToFilterPattern(failed.path)\n\t\t\t\t\t\tif (this.pattern !== pattern) {\n\t\t\t\t\t\t\tthis.handleFilterPatternChange(pattern)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.testReporter?.updateResults(payload.results)\n\t\t\t\tthis.testReporter?.render()\n\t\t\t})\n\n\t\t\tawait this.testRunner.on('did-error', (payload) => {\n\t\t\t\tthis.testReporter?.appendError(payload.message)\n\t\t\t\tthis.testReporter?.render()\n\t\t\t})\n\t\t}\n\n\t\tthis.runnerStatus = 'run'\n\n\t\tlet testResults: SpruceTestResults = await this.testRunner.run({\n\t\t\tpattern: this.pattern,\n\t\t\tdebugPort: this.inspect,\n\t\t})\n\n\t\tif (\n\t\t\t//@ts-ignore\n\t\t\tthis.runnerStatus !== 'restart' &&\n\t\t\t(!options.shouldReportWhileRunning ||\n\t\t\t\t!this.hasWatchEverBeenEnabled ||\n\t\t\t\t(this.runnerStatus as any) === 'quit')\n\t\t) {\n\t\t\treturn testResults\n\t\t}\n\n\t\tif (\n\t\t\tthis.runnerStatus === 'run' &&\n\t\t\tthis.watchMode === 'smart' &&\n\t\t\tthis.testRunner?.hasFailedTests() === false &&\n\t\t\t!this.testRunner?.hasSkippedTests() &&\n\t\t\t(this.pattern ?? []).length > 0\n\t\t) {\n\t\t\tthis.testReporter?.setStatusLabel('Restarting...')\n\t\t\tthis.runnerStatus = 'restart'\n\t\t\tthis.testReporter?.startCountdownTimer(3)\n\n\t\t\treturn await new Promise((resolve) => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.pattern = ''\n\t\t\t\t\tthis.testReporter?.setFilterPattern('')\n\t\t\t\t\tresolve(this.startTestRunner(options))\n\t\t\t\t}, 3000)\n\t\t\t})\n\t\t}\n\n\t\tif (this.runnerStatus === 'run') {\n\t\t\tthis.runnerStatus = 'hold'\n\t\t}\n\n\t\tthis.testReporter?.setStatus('stopped')\n\n\t\tthis.lastTestResults = testResults\n\n\t\treturn this.startTestRunner(options)\n\t}\n\n\tpublic async waitForStart() {\n\t\tawait new Promise((resolve: any) => {\n\t\t\tthis.runnerStatus = 'hold'\n\t\t\tthis.holdPromiseResolve = resolve\n\t\t})\n\t}\n\n\tprivate async openTestFile(fileName: string): Promise<void> {\n\t\tconst path = diskUtil.resolvePath(this.cwd, 'src', '__tests__', fileName)\n\t\tawait open(path)\n\t}\n\n\tprivate generateErrorsFromTestResults(testResults: SpruceTestResults) {\n\t\tconst errors: SpruceError[] = []\n\t\ttestResults.testFiles?.forEach((file) => {\n\t\t\tfile.tests?.forEach((test) => {\n\t\t\t\ttest.errorMessages?.forEach((message) => {\n\t\t\t\t\tconst err = this.mapErrorResultToSpruceError(test, file, message)\n\t\t\t\t\terrors.push(err)\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t\tif (errors.length > 0) {\n\t\t\treturn errors\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tprivate mapErrorResultToSpruceError(\n\t\ttest: SpruceTestFileTest,\n\t\tfile: SpruceTestFile,\n\t\tmessage: string\n\t) {\n\t\treturn new SpruceError({\n\t\t\tcode: 'TEST_FAILED',\n\t\t\ttestName: test.name,\n\t\t\tfileName: file.path,\n\t\t\terrorMessage: message,\n\t\t})\n\t}\n\n\tpublic getWatchMode() {\n\t\treturn this.watchMode\n\t}\n}\n"],"file":"TestAction.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/features/test/actions/TestAction.ts"],"names":["optionsSchema","testOptionsSchema","TestAction","options","totalTestFiles","watchMode","settings","Service","get","normalizedOptions","validateAndNormalizeOptions","pattern","shouldReportWhileRunning","inspect","shouldHoldAtStart","shouldReturnImmediately","originalInspect","hasWatchEverBeenEnabled","testReporter","TestReporter","cwd","status","isDebugging","filterPattern","undefined","handleRestart","bind","handleStartStop","handleQuit","handleRerunTestFile","handleOpenTestFile","handleFilterPatternChange","handleToggleDebug","handletoggleStandardWatch","handleToggleSmartWatch","start","watcher","getFeature","startWatching","delay","emitter","on","handleFileChange","runnerStatus","promise","startTestRunner","meta","test","emit","reporter","testResults","stopWatching","destroy","actionResponse","summaryLines","totalTests","totalPassed","totalFailed","totalSkipped","totalTodo","errors","generateErrorsFromTestResults","payload","changes","shouldRestart","filesWeCareAbout","change","values","path","name","doWeCareAboutThisFileChanging","setStatusLabel","push","fileChangeTimeout","clearTimeout","startCountdownTimer","watchDelaySec","setTimeout","smartFilter","generateFilterFromChangedFiles","length","restart","filter","file","search","map","fileToFilterPattern","join","ext","pathUtil","extname","setIsDebugging","setWatchMode","mode","kill","setFilterPattern","filename","basename","replace","dirname","split","sep","pop","holdPromiseResolve","testRunner","fileName","openTestFile","waitForStart","lastTestResults","setStatus","stopCountdownTimer","TestRunner","commandService","firstUpdate","reset","results","failed","testFiles","find","updateResults","render","appendError","message","run","debugPort","hasFailedTests","hasSkippedTests","Promise","resolve","diskUtil","resolvePath","forEach","tests","errorMessages","err","mapErrorResultToSpruceError","SpruceError","code","testName","errorMessage","AbstractAction"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAGA;;AACA;;AACA;;AACA;;AACA;;AAQA;;AACA;;;;;;;;;;;;AAEO,IAAMA,aAAa,GAAGC,uBAAtB;;;IAOcC,U;;;;;AAmBpB,sBAAmBC,OAAnB,EAA2C;AAAA;;AAAA;AAC1C,8BAAMA,OAAN;AAD0C,sGAlBpBH,aAkBoB;AAAA,0GAjBhB,sBAiBgB;AAAA;AAAA;AAAA,qGAbiB,MAajB;AAAA;AAAA;AAAA;AAAA,wGATE;AAAEI,MAAAA,cAAc,EAAE;AAAlB,KASF;AAAA;AAAA;AAAA,kGANZ,KAMY;AAAA;AAAA,gHAJT,KAIS;AAAA,sGAFV,CAEU;AAAA;AAE1C;;;;;mGAED,iBACCD,OADD;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAGC,oBAAI,CAACA,OAAO,CAACE,SAAb,EAAwB;AACjBC,kBAAAA,QADiB,GACN,KAAKC,OAAL,CAAa,UAAb,CADM;AAEvBJ,kBAAAA,OAAO,CAACE,SAAR,oBAAoBC,QAAQ,CAACE,GAAT,CAAa,gBAAb,CAApB,yDAAsD,KAAtD;AACA;;AAEKC,gBAAAA,iBARP,GAQ2B,KAAKC,2BAAL,CAAiCP,OAAjC,CAR3B;AAWEQ,gBAAAA,OAXF,GAiBKF,iBAjBL,CAWEE,OAXF,EAYEC,wBAZF,GAiBKH,iBAjBL,CAYEG,wBAZF,EAaEC,OAbF,GAiBKJ,iBAjBL,CAaEI,OAbF,EAcEC,iBAdF,GAiBKL,iBAjBL,CAcEK,iBAdF,EAeET,SAfF,GAiBKI,iBAjBL,CAeEJ,SAfF,EAgBEU,uBAhBF,GAiBKN,iBAjBL,CAgBEM,uBAhBF;AAmBC,qBAAKC,eAAL,GAAuBH,OAAvB,aAAuBA,OAAvB,cAAuBA,OAAvB,GAAkC,IAAlC;AACA,qBAAKA,OAAL,GAAeA,OAAf;AACA,qBAAKF,OAAL,GAAeA,OAAf;AACA,qBAAKM,uBAAL,GAA+BZ,SAAS,KAAK,KAA7C;AACA,qBAAKA,SAAL,GAAiBA,SAAjB;;AAvBD,qBAyBKO,wBAzBL;AAAA;AAAA;AAAA;;AA0BE,qBAAKM,YAAL,GAAoB,IAAIC,wBAAJ,CAAiB;AACpCC,kBAAAA,GAAG,EAAE,KAAKA,GAD0B;AAEpCf,kBAAAA,SAAS,EAAE,KAAKA,SAFoB;AAGpCgB,kBAAAA,MAAM,EAAEP,iBAAiB,GAAG,SAAH,GAAe,OAHJ;AAIpCQ,kBAAAA,WAAW,EAAE,CAAC,CAACT,OAJqB;AAKpCU,kBAAAA,aAAa,EAAEZ,OAAF,aAAEA,OAAF,cAAEA,OAAF,GAAaa,SALU;AAMpCC,kBAAAA,aAAa,EAAE,KAAKA,aAAL,CAAmBC,IAAnB,CAAwB,IAAxB,CANqB;AAOpCC,kBAAAA,eAAe,EAAE,KAAKA,eAAL,CAAqBD,IAArB,CAA0B,IAA1B,CAPmB;AAQpCE,kBAAAA,UAAU,EAAE,KAAKA,UAAL,CAAgBF,IAAhB,CAAqB,IAArB,CARwB;AASpCG,kBAAAA,mBAAmB,EAAE,KAAKA,mBAAL,CAAyBH,IAAzB,CAA8B,IAA9B,CATe;AAUpCI,kBAAAA,kBAAkB,EAAE,KAAKA,kBAAL,CAAwBJ,IAAxB,CAA6B,IAA7B,CAVgB;AAWpCK,kBAAAA,yBAAyB,EAAE,KAAKA,yBAAL,CAA+BL,IAA/B,CAAoC,IAApC,CAXS;AAYpCM,kBAAAA,iBAAiB,EAAE,KAAKA,iBAAL,CAAuBN,IAAvB,CAA4B,IAA5B,CAZiB;AAapCO,kBAAAA,yBAAyB,EAAE,KAAKA,yBAAL,CAA+BP,IAA/B,CAAoC,IAApC,CAbS;AAcpCQ,kBAAAA,sBAAsB,2BAAE,KAAKA,sBAAP,0DAAE,sBAA6BR,IAA7B,CAAkC,IAAlC;AAdY,iBAAjB,CAApB;AA1BF;AAAA,uBA2CQ,KAAKR,YAAL,CAAkBiB,KAAlB,EA3CR;;AAAA;AA8CC,qBAAKC,OAAL,GAAe,KAAKC,UAAL,CAAgB,OAAhB,CAAf;AACA,qBAAK,KAAKD,OAAL,CAAaE,aAAb,CAA2B;AAAEC,kBAAAA,KAAK,EAAE;AAAT,iBAA3B,CAAL;AA/CD;AAAA,uBAiDO,KAAKC,OAAL,CAAaC,EAAb,CACL,2BADK,EAEL,KAAKC,gBAAL,CAAsBhB,IAAtB,CAA2B,IAA3B,CAFK,CAjDP;;AAAA;AAsDC,qBAAKiB,YAAL,GAAoB7B,iBAAiB,GAAG,MAAH,GAAY,KAAjD;AAEM8B,gBAAAA,OAxDP,GAwDiB,KAAKC,eAAL,CAAqBpC,iBAArB,CAxDjB;;AAAA,qBA0DKM,uBA1DL;AAAA;AAAA;AAAA;;AAAA,iDA2DS;AACN+B,kBAAAA,IAAI,EAAE;AACLF,oBAAAA,OAAO,EAAPA,OADK;AAELG,oBAAAA,IAAI,EAAE;AAFD;AADA,iBA3DT;;AAAA;AAmEC,qBAAK,KAAKP,OAAL,CAAaQ,IAAb,CAAkB,wBAAlB,EAA4C;AAChDC,kBAAAA,QAAQ,EAAE;AADsC,iBAA5C,CAAL;AAnED;AAAA,uBAuE2BL,OAvE3B;;AAAA;AAuEOM,gBAAAA,WAvEP;AAAA;AAAA,wCAyEO,KAAKd,OAzEZ,kDAyEO,cAAce,YAAd,EAzEP;;AAAA;AAAA;AAAA,6CA0EO,KAAKjC,YA1EZ,uDA0EO,mBAAmBkC,OAAnB,EA1EP;;AAAA;AA4EOC,gBAAAA,cA5EP,GA4E+C;AAC7CP,kBAAAA,IAAI,EAAE;AAAEI,oBAAAA,WAAW,EAAXA;AAAF,mBADuC;AAE7CI,kBAAAA,YAAY,EAAE,uBACEJ,WAAW,CAAC9C,cADd,6CAEH8C,WAAW,CAACK,UAFT,yEAEuB,GAFvB,8CAGFL,WAAW,CAACM,WAHV,yEAGyB,GAHzB,8CAIFN,WAAW,CAACO,WAJV,yEAIyB,GAJzB,+CAKDP,WAAW,CAACQ,YALX,yEAK2B,GAL3B,4CAMJR,WAAW,CAACS,SANR,yEAMqB,GANrB;AAF+B,iBA5E/C;;AAwFC,8CAAIT,WAAW,CAACO,WAAhB,2EAA+B,IAAI,CAAnC,EAAsC;AACrCJ,kBAAAA,cAAc,CAACO,MAAf,GAAwB,KAAKC,6BAAL,CAAmCX,WAAnC,CAAxB;AACA;;AA1FF,iDA4FQG,cA5FR;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WA+FA,0BAAyBS,OAAzB,EAAoD;AAAA;;AACnD,UACC,KAAKzD,SAAL,KAAmB,KAAnB,IACA,EAAE,KAAKsC,YAAL,KAAsB,KAAtB,IAA+B,KAAKA,YAAL,IAAqB,MAAtD,CAFD,EAGE;AACD;AACA;;AAED,UAAQoB,OAAR,GAAoBD,OAApB,CAAQC,OAAR;AAEA,UAAIC,aAAa,GAAG,KAApB;AACA,UAAMC,gBAA0B,GAAG,EAAnC;;AAXmD,iDAa9BF,OAb8B;AAAA;;AAAA;AAanD,4DAA8B;AAAA,cAAnBG,MAAmB;AAC7B,+BAAuBA,MAAM,CAACC,MAA9B;AAAA,cAAQC,IAAR,kBAAQA,IAAR;AAAA,cAAcC,IAAd,kBAAcA,IAAd;;AAEA,cAAI,KAAKC,6BAAL,CAAmCF,IAAnC,CAAJ,EAA8C;AAAA;;AAC7C,wCAAKlD,YAAL,4EAAmBqD,cAAnB,uBAAiDF,IAAjD;AACAL,YAAAA,aAAa,GAAG,IAAhB;AACAC,YAAAA,gBAAgB,CAACO,IAAjB,CAAsBJ,IAAtB;AACA;AACA;AACD;AAtBkD;AAAA;AAAA;AAAA;AAAA;;AAwBnD,UAAIJ,aAAJ,EAAmB;AAAA;;AAClB,YAAI,KAAKS,iBAAT,EAA4B;AAC3BC,UAAAA,YAAY,CAAC,KAAKD,iBAAN,CAAZ;AACA;;AAED,oCAAKvD,YAAL,4EAAmByD,mBAAnB,CAAuC,KAAKC,aAA5C;AACA,aAAKH,iBAAL,GAAyBI,UAAU,CAAC,YAAM;AACzC,cAAI,MAAI,CAACxE,SAAL,KAAmB,OAAvB,EAAgC;AAC/B,gBAAMyE,WAAW,GAChB,MAAI,CAACC,8BAAL,CAAoCd,gBAApC,CADD;;AAEA,gBAAIa,WAAW,CAACE,MAAZ,GAAqB,CAAzB,EAA4B;AAC3B,cAAA,MAAI,CAACjD,yBAAL,CAA+B+C,WAA/B;AACA,aAFD,MAEO;AACN,cAAA,MAAI,CAACG,OAAL;AACA;AACD,WARD,MAQO;AACN,YAAA,MAAI,CAACA,OAAL;AACA;AACD,SAZkC,EAYhC,KAAKL,aAAL,GAAqB,IAZW,CAAnC;AAaA;AACD;;;WAED,wCAAuCX,gBAAvC,EAA2E;AAAA;;AAC1E,UAAMiB,MAAM,GAAGjB,gBAAgB,CAC7BiB,MADa,CACN,UAACC,IAAD;AAAA,eAAUA,IAAI,CAACC,MAAL,CAAY,SAAZ,IAAyB,CAAC,CAApC;AAAA,OADM,EAEbC,GAFa,CAET,UAACF,IAAD;AAAA,eAAU,MAAI,CAACG,mBAAL,CAAyBH,IAAzB,CAAV;AAAA,OAFS,EAGbI,IAHa,CAGR,GAHQ,CAAf;AAKA,aAAOL,MAAP;AACA;;;WAED,uCAAsCd,IAAtC,EAAoD;AACnD,UAAMoB,GAAG,GAAGC,iBAASC,OAAT,CAAiBtB,IAAjB,CAAZ;;AAEA,UACCA,IAAI,CAACgB,MAAL,CAAY,kBAAZ,IAAkC,CAAC,CAAnC,IACAhB,IAAI,CAACgB,MAAL,CAAY,eAAZ,IAA+B,CAAC,CAFjC,EAGE;AACD,eAAO,KAAP;AACA;;AAED,UAAII,GAAG,KAAK,KAAZ,EAAmB;AAClB,eAAO,IAAP;AACA;;AAED,aAAO,KAAP;AACA;;;WAED,6BAA4B;AAAA;;AAC3B,UAAI,KAAK3E,OAAT,EAAkB;AACjB,aAAKA,OAAL,GAAeW,SAAf;AACA,OAFD,MAEO;AACN,aAAKX,OAAL,GAAe,KAAKG,eAApB;AACA;;AAED,kCAAKE,YAAL,4EAAmByE,cAAnB,CAAkC,CAAC,CAAC,KAAK9E,OAAzC;AACA,WAAKoE,OAAL;AACA;;;WAED,qCAAoC;AACnC,UAAI,KAAK5E,SAAL,KAAmB,UAAvB,EAAmC;AAAA;;AAClC,oCAAKa,YAAL,4EAAmB0E,YAAnB,CAAgC,KAAhC;AACA,OAFD,MAEO;AACN,aAAKA,YAAL,CAAkB,UAAlB;AACA;AACD;;;WAED,kCAAiC;AAChC,UAAI,KAAKvF,SAAL,KAAmB,OAAvB,EAAgC;AAC/B,aAAKuF,YAAL,CAAkB,KAAlB;AACA,OAFD,MAEO;AACN,aAAKA,YAAL,CAAkB,OAAlB;AACA;AACD;;;WAED,sBAAoBC,IAApB,EAAqC;AAAA;;AACpC,WAAKxF,SAAL,GAAiBwF,IAAjB;AACA,kCAAK3E,YAAL,4EAAmB0E,YAAnB,CAAgCC,IAAhC;AACA,WAAK5E,uBAAL,GAA+B,IAA/B;AACA;;;WAED,mBAAkB;AACjB,WAAK0B,YAAL,GAAoB,SAApB;AACA,WAAKmD,IAAL;AACA;;;WAED,sBAAqB;AACpB,WAAKnD,YAAL,GAAoB,MAApB;AACA,WAAKmD,IAAL;AACA;;;WAED,6BAA4BX,IAA5B,EAA0C;AAAA;;AACzC,UAAMd,IAAI,GAAG,KAAKiB,mBAAL,CAAyBH,IAAzB,CAAb;AAEA,kCAAKjE,YAAL,4EAAmB6E,gBAAnB,CAAoC1B,IAApC;AACA,WAAKtC,yBAAL,CAA+BsC,IAA/B;AACA;;;WAED,6BAA4Bc,IAA5B,EAA0C;AAAA;;AACzC,UAAMa,QAAQ,GAAGP,iBACfQ,QADe,CACNd,IADM,EACA,KADA,EAEfe,OAFe,CAEP,MAFO,EAEC,EAFD,EAGfA,OAHe,CAGP,KAHO,EAGA,EAHA,CAAjB;;AAIA,UAAMC,OAAO,4BAAGV,iBAASU,OAAT,CAAiBhB,IAAjB,EAAuBiB,KAAvB,CAA6BX,iBAASY,GAAtC,EAA2CC,GAA3C,EAAH,yEAAuD,EAApE;;AAEA,UAAMjC,IAAI,GAAGoB,iBAASF,IAAT,CAAcY,OAAd,EAAuBH,QAAvB,CAAb;;AACA,aAAO3B,IAAP;AACA;;;WAED,mCAAkC9C,aAAlC,EAA0D;AAAA;;AACzD,WAAKZ,OAAL,GAAeY,aAAf;AACA,kCAAKL,YAAL,4EAAmB6E,gBAAnB,CAAoCxE,aAApC;AAEA,WAAK0D,OAAL;AACA;;;WAED,2BAA0B;AACzB,UAAI,KAAKtC,YAAL,KAAsB,MAA1B,EAAkC;AAAA;;AACjC,aAAKA,YAAL,GAAoB,KAApB;AACA,sCAAK4D,kBAAL;AACA,aAAKA,kBAAL,GAA0B/E,SAA1B;AACA,OAJD,MAIO,IAAI,KAAKmB,YAAL,KAAsB,KAA1B,EAAiC;AACvC,aAAKA,YAAL,GAAoB,MAApB;AACA,aAAKmD,IAAL;AACA;AACD;;;WAED,yBAAwB;AACvB,WAAKb,OAAL;AACA;;;WAED,gBAAc;AAAA;;AACb,+BAAKuB,UAAL,sEAAiBV,IAAjB;AACA,qCAAKS,kBAAL;AACA,WAAKA,kBAAL,GAA0B/E,SAA1B;AACA;;;;8GAED,kBAAiCiF,QAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBACO,KAAKC,YAAL,CAAkBD,QAAlB,CADP;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;2GAIA,kBACCtG,OADD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,sBAGK,KAAKwC,YAAL,KAAsB,MAH3B;AAAA;AAAA;AAAA;;AAAA;AAAA,uBAIQ,KAAKgE,YAAL,EAJR;;AAAA;AAAA,sBAOK,KAAKhE,YAAL,KAAsB,MAP3B;AAAA;AAAA;AAAA;;AAAA,kDAQS,KAAKiE,eARd;;AAAA;AAWC,4CAAK1F,YAAL,4EAAmB2F,SAAnB,CAA6B,OAA7B;AACA,6CAAK3F,YAAL,8EAAmB4F,kBAAnB;AAEA,qBAAKN,UAAL,GAAkB,IAAIO,sBAAJ,CAAe;AAChC3F,kBAAAA,GAAG,EAAE,KAAKA,GADsB;AAEhC4F,kBAAAA,cAAc,EAAE,KAAKzG,OAAL,CAAa,SAAb;AAFgB,iBAAf,CAAlB;AAKI0G,gBAAAA,WAnBL,GAmBmB,IAnBnB;;AAAA,qBAqBK,KAAK/F,YArBV;AAAA;AAAA;AAAA;;AAAA;AAAA,uBAsBQ,KAAKsF,UAAL,CAAgB/D,EAAhB,CAAmB,YAAnB,EAAiC,UAACqB,OAAD,EAAa;AAAA;;AACnD,sBAAImD,WAAJ,EAAiB;AAAA;;AAChBA,oBAAAA,WAAW,GAAG,KAAd;AACA,2CAAA,MAAI,CAAC/F,YAAL,4EAAmB2F,SAAnB,CAA6B,SAA7B;AACA,4CAAA,MAAI,CAAC3F,YAAL,8EAAmBgG,KAAnB;AACA;;AAED,sBAAI,MAAI,CAAC7G,SAAL,KAAmB,OAAnB,IAA8ByD,OAAO,CAACqD,OAAR,CAAgB1D,WAAhB,GAA8B,CAAhE,EAAmE;AAClE,wBAAM2D,MAAM,GAAGtD,OAAO,CAACqD,OAAR,CAAgBE,SAAhB,CAA0BC,IAA1B,CACd,UAACnC,IAAD;AAAA,6BAAeA,IAAI,CAAC9D,MAAL,KAAgB,QAA/B;AAAA,qBADc,CAAf;;AAIA,wBAAI+F,MAAJ,EAAY;AACX,0BAAMzG,OAAO,GAAG,MAAI,CAAC2E,mBAAL,CAAyB8B,MAAM,CAAChD,IAAhC,CAAhB;;AACA,0BAAI,MAAI,CAACzD,OAAL,KAAiBA,OAArB,EAA8B;AAC7B,wBAAA,MAAI,CAACoB,yBAAL,CAA+BpB,OAA/B;AACA;;AACD;AACA;AACD;;AAED,0CAAA,MAAI,CAACO,YAAL,8EAAmBqG,aAAnB,CAAiCzD,OAAO,CAACqD,OAAzC;AACA,0CAAA,MAAI,CAACjG,YAAL,8EAAmBsG,MAAnB;AACA,iBAvBK,CAtBR;;AAAA;AAAA;AAAA,uBA+CQ,KAAKhB,UAAL,CAAgB/D,EAAhB,CAAmB,WAAnB,EAAgC,UAACqB,OAAD,EAAa;AAAA;;AAClD,0CAAA,MAAI,CAAC5C,YAAL,8EAAmBuG,WAAnB,CAA+B3D,OAAO,CAAC4D,OAAvC;AACA,0CAAA,MAAI,CAACxG,YAAL,8EAAmBsG,MAAnB;AACA,iBAHK,CA/CR;;AAAA;AAqDC,qBAAK7E,YAAL,GAAoB,KAApB;AArDD;AAAA,uBAuD4C,KAAK6D,UAAL,CAAgBmB,GAAhB,CAAoB;AAC9DhH,kBAAAA,OAAO,EAAE,KAAKA,OADgD;AAE9DiH,kBAAAA,SAAS,EAAE,KAAK/G;AAF8C,iBAApB,CAvD5C;;AAAA;AAuDKqC,gBAAAA,WAvDL;;AAAA,uBA6DE;AACA,qBAAKP,YAAL,KAAsB,SAAtB,KACC,CAACxC,OAAO,CAACS,wBAAT,IACA,CAAC,KAAKK,uBADN,IAEC,KAAK0B,YAAN,KAA+B,MAHhC,CA9DF;AAAA;AAAA;AAAA;;AAAA,kDAmESO,WAnET;;AAAA;AAAA,sBAuEE,KAAKP,YAAL,KAAsB,KAAtB,IACA,KAAKtC,SAAL,KAAmB,OADnB,IAEA,2BAAKmG,UAAL,wEAAiBqB,cAAjB,QAAsC,KAFtC,IAGA,uBAAC,KAAKrB,UAAN,8CAAC,kBAAiBsB,eAAjB,EAAD,CAHA,IAIA,kBAAC,KAAKnH,OAAN,yDAAiB,EAAjB,EAAqBqE,MAArB,GAA8B,CA3EhC;AAAA;AAAA;AAAA;;AA6EE,6CAAK9D,YAAL,8EAAmBqD,cAAnB,CAAkC,eAAlC;AACA,qBAAK5B,YAAL,GAAoB,SAApB;AACA,6CAAKzB,YAAL,8EAAmByD,mBAAnB,CAAuC,CAAvC;AA/EF;AAAA,uBAiFe,IAAIoD,OAAJ,CAAY,UAACC,OAAD,EAAa;AACrCnD,kBAAAA,UAAU,CAAC,YAAM;AAAA;;AAChB,oBAAA,MAAI,CAAClE,OAAL,GAAe,EAAf;AACA,4CAAA,MAAI,CAACO,YAAL,8EAAmB6E,gBAAnB,CAAoC,EAApC;AACAiC,oBAAAA,OAAO,CAAC,MAAI,CAACnF,eAAL,CAAqB1C,OAArB,CAAD,CAAP;AACA,mBAJS,EAIP,IAJO,CAAV;AAKA,iBANY,CAjFf;;AAAA;AAAA;;AAAA;AA0FC,oBAAI,KAAKwC,YAAL,KAAsB,KAA1B,EAAiC;AAChC,uBAAKA,YAAL,GAAoB,MAApB;AACA;;AAED,6CAAKzB,YAAL,8EAAmB2F,SAAnB,CAA6B,SAA7B;AAEA,qBAAKD,eAAL,GAAuB1D,WAAvB;AAhGD,kDAkGQ,KAAKL,eAAL,CAAqB1C,OAArB,CAlGR;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;wGAqGA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBACO,IAAI4H,OAAJ,CAAY,UAACC,OAAD,EAAkB;AACnC,kBAAA,MAAI,CAACrF,YAAL,GAAoB,MAApB;AACA,kBAAA,MAAI,CAAC4D,kBAAL,GAA0ByB,OAA1B;AACA,iBAHK,CADP;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;wGAOA,kBAA2BvB,QAA3B;AAAA;AAAA;AAAA;AAAA;AAAA;AACOrC,gBAAAA,IADP,GACc6D,2BAASC,WAAT,CAAqB,KAAK9G,GAA1B,EAA+B,KAA/B,EAAsC,WAAtC,EAAmDqF,QAAnD,CADd;AAAA;AAAA,uBAEO,sBAAKrC,IAAL,CAFP;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WAKA,uCAAsClB,WAAtC,EAAsE;AAAA;AAAA;;AACrE,UAAMU,MAAqB,GAAG,EAA9B;AACA,+BAAAV,WAAW,CAACmE,SAAZ,gFAAuBc,OAAvB,CAA+B,UAAChD,IAAD,EAAU;AAAA;;AACxC,uBAAAA,IAAI,CAACiD,KAAL,4DAAYD,OAAZ,CAAoB,UAACpF,IAAD,EAAU;AAAA;;AAC7B,iCAAAA,IAAI,CAACsF,aAAL,4EAAoBF,OAApB,CAA4B,UAACT,OAAD,EAAa;AACxC,gBAAMY,GAAG,GAAG,MAAI,CAACC,2BAAL,CAAiCxF,IAAjC,EAAuCoC,IAAvC,EAA6CuC,OAA7C,CAAZ;;AACA9D,YAAAA,MAAM,CAACY,IAAP,CAAY8D,GAAZ;AACA,WAHD;AAIA,SALD;AAMA,OAPD;;AAQA,UAAI1E,MAAM,CAACoB,MAAP,GAAgB,CAApB,EAAuB;AACtB,eAAOpB,MAAP;AACA;;AAED,aAAOpC,SAAP;AACA;;;WAED,qCACCuB,IADD,EAECoC,IAFD,EAGCuC,OAHD,EAIE;AACD,aAAO,IAAIc,uBAAJ,CAAgB;AACtBC,QAAAA,IAAI,EAAE,aADgB;AAEtBC,QAAAA,QAAQ,EAAE3F,IAAI,CAACsB,IAFO;AAGtBoC,QAAAA,QAAQ,EAAEtB,IAAI,CAACf,IAHO;AAItBuE,QAAAA,YAAY,EAAEjB;AAJQ,OAAhB,CAAP;AAMA;;;WAED,wBAAsB;AACrB,aAAO,KAAKrH,SAAZ;AACA;;;EA5asCuI,2B","sourcesContent":["import pathUtil from 'path'\nimport { SpruceSchemas } from '@sprucelabs/mercury-types'\nimport { SchemaValues } from '@sprucelabs/schema'\nimport { diskUtil } from '@sprucelabs/spruce-skill-utils'\nimport open from 'open'\nimport testOptionsSchema from '#spruce/schemas/spruceCli/v2020_07_22/testOptions.schema'\nimport SpruceError from '../../../errors/SpruceError'\nimport AbstractAction from '../../AbstractAction'\nimport { FeatureActionResponse, ActionOptions } from '../../features.types'\nimport WatchFeature from '../../watch/WatchFeature'\nimport {\n\tSpruceTestFile,\n\tSpruceTestFileTest,\n\tSpruceTestResults,\n} from '../test.types'\nimport TestReporter, { WatchMode } from '../TestReporter'\nimport TestRunner from '../TestRunner'\n\nexport const optionsSchema = testOptionsSchema\n\nexport type OptionsSchema = typeof optionsSchema\n\ntype DidChangePayload =\n\tSchemaValues<SpruceSchemas.SpruceCli.v2020_07_22.WatcherDidDetectChangesEmitPayloadSchema>\n\nexport default class TestAction extends AbstractAction<OptionsSchema> {\n\tpublic optionsSchema = optionsSchema\n\tpublic invocationMessage = 'Starting tests... 🛡'\n\n\tprivate testReporter?: TestReporter | undefined\n\tprivate testRunner?: TestRunner\n\tprivate runnerStatus: 'hold' | 'quit' | 'run' | 'restart' = 'hold'\n\tprivate pattern: string | undefined\n\tprivate inspect?: number | null\n\tprivate holdPromiseResolve?: () => void\n\tprivate lastTestResults: SpruceTestResults = { totalTestFiles: 0 }\n\tprivate originalInspect!: number\n\tprivate watcher?: WatchFeature\n\tprivate watchMode: WatchMode = 'off'\n\tprivate fileChangeTimeout?: number\n\tprivate hasWatchEverBeenEnabled = false\n\n\tprivate readonly watchDelaySec = 2\n\n\tpublic constructor(options: ActionOptions) {\n\t\tsuper(options)\n\t}\n\n\tpublic async execute(\n\t\toptions: SchemaValues<OptionsSchema>\n\t): Promise<FeatureActionResponse> {\n\t\tif (!options.watchMode) {\n\t\t\tconst settings = this.Service('settings')\n\t\t\toptions.watchMode = settings.get('test.watchMode') ?? 'off'\n\t\t}\n\n\t\tconst normalizedOptions = this.validateAndNormalizeOptions(options)\n\n\t\tconst {\n\t\t\tpattern,\n\t\t\tshouldReportWhileRunning,\n\t\t\tinspect,\n\t\t\tshouldHoldAtStart,\n\t\t\twatchMode,\n\t\t\tshouldReturnImmediately,\n\t\t} = normalizedOptions\n\n\t\tthis.originalInspect = inspect ?? 5200\n\t\tthis.inspect = inspect\n\t\tthis.pattern = pattern\n\t\tthis.hasWatchEverBeenEnabled = watchMode !== 'off'\n\t\tthis.watchMode = watchMode as WatchMode\n\n\t\tif (shouldReportWhileRunning) {\n\t\t\tthis.testReporter = new TestReporter({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\twatchMode: this.watchMode,\n\t\t\t\tstatus: shouldHoldAtStart ? 'stopped' : 'ready',\n\t\t\t\tisDebugging: !!inspect,\n\t\t\t\tfilterPattern: pattern ?? undefined,\n\t\t\t\thandleRestart: this.handleRestart.bind(this),\n\t\t\t\thandleStartStop: this.handleStartStop.bind(this),\n\t\t\t\thandleQuit: this.handleQuit.bind(this),\n\t\t\t\thandleRerunTestFile: this.handleRerunTestFile.bind(this),\n\t\t\t\thandleOpenTestFile: this.handleOpenTestFile.bind(this),\n\t\t\t\thandleFilterPatternChange: this.handleFilterPatternChange.bind(this),\n\t\t\t\thandleToggleDebug: this.handleToggleDebug.bind(this),\n\t\t\t\thandletoggleStandardWatch: this.handletoggleStandardWatch.bind(this),\n\t\t\t\thandleToggleSmartWatch: this.handleToggleSmartWatch?.bind(this),\n\t\t\t})\n\n\t\t\tawait this.testReporter.start()\n\t\t}\n\n\t\tthis.watcher = this.getFeature('watch') as WatchFeature\n\t\tvoid this.watcher.startWatching({ delay: 0 })\n\n\t\tawait this.emitter.on(\n\t\t\t'watcher.did-detect-change',\n\t\t\tthis.handleFileChange.bind(this)\n\t\t)\n\n\t\tthis.runnerStatus = shouldHoldAtStart ? 'hold' : 'run'\n\n\t\tconst promise = this.startTestRunner(normalizedOptions)\n\n\t\tif (shouldReturnImmediately) {\n\t\t\treturn {\n\t\t\t\tmeta: {\n\t\t\t\t\tpromise,\n\t\t\t\t\ttest: this,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tvoid this.emitter.emit('test.reporter-did-boot', {\n\t\t\treporter: this,\n\t\t})\n\n\t\tconst testResults = await promise\n\n\t\tawait this.watcher?.stopWatching()\n\t\tawait this.testReporter?.destroy()\n\n\t\tconst actionResponse: FeatureActionResponse = {\n\t\t\tmeta: { testResults },\n\t\t\tsummaryLines: [\n\t\t\t\t`Test files: ${testResults.totalTestFiles}`,\n\t\t\t\t`Tests: ${testResults.totalTests ?? '0'}`,\n\t\t\t\t`Passed: ${testResults.totalPassed ?? '0'}`,\n\t\t\t\t`Failed: ${testResults.totalFailed ?? '0'}`,\n\t\t\t\t`Skipped: ${testResults.totalSkipped ?? '0'}`,\n\t\t\t\t`Todo: ${testResults.totalTodo ?? '0'}`,\n\t\t\t],\n\t\t}\n\n\t\tif (testResults.totalFailed ?? 0 > 0) {\n\t\t\tactionResponse.errors = this.generateErrorsFromTestResults(testResults)\n\t\t}\n\n\t\treturn actionResponse\n\t}\n\n\tprivate handleFileChange(payload: DidChangePayload) {\n\t\tif (\n\t\t\tthis.watchMode === 'off' ||\n\t\t\t!(this.runnerStatus === 'run' || this.runnerStatus == 'hold')\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { changes } = payload\n\n\t\tlet shouldRestart = false\n\t\tconst filesWeCareAbout: string[] = []\n\n\t\tfor (const change of changes) {\n\t\t\tconst { path, name } = change.values\n\n\t\t\tif (this.doWeCareAboutThisFileChanging(path)) {\n\t\t\t\tthis.testReporter?.setStatusLabel(`Built file: ${name}`)\n\t\t\t\tshouldRestart = true\n\t\t\t\tfilesWeCareAbout.push(path)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (shouldRestart) {\n\t\t\tif (this.fileChangeTimeout) {\n\t\t\t\tclearTimeout(this.fileChangeTimeout)\n\t\t\t}\n\n\t\t\tthis.testReporter?.startCountdownTimer(this.watchDelaySec)\n\t\t\tthis.fileChangeTimeout = setTimeout(() => {\n\t\t\t\tif (this.watchMode === 'smart') {\n\t\t\t\t\tconst smartFilter =\n\t\t\t\t\t\tthis.generateFilterFromChangedFiles(filesWeCareAbout)\n\t\t\t\t\tif (smartFilter.length > 0) {\n\t\t\t\t\t\tthis.handleFilterPatternChange(smartFilter)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.restart()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.restart()\n\t\t\t\t}\n\t\t\t}, this.watchDelaySec * 1000) as any\n\t\t}\n\t}\n\n\tprivate generateFilterFromChangedFiles(filesWeCareAbout: string[]): string {\n\t\tconst filter = filesWeCareAbout\n\t\t\t.filter((file) => file.search('test.js') > -1)\n\t\t\t.map((file) => this.fileToFilterPattern(file))\n\t\t\t.join(' ')\n\n\t\treturn filter\n\t}\n\n\tprivate doWeCareAboutThisFileChanging(path: string) {\n\t\tconst ext = pathUtil.extname(path)\n\n\t\tif (\n\t\t\tpath.search('testDirsAndFiles') > -1 ||\n\t\t\tpath.search('.change_cache') > -1\n\t\t) {\n\t\t\treturn false\n\t\t}\n\n\t\tif (ext === '.js') {\n\t\t\treturn true\n\t\t}\n\n\t\treturn false\n\t}\n\n\tprivate handleToggleDebug() {\n\t\tif (this.inspect) {\n\t\t\tthis.inspect = undefined\n\t\t} else {\n\t\t\tthis.inspect = this.originalInspect\n\t\t}\n\n\t\tthis.testReporter?.setIsDebugging(!!this.inspect)\n\t\tthis.restart()\n\t}\n\n\tprivate handletoggleStandardWatch() {\n\t\tif (this.watchMode === 'standard') {\n\t\t\tthis.testReporter?.setWatchMode('off')\n\t\t} else {\n\t\t\tthis.setWatchMode('standard')\n\t\t}\n\t}\n\n\tprivate handleToggleSmartWatch() {\n\t\tif (this.watchMode === 'smart') {\n\t\t\tthis.setWatchMode('off')\n\t\t} else {\n\t\t\tthis.setWatchMode('smart')\n\t\t}\n\t}\n\n\tpublic setWatchMode(mode: WatchMode) {\n\t\tthis.watchMode = mode\n\t\tthis.testReporter?.setWatchMode(mode)\n\t\tthis.hasWatchEverBeenEnabled = true\n\t}\n\n\tprivate restart() {\n\t\tthis.runnerStatus = 'restart'\n\t\tthis.kill()\n\t}\n\n\tprivate handleQuit() {\n\t\tthis.runnerStatus = 'quit'\n\t\tthis.kill()\n\t}\n\n\tprivate handleRerunTestFile(file: string) {\n\t\tconst name = this.fileToFilterPattern(file)\n\n\t\tthis.testReporter?.setFilterPattern(name)\n\t\tthis.handleFilterPatternChange(name)\n\t}\n\n\tprivate fileToFilterPattern(file: string) {\n\t\tconst filename = pathUtil\n\t\t\t.basename(file, '.ts')\n\t\t\t.replace('.tsx', '')\n\t\t\t.replace('.js', '')\n\t\tconst dirname = pathUtil.dirname(file).split(pathUtil.sep).pop() ?? ''\n\n\t\tconst name = pathUtil.join(dirname, filename)\n\t\treturn name\n\t}\n\n\tprivate handleFilterPatternChange(filterPattern?: string) {\n\t\tthis.pattern = filterPattern\n\t\tthis.testReporter?.setFilterPattern(filterPattern)\n\n\t\tthis.restart()\n\t}\n\n\tprivate handleStartStop() {\n\t\tif (this.runnerStatus === 'hold') {\n\t\t\tthis.runnerStatus = 'run'\n\t\t\tthis.holdPromiseResolve?.()\n\t\t\tthis.holdPromiseResolve = undefined\n\t\t} else if (this.runnerStatus === 'run') {\n\t\t\tthis.runnerStatus = 'hold'\n\t\t\tthis.kill()\n\t\t}\n\t}\n\n\tprivate handleRestart() {\n\t\tthis.restart()\n\t}\n\n\tpublic kill() {\n\t\tthis.testRunner?.kill()\n\t\tthis.holdPromiseResolve?.()\n\t\tthis.holdPromiseResolve = undefined\n\t}\n\n\tprivate async handleOpenTestFile(fileName: string) {\n\t\tawait this.openTestFile(fileName)\n\t}\n\n\tprivate async startTestRunner(\n\t\toptions: SchemaValues<OptionsSchema>\n\t): Promise<SpruceTestResults> {\n\t\tif (this.runnerStatus === 'hold') {\n\t\t\tawait this.waitForStart()\n\t\t}\n\n\t\tif (this.runnerStatus === 'quit') {\n\t\t\treturn this.lastTestResults\n\t\t}\n\n\t\tthis.testReporter?.setStatus('ready')\n\t\tthis.testReporter?.stopCountdownTimer()\n\n\t\tthis.testRunner = new TestRunner({\n\t\t\tcwd: this.cwd,\n\t\t\tcommandService: this.Service('command'),\n\t\t})\n\n\t\tlet firstUpdate = true\n\n\t\tif (this.testReporter) {\n\t\t\tawait this.testRunner.on('did-update', (payload) => {\n\t\t\t\tif (firstUpdate) {\n\t\t\t\t\tfirstUpdate = false\n\t\t\t\t\tthis.testReporter?.setStatus('running')\n\t\t\t\t\tthis.testReporter?.reset()\n\t\t\t\t}\n\n\t\t\t\tif (this.watchMode === 'smart' && payload.results.totalFailed > 0) {\n\t\t\t\t\tconst failed = payload.results.testFiles.find(\n\t\t\t\t\t\t(file: any) => file.status === 'failed'\n\t\t\t\t\t)\n\n\t\t\t\t\tif (failed) {\n\t\t\t\t\t\tconst pattern = this.fileToFilterPattern(failed.path)\n\t\t\t\t\t\tif (this.pattern !== pattern) {\n\t\t\t\t\t\t\tthis.handleFilterPatternChange(pattern)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.testReporter?.updateResults(payload.results)\n\t\t\t\tthis.testReporter?.render()\n\t\t\t})\n\n\t\t\tawait this.testRunner.on('did-error', (payload) => {\n\t\t\t\tthis.testReporter?.appendError(payload.message)\n\t\t\t\tthis.testReporter?.render()\n\t\t\t})\n\t\t}\n\n\t\tthis.runnerStatus = 'run'\n\n\t\tlet testResults: SpruceTestResults = await this.testRunner.run({\n\t\t\tpattern: this.pattern,\n\t\t\tdebugPort: this.inspect,\n\t\t})\n\n\t\tif (\n\t\t\t//@ts-ignore\n\t\t\tthis.runnerStatus !== 'restart' &&\n\t\t\t(!options.shouldReportWhileRunning ||\n\t\t\t\t!this.hasWatchEverBeenEnabled ||\n\t\t\t\t(this.runnerStatus as any) === 'quit')\n\t\t) {\n\t\t\treturn testResults\n\t\t}\n\n\t\tif (\n\t\t\tthis.runnerStatus === 'run' &&\n\t\t\tthis.watchMode === 'smart' &&\n\t\t\tthis.testRunner?.hasFailedTests() === false &&\n\t\t\t!this.testRunner?.hasSkippedTests() &&\n\t\t\t(this.pattern ?? []).length > 0\n\t\t) {\n\t\t\tthis.testReporter?.setStatusLabel('Restarting...')\n\t\t\tthis.runnerStatus = 'restart'\n\t\t\tthis.testReporter?.startCountdownTimer(3)\n\n\t\t\treturn await new Promise((resolve) => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.pattern = ''\n\t\t\t\t\tthis.testReporter?.setFilterPattern('')\n\t\t\t\t\tresolve(this.startTestRunner(options))\n\t\t\t\t}, 3000)\n\t\t\t})\n\t\t}\n\n\t\tif (this.runnerStatus === 'run') {\n\t\t\tthis.runnerStatus = 'hold'\n\t\t}\n\n\t\tthis.testReporter?.setStatus('stopped')\n\n\t\tthis.lastTestResults = testResults\n\n\t\treturn this.startTestRunner(options)\n\t}\n\n\tpublic async waitForStart() {\n\t\tawait new Promise((resolve: any) => {\n\t\t\tthis.runnerStatus = 'hold'\n\t\t\tthis.holdPromiseResolve = resolve\n\t\t})\n\t}\n\n\tprivate async openTestFile(fileName: string): Promise<void> {\n\t\tconst path = diskUtil.resolvePath(this.cwd, 'src', '__tests__', fileName)\n\t\tawait open(path)\n\t}\n\n\tprivate generateErrorsFromTestResults(testResults: SpruceTestResults) {\n\t\tconst errors: SpruceError[] = []\n\t\ttestResults.testFiles?.forEach((file) => {\n\t\t\tfile.tests?.forEach((test) => {\n\t\t\t\ttest.errorMessages?.forEach((message) => {\n\t\t\t\t\tconst err = this.mapErrorResultToSpruceError(test, file, message)\n\t\t\t\t\terrors.push(err)\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t\tif (errors.length > 0) {\n\t\t\treturn errors\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tprivate mapErrorResultToSpruceError(\n\t\ttest: SpruceTestFileTest,\n\t\tfile: SpruceTestFile,\n\t\tmessage: string\n\t) {\n\t\treturn new SpruceError({\n\t\t\tcode: 'TEST_FAILED',\n\t\t\ttestName: test.name,\n\t\t\tfileName: file.path,\n\t\t\terrorMessage: message,\n\t\t})\n\t}\n\n\tpublic getWatchMode() {\n\t\treturn this.watchMode\n\t}\n}\n"],"file":"TestAction.js"}
|
|
@@ -230,13 +230,6 @@ var TerminalInterface = /*#__PURE__*/function () {
|
|
|
230
230
|
lines: summaryLines
|
|
231
231
|
});
|
|
232
232
|
|
|
233
|
-
if (errors.length > 0) {
|
|
234
|
-
this.renderHeadline('Errors');
|
|
235
|
-
errors.forEach(function (err) {
|
|
236
|
-
return _this3.renderError(err);
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
|
|
240
233
|
if (packagesInstalled.length > 0) {
|
|
241
234
|
var table = new _cliTable["default"]({
|
|
242
235
|
head: ['Name', 'Dev'],
|
|
@@ -297,6 +290,13 @@ var TerminalInterface = /*#__PURE__*/function () {
|
|
|
297
290
|
});
|
|
298
291
|
}
|
|
299
292
|
|
|
293
|
+
if (errors.length > 0) {
|
|
294
|
+
this.renderHeadline('Errors');
|
|
295
|
+
errors.forEach(function (err) {
|
|
296
|
+
return _this3.renderError(err);
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
|
|
300
300
|
if (results.totalTime) {
|
|
301
301
|
this.renderLine("Total time: ".concat(_duration["default"].msToFriendly(results.totalTime)));
|
|
302
302
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/interfaces/TerminalInterface.ts"],"names":["terminalImage","require","fieldCount","generateInquirerFieldName","filterEffectsForCFonts","effects","effect","GraphicsTextEffect","SpruceHeader","Reset","Bold","Dim","Italic","Underline","Inverse","Hidden","Strikethrough","Visible","indexOf","TerminalInterface","cwd","renderStackTraces","log","console","bind","Error","lines","forEach","line","renderLine","object","Green","renderDivider","Object","keys","key","chalk","bold","JSON","stringify","options","headline","dividerEffects","headlineEffects","Blue","bodyEffects","renderHeadline","renderLines","renderObject","bar","results","generatedFiles","files","filter","f","action","updatedFiles","skippedFiles","errors","packagesInstalled","renderHero","summaryLines","length","push","renderSection","featuresUtil","generateCommand","featureCode","actionCode","err","renderError","table","Table","head","colWidths","wordWrap","colAligns","sort","one","two","name","pkg","isDev","toString","file","description","namesUtil","toPascal","hints","totalTime","durationUtil","msToFriendly","message","isSpruce","fonts","say","font","align","space","colors","gradient","Red","undefined","write","eraseBeforeRender","terminal","eraseLine","Yellow","stopLoading","loader","text","start","stop","question","inquirer","prompt","type","confirmResult","answer","label","bgGreenBright","black","clear","code","colored","emphasize","highlight","value","renderWarning","definition","isPromptActive","fieldDefinition","defaultValue","promptOptions","generatePromptLabel","field","FieldFactory","Field","transformer","toValueType","validate","id","fields","isArray","choices","map","choice","checked","_","includes","SpruceError","friendlyMessage","dirPath","path","join","root","onlyShowDir","fs","existsSync","lstatSync","isDirectory","cleanedPath","replace","directory","extname","response","result","hint","italic","dim","stackLines","cleanStack","splice","stack","AbstractSpruceError","original","originalError","split","removeProgressBar","progressBar","percent","showPercent","eta","showEta","items","totalItems","inline","renderInline","update","image","Promise","resolve","requestCursorLocation","getCursorLocation","x","y","saveCursor","restoreCursor","moveTo","eraseDisplayBelow","_doesSupportColor","isTTy","process","stdout","isTTY"],"mappings":"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","sourcesContent":["import path from 'path'\nimport AbstractSpruceError from '@sprucelabs/error'\nimport {\n\tFieldFactory,\n\tFieldDefinitionValueType,\n\tareSchemaValuesValid,\n} from '@sprucelabs/schema'\nimport { IField } from '@sprucelabs/schema'\nimport { namesUtil } from '@sprucelabs/spruce-skill-utils'\n// @ts-ignore\nimport fonts from 'cfonts'\nimport chalk from 'chalk'\n// @ts-ignore No definition available\nimport Table from 'cli-table3'\n// @ts-ignore No definition available\nimport emphasize from 'emphasize'\nimport fs from 'fs-extra'\nimport globby from 'globby'\nimport inquirer from 'inquirer'\nimport _ from 'lodash'\nimport { filter } from 'lodash'\nimport ora from 'ora'\nimport { terminal } from 'terminal-kit'\nimport { ProgressBarController } from 'terminal-kit/Terminal'\nimport { FieldDefinitions } from '#spruce/schemas/fields/fields.types'\nimport SpruceError from '../errors/SpruceError'\nimport featuresUtil from '../features/feature.utilities'\nimport { ExecutionResults, GraphicsInterface } from '../types/cli.types'\nimport {\n\tGraphicsTextEffect,\n\tImageDimensions,\n\tProgressBarOptions,\n\tProgressBarUpdateOptions,\n} from '../types/graphicsInterface.types'\nimport durationUtil from '../utilities/duration.utility'\nimport isCi from '../utilities/isCi'\nconst terminalImage = require('terminal-image')\n\nlet fieldCount = 0\nfunction generateInquirerFieldName() {\n\tfieldCount++\n\treturn `field-${fieldCount}`\n}\n\n/** Remove effects cfonts does not support */\nfunction filterEffectsForCFonts(effects: GraphicsTextEffect[]) {\n\treturn filter(\n\t\teffects,\n\t\t(effect) =>\n\t\t\t[\n\t\t\t\tGraphicsTextEffect.SpruceHeader,\n\t\t\t\tGraphicsTextEffect.Reset,\n\t\t\t\tGraphicsTextEffect.Bold,\n\t\t\t\tGraphicsTextEffect.Dim,\n\t\t\t\tGraphicsTextEffect.Italic,\n\t\t\t\tGraphicsTextEffect.Underline,\n\t\t\t\tGraphicsTextEffect.Inverse,\n\t\t\t\tGraphicsTextEffect.Hidden,\n\t\t\t\tGraphicsTextEffect.Strikethrough,\n\t\t\t\tGraphicsTextEffect.Visible,\n\t\t\t].indexOf(effect) === -1\n\t)\n}\n\ntype TerminalSpecificOptions = {\n\teraseBeforeRender?: boolean\n}\n\nexport default class TerminalInterface implements GraphicsInterface {\n\tpublic isPromptActive = false\n\tpublic cwd: string\n\tprivate renderStackTraces = false\n\tprivate static loader?: ora.Ora | null\n\tprivate progressBar: ProgressBarController | null = null\n\tprivate static _doesSupportColor = process?.stdout?.isTTY && !isCi()\n\tprivate log: (...args: any[]) => void\n\n\tpublic constructor(\n\t\tcwd: string,\n\t\trenderStackTraces = false,\n\t\tlog = console.log.bind(console)\n\t) {\n\t\tthis.cwd = cwd\n\t\tthis.renderStackTraces = renderStackTraces\n\t\tthis.log = log\n\t}\n\n\tpublic static doesSupportColor() {\n\t\treturn this._doesSupportColor\n\t}\n\n\tpublic static setDoesSupportColor(isTTy: boolean) {\n\t\tthis._doesSupportColor = isTTy\n\t}\n\n\tpublic async sendInput(): Promise<void> {\n\t\tthrow new Error('sendInput not supported on the TerminalInterface!')\n\t}\n\n\tpublic renderLines(lines: any[], effects?: GraphicsTextEffect[]) {\n\t\tlines.forEach((line) => {\n\t\t\tthis.renderLine(line, effects)\n\t\t})\n\t}\n\n\tpublic renderObject(\n\t\tobject: Record<string, any>,\n\t\teffects: GraphicsTextEffect[] = [GraphicsTextEffect.Green]\n\t) {\n\t\tthis.renderLine('')\n\t\tthis.renderDivider()\n\t\tthis.renderLine('')\n\t\tObject.keys(object).forEach((key) => {\n\t\t\tthis.renderLine(\n\t\t\t\t`${chalk.bold(key)}: ${\n\t\t\t\t\ttypeof object[key] === 'string'\n\t\t\t\t\t\t? object[key]\n\t\t\t\t\t\t: JSON.stringify(object[key])\n\t\t\t\t}`,\n\t\t\t\teffects\n\t\t\t)\n\t\t})\n\t\tthis.renderLine('')\n\t\tthis.renderDivider()\n\t\tthis.renderLine('')\n\t}\n\n\tpublic renderSection(options: {\n\t\theadline?: string\n\t\tlines?: string[]\n\t\tobject?: Record<string, any>\n\t\theadlineEffects?: GraphicsTextEffect[]\n\t\tbodyEffects?: GraphicsTextEffect[]\n\t\tdividerEffects?: GraphicsTextEffect[]\n\t}) {\n\t\tconst {\n\t\t\theadline,\n\t\t\tlines,\n\t\t\tobject,\n\t\t\tdividerEffects = [],\n\t\t\theadlineEffects = [GraphicsTextEffect.Blue, GraphicsTextEffect.Bold],\n\t\t\tbodyEffects = [GraphicsTextEffect.Green],\n\t\t} = options\n\n\t\tif (headline) {\n\t\t\tthis.renderHeadline(`${headline} 🌲🤖`, headlineEffects, dividerEffects)\n\t\t}\n\n\t\tif (lines) {\n\t\t\tthis.renderLines(lines, bodyEffects)\n\n\t\t\tthis.renderLine('')\n\t\t\tthis.renderDivider(dividerEffects)\n\t\t}\n\n\t\tif (object) {\n\t\t\tthis.renderObject(object, bodyEffects)\n\t\t}\n\n\t\tthis.renderLine('')\n\t}\n\n\tpublic renderDivider(effects?: GraphicsTextEffect[]) {\n\t\tconst bar = '=================================================='\n\t\tthis.renderLine(bar, effects)\n\t}\n\n\tpublic renderActionSummary(\n\t\tresults: ExecutionResults & { totalTime?: number }\n\t) {\n\t\tconst generatedFiles =\n\t\t\tresults.files?.filter((f) => f.action === 'generated') ?? []\n\t\tconst updatedFiles =\n\t\t\tresults.files?.filter((f) => f.action === 'updated') ?? []\n\t\tconst skippedFiles =\n\t\t\tresults.files?.filter((f) => f.action === 'skipped') ?? []\n\n\t\tconst errors = results.errors ?? []\n\t\tconst packagesInstalled = results.packagesInstalled ?? []\n\n\t\tthis.renderHero(`${results.headline}`)\n\n\t\tlet summaryLines: string[] = [\n\t\t\terrors.length > 0 ? `Errors: ${errors.length}` : null,\n\t\t\tgeneratedFiles.length > 0\n\t\t\t\t? `Generated files: ${generatedFiles.length}`\n\t\t\t\t: null,\n\t\t\tupdatedFiles.length > 0 ? `Updated files: ${updatedFiles.length}` : null,\n\t\t\tskippedFiles.length > 0 ? `Skipped files: ${skippedFiles.length}` : null,\n\t\t\tpackagesInstalled.length > 0\n\t\t\t\t? `NPM packages installed: ${packagesInstalled.length}`\n\t\t\t\t: null,\n\t\t\t...(results.summaryLines ?? []),\n\t\t].filter((line) => !!line) as string[]\n\n\t\tif (summaryLines.length === 0) {\n\t\t\tsummaryLines.push('Nothing to report!')\n\t\t}\n\t\tthis.renderSection({\n\t\t\theadline: `${featuresUtil.generateCommand(\n\t\t\t\tresults.featureCode,\n\t\t\t\tresults.actionCode\n\t\t\t)} summary`,\n\t\t\tlines: summaryLines,\n\t\t})\n\n\t\tif (errors.length > 0) {\n\t\t\tthis.renderHeadline('Errors')\n\t\t\terrors.forEach((err) => this.renderError(err))\n\t\t}\n\n\t\tif (packagesInstalled.length > 0) {\n\t\t\tconst table = new Table({\n\t\t\t\thead: ['Name', 'Dev'],\n\t\t\t\tcolWidths: [40, 5],\n\t\t\t\twordWrap: true,\n\t\t\t\tcolAligns: ['left', 'center'],\n\t\t\t})\n\t\t\tpackagesInstalled\n\t\t\t\t.sort((one, two) => (one.name > two.name ? 1 : -1))\n\t\t\t\t.forEach((pkg) => {\n\t\t\t\t\ttable.push([pkg.name, pkg.isDev ? '√' : ''])\n\t\t\t\t})\n\n\t\t\tthis.renderSection({\n\t\t\t\theadline: `NPM packages summary`,\n\t\t\t\tlines: [table.toString()],\n\t\t\t})\n\t\t}\n\n\t\tfor (let files of [generatedFiles, updatedFiles]) {\n\t\t\tif (files.length > 0) {\n\t\t\t\tconst table = new Table({\n\t\t\t\t\thead: ['File', 'Description'],\n\t\t\t\t\twordWrap: true,\n\t\t\t\t})\n\n\t\t\t\tfiles = files.sort()\n\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\ttable.push([file.name, file.description ?? ''])\n\t\t\t\t}\n\n\t\t\t\tthis.renderSection({\n\t\t\t\t\theadline: `${namesUtil.toPascal(files[0].action)} file summary`,\n\t\t\t\t\tlines: [table.toString()],\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (results.hints) {\n\t\t\tthis.renderSection({\n\t\t\t\theadline: 'Read below 👇',\n\t\t\t\tlines: results.hints,\n\t\t\t})\n\t\t}\n\n\t\tif (results.totalTime) {\n\t\t\tthis.renderLine(\n\t\t\t\t`Total time: ${durationUtil.msToFriendly(results.totalTime)}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic renderHeadline(\n\t\tmessage: string,\n\t\teffects: GraphicsTextEffect[] = [\n\t\t\tGraphicsTextEffect.Blue,\n\t\t\tGraphicsTextEffect.Bold,\n\t\t],\n\t\tdividerEffects: GraphicsTextEffect[] = []\n\t) {\n\t\tconst isSpruce = effects.indexOf(GraphicsTextEffect.SpruceHeader) > -1\n\n\t\tif (isSpruce) {\n\t\t\tfonts.say(message, {\n\t\t\t\tfont: GraphicsTextEffect.SpruceHeader,\n\t\t\t\talign: 'left',\n\t\t\t\tspace: false,\n\t\t\t\tcolors: filterEffectsForCFonts(effects),\n\t\t\t})\n\t\t} else {\n\t\t\tthis.renderDivider(dividerEffects)\n\t\t\tthis.renderLine(message, effects)\n\t\t\tthis.renderDivider(dividerEffects)\n\t\t\tthis.renderLine('')\n\t\t}\n\t}\n\n\tpublic renderHero(message: string, effects?: GraphicsTextEffect[]) {\n\t\tfonts.say(message, {\n\t\t\t// Font: 'tiny',\n\t\t\talign: 'left',\n\t\t\tgradient: [GraphicsTextEffect.Red, GraphicsTextEffect.Blue],\n\t\t\tcolors: effects ? filterEffectsForCFonts(effects) : undefined,\n\t\t})\n\t}\n\n\tpublic renderHint(message: string) {\n\t\treturn this.renderLine(`👨🏫 ${message}`)\n\t}\n\n\tpublic renderLine(\n\t\tmessage: any,\n\t\teffects: GraphicsTextEffect[] = [],\n\t\toptions?: TerminalSpecificOptions\n\t) {\n\t\tlet write: any = chalk\n\t\teffects.forEach((effect) => {\n\t\t\twrite = write[effect]\n\t\t})\n\n\t\tif (options?.eraseBeforeRender) {\n\t\t\tterminal.eraseLine()\n\t\t}\n\n\t\tthis.log(effects.length > 0 ? write(message) : message)\n\t}\n\n\tpublic renderWarning(message: string) {\n\t\tthis.renderLine(`⚠️ ${message}`, [\n\t\t\tGraphicsTextEffect.Bold,\n\t\t\tGraphicsTextEffect.Yellow,\n\t\t])\n\t}\n\n\tpublic async startLoading(message?: string) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tthis.stopLoading()\n\t\tTerminalInterface.loader = ora({\n\t\t\ttext: message,\n\t\t}).start()\n\t}\n\n\tpublic async stopLoading() {\n\t\tTerminalInterface.loader?.stop()\n\t\tTerminalInterface.loader = null\n\t}\n\n\tpublic async confirm(question: string): Promise<boolean> {\n\t\tconst confirmResult = await inquirer.prompt({\n\t\t\ttype: 'confirm',\n\t\t\tname: 'answer',\n\t\t\tmessage: question,\n\t\t})\n\n\t\treturn !!confirmResult.answer\n\t}\n\n\tpublic async waitForEnter(message?: string) {\n\t\tawait this.prompt({\n\t\t\ttype: 'text',\n\t\t\tlabel: `${message ? message + ' ' : ''}${chalk.bgGreenBright.black(\n\t\t\t\t'hit enter'\n\t\t\t)}`,\n\t\t})\n\t\tthis.renderLine('')\n\t\treturn\n\t}\n\n\tpublic clear() {\n\t\tvoid this.stopLoading()\n\t\tconsole.clear()\n\t}\n\n\tpublic renderCodeSample(code: string) {\n\t\ttry {\n\t\t\tconst colored = emphasize.highlight('js', code).value\n\t\t\tthis.renderLine(colored)\n\t\t} catch (err: any) {\n\t\t\tthis.renderWarning(err)\n\t\t}\n\t}\n\n\tpublic async prompt<T extends FieldDefinitions>(\n\t\tdefinition: T\n\t): Promise<FieldDefinitionValueType<T>> {\n\t\tthis.isPromptActive = true\n\t\tconst name = generateInquirerFieldName()\n\t\tconst fieldDefinition: FieldDefinitions = definition\n\t\tconst { defaultValue } = fieldDefinition\n\n\t\tconst promptOptions: Record<string, any> = {\n\t\t\tdefault: defaultValue,\n\t\t\tname,\n\t\t\tmessage: this.generatePromptLabel(fieldDefinition),\n\t\t}\n\n\t\tconst field = FieldFactory.Field('prompt', fieldDefinition)\n\n\t\tpromptOptions.transformer = (value: string) => {\n\t\t\treturn (field as IField<any>).toValueType(value)\n\t\t}\n\n\t\tpromptOptions.validate = (value: string) => {\n\t\t\treturn areSchemaValuesValid(\n\t\t\t\t{\n\t\t\t\t\tid: 'promptvalidateschema',\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tprompt: fieldDefinition,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ prompt: value }\n\t\t\t)\n\t\t\t// return field.validate(value, {}).length === 0\n\t\t}\n\n\t\tswitch (fieldDefinition.type) {\n\t\t\t// Map select options to prompt list choices\n\t\t\tcase 'boolean':\n\t\t\t\tpromptOptions.type = 'confirm'\n\t\t\t\tbreak\n\n\t\t\tcase 'select':\n\t\t\t\tpromptOptions.type = fieldDefinition.isArray ? 'checkbox' : 'list'\n\n\t\t\t\tpromptOptions.choices = fieldDefinition.options.choices.map(\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t(choice) => ({\n\t\t\t\t\t\tname: choice.label,\n\t\t\t\t\t\tvalue: choice.value,\n\t\t\t\t\t\tchecked: _.includes(fieldDefinition.defaultValue, choice.value),\n\t\t\t\t\t})\n\t\t\t\t)\n\n\t\t\t\tbreak\n\t\t\t// Directory select\n\t\t\t// File select\n\t\t\tcase 'directory': {\n\t\t\t\tif (fieldDefinition.isArray) {\n\t\t\t\t\tthrow new SpruceError({\n\t\t\t\t\t\tcode: 'NOT_IMPLEMENTED',\n\t\t\t\t\t\tfriendlyMessage:\n\t\t\t\t\t\t\t'isArray file field not supported, prompt needs to be rewritten with isArray support',\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst dirPath = path.join(\n\t\t\t\t\tfieldDefinition.defaultValue?.path ?? this.cwd,\n\t\t\t\t\t'/'\n\t\t\t\t)\n\n\t\t\t\tpromptOptions.type = 'file'\n\t\t\t\tpromptOptions.root = dirPath\n\t\t\t\tpromptOptions.onlyShowDir = true\n\n\t\t\t\t// Only let people select an actual file\n\t\t\t\tpromptOptions.validate = (value: string) => {\n\t\t\t\t\treturn fs.existsSync(value) && fs.lstatSync(value).isDirectory()\n\t\t\t\t}\n\t\t\t\t// Strip out cwd from the paths while selecting\n\t\t\t\tpromptOptions.transformer = (path: string) => {\n\t\t\t\t\tconst cleanedPath = path.replace(promptOptions.root, '')\n\t\t\t\t\treturn cleanedPath.length === 0 ? promptOptions.root : cleanedPath\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'file': {\n\t\t\t\tif (fieldDefinition.isArray) {\n\t\t\t\t\tthrow new SpruceError({\n\t\t\t\t\t\tcode: 'NOT_IMPLEMENTED',\n\t\t\t\t\t\tfriendlyMessage:\n\t\t\t\t\t\t\t'isArray file field not supported, prompt needs to be rewritten with isArray support',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tconst dirPath = path.join(\n\t\t\t\t\tfieldDefinition.defaultValue?.path ?? this.cwd,\n\t\t\t\t\t'/'\n\t\t\t\t)\n\n\t\t\t\t// Check if directory is empty.\n\t\t\t\tconst files = await globby(`${dirPath}**/*`)\n\n\t\t\t\tif (files.length === 0) {\n\t\t\t\t\tthrow new SpruceError({\n\t\t\t\t\t\tcode: 'DIRECTORY_EMPTY',\n\t\t\t\t\t\tdirectory: dirPath,\n\t\t\t\t\t\tfriendlyMessage: `I wanted to help you select a file, but none exist in ${dirPath}.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tpromptOptions.type = 'file'\n\t\t\t\tpromptOptions.root = dirPath\n\n\t\t\t\t// Only let people select an actual file\n\t\t\t\tpromptOptions.validate = (value: string) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tfs.existsSync(value) &&\n\t\t\t\t\t\t!fs.lstatSync(value).isDirectory() &&\n\t\t\t\t\t\tpath.extname(value) === '.ts'\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\t// Strip out cwd from the paths while selecting\n\t\t\t\tpromptOptions.transformer = (path: string) => {\n\t\t\t\t\tconst cleanedPath = path.replace(promptOptions.root, '')\n\t\t\t\t\treturn cleanedPath.length === 0 ? promptOptions.root : cleanedPath\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Defaults to input\n\t\t\tdefault:\n\t\t\t\tpromptOptions.type = 'input'\n\t\t}\n\n\t\tconst response = (await inquirer.prompt(promptOptions)) as any\n\n\t\tthis.isPromptActive = false\n\n\t\tconst result =\n\t\t\ttypeof response[name] !== 'undefined'\n\t\t\t\t? (field as IField<any>).toValueType(response[name])\n\t\t\t\t: response[name]\n\n\t\treturn result\n\t}\n\tprivate generatePromptLabel(fieldDefinition: FieldDefinitions): any {\n\t\tlet label = fieldDefinition.label\n\n\t\tif (fieldDefinition.hint) {\n\t\t\tlabel = `${label} ${chalk.italic.dim(`(${fieldDefinition.hint})`)}`\n\t\t}\n\n\t\tlabel = label + ': '\n\n\t\treturn label\n\t}\n\n\tpublic renderError(err: Error) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tthis.stopLoading()\n\n\t\tconst message = err.message\n\t\t// Remove message from stack so the message is not doubled up\n\t\tconst stackLines = this.cleanStack(err)\n\t\tthis.renderSection({\n\t\t\theadline: message,\n\t\t\tlines: this.renderStackTraces ? stackLines.splice(0, 100) : undefined,\n\t\t\theadlineEffects: [GraphicsTextEffect.Bold, GraphicsTextEffect.Red],\n\t\t\tdividerEffects: [GraphicsTextEffect.Red],\n\t\t\tbodyEffects: [GraphicsTextEffect.Red],\n\t\t})\n\t}\n\n\tprivate cleanStack(err: Error) {\n\t\tconst message = err.message\n\t\tlet stack = err.stack ? err.stack.replace(message, '') : ''\n\n\t\tif (err instanceof AbstractSpruceError) {\n\t\t\tlet original = err.originalError\n\t\t\twhile (original) {\n\t\t\t\tstack = stack.replace('Error: ' + original.message, '')\n\t\t\t\toriginal = (original as AbstractSpruceError).originalError\n\t\t\t}\n\t\t}\n\n\t\tconst stackLines = stack.split('\\n')\n\n\t\treturn stackLines\n\t}\n\n\tpublic renderProgressBar(options: ProgressBarOptions): void {\n\t\tthis.removeProgressBar()\n\t\tthis.progressBar = terminal.progressBar({\n\t\t\t...options,\n\t\t\tpercent: options.showPercent,\n\t\t\teta: options.showEta,\n\t\t\titems: options.totalItems,\n\t\t\tinline: options.renderInline,\n\t\t})\n\t}\n\n\tpublic removeProgressBar() {\n\t\tif (this.progressBar) {\n\t\t\tthis.progressBar.stop()\n\t\t\tthis.progressBar = null\n\t\t}\n\t}\n\n\tpublic updateProgressBar(options: ProgressBarUpdateOptions): void {\n\t\tif (this.progressBar) {\n\t\t\tthis.progressBar.update({\n\t\t\t\t...options,\n\t\t\t\titems: options.totalItems,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic async renderImage(\n\t\tpath: string,\n\t\toptions?: ImageDimensions\n\t): Promise<void> {\n\t\tconst image = await terminalImage.file(path, options)\n\t\tthis.renderLine(image)\n\t}\n\n\tpublic async getCursorPosition(): Promise<{ x: number; y: number } | null> {\n\t\treturn new Promise((resolve) => {\n\t\t\tterminal.requestCursorLocation()\n\t\t\tterminal.getCursorLocation((err, x, y) => {\n\t\t\t\tresolve(err ? null : { x: x ?? 0, y: y ?? 0 })\n\t\t\t})\n\t\t})\n\t}\n\n\tpublic saveCursor() {\n\t\tterminal.saveCursor()\n\t}\n\n\tpublic restoreCursor() {\n\t\tterminal.restoreCursor()\n\t}\n\n\tpublic moveCursorTo(x: number, y: number): void {\n\t\tterminal.moveTo(x, y)\n\t}\n\n\tpublic clearBelowCursor(): void {\n\t\tterminal.eraseDisplayBelow()\n\t}\n\n\tpublic eraseLine() {\n\t\tterminal.eraseLine()\n\t}\n}\n"],"file":"TerminalInterface.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/interfaces/TerminalInterface.ts"],"names":["terminalImage","require","fieldCount","generateInquirerFieldName","filterEffectsForCFonts","effects","effect","GraphicsTextEffect","SpruceHeader","Reset","Bold","Dim","Italic","Underline","Inverse","Hidden","Strikethrough","Visible","indexOf","TerminalInterface","cwd","renderStackTraces","log","console","bind","Error","lines","forEach","line","renderLine","object","Green","renderDivider","Object","keys","key","chalk","bold","JSON","stringify","options","headline","dividerEffects","headlineEffects","Blue","bodyEffects","renderHeadline","renderLines","renderObject","bar","results","generatedFiles","files","filter","f","action","updatedFiles","skippedFiles","errors","packagesInstalled","renderHero","summaryLines","length","push","renderSection","featuresUtil","generateCommand","featureCode","actionCode","table","Table","head","colWidths","wordWrap","colAligns","sort","one","two","name","pkg","isDev","toString","file","description","namesUtil","toPascal","hints","err","renderError","totalTime","durationUtil","msToFriendly","message","isSpruce","fonts","say","font","align","space","colors","gradient","Red","undefined","write","eraseBeforeRender","terminal","eraseLine","Yellow","stopLoading","loader","text","start","stop","question","inquirer","prompt","type","confirmResult","answer","label","bgGreenBright","black","clear","code","colored","emphasize","highlight","value","renderWarning","definition","isPromptActive","fieldDefinition","defaultValue","promptOptions","generatePromptLabel","field","FieldFactory","Field","transformer","toValueType","validate","id","fields","isArray","choices","map","choice","checked","_","includes","SpruceError","friendlyMessage","dirPath","path","join","root","onlyShowDir","fs","existsSync","lstatSync","isDirectory","cleanedPath","replace","directory","extname","response","result","hint","italic","dim","stackLines","cleanStack","splice","stack","AbstractSpruceError","original","originalError","split","removeProgressBar","progressBar","percent","showPercent","eta","showEta","items","totalItems","inline","renderInline","update","image","Promise","resolve","requestCursorLocation","getCursorLocation","x","y","saveCursor","restoreCursor","moveTo","eraseDisplayBelow","_doesSupportColor","isTTy","process","stdout","isTTY"],"mappings":"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","sourcesContent":["import path from 'path'\nimport AbstractSpruceError from '@sprucelabs/error'\nimport {\n\tFieldFactory,\n\tFieldDefinitionValueType,\n\tareSchemaValuesValid,\n} from '@sprucelabs/schema'\nimport { IField } from '@sprucelabs/schema'\nimport { namesUtil } from '@sprucelabs/spruce-skill-utils'\n// @ts-ignore\nimport fonts from 'cfonts'\nimport chalk from 'chalk'\n// @ts-ignore No definition available\nimport Table from 'cli-table3'\n// @ts-ignore No definition available\nimport emphasize from 'emphasize'\nimport fs from 'fs-extra'\nimport globby from 'globby'\nimport inquirer from 'inquirer'\nimport _ from 'lodash'\nimport { filter } from 'lodash'\nimport ora from 'ora'\nimport { terminal } from 'terminal-kit'\nimport { ProgressBarController } from 'terminal-kit/Terminal'\nimport { FieldDefinitions } from '#spruce/schemas/fields/fields.types'\nimport SpruceError from '../errors/SpruceError'\nimport featuresUtil from '../features/feature.utilities'\nimport { ExecutionResults, GraphicsInterface } from '../types/cli.types'\nimport {\n\tGraphicsTextEffect,\n\tImageDimensions,\n\tProgressBarOptions,\n\tProgressBarUpdateOptions,\n} from '../types/graphicsInterface.types'\nimport durationUtil from '../utilities/duration.utility'\nimport isCi from '../utilities/isCi'\nconst terminalImage = require('terminal-image')\n\nlet fieldCount = 0\nfunction generateInquirerFieldName() {\n\tfieldCount++\n\treturn `field-${fieldCount}`\n}\n\n/** Remove effects cfonts does not support */\nfunction filterEffectsForCFonts(effects: GraphicsTextEffect[]) {\n\treturn filter(\n\t\teffects,\n\t\t(effect) =>\n\t\t\t[\n\t\t\t\tGraphicsTextEffect.SpruceHeader,\n\t\t\t\tGraphicsTextEffect.Reset,\n\t\t\t\tGraphicsTextEffect.Bold,\n\t\t\t\tGraphicsTextEffect.Dim,\n\t\t\t\tGraphicsTextEffect.Italic,\n\t\t\t\tGraphicsTextEffect.Underline,\n\t\t\t\tGraphicsTextEffect.Inverse,\n\t\t\t\tGraphicsTextEffect.Hidden,\n\t\t\t\tGraphicsTextEffect.Strikethrough,\n\t\t\t\tGraphicsTextEffect.Visible,\n\t\t\t].indexOf(effect) === -1\n\t)\n}\n\ntype TerminalSpecificOptions = {\n\teraseBeforeRender?: boolean\n}\n\nexport default class TerminalInterface implements GraphicsInterface {\n\tpublic isPromptActive = false\n\tpublic cwd: string\n\tprivate renderStackTraces = false\n\tprivate static loader?: ora.Ora | null\n\tprivate progressBar: ProgressBarController | null = null\n\tprivate static _doesSupportColor = process?.stdout?.isTTY && !isCi()\n\tprivate log: (...args: any[]) => void\n\n\tpublic constructor(\n\t\tcwd: string,\n\t\trenderStackTraces = false,\n\t\tlog = console.log.bind(console)\n\t) {\n\t\tthis.cwd = cwd\n\t\tthis.renderStackTraces = renderStackTraces\n\t\tthis.log = log\n\t}\n\n\tpublic static doesSupportColor() {\n\t\treturn this._doesSupportColor\n\t}\n\n\tpublic static setDoesSupportColor(isTTy: boolean) {\n\t\tthis._doesSupportColor = isTTy\n\t}\n\n\tpublic async sendInput(): Promise<void> {\n\t\tthrow new Error('sendInput not supported on the TerminalInterface!')\n\t}\n\n\tpublic renderLines(lines: any[], effects?: GraphicsTextEffect[]) {\n\t\tlines.forEach((line) => {\n\t\t\tthis.renderLine(line, effects)\n\t\t})\n\t}\n\n\tpublic renderObject(\n\t\tobject: Record<string, any>,\n\t\teffects: GraphicsTextEffect[] = [GraphicsTextEffect.Green]\n\t) {\n\t\tthis.renderLine('')\n\t\tthis.renderDivider()\n\t\tthis.renderLine('')\n\t\tObject.keys(object).forEach((key) => {\n\t\t\tthis.renderLine(\n\t\t\t\t`${chalk.bold(key)}: ${\n\t\t\t\t\ttypeof object[key] === 'string'\n\t\t\t\t\t\t? object[key]\n\t\t\t\t\t\t: JSON.stringify(object[key])\n\t\t\t\t}`,\n\t\t\t\teffects\n\t\t\t)\n\t\t})\n\t\tthis.renderLine('')\n\t\tthis.renderDivider()\n\t\tthis.renderLine('')\n\t}\n\n\tpublic renderSection(options: {\n\t\theadline?: string\n\t\tlines?: string[]\n\t\tobject?: Record<string, any>\n\t\theadlineEffects?: GraphicsTextEffect[]\n\t\tbodyEffects?: GraphicsTextEffect[]\n\t\tdividerEffects?: GraphicsTextEffect[]\n\t}) {\n\t\tconst {\n\t\t\theadline,\n\t\t\tlines,\n\t\t\tobject,\n\t\t\tdividerEffects = [],\n\t\t\theadlineEffects = [GraphicsTextEffect.Blue, GraphicsTextEffect.Bold],\n\t\t\tbodyEffects = [GraphicsTextEffect.Green],\n\t\t} = options\n\n\t\tif (headline) {\n\t\t\tthis.renderHeadline(`${headline} 🌲🤖`, headlineEffects, dividerEffects)\n\t\t}\n\n\t\tif (lines) {\n\t\t\tthis.renderLines(lines, bodyEffects)\n\n\t\t\tthis.renderLine('')\n\t\t\tthis.renderDivider(dividerEffects)\n\t\t}\n\n\t\tif (object) {\n\t\t\tthis.renderObject(object, bodyEffects)\n\t\t}\n\n\t\tthis.renderLine('')\n\t}\n\n\tpublic renderDivider(effects?: GraphicsTextEffect[]) {\n\t\tconst bar = '=================================================='\n\t\tthis.renderLine(bar, effects)\n\t}\n\n\tpublic renderActionSummary(\n\t\tresults: ExecutionResults & { totalTime?: number }\n\t) {\n\t\tconst generatedFiles =\n\t\t\tresults.files?.filter((f) => f.action === 'generated') ?? []\n\t\tconst updatedFiles =\n\t\t\tresults.files?.filter((f) => f.action === 'updated') ?? []\n\t\tconst skippedFiles =\n\t\t\tresults.files?.filter((f) => f.action === 'skipped') ?? []\n\n\t\tconst errors = results.errors ?? []\n\t\tconst packagesInstalled = results.packagesInstalled ?? []\n\n\t\tthis.renderHero(`${results.headline}`)\n\n\t\tlet summaryLines: string[] = [\n\t\t\terrors.length > 0 ? `Errors: ${errors.length}` : null,\n\t\t\tgeneratedFiles.length > 0\n\t\t\t\t? `Generated files: ${generatedFiles.length}`\n\t\t\t\t: null,\n\t\t\tupdatedFiles.length > 0 ? `Updated files: ${updatedFiles.length}` : null,\n\t\t\tskippedFiles.length > 0 ? `Skipped files: ${skippedFiles.length}` : null,\n\t\t\tpackagesInstalled.length > 0\n\t\t\t\t? `NPM packages installed: ${packagesInstalled.length}`\n\t\t\t\t: null,\n\t\t\t...(results.summaryLines ?? []),\n\t\t].filter((line) => !!line) as string[]\n\n\t\tif (summaryLines.length === 0) {\n\t\t\tsummaryLines.push('Nothing to report!')\n\t\t}\n\t\tthis.renderSection({\n\t\t\theadline: `${featuresUtil.generateCommand(\n\t\t\t\tresults.featureCode,\n\t\t\t\tresults.actionCode\n\t\t\t)} summary`,\n\t\t\tlines: summaryLines,\n\t\t})\n\n\t\tif (packagesInstalled.length > 0) {\n\t\t\tconst table = new Table({\n\t\t\t\thead: ['Name', 'Dev'],\n\t\t\t\tcolWidths: [40, 5],\n\t\t\t\twordWrap: true,\n\t\t\t\tcolAligns: ['left', 'center'],\n\t\t\t})\n\t\t\tpackagesInstalled\n\t\t\t\t.sort((one, two) => (one.name > two.name ? 1 : -1))\n\t\t\t\t.forEach((pkg) => {\n\t\t\t\t\ttable.push([pkg.name, pkg.isDev ? '√' : ''])\n\t\t\t\t})\n\n\t\t\tthis.renderSection({\n\t\t\t\theadline: `NPM packages summary`,\n\t\t\t\tlines: [table.toString()],\n\t\t\t})\n\t\t}\n\n\t\tfor (let files of [generatedFiles, updatedFiles]) {\n\t\t\tif (files.length > 0) {\n\t\t\t\tconst table = new Table({\n\t\t\t\t\thead: ['File', 'Description'],\n\t\t\t\t\twordWrap: true,\n\t\t\t\t})\n\n\t\t\t\tfiles = files.sort()\n\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\ttable.push([file.name, file.description ?? ''])\n\t\t\t\t}\n\n\t\t\t\tthis.renderSection({\n\t\t\t\t\theadline: `${namesUtil.toPascal(files[0].action)} file summary`,\n\t\t\t\t\tlines: [table.toString()],\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (results.hints) {\n\t\t\tthis.renderSection({\n\t\t\t\theadline: 'Read below 👇',\n\t\t\t\tlines: results.hints,\n\t\t\t})\n\t\t}\n\n\t\tif (errors.length > 0) {\n\t\t\tthis.renderHeadline('Errors')\n\t\t\terrors.forEach((err) => this.renderError(err))\n\t\t}\n\n\t\tif (results.totalTime) {\n\t\t\tthis.renderLine(\n\t\t\t\t`Total time: ${durationUtil.msToFriendly(results.totalTime)}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic renderHeadline(\n\t\tmessage: string,\n\t\teffects: GraphicsTextEffect[] = [\n\t\t\tGraphicsTextEffect.Blue,\n\t\t\tGraphicsTextEffect.Bold,\n\t\t],\n\t\tdividerEffects: GraphicsTextEffect[] = []\n\t) {\n\t\tconst isSpruce = effects.indexOf(GraphicsTextEffect.SpruceHeader) > -1\n\n\t\tif (isSpruce) {\n\t\t\tfonts.say(message, {\n\t\t\t\tfont: GraphicsTextEffect.SpruceHeader,\n\t\t\t\talign: 'left',\n\t\t\t\tspace: false,\n\t\t\t\tcolors: filterEffectsForCFonts(effects),\n\t\t\t})\n\t\t} else {\n\t\t\tthis.renderDivider(dividerEffects)\n\t\t\tthis.renderLine(message, effects)\n\t\t\tthis.renderDivider(dividerEffects)\n\t\t\tthis.renderLine('')\n\t\t}\n\t}\n\n\tpublic renderHero(message: string, effects?: GraphicsTextEffect[]) {\n\t\tfonts.say(message, {\n\t\t\t// Font: 'tiny',\n\t\t\talign: 'left',\n\t\t\tgradient: [GraphicsTextEffect.Red, GraphicsTextEffect.Blue],\n\t\t\tcolors: effects ? filterEffectsForCFonts(effects) : undefined,\n\t\t})\n\t}\n\n\tpublic renderHint(message: string) {\n\t\treturn this.renderLine(`👨🏫 ${message}`)\n\t}\n\n\tpublic renderLine(\n\t\tmessage: any,\n\t\teffects: GraphicsTextEffect[] = [],\n\t\toptions?: TerminalSpecificOptions\n\t) {\n\t\tlet write: any = chalk\n\t\teffects.forEach((effect) => {\n\t\t\twrite = write[effect]\n\t\t})\n\n\t\tif (options?.eraseBeforeRender) {\n\t\t\tterminal.eraseLine()\n\t\t}\n\n\t\tthis.log(effects.length > 0 ? write(message) : message)\n\t}\n\n\tpublic renderWarning(message: string) {\n\t\tthis.renderLine(`⚠️ ${message}`, [\n\t\t\tGraphicsTextEffect.Bold,\n\t\t\tGraphicsTextEffect.Yellow,\n\t\t])\n\t}\n\n\tpublic async startLoading(message?: string) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tthis.stopLoading()\n\t\tTerminalInterface.loader = ora({\n\t\t\ttext: message,\n\t\t}).start()\n\t}\n\n\tpublic async stopLoading() {\n\t\tTerminalInterface.loader?.stop()\n\t\tTerminalInterface.loader = null\n\t}\n\n\tpublic async confirm(question: string): Promise<boolean> {\n\t\tconst confirmResult = await inquirer.prompt({\n\t\t\ttype: 'confirm',\n\t\t\tname: 'answer',\n\t\t\tmessage: question,\n\t\t})\n\n\t\treturn !!confirmResult.answer\n\t}\n\n\tpublic async waitForEnter(message?: string) {\n\t\tawait this.prompt({\n\t\t\ttype: 'text',\n\t\t\tlabel: `${message ? message + ' ' : ''}${chalk.bgGreenBright.black(\n\t\t\t\t'hit enter'\n\t\t\t)}`,\n\t\t})\n\t\tthis.renderLine('')\n\t\treturn\n\t}\n\n\tpublic clear() {\n\t\tvoid this.stopLoading()\n\t\tconsole.clear()\n\t}\n\n\tpublic renderCodeSample(code: string) {\n\t\ttry {\n\t\t\tconst colored = emphasize.highlight('js', code).value\n\t\t\tthis.renderLine(colored)\n\t\t} catch (err: any) {\n\t\t\tthis.renderWarning(err)\n\t\t}\n\t}\n\n\tpublic async prompt<T extends FieldDefinitions>(\n\t\tdefinition: T\n\t): Promise<FieldDefinitionValueType<T>> {\n\t\tthis.isPromptActive = true\n\t\tconst name = generateInquirerFieldName()\n\t\tconst fieldDefinition: FieldDefinitions = definition\n\t\tconst { defaultValue } = fieldDefinition\n\n\t\tconst promptOptions: Record<string, any> = {\n\t\t\tdefault: defaultValue,\n\t\t\tname,\n\t\t\tmessage: this.generatePromptLabel(fieldDefinition),\n\t\t}\n\n\t\tconst field = FieldFactory.Field('prompt', fieldDefinition)\n\n\t\tpromptOptions.transformer = (value: string) => {\n\t\t\treturn (field as IField<any>).toValueType(value)\n\t\t}\n\n\t\tpromptOptions.validate = (value: string) => {\n\t\t\treturn areSchemaValuesValid(\n\t\t\t\t{\n\t\t\t\t\tid: 'promptvalidateschema',\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tprompt: fieldDefinition,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ prompt: value }\n\t\t\t)\n\t\t\t// return field.validate(value, {}).length === 0\n\t\t}\n\n\t\tswitch (fieldDefinition.type) {\n\t\t\t// Map select options to prompt list choices\n\t\t\tcase 'boolean':\n\t\t\t\tpromptOptions.type = 'confirm'\n\t\t\t\tbreak\n\n\t\t\tcase 'select':\n\t\t\t\tpromptOptions.type = fieldDefinition.isArray ? 'checkbox' : 'list'\n\n\t\t\t\tpromptOptions.choices = fieldDefinition.options.choices.map(\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t(choice) => ({\n\t\t\t\t\t\tname: choice.label,\n\t\t\t\t\t\tvalue: choice.value,\n\t\t\t\t\t\tchecked: _.includes(fieldDefinition.defaultValue, choice.value),\n\t\t\t\t\t})\n\t\t\t\t)\n\n\t\t\t\tbreak\n\t\t\t// Directory select\n\t\t\t// File select\n\t\t\tcase 'directory': {\n\t\t\t\tif (fieldDefinition.isArray) {\n\t\t\t\t\tthrow new SpruceError({\n\t\t\t\t\t\tcode: 'NOT_IMPLEMENTED',\n\t\t\t\t\t\tfriendlyMessage:\n\t\t\t\t\t\t\t'isArray file field not supported, prompt needs to be rewritten with isArray support',\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst dirPath = path.join(\n\t\t\t\t\tfieldDefinition.defaultValue?.path ?? this.cwd,\n\t\t\t\t\t'/'\n\t\t\t\t)\n\n\t\t\t\tpromptOptions.type = 'file'\n\t\t\t\tpromptOptions.root = dirPath\n\t\t\t\tpromptOptions.onlyShowDir = true\n\n\t\t\t\t// Only let people select an actual file\n\t\t\t\tpromptOptions.validate = (value: string) => {\n\t\t\t\t\treturn fs.existsSync(value) && fs.lstatSync(value).isDirectory()\n\t\t\t\t}\n\t\t\t\t// Strip out cwd from the paths while selecting\n\t\t\t\tpromptOptions.transformer = (path: string) => {\n\t\t\t\t\tconst cleanedPath = path.replace(promptOptions.root, '')\n\t\t\t\t\treturn cleanedPath.length === 0 ? promptOptions.root : cleanedPath\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'file': {\n\t\t\t\tif (fieldDefinition.isArray) {\n\t\t\t\t\tthrow new SpruceError({\n\t\t\t\t\t\tcode: 'NOT_IMPLEMENTED',\n\t\t\t\t\t\tfriendlyMessage:\n\t\t\t\t\t\t\t'isArray file field not supported, prompt needs to be rewritten with isArray support',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tconst dirPath = path.join(\n\t\t\t\t\tfieldDefinition.defaultValue?.path ?? this.cwd,\n\t\t\t\t\t'/'\n\t\t\t\t)\n\n\t\t\t\t// Check if directory is empty.\n\t\t\t\tconst files = await globby(`${dirPath}**/*`)\n\n\t\t\t\tif (files.length === 0) {\n\t\t\t\t\tthrow new SpruceError({\n\t\t\t\t\t\tcode: 'DIRECTORY_EMPTY',\n\t\t\t\t\t\tdirectory: dirPath,\n\t\t\t\t\t\tfriendlyMessage: `I wanted to help you select a file, but none exist in ${dirPath}.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tpromptOptions.type = 'file'\n\t\t\t\tpromptOptions.root = dirPath\n\n\t\t\t\t// Only let people select an actual file\n\t\t\t\tpromptOptions.validate = (value: string) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tfs.existsSync(value) &&\n\t\t\t\t\t\t!fs.lstatSync(value).isDirectory() &&\n\t\t\t\t\t\tpath.extname(value) === '.ts'\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\t// Strip out cwd from the paths while selecting\n\t\t\t\tpromptOptions.transformer = (path: string) => {\n\t\t\t\t\tconst cleanedPath = path.replace(promptOptions.root, '')\n\t\t\t\t\treturn cleanedPath.length === 0 ? promptOptions.root : cleanedPath\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Defaults to input\n\t\t\tdefault:\n\t\t\t\tpromptOptions.type = 'input'\n\t\t}\n\n\t\tconst response = (await inquirer.prompt(promptOptions)) as any\n\n\t\tthis.isPromptActive = false\n\n\t\tconst result =\n\t\t\ttypeof response[name] !== 'undefined'\n\t\t\t\t? (field as IField<any>).toValueType(response[name])\n\t\t\t\t: response[name]\n\n\t\treturn result\n\t}\n\tprivate generatePromptLabel(fieldDefinition: FieldDefinitions): any {\n\t\tlet label = fieldDefinition.label\n\n\t\tif (fieldDefinition.hint) {\n\t\t\tlabel = `${label} ${chalk.italic.dim(`(${fieldDefinition.hint})`)}`\n\t\t}\n\n\t\tlabel = label + ': '\n\n\t\treturn label\n\t}\n\n\tpublic renderError(err: Error) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tthis.stopLoading()\n\n\t\tconst message = err.message\n\t\t// Remove message from stack so the message is not doubled up\n\t\tconst stackLines = this.cleanStack(err)\n\t\tthis.renderSection({\n\t\t\theadline: message,\n\t\t\tlines: this.renderStackTraces ? stackLines.splice(0, 100) : undefined,\n\t\t\theadlineEffects: [GraphicsTextEffect.Bold, GraphicsTextEffect.Red],\n\t\t\tdividerEffects: [GraphicsTextEffect.Red],\n\t\t\tbodyEffects: [GraphicsTextEffect.Red],\n\t\t})\n\t}\n\n\tprivate cleanStack(err: Error) {\n\t\tconst message = err.message\n\t\tlet stack = err.stack ? err.stack.replace(message, '') : ''\n\n\t\tif (err instanceof AbstractSpruceError) {\n\t\t\tlet original = err.originalError\n\t\t\twhile (original) {\n\t\t\t\tstack = stack.replace('Error: ' + original.message, '')\n\t\t\t\toriginal = (original as AbstractSpruceError).originalError\n\t\t\t}\n\t\t}\n\n\t\tconst stackLines = stack.split('\\n')\n\n\t\treturn stackLines\n\t}\n\n\tpublic renderProgressBar(options: ProgressBarOptions): void {\n\t\tthis.removeProgressBar()\n\t\tthis.progressBar = terminal.progressBar({\n\t\t\t...options,\n\t\t\tpercent: options.showPercent,\n\t\t\teta: options.showEta,\n\t\t\titems: options.totalItems,\n\t\t\tinline: options.renderInline,\n\t\t})\n\t}\n\n\tpublic removeProgressBar() {\n\t\tif (this.progressBar) {\n\t\t\tthis.progressBar.stop()\n\t\t\tthis.progressBar = null\n\t\t}\n\t}\n\n\tpublic updateProgressBar(options: ProgressBarUpdateOptions): void {\n\t\tif (this.progressBar) {\n\t\t\tthis.progressBar.update({\n\t\t\t\t...options,\n\t\t\t\titems: options.totalItems,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic async renderImage(\n\t\tpath: string,\n\t\toptions?: ImageDimensions\n\t): Promise<void> {\n\t\tconst image = await terminalImage.file(path, options)\n\t\tthis.renderLine(image)\n\t}\n\n\tpublic async getCursorPosition(): Promise<{ x: number; y: number } | null> {\n\t\treturn new Promise((resolve) => {\n\t\t\tterminal.requestCursorLocation()\n\t\t\tterminal.getCursorLocation((err, x, y) => {\n\t\t\t\tresolve(err ? null : { x: x ?? 0, y: y ?? 0 })\n\t\t\t})\n\t\t})\n\t}\n\n\tpublic saveCursor() {\n\t\tterminal.saveCursor()\n\t}\n\n\tpublic restoreCursor() {\n\t\tterminal.restoreCursor()\n\t}\n\n\tpublic moveCursorTo(x: number, y: number): void {\n\t\tterminal.moveTo(x, y)\n\t}\n\n\tpublic clearBelowCursor(): void {\n\t\tterminal.eraseDisplayBelow()\n\t}\n\n\tpublic eraseLine() {\n\t\tterminal.eraseLine()\n\t}\n}\n"],"file":"TerminalInterface.js"}
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
]
|
|
18
18
|
},
|
|
19
19
|
"license": "MIT",
|
|
20
|
-
"version": "14.24.
|
|
20
|
+
"version": "14.24.6",
|
|
21
21
|
"bin": {
|
|
22
22
|
"spruce": "./build/index.js"
|
|
23
23
|
},
|
|
@@ -71,23 +71,23 @@
|
|
|
71
71
|
"watch.tsc": "tsc -w --sourceMap"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@babel/cli": "^7.
|
|
75
|
-
"@babel/plugin-proposal-decorators": "^7.
|
|
76
|
-
"@babel/runtime": "^7.
|
|
74
|
+
"@babel/cli": "^7.16.0",
|
|
75
|
+
"@babel/plugin-proposal-decorators": "^7.16.0",
|
|
76
|
+
"@babel/runtime": "^7.16.0",
|
|
77
77
|
"@jest/reporters": "^27.3.1",
|
|
78
|
-
"@sprucelabs/error": "^5.0.
|
|
79
|
-
"@sprucelabs/heartwood-view-controllers": "^35.1.
|
|
80
|
-
"@sprucelabs/jest-json-reporter": "^6.0.
|
|
81
|
-
"@sprucelabs/mercury-client": "^16.13.
|
|
82
|
-
"@sprucelabs/mercury-event-emitter": "^16.13.
|
|
83
|
-
"@sprucelabs/mercury-types": "^26.1.
|
|
84
|
-
"@sprucelabs/schema": "^25.3.
|
|
85
|
-
"@sprucelabs/spruce-core-schemas": "^22.5.
|
|
86
|
-
"@sprucelabs/spruce-event-plugin": "^
|
|
87
|
-
"@sprucelabs/spruce-event-utils": "^16.0.
|
|
88
|
-
"@sprucelabs/spruce-skill-booter": "^
|
|
89
|
-
"@sprucelabs/spruce-skill-utils": "^
|
|
90
|
-
"@sprucelabs/spruce-templates": "^14.24.
|
|
78
|
+
"@sprucelabs/error": "^5.0.265",
|
|
79
|
+
"@sprucelabs/heartwood-view-controllers": "^35.1.75",
|
|
80
|
+
"@sprucelabs/jest-json-reporter": "^6.0.227",
|
|
81
|
+
"@sprucelabs/mercury-client": "^16.13.231",
|
|
82
|
+
"@sprucelabs/mercury-event-emitter": "^16.13.231",
|
|
83
|
+
"@sprucelabs/mercury-types": "^26.1.676",
|
|
84
|
+
"@sprucelabs/schema": "^25.3.439",
|
|
85
|
+
"@sprucelabs/spruce-core-schemas": "^22.5.606",
|
|
86
|
+
"@sprucelabs/spruce-event-plugin": "^7.1.4",
|
|
87
|
+
"@sprucelabs/spruce-event-utils": "^16.0.706",
|
|
88
|
+
"@sprucelabs/spruce-skill-booter": "^7.1.4",
|
|
89
|
+
"@sprucelabs/spruce-skill-utils": "^22.0.9",
|
|
90
|
+
"@sprucelabs/spruce-templates": "^14.24.6",
|
|
91
91
|
"cfonts": "^2.10.0",
|
|
92
92
|
"chalk": "^4.1.2",
|
|
93
93
|
"chokidar": "^3.5.2",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"globby": "^11.0.4",
|
|
101
101
|
"inflection": "^1.13.1",
|
|
102
102
|
"inquirer": "^8.2.0",
|
|
103
|
-
"inquirer-file-tree-selection-prompt": "^1.0.
|
|
103
|
+
"inquirer-file-tree-selection-prompt": "^1.0.13",
|
|
104
104
|
"js-tetris-cli": "^0.0.3",
|
|
105
105
|
"jsonwebtoken": "^8.5.1",
|
|
106
106
|
"lodash-es": "^4.17.21",
|
|
@@ -116,16 +116,16 @@
|
|
|
116
116
|
"uuid": "^8.3.2"
|
|
117
117
|
},
|
|
118
118
|
"devDependencies": {
|
|
119
|
-
"@sprucelabs/data-stores": "^
|
|
120
|
-
"@sprucelabs/jest-sheets-reporter": "^1.2.
|
|
121
|
-
"@sprucelabs/mercury-core-events": "^1.3.
|
|
122
|
-
"@sprucelabs/resolve-path-aliases": "^1.0.
|
|
123
|
-
"@sprucelabs/spruce-conversation-plugin": "^
|
|
124
|
-
"@sprucelabs/spruce-deploy-plugin": "^
|
|
125
|
-
"@sprucelabs/spruce-store-plugin": "^
|
|
126
|
-
"@sprucelabs/spruce-test-fixtures": "^
|
|
127
|
-
"@sprucelabs/test": "^7.7.
|
|
128
|
-
"@sprucelabs/test-utils": "^3.0.
|
|
119
|
+
"@sprucelabs/data-stores": "^7.0.3",
|
|
120
|
+
"@sprucelabs/jest-sheets-reporter": "^1.2.232",
|
|
121
|
+
"@sprucelabs/mercury-core-events": "^1.3.108",
|
|
122
|
+
"@sprucelabs/resolve-path-aliases": "^1.0.221",
|
|
123
|
+
"@sprucelabs/spruce-conversation-plugin": "^7.1.4",
|
|
124
|
+
"@sprucelabs/spruce-deploy-plugin": "^7.1.4",
|
|
125
|
+
"@sprucelabs/spruce-store-plugin": "^7.1.4",
|
|
126
|
+
"@sprucelabs/spruce-test-fixtures": "^7.1.4",
|
|
127
|
+
"@sprucelabs/test": "^7.7.214",
|
|
128
|
+
"@sprucelabs/test-utils": "^3.0.240",
|
|
129
129
|
"@types/blessed": "^0.1.19",
|
|
130
130
|
"@types/eslint": "^7.28.2",
|
|
131
131
|
"@types/fs-extra": "^9.0.13",
|
|
@@ -571,7 +571,8 @@
|
|
|
571
571
|
"canAlwaysSkipFiles": "I264",
|
|
572
572
|
"upgradingWritesExpectedFiles": "I289",
|
|
573
573
|
"globalEmitterEmitsSEquentally": "I328",
|
|
574
|
-
"skill.login asks for remote on IS TTY": "I338"
|
|
574
|
+
"skill.login asks for remote on IS TTY": "I338",
|
|
575
|
+
"syncsEventsForSkillsWeveAddedAsDependencies": "I347"
|
|
575
576
|
}
|
|
576
577
|
}
|
|
577
578
|
],
|
|
@@ -592,5 +593,5 @@
|
|
|
592
593
|
"ora"
|
|
593
594
|
]
|
|
594
595
|
},
|
|
595
|
-
"gitHead": "
|
|
596
|
+
"gitHead": "767062fd7b4042cdb2a68191cbf184a35c27f03b"
|
|
596
597
|
}
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
} from '@sprucelabs/spruce-event-utils'
|
|
5
5
|
import { namesUtil, versionUtil } from '@sprucelabs/spruce-skill-utils'
|
|
6
6
|
import { test, assert } from '@sprucelabs/test'
|
|
7
|
-
import EventStore from '../../features/event/stores/EventStore'
|
|
8
7
|
import AbstractEventTest from '../../tests/AbstractEventTest'
|
|
9
8
|
|
|
10
9
|
const EVENT_NAME_READABLE = 'did book appointment'
|
|
@@ -20,7 +19,7 @@ export default class RegisteringEventsOnBootTest extends AbstractEventTest {
|
|
|
20
19
|
)
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
@test
|
|
22
|
+
@test()
|
|
24
23
|
protected static async registeringEventsOnBoot() {
|
|
25
24
|
const { skill2, currentSkill } =
|
|
26
25
|
await this.seedDummySkillRegisterCurrentSkillAndInstallToOrg()
|
|
@@ -42,8 +41,6 @@ export default class RegisteringEventsOnBootTest extends AbstractEventTest {
|
|
|
42
41
|
apiKey: skill2.apiKey,
|
|
43
42
|
})
|
|
44
43
|
|
|
45
|
-
EventStore.clearCache()
|
|
46
|
-
|
|
47
44
|
const contractResults = await this.Store('event', {
|
|
48
45
|
apiClientFactory: async () => client,
|
|
49
46
|
}).fetchEventContracts()
|
|
@@ -64,25 +61,25 @@ export default class RegisteringEventsOnBootTest extends AbstractEventTest {
|
|
|
64
61
|
const namespace = namesUtil.toPascal(currentSkill.slug)
|
|
65
62
|
const sig = eventContractUtil.getSignatureByName(contracts[1], name)
|
|
66
63
|
|
|
67
|
-
assert.doesInclude(sig, {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
64
|
+
assert.doesInclude(sig.emitPayloadSchema, {
|
|
65
|
+
id: 'didBookAppointmentEmitTargetAndPayload',
|
|
66
|
+
version,
|
|
67
|
+
namespace,
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
assert.doesInclude(sig.responsePayloadSchema, {
|
|
71
|
+
id: 'myFantasticallyAmazingEventResponsePayload',
|
|
72
|
+
version,
|
|
73
|
+
namespace,
|
|
74
|
+
})
|
|
75
|
+
assert.doesInclude(sig.emitPermissionContract, {
|
|
76
|
+
id: 'myFantasticallyAmazingEventEmitPermissions',
|
|
77
|
+
name: 'my fantastically amazing event',
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
assert.doesInclude(sig.listenPermissionContract, {
|
|
81
|
+
id: 'myFantasticallyAmazingEventListenPermissions',
|
|
82
|
+
name: 'my fantastically amazing event',
|
|
86
83
|
})
|
|
87
84
|
}
|
|
88
85
|
}
|