@sprucelabs/spruce-cli 14.29.21 → 14.29.25
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/features/test/TestReporter.js.map +1 -1
- package/build/features/test/actions/TestAction.js.map +1 -1
- package/build/features/view/actions/CreateAction.js +1 -1
- package/build/features/view/actions/CreateAction.js.map +1 -1
- package/build/interfaces/TerminalInterface.d.ts +1 -4
- package/build/interfaces/TerminalInterface.js +4 -1
- package/build/interfaces/TerminalInterface.js.map +1 -1
- package/package.json +38 -38
- package/src/features/test/TestReporter.ts +1 -1
- package/src/features/test/actions/TestAction.ts +1 -1
- package/src/features/view/actions/CreateAction.ts +3 -2
- package/src/interfaces/TerminalInterface.ts +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,38 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [14.29.25](https://github.com/sprucelabsai/spruce-cli-workspace/compare/v14.29.24...v14.29.25) (2022-01-05)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @sprucelabs/spruce-cli
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [14.29.24](https://github.com/sprucelabsai/spruce-cli-workspace/compare/v14.29.23...v14.29.24) (2022-01-05)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @sprucelabs/spruce-cli
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## [14.29.23](https://github.com/sprucelabsai/spruce-cli-workspace/compare/v14.29.22...v14.29.23) (2022-01-05)
|
|
23
|
+
|
|
24
|
+
**Note:** Version bump only for package @sprucelabs/spruce-cli
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## [14.29.22](https://github.com/sprucelabsai/spruce-cli-workspace/compare/v14.29.21...v14.29.22) (2022-01-04)
|
|
31
|
+
|
|
32
|
+
**Note:** Version bump only for package @sprucelabs/spruce-cli
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
6
38
|
## [14.29.21](https://github.com/sprucelabsai/spruce-cli-workspace/compare/v14.29.20...v14.29.21) (2021-12-29)
|
|
7
39
|
|
|
8
40
|
**Note:** Version bump only for package @sprucelabs/spruce-cli
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/features/test/TestReporter.ts"],"names":["TestReporter","options","totalTestFiles","customErrors","cwd","filterPattern","handleRestart","handleStartStop","handleQuit","handleRerunTestFile","handleOpenTestFile","handleFilterChange","handleFilterPatternChange","status","handleToggleDebug","handletoggleStandardWatch","isDebugging","watchMode","handleToggleSmartWatch","errorLogItemGenerator","TestLogItemGenerator","widgetFactory","WidgetFactory","pattern","filterInput","setValue","clearFilterPatternButton","setText","buildPatternButtonText","menu","setTextForItem","durationSec","clearInterval","countDownTimeInterval","undefined","remaining","renderCountdownTime","time","setWatchLabel","setInterval","stopCountdownTimer","setWatchMode","label","isWatching","started","window","Widget","hideCursor","getFrame","width","minWidth","Error","on","handleGlobalKeypress","bind","destroy","handleWindowResize","dropInTopLayout","dropInProgressBar","dropInMenu","dropInBottomLayout","dropInStatusBar","dropInTestLog","dropInFilterControls","updateOrientation","setIsDebugging","setStatus","updateInterval","handleUpdateInterval","frame","height","orientation","parent","left","top","shouldLockWidthWithParent","items","value","handleMenuSelect","updateMenuLabels","closeSelectTestPopup","bottomLayout","updateLayout","setStatusLabel","refreshResults","restartLabel","payload","lastResults","updateLogs","getFocusedWidget","key","process","exit","getChildById","testLog","isScrollEnabled","shouldLockHeightWithParent","handleClickTestLog","testFile","getFileForLine","row","column","dropInSelectTestPopup","selectTestPopup","Math","max","text","open","rerun","cancel","openTestFile","line","getScrollY","testFiles","file","path","c","tests","length","topLayout","bar","progress","buttonWidth","shouldLockRightWithParent","rows","columns","id","statusBar","shouldLockBottomWithParent","backgroundColor","foregroundColor","results","updateProgressBar","percentPassing","generatePercentPassing","percentComplete","generatePercentComplete","setTitle","resultsToLogContents","logContent","errorContent","errorLog","destroyErrorLog","dropInErrorLog","cleanedLog","replace","RegExp","forEach","generateLogItemForFile","generateErrorLogItemForFile","map","err","chalk","red","join","orientationWhenErrorLogWasShown","getRows","addRow","setRowHeight","addColumn","setColumnWidth","rowIdx","columnIdx","cell","shouldAutoScrollWhenAppendingContent","padding","removeColumn","removeRow","totalTestFilesComplete","testsRemaining","generateProgressStats","percent","totalTests","totalPassedTests","totalTime","setLabel","durationUtil","msToFriendly","setProgress","test","duration","floor","isNaN","round","totalPassed","getTotalTestFilesRun","totalSkipped","totalTodo","table","computeCells","draw","resetStartTimes","message","push"],"mappings":"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","sourcesContent":["import chalk from 'chalk'\nimport durationUtil from '../../utilities/duration.utility'\nimport { ButtonWidget } from '../../widgets/types/button.types'\nimport { InputWidget } from '../../widgets/types/input.types'\nimport { LayoutWidget } from '../../widgets/types/layout.types'\nimport { MenuBarWidget } from '../../widgets/types/menuBar.types'\nimport { PopupWidget } from '../../widgets/types/popup.types'\nimport { ProgressBarWidget } from '../../widgets/types/progressBar.types'\nimport { TextWidget } from '../../widgets/types/text.types'\nimport { WindowWidget } from '../../widgets/types/window.types'\nimport WidgetFactory from '../../widgets/WidgetFactory'\nimport { SpruceTestResults, TestRunnerStatus } from './test.types'\nimport TestLogItemGenerator from './TestLogItemGenerator'\n\ninterface TestReporterOptions {\n\thandleStartStop?: () => void\n\thandleRestart?: () => void\n\thandleQuit?: () => void\n\tonRequestOpenTestFile?: () => void\n\thandleRerunTestFile?: (fileName: string) => void\n\thandleOpenTestFile?: (fileName: string) => void\n\thandleFilterPatternChange?: (pattern?: string) => void\n\thandleToggleDebug?: () => void\n\thandletoggleStandardWatch?: () => void\n\thandleToggleSmartWatch?: () => void\n\tfilterPattern?: string\n\tisDebugging?: boolean\n\twatchMode?: WatchMode\n\tstatus?: TestRunnerStatus\n\tcwd?: string\n}\n\ntype TestReporterResults = SpruceTestResults & {\n\tcustomErrors: string[]\n}\n\nexport type TestReporterOrientation = 'landscape' | 'portrait'\nexport type WatchMode = 'off' | 'standard' | 'smart'\n\nexport default class TestReporter {\n\tprivate started = false\n\tprivate table?: any\n\tprivate bar!: ProgressBarWidget\n\tprivate bottomLayout!: LayoutWidget\n\tprivate testLog!: TextWidget\n\tprivate errorLog?: TextWidget\n\tprivate errorLogItemGenerator: TestLogItemGenerator\n\tprivate lastResults: TestReporterResults = {\n\t\ttotalTestFiles: 0,\n\t\tcustomErrors: [],\n\t}\n\tprivate updateInterval?: any\n\tprivate menu!: MenuBarWidget\n\tprivate statusBar!: TextWidget\n\tprivate window!: WindowWidget\n\tprivate widgetFactory: WidgetFactory\n\tprivate selectTestPopup?: PopupWidget\n\tprivate topLayout!: LayoutWidget\n\tprivate filterInput!: InputWidget\n\tprivate filterPattern?: string\n\tprivate clearFilterPatternButton!: ButtonWidget\n\tprivate isDebugging = false\n\tprivate watchMode: WatchMode = 'off'\n\tprivate status: TestRunnerStatus = 'ready'\n\tprivate countDownTimeInterval?: number\n\tprivate cwd: string | undefined\n\tprivate orientation: TestReporterOrientation = 'landscape'\n\n\tprivate handleStartStop?: () => void\n\tprivate handleRestart?: () => void\n\tprivate handleQuit?: () => void\n\tprivate handleRerunTestFile?: (fileName: string) => void\n\tprivate handleFilterChange?: (pattern?: string) => void\n\tprivate handleOpenTestFile?: (testFile: string) => void\n\tprivate handleToggleDebug?: () => void\n\tprivate handletoggleStandardWatch?: () => void\n\tprivate handleToggleSmartWatch?: () => any\n\tprivate minWidth = 50\n\tprivate orientationWhenErrorLogWasShown: TestReporterOrientation = 'landscape'\n\n\tpublic constructor(options?: TestReporterOptions) {\n\t\tthis.cwd = options?.cwd\n\t\tthis.filterPattern = options?.filterPattern\n\t\tthis.handleRestart = options?.handleRestart\n\t\tthis.handleStartStop = options?.handleStartStop\n\t\tthis.handleQuit = options?.handleQuit\n\t\tthis.handleRerunTestFile = options?.handleRerunTestFile\n\t\tthis.handleOpenTestFile = options?.handleOpenTestFile\n\t\tthis.handleFilterChange = options?.handleFilterPatternChange\n\t\tthis.status = options?.status ?? 'ready'\n\t\tthis.handleToggleDebug = options?.handleToggleDebug\n\t\tthis.handletoggleStandardWatch = options?.handletoggleStandardWatch\n\t\tthis.isDebugging = options?.isDebugging ?? false\n\t\tthis.watchMode = options?.watchMode ?? 'off'\n\t\tthis.handleToggleSmartWatch = options?.handleToggleSmartWatch\n\n\t\tthis.errorLogItemGenerator = new TestLogItemGenerator()\n\t\tthis.widgetFactory = new WidgetFactory()\n\t}\n\n\tpublic setFilterPattern(pattern: string | undefined) {\n\t\tthis.filterPattern = pattern\n\t\tthis.filterInput.setValue(pattern ?? '')\n\t\tthis.clearFilterPatternButton.setText(buildPatternButtonText(pattern))\n\t}\n\n\tpublic setIsDebugging(isDebugging: boolean) {\n\t\tthis.menu.setTextForItem(\n\t\t\t'toggleDebug',\n\t\t\t`Debug ^${isDebugging ? 'k' : 'w'}^#^${isDebugging ? 'g' : 'r'}${\n\t\t\t\tisDebugging ? ' • ' : ' • '\n\t\t\t}^`\n\t\t)\n\t\tthis.isDebugging = isDebugging\n\t}\n\n\tpublic startCountdownTimer(durationSec: number) {\n\t\tclearInterval(this.countDownTimeInterval)\n\t\tthis.countDownTimeInterval = undefined\n\n\t\tlet remaining = durationSec\n\n\t\tfunction renderCountdownTime(time: number) {\n\t\t\treturn `Starting ${time} `\n\t\t}\n\n\t\tthis.setWatchLabel(renderCountdownTime(remaining))\n\n\t\tthis.countDownTimeInterval = setInterval(() => {\n\t\t\tremaining--\n\n\t\t\tif (remaining < 0) {\n\t\t\t\tthis.stopCountdownTimer()\n\t\t\t} else {\n\t\t\t\tthis.setWatchLabel(renderCountdownTime(remaining))\n\t\t\t}\n\t\t}, 1000) as any\n\t}\n\n\tpublic stopCountdownTimer() {\n\t\tclearInterval(this.countDownTimeInterval)\n\t\tthis.countDownTimeInterval = undefined\n\t\tthis.setWatchMode(this.watchMode)\n\t}\n\n\tpublic setWatchMode(watchMode: WatchMode) {\n\t\tthis.watchMode = watchMode\n\t\tif (!this.countDownTimeInterval) {\n\t\t\tlet label = watchMode === 'smart' ? 'Smart Watch' : 'Standard Watch'\n\t\t\tif (watchMode === 'off') {\n\t\t\t\tlabel = 'Not Watching'\n\t\t\t}\n\t\t\tthis.setWatchLabel(label)\n\t\t}\n\t}\n\n\tprivate setWatchLabel(label: string) {\n\t\tconst isWatching = this.watchMode !== 'off'\n\n\t\tthis.menu.setTextForItem(\n\t\t\t'watchDropdown',\n\t\t\t`${label} ^${isWatching ? 'k' : 'w'}^#^${isWatching ? 'g' : 'r'}${\n\t\t\t\tisWatching ? ' • ' : ' • '\n\t\t\t}^`\n\t\t)\n\n\t\tthis.menu.setTextForItem(\n\t\t\t'toggleStandardWatch',\n\t\t\tthis.watchMode === 'standard' ? '√ Standard' : 'Standard'\n\t\t)\n\n\t\tthis.menu.setTextForItem(\n\t\t\t'toggleSmartWatch',\n\t\t\tthis.watchMode === 'smart' ? '√ Smart' : 'Smart'\n\t\t)\n\t}\n\n\tpublic async start() {\n\t\tthis.started = true\n\n\t\tthis.window = this.widgetFactory.Widget('window', {})\n\t\tthis.window.hideCursor()\n\n\t\tconst { width } = this.window.getFrame()\n\t\tif (width < this.minWidth) {\n\t\t\tthrow new Error(\n\t\t\t\t`Your screen must be at least ${this.minWidth} characters wide.`\n\t\t\t)\n\t\t}\n\n\t\tvoid this.window.on('key', this.handleGlobalKeypress.bind(this))\n\t\tvoid this.window.on('kill', this.destroy.bind(this))\n\t\tvoid this.window.on('resize', this.handleWindowResize.bind(this))\n\n\t\tthis.dropInTopLayout()\n\t\tthis.dropInProgressBar()\n\t\tthis.dropInMenu()\n\t\tthis.dropInBottomLayout()\n\t\tthis.dropInStatusBar()\n\t\tthis.dropInTestLog()\n\t\tthis.dropInFilterControls()\n\n\t\tthis.updateOrientation()\n\n\t\tthis.setIsDebugging(this.isDebugging)\n\t\tthis.setWatchMode(this.watchMode)\n\t\tthis.setStatus(this.status)\n\n\t\tthis.updateInterval = setInterval(\n\t\t\tthis.handleUpdateInterval.bind(this),\n\t\t\t1000\n\t\t)\n\t}\n\n\tprivate handleWindowResize() {\n\t\tthis.updateOrientation()\n\t}\n\n\tprivate updateOrientation() {\n\t\tconst frame = this.window.getFrame()\n\n\t\tif (frame.width * 0.5 > frame.height) {\n\t\t\tthis.orientation = 'landscape'\n\t\t} else {\n\t\t\tthis.orientation = 'portrait'\n\t\t}\n\t}\n\n\tprivate dropInMenu() {\n\t\tthis.menu = this.widgetFactory.Widget('menuBar', {\n\t\t\tparent: this.window,\n\t\t\tleft: 0,\n\t\t\ttop: 0,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\titems: [\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Restart ',\n\t\t\t\t\tvalue: 'restart',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Debug ',\n\t\t\t\t\tvalue: 'toggleDebug',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Not Watching ',\n\t\t\t\t\tvalue: 'watchDropdown',\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Watch all',\n\t\t\t\t\t\t\tvalue: 'toggleStandardWatch',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Smart watch',\n\t\t\t\t\t\t\tvalue: 'toggleSmartWatch',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Quit',\n\t\t\t\t\tvalue: 'quit',\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\tvoid this.menu.on('select', this.handleMenuSelect.bind(this))\n\t}\n\n\tpublic setStatus(status: TestRunnerStatus) {\n\t\tthis.status = status\n\n\t\tthis.updateMenuLabels()\n\t\tthis.closeSelectTestPopup()\n\t\tthis.bottomLayout.updateLayout()\n\n\t\tif (status === 'ready') {\n\t\t\tthis.setStatusLabel('Starting...')\n\t\t} else if (this.status === 'stopped') {\n\t\t\tthis.refreshResults()\n\t\t\tthis.setStatusLabel('')\n\t\t} else if (this.status === 'running') {\n\t\t\tthis.setStatusLabel('Running tests...')\n\t\t}\n\t}\n\n\tprivate updateMenuLabels() {\n\t\tlet restartLabel = 'Start ^#^r › ^'\n\t\tswitch (this.status) {\n\t\t\tcase 'running':\n\t\t\t\trestartLabel = 'Stop ^k^#^g › ^'\n\t\t\t\tbreak\n\t\t\tcase 'stopped':\n\t\t\t\trestartLabel = `Start ^w^#^r › ^`\n\t\t\t\tbreak\n\t\t\tcase 'ready':\n\t\t\t\trestartLabel = 'Booting ^#^K › ^'\n\t\t\t\tbreak\n\t\t}\n\n\t\tthis.menu.setTextForItem('restart', restartLabel)\n\t}\n\n\tprivate handleMenuSelect(payload: { value: string }) {\n\t\tswitch (payload.value) {\n\t\t\tcase 'quit':\n\t\t\t\tthis.handleQuit?.()\n\t\t\t\tbreak\n\t\t\tcase 'restart':\n\t\t\t\tthis.handleStartStop?.()\n\t\t\t\tbreak\n\t\t\tcase 'toggleDebug':\n\t\t\t\tthis.handleToggleDebug?.()\n\t\t\t\tbreak\n\t\t\tcase 'toggleStandardWatch':\n\t\t\t\tthis.handletoggleStandardWatch?.()\n\t\t\t\tbreak\n\t\t\tcase 'toggleSmartWatch':\n\t\t\t\tthis.handleToggleSmartWatch?.()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate handleUpdateInterval() {\n\t\tif (this.status !== 'stopped') {\n\t\t\tthis.refreshResults()\n\t\t}\n\t}\n\n\tprivate refreshResults() {\n\t\tif (this.lastResults) {\n\t\t\tthis.updateLogs()\n\t\t}\n\t}\n\n\tprivate async handleGlobalKeypress(payload: { key: string }) {\n\t\tif (this.window.getFocusedWidget() === this.filterInput) {\n\t\t\treturn\n\t\t}\n\n\t\tswitch (payload.key) {\n\t\t\tcase 'ENTER':\n\t\t\t\tthis.handleRestart?.()\n\t\t\t\tbreak\n\t\t\tcase 'CTRL_C':\n\t\t\t\tthis.handleQuit?.()\n\t\t\t\tprocess.exit()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate dropInTestLog() {\n\t\tconst parent = this.bottomLayout.getChildById('results')\n\n\t\tif (parent) {\n\t\t\tthis.testLog = this.widgetFactory.Widget('text', {\n\t\t\t\tparent,\n\t\t\t\tisScrollEnabled: true,\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\theight: '100%',\n\t\t\t\twidth: '100%',\n\t\t\t\tshouldLockHeightWithParent: true,\n\t\t\t\tshouldLockWidthWithParent: true,\n\t\t\t})\n\n\t\t\tvoid this.testLog.on('click', this.handleClickTestLog.bind(this))\n\t\t}\n\t}\n\n\tprivate async handleClickTestLog(payload: { row: number; column: number }) {\n\t\tconst testFile = this.getFileForLine(payload.row)\n\t\tconst { row, column } = payload\n\n\t\tthis.closeSelectTestPopup()\n\n\t\tif (testFile) {\n\t\t\tthis.dropInSelectTestPopup({ testFile, column, row })\n\t\t}\n\t}\n\n\tprivate closeSelectTestPopup() {\n\t\tif (this.selectTestPopup) {\n\t\t\tvoid this.selectTestPopup.destroy()\n\t\t\tthis.selectTestPopup = undefined\n\t\t}\n\t}\n\n\tprivate dropInSelectTestPopup(options: {\n\t\ttestFile: string\n\t\tcolumn: number\n\t\trow: number\n\t}) {\n\t\tconst { testFile, row, column } = options\n\n\t\tthis.selectTestPopup = this.widgetFactory.Widget('popup', {\n\t\t\tparent: this.window,\n\t\t\tleft: Math.max(1, column - 25),\n\t\t\ttop: Math.max(4, row - 2),\n\t\t\twidth: 50,\n\t\t\theight: 10,\n\t\t})\n\n\t\tthis.widgetFactory.Widget('text', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 1,\n\t\t\ttop: 1,\n\t\t\theight: 4,\n\t\t\twidth: this.selectTestPopup.getFrame().width - 2,\n\t\t\ttext: `What do you wanna do with:\\n\\n${testFile}`,\n\t\t})\n\n\t\tconst open = this.widgetFactory.Widget('button', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 1,\n\t\t\ttop: 6,\n\t\t\ttext: 'Open',\n\t\t})\n\n\t\tconst rerun = this.widgetFactory.Widget('button', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 20,\n\t\t\ttop: 6,\n\t\t\ttext: 'Test',\n\t\t})\n\n\t\tconst cancel = this.widgetFactory.Widget('button', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 37,\n\t\t\ttop: 6,\n\t\t\ttext: 'Nevermind',\n\t\t})\n\n\t\tvoid rerun.on('click', () => {\n\t\t\tthis.handleRerunTestFile?.(testFile)\n\t\t\tthis.closeSelectTestPopup()\n\t\t})\n\t\tvoid cancel.on('click', this.closeSelectTestPopup.bind(this))\n\t\tvoid open.on('click', () => {\n\t\t\tthis.openTestFile(testFile)\n\t\t})\n\t}\n\n\tprivate openTestFile(testFile: string) {\n\t\tthis.handleOpenTestFile?.(testFile)\n\t\tthis.closeSelectTestPopup()\n\t}\n\n\tpublic getFileForLine(row: number): string | undefined {\n\t\tlet line = this.testLog.getScrollY()\n\n\t\tfor (let file of this.lastResults.testFiles ?? []) {\n\t\t\tif (line === row) {\n\t\t\t\treturn file.path\n\t\t\t}\n\n\t\t\tline++\n\n\t\t\tfor (let c = 0; c < (file.tests ?? []).length; c++) {\n\t\t\t\tif (line === row) {\n\t\t\t\t\treturn file.path\n\t\t\t\t}\n\n\t\t\t\tline++\n\t\t\t}\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tprivate dropInProgressBar() {\n\t\tconst parent = this.topLayout.getChildById('progress') ?? this.window\n\t\tthis.bar = this.widgetFactory.Widget('progressBar', {\n\t\t\tparent,\n\t\t\tleft: 0,\n\t\t\ttop: 0,\n\t\t\twidth: parent.getFrame().width,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tlabel: 'Ready and waiting...',\n\t\t\tprogress: 0,\n\t\t})\n\t}\n\n\tprivate dropInFilterControls() {\n\t\tconst parent = this.topLayout.getChildById('filter') ?? this.window\n\n\t\tconst buttonWidth = 3\n\t\tthis.filterInput = this.widgetFactory.Widget('input', {\n\t\t\tparent,\n\t\t\tleft: 0,\n\t\t\tlabel: 'Pattern',\n\t\t\twidth: parent.getFrame().width - buttonWidth,\n\t\t\theight: 1,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tvalue: this.filterPattern,\n\t\t})\n\n\t\tvoid this.filterInput.on('cancel', () => {\n\t\t\tthis.filterInput.setValue(this.filterPattern ?? '')\n\t\t})\n\n\t\tvoid this.filterInput.on('submit', (payload) => {\n\t\t\tthis.handleFilterChange?.(payload.value ?? undefined)\n\t\t})\n\n\t\tthis.clearFilterPatternButton = this.widgetFactory.Widget('button', {\n\t\t\tparent,\n\t\t\tleft: this.filterInput.getFrame().width,\n\t\t\twidth: buttonWidth,\n\t\t\ttop: 0,\n\t\t\ttext: buildPatternButtonText(this.filterPattern),\n\t\t\tshouldLockRightWithParent: true,\n\t\t})\n\n\t\tvoid this.clearFilterPatternButton.on('click', () => {\n\t\t\tif (this.filterPattern || this.filterPattern?.length === 0) {\n\t\t\t\tthis.handleFilterChange?.(undefined)\n\t\t\t} else {\n\t\t\t\tthis.filterInput.setValue('')\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate dropInBottomLayout() {\n\t\tthis.bottomLayout = this.widgetFactory.Widget('layout', {\n\t\t\tparent: this.window,\n\t\t\twidth: '100%',\n\t\t\ttop: 4,\n\t\t\theight: this.window.getFrame().height - 5,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tshouldLockHeightWithParent: true,\n\t\t\trows: [\n\t\t\t\t{\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tcolumns: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'results',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t}\n\n\tprivate dropInStatusBar() {\n\t\tthis.statusBar = this.widgetFactory.Widget('text', {\n\t\t\tparent: this.window,\n\t\t\ttop: this.window.getFrame().height - 1,\n\t\t\twidth: '100%',\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tshouldLockBottomWithParent: true,\n\t\t\tbackgroundColor: 'yellow',\n\t\t\tforegroundColor: 'black',\n\t\t\ttext: '...',\n\t\t})\n\t}\n\n\tprivate dropInTopLayout() {\n\t\tthis.topLayout = this.widgetFactory.Widget('layout', {\n\t\t\tparent: this.window,\n\t\t\twidth: '100%',\n\t\t\ttop: 1,\n\t\t\theight: 3,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tshouldLockHeightWithParent: false,\n\t\t\trows: [\n\t\t\t\t{\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tcolumns: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'progress',\n\t\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'filter',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t}\n\n\tpublic updateResults(results: SpruceTestResults) {\n\t\tif (!this.started) {\n\t\t\tthrow new Error('You must call start() before anything else.')\n\t\t}\n\n\t\tthis.lastResults = {\n\t\t\t...this.lastResults,\n\t\t\t...results,\n\t\t}\n\n\t\tthis.updateProgressBar(results)\n\n\t\tconst percentPassing = this.generatePercentPassing(results)\n\t\tconst percentComplete = this.generatePercentComplete(results)\n\n\t\tthis.window.setTitle(\n\t\t\t`Testing: ${percentComplete}% complete.${\n\t\t\t\tpercentComplete > 0 ? ` ${percentPassing}% passing.` : ''\n\t\t\t}`\n\t\t)\n\n\t\tthis.updateLogs()\n\t}\n\n\tprivate updateLogs() {\n\t\tif (this.selectTestPopup) {\n\t\t\treturn\n\t\t}\n\n\t\tlet { logContent, errorContent } = this.resultsToLogContents(\n\t\t\tthis.lastResults\n\t\t)\n\n\t\tthis.testLog.setText(logContent)\n\n\t\tif (!errorContent) {\n\t\t\tthis.errorLog && this.destroyErrorLog()\n\t\t} else {\n\t\t\t!this.errorLog && this.dropInErrorLog()\n\t\t\tconst cleanedLog = this.cwd\n\t\t\t\t? errorContent.replace(new RegExp(this.cwd + '/', 'gim'), '')\n\t\t\t\t: errorContent\n\n\t\t\tthis.errorLog?.setText(cleanedLog)\n\t\t}\n\t}\n\n\tprivate resultsToLogContents(results: SpruceTestResults) {\n\t\tlet logContent = ''\n\t\tlet errorContent = ''\n\n\t\tresults.testFiles?.forEach((file) => {\n\t\t\tlogContent += this.errorLogItemGenerator.generateLogItemForFile(\n\t\t\t\tfile,\n\t\t\t\tthis.status\n\t\t\t)\n\t\t\terrorContent +=\n\t\t\t\tthis.errorLogItemGenerator.generateErrorLogItemForFile(file)\n\t\t})\n\n\t\tif (this.lastResults.customErrors.length > 0) {\n\t\t\terrorContent =\n\t\t\t\tthis.lastResults.customErrors.map((err) => chalk.red(err)).join(`\\n`) +\n\t\t\t\t`\\n${errorContent}`\n\t\t}\n\n\t\treturn { logContent, errorContent }\n\t}\n\n\tprivate dropInErrorLog() {\n\t\tthis.orientationWhenErrorLogWasShown = this.orientation\n\n\t\tif (this.bottomLayout.getRows().length === 1) {\n\t\t\tif (this.orientation === 'portrait') {\n\t\t\t\tthis.bottomLayout.addRow({\n\t\t\t\t\tid: 'row_2',\n\t\t\t\t\tcolumns: [{ id: 'errors', width: '100%' }],\n\t\t\t\t})\n\n\t\t\t\tthis.bottomLayout.setRowHeight(0, '50%')\n\t\t\t\tthis.bottomLayout.setRowHeight(1, '50%')\n\t\t\t} else {\n\t\t\t\tthis.bottomLayout.addColumn(0, { id: 'errors', width: '50%' })\n\t\t\t\tthis.bottomLayout.setColumnWidth({\n\t\t\t\t\trowIdx: 0,\n\t\t\t\t\tcolumnIdx: 0,\n\t\t\t\t\twidth: '50%',\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.bottomLayout.updateLayout()\n\n\t\t\tconst cell = this.bottomLayout.getChildById('errors')\n\n\t\t\tif (!cell) {\n\t\t\t\tthrow new Error('Pulling child error')\n\t\t\t}\n\n\t\t\tthis.errorLog = this.widgetFactory.Widget('text', {\n\t\t\t\tparent: cell,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tisScrollEnabled: true,\n\t\t\t\tshouldAutoScrollWhenAppendingContent: false,\n\t\t\t\tshouldLockHeightWithParent: true,\n\t\t\t\tshouldLockWidthWithParent: true,\n\t\t\t\tpadding: { left: 1 },\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate destroyErrorLog() {\n\t\tif (this.errorLog) {\n\t\t\tvoid this.errorLog?.destroy()\n\t\t\tthis.errorLog = undefined\n\n\t\t\tif (this.orientationWhenErrorLogWasShown === 'landscape') {\n\t\t\t\tthis.bottomLayout.removeColumn(0, 1)\n\t\t\t\tthis.bottomLayout.setColumnWidth({\n\t\t\t\t\trowIdx: 0,\n\t\t\t\t\tcolumnIdx: 0,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tthis.bottomLayout.removeRow(1)\n\t\t\t\tthis.bottomLayout.setRowHeight(0, '100%')\n\t\t\t}\n\t\t\tthis.bottomLayout.updateLayout()\n\t\t}\n\t}\n\n\tprivate updateProgressBar(results: SpruceTestResults) {\n\t\tif (results.totalTestFilesComplete ?? 0 > 0) {\n\t\t\tconst testsRemaining =\n\t\t\t\tresults.totalTestFiles - (results.totalTestFilesComplete ?? 0)\n\n\t\t\tif (testsRemaining === 0) {\n\t\t\t\tconst { percent, totalTests, totalPassedTests, totalTime } =\n\t\t\t\t\tthis.generateProgressStats(results)\n\n\t\t\t\tthis.bar.setLabel(\n\t\t\t\t\t`Finished! ${totalPassedTests} of ${totalTests} (${percent}%) passed in ${durationUtil.msToFriendly(\n\t\t\t\t\t\ttotalTime\n\t\t\t\t\t)}.${percent < 100 ? ` Don't give up! 💪` : ''}`\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthis.bar.setLabel(\n\t\t\t\t\t`${results.totalTestFilesComplete} of ${\n\t\t\t\t\t\tresults.totalTestFiles\n\t\t\t\t\t} (${this.generatePercentComplete(\n\t\t\t\t\t\tresults\n\t\t\t\t\t)}%) complete. ${testsRemaining} remaining...`\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tthis.bar.setLabel('0%')\n\t\t}\n\n\t\tthis.bar.setProgress(this.generatePercentComplete(results) / 100)\n\t}\n\n\tprivate generateProgressStats(results: SpruceTestResults): {\n\t\tpercent: number\n\t\ttotalTests: number\n\t\ttotalPassedTests: number\n\t\ttotalTime: number\n\t} {\n\t\tlet totalTests = 0\n\t\tlet totalPassedTests = 0\n\t\tlet totalTime = 0\n\n\t\tresults.testFiles?.forEach((file) => {\n\t\t\tfile.tests?.forEach((test) => {\n\t\t\t\ttotalTime += test.duration\n\t\t\t\tif (test.status === 'passed') {\n\t\t\t\t\ttotalPassedTests++\n\t\t\t\t}\n\n\t\t\t\tif (test.status === 'passed' || test.status === 'failed') {\n\t\t\t\t\ttotalTests++\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tconst percent = Math.floor((totalPassedTests / totalTests) * 100)\n\t\treturn {\n\t\t\tpercent: percent > 0 ? percent : 0,\n\t\t\ttotalTests,\n\t\t\ttotalPassedTests,\n\t\t\ttotalTime,\n\t\t}\n\t}\n\n\tprivate generatePercentComplete(results: SpruceTestResults): number {\n\t\tconst percent =\n\t\t\t(results.totalTestFilesComplete ?? 0) / results.totalTestFiles\n\t\tif (isNaN(percent)) {\n\t\t\treturn 0\n\t\t}\n\t\treturn Math.round(percent * 100)\n\t}\n\n\tprivate generatePercentPassing(results: SpruceTestResults): number {\n\t\tconst percent =\n\t\t\t(results.totalPassed ?? 0) / this.getTotalTestFilesRun(results)\n\n\t\tif (isNaN(percent)) {\n\t\t\treturn 0\n\t\t}\n\n\t\treturn Math.floor(percent * 100)\n\t}\n\n\tprivate getTotalTestFilesRun(results: SpruceTestResults) {\n\t\treturn (\n\t\t\t(results.totalTests ?? 0) -\n\t\t\t(results.totalSkipped ?? 0) -\n\t\t\t(results.totalTodo ?? 0)\n\t\t)\n\t}\n\n\tpublic render() {\n\t\tthis.table?.computeCells()\n\t\tthis.table?.draw()\n\t}\n\n\tpublic async destroy() {\n\t\tclearInterval(this.updateInterval)\n\t\tawait this.window.destroy()\n\t}\n\n\tpublic reset() {\n\t\tthis.testLog.setText('')\n\t\tthis.lastResults = {\n\t\t\ttotalTestFiles: 0,\n\t\t\tcustomErrors: [],\n\t\t}\n\t\tthis.destroyErrorLog()\n\t\tthis.errorLogItemGenerator.resetStartTimes()\n\t}\n\n\tpublic setStatusLabel(text: string) {\n\t\tthis.statusBar.setText(text)\n\t}\n\n\tpublic appendError(message: string) {\n\t\tthis.lastResults.customErrors.push(message)\n\t}\n}\nfunction buildPatternButtonText(pattern: string | undefined): string {\n\treturn pattern ? ' x ' : ' - '\n}\n"],"file":"TestReporter.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/features/test/TestReporter.ts"],"names":["TestReporter","options","totalTestFiles","customErrors","cwd","filterPattern","handleRestart","handleStartStop","handleQuit","handleRerunTestFile","handleOpenTestFile","handleFilterChange","handleFilterPatternChange","status","handleToggleDebug","handletoggleStandardWatch","isDebugging","watchMode","handleToggleSmartWatch","errorLogItemGenerator","TestLogItemGenerator","widgetFactory","WidgetFactory","pattern","filterInput","setValue","clearFilterPatternButton","setText","buildPatternButtonText","menu","setTextForItem","durationSec","clearInterval","countDownTimeInterval","undefined","remaining","renderCountdownTime","time","setWatchLabel","setInterval","stopCountdownTimer","setWatchMode","label","isWatching","started","window","Widget","hideCursor","getFrame","width","minWidth","Error","on","handleGlobalKeypress","bind","destroy","handleWindowResize","dropInTopLayout","dropInProgressBar","dropInMenu","dropInBottomLayout","dropInStatusBar","dropInTestLog","dropInFilterControls","updateOrientation","setIsDebugging","setStatus","updateInterval","handleUpdateInterval","frame","height","orientation","parent","left","top","shouldLockWidthWithParent","items","value","handleMenuSelect","updateMenuLabels","closeSelectTestPopup","bottomLayout","updateLayout","setStatusLabel","refreshResults","restartLabel","payload","lastResults","updateLogs","getFocusedWidget","key","process","exit","getChildById","testLog","isScrollEnabled","shouldLockHeightWithParent","handleClickTestLog","testFile","getFileForLine","row","column","dropInSelectTestPopup","selectTestPopup","Math","max","text","open","rerun","cancel","openTestFile","line","getScrollY","testFiles","file","path","c","tests","length","topLayout","bar","progress","buttonWidth","shouldLockRightWithParent","rows","columns","id","statusBar","shouldLockBottomWithParent","backgroundColor","foregroundColor","results","updateProgressBar","percentPassing","generatePercentPassing","percentComplete","generatePercentComplete","setTitle","resultsToLogContents","logContent","errorContent","errorLog","destroyErrorLog","dropInErrorLog","cleanedLog","replace","RegExp","forEach","generateLogItemForFile","generateErrorLogItemForFile","map","err","chalk","red","join","orientationWhenErrorLogWasShown","getRows","addRow","setRowHeight","addColumn","setColumnWidth","rowIdx","columnIdx","cell","shouldAutoScrollWhenAppendingContent","padding","removeColumn","removeRow","totalTestFilesComplete","testsRemaining","generateProgressStats","percent","totalTests","totalPassedTests","totalTime","setLabel","durationUtil","msToFriendly","setProgress","test","duration","floor","isNaN","round","totalPassed","getTotalTestFilesRun","totalSkipped","totalTodo","table","computeCells","draw","resetStartTimes","message","push"],"mappings":"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","sourcesContent":["import chalk from 'chalk'\nimport durationUtil from '../../utilities/duration.utility'\nimport { ButtonWidget } from '../../widgets/types/button.types'\nimport { InputWidget } from '../../widgets/types/input.types'\nimport { LayoutWidget } from '../../widgets/types/layout.types'\nimport { MenuBarWidget } from '../../widgets/types/menuBar.types'\nimport { PopupWidget } from '../../widgets/types/popup.types'\nimport { ProgressBarWidget } from '../../widgets/types/progressBar.types'\nimport { TextWidget } from '../../widgets/types/text.types'\nimport { WindowWidget } from '../../widgets/types/window.types'\nimport WidgetFactory from '../../widgets/WidgetFactory'\nimport { SpruceTestResults, TestRunnerStatus } from './test.types'\nimport TestLogItemGenerator from './TestLogItemGenerator'\n\ninterface TestReporterOptions {\n\thandleStartStop?: () => void\n\thandleRestart?: () => void\n\thandleQuit?: () => void\n\tonRequestOpenTestFile?: () => void\n\thandleRerunTestFile?: (fileName: string) => void\n\thandleOpenTestFile?: (fileName: string) => void\n\thandleFilterPatternChange?: (pattern?: string) => void\n\thandleToggleDebug?: () => void\n\thandletoggleStandardWatch?: () => void\n\thandleToggleSmartWatch?: () => void\n\tfilterPattern?: string\n\tisDebugging?: boolean\n\twatchMode?: WatchMode\n\tstatus?: TestRunnerStatus\n\tcwd?: string\n}\n\ntype TestReporterResults = SpruceTestResults & {\n\tcustomErrors: string[]\n}\n\nexport type TestReporterOrientation = 'landscape' | 'portrait'\nexport type WatchMode = 'off' | 'standard' | 'smart'\n\nexport default class TestReporter {\n\tprivate started = false\n\tprivate table?: any\n\tprivate bar!: ProgressBarWidget\n\tprivate bottomLayout!: LayoutWidget\n\tprivate testLog!: TextWidget\n\tprivate errorLog?: TextWidget\n\tprivate errorLogItemGenerator: TestLogItemGenerator\n\tprivate lastResults: TestReporterResults = {\n\t\ttotalTestFiles: 0,\n\t\tcustomErrors: [],\n\t}\n\tprivate updateInterval?: any\n\tprivate menu!: MenuBarWidget\n\tprivate statusBar!: TextWidget\n\tprivate window!: WindowWidget\n\tprivate widgetFactory: WidgetFactory\n\tprivate selectTestPopup?: PopupWidget\n\tprivate topLayout!: LayoutWidget\n\tprivate filterInput!: InputWidget\n\tprivate filterPattern?: string\n\tprivate clearFilterPatternButton!: ButtonWidget\n\tprivate isDebugging = false\n\tprivate watchMode: WatchMode = 'off'\n\tprivate status: TestRunnerStatus = 'ready'\n\tprivate countDownTimeInterval?: any\n\tprivate cwd: string | undefined\n\tprivate orientation: TestReporterOrientation = 'landscape'\n\n\tprivate handleStartStop?: () => void\n\tprivate handleRestart?: () => void\n\tprivate handleQuit?: () => void\n\tprivate handleRerunTestFile?: (fileName: string) => void\n\tprivate handleFilterChange?: (pattern?: string) => void\n\tprivate handleOpenTestFile?: (testFile: string) => void\n\tprivate handleToggleDebug?: () => void\n\tprivate handletoggleStandardWatch?: () => void\n\tprivate handleToggleSmartWatch?: () => any\n\tprivate minWidth = 50\n\tprivate orientationWhenErrorLogWasShown: TestReporterOrientation = 'landscape'\n\n\tpublic constructor(options?: TestReporterOptions) {\n\t\tthis.cwd = options?.cwd\n\t\tthis.filterPattern = options?.filterPattern\n\t\tthis.handleRestart = options?.handleRestart\n\t\tthis.handleStartStop = options?.handleStartStop\n\t\tthis.handleQuit = options?.handleQuit\n\t\tthis.handleRerunTestFile = options?.handleRerunTestFile\n\t\tthis.handleOpenTestFile = options?.handleOpenTestFile\n\t\tthis.handleFilterChange = options?.handleFilterPatternChange\n\t\tthis.status = options?.status ?? 'ready'\n\t\tthis.handleToggleDebug = options?.handleToggleDebug\n\t\tthis.handletoggleStandardWatch = options?.handletoggleStandardWatch\n\t\tthis.isDebugging = options?.isDebugging ?? false\n\t\tthis.watchMode = options?.watchMode ?? 'off'\n\t\tthis.handleToggleSmartWatch = options?.handleToggleSmartWatch\n\n\t\tthis.errorLogItemGenerator = new TestLogItemGenerator()\n\t\tthis.widgetFactory = new WidgetFactory()\n\t}\n\n\tpublic setFilterPattern(pattern: string | undefined) {\n\t\tthis.filterPattern = pattern\n\t\tthis.filterInput.setValue(pattern ?? '')\n\t\tthis.clearFilterPatternButton.setText(buildPatternButtonText(pattern))\n\t}\n\n\tpublic setIsDebugging(isDebugging: boolean) {\n\t\tthis.menu.setTextForItem(\n\t\t\t'toggleDebug',\n\t\t\t`Debug ^${isDebugging ? 'k' : 'w'}^#^${isDebugging ? 'g' : 'r'}${\n\t\t\t\tisDebugging ? ' • ' : ' • '\n\t\t\t}^`\n\t\t)\n\t\tthis.isDebugging = isDebugging\n\t}\n\n\tpublic startCountdownTimer(durationSec: number) {\n\t\tclearInterval(this.countDownTimeInterval)\n\t\tthis.countDownTimeInterval = undefined\n\n\t\tlet remaining = durationSec\n\n\t\tfunction renderCountdownTime(time: number) {\n\t\t\treturn `Starting ${time} `\n\t\t}\n\n\t\tthis.setWatchLabel(renderCountdownTime(remaining))\n\n\t\tthis.countDownTimeInterval = setInterval(() => {\n\t\t\tremaining--\n\n\t\t\tif (remaining < 0) {\n\t\t\t\tthis.stopCountdownTimer()\n\t\t\t} else {\n\t\t\t\tthis.setWatchLabel(renderCountdownTime(remaining))\n\t\t\t}\n\t\t}, 1000) as any\n\t}\n\n\tpublic stopCountdownTimer() {\n\t\tclearInterval(this.countDownTimeInterval)\n\t\tthis.countDownTimeInterval = undefined\n\t\tthis.setWatchMode(this.watchMode)\n\t}\n\n\tpublic setWatchMode(watchMode: WatchMode) {\n\t\tthis.watchMode = watchMode\n\t\tif (!this.countDownTimeInterval) {\n\t\t\tlet label = watchMode === 'smart' ? 'Smart Watch' : 'Standard Watch'\n\t\t\tif (watchMode === 'off') {\n\t\t\t\tlabel = 'Not Watching'\n\t\t\t}\n\t\t\tthis.setWatchLabel(label)\n\t\t}\n\t}\n\n\tprivate setWatchLabel(label: string) {\n\t\tconst isWatching = this.watchMode !== 'off'\n\n\t\tthis.menu.setTextForItem(\n\t\t\t'watchDropdown',\n\t\t\t`${label} ^${isWatching ? 'k' : 'w'}^#^${isWatching ? 'g' : 'r'}${\n\t\t\t\tisWatching ? ' • ' : ' • '\n\t\t\t}^`\n\t\t)\n\n\t\tthis.menu.setTextForItem(\n\t\t\t'toggleStandardWatch',\n\t\t\tthis.watchMode === 'standard' ? '√ Standard' : 'Standard'\n\t\t)\n\n\t\tthis.menu.setTextForItem(\n\t\t\t'toggleSmartWatch',\n\t\t\tthis.watchMode === 'smart' ? '√ Smart' : 'Smart'\n\t\t)\n\t}\n\n\tpublic async start() {\n\t\tthis.started = true\n\n\t\tthis.window = this.widgetFactory.Widget('window', {})\n\t\tthis.window.hideCursor()\n\n\t\tconst { width } = this.window.getFrame()\n\t\tif (width < this.minWidth) {\n\t\t\tthrow new Error(\n\t\t\t\t`Your screen must be at least ${this.minWidth} characters wide.`\n\t\t\t)\n\t\t}\n\n\t\tvoid this.window.on('key', this.handleGlobalKeypress.bind(this))\n\t\tvoid this.window.on('kill', this.destroy.bind(this))\n\t\tvoid this.window.on('resize', this.handleWindowResize.bind(this))\n\n\t\tthis.dropInTopLayout()\n\t\tthis.dropInProgressBar()\n\t\tthis.dropInMenu()\n\t\tthis.dropInBottomLayout()\n\t\tthis.dropInStatusBar()\n\t\tthis.dropInTestLog()\n\t\tthis.dropInFilterControls()\n\n\t\tthis.updateOrientation()\n\n\t\tthis.setIsDebugging(this.isDebugging)\n\t\tthis.setWatchMode(this.watchMode)\n\t\tthis.setStatus(this.status)\n\n\t\tthis.updateInterval = setInterval(\n\t\t\tthis.handleUpdateInterval.bind(this),\n\t\t\t1000\n\t\t)\n\t}\n\n\tprivate handleWindowResize() {\n\t\tthis.updateOrientation()\n\t}\n\n\tprivate updateOrientation() {\n\t\tconst frame = this.window.getFrame()\n\n\t\tif (frame.width * 0.5 > frame.height) {\n\t\t\tthis.orientation = 'landscape'\n\t\t} else {\n\t\t\tthis.orientation = 'portrait'\n\t\t}\n\t}\n\n\tprivate dropInMenu() {\n\t\tthis.menu = this.widgetFactory.Widget('menuBar', {\n\t\t\tparent: this.window,\n\t\t\tleft: 0,\n\t\t\ttop: 0,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\titems: [\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Restart ',\n\t\t\t\t\tvalue: 'restart',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Debug ',\n\t\t\t\t\tvalue: 'toggleDebug',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Not Watching ',\n\t\t\t\t\tvalue: 'watchDropdown',\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Watch all',\n\t\t\t\t\t\t\tvalue: 'toggleStandardWatch',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Smart watch',\n\t\t\t\t\t\t\tvalue: 'toggleSmartWatch',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Quit',\n\t\t\t\t\tvalue: 'quit',\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\tvoid this.menu.on('select', this.handleMenuSelect.bind(this))\n\t}\n\n\tpublic setStatus(status: TestRunnerStatus) {\n\t\tthis.status = status\n\n\t\tthis.updateMenuLabels()\n\t\tthis.closeSelectTestPopup()\n\t\tthis.bottomLayout.updateLayout()\n\n\t\tif (status === 'ready') {\n\t\t\tthis.setStatusLabel('Starting...')\n\t\t} else if (this.status === 'stopped') {\n\t\t\tthis.refreshResults()\n\t\t\tthis.setStatusLabel('')\n\t\t} else if (this.status === 'running') {\n\t\t\tthis.setStatusLabel('Running tests...')\n\t\t}\n\t}\n\n\tprivate updateMenuLabels() {\n\t\tlet restartLabel = 'Start ^#^r › ^'\n\t\tswitch (this.status) {\n\t\t\tcase 'running':\n\t\t\t\trestartLabel = 'Stop ^k^#^g › ^'\n\t\t\t\tbreak\n\t\t\tcase 'stopped':\n\t\t\t\trestartLabel = `Start ^w^#^r › ^`\n\t\t\t\tbreak\n\t\t\tcase 'ready':\n\t\t\t\trestartLabel = 'Booting ^#^K › ^'\n\t\t\t\tbreak\n\t\t}\n\n\t\tthis.menu.setTextForItem('restart', restartLabel)\n\t}\n\n\tprivate handleMenuSelect(payload: { value: string }) {\n\t\tswitch (payload.value) {\n\t\t\tcase 'quit':\n\t\t\t\tthis.handleQuit?.()\n\t\t\t\tbreak\n\t\t\tcase 'restart':\n\t\t\t\tthis.handleStartStop?.()\n\t\t\t\tbreak\n\t\t\tcase 'toggleDebug':\n\t\t\t\tthis.handleToggleDebug?.()\n\t\t\t\tbreak\n\t\t\tcase 'toggleStandardWatch':\n\t\t\t\tthis.handletoggleStandardWatch?.()\n\t\t\t\tbreak\n\t\t\tcase 'toggleSmartWatch':\n\t\t\t\tthis.handleToggleSmartWatch?.()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate handleUpdateInterval() {\n\t\tif (this.status !== 'stopped') {\n\t\t\tthis.refreshResults()\n\t\t}\n\t}\n\n\tprivate refreshResults() {\n\t\tif (this.lastResults) {\n\t\t\tthis.updateLogs()\n\t\t}\n\t}\n\n\tprivate async handleGlobalKeypress(payload: { key: string }) {\n\t\tif (this.window.getFocusedWidget() === this.filterInput) {\n\t\t\treturn\n\t\t}\n\n\t\tswitch (payload.key) {\n\t\t\tcase 'ENTER':\n\t\t\t\tthis.handleRestart?.()\n\t\t\t\tbreak\n\t\t\tcase 'CTRL_C':\n\t\t\t\tthis.handleQuit?.()\n\t\t\t\tprocess.exit()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate dropInTestLog() {\n\t\tconst parent = this.bottomLayout.getChildById('results')\n\n\t\tif (parent) {\n\t\t\tthis.testLog = this.widgetFactory.Widget('text', {\n\t\t\t\tparent,\n\t\t\t\tisScrollEnabled: true,\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\theight: '100%',\n\t\t\t\twidth: '100%',\n\t\t\t\tshouldLockHeightWithParent: true,\n\t\t\t\tshouldLockWidthWithParent: true,\n\t\t\t})\n\n\t\t\tvoid this.testLog.on('click', this.handleClickTestLog.bind(this))\n\t\t}\n\t}\n\n\tprivate async handleClickTestLog(payload: { row: number; column: number }) {\n\t\tconst testFile = this.getFileForLine(payload.row)\n\t\tconst { row, column } = payload\n\n\t\tthis.closeSelectTestPopup()\n\n\t\tif (testFile) {\n\t\t\tthis.dropInSelectTestPopup({ testFile, column, row })\n\t\t}\n\t}\n\n\tprivate closeSelectTestPopup() {\n\t\tif (this.selectTestPopup) {\n\t\t\tvoid this.selectTestPopup.destroy()\n\t\t\tthis.selectTestPopup = undefined\n\t\t}\n\t}\n\n\tprivate dropInSelectTestPopup(options: {\n\t\ttestFile: string\n\t\tcolumn: number\n\t\trow: number\n\t}) {\n\t\tconst { testFile, row, column } = options\n\n\t\tthis.selectTestPopup = this.widgetFactory.Widget('popup', {\n\t\t\tparent: this.window,\n\t\t\tleft: Math.max(1, column - 25),\n\t\t\ttop: Math.max(4, row - 2),\n\t\t\twidth: 50,\n\t\t\theight: 10,\n\t\t})\n\n\t\tthis.widgetFactory.Widget('text', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 1,\n\t\t\ttop: 1,\n\t\t\theight: 4,\n\t\t\twidth: this.selectTestPopup.getFrame().width - 2,\n\t\t\ttext: `What do you wanna do with:\\n\\n${testFile}`,\n\t\t})\n\n\t\tconst open = this.widgetFactory.Widget('button', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 1,\n\t\t\ttop: 6,\n\t\t\ttext: 'Open',\n\t\t})\n\n\t\tconst rerun = this.widgetFactory.Widget('button', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 20,\n\t\t\ttop: 6,\n\t\t\ttext: 'Test',\n\t\t})\n\n\t\tconst cancel = this.widgetFactory.Widget('button', {\n\t\t\tparent: this.selectTestPopup,\n\t\t\tleft: 37,\n\t\t\ttop: 6,\n\t\t\ttext: 'Nevermind',\n\t\t})\n\n\t\tvoid rerun.on('click', () => {\n\t\t\tthis.handleRerunTestFile?.(testFile)\n\t\t\tthis.closeSelectTestPopup()\n\t\t})\n\t\tvoid cancel.on('click', this.closeSelectTestPopup.bind(this))\n\t\tvoid open.on('click', () => {\n\t\t\tthis.openTestFile(testFile)\n\t\t})\n\t}\n\n\tprivate openTestFile(testFile: string) {\n\t\tthis.handleOpenTestFile?.(testFile)\n\t\tthis.closeSelectTestPopup()\n\t}\n\n\tpublic getFileForLine(row: number): string | undefined {\n\t\tlet line = this.testLog.getScrollY()\n\n\t\tfor (let file of this.lastResults.testFiles ?? []) {\n\t\t\tif (line === row) {\n\t\t\t\treturn file.path\n\t\t\t}\n\n\t\t\tline++\n\n\t\t\tfor (let c = 0; c < (file.tests ?? []).length; c++) {\n\t\t\t\tif (line === row) {\n\t\t\t\t\treturn file.path\n\t\t\t\t}\n\n\t\t\t\tline++\n\t\t\t}\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tprivate dropInProgressBar() {\n\t\tconst parent = this.topLayout.getChildById('progress') ?? this.window\n\t\tthis.bar = this.widgetFactory.Widget('progressBar', {\n\t\t\tparent,\n\t\t\tleft: 0,\n\t\t\ttop: 0,\n\t\t\twidth: parent.getFrame().width,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tlabel: 'Ready and waiting...',\n\t\t\tprogress: 0,\n\t\t})\n\t}\n\n\tprivate dropInFilterControls() {\n\t\tconst parent = this.topLayout.getChildById('filter') ?? this.window\n\n\t\tconst buttonWidth = 3\n\t\tthis.filterInput = this.widgetFactory.Widget('input', {\n\t\t\tparent,\n\t\t\tleft: 0,\n\t\t\tlabel: 'Pattern',\n\t\t\twidth: parent.getFrame().width - buttonWidth,\n\t\t\theight: 1,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tvalue: this.filterPattern,\n\t\t})\n\n\t\tvoid this.filterInput.on('cancel', () => {\n\t\t\tthis.filterInput.setValue(this.filterPattern ?? '')\n\t\t})\n\n\t\tvoid this.filterInput.on('submit', (payload) => {\n\t\t\tthis.handleFilterChange?.(payload.value ?? undefined)\n\t\t})\n\n\t\tthis.clearFilterPatternButton = this.widgetFactory.Widget('button', {\n\t\t\tparent,\n\t\t\tleft: this.filterInput.getFrame().width,\n\t\t\twidth: buttonWidth,\n\t\t\ttop: 0,\n\t\t\ttext: buildPatternButtonText(this.filterPattern),\n\t\t\tshouldLockRightWithParent: true,\n\t\t})\n\n\t\tvoid this.clearFilterPatternButton.on('click', () => {\n\t\t\tif (this.filterPattern || this.filterPattern?.length === 0) {\n\t\t\t\tthis.handleFilterChange?.(undefined)\n\t\t\t} else {\n\t\t\t\tthis.filterInput.setValue('')\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate dropInBottomLayout() {\n\t\tthis.bottomLayout = this.widgetFactory.Widget('layout', {\n\t\t\tparent: this.window,\n\t\t\twidth: '100%',\n\t\t\ttop: 4,\n\t\t\theight: this.window.getFrame().height - 5,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tshouldLockHeightWithParent: true,\n\t\t\trows: [\n\t\t\t\t{\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tcolumns: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'results',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t}\n\n\tprivate dropInStatusBar() {\n\t\tthis.statusBar = this.widgetFactory.Widget('text', {\n\t\t\tparent: this.window,\n\t\t\ttop: this.window.getFrame().height - 1,\n\t\t\twidth: '100%',\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tshouldLockBottomWithParent: true,\n\t\t\tbackgroundColor: 'yellow',\n\t\t\tforegroundColor: 'black',\n\t\t\ttext: '...',\n\t\t})\n\t}\n\n\tprivate dropInTopLayout() {\n\t\tthis.topLayout = this.widgetFactory.Widget('layout', {\n\t\t\tparent: this.window,\n\t\t\twidth: '100%',\n\t\t\ttop: 1,\n\t\t\theight: 3,\n\t\t\tshouldLockWidthWithParent: true,\n\t\t\tshouldLockHeightWithParent: false,\n\t\t\trows: [\n\t\t\t\t{\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tcolumns: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'progress',\n\t\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'filter',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t}\n\n\tpublic updateResults(results: SpruceTestResults) {\n\t\tif (!this.started) {\n\t\t\tthrow new Error('You must call start() before anything else.')\n\t\t}\n\n\t\tthis.lastResults = {\n\t\t\t...this.lastResults,\n\t\t\t...results,\n\t\t}\n\n\t\tthis.updateProgressBar(results)\n\n\t\tconst percentPassing = this.generatePercentPassing(results)\n\t\tconst percentComplete = this.generatePercentComplete(results)\n\n\t\tthis.window.setTitle(\n\t\t\t`Testing: ${percentComplete}% complete.${\n\t\t\t\tpercentComplete > 0 ? ` ${percentPassing}% passing.` : ''\n\t\t\t}`\n\t\t)\n\n\t\tthis.updateLogs()\n\t}\n\n\tprivate updateLogs() {\n\t\tif (this.selectTestPopup) {\n\t\t\treturn\n\t\t}\n\n\t\tlet { logContent, errorContent } = this.resultsToLogContents(\n\t\t\tthis.lastResults\n\t\t)\n\n\t\tthis.testLog.setText(logContent)\n\n\t\tif (!errorContent) {\n\t\t\tthis.errorLog && this.destroyErrorLog()\n\t\t} else {\n\t\t\t!this.errorLog && this.dropInErrorLog()\n\t\t\tconst cleanedLog = this.cwd\n\t\t\t\t? errorContent.replace(new RegExp(this.cwd + '/', 'gim'), '')\n\t\t\t\t: errorContent\n\n\t\t\tthis.errorLog?.setText(cleanedLog)\n\t\t}\n\t}\n\n\tprivate resultsToLogContents(results: SpruceTestResults) {\n\t\tlet logContent = ''\n\t\tlet errorContent = ''\n\n\t\tresults.testFiles?.forEach((file) => {\n\t\t\tlogContent += this.errorLogItemGenerator.generateLogItemForFile(\n\t\t\t\tfile,\n\t\t\t\tthis.status\n\t\t\t)\n\t\t\terrorContent +=\n\t\t\t\tthis.errorLogItemGenerator.generateErrorLogItemForFile(file)\n\t\t})\n\n\t\tif (this.lastResults.customErrors.length > 0) {\n\t\t\terrorContent =\n\t\t\t\tthis.lastResults.customErrors.map((err) => chalk.red(err)).join(`\\n`) +\n\t\t\t\t`\\n${errorContent}`\n\t\t}\n\n\t\treturn { logContent, errorContent }\n\t}\n\n\tprivate dropInErrorLog() {\n\t\tthis.orientationWhenErrorLogWasShown = this.orientation\n\n\t\tif (this.bottomLayout.getRows().length === 1) {\n\t\t\tif (this.orientation === 'portrait') {\n\t\t\t\tthis.bottomLayout.addRow({\n\t\t\t\t\tid: 'row_2',\n\t\t\t\t\tcolumns: [{ id: 'errors', width: '100%' }],\n\t\t\t\t})\n\n\t\t\t\tthis.bottomLayout.setRowHeight(0, '50%')\n\t\t\t\tthis.bottomLayout.setRowHeight(1, '50%')\n\t\t\t} else {\n\t\t\t\tthis.bottomLayout.addColumn(0, { id: 'errors', width: '50%' })\n\t\t\t\tthis.bottomLayout.setColumnWidth({\n\t\t\t\t\trowIdx: 0,\n\t\t\t\t\tcolumnIdx: 0,\n\t\t\t\t\twidth: '50%',\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.bottomLayout.updateLayout()\n\n\t\t\tconst cell = this.bottomLayout.getChildById('errors')\n\n\t\t\tif (!cell) {\n\t\t\t\tthrow new Error('Pulling child error')\n\t\t\t}\n\n\t\t\tthis.errorLog = this.widgetFactory.Widget('text', {\n\t\t\t\tparent: cell,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tisScrollEnabled: true,\n\t\t\t\tshouldAutoScrollWhenAppendingContent: false,\n\t\t\t\tshouldLockHeightWithParent: true,\n\t\t\t\tshouldLockWidthWithParent: true,\n\t\t\t\tpadding: { left: 1 },\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate destroyErrorLog() {\n\t\tif (this.errorLog) {\n\t\t\tvoid this.errorLog?.destroy()\n\t\t\tthis.errorLog = undefined\n\n\t\t\tif (this.orientationWhenErrorLogWasShown === 'landscape') {\n\t\t\t\tthis.bottomLayout.removeColumn(0, 1)\n\t\t\t\tthis.bottomLayout.setColumnWidth({\n\t\t\t\t\trowIdx: 0,\n\t\t\t\t\tcolumnIdx: 0,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tthis.bottomLayout.removeRow(1)\n\t\t\t\tthis.bottomLayout.setRowHeight(0, '100%')\n\t\t\t}\n\t\t\tthis.bottomLayout.updateLayout()\n\t\t}\n\t}\n\n\tprivate updateProgressBar(results: SpruceTestResults) {\n\t\tif (results.totalTestFilesComplete ?? 0 > 0) {\n\t\t\tconst testsRemaining =\n\t\t\t\tresults.totalTestFiles - (results.totalTestFilesComplete ?? 0)\n\n\t\t\tif (testsRemaining === 0) {\n\t\t\t\tconst { percent, totalTests, totalPassedTests, totalTime } =\n\t\t\t\t\tthis.generateProgressStats(results)\n\n\t\t\t\tthis.bar.setLabel(\n\t\t\t\t\t`Finished! ${totalPassedTests} of ${totalTests} (${percent}%) passed in ${durationUtil.msToFriendly(\n\t\t\t\t\t\ttotalTime\n\t\t\t\t\t)}.${percent < 100 ? ` Don't give up! 💪` : ''}`\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthis.bar.setLabel(\n\t\t\t\t\t`${results.totalTestFilesComplete} of ${\n\t\t\t\t\t\tresults.totalTestFiles\n\t\t\t\t\t} (${this.generatePercentComplete(\n\t\t\t\t\t\tresults\n\t\t\t\t\t)}%) complete. ${testsRemaining} remaining...`\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tthis.bar.setLabel('0%')\n\t\t}\n\n\t\tthis.bar.setProgress(this.generatePercentComplete(results) / 100)\n\t}\n\n\tprivate generateProgressStats(results: SpruceTestResults): {\n\t\tpercent: number\n\t\ttotalTests: number\n\t\ttotalPassedTests: number\n\t\ttotalTime: number\n\t} {\n\t\tlet totalTests = 0\n\t\tlet totalPassedTests = 0\n\t\tlet totalTime = 0\n\n\t\tresults.testFiles?.forEach((file) => {\n\t\t\tfile.tests?.forEach((test) => {\n\t\t\t\ttotalTime += test.duration\n\t\t\t\tif (test.status === 'passed') {\n\t\t\t\t\ttotalPassedTests++\n\t\t\t\t}\n\n\t\t\t\tif (test.status === 'passed' || test.status === 'failed') {\n\t\t\t\t\ttotalTests++\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tconst percent = Math.floor((totalPassedTests / totalTests) * 100)\n\t\treturn {\n\t\t\tpercent: percent > 0 ? percent : 0,\n\t\t\ttotalTests,\n\t\t\ttotalPassedTests,\n\t\t\ttotalTime,\n\t\t}\n\t}\n\n\tprivate generatePercentComplete(results: SpruceTestResults): number {\n\t\tconst percent =\n\t\t\t(results.totalTestFilesComplete ?? 0) / results.totalTestFiles\n\t\tif (isNaN(percent)) {\n\t\t\treturn 0\n\t\t}\n\t\treturn Math.round(percent * 100)\n\t}\n\n\tprivate generatePercentPassing(results: SpruceTestResults): number {\n\t\tconst percent =\n\t\t\t(results.totalPassed ?? 0) / this.getTotalTestFilesRun(results)\n\n\t\tif (isNaN(percent)) {\n\t\t\treturn 0\n\t\t}\n\n\t\treturn Math.floor(percent * 100)\n\t}\n\n\tprivate getTotalTestFilesRun(results: SpruceTestResults) {\n\t\treturn (\n\t\t\t(results.totalTests ?? 0) -\n\t\t\t(results.totalSkipped ?? 0) -\n\t\t\t(results.totalTodo ?? 0)\n\t\t)\n\t}\n\n\tpublic render() {\n\t\tthis.table?.computeCells()\n\t\tthis.table?.draw()\n\t}\n\n\tpublic async destroy() {\n\t\tclearInterval(this.updateInterval)\n\t\tawait this.window.destroy()\n\t}\n\n\tpublic reset() {\n\t\tthis.testLog.setText('')\n\t\tthis.lastResults = {\n\t\t\ttotalTestFiles: 0,\n\t\t\tcustomErrors: [],\n\t\t}\n\t\tthis.destroyErrorLog()\n\t\tthis.errorLogItemGenerator.resetStartTimes()\n\t}\n\n\tpublic setStatusLabel(text: string) {\n\t\tthis.statusBar.setText(text)\n\t}\n\n\tpublic appendError(message: string) {\n\t\tthis.lastResults.customErrors.push(message)\n\t}\n}\nfunction buildPatternButtonText(pattern: string | undefined): string {\n\treturn pattern ? ' x ' : ' - '\n}\n"],"file":"TestReporter.js"}
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
|
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?: any\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"}
|
|
@@ -54,7 +54,7 @@ var viewTypeChoices = [{
|
|
|
54
54
|
value: 'view',
|
|
55
55
|
label: 'View Controller'
|
|
56
56
|
}];
|
|
57
|
-
var viewModels = ['
|
|
57
|
+
var viewModels = ['BigForm', 'Button', 'Card', 'CardBody', 'CardHeader', 'Dialog', 'Form', 'List'].sort();
|
|
58
58
|
var optionsSchema = (0, _schema.buildSchema)({
|
|
59
59
|
id: 'createViewOptions',
|
|
60
60
|
description: 'Create a new Heartwood view to render on web enabled and mobile devices.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/features/view/actions/CreateAction.ts"],"names":["viewTypeChoices","value","label","viewModels","sort","optionsSchema","id","description","fields","viewType","type","isRequired","options","choices","isRoot","nameReadable","namedTemplateItemBuilder","namePascal","viewModel","hint","map","model","followUpSchema","CreateAction","validateAndNormalizeOptions","writer","Writer","doesRootControllerExist","cwd","ui","confirm","form","FormComponent","schema","onWillAskQuestion","formUtil","onWillAskQuestionHandler","present","answers","prompt","namesUtil","toPascal","nameKebab","toKebab","files","Action","execute","syncResults","merged","actionUtil","mergeActionResults","AbstractAction"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAGA,IAAMA,eAAe,GAAG,CACvB;AACCC,EAAAA,KAAK,EAAE,WADR;AAECC,EAAAA,KAAK,EAAE;AAFR,CADuB,EAKvB;AACCD,EAAAA,KAAK,EAAE,MADR;AAECC,EAAAA,KAAK,EAAE;AAFR,CALuB,CAAxB;AAWA,IAAMC,UAAU,GAAG,CAClB,
|
|
1
|
+
{"version":3,"sources":["../../../../src/features/view/actions/CreateAction.ts"],"names":["viewTypeChoices","value","label","viewModels","sort","optionsSchema","id","description","fields","viewType","type","isRequired","options","choices","isRoot","nameReadable","namedTemplateItemBuilder","namePascal","viewModel","hint","map","model","followUpSchema","CreateAction","validateAndNormalizeOptions","writer","Writer","doesRootControllerExist","cwd","ui","confirm","form","FormComponent","schema","onWillAskQuestion","formUtil","onWillAskQuestionHandler","present","answers","prompt","namesUtil","toPascal","nameKebab","toKebab","files","Action","execute","syncResults","merged","actionUtil","mergeActionResults","AbstractAction"],"mappings":"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","sourcesContent":["import { buildSchema, SchemaValues } from '@sprucelabs/schema'\nimport { namesUtil } from '@sprucelabs/spruce-skill-utils'\nimport FormComponent from '../../../components/FormComponent'\nimport namedTemplateItemBuilder from '../../../schemas/v2020_07_22/namedTemplateItem.builder'\nimport actionUtil from '../../../utilities/action.utility'\nimport formUtil from '../../../utilities/form.utility'\nimport AbstractAction from '../../AbstractAction'\nimport { FeatureActionResponse } from '../../features.types'\n\nconst viewTypeChoices = [\n\t{\n\t\tvalue: 'skillView',\n\t\tlabel: 'Skill View Controller',\n\t},\n\t{\n\t\tvalue: 'view',\n\t\tlabel: 'View Controller',\n\t},\n]\n\nconst viewModels = [\n\t'BigForm',\n\t'Button',\n\t'Card',\n\t'CardBody',\n\t'CardHeader',\n\t'Dialog',\n\t'Form',\n\t'List',\n].sort()\n\nconst optionsSchema = buildSchema({\n\tid: 'createViewOptions',\n\tdescription:\n\t\t'Create a new Heartwood view to render on web enabled and mobile devices.',\n\tfields: {\n\t\tviewType: {\n\t\t\ttype: 'select',\n\t\t\tlabel: 'Which are you creating?',\n\t\t\tisRequired: true,\n\t\t\toptions: {\n\t\t\t\tchoices: viewTypeChoices,\n\t\t\t},\n\t\t},\n\t\tisRoot: {\n\t\t\ttype: 'boolean',\n\t\t\tlabel: 'Make this the Root View Controller?',\n\t\t},\n\t\tnameReadable: {\n\t\t\t...namedTemplateItemBuilder.fields.nameReadable,\n\t\t\tlabel: 'Controller name',\n\t\t\tisRequired: false,\n\t\t},\n\t\tnamePascal: {\n\t\t\t...namedTemplateItemBuilder.fields.namePascal,\n\t\t\tisRequired: false,\n\t\t},\n\t\tviewModel: {\n\t\t\ttype: 'select',\n\t\t\tlabel: 'View model',\n\t\t\thint: 'Which type of view will your controller render?',\n\t\t\toptions: {\n\t\t\t\tchoices: viewModels.map((model) => ({ value: model, label: model })),\n\t\t\t},\n\t\t},\n\t},\n})\n\nconst followUpSchema = buildSchema({\n\tid: 'creatViewFollowup',\n\tfields: {\n\t\tnameReadable: {\n\t\t\t...optionsSchema.fields.nameReadable,\n\t\t\tisRequired: true,\n\t\t},\n\t\tnamePascal: {\n\t\t\t...optionsSchema.fields.namePascal,\n\t\t\tisRequired: true,\n\t\t},\n\t},\n})\n\ntype OptionsSchema = typeof optionsSchema\n\nexport default class CreateAction extends AbstractAction<OptionsSchema> {\n\tpublic optionsSchema: OptionsSchema = optionsSchema\n\tpublic commandAliases = ['create.view']\n\tpublic invocationMessage = 'Creating your new view controller... 🌲'\n\n\tpublic async execute(\n\t\toptions: SchemaValues<OptionsSchema>\n\t): Promise<FeatureActionResponse> {\n\t\tlet { viewType, isRoot, nameReadable, namePascal, viewModel } =\n\t\t\tthis.validateAndNormalizeOptions(options)\n\n\t\tconst writer = this.Writer('view')\n\n\t\tif (\n\t\t\tviewType === 'skillView' &&\n\t\t\t!isRoot &&\n\t\t\t!writer.doesRootControllerExist(this.cwd)\n\t\t) {\n\t\t\tisRoot = await this.ui.confirm(\n\t\t\t\t'Do you want to create a root view controller?'\n\t\t\t)\n\t\t}\n\n\t\tif (!isRoot && !nameReadable) {\n\t\t\tconst form = new FormComponent({\n\t\t\t\tui: this.ui,\n\t\t\t\tschema: followUpSchema,\n\t\t\t\tonWillAskQuestion: formUtil.onWillAskQuestionHandler,\n\t\t\t})\n\t\t\tconst answers = await form.present()\n\n\t\t\tnamePascal = answers.namePascal\n\t\t\tnameReadable = answers.nameReadable\n\t\t}\n\n\t\tif (isRoot) {\n\t\t\tnameReadable = 'Root'\n\t\t}\n\n\t\tif (!viewModel && viewType === 'view') {\n\t\t\tviewModel = await this.ui.prompt({\n\t\t\t\t...optionsSchema.fields.viewModel,\n\t\t\t\tisRequired: true,\n\t\t\t})\n\t\t}\n\n\t\tnamePascal = namePascal ?? namesUtil.toPascal(nameReadable as string)\n\n\t\tconst files = await writer[\n\t\t\tviewType === 'skillView'\n\t\t\t\t? 'writeSkillViewController'\n\t\t\t\t: 'writeViewController'\n\t\t](this.cwd, {\n\t\t\tviewType,\n\t\t\tnamePascal,\n\t\t\tviewModel: viewModel as string,\n\t\t\tnameKebab: namesUtil.toKebab(namePascal),\n\t\t})\n\n\t\tconst syncResults = await this.Action('view', 'sync').execute({})\n\n\t\tconst merged = actionUtil.mergeActionResults(\n\t\t\t{\n\t\t\t\tfiles,\n\t\t\t},\n\t\t\tsyncResults\n\t\t)\n\n\t\treturn merged\n\t}\n}\n"],"file":"CreateAction.js"}
|
|
@@ -13,10 +13,7 @@ export default class TerminalInterface implements GraphicsInterface {
|
|
|
13
13
|
private progressBar;
|
|
14
14
|
private static _doesSupportColor;
|
|
15
15
|
private log;
|
|
16
|
-
constructor(cwd: string, renderStackTraces?: boolean, log?:
|
|
17
|
-
(...data: any[]): void;
|
|
18
|
-
(message?: any, ...optionalParams: any[]): void;
|
|
19
|
-
});
|
|
16
|
+
constructor(cwd: string, renderStackTraces?: boolean, log?: (message?: any, ...optionalParams: any[]) => void);
|
|
20
17
|
static doesSupportColor(): boolean;
|
|
21
18
|
static setDoesSupportColor(isTTy: boolean): void;
|
|
22
19
|
sendInput(): Promise<void>;
|
|
@@ -325,7 +325,10 @@ var TerminalInterface = /*#__PURE__*/function () {
|
|
|
325
325
|
}, {
|
|
326
326
|
key: "renderHero",
|
|
327
327
|
value: function renderHero(message, effects) {
|
|
328
|
-
|
|
328
|
+
var shouldStripVowels = process.stdout.columns < 80;
|
|
329
|
+
var stripped = shouldStripVowels ? message.replace(/[aeiou]/gi, '') : message;
|
|
330
|
+
|
|
331
|
+
_cfonts["default"].say(stripped, {
|
|
329
332
|
// Font: 'tiny',
|
|
330
333
|
align: 'left',
|
|
331
334
|
gradient: [_graphicsInterface.GraphicsTextEffect.Red, _graphicsInterface.GraphicsTextEffect.Blue],
|
|
@@ -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","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","replace","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","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.replace(/[aeiou]/gi, ''), {\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","shouldStripVowels","process","stdout","columns","stripped","replace","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","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","isTTY"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAMA;;AAEA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AAGA;;AACA;;AAEA;;AAMA;;AACA;;;;;;;;;;;;;;;;;;AACA,IAAMA,aAAa,GAAGC,OAAO,CAAC,gBAAD,CAA7B;;AAEA,IAAIC,UAAU,GAAG,CAAjB;;AACA,SAASC,yBAAT,GAAqC;AACpCD,EAAAA,UAAU;AACV,yBAAgBA,UAAhB;AACA;AAED;;;AACA,SAASE,sBAAT,CAAgCC,OAAhC,EAA+D;AAC9D,SAAO,oBACNA,OADM,EAEN,UAACC,MAAD;AAAA,WACC,CACCC,sCAAmBC,YADpB,EAECD,sCAAmBE,KAFpB,EAGCF,sCAAmBG,IAHpB,EAICH,sCAAmBI,GAJpB,EAKCJ,sCAAmBK,MALpB,EAMCL,sCAAmBM,SANpB,EAOCN,sCAAmBO,OAPpB,EAQCP,sCAAmBQ,MARpB,EASCR,sCAAmBS,aATpB,EAUCT,sCAAmBU,OAVpB,EAWEC,OAXF,CAWUZ,MAXV,MAWsB,CAAC,CAZxB;AAAA,GAFM,CAAP;AAgBA;;IAMoBa,iB;AASpB,6BACCC,GADD,EAIE;AAAA,QAFDC,iBAEC,uEAFmB,KAEnB;AAAA,QADDC,GACC,uEADKC,OAAO,CAACD,GAAR,CAAYE,IAAZ,CAAiBD,OAAjB,CACL;AAAA;AAAA,6DAZsB,KAYtB;AAAA;AAAA,gEAV0B,KAU1B;AAAA,0DARkD,IAQlD;AAAA;AACD,SAAKH,GAAL,GAAWA,GAAX;AACA,SAAKC,iBAAL,GAAyBA,iBAAzB;AACA,SAAKC,GAAL,GAAWA,GAAX;AACA;;;;;qGAUD;AAAA;AAAA;AAAA;AAAA;AAAA,sBACO,IAAIG,KAAJ,CAAU,mDAAV,CADP;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WAIA,qBAAmBC,KAAnB,EAAiCrB,OAAjC,EAAiE;AAAA;;AAChEqB,MAAAA,KAAK,CAACC,OAAN,CAAc,UAACC,IAAD,EAAU;AACvB,QAAA,KAAI,CAACC,UAAL,CAAgBD,IAAhB,EAAsBvB,OAAtB;AACA,OAFD;AAGA;;;WAED,sBACCyB,MADD,EAGE;AAAA;;AAAA,UADDzB,OACC,uEAD+B,CAACE,sCAAmBwB,KAApB,CAC/B;AACD,WAAKF,UAAL,CAAgB,EAAhB;AACA,WAAKG,aAAL;AACA,WAAKH,UAAL,CAAgB,EAAhB;AACAI,MAAAA,MAAM,CAACC,IAAP,CAAYJ,MAAZ,EAAoBH,OAApB,CAA4B,UAACQ,GAAD,EAAS;AACpC,QAAA,MAAI,CAACN,UAAL,WACIO,kBAAMC,IAAN,CAAWF,GAAX,CADJ,eAEE,OAAOL,MAAM,CAACK,GAAD,CAAb,KAAuB,QAAvB,GACGL,MAAM,CAACK,GAAD,CADT,GAEGG,IAAI,CAACC,SAAL,CAAeT,MAAM,CAACK,GAAD,CAArB,CAJL,GAMC9B,OAND;AAQA,OATD;AAUA,WAAKwB,UAAL,CAAgB,EAAhB;AACA,WAAKG,aAAL;AACA,WAAKH,UAAL,CAAgB,EAAhB;AACA;;;WAED,uBAAqBW,OAArB,EAOG;AACF,UACCC,QADD,GAOID,OAPJ,CACCC,QADD;AAAA,UAECf,KAFD,GAOIc,OAPJ,CAECd,KAFD;AAAA,UAGCI,MAHD,GAOIU,OAPJ,CAGCV,MAHD;AAAA,kCAOIU,OAPJ,CAICE,cAJD;AAAA,UAICA,cAJD,sCAIkB,EAJlB;AAAA,kCAOIF,OAPJ,CAKCG,eALD;AAAA,UAKCA,eALD,sCAKmB,CAACpC,sCAAmBqC,IAApB,EAA0BrC,sCAAmBG,IAA7C,CALnB;AAAA,iCAOI8B,OAPJ,CAMCK,WAND;AAAA,UAMCA,WAND,qCAMe,CAACtC,sCAAmBwB,KAApB,CANf;;AASA,UAAIU,QAAJ,EAAc;AACb,aAAKK,cAAL,WAAuBL,QAAvB,gCAAwCE,eAAxC,EAAyDD,cAAzD;AACA;;AAED,UAAIhB,KAAJ,EAAW;AACV,aAAKqB,WAAL,CAAiBrB,KAAjB,EAAwBmB,WAAxB;AAEA,aAAKhB,UAAL,CAAgB,EAAhB;AACA,aAAKG,aAAL,CAAmBU,cAAnB;AACA;;AAED,UAAIZ,MAAJ,EAAY;AACX,aAAKkB,YAAL,CAAkBlB,MAAlB,EAA0Be,WAA1B;AACA;;AAED,WAAKhB,UAAL,CAAgB,EAAhB;AACA;;;WAED,uBAAqBxB,OAArB,EAAqD;AACpD,UAAM4C,GAAG,GAAG,oDAAZ;AACA,WAAKpB,UAAL,CAAgBoB,GAAhB,EAAqB5C,OAArB;AACA;;;WAED,6BACC6C,OADD,EAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACD,UAAMC,cAAc,8CACnBD,OAAO,CAACE,KADW,mDACnB,eAAeC,MAAf,CAAsB,UAACC,CAAD;AAAA,eAAOA,CAAC,CAACC,MAAF,KAAa,WAApB;AAAA,OAAtB,CADmB,yEACuC,EAD3D;AAEA,UAAMC,YAAY,gDACjBN,OAAO,CAACE,KADS,oDACjB,gBAAeC,MAAf,CAAsB,UAACC,CAAD;AAAA,eAAOA,CAAC,CAACC,MAAF,KAAa,SAApB;AAAA,OAAtB,CADiB,2EACuC,EADzD;AAEA,UAAME,YAAY,gDACjBP,OAAO,CAACE,KADS,oDACjB,gBAAeC,MAAf,CAAsB,UAACC,CAAD;AAAA,eAAOA,CAAC,CAACC,MAAF,KAAa,SAApB;AAAA,OAAtB,CADiB,2EACuC,EADzD;AAGA,UAAMG,MAAM,sBAAGR,OAAO,CAACQ,MAAX,6DAAqB,EAAjC;AACA,UAAMC,iBAAiB,4BAAGT,OAAO,CAACS,iBAAX,yEAAgC,EAAvD;AAEA,WAAKC,UAAL,WAAmBV,OAAO,CAACT,QAA3B;AAEA,UAAIoB,YAAsB,GAAG,CAC5BH,MAAM,CAACI,MAAP,GAAgB,CAAhB,qBAA+BJ,MAAM,CAACI,MAAtC,IAAiD,IADrB,EAE5BX,cAAc,CAACW,MAAf,GAAwB,CAAxB,8BACuBX,cAAc,CAACW,MADtC,IAEG,IAJyB,EAK5BN,YAAY,CAACM,MAAb,GAAsB,CAAtB,4BAA4CN,YAAY,CAACM,MAAzD,IAAoE,IALxC,EAM5BL,YAAY,CAACK,MAAb,GAAsB,CAAtB,4BAA4CL,YAAY,CAACK,MAAzD,IAAoE,IANxC,EAO5BH,iBAAiB,CAACG,MAAlB,GAA2B,CAA3B,qCAC8BH,iBAAiB,CAACG,MADhD,IAEG,IATyB,sEAUxBZ,OAAO,CAACW,YAVgB,yEAUA,EAVA,GAW3BR,MAX2B,CAWpB,UAACzB,IAAD;AAAA,eAAU,CAAC,CAACA,IAAZ;AAAA,OAXoB,CAA7B;;AAaA,UAAIiC,YAAY,CAACC,MAAb,KAAwB,CAA5B,EAA+B;AAC9BD,QAAAA,YAAY,CAACE,IAAb,CAAkB,oBAAlB;AACA;;AACD,WAAKC,aAAL,CAAmB;AAClBvB,QAAAA,QAAQ,YAAKwB,oBAAaC,eAAb,CACZhB,OAAO,CAACiB,WADI,EAEZjB,OAAO,CAACkB,UAFI,CAAL,aADU;AAKlB1C,QAAAA,KAAK,EAAEmC;AALW,OAAnB;;AAQA,UAAIF,iBAAiB,CAACG,MAAlB,GAA2B,CAA/B,EAAkC;AACjC,YAAMO,KAAK,GAAG,IAAIC,oBAAJ,CAAU;AACvBC,UAAAA,IAAI,EAAE,CAAC,MAAD,EAAS,KAAT,CADiB;AAEvBC,UAAAA,SAAS,EAAE,CAAC,EAAD,EAAK,CAAL,CAFY;AAGvBC,UAAAA,QAAQ,EAAE,IAHa;AAIvBC,UAAAA,SAAS,EAAE,CAAC,MAAD,EAAS,QAAT;AAJY,SAAV,CAAd;AAMAf,QAAAA,iBAAiB,CACfgB,IADF,CACO,UAACC,GAAD,EAAMC,GAAN;AAAA,iBAAeD,GAAG,CAACE,IAAJ,GAAWD,GAAG,CAACC,IAAf,GAAsB,CAAtB,GAA0B,CAAC,CAA1C;AAAA,SADP,EAEEnD,OAFF,CAEU,UAACoD,GAAD,EAAS;AACjBV,UAAAA,KAAK,CAACN,IAAN,CAAW,CAACgB,GAAG,CAACD,IAAL,EAAWC,GAAG,CAACC,KAAJ,GAAY,GAAZ,GAAkB,EAA7B,CAAX;AACA,SAJF;AAMA,aAAKhB,aAAL,CAAmB;AAClBvB,UAAAA,QAAQ,wBADU;AAElBf,UAAAA,KAAK,EAAE,CAAC2C,KAAK,CAACY,QAAN,EAAD;AAFW,SAAnB;AAIA;;AAED,8BAAkB,CAAC9B,cAAD,EAAiBK,YAAjB,CAAlB,0BAAkD;AAA7C,YAAIJ,KAAK,WAAT;;AACJ,YAAIA,KAAK,CAACU,MAAN,GAAe,CAAnB,EAAsB;AACrB,cAAMO,MAAK,GAAG,IAAIC,oBAAJ,CAAU;AACvBC,YAAAA,IAAI,EAAE,CAAC,MAAD,EAAS,aAAT,CADiB;AAEvBE,YAAAA,QAAQ,EAAE;AAFa,WAAV,CAAd;;AAKArB,UAAAA,KAAK,GAAGA,KAAK,CAACuB,IAAN,EAAR;;AANqB,qDAQFvB,KARE;AAAA;;AAAA;AAQrB,gEAA0B;AAAA;;AAAA,kBAAf8B,IAAe;;AACzBb,cAAAA,MAAK,CAACN,IAAN,CAAW,CAACmB,IAAI,CAACJ,IAAN,uBAAYI,IAAI,CAACC,WAAjB,iEAAgC,EAAhC,CAAX;AACA;AAVoB;AAAA;AAAA;AAAA;AAAA;;AAYrB,eAAKnB,aAAL,CAAmB;AAClBvB,YAAAA,QAAQ,YAAK2C,4BAAUC,QAAV,CAAmBjC,KAAK,CAAC,CAAD,CAAL,CAASG,MAA5B,CAAL,kBADU;AAElB7B,YAAAA,KAAK,EAAE,CAAC2C,MAAK,CAACY,QAAN,EAAD;AAFW,WAAnB;AAIA;AACD;;AAED,UAAI/B,OAAO,CAACoC,KAAZ,EAAmB;AAClB,aAAKtB,aAAL,CAAmB;AAClBvB,UAAAA,QAAQ,EAAE,eADQ;AAElBf,UAAAA,KAAK,EAAEwB,OAAO,CAACoC;AAFG,SAAnB;AAIA;;AAED,UAAI5B,MAAM,CAACI,MAAP,GAAgB,CAApB,EAAuB;AACtB,aAAKhB,cAAL,CAAoB,QAApB;AACAY,QAAAA,MAAM,CAAC/B,OAAP,CAAe,UAAC4D,GAAD;AAAA,iBAAS,MAAI,CAACC,WAAL,CAAiBD,GAAjB,CAAT;AAAA,SAAf;AACA;;AAED,UAAIrC,OAAO,CAACuC,SAAZ,EAAuB;AACtB,aAAK5D,UAAL,uBACgB6D,qBAAaC,YAAb,CAA0BzC,OAAO,CAACuC,SAAlC,CADhB;AAGA;AACD;;;WAED,wBACCG,OADD,EAOE;AAAA,UALDvF,OAKC,uEAL+B,CAC/BE,sCAAmBqC,IADY,EAE/BrC,sCAAmBG,IAFY,CAK/B;AAAA,UADDgC,cACC,uEADsC,EACtC;AACD,UAAMmD,QAAQ,GAAGxF,OAAO,CAACa,OAAR,CAAgBX,sCAAmBC,YAAnC,IAAmD,CAAC,CAArE;;AAEA,UAAIqF,QAAJ,EAAc;AACbC,2BAAMC,GAAN,CAAUH,OAAV,EAAmB;AAClBI,UAAAA,IAAI,EAAEzF,sCAAmBC,YADP;AAElByF,UAAAA,KAAK,EAAE,MAFW;AAGlBC,UAAAA,KAAK,EAAE,KAHW;AAIlBC,UAAAA,MAAM,EAAE/F,sBAAsB,CAACC,OAAD;AAJZ,SAAnB;AAMA,OAPD,MAOO;AACN,aAAK2B,aAAL,CAAmBU,cAAnB;AACA,aAAKb,UAAL,CAAgB+D,OAAhB,EAAyBvF,OAAzB;AACA,aAAK2B,aAAL,CAAmBU,cAAnB;AACA,aAAKb,UAAL,CAAgB,EAAhB;AACA;AACD;;;WAED,oBAAkB+D,OAAlB,EAAmCvF,OAAnC,EAAmE;AAClE,UAAM+F,iBAAiB,GAAGC,OAAO,CAACC,MAAR,CAAeC,OAAf,GAAyB,EAAnD;AAEA,UAAMC,QAAQ,GAAGJ,iBAAiB,GAC/BR,OAAO,CAACa,OAAR,CAAgB,WAAhB,EAA6B,EAA7B,CAD+B,GAE/Bb,OAFH;;AAIAE,yBAAMC,GAAN,CAAUS,QAAV,EAAoB;AACnB;AACAP,QAAAA,KAAK,EAAE,MAFY;AAGnBS,QAAAA,QAAQ,EAAE,CAACnG,sCAAmBoG,GAApB,EAAyBpG,sCAAmBqC,IAA5C,CAHS;AAInBuD,QAAAA,MAAM,EAAE9F,OAAO,GAAGD,sBAAsB,CAACC,OAAD,CAAzB,GAAqCuG;AAJjC,OAApB;AAMA;;;WAED,oBAAkBhB,OAAlB,EAAmC;AAClC,aAAO,KAAK/D,UAAL,0CAAyB+D,OAAzB,EAAP;AACA;;;WAED,oBACCA,OADD,EAIE;AAAA,UAFDvF,OAEC,uEAF+B,EAE/B;AAAA,UADDmC,OACC;AACD,UAAIqE,KAAU,GAAGzE,iBAAjB;AACA/B,MAAAA,OAAO,CAACsB,OAAR,CAAgB,UAACrB,MAAD,EAAY;AAC3BuG,QAAAA,KAAK,GAAGA,KAAK,CAACvG,MAAD,CAAb;AACA,OAFD;;AAIA,UAAIkC,OAAJ,aAAIA,OAAJ,eAAIA,OAAO,CAAEsE,iBAAb,EAAgC;AAC/BC,8BAASC,SAAT;AACA;;AAED,WAAK1F,GAAL,CAASjB,OAAO,CAACyD,MAAR,GAAiB,CAAjB,GAAqB+C,KAAK,CAACjB,OAAD,CAA1B,GAAsCA,OAA/C;AACA;;;WAED,uBAAqBA,OAArB,EAAsC;AACrC,WAAK/D,UAAL,wBAAsB+D,OAAtB,GAAiC,CAChCrF,sCAAmBG,IADa,EAEhCH,sCAAmB0G,MAFa,CAAjC;AAIA;;;;wGAED,kBAA0BrB,OAA1B;AAAA;AAAA;AAAA;AAAA;AACC;AACA,qBAAKsB,WAAL;AACA/F,gBAAAA,iBAAiB,CAACgG,MAAlB,GAA2B,qBAAI;AAC9BC,kBAAAA,IAAI,EAAExB;AADwB,iBAAJ,EAExByB,KAFwB,EAA3B;;AAHD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;uGAQA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACC,yCAAAlG,iBAAiB,CAACgG,MAAlB,gFAA0BG,IAA1B;AACAnG,gBAAAA,iBAAiB,CAACgG,MAAlB,GAA2B,IAA3B;;AAFD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;mGAKA,kBAAqBI,QAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAC6BC,qBAASC,MAAT,CAAgB;AAC3CC,kBAAAA,IAAI,EAAE,SADqC;AAE3C5C,kBAAAA,IAAI,EAAE,QAFqC;AAG3Cc,kBAAAA,OAAO,EAAE2B;AAHkC,iBAAhB,CAD7B;;AAAA;AACOI,gBAAAA,aADP;AAAA,kDAOQ,CAAC,CAACA,aAAa,CAACC,MAPxB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;wGAUA,kBAA0BhC,OAA1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBACO,KAAK6B,MAAL,CAAY;AACjBC,kBAAAA,IAAI,EAAE,MADW;AAEjBG,kBAAAA,KAAK,YAAKjC,OAAO,GAAGA,OAAO,GAAG,GAAb,GAAmB,EAA/B,SAAoCxD,kBAAM0F,aAAN,CAAoBC,KAApB,CACxC,WADwC,CAApC;AAFY,iBAAZ,CADP;;AAAA;AAOC,qBAAKlG,UAAL,CAAgB,EAAhB;AAPD;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WAWA,iBAAe;AACd,WAAK,KAAKqF,WAAL,EAAL;AACA3F,MAAAA,OAAO,CAACyG,KAAR;AACA;;;WAED,0BAAwBC,IAAxB,EAAsC;AACrC,UAAI;AACH,YAAMC,OAAO,GAAGC,sBAAUC,SAAV,CAAoB,IAApB,EAA0BH,IAA1B,EAAgCI,KAAhD;;AACA,aAAKxG,UAAL,CAAgBqG,OAAhB;AACA,OAHD,CAGE,OAAO3C,GAAP,EAAiB;AAClB,aAAK+C,aAAL,CAAmB/C,GAAnB;AACA;AACD;;;;kGAED,kBACCgD,UADD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAGC,qBAAKC,cAAL,GAAsB,IAAtB;AACM1D,gBAAAA,IAJP,GAIc3E,yBAAyB,EAJvC;AAKOsI,gBAAAA,eALP,GAK2CF,UAL3C;AAMSG,gBAAAA,YANT,GAM0BD,eAN1B,CAMSC,YANT;AAQOC,gBAAAA,aARP,GAQ4C;AAC1C,6BAASD,YADiC;AAE1C5D,kBAAAA,IAAI,EAAJA,IAF0C;AAG1Cc,kBAAAA,OAAO,EAAE,KAAKgD,mBAAL,CAAyBH,eAAzB;AAHiC,iBAR5C;AAcOI,gBAAAA,KAdP,GAceC,qBAAaC,KAAb,CAAmB,QAAnB,EAA6BN,eAA7B,CAdf;;AAgBCE,gBAAAA,aAAa,CAACK,WAAd,GAA4B,UAACX,KAAD,EAAmB;AAC9C,yBAAQQ,KAAD,CAAuBI,WAAvB,CAAmCZ,KAAnC,CAAP;AACA,iBAFD;;AAIAM,gBAAAA,aAAa,CAACO,QAAd,GAAyB,UAACb,KAAD,EAAmB;AAC3C,yBAAO,kCACN;AACCc,oBAAAA,EAAE,EAAE,sBADL;AAECC,oBAAAA,MAAM,EAAE;AACP3B,sBAAAA,MAAM,EAAEgB;AADD;AAFT,mBADM,EAON;AAAEhB,oBAAAA,MAAM,EAAEY;AAAV,mBAPM,CAAP,CAD2C,CAU3C;AACA,iBAXD;;AApBD,+BAiCSI,eAAe,CAACf,IAjCzB;AAAA,kDAmCO,SAnCP,yBAuCO,QAvCP,yBAsDO,WAtDP,yBAmFO,MAnFP;AAAA;;AAAA;AAoCGiB,gBAAAA,aAAa,CAACjB,IAAd,GAAqB,SAArB;AApCH;;AAAA;AAwCGiB,gBAAAA,aAAa,CAACjB,IAAd,GAAqBe,eAAe,CAACY,OAAhB,GAA0B,UAA1B,GAAuC,MAA5D;AAEAV,gBAAAA,aAAa,CAACW,OAAd,GAAwBb,eAAe,CAACjG,OAAhB,CAAwB8G,OAAxB,CAAgCC,GAAhC,EACvB;AACA,0BAACC,MAAD;AAAA,yBAAa;AACZ1E,oBAAAA,IAAI,EAAE0E,MAAM,CAAC3B,KADD;AAEZQ,oBAAAA,KAAK,EAAEmB,MAAM,CAACnB,KAFF;AAGZoB,oBAAAA,OAAO,EAAEC,mBAAEC,QAAF,CAAWlB,eAAe,CAACC,YAA3B,EAAyCc,MAAM,CAACnB,KAAhD;AAHG,mBAAb;AAAA,iBAFuB,CAAxB;AA1CH;;AAAA;AAAA,qBAuDOI,eAAe,CAACY,OAvDvB;AAAA;AAAA;AAAA;;AAAA,sBAwDU,IAAIO,uBAAJ,CAAgB;AACrB3B,kBAAAA,IAAI,EAAE,iBADe;AAErB4B,kBAAAA,eAAe,EACd;AAHoB,iBAAhB,CAxDV;;AAAA;AA+DSC,gBAAAA,OA/DT,GA+DmBC,iBAAKC,IAAL,oDACfvB,eAAe,CAACC,YADD,2DACf,uBAA8BqB,IADf,yEACuB,KAAK3I,GAD5B,EAEf,GAFe,CA/DnB;AAoEGuH,gBAAAA,aAAa,CAACjB,IAAd,GAAqB,MAArB;AACAiB,gBAAAA,aAAa,CAACsB,IAAd,GAAqBH,OAArB;AACAnB,gBAAAA,aAAa,CAACuB,WAAd,GAA4B,IAA5B,CAtEH,CAwEG;;AACAvB,gBAAAA,aAAa,CAACO,QAAd,GAAyB,UAACb,KAAD,EAAmB;AAC3C,yBAAO8B,oBAAGC,UAAH,CAAc/B,KAAd,KAAwB8B,oBAAGE,SAAH,CAAahC,KAAb,EAAoBiC,WAApB,EAA/B;AACA,iBAFD,CAzEH,CA4EG;;;AACA3B,gBAAAA,aAAa,CAACK,WAAd,GAA4B,UAACe,IAAD,EAAkB;AAC7C,sBAAMQ,WAAW,GAAGR,IAAI,CAACtD,OAAL,CAAakC,aAAa,CAACsB,IAA3B,EAAiC,EAAjC,CAApB;AACA,yBAAOM,WAAW,CAACzG,MAAZ,KAAuB,CAAvB,GAA2B6E,aAAa,CAACsB,IAAzC,GAAgDM,WAAvD;AACA,iBAHD;;AA7EH;;AAAA;AAAA,qBAoFO9B,eAAe,CAACY,OApFvB;AAAA;AAAA;AAAA;;AAAA,sBAqFU,IAAIO,uBAAJ,CAAgB;AACrB3B,kBAAAA,IAAI,EAAE,iBADe;AAErB4B,kBAAAA,eAAe,EACd;AAHoB,iBAAhB,CArFV;;AAAA;AA2FSC,gBAAAA,QA3FT,GA2FmBC,iBAAKC,IAAL,qDACfvB,eAAe,CAACC,YADD,2DACf,uBAA8BqB,IADf,2EACuB,KAAK3I,GAD5B,EAEf,GAFe,CA3FnB,EAgGG;;AAhGH;AAAA,uBAiGuB,kCAAU0I,QAAV,UAjGvB;;AAAA;AAiGS1G,gBAAAA,KAjGT;;AAAA,sBAmGOA,KAAK,CAACU,MAAN,KAAiB,CAnGxB;AAAA;AAAA;AAAA;;AAAA,sBAoGU,IAAI8F,uBAAJ,CAAgB;AACrB3B,kBAAAA,IAAI,EAAE,iBADe;AAErBuC,kBAAAA,SAAS,EAAEV,QAFU;AAGrBD,kBAAAA,eAAe,kEAA2DC,QAA3D;AAHM,iBAAhB,CApGV;;AAAA;AA2GGnB,gBAAAA,aAAa,CAACjB,IAAd,GAAqB,MAArB;AACAiB,gBAAAA,aAAa,CAACsB,IAAd,GAAqBH,QAArB,CA5GH,CA8GG;;AACAnB,gBAAAA,aAAa,CAACO,QAAd,GAAyB,UAACb,KAAD,EAAmB;AAC3C,yBACC8B,oBAAGC,UAAH,CAAc/B,KAAd,KACA,CAAC8B,oBAAGE,SAAH,CAAahC,KAAb,EAAoBiC,WAApB,EADD,IAEAP,iBAAKU,OAAL,CAAapC,KAAb,MAAwB,KAHzB;AAKA,iBAND,CA/GH,CAsHG;;;AACAM,gBAAAA,aAAa,CAACK,WAAd,GAA4B,UAACe,IAAD,EAAkB;AAC7C,sBAAMQ,WAAW,GAAGR,IAAI,CAACtD,OAAL,CAAakC,aAAa,CAACsB,IAA3B,EAAiC,EAAjC,CAApB;AACA,yBAAOM,WAAW,CAACzG,MAAZ,KAAuB,CAAvB,GAA2B6E,aAAa,CAACsB,IAAzC,GAAgDM,WAAvD;AACA,iBAHD;;AAvHH;;AAAA;AAgIG5B,gBAAAA,aAAa,CAACjB,IAAd,GAAqB,OAArB;;AAhIH;AAAA;AAAA,uBAmIyBF,qBAASC,MAAT,CAAgBkB,aAAhB,CAnIzB;;AAAA;AAmIO+B,gBAAAA,QAnIP;AAqIC,qBAAKlC,cAAL,GAAsB,KAAtB;AAEMmC,gBAAAA,MAvIP,GAwIE,OAAOD,QAAQ,CAAC5F,IAAD,CAAf,KAA0B,WAA1B,GACI+D,KAAD,CAAuBI,WAAvB,CAAmCyB,QAAQ,CAAC5F,IAAD,CAA3C,CADH,GAEG4F,QAAQ,CAAC5F,IAAD,CA1Ib;AAAA,kDA4IQ6F,MA5IR;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WA8IA,6BAA4BlC,eAA5B,EAAoE;AACnE,UAAIZ,KAAK,GAAGY,eAAe,CAACZ,KAA5B;;AAEA,UAAIY,eAAe,CAACmC,IAApB,EAA0B;AACzB/C,QAAAA,KAAK,aAAMA,KAAN,cAAezF,kBAAMyI,MAAN,CAAaC,GAAb,YAAqBrC,eAAe,CAACmC,IAArC,OAAf,CAAL;AACA;;AAED/C,MAAAA,KAAK,GAAGA,KAAK,GAAG,IAAhB;AAEA,aAAOA,KAAP;AACA;;;WAED,qBAAmBtC,GAAnB,EAA+B;AAC9B;AACA,WAAK2B,WAAL;AAEA,UAAMtB,OAAO,GAAGL,GAAG,CAACK,OAApB,CAJ8B,CAK9B;;AACA,UAAMmF,UAAU,GAAG,KAAKC,UAAL,CAAgBzF,GAAhB,CAAnB;AACA,WAAKvB,aAAL,CAAmB;AAClBvB,QAAAA,QAAQ,EAAEmD,OADQ;AAElBlE,QAAAA,KAAK,EAAE,KAAKL,iBAAL,GAAyB0J,UAAU,CAACE,MAAX,CAAkB,CAAlB,EAAqB,GAArB,CAAzB,GAAqDrE,SAF1C;AAGlBjE,QAAAA,eAAe,EAAE,CAACpC,sCAAmBG,IAApB,EAA0BH,sCAAmBoG,GAA7C,CAHC;AAIlBjE,QAAAA,cAAc,EAAE,CAACnC,sCAAmBoG,GAApB,CAJE;AAKlB9D,QAAAA,WAAW,EAAE,CAACtC,sCAAmBoG,GAApB;AALK,OAAnB;AAOA;;;WAED,oBAAmBpB,GAAnB,EAA+B;AAC9B,UAAMK,OAAO,GAAGL,GAAG,CAACK,OAApB;AACA,UAAIsF,KAAK,GAAG3F,GAAG,CAAC2F,KAAJ,GAAY3F,GAAG,CAAC2F,KAAJ,CAAUzE,OAAV,CAAkBb,OAAlB,EAA2B,EAA3B,CAAZ,GAA6C,EAAzD;;AAEA,UAAIL,GAAG,YAAY4F,iBAAnB,EAAwC;AACvC,YAAIC,QAAQ,GAAG7F,GAAG,CAAC8F,aAAnB;;AACA,eAAOD,QAAP,EAAiB;AAChBF,UAAAA,KAAK,GAAGA,KAAK,CAACzE,OAAN,CAAc,YAAY2E,QAAQ,CAACxF,OAAnC,EAA4C,EAA5C,CAAR;AACAwF,UAAAA,QAAQ,GAAIA,QAAD,CAAkCC,aAA7C;AACA;AACD;;AAED,UAAMN,UAAU,GAAGG,KAAK,CAACI,KAAN,CAAY,IAAZ,CAAnB;AAEA,aAAOP,UAAP;AACA;;;WAED,2BAAyBvI,OAAzB,EAA4D;AAC3D,WAAK+I,iBAAL;AACA,WAAKC,WAAL,GAAmBzE,sBAASyE,WAAT,iCACfhJ,OADe;AAElBiJ,QAAAA,OAAO,EAAEjJ,OAAO,CAACkJ,WAFC;AAGlBC,QAAAA,GAAG,EAAEnJ,OAAO,CAACoJ,OAHK;AAIlBC,QAAAA,KAAK,EAAErJ,OAAO,CAACsJ,UAJG;AAKlBC,QAAAA,MAAM,EAAEvJ,OAAO,CAACwJ;AALE,SAAnB;AAOA;;;WAED,6BAA2B;AAC1B,UAAI,KAAKR,WAAT,EAAsB;AACrB,aAAKA,WAAL,CAAiBlE,IAAjB;AACA,aAAKkE,WAAL,GAAmB,IAAnB;AACA;AACD;;;WAED,2BAAyBhJ,OAAzB,EAAkE;AACjE,UAAI,KAAKgJ,WAAT,EAAsB;AACrB,aAAKA,WAAL,CAAiBS,MAAjB,iCACIzJ,OADJ;AAECqJ,UAAAA,KAAK,EAAErJ,OAAO,CAACsJ;AAFhB;AAIA;AACD;;;;uGAED,kBACC/B,IADD,EAECvH,OAFD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAIqBxC,aAAa,CAACkF,IAAd,CAAmB6E,IAAnB,EAAyBvH,OAAzB,CAJrB;;AAAA;AAIO0J,gBAAAA,KAJP;AAKC,qBAAKrK,UAAL,CAAgBqK,KAAhB;;AALD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;6GAQA;AAAA;AAAA;AAAA;AAAA;AAAA,kDACQ,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC/BrF,wCAASsF,qBAAT;;AACAtF,wCAASuF,iBAAT,CAA2B,UAAC/G,GAAD,EAAMgH,CAAN,EAASC,CAAT,EAAe;AACzCJ,oBAAAA,OAAO,CAAC7G,GAAG,GAAG,IAAH,GAAU;AAAEgH,sBAAAA,CAAC,EAAEA,CAAF,aAAEA,CAAF,cAAEA,CAAF,GAAO,CAAV;AAAaC,sBAAAA,CAAC,EAAEA,CAAF,aAAEA,CAAF,cAAEA,CAAF,GAAO;AAArB,qBAAd,CAAP;AACA,mBAFD;AAGA,iBALM,CADR;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WASA,sBAAoB;AACnBzF,4BAAS0F,UAAT;AACA;;;WAED,yBAAuB;AACtB1F,4BAAS2F,aAAT;AACA;;;WAED,sBAAoBH,CAApB,EAA+BC,CAA/B,EAAgD;AAC/CzF,4BAAS4F,MAAT,CAAgBJ,CAAhB,EAAmBC,CAAnB;AACA;;;WAED,4BAAgC;AAC/BzF,4BAAS6F,iBAAT;AACA;;;WAED,qBAAmB;AAClB7F,4BAASC,SAAT;AACA;;;WA9hBD,4BAAiC;AAChC,aAAO,KAAK6F,iBAAZ;AACA;;;WAED,6BAAkCC,KAAlC,EAAkD;AACjD,WAAKD,iBAAL,GAAyBC,KAAzB;AACA;;;;;;iCAzBmB3L,iB;iCAAAA,iB,uBAMe,aAAAkF,OAAO,UAAP,+DAASC,MAAT,oEAAiByG,KAAjB,KAA0B,CAAC,uB","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\tconst shouldStripVowels = process.stdout.columns < 80\n\n\t\tconst stripped = shouldStripVowels\n\t\t\t? message.replace(/[aeiou]/gi, '')\n\t\t\t: message\n\n\t\tfonts.say(stripped, {\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
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
]
|
|
19
19
|
},
|
|
20
20
|
"license": "MIT",
|
|
21
|
-
"version": "14.29.
|
|
21
|
+
"version": "14.29.25",
|
|
22
22
|
"bin": {
|
|
23
23
|
"spruce": "./build/index.js"
|
|
24
24
|
},
|
|
@@ -72,31 +72,31 @@
|
|
|
72
72
|
"watch.tsc": "tsc -w --sourceMap"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@babel/cli": "^7.16.
|
|
76
|
-
"@babel/plugin-proposal-decorators": "^7.16.
|
|
77
|
-
"@babel/runtime": "^7.16.
|
|
78
|
-
"@jest/reporters": "^27.4.
|
|
79
|
-
"@sprucelabs/error": "^5.0.
|
|
80
|
-
"@sprucelabs/heartwood-view-controllers": "^
|
|
81
|
-
"@sprucelabs/jest-json-reporter": "^6.0.
|
|
82
|
-
"@sprucelabs/mercury-client": "^19.2.
|
|
83
|
-
"@sprucelabs/mercury-event-emitter": "^19.2.
|
|
84
|
-
"@sprucelabs/mercury-types": "^26.1.
|
|
85
|
-
"@sprucelabs/schema": "^25.5.
|
|
86
|
-
"@sprucelabs/spruce-core-schemas": "^22.7.
|
|
87
|
-
"@sprucelabs/spruce-event-plugin": "^20.
|
|
88
|
-
"@sprucelabs/spruce-event-utils": "^17.1.
|
|
89
|
-
"@sprucelabs/spruce-skill-booter": "^20.
|
|
90
|
-
"@sprucelabs/spruce-skill-utils": "^22.2.
|
|
91
|
-
"@sprucelabs/spruce-templates": "^14.29.
|
|
92
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
93
|
-
"@typescript-eslint/parser": "^5.
|
|
75
|
+
"@babel/cli": "^7.16.7",
|
|
76
|
+
"@babel/plugin-proposal-decorators": "^7.16.7",
|
|
77
|
+
"@babel/runtime": "^7.16.7",
|
|
78
|
+
"@jest/reporters": "^27.4.6",
|
|
79
|
+
"@sprucelabs/error": "^5.0.367",
|
|
80
|
+
"@sprucelabs/heartwood-view-controllers": "^55.1.0",
|
|
81
|
+
"@sprucelabs/jest-json-reporter": "^6.0.303",
|
|
82
|
+
"@sprucelabs/mercury-client": "^19.2.77",
|
|
83
|
+
"@sprucelabs/mercury-event-emitter": "^19.2.77",
|
|
84
|
+
"@sprucelabs/mercury-types": "^26.1.1168",
|
|
85
|
+
"@sprucelabs/schema": "^25.5.69",
|
|
86
|
+
"@sprucelabs/spruce-core-schemas": "^22.7.73",
|
|
87
|
+
"@sprucelabs/spruce-event-plugin": "^20.1.17",
|
|
88
|
+
"@sprucelabs/spruce-event-utils": "^17.1.457",
|
|
89
|
+
"@sprucelabs/spruce-skill-booter": "^20.1.17",
|
|
90
|
+
"@sprucelabs/spruce-skill-utils": "^22.2.122",
|
|
91
|
+
"@sprucelabs/spruce-templates": "^14.29.25",
|
|
92
|
+
"@typescript-eslint/eslint-plugin": "^5.9.0",
|
|
93
|
+
"@typescript-eslint/parser": "^5.9.0",
|
|
94
94
|
"cfonts": "^2.10.0",
|
|
95
95
|
"chalk": "^4.1.2",
|
|
96
96
|
"chokidar": "^3.5.2",
|
|
97
97
|
"cli-table3": "^0.6.0",
|
|
98
98
|
"commander": "^7.2.0",
|
|
99
|
-
"core-js": "^3.20.
|
|
99
|
+
"core-js": "^3.20.2",
|
|
100
100
|
"emphasize": "^4.2.0",
|
|
101
101
|
"fs-extra": "^10.0.0",
|
|
102
102
|
"gifwrap": "SimenB/gifwrap#patch-1",
|
|
@@ -119,16 +119,16 @@
|
|
|
119
119
|
"uuid": "^8.3.2"
|
|
120
120
|
},
|
|
121
121
|
"devDependencies": {
|
|
122
|
-
"@sprucelabs/data-stores": "^7.2.
|
|
123
|
-
"@sprucelabs/jest-sheets-reporter": "^1.2.
|
|
124
|
-
"@sprucelabs/mercury-core-events": "^1.7.
|
|
125
|
-
"@sprucelabs/resolve-path-aliases": "^1.0.
|
|
126
|
-
"@sprucelabs/spruce-conversation-plugin": "^20.
|
|
127
|
-
"@sprucelabs/spruce-deploy-plugin": "^20.
|
|
128
|
-
"@sprucelabs/spruce-store-plugin": "^20.
|
|
129
|
-
"@sprucelabs/spruce-test-fixtures": "^20.
|
|
130
|
-
"@sprucelabs/test": "^7.7.
|
|
131
|
-
"@sprucelabs/test-utils": "^3.0.
|
|
122
|
+
"@sprucelabs/data-stores": "^7.2.122",
|
|
123
|
+
"@sprucelabs/jest-sheets-reporter": "^1.2.299",
|
|
124
|
+
"@sprucelabs/mercury-core-events": "^1.7.71",
|
|
125
|
+
"@sprucelabs/resolve-path-aliases": "^1.0.250",
|
|
126
|
+
"@sprucelabs/spruce-conversation-plugin": "^20.1.17",
|
|
127
|
+
"@sprucelabs/spruce-deploy-plugin": "^20.1.17",
|
|
128
|
+
"@sprucelabs/spruce-store-plugin": "^20.1.17",
|
|
129
|
+
"@sprucelabs/spruce-test-fixtures": "^20.1.17",
|
|
130
|
+
"@sprucelabs/test": "^7.7.270",
|
|
131
|
+
"@sprucelabs/test-utils": "^3.0.370",
|
|
132
132
|
"@types/blessed": "^0.1.19",
|
|
133
133
|
"@types/eslint": "^8.2.1",
|
|
134
134
|
"@types/fs-extra": "^9.0.13",
|
|
@@ -138,25 +138,25 @@
|
|
|
138
138
|
"@types/lodash": "^4.14.178",
|
|
139
139
|
"@types/md5": "^2.3.1",
|
|
140
140
|
"@types/mkdirp": "^1.0.2",
|
|
141
|
-
"@types/node": "^17.0.
|
|
141
|
+
"@types/node": "^17.0.8",
|
|
142
142
|
"@types/promise.allsettled": "^1.0.3",
|
|
143
143
|
"@types/ps-node": "^0.1.1",
|
|
144
144
|
"@types/rimraf": "^3.0.2",
|
|
145
145
|
"@types/semver": "^7.3.9",
|
|
146
146
|
"@types/sha1": "^1.1.3",
|
|
147
147
|
"@types/slug": "^5.0.3",
|
|
148
|
-
"@types/superagent": "^4.1.
|
|
148
|
+
"@types/superagent": "^4.1.14",
|
|
149
149
|
"@types/terminal-kit": "^1.28.4",
|
|
150
150
|
"@types/uuid": "^8.3.3",
|
|
151
151
|
"chokidar-cli": "^3.0.0",
|
|
152
|
-
"concurrently": "^
|
|
152
|
+
"concurrently": "^7.0.0",
|
|
153
153
|
"conventional-changelog-sprucelabs": "^1.1.2",
|
|
154
154
|
"dotenv": "^10.0.0",
|
|
155
|
-
"eslint": "^8.
|
|
155
|
+
"eslint": "^8.6.0",
|
|
156
156
|
"eslint-config-spruce": "^10.11.0",
|
|
157
157
|
"find-process": "^1.4.7",
|
|
158
|
-
"jest": "^27.4.
|
|
159
|
-
"jest-circus": "^27.4.
|
|
158
|
+
"jest": "^27.4.6",
|
|
159
|
+
"jest-circus": "^27.4.6",
|
|
160
160
|
"jest-junit": "^13.0.0",
|
|
161
161
|
"jest-reporters": "^0.0.2",
|
|
162
162
|
"prettier": "^2.5.1",
|
|
@@ -597,5 +597,5 @@
|
|
|
597
597
|
"ora"
|
|
598
598
|
]
|
|
599
599
|
},
|
|
600
|
-
"gitHead": "
|
|
600
|
+
"gitHead": "3a6355db298de21235499907bba0d2af59555c1b"
|
|
601
601
|
}
|
|
@@ -62,7 +62,7 @@ export default class TestReporter {
|
|
|
62
62
|
private isDebugging = false
|
|
63
63
|
private watchMode: WatchMode = 'off'
|
|
64
64
|
private status: TestRunnerStatus = 'ready'
|
|
65
|
-
private countDownTimeInterval?:
|
|
65
|
+
private countDownTimeInterval?: any
|
|
66
66
|
private cwd: string | undefined
|
|
67
67
|
private orientation: TestReporterOrientation = 'landscape'
|
|
68
68
|
|
|
@@ -37,7 +37,7 @@ export default class TestAction extends AbstractAction<OptionsSchema> {
|
|
|
37
37
|
private originalInspect!: number
|
|
38
38
|
private watcher?: WatchFeature
|
|
39
39
|
private watchMode: WatchMode = 'off'
|
|
40
|
-
private fileChangeTimeout?:
|
|
40
|
+
private fileChangeTimeout?: any
|
|
41
41
|
private hasWatchEverBeenEnabled = false
|
|
42
42
|
|
|
43
43
|
private readonly watchDelaySec = 2
|
|
@@ -19,13 +19,14 @@ const viewTypeChoices = [
|
|
|
19
19
|
]
|
|
20
20
|
|
|
21
21
|
const viewModels = [
|
|
22
|
+
'BigForm',
|
|
22
23
|
'Button',
|
|
23
|
-
'Dialog',
|
|
24
24
|
'Card',
|
|
25
25
|
'CardBody',
|
|
26
26
|
'CardHeader',
|
|
27
|
+
'Dialog',
|
|
27
28
|
'Form',
|
|
28
|
-
'
|
|
29
|
+
'List',
|
|
29
30
|
].sort()
|
|
30
31
|
|
|
31
32
|
const optionsSchema = buildSchema({
|
|
@@ -288,7 +288,13 @@ export default class TerminalInterface implements GraphicsInterface {
|
|
|
288
288
|
}
|
|
289
289
|
|
|
290
290
|
public renderHero(message: string, effects?: GraphicsTextEffect[]) {
|
|
291
|
-
|
|
291
|
+
const shouldStripVowels = process.stdout.columns < 80
|
|
292
|
+
|
|
293
|
+
const stripped = shouldStripVowels
|
|
294
|
+
? message.replace(/[aeiou]/gi, '')
|
|
295
|
+
: message
|
|
296
|
+
|
|
297
|
+
fonts.say(stripped, {
|
|
292
298
|
// Font: 'tiny',
|
|
293
299
|
align: 'left',
|
|
294
300
|
gradient: [GraphicsTextEffect.Red, GraphicsTextEffect.Blue],
|