@sprucelabs/spruce-cli 28.2.3 → 29.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/build/.spruce/errors/errors.types.d.ts +23 -2
  3. package/build/.spruce/errors/options.types.d.ts +4 -1
  4. package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.d.ts +3 -0
  5. package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.js +20 -0
  6. package/build/.spruce/errors/spruceCli/directoryNotGoModule.schema.js.map +1 -0
  7. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.d.ts +7 -2
  8. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js +36 -13
  9. package/build/__tests__/behavioral/OverridingCommandsInPackageJson.test.js.map +1 -1
  10. package/build/__tests__/behavioral/events/DifferentEventOptions.test.d.ts +16 -0
  11. package/build/__tests__/behavioral/events/DifferentEventOptions.test.js +105 -0
  12. package/build/__tests__/behavioral/events/DifferentEventOptions.test.js.map +1 -0
  13. package/build/__tests__/behavioral/events/KeepingEventsInSync.test.js.map +1 -1
  14. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.d.ts +5 -0
  15. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js +32 -0
  16. package/build/__tests__/behavioral/features/InstallFeaturesInGo.test.js.map +1 -0
  17. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.d.ts +5 -0
  18. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js +21 -13
  19. package/build/__tests__/behavioral/organization/CreatingAnOrg.test.js.map +1 -1
  20. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.d.ts +1 -1
  21. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js +7 -7
  22. package/build/__tests__/behavioral/schemas/KeepingSchemasInSync.test.js.map +1 -1
  23. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.d.ts +39 -0
  24. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js +289 -0
  25. package/build/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.js.map +1 -0
  26. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.d.ts +7 -0
  27. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js +46 -0
  28. package/build/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.js.map +1 -0
  29. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.d.ts +5 -0
  30. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js +31 -0
  31. package/build/__tests__/behavioral/schemas/SyncingSchemasInGo.test.js.map +1 -0
  32. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js +1 -1
  33. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js.map +1 -1
  34. package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js +10 -1
  35. package/build/__tests__/behavioral/upgrading/UpdatingDependencies2.test.js.map +1 -1
  36. package/build/__tests__/implementation/SkillStore.test.d.ts +5 -0
  37. package/build/__tests__/implementation/SkillStore.test.js +37 -0
  38. package/build/__tests__/implementation/SkillStore.test.js.map +1 -1
  39. package/build/__tests__/support/EventFaker.d.ts +7 -0
  40. package/build/__tests__/support/EventFaker.js +43 -0
  41. package/build/__tests__/support/EventFaker.js.map +1 -1
  42. package/build/cli/Cli.js +12 -9
  43. package/build/cli/Cli.js.map +1 -1
  44. package/build/errors/SpruceError.js +3 -0
  45. package/build/errors/SpruceError.js.map +1 -1
  46. package/build/errors/directoryNotGoModule.builder.d.ts +12 -0
  47. package/build/errors/directoryNotGoModule.builder.js +15 -0
  48. package/build/errors/directoryNotGoModule.builder.js.map +1 -0
  49. package/build/features/AbstractAction.d.ts +1 -0
  50. package/build/features/AbstractAction.js +5 -1
  51. package/build/features/AbstractAction.js.map +1 -1
  52. package/build/features/AbstractFeature.d.ts +8 -1
  53. package/build/features/AbstractFeature.js +12 -1
  54. package/build/features/AbstractFeature.js.map +1 -1
  55. package/build/features/ActionFactory.js +1 -2
  56. package/build/features/ActionFactory.js.map +1 -1
  57. package/build/features/ActionQuestionAsker.js +0 -1
  58. package/build/features/ActionQuestionAsker.js.map +1 -1
  59. package/build/features/FeatureInstaller.d.ts +1 -0
  60. package/build/features/FeatureInstaller.js +21 -7
  61. package/build/features/FeatureInstaller.js.map +1 -1
  62. package/build/features/FeatureInstallerFactory.d.ts +1 -0
  63. package/build/features/FeatureInstallerFactory.js +7 -0
  64. package/build/features/FeatureInstallerFactory.js.map +1 -1
  65. package/build/features/OverrideActionDecorator.js +1 -1
  66. package/build/features/OverrideActionDecorator.js.map +1 -1
  67. package/build/features/VersionResolver.js +1 -1
  68. package/build/features/VersionResolver.js.map +1 -1
  69. package/build/features/agent/AgentFeature.d.ts +1 -1
  70. package/build/features/agent/AgentFeature.js +1 -1
  71. package/build/features/agent/AgentFeature.js.map +1 -1
  72. package/build/features/conversation/ConversationFeature.d.ts +1 -1
  73. package/build/features/conversation/ConversationFeature.js +1 -1
  74. package/build/features/conversation/ConversationFeature.js.map +1 -1
  75. package/build/features/dependencies/DependencyFeature.d.ts +0 -1
  76. package/build/features/dependencies/DependencyFeature.js +0 -1
  77. package/build/features/dependencies/DependencyFeature.js.map +1 -1
  78. package/build/features/deploy/DeployFeature.d.ts +1 -1
  79. package/build/features/deploy/DeployFeature.js +1 -1
  80. package/build/features/deploy/DeployFeature.js.map +1 -1
  81. package/build/features/error/ErrorFeature.d.ts +1 -1
  82. package/build/features/error/ErrorFeature.js +1 -1
  83. package/build/features/error/ErrorFeature.js.map +1 -1
  84. package/build/features/event/EventFeature.d.ts +1 -1
  85. package/build/features/event/EventFeature.js +1 -1
  86. package/build/features/event/EventFeature.js.map +1 -1
  87. package/build/features/eventContract/EventContractFeature.d.ts +1 -3
  88. package/build/features/eventContract/EventContractFeature.js +0 -2
  89. package/build/features/eventContract/EventContractFeature.js.map +1 -1
  90. package/build/features/node/NodeFeature.d.ts +1 -1
  91. package/build/features/node/NodeFeature.js +1 -1
  92. package/build/features/node/NodeFeature.js.map +1 -1
  93. package/build/features/onboard/OnboardFeature.d.ts +1 -3
  94. package/build/features/onboard/OnboardFeature.js +0 -2
  95. package/build/features/onboard/OnboardFeature.js.map +1 -1
  96. package/build/features/organization/OrganizationFeature.d.ts +0 -1
  97. package/build/features/organization/OrganizationFeature.js +0 -1
  98. package/build/features/organization/OrganizationFeature.js.map +1 -1
  99. package/build/features/permission/PermissionFeature.d.ts +2 -3
  100. package/build/features/permission/PermissionFeature.js +1 -2
  101. package/build/features/permission/PermissionFeature.js.map +1 -1
  102. package/build/features/person/PersonFeature.d.ts +1 -3
  103. package/build/features/person/PersonFeature.js +0 -2
  104. package/build/features/person/PersonFeature.js.map +1 -1
  105. package/build/features/polish/PolishFeature.d.ts +1 -1
  106. package/build/features/polish/PolishFeature.js +1 -1
  107. package/build/features/polish/PolishFeature.js.map +1 -1
  108. package/build/features/sandbox/SandboxFeature.d.ts +0 -1
  109. package/build/features/sandbox/SandboxFeature.js +0 -1
  110. package/build/features/sandbox/SandboxFeature.js.map +1 -1
  111. package/build/features/schema/SchemaFeature.d.ts +2 -3
  112. package/build/features/schema/SchemaFeature.js +6 -1
  113. package/build/features/schema/SchemaFeature.js.map +1 -1
  114. package/build/features/schema/actions/SyncAction.d.ts +5 -2
  115. package/build/features/schema/actions/SyncAction.js +50 -16
  116. package/build/features/schema/actions/SyncAction.js.map +1 -1
  117. package/build/features/schema/utilities/schemaDisk.utility.d.ts +7 -0
  118. package/build/features/schema/utilities/schemaDisk.utility.js +22 -4
  119. package/build/features/schema/utilities/schemaDisk.utility.js.map +1 -1
  120. package/build/features/schema/utilities/schemaGenerator.utility.d.ts +1 -0
  121. package/build/features/schema/utilities/schemaGenerator.utility.js +18 -10
  122. package/build/features/schema/utilities/schemaGenerator.utility.js.map +1 -1
  123. package/build/features/schema/writers/SchemaWriter.d.ts +9 -9
  124. package/build/features/schema/writers/SchemaWriter.js +38 -17
  125. package/build/features/schema/writers/SchemaWriter.js.map +1 -1
  126. package/build/features/skill/SkillFeature.d.ts +1 -1
  127. package/build/features/skill/SkillFeature.js +1 -1
  128. package/build/features/skill/SkillFeature.js.map +1 -1
  129. package/build/features/skill/stores/SkillStore.d.ts +5 -0
  130. package/build/features/skill/stores/SkillStore.js +40 -3
  131. package/build/features/skill/stores/SkillStore.js.map +1 -1
  132. package/build/features/store/StoreFeature.d.ts +1 -1
  133. package/build/features/store/StoreFeature.js +1 -1
  134. package/build/features/store/StoreFeature.js.map +1 -1
  135. package/build/features/test/TestFeature.d.ts +1 -1
  136. package/build/features/test/TestFeature.js +1 -1
  137. package/build/features/test/TestFeature.js.map +1 -1
  138. package/build/features/test/TestReporter.js +1 -1
  139. package/build/features/test/TestReporter.js.map +1 -1
  140. package/build/features/view/ViewFeature.d.ts +1 -1
  141. package/build/features/view/ViewFeature.js +1 -1
  142. package/build/features/view/ViewFeature.js.map +1 -1
  143. package/build/migration/EsLint9Migrator.d.ts +1 -0
  144. package/build/packageManager/NodePackageManager.d.ts +14 -0
  145. package/build/packageManager/NodePackageManager.js +88 -0
  146. package/build/packageManager/NodePackageManager.js.map +1 -0
  147. package/build/packageManager/packageManager.types.d.ts +16 -0
  148. package/build/packageManager/packageManager.types.js +3 -0
  149. package/build/packageManager/packageManager.types.js.map +1 -0
  150. package/build/services/GoPackageManager.d.ts +10 -0
  151. package/build/services/GoPackageManager.js +39 -0
  152. package/build/services/GoPackageManager.js.map +1 -0
  153. package/build/services/PkgService.d.ts +3 -7
  154. package/build/services/PkgService.js +13 -68
  155. package/build/services/PkgService.js.map +1 -1
  156. package/build/templateItemBuilders/SchemaTemplateItemBuilder.js.map +1 -1
  157. package/build/tests/AbstractCliTest.d.ts +5 -1
  158. package/build/tests/AbstractCliTest.js +15 -3
  159. package/build/tests/AbstractCliTest.js.map +1 -1
  160. package/build/tests/fixtures/FeatureFixture.js +4 -1
  161. package/build/tests/fixtures/FeatureFixture.js.map +1 -1
  162. package/build/tests/fixtures/GoFixture.d.ts +12 -0
  163. package/build/tests/fixtures/GoFixture.js +39 -0
  164. package/build/tests/fixtures/GoFixture.js.map +1 -0
  165. package/build/tests/staticToInstanceMigration/StaticToInstanceMigrator.d.ts +1 -0
  166. package/build/widgets/terminalKit/TkTextWidget.js +3 -2
  167. package/build/widgets/terminalKit/TkTextWidget.js.map +1 -1
  168. package/build/writers/AbstractWriter.js +7 -6
  169. package/build/writers/AbstractWriter.js.map +1 -1
  170. package/package.json +30 -30
  171. package/src/.spruce/errors/errors.types.ts +32 -2
  172. package/src/.spruce/errors/options.types.ts +4 -1
  173. package/src/.spruce/errors/spruceCli/directoryNotGoModule.schema.ts +23 -0
  174. package/src/__tests__/behavioral/OverridingCommandsInPackageJson.test.ts +60 -13
  175. package/src/__tests__/behavioral/events/DifferentEventOptions.test.ts +134 -0
  176. package/src/__tests__/behavioral/events/KeepingEventsInSync.test.ts +0 -1
  177. package/src/__tests__/behavioral/features/InstallFeaturesInGo.test.ts +17 -0
  178. package/src/__tests__/behavioral/organization/CreatingAnOrg.test.ts +29 -22
  179. package/src/__tests__/behavioral/schemas/KeepingSchemasInSync.test.ts +6 -9
  180. package/src/__tests__/behavioral/schemas/SyncingCoreSchemasInGo.test.ts +376 -0
  181. package/src/__tests__/behavioral/schemas/SyncingSchemasInChildDirInGo.test.ts +46 -0
  182. package/src/__tests__/behavioral/schemas/SyncingSchemasInGo.test.ts +23 -0
  183. package/src/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.ts +1 -1
  184. package/src/__tests__/behavioral/upgrading/UpdatingDependencies2.test.ts +15 -2
  185. package/src/__tests__/implementation/SkillStore.test.ts +44 -1
  186. package/src/__tests__/support/EventFaker.ts +56 -0
  187. package/src/cli/Cli.ts +20 -12
  188. package/src/errors/SpruceError.ts +4 -0
  189. package/src/errors/directoryNotGoModule.builder.ts +13 -0
  190. package/src/features/AbstractAction.ts +6 -4
  191. package/src/features/AbstractFeature.ts +20 -1
  192. package/src/features/ActionFactory.ts +2 -2
  193. package/src/features/ActionQuestionAsker.ts +0 -1
  194. package/src/features/FeatureInstaller.ts +30 -6
  195. package/src/features/FeatureInstallerFactory.ts +9 -0
  196. package/src/features/OverrideActionDecorator.ts +1 -1
  197. package/src/features/VersionResolver.ts +2 -1
  198. package/src/features/agent/AgentFeature.ts +1 -1
  199. package/src/features/conversation/ConversationFeature.ts +1 -1
  200. package/src/features/dependencies/DependencyFeature.ts +0 -1
  201. package/src/features/deploy/DeployFeature.ts +1 -1
  202. package/src/features/error/ErrorFeature.ts +1 -1
  203. package/src/features/event/EventFeature.ts +1 -1
  204. package/src/features/eventContract/EventContractFeature.ts +1 -3
  205. package/src/features/node/NodeFeature.ts +1 -1
  206. package/src/features/onboard/OnboardFeature.ts +1 -7
  207. package/src/features/organization/OrganizationFeature.ts +0 -1
  208. package/src/features/permission/PermissionFeature.ts +1 -3
  209. package/src/features/person/PersonFeature.ts +1 -4
  210. package/src/features/polish/PolishFeature.ts +1 -1
  211. package/src/features/sandbox/SandboxFeature.ts +0 -1
  212. package/src/features/schema/SchemaFeature.ts +8 -2
  213. package/src/features/schema/actions/SyncAction.ts +68 -26
  214. package/src/features/schema/utilities/schemaDisk.utility.ts +43 -11
  215. package/src/features/schema/utilities/schemaGenerator.utility.ts +33 -13
  216. package/src/features/schema/writers/SchemaWriter.ts +71 -25
  217. package/src/features/skill/SkillFeature.ts +1 -1
  218. package/src/features/skill/stores/SkillStore.ts +51 -5
  219. package/src/features/store/StoreFeature.ts +1 -1
  220. package/src/features/test/TestFeature.ts +1 -1
  221. package/src/features/test/TestReporter.ts +1 -1
  222. package/src/features/view/ViewFeature.ts +1 -1
  223. package/src/packageManager/NodePackageManager.ts +115 -0
  224. package/src/packageManager/packageManager.types.ts +21 -0
  225. package/src/services/GoPackageManager.ts +45 -0
  226. package/src/services/PkgService.ts +17 -92
  227. package/src/templateItemBuilders/SchemaTemplateItemBuilder.ts +6 -6
  228. package/src/tests/AbstractCliTest.ts +19 -5
  229. package/src/tests/fixtures/FeatureFixture.ts +3 -1
  230. package/src/tests/fixtures/GoFixture.ts +39 -0
  231. package/src/widgets/terminalKit/TkTextWidget.ts +3 -2
  232. package/src/writers/AbstractWriter.ts +15 -6
@@ -0,0 +1,45 @@
1
+ import { diskUtil } from '@sprucelabs/spruce-skill-utils'
2
+ import {
3
+ PackageManager,
4
+ PackageManagerConstructorOptions,
5
+ } from '../packageManager/packageManager.types'
6
+ import { CommandService } from './CommandService'
7
+
8
+ export class GoPackageManager implements PackageManager {
9
+ private commandService: CommandService
10
+ public constructor(options: PackageManagerConstructorOptions) {
11
+ const { commandService } = options
12
+ this.commandService = commandService
13
+ }
14
+
15
+ public async installDependencies(pkg?: string[] | string) {
16
+ const first = Array.isArray(pkg) ? pkg[0] : pkg
17
+ if (first) {
18
+ await this.commandService.execute('go', {
19
+ args: ['get', first],
20
+ env: this.buildEnv(),
21
+ })
22
+ return {
23
+ totalInstalled: 1,
24
+ totalSkipped: 0,
25
+ }
26
+ }
27
+
28
+ return {
29
+ totalInstalled: 0,
30
+ totalSkipped: 0,
31
+ }
32
+ }
33
+
34
+ private buildEnv() {
35
+ const cwd = this.commandService.getCwd()
36
+ const goCacheDir = diskUtil.resolvePath(cwd, '.go-cache')
37
+
38
+ diskUtil.createDir(goCacheDir)
39
+
40
+ return {
41
+ HOME: process.env.HOME ?? cwd,
42
+ GOCACHE: process.env.GOCACHE ?? goCacheDir,
43
+ }
44
+ }
45
+ }
@@ -1,114 +1,39 @@
1
- import pathUtil from 'path'
2
1
  import {
3
2
  diskUtil,
4
3
  PkgService as BasePkgService,
5
4
  } from '@sprucelabs/spruce-skill-utils'
6
- import isCi from '../utilities/isCi'
5
+ import NodePackageManager from '../packageManager/NodePackageManager'
6
+ import { PackageManager } from '../packageManager/packageManager.types'
7
7
  import CommandServiceImpl from './CommandService'
8
+ import { GoPackageManager } from './GoPackageManager'
8
9
 
9
10
  export default class PkgService extends BasePkgService {
10
- private commandService: CommandServiceImpl
11
+ private packageManager: PackageManager
11
12
 
12
13
  public constructor(cwd: string, commandService: CommandServiceImpl) {
13
14
  super(cwd)
14
- this.commandService = commandService
15
+ const PackageManagerClass =
16
+ diskUtil.detectProjectLanguage(cwd) === 'go'
17
+ ? GoPackageManager
18
+ : NodePackageManager
19
+
20
+ this.packageManager = new PackageManagerClass({
21
+ cwd,
22
+ commandService,
23
+ pkgService: this,
24
+ })
15
25
  }
16
26
 
17
27
  public async install(pkg?: string[] | string, options?: AddOptions) {
18
- const shouldCleanupLockFiles = options?.shouldCleanupLockFiles !== false
19
- const deleteLockFile = shouldCleanupLockFiles
20
- ? this.deleteLockFile.bind(this)
21
- : () => {}
22
-
23
- if (!pkg) {
24
- await this.commandService.execute('yarn', { args: ['install'] })
25
- deleteLockFile()
26
- return { totalInstalled: -1, totalSkipped: -1 }
27
- }
28
-
29
- deleteLockFile()
30
-
31
- const packages = Array.isArray(pkg) ? pkg : [pkg]
32
- const toInstall = []
33
- const labsModules: string[] = []
34
-
35
- let totalInstalled = 0
36
- let totalSkipped = 0
37
-
38
- for (const thisPackage of packages) {
39
- const isInstalled =
40
- !options?.shouldForceInstall && this.isInstalled(thisPackage)
41
- if (thisPackage.startsWith('@sprucelabs/') || !isInstalled) {
42
- toInstall.push(this.stripLatest(thisPackage))
43
- totalInstalled++
44
- } else {
45
- totalSkipped++
46
- }
47
- }
48
-
49
- if (totalInstalled > 0) {
50
- const { executable, args } = PkgService.buildCommandAndArgs(
51
- toInstall,
52
- options
53
- )
54
-
55
- const isInWorkspace = this.get('workspaces')?.length > 0
56
- if (isInWorkspace) {
57
- args.push('-W')
58
- }
59
-
60
- await this.commandService.execute(executable, {
61
- args,
62
- })
63
- } else if (
64
- !diskUtil.doesDirExist(pathUtil.join(this.cwd, 'node_modules'))
65
- ) {
66
- await this.commandService.execute('yarn', { args: ['install'] })
67
- }
68
-
69
- deleteLockFile()
70
-
71
- this._parsedPkg = undefined
72
-
73
- return {
74
- totalInstalled: totalInstalled + labsModules.length,
75
- totalSkipped,
76
- }
77
- }
78
-
79
- public static buildCommandAndArgs(
80
- toInstall: string[],
81
- options: AddOptions | undefined
82
- ) {
83
- const args: any[] = [
84
- isCi() && '--cache-folder',
85
- isCi() && diskUtil.createRandomTempDir(),
86
- 'add',
87
- ...toInstall,
88
- ].filter((a) => !!a)
89
-
90
- if (options?.isDev) {
91
- args.push('-D')
92
- }
93
-
94
- const executable = 'yarn'
95
- return { executable, args }
28
+ return this.packageManager.installDependencies(pkg, options)
96
29
  }
97
30
 
98
31
  public getSkillNamespace() {
99
- return this.get('skill.namespace')
32
+ return this.get('skill.namespace') as string
100
33
  }
101
34
 
102
35
  public async uninstall(pkg: string[] | string) {
103
- const packages = Array.isArray(pkg) ? pkg : [pkg]
104
- const args: string[] = ['uninstall', ...packages]
105
- await this.commandService.execute('npm', {
106
- args,
107
- })
108
-
109
- this._parsedPkg = undefined
110
-
111
- await this.install()
36
+ return this.packageManager.uninstallDependencies?.(pkg)
112
37
  }
113
38
  }
114
39
 
@@ -14,12 +14,6 @@ import SpruceError from '../errors/SpruceError'
14
14
  import { SchemasByNamespace } from '../features/schema/stores/SchemaStore'
15
15
  import schemaUtil from '../features/schema/utilities/schema.utility'
16
16
 
17
- interface SchemaWithDependencies {
18
- schema: Schema
19
- dependencies: SchemaIdWithVersion[]
20
- isNested: boolean
21
- }
22
-
23
17
  export default class SchemaTemplateItemBuilder {
24
18
  private schemasByKey: Record<string, SchemaWithDependencies> = {}
25
19
  private localNamespace: string
@@ -251,3 +245,9 @@ export default class SchemaTemplateItemBuilder {
251
245
  return undefined
252
246
  }
253
247
  }
248
+
249
+ interface SchemaWithDependencies {
250
+ schema: Schema
251
+ dependencies: SchemaIdWithVersion[]
252
+ isNested: boolean
253
+ }
@@ -38,6 +38,7 @@ import CommandFaker from './CommandFaker'
38
38
  import FeatureFixture, {
39
39
  FeatureFixtureOptions,
40
40
  } from './fixtures/FeatureFixture'
41
+ import GoFixture from './fixtures/GoFixture'
41
42
  import MercuryFixture from './fixtures/MercuryFixture'
42
43
  import OrganizationFixture from './fixtures/OrganizationFixture'
43
44
  import PersonFixture from './fixtures/PersonFixture'
@@ -58,6 +59,7 @@ export default abstract class AbstractCliTest extends AbstractSpruceTest {
58
59
  private static skillFixture?: SkillFixture
59
60
  private static _featureInstaller?: FeatureInstaller
60
61
  private static viewFixture?: ViewFixture
62
+ private static goFixture?: GoFixture
61
63
  private static originalEnv: Record<string, string | undefined>
62
64
  private static _writers?: WriterFactory
63
65
  protected static eventFaker: EventFaker
@@ -99,16 +101,13 @@ export default abstract class AbstractCliTest extends AbstractSpruceTest {
99
101
 
100
102
  AuthService.homeDir = this.homeDir
101
103
 
102
- this._emitter = undefined
103
- this._featureInstaller = undefined
104
-
105
104
  OnboardingStore.overrideCwd(diskUtil.createRandomTempDir())
106
105
 
107
106
  this.ui.reset()
108
107
  this.ui.invocations = []
109
108
  this.ui.setCursorPosition({ x: 0, y: 0 })
110
109
 
111
- this.clearFixtures()
110
+ this.setCwd(this.cwd)
112
111
 
113
112
  ImportService.clearCache()
114
113
  SkillStoreImpl.clearCurrentSkill()
@@ -166,13 +165,20 @@ export default abstract class AbstractCliTest extends AbstractSpruceTest {
166
165
  }
167
166
  }
168
167
 
169
- private static clearFixtures() {
168
+ protected static clearFixtures() {
169
+ this._featureInstaller = undefined
170
170
  this._emitter = undefined
171
171
  this.mercuryFixture = undefined
172
172
  this.organizationFixture = undefined
173
173
  this.personFixture = undefined
174
174
  this.skillFixture = undefined
175
175
  this.viewFixture = undefined
176
+ this.goFixture = undefined
177
+ }
178
+
179
+ protected static setCwd(cwd: string) {
180
+ this.clearFixtures()
181
+ this.cwd = cwd
176
182
  }
177
183
 
178
184
  protected static freshTmpDir() {
@@ -267,6 +273,14 @@ export default abstract class AbstractCliTest extends AbstractSpruceTest {
267
273
  return this.personFixture
268
274
  }
269
275
 
276
+ protected static get go() {
277
+ if (!this.goFixture) {
278
+ this.goFixture = new GoFixture(this.Service('command'))
279
+ }
280
+
281
+ return this.goFixture
282
+ }
283
+
270
284
  protected static getViewFixture() {
271
285
  if (!this.viewFixture) {
272
286
  const viewWriter = this.writers.Writer('view', {
@@ -47,7 +47,9 @@ export default class FeatureFixture implements ServiceProvider {
47
47
 
48
48
  public static deleteOldSkillDirs() {
49
49
  for (const dir of this.dirsToDelete) {
50
- diskUtil.deleteDir(dir)
50
+ try {
51
+ diskUtil.deleteDir(dir)
52
+ } catch {}
51
53
  }
52
54
 
53
55
  this.dirsToDelete = []
@@ -0,0 +1,39 @@
1
+ import os from 'os'
2
+ import { generateId } from '@sprucelabs/test-utils'
3
+ import { CommandService } from '../../services/CommandService'
4
+
5
+ export default class GoFixture {
6
+ private cmdService: CommandService
7
+ public constructor(cmdService: CommandService) {
8
+ this.cmdService = cmdService
9
+ }
10
+
11
+ public async initGoProject(name?: string) {
12
+ const moduleName = `github.com/${generateId()}/${name ?? generateId()}`
13
+ await this.cmdService.execute(`go mod init ${moduleName}`, {
14
+ env: this.buildEnv(),
15
+ })
16
+ return moduleName
17
+ }
18
+
19
+ public setCwd(dir: string) {
20
+ this.cmdService.setCwd(dir)
21
+ }
22
+
23
+ public async exec(command: string, arg1: string) {
24
+ return this.cmdService.execute(`go`, {
25
+ args: [command, arg1],
26
+ env: this.buildEnv(),
27
+ })
28
+ }
29
+
30
+ private buildEnv() {
31
+ return {
32
+ HOME: os.homedir(),
33
+ }
34
+ }
35
+
36
+ public async vet() {
37
+ await this.exec('vet', './...')
38
+ }
39
+ }
@@ -154,9 +154,10 @@ export default class TkTextWidget extends TkBaseWidget implements TextWidget {
154
154
  return segment
155
155
  }
156
156
 
157
- if ('{}[]'.includes(segment)) {
157
+ if (segment.trim().length > 0) {
158
158
  // Terminal-kit drops single-character chunks when parsing ANSI
159
- // sequences, so pad with a zero-width space to keep braces visible.
159
+ // sequences, so pad with a zero-width space to keep visible
160
+ // single characters (digits, braces, etc.) from disappearing.
160
161
  return `${segment}​`
161
162
  }
162
163
 
@@ -24,12 +24,21 @@ export default abstract class AbstractWriter {
24
24
  protected isLintEnabled = true
25
25
 
26
26
  public constructor(options: WriterOptions) {
27
- this.templates = options.templates
28
- this.ui = options.term
29
- this.upgradeMode = options.upgradeMode
30
- this.fileDescriptions = options.fileDescriptions
31
- this.linter = options.linter
32
- this.settings = options.settings
27
+ const {
28
+ templates,
29
+ term,
30
+ upgradeMode,
31
+ fileDescriptions,
32
+ linter,
33
+ settings,
34
+ } = options
35
+
36
+ this.templates = templates
37
+ this.ui = term
38
+ this.upgradeMode = upgradeMode
39
+ this.fileDescriptions = fileDescriptions
40
+ this.linter = linter
41
+ this.settings = settings
33
42
  }
34
43
 
35
44
  protected async lint(file: string) {