@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.
Files changed (43) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/build/__tests__/behavioral/RegisteringEventsOnBoot.test.js +24 -28
  3. package/build/__tests__/behavioral/RegisteringEventsOnBoot.test.js.map +1 -1
  4. package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.d.ts +1 -1
  5. package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.js +10 -14
  6. package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.js.map +1 -1
  7. package/build/__tests__/behavioral/skill/UpgradingASkill.test.d.ts +1 -1
  8. package/build/__tests__/behavioral/skill/UpgradingASkill.test.js +23 -12
  9. package/build/__tests__/behavioral/skill/UpgradingASkill.test.js.map +1 -1
  10. package/build/__tests__/behavioral/skill/UpgradingASkill2.test.d.ts +1 -1
  11. package/build/__tests__/behavioral/skill/UpgradingASkill2.test.js +20 -10
  12. package/build/__tests__/behavioral/skill/UpgradingASkill2.test.js.map +1 -1
  13. package/build/features/error/ErrorFeature.js.map +1 -1
  14. package/build/features/error/writers/ErrorWriter.js +29 -6
  15. package/build/features/error/writers/ErrorWriter.js.map +1 -1
  16. package/build/features/event/EventFeature.d.ts +3 -1
  17. package/build/features/event/EventFeature.js +46 -29
  18. package/build/features/event/EventFeature.js.map +1 -1
  19. package/build/features/event/stores/EventStore.d.ts +2 -1
  20. package/build/features/event/stores/EventStore.js +33 -22
  21. package/build/features/event/stores/EventStore.js.map +1 -1
  22. package/build/features/node/NodeFeature.d.ts +2 -1
  23. package/build/features/node/NodeFeature.js +86 -34
  24. package/build/features/node/NodeFeature.js.map +1 -1
  25. package/build/features/node/actions/UpgradeAction.js +9 -21
  26. package/build/features/node/actions/UpgradeAction.js.map +1 -1
  27. package/build/features/test/actions/TestAction.js +1 -1
  28. package/build/features/test/actions/TestAction.js.map +1 -1
  29. package/build/interfaces/TerminalInterface.js +7 -7
  30. package/build/interfaces/TerminalInterface.js.map +1 -1
  31. package/package.json +31 -30
  32. package/src/__tests__/behavioral/RegisteringEventsOnBoot.test.ts +20 -23
  33. package/src/__tests__/behavioral/events/KeepingEventsInSync2.test.ts +2 -5
  34. package/src/__tests__/behavioral/skill/UpgradingASkill.test.ts +30 -7
  35. package/src/__tests__/behavioral/skill/UpgradingASkill2.test.ts +10 -1
  36. package/src/features/error/ErrorFeature.ts +2 -0
  37. package/src/features/error/writers/ErrorWriter.ts +3 -1
  38. package/src/features/event/EventFeature.ts +32 -14
  39. package/src/features/event/stores/EventStore.ts +12 -4
  40. package/src/features/node/NodeFeature.ts +34 -1
  41. package/src/features/node/actions/UpgradeAction.ts +2 -11
  42. package/src/features/test/actions/TestAction.ts +4 -1
  43. 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, results;
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.next = 10;
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 15:
115
- _context.prev = 15;
102
+ case 9:
103
+ _context.prev = 9;
116
104
 
117
105
  _InFlightEntertainment["default"].stop();
118
106
 
119
- this.ui.renderHero('Finishing upgrade');
120
- return _context.finish(15);
107
+ this.ui.renderHero('Upgrade');
108
+ return _context.finish(9);
121
109
 
122
- case 19:
110
+ case 13:
123
111
  case "end":
124
112
  return _context.stop();
125
113
  }
126
114
  }
127
- }, _callee, this, [[3,, 15, 19]]);
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","Service","execute","results","summaryLines","actionUtil","mergeActionResults","headline","stop","ui","renderHero","Action","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;AAAA,uBAgBQ,KAAKC,OAAL,CAAa,SAAb,EAAwBC,OAAxB,CAAgC,kBAAhC,CAhBR;;AAAA;AAAA;AAAA,uBAiBQ,KAAKD,OAAL,CAAa,SAAb,EAAwBC,OAAxB,CAAgC,gBAAhC,CAjBR;;AAAA;AAmBMC,gBAAAA,OAnBN,GAmBgB;AACbC,kBAAAA,YAAY,EAAE,CAAC,uBAAD,EAA0B,iBAA1B;AADD,iBAnBhB;AAuBED,gBAAAA,OAAO,GAAGE,mBAAWC,kBAAX,CAA8BH,OAA9B,EAAuCH,iBAAvC,EAA0D;AACnEO,kBAAAA,QAAQ,EAAE;AADyD,iBAA1D,CAAV;AAvBF,iDA2BSJ,OA3BT;;AAAA;AAAA;;AA6BEN,kDAAsBW,IAAtB;;AAEA,qBAAKC,EAAL,CAAQC,UAAR,CAAmB,mBAAnB;AA/BF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;wHAmCA;AAAA;AAAA;AAAA;AAAA;AAAA,kDACQ,KAAKC,MAAL,CAAY,MAAZ,EAAoB,oBAApB,EAA0CT,OAA1C,CAAkD,EAAlD,CADR;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;yGAIA,kBAA4BX,OAA5B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBACwB,KAAKqB,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,EAAEhC,OAAO,CAACI;AADzB,iBAArB,CAhBP;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;EA5C0C6B,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\tawait this.Service('command').execute('yarn clean.build')\n\t\t\tawait this.Service('command').execute('yarn build.dev')\n\n\t\t\tlet results = {\n\t\t\t\tsummaryLines: ['Build folder cleared.', 'Build complete.'],\n\t\t\t}\n\n\t\t\tresults = actionUtil.mergeActionResults(results, dependencyResults, {\n\t\t\t\theadline: 'Upgrade',\n\t\t\t})\n\n\t\t\treturn results\n\t\t} finally {\n\t\t\tInFlightEntertainment.stop()\n\n\t\t\tthis.ui.renderHero('Finishing 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"}
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":"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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 (\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.2",
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.15.7",
75
- "@babel/plugin-proposal-decorators": "^7.15.8",
76
- "@babel/runtime": "^7.15.4",
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.262",
79
- "@sprucelabs/heartwood-view-controllers": "^35.1.7",
80
- "@sprucelabs/jest-json-reporter": "^6.0.225",
81
- "@sprucelabs/mercury-client": "^16.13.192",
82
- "@sprucelabs/mercury-event-emitter": "^16.13.192",
83
- "@sprucelabs/mercury-types": "^26.1.622",
84
- "@sprucelabs/schema": "^25.3.416",
85
- "@sprucelabs/spruce-core-schemas": "^22.5.562",
86
- "@sprucelabs/spruce-event-plugin": "^6.1.1",
87
- "@sprucelabs/spruce-event-utils": "^16.0.641",
88
- "@sprucelabs/spruce-skill-booter": "^6.1.1",
89
- "@sprucelabs/spruce-skill-utils": "^20.6.367",
90
- "@sprucelabs/spruce-templates": "^14.24.2",
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.12",
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": "^6.2.30",
120
- "@sprucelabs/jest-sheets-reporter": "^1.2.230",
121
- "@sprucelabs/mercury-core-events": "^1.3.41",
122
- "@sprucelabs/resolve-path-aliases": "^1.0.220",
123
- "@sprucelabs/spruce-conversation-plugin": "^6.1.1",
124
- "@sprucelabs/spruce-deploy-plugin": "^6.1.1",
125
- "@sprucelabs/spruce-store-plugin": "^6.1.1",
126
- "@sprucelabs/spruce-test-fixtures": "^6.1.1",
127
- "@sprucelabs/test": "^7.7.212",
128
- "@sprucelabs/test-utils": "^3.0.237",
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": "4bb52a45b292d6180b9763bb77b804e7df428c7a"
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.only()
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
- emitPayloadSchema: {
69
- id: 'didBookAppointmentEmitTargetAndPayload',
70
- version,
71
- namespace,
72
- },
73
- responsePayloadSchema: {
74
- id: 'myFantasticallyAmazingEventResponsePayload',
75
- version,
76
- namespace,
77
- },
78
- emitPermissionContract: {
79
- id: 'myFantasticallyAmazingEventEmitPermissions',
80
- name: 'my fantastically amazing event',
81
- },
82
- listenPermissionContract: {
83
- id: 'myFantasticallyAmazingEventListenPermissions',
84
- name: 'my fantastically amazing event',
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
  }