@sprucelabs/spruce-cli 29.0.0 → 29.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/build/__tests__/behavioral/events/DifferentEventOptions.test.d.ts +16 -0
  3. package/build/__tests__/behavioral/events/DifferentEventOptions.test.js +105 -0
  4. package/build/__tests__/behavioral/events/DifferentEventOptions.test.js.map +1 -0
  5. package/build/__tests__/behavioral/events/KeepingEventsInSync.test.js.map +1 -1
  6. package/build/__tests__/behavioral/skill/RegisteringAGoSkill.test.d.ts +5 -0
  7. package/build/__tests__/behavioral/skill/RegisteringAGoSkill.test.js +41 -0
  8. package/build/__tests__/behavioral/skill/RegisteringAGoSkill.test.js.map +1 -0
  9. package/build/__tests__/behavioral/skill/UnregisteringASkill.test.d.ts +23 -0
  10. package/build/__tests__/behavioral/skill/UnregisteringASkill.test.js +143 -0
  11. package/build/__tests__/behavioral/skill/UnregisteringASkill.test.js.map +1 -0
  12. package/build/__tests__/support/EventFaker.d.ts +10 -2
  13. package/build/__tests__/support/EventFaker.js +49 -2
  14. package/build/__tests__/support/EventFaker.js.map +1 -1
  15. package/build/errors/SpruceError.js +1 -1
  16. package/build/errors/SpruceError.js.map +1 -1
  17. package/build/features/FeatureInstaller.d.ts +1 -1
  18. package/build/features/FeatureInstallerFactory.js +3 -0
  19. package/build/features/FeatureInstallerFactory.js.map +1 -1
  20. package/build/features/global/GlobalFeature.d.ts +21 -0
  21. package/build/features/global/GlobalFeature.js +21 -0
  22. package/build/features/global/GlobalFeature.js.map +1 -0
  23. package/build/features/global/actions/UnregisterSkillAction.d.ts +18 -0
  24. package/build/features/global/actions/UnregisterSkillAction.js +59 -0
  25. package/build/features/global/actions/UnregisterSkillAction.js.map +1 -0
  26. package/build/features/skill/stores/SkillStore.d.ts +1 -0
  27. package/build/features/skill/stores/SkillStore.js +3 -0
  28. package/build/features/skill/stores/SkillStore.js.map +1 -1
  29. package/build/widgets/terminalKit/TkTextWidget.js +3 -2
  30. package/build/widgets/terminalKit/TkTextWidget.js.map +1 -1
  31. package/package.json +4 -4
  32. package/src/__tests__/behavioral/events/DifferentEventOptions.test.ts +134 -0
  33. package/src/__tests__/behavioral/events/KeepingEventsInSync.test.ts +0 -1
  34. package/src/__tests__/behavioral/skill/RegisteringAGoSkill.test.ts +29 -0
  35. package/src/__tests__/behavioral/skill/UnregisteringASkill.test.ts +160 -0
  36. package/src/__tests__/support/EventFaker.ts +75 -4
  37. package/src/errors/SpruceError.ts +1 -1
  38. package/src/features/FeatureInstallerFactory.ts +3 -0
  39. package/src/features/global/GlobalFeature.ts +29 -0
  40. package/src/features/global/actions/UnregisterSkillAction.ts +67 -0
  41. package/src/features/skill/stores/SkillStore.ts +4 -0
  42. package/src/widgets/terminalKit/TkTextWidget.ts +3 -2
@@ -0,0 +1,21 @@
1
+ import { NpmPackage } from '@sprucelabs/spruce-skill-utils';
2
+ import AbstractFeature, { FeatureDependency } from '../AbstractFeature';
3
+ import { FeatureCode } from '../features.types';
4
+ export default class GlobalFeature extends AbstractFeature {
5
+ code: FeatureCode;
6
+ nameReadable: string;
7
+ description: string;
8
+ dependencies: FeatureDependency[];
9
+ _packageDependencies: NpmPackage[];
10
+ actionsDir: string;
11
+ scripts: {};
12
+ isInstalled(): Promise<boolean>;
13
+ }
14
+ declare module '../../features/features.types' {
15
+ interface FeatureMap {
16
+ global: GlobalFeature;
17
+ }
18
+ interface FeatureOptionsMap {
19
+ global: undefined;
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const spruce_skill_utils_1 = require("@sprucelabs/spruce-skill-utils");
7
+ const AbstractFeature_1 = __importDefault(require("../AbstractFeature"));
8
+ class GlobalFeature extends AbstractFeature_1.default {
9
+ code = 'global';
10
+ nameReadable = 'Global';
11
+ description = 'Place for all global actions that affect your Spruce account (outside your profile).';
12
+ dependencies = [];
13
+ _packageDependencies = [];
14
+ actionsDir = spruce_skill_utils_1.diskUtil.resolvePath(__dirname, 'actions');
15
+ scripts = {};
16
+ async isInstalled() {
17
+ return true;
18
+ }
19
+ }
20
+ exports.default = GlobalFeature;
21
+ //# sourceMappingURL=GlobalFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalFeature.js","sourceRoot":"","sources":["../../../src/features/global/GlobalFeature.ts"],"names":[],"mappings":";;;;;AAAA,uEAAqE;AACrE,yEAAuE;AAGvE,MAAqB,aAAc,SAAQ,yBAAe;IAC/C,IAAI,GAAgB,QAAQ,CAAA;IAC5B,YAAY,GAAG,QAAQ,CAAA;IACvB,WAAW,GACd,sFAAsF,CAAA;IACnF,YAAY,GAAwB,EAAE,CAAA;IACtC,oBAAoB,GAAiB,EAAE,CAAA;IAEvC,UAAU,GAAG,6BAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACvD,OAAO,GAAG,EAAE,CAAA;IAEZ,KAAK,CAAC,WAAW;QACpB,OAAO,IAAI,CAAA;IACf,CAAC;CACJ;AAdD,gCAcC"}
@@ -0,0 +1,18 @@
1
+ import AbstractAction from '../../AbstractAction';
2
+ import { ActionOptions, FeatureActionResponse } from '../../features.types';
3
+ declare const optionsSchema: {
4
+ id: string;
5
+ description: string;
6
+ fields: {};
7
+ };
8
+ type OptionsSchema = typeof optionsSchema;
9
+ export default class UnregisterSkillAction extends AbstractAction<OptionsSchema> {
10
+ optionsSchema: OptionsSchema;
11
+ commandAliases: string[];
12
+ invocationMessage: string;
13
+ private skills;
14
+ constructor(options: ActionOptions);
15
+ execute(): Promise<FeatureActionResponse>;
16
+ private skillToChoices;
17
+ }
18
+ export {};
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = require("@sprucelabs/schema");
7
+ const SpruceError_1 = __importDefault(require("../../../errors/SpruceError"));
8
+ const AbstractAction_1 = __importDefault(require("../../AbstractAction"));
9
+ const optionsSchema = (0, schema_1.buildSchema)({
10
+ id: 'unregisterSkill',
11
+ description: 'Unregister a skill from your account.',
12
+ fields: {},
13
+ });
14
+ class UnregisterSkillAction extends AbstractAction_1.default {
15
+ optionsSchema = optionsSchema;
16
+ commandAliases = ['unregister.skill'];
17
+ invocationMessage = 'Unregistering skill... 🔧';
18
+ skills;
19
+ constructor(options) {
20
+ super(options);
21
+ this.skills = this.Store('skill');
22
+ }
23
+ async execute() {
24
+ const response = {};
25
+ const skills = await this.skills.fetchMySkills();
26
+ if (skills.length > 0) {
27
+ const skillId = await this.ui.prompt({
28
+ type: 'select',
29
+ isRequired: true,
30
+ options: {
31
+ choices: skills.map((skill) => this.skillToChoices(skill)),
32
+ },
33
+ });
34
+ const match = skills.find((s) => s.id === skillId);
35
+ const confirm = await this.ui.confirm(`Are you sure you want to unregister the skill "${match?.name}"?`);
36
+ if (confirm) {
37
+ await this.skills.unregisterSkill(skillId);
38
+ response.summaryLines = [`Unregistered ${match?.name}`];
39
+ }
40
+ else {
41
+ response.summaryLines = ['Unregister cancelled.'];
42
+ }
43
+ }
44
+ else {
45
+ response.errors = [
46
+ new SpruceError_1.default({ code: 'NO_SKILLS_REGISTERED' }),
47
+ ];
48
+ }
49
+ return response;
50
+ }
51
+ skillToChoices(skill) {
52
+ return {
53
+ value: skill.id,
54
+ label: `${skill.slug}: ${skill.name}`,
55
+ };
56
+ }
57
+ }
58
+ exports.default = UnregisterSkillAction;
59
+ //# sourceMappingURL=UnregisterSkillAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnregisterSkillAction.js","sourceRoot":"","sources":["../../../../src/features/global/actions/UnregisterSkillAction.ts"],"names":[],"mappings":";;;;;AAAA,+CAAgD;AAEhD,8EAAqD;AACrD,0EAAiD;AAIjD,MAAM,aAAa,GAAG,IAAA,oBAAW,EAAC;IAC9B,EAAE,EAAE,iBAAiB;IACrB,WAAW,EAAE,uCAAuC;IACpD,MAAM,EAAE,EAAE;CACb,CAAC,CAAA;AAIF,MAAqB,qBAAsB,SAAQ,wBAA6B;IACrE,aAAa,GAAkB,aAAa,CAAA;IAC5C,cAAc,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACrC,iBAAiB,GAAG,2BAA2B,CAAA;IAC9C,MAAM,CAAY;IAE1B,YAAmB,OAAsB;QACrC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,MAAM,QAAQ,GAA0B,EAAE,CAAA;QAE1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;QAChD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;gBACjC,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE;oBACL,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;iBAC7D;aACJ,CAAC,CAAA;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;YAElD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CACjC,kDAAkD,KAAK,EAAE,IAAI,IAAI,CACpE,CAAA;YAED,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;gBAC1C,QAAQ,CAAC,YAAY,GAAG,CAAC,gBAAgB,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YAC3D,CAAC;iBAAM,CAAC;gBACJ,QAAQ,CAAC,YAAY,GAAG,CAAC,uBAAuB,CAAC,CAAA;YACrD,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,MAAM,GAAG;gBACd,IAAI,qBAAW,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;aACpD,CAAA;QACL,CAAC;QAED,OAAO,QAAQ,CAAA;IACnB,CAAC;IAEO,cAAc,CAAC,KAAgB;QACnC,OAAO;YACH,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE;SACxC,CAAA;IACL,CAAC;CACJ;AAnDD,wCAmDC"}
@@ -22,6 +22,7 @@ export default class SkillStoreImpl extends AbstractStore implements SkillStore
22
22
  private getSkillDescriptionFromPkg;
23
23
  unregisterSkill(skillId?: string): Promise<void>;
24
24
  fetchMySkills(): Promise<Pick<import("@sprucelabs/schema").SchemaStaticValues<SpruceSchemas.Mercury.v2020_12_25.ListSkillsSkillSchema, false, import("@sprucelabs/schema").SchemaOptionalFieldNames<SpruceSchemas.Mercury.v2020_12_25.ListSkillsSkillSchema>, import("@sprucelabs/schema").StaticSchemaAllValues<SpruceSchemas.Mercury.v2020_12_25.ListSkillsSkillSchema, false>>, "id" | "name" | "description" | "slug" | "isPublished" | "canBeInstalled" | "dateCreated" | "dateDeleted">[]>;
25
+ static setCurrentSkill(skill: CurrentSkill): void;
25
26
  fetchAllSkills(query?: {
26
27
  shouldOnlyShowMine?: boolean;
27
28
  namespaces?: string[];
@@ -184,6 +184,9 @@ class SkillStoreImpl extends AbstractStore_1.default {
184
184
  async fetchMySkills() {
185
185
  return this.fetchAllSkills({ shouldOnlyShowMine: true });
186
186
  }
187
+ static setCurrentSkill(skill) {
188
+ this.currentSkill = skill;
189
+ }
187
190
  async fetchAllSkills(query) {
188
191
  const client = await this.connectToApi();
189
192
  const [{ skills }] = await client.emitAndFlattenResponses('list-skills::v2020_12_25', {
@@ -1 +1 @@
1
- {"version":3,"file":"SkillStore.js","sourceRoot":"","sources":["../../../../src/features/skill/stores/SkillStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SkillStore.js","sourceRoot":"","sources":["../../../../src/features/skill/stores/SkillStore.ts"],"names":[],"mappings":"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"}
@@ -115,9 +115,10 @@ class TkTextWidget extends TkBaseWidget_1.default {
115
115
  if (segment.length !== 1) {
116
116
  return segment;
117
117
  }
118
- if ('{}[]()'.includes(segment)) {
118
+ if (segment.trim().length > 0) {
119
119
  // Terminal-kit drops single-character chunks when parsing ANSI
120
- // sequences, so pad with a zero-width space to keep braces visible.
120
+ // sequences, so pad with a zero-width space to keep visible
121
+ // single characters (digits, braces, etc.) from disappearing.
121
122
  return `${segment}​`;
122
123
  }
123
124
  return segment;
@@ -1 +1 @@
1
- {"version":3,"file":"TkTextWidget.js","sourceRoot":"","sources":["../../../src/widgets/terminalKit/TkTextWidget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TkTextWidget.js","sourceRoot":"","sources":["../../../src/widgets/terminalKit/TkTextWidget.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "29.0.0",
7
+ "version": "29.1.0",
8
8
  "skill": {
9
9
  "namespace": "spruce-cli",
10
10
  "upgradeIgnoreList": [
@@ -85,7 +85,7 @@
85
85
  "@sprucelabs/spruce-core-schemas": "^41.3.41",
86
86
  "@sprucelabs/spruce-event-utils": "^41.0.160",
87
87
  "@sprucelabs/spruce-skill-utils": "^32.1.16",
88
- "@sprucelabs/spruce-templates": "^29.0.0",
88
+ "@sprucelabs/spruce-templates": "^29.1.0",
89
89
  "@typescript-eslint/eslint-plugin": "^8.46.2",
90
90
  "@typescript-eslint/parser": "^8.46.2",
91
91
  "cfonts": "^3.3.1",
@@ -534,7 +534,7 @@
534
534
  ]
535
535
  },
536
536
  "jest": {
537
- "maxWorkers": 4,
537
+ "maxWorkers": 2,
538
538
  "testTimeout": 600000,
539
539
  "testEnvironment": "node",
540
540
  "testPathIgnorePatterns": [
@@ -570,5 +570,5 @@
570
570
  "conventional-changelog-sprucelabs"
571
571
  ]
572
572
  },
573
- "gitHead": "408c01bb3de7ec5fdb89bd3f3bd0103b7792a921"
573
+ "gitHead": "e113fa698f7bbcfb68fe2c42391dc7894bb2fcee"
574
574
  }
@@ -0,0 +1,134 @@
1
+ import { SpruceSchemas } from '@sprucelabs/mercury-types'
2
+ import { diskUtil } from '@sprucelabs/spruce-skill-utils'
3
+ import { test, assert, generateId } from '@sprucelabs/test-utils'
4
+ import AbstractSkillTest from '../../../tests/AbstractSkillTest'
5
+ import testUtil from '../../../tests/utilities/test.utility'
6
+ import { RegisteredSkill } from '../../../types/cli.types'
7
+
8
+ export default class EventsWithFeedTemplatesTest extends AbstractSkillTest {
9
+ protected static skillCacheKey = 'events'
10
+ private static eventOptionsFile: string
11
+ private static skill: RegisteredSkill
12
+
13
+ @test()
14
+ protected static async feedIsPassedToRegistration() {
15
+ this.skill = await this.registerSkill()
16
+
17
+ await this.createEvent()
18
+
19
+ const feedTemplate: FeedOptions = {
20
+ template: generateId(),
21
+ }
22
+ this.dropIntoEventOptions(`feed: ${JSON.stringify(feedTemplate)},`)
23
+
24
+ const signature = await this.syncAndFetchSignature()
25
+
26
+ assert.isEqualDeep(
27
+ signature.feed,
28
+ feedTemplate,
29
+ 'Feed template should match.'
30
+ )
31
+ }
32
+
33
+ @test()
34
+ protected static async canHandleBackticksInAiInstructions() {
35
+ const aiInstructions = 'Here `there` be dragons'
36
+ this.dropIntoEventOptions(`aiInstructions: '${aiInstructions}',`)
37
+
38
+ const signature = await this.syncAndFetchSignature()
39
+
40
+ assert.isEqual(
41
+ signature.aiInstructions,
42
+ aiInstructions,
43
+ 'AI instructions should match.'
44
+ )
45
+ }
46
+
47
+ @test()
48
+ protected static async canHandleBackticksInDescription() {
49
+ const description = 'This event `describes` something'
50
+ this.dropIntoEventOptions(`description: '${description}',`)
51
+
52
+ const signature = await this.syncAndFetchSignature()
53
+
54
+ assert.isEqual(
55
+ signature.description,
56
+ description,
57
+ 'Description should match.'
58
+ )
59
+ }
60
+
61
+ private static async syncAndFetchSignature() {
62
+ await this.syncEvents()
63
+ await this.lintBuildAndBoot()
64
+ const signature = await this.fetchCreatedEventSignature()
65
+ return signature
66
+ }
67
+
68
+ private static dropIntoEventOptions(dropIn: string) {
69
+ const contents = diskUtil.readFile(this.eventOptionsFile)
70
+ const updated = contents.replace(
71
+ 'isGlobal: false,',
72
+ `isGlobal: false, ${dropIn}`
73
+ )
74
+
75
+ diskUtil.writeFile(this.eventOptionsFile, updated)
76
+ return updated
77
+ }
78
+
79
+ private static async fetchCreatedEventSignature() {
80
+ const client = await this.connectToApi({
81
+ shouldAuthAsCurrentSkill: true,
82
+ })
83
+
84
+ const [{ contracts }] = await client.emitAndFlattenResponses(
85
+ 'get-event-contracts::v2020_12_25',
86
+ {
87
+ target: {
88
+ namespaces: [this.skill.slug],
89
+ },
90
+ }
91
+ )
92
+ const first = contracts[0]
93
+ const { eventSignatures } = first
94
+ const fqen = Object.keys(eventSignatures)[0]
95
+ const signature = eventSignatures[fqen]
96
+ return signature
97
+ }
98
+
99
+ private static async lintBuildAndBoot() {
100
+ await this.Service('command').execute('yarn fix.lint')
101
+ await this.Service('command').execute('yarn build.dev')
102
+ const boot = await this.Action('skill', 'boot').execute({})
103
+ assert.isFalsy(boot.errors, 'Should not have boot errors.')
104
+ boot.meta?.kill()
105
+ }
106
+
107
+ private static async createEvent() {
108
+ const results = await this.Action('event', 'create').execute({
109
+ nameReadable: 'a new event',
110
+ nameKebab: 'my-new-event',
111
+ nameCamel: 'myNewEvent',
112
+ })
113
+
114
+ assert.isFalsy(results.errors, 'Should not have errors.')
115
+
116
+ this.eventOptionsFile = testUtil.assertFileByNameInGeneratedFiles(
117
+ 'event.options.ts',
118
+ results.files
119
+ )
120
+ }
121
+
122
+ private static async registerSkill() {
123
+ return await this.getSkillFixture().registerCurrentSkill({
124
+ name: 'current skill',
125
+ })
126
+ }
127
+
128
+ private static async syncEvents() {
129
+ const syncResults = await this.Action('event', 'sync').execute({})
130
+ assert.isFalsy(syncResults.errors, 'Should not have sync errors.')
131
+ }
132
+ }
133
+
134
+ type FeedOptions = SpruceSchemas.Mercury.v2020_12_25.FeedOptions
@@ -198,7 +198,6 @@ export function buildPermissionContract(..._: any[]):any { return _[0] }
198
198
 
199
199
  private static async assertGlobalEventsAreTyped(eventName: string) {
200
200
  const contents = diskUtil.readFile(this.eventContractPath)
201
-
202
201
  assert.doesInclude(contents, `'${eventName}':`)
203
202
  }
204
203
 
@@ -0,0 +1,29 @@
1
+ import { MercuryClientFactory } from '@sprucelabs/mercury-client'
2
+ import { test, assert } from '@sprucelabs/test-utils'
3
+ import AbstractCliTest from '../../../tests/AbstractCliTest'
4
+
5
+ export default class RegisteringAGoSkillTest extends AbstractCliTest {
6
+ @test.only()
7
+ protected static async stub() {}
8
+
9
+ @test()
10
+ protected static async canCreateRegisteringAGoSkill() {
11
+ MercuryClientFactory.setIsTestMode(true)
12
+ let wasHit = false
13
+ await this.eventFaker.fakeRegisterSkill(() => {
14
+ wasHit = true
15
+ })
16
+
17
+ await this.go.initGoProject()
18
+
19
+ await this.Action('skill', 'register', {
20
+ shouldAutoHandleDependencies: true,
21
+ }).execute({
22
+ nameReadable: 'My Go Skill',
23
+ nameKebab: 'my-go-skill',
24
+ description: 'A skill built with Go',
25
+ })
26
+
27
+ assert.isTrue(wasHit, 'Register skill event was not hit')
28
+ }
29
+ }
@@ -0,0 +1,160 @@
1
+ import {
2
+ MercuryClientFactory,
3
+ MercuryTestClient,
4
+ } from '@sprucelabs/mercury-client'
5
+ import { test, assert, generateId } from '@sprucelabs/test-utils'
6
+ import { FeatureActionResponse } from '../../../features/features.types'
7
+ import UnregisterSkillAction from '../../../features/global/actions/UnregisterSkillAction'
8
+ import AbstractCliTest from '../../../tests/AbstractCliTest'
9
+ import {
10
+ ListSkill,
11
+ ListSkillsTargetAndPayload,
12
+ UnregisterSkillTargetAndPayload,
13
+ } from '../../support/EventFaker'
14
+
15
+ export default class UnregisteringASkillTest extends AbstractCliTest {
16
+ private static action: UnregisterSkillAction
17
+ private static lastListSkillsPayload: ListSkillsTargetAndPayload['payload']
18
+ private static fakedSkills: ListSkill[] = []
19
+ private static executePromise: Promise<FeatureActionResponse>
20
+ private static lastUnregisterSkillTarget?: UnregisterSkillTargetAndPayload['target']
21
+
22
+ protected static async beforeEach(): Promise<void> {
23
+ await super.beforeEach()
24
+ MercuryClientFactory.setIsTestMode(true)
25
+ MercuryTestClient.setShouldRequireLocalListeners(true)
26
+ this.action = this.Action('global', 'unregisterSkill')
27
+
28
+ delete this.lastListSkillsPayload
29
+ delete this.lastUnregisterSkillTarget
30
+
31
+ this.fakedSkills = []
32
+
33
+ await this.eventFaker.fakeListSkills(({ payload }) => {
34
+ this.lastListSkillsPayload = payload
35
+ return this.fakedSkills
36
+ })
37
+
38
+ await this.eventFaker.fakeUnregisterSkill(({ target }) => {
39
+ this.lastUnregisterSkillTarget = target
40
+ })
41
+ }
42
+
43
+ @test()
44
+ protected static async hasAction() {
45
+ assert.isFunction(this.action.execute, 'Action not found')
46
+ }
47
+
48
+ @test()
49
+ protected static async firstThingListsSkills() {
50
+ await this.execute()
51
+ await this.waitUntilFinished()
52
+
53
+ assert.isEqualDeep(this.lastListSkillsPayload, {
54
+ shouldOnlyShowMine: true,
55
+ })
56
+ }
57
+
58
+ @test()
59
+ protected static async presentsAnOptionForOnlySkillReturned() {
60
+ this.pushFakedSkill()
61
+
62
+ await this.executeAndWaitForInput()
63
+ this.assertProptsForAllSkills()
64
+ await this.selectSkill(0)
65
+ await this.pressEnter()
66
+ }
67
+
68
+ @test()
69
+ protected static async presentsOptionsForMultipleSkills() {
70
+ this.pushFakedSkill()
71
+ this.pushFakedSkill()
72
+ this.pushFakedSkill()
73
+
74
+ await this.executeAndWaitForInput()
75
+ this.assertProptsForAllSkills()
76
+
77
+ await this.selectSkill(1)
78
+ await this.pressEnter()
79
+ }
80
+
81
+ @test('can unregister first skill', 0)
82
+ @test('can unregister second skill', 1)
83
+ protected static async passesSelectedSkillToUnregister(idx: number) {
84
+ this.pushFakedSkill()
85
+ this.pushFakedSkill()
86
+ await this.executeAndWaitForInput()
87
+ await this.selectSkill(idx)
88
+ await this.pressEnter()
89
+ await this.waitUntilFinished()
90
+
91
+ assert.isEqualDeep(
92
+ this.lastUnregisterSkillTarget,
93
+ {
94
+ skillId: this.fakedSkills[idx].id,
95
+ },
96
+ 'Skill ID not passed to unregister skill'
97
+ )
98
+ }
99
+
100
+ @test()
101
+ protected static async doesNotUnRegisterIfNotConfirmed() {
102
+ this.pushFakedSkill()
103
+ await this.executeAndWaitForInput()
104
+ await this.selectSkill(0)
105
+ await this.ui.sendInput('n')
106
+ await this.waitUntilFinished()
107
+ assert.isFalsy(
108
+ this.lastUnregisterSkillTarget,
109
+ 'Unregister skill was called unexpectedly'
110
+ )
111
+ }
112
+
113
+ private static async executeAndWaitForInput() {
114
+ await this.execute()
115
+ await this.waitForInput()
116
+ }
117
+
118
+ private static async selectSkill(idx: number) {
119
+ await this.ui.sendInput(this.fakedSkills[idx].id)
120
+ }
121
+
122
+ private static assertProptsForAllSkills() {
123
+ const prompt = this.ui.getLastInvocation()
124
+ assert.isEqualDeep(prompt.options, {
125
+ type: 'select',
126
+ isRequired: true,
127
+ options: {
128
+ choices: this.generateExpectedSkillChoices(),
129
+ },
130
+ })
131
+ }
132
+
133
+ private static async pressEnter() {
134
+ await this.ui.sendInput('\n')
135
+ }
136
+
137
+ private static generateExpectedSkillChoices() {
138
+ return this.fakedSkills.map((skill) => ({
139
+ value: skill.id,
140
+ label: `${skill.slug}: ${skill.name}`,
141
+ }))
142
+ }
143
+
144
+ private static pushFakedSkill() {
145
+ this.fakedSkills.push({
146
+ id: generateId(),
147
+ dateCreated: Date.now(),
148
+ slug: generateId(),
149
+ name: generateId(),
150
+ })
151
+ }
152
+
153
+ private static async waitUntilFinished() {
154
+ await this.executePromise
155
+ }
156
+
157
+ private static async execute() {
158
+ this.executePromise = this.action.execute()
159
+ }
160
+ }