@sprucelabs/spruce-cli 14.28.8 → 14.29.3
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 +35 -0
- package/build/__tests__/behavioral/SettingLogTransportsInASkill.test.js +13 -9
- package/build/__tests__/behavioral/SettingLogTransportsInASkill.test.js.map +1 -1
- package/build/__tests__/behavioral/SyncingEventsOnlyFromDependencies.test.d.ts +1 -1
- package/build/__tests__/behavioral/SyncingEventsOnlyFromDependencies.test.js +24 -14
- package/build/__tests__/behavioral/SyncingEventsOnlyFromDependencies.test.js.map +1 -1
- package/build/__tests__/behavioral/TestingDataStores.test.js +15 -11
- package/build/__tests__/behavioral/TestingDataStores.test.js.map +1 -1
- package/build/__tests__/behavioral/eventContract/PullingMercuryEventContract.test.js +3 -1
- package/build/__tests__/behavioral/eventContract/PullingMercuryEventContract.test.js.map +1 -1
- package/build/__tests__/behavioral/events/CreatingAListener.test.d.ts +3 -0
- package/build/__tests__/behavioral/events/CreatingAListener.test.js +200 -81
- package/build/__tests__/behavioral/events/CreatingAListener.test.js.map +1 -1
- package/build/__tests__/behavioral/events/KeepingListenersInSync.test.d.ts +7 -0
- package/build/__tests__/behavioral/events/KeepingListenersInSync.test.js +171 -0
- package/build/__tests__/behavioral/events/KeepingListenersInSync.test.js.map +1 -0
- package/build/__tests__/behavioral/{ListeningToAnEventYouCreate.test.d.ts → events/ListeningToAnEventYouCreate.test.d.ts} +1 -1
- package/build/__tests__/behavioral/{ListeningToAnEventYouCreate.test.js → events/ListeningToAnEventYouCreate.test.js} +2 -2
- package/build/__tests__/behavioral/events/ListeningToAnEventYouCreate.test.js.map +1 -0
- package/build/__tests__/behavioral/events/SkillEmitsBootEvents.test.d.ts +1 -0
- package/build/__tests__/behavioral/events/SkillEmitsBootEvents.test.js +53 -21
- package/build/__tests__/behavioral/events/SkillEmitsBootEvents.test.js.map +1 -1
- package/build/__tests__/behavioral/skill/UpgradingWithListeners.test.d.ts +5 -0
- package/build/__tests__/behavioral/skill/UpgradingWithListeners.test.js +137 -0
- package/build/__tests__/behavioral/skill/UpgradingWithListeners.test.js.map +1 -0
- package/build/__tests__/behavioral/stores/KeepingDataStoresInSync.test.d.ts +3 -0
- package/build/__tests__/behavioral/stores/KeepingDataStoresInSync.test.js +105 -16
- package/build/__tests__/behavioral/stores/KeepingDataStoresInSync.test.js.map +1 -1
- package/build/__tests__/behavioral/tests/CreatingATest.test.js +14 -10
- package/build/__tests__/behavioral/tests/CreatingATest.test.js.map +1 -1
- package/build/__tests__/behavioral/views/TestingViewControllers.test.d.ts +1 -0
- package/build/__tests__/behavioral/views/TestingViewControllers.test.js +67 -35
- package/build/__tests__/behavioral/views/TestingViewControllers.test.js.map +1 -1
- package/build/__tests__/implementation/AuthService.test.d.ts +1 -0
- package/build/__tests__/implementation/AuthService.test.js +8 -0
- package/build/__tests__/implementation/AuthService.test.js.map +1 -1
- package/build/__tests__/implementation/EventStore.test.js +3 -1
- package/build/__tests__/implementation/EventStore.test.js.map +1 -1
- package/build/__tests__/implementation/LintService.test.d.ts +5 -0
- package/build/__tests__/implementation/LintService.test.js +130 -0
- package/build/__tests__/implementation/LintService.test.js.map +1 -0
- package/build/__tests__/implementation/StoreFeature.test.d.ts +4 -0
- package/build/__tests__/implementation/StoreFeature.test.js +132 -0
- package/build/__tests__/implementation/StoreFeature.test.js.map +1 -0
- package/build/errors/SpruceError.js +8 -4
- package/build/errors/SpruceError.js.map +1 -1
- package/build/features/event/EventFeature.d.ts +2 -2
- package/build/features/event/EventFeature.js +53 -13
- package/build/features/event/EventFeature.js.map +1 -1
- package/build/features/event/actions/ListenAction.d.ts +1 -0
- package/build/features/event/actions/ListenAction.js +60 -31
- package/build/features/event/actions/ListenAction.js.map +1 -1
- package/build/features/event/actions/SyncListenersAction.d.ts +15 -0
- package/build/features/event/actions/SyncListenersAction.js +115 -0
- package/build/features/event/actions/SyncListenersAction.js.map +1 -0
- package/build/features/event/builders/ListenerTemplateItemBuilder.d.ts +8 -0
- package/build/features/event/builders/ListenerTemplateItemBuilder.js +65 -0
- package/build/features/event/builders/ListenerTemplateItemBuilder.js.map +1 -0
- package/build/features/event/stores/EventStore.js +2 -2
- package/build/features/event/stores/EventStore.js.map +1 -1
- package/build/features/event/stores/ListenerStore.d.ts +9 -0
- package/build/features/event/stores/ListenerStore.js +122 -0
- package/build/features/event/stores/ListenerStore.js.map +1 -0
- package/build/features/event/writers/EventWriter.d.ts +4 -1
- package/build/features/event/writers/EventWriter.js +42 -8
- package/build/features/event/writers/EventWriter.js.map +1 -1
- package/build/features/node/NodeFeature.js +1 -1
- package/build/features/node/NodeFeature.js.map +1 -1
- package/build/features/skill/SkillFeature.js +1 -1
- package/build/features/skill/SkillFeature.js.map +1 -1
- package/build/features/skill/stores/SkillStore.js +4 -8
- package/build/features/skill/stores/SkillStore.js.map +1 -1
- package/build/features/store/StoreFeature.d.ts +1 -1
- package/build/features/store/StoreFeature.js +16 -11
- package/build/features/store/StoreFeature.js.map +1 -1
- package/build/schemas/v2020_07_22/personWithToken.builder.js +1 -0
- package/build/schemas/v2020_07_22/personWithToken.builder.js.map +1 -1
- package/build/services/AuthService.d.ts +4 -1
- package/build/services/AuthService.js +15 -4
- package/build/services/AuthService.js.map +1 -1
- package/build/services/GameService.js +14 -10
- package/build/services/GameService.js.map +1 -1
- package/build/services/LintService.d.ts +5 -2
- package/build/services/LintService.js +137 -92
- package/build/services/LintService.js.map +1 -1
- package/build/services/ServiceFactory.js +9 -3
- package/build/services/ServiceFactory.js.map +1 -1
- package/build/stores/StoreFactory.d.ts +2 -0
- package/build/stores/StoreFactory.js +4 -1
- package/build/stores/StoreFactory.js.map +1 -1
- package/build/tests/AbstractCliTest.js +3 -3
- package/build/tests/AbstractCliTest.js.map +1 -1
- package/build/writers/AbstractWriter.d.ts +0 -3
- package/build/writers/AbstractWriter.js +2 -18
- package/build/writers/AbstractWriter.js.map +1 -1
- package/package.json +11 -9
- package/src/__tests__/behavioral/SettingLogTransportsInASkill.test.ts +2 -0
- package/src/__tests__/behavioral/SyncingEventsOnlyFromDependencies.test.ts +10 -5
- package/src/__tests__/behavioral/TestingDataStores.test.ts +2 -0
- package/src/__tests__/behavioral/eventContract/PullingMercuryEventContract.test.ts +1 -0
- package/src/__tests__/behavioral/events/CreatingAListener.test.ts +48 -9
- package/src/__tests__/behavioral/events/KeepingListenersInSync.test.ts +47 -0
- package/src/__tests__/behavioral/{ListeningToAnEventYouCreate.test.ts → events/ListeningToAnEventYouCreate.test.ts} +2 -2
- package/src/__tests__/behavioral/events/SkillEmitsBootEvents.test.ts +6 -0
- package/src/__tests__/behavioral/skill/UpgradingWithListeners.test.ts +59 -0
- package/src/__tests__/behavioral/stores/KeepingDataStoresInSync.test.ts +31 -2
- package/src/__tests__/behavioral/tests/CreatingATest.test.ts +2 -0
- package/src/__tests__/behavioral/views/TestingViewControllers.test.ts +6 -0
- package/src/__tests__/implementation/AuthService.test.ts +6 -0
- package/src/__tests__/implementation/EventStore.test.ts +1 -0
- package/src/__tests__/implementation/LintService.test.ts +34 -0
- package/src/__tests__/implementation/StoreFeature.test.ts +40 -0
- package/src/errors/SpruceError.ts +9 -5
- package/src/features/event/EventFeature.ts +21 -4
- package/src/features/event/actions/ListenAction.ts +9 -3
- package/src/features/event/actions/SyncListenersAction.ts +38 -0
- package/src/features/event/builders/ListenerTemplateItemBuilder.ts +27 -0
- package/src/features/event/stores/EventStore.ts +1 -1
- package/src/features/event/stores/ListenerStore.ts +32 -0
- package/src/features/event/writers/EventWriter.ts +19 -0
- package/src/features/node/NodeFeature.ts +2 -1
- package/src/features/skill/SkillFeature.ts +1 -1
- package/src/features/skill/stores/SkillStore.ts +4 -3
- package/src/features/store/StoreFeature.ts +7 -4
- package/src/schemas/v2020_07_22/personWithToken.builder.ts +1 -0
- package/src/services/AuthService.ts +15 -5
- package/src/services/GameService.ts +1 -0
- package/src/services/LintService.ts +34 -5
- package/src/services/ServiceFactory.ts +8 -3
- package/src/stores/StoreFactory.ts +3 -0
- package/src/tests/AbstractCliTest.ts +2 -2
- package/src/writers/AbstractWriter.ts +2 -13
- package/build/__tests__/behavioral/ListeningToAnEventYouCreate.test.js.map +0 -1
- package/build/__tests__/behavioral/README.md +0 -8
- package/build/__tests__/implementation/README.md +0 -5
- package/build/components/README.md +0 -5
- package/src/__tests__/behavioral/README.md +0 -8
- package/src/__tests__/implementation/README.md +0 -5
- package/src/components/README.md +0 -5
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
|
|
2
2
|
import { test, assert } from '@sprucelabs/test'
|
|
3
3
|
import { errorAssertUtil } from '@sprucelabs/test-utils'
|
|
4
|
+
import { FeatureActionResponse } from '../../../features/features.types'
|
|
4
5
|
import AbstractSkillTest from '../../../tests/AbstractSkillTest'
|
|
5
6
|
import testUtil from '../../../tests/utilities/test.utility'
|
|
6
7
|
|
|
@@ -44,20 +45,48 @@ export default class KeepingDataStoresInSyncTest extends AbstractSkillTest {
|
|
|
44
45
|
|
|
45
46
|
@test()
|
|
46
47
|
protected static async generatesValidTypeFile() {
|
|
47
|
-
await this.Action('store', 'create').execute({
|
|
48
|
+
const results = await this.Action('store', 'create').execute({
|
|
48
49
|
nameReadable: 'Bid',
|
|
49
50
|
nameReadablePlural: 'Bids',
|
|
50
51
|
namePascal: 'Bid',
|
|
51
52
|
})
|
|
52
53
|
|
|
54
|
+
await this.validateFiles(results)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@test()
|
|
58
|
+
protected static async fileIsValidAfterSync() {
|
|
53
59
|
const results = await this.syncStores()
|
|
54
60
|
|
|
61
|
+
await this.validateFiles(results)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@test()
|
|
65
|
+
protected static async canAddSecondStore() {
|
|
66
|
+
const results = await this.Action('store', 'create').execute({
|
|
67
|
+
nameReadable: 'Person',
|
|
68
|
+
nameReadablePlural: 'People',
|
|
69
|
+
namePascal: 'Person',
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
await this.validateFiles(results)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private static async validateFiles(results: FeatureActionResponse) {
|
|
55
76
|
const typesFile = testUtil.assertFileByNameInGeneratedFiles(
|
|
56
77
|
'stores.types.ts',
|
|
57
78
|
results.files
|
|
58
79
|
)
|
|
59
80
|
|
|
60
|
-
|
|
81
|
+
const mapFile = testUtil.assertFileByNameInGeneratedFiles(
|
|
82
|
+
'stores.ts',
|
|
83
|
+
results.files
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
await Promise.all([
|
|
87
|
+
this.Service('typeChecker').check(typesFile),
|
|
88
|
+
this.Service('typeChecker').check(mapFile),
|
|
89
|
+
])
|
|
61
90
|
}
|
|
62
91
|
|
|
63
92
|
private static async syncStores() {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { test, assert } from '@sprucelabs/test'
|
|
2
|
+
import LintService from '../../../services/LintService'
|
|
2
3
|
import AbstractTestTest from '../../../tests/AbstractTestTest'
|
|
3
4
|
import testUtil from '../../../tests/utilities/test.utility'
|
|
4
5
|
|
|
@@ -30,6 +31,7 @@ export default class CreatingBehavioralTestsTest extends AbstractTestTest {
|
|
|
30
31
|
'AbstractStoreTest (requires install)'
|
|
31
32
|
)
|
|
32
33
|
protected static async canCreateBehavioralTest(testName: string) {
|
|
34
|
+
LintService.enableLinting()
|
|
33
35
|
await this.installTests()
|
|
34
36
|
const promise = this.Action('test', 'create').execute({
|
|
35
37
|
type: 'behavioral',
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
|
|
2
2
|
import { test, assert } from '@sprucelabs/test'
|
|
3
|
+
import LintService from '../../../services/LintService'
|
|
3
4
|
import AbstractSkillTest from '../../../tests/AbstractSkillTest'
|
|
4
5
|
import testUtil from '../../../tests/utilities/test.utility'
|
|
5
6
|
|
|
6
7
|
export default class TestingViewControllersTest extends AbstractSkillTest {
|
|
7
8
|
protected static skillCacheKey = 'viewsWithTests'
|
|
8
9
|
|
|
10
|
+
protected static async beforeEach() {
|
|
11
|
+
await super.beforeEach()
|
|
12
|
+
LintService.enableLinting()
|
|
13
|
+
}
|
|
14
|
+
|
|
9
15
|
@test()
|
|
10
16
|
protected static async showsNotInstalled() {
|
|
11
17
|
const viewFeature = this.cli.getFeature('view')
|
|
@@ -70,11 +70,13 @@ export default class AuthServiceTest extends AbstractCliTest {
|
|
|
70
70
|
|
|
71
71
|
@test()
|
|
72
72
|
protected static getCurrentSkillReturnsNull() {
|
|
73
|
+
this.writePackageJson()
|
|
73
74
|
assert.isNull(this.auth.getCurrentSkill())
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
@test()
|
|
77
78
|
protected static canSetCurrentSkill() {
|
|
79
|
+
this.writePackageJson()
|
|
78
80
|
const skill = {
|
|
79
81
|
id: '123467aaoeuaoeu',
|
|
80
82
|
apiKey: 'taco',
|
|
@@ -86,4 +88,8 @@ export default class AuthServiceTest extends AbstractCliTest {
|
|
|
86
88
|
|
|
87
89
|
assert.isEqualDeep(this.auth.getCurrentSkill(), skill)
|
|
88
90
|
}
|
|
91
|
+
|
|
92
|
+
private static writePackageJson() {
|
|
93
|
+
diskUtil.writeFile(this.resolvePath('package.json'), '{}')
|
|
94
|
+
}
|
|
89
95
|
}
|
|
@@ -29,6 +29,7 @@ export default class EventStoreTest extends AbstractEventTest {
|
|
|
29
29
|
public static async beforeEach() {
|
|
30
30
|
await super.beforeEach()
|
|
31
31
|
this.createAction = this.Action<CreateAction>('event', 'create')
|
|
32
|
+
diskUtil.writeFile(this.resolvePath('package.json'), '{}')
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
@test()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { test, assert } from '@sprucelabs/test'
|
|
2
|
+
import CommandService from '../../services/CommandService'
|
|
3
|
+
import LintService from '../../services/LintService'
|
|
4
|
+
import AbstractCliTest from '../../tests/AbstractCliTest'
|
|
5
|
+
|
|
6
|
+
export default class LintServiceTest extends AbstractCliTest {
|
|
7
|
+
@test()
|
|
8
|
+
protected static async throwsWhenLintReturnsMessage() {
|
|
9
|
+
LintService.enableLinting()
|
|
10
|
+
|
|
11
|
+
await this.FeatureFixture().installCachedFeatures('skills')
|
|
12
|
+
|
|
13
|
+
CommandService.setMockResponse(/node/, {
|
|
14
|
+
code: 0,
|
|
15
|
+
stdout: `[{"filePath":"/Users/taylorromero/Development/SpruceLabs/spruce-appointments-skill/src/.spruce/stores/stores.types.ts","messages":[{"fatal":false,"severity":1,"message":"File ignored by default. Use a negated ignore pattern (like \\"--ignore-pattern '!<relative/path/to/filename>'\\") to override."}],"errorCount":1,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]}]\n`,
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
await assert.doesThrowAsync(() => this.Service('lint').fix('./go'))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@test()
|
|
22
|
+
protected static async worksWhenNoMessagesReturned() {
|
|
23
|
+
LintService.enableLinting()
|
|
24
|
+
|
|
25
|
+
await this.FeatureFixture().installCachedFeatures('skills')
|
|
26
|
+
|
|
27
|
+
CommandService.setMockResponse(/node/, {
|
|
28
|
+
code: 0,
|
|
29
|
+
stdout: `[{"filePath":"/Users/taylorromero/Development/SpruceLabs/spruce-appointments-skill/src/.spruce/stores/stores.types.ts","messages":[{"fatal":false,"severity":1,"message":"File ignored by default. Use a negated ignore pattern (like \\"--ignore-pattern '!<relative/path/to/filename>'\\") to override."}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]}]\n`,
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
await this.Service('lint').fix('./go')
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { test, assert } from '@sprucelabs/test'
|
|
2
|
+
import CommandService from '../../services/CommandService'
|
|
3
|
+
import AbstractCliTest from '../../tests/AbstractCliTest'
|
|
4
|
+
|
|
5
|
+
export default class StoreFeatureTest extends AbstractCliTest {
|
|
6
|
+
@test()
|
|
7
|
+
protected static async syncsOnWillExecute() {
|
|
8
|
+
await this.FeatureFixture().installCachedFeatures('stores')
|
|
9
|
+
|
|
10
|
+
CommandService.setMockResponse(/yarn/, {
|
|
11
|
+
code: 0,
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
let hitCount = 0
|
|
15
|
+
const emitter = this.getEmitter()
|
|
16
|
+
await emitter.on(
|
|
17
|
+
'feature.will-execute',
|
|
18
|
+
async ({ featureCode, actionCode }) => {
|
|
19
|
+
if (featureCode === 'store' && actionCode === 'sync') {
|
|
20
|
+
hitCount++
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
await emitter.emit('feature.will-execute', {
|
|
26
|
+
featureCode: 'node',
|
|
27
|
+
actionCode: 'upgrade',
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
assert.isEqual(hitCount, 1)
|
|
31
|
+
|
|
32
|
+
await emitter.emit('feature.did-execute', {
|
|
33
|
+
featureCode: 'node',
|
|
34
|
+
actionCode: 'upgrade',
|
|
35
|
+
results: {},
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
assert.isEqual(hitCount, 1)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -68,12 +68,16 @@ export default class SpruceError extends AbstractSpruceError<ErrorOptions> {
|
|
|
68
68
|
break
|
|
69
69
|
|
|
70
70
|
case 'LINT_FAILED':
|
|
71
|
-
message =
|
|
71
|
+
message = options.friendlyMessage
|
|
72
72
|
|
|
73
|
-
if (
|
|
74
|
-
message
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
if (!message) {
|
|
74
|
+
message = `Lint failed on pattern ${options.pattern}.`
|
|
75
|
+
|
|
76
|
+
if (options.originalError) {
|
|
77
|
+
message += `\n\nOriginal error:${
|
|
78
|
+
options.originalError.stack ?? options.originalError.message
|
|
79
|
+
}`
|
|
80
|
+
}
|
|
77
81
|
}
|
|
78
82
|
|
|
79
83
|
break
|
|
@@ -3,6 +3,7 @@ import { diskUtil } from '@sprucelabs/spruce-skill-utils'
|
|
|
3
3
|
import syncEventActionSchema from '#spruce/schemas/spruceCli/v2020_07_22/syncEventOptions.schema'
|
|
4
4
|
import TerminalInterface from '../../interfaces/TerminalInterface'
|
|
5
5
|
import { FileDescription } from '../../types/cli.types'
|
|
6
|
+
import actionUtil from '../../utilities/action.utility'
|
|
6
7
|
import AbstractFeature, {
|
|
7
8
|
FeatureDependency,
|
|
8
9
|
FeatureOptions,
|
|
@@ -73,6 +74,11 @@ export default class EventFeature extends AbstractFeature {
|
|
|
73
74
|
|
|
74
75
|
public async afterPackageInstall() {
|
|
75
76
|
diskUtil.createDir(diskUtil.resolvePath(this.cwd, 'src', 'events'))
|
|
77
|
+
const isSkillInstalled = await this.featureInstaller.isInstalled('skill')
|
|
78
|
+
if (isSkillInstalled) {
|
|
79
|
+
return await this.Action('event', 'sync.listeners').execute({})
|
|
80
|
+
}
|
|
81
|
+
|
|
76
82
|
return {}
|
|
77
83
|
}
|
|
78
84
|
|
|
@@ -82,19 +88,21 @@ export default class EventFeature extends AbstractFeature {
|
|
|
82
88
|
}): Promise<FeatureActionResponse> {
|
|
83
89
|
const { featureCode, actionCode } = payload
|
|
84
90
|
|
|
91
|
+
let results: FeatureActionResponse = {}
|
|
92
|
+
|
|
85
93
|
if (!this.initiatingAction) {
|
|
86
94
|
EventStore.clearCache()
|
|
87
95
|
const combined = this.combineCodes(featureCode, actionCode)
|
|
88
96
|
this.initiatingAction = combined
|
|
89
97
|
}
|
|
90
98
|
|
|
91
|
-
const isInstalled = await this.featureInstaller.isInstalled('event')
|
|
92
|
-
|
|
93
99
|
if (featureCode === 'node' || featureCode === 'upgrade') {
|
|
94
100
|
const settings = this.Service('eventSettings')
|
|
95
101
|
settings.clearListenerCache()
|
|
96
102
|
}
|
|
97
103
|
|
|
104
|
+
const isInstalled = await this.featureInstaller.isInstalled('event')
|
|
105
|
+
|
|
98
106
|
if (
|
|
99
107
|
isInstalled &&
|
|
100
108
|
(featureCode === 'event' ||
|
|
@@ -102,10 +110,19 @@ export default class EventFeature extends AbstractFeature {
|
|
|
102
110
|
actionCode === 'login') &&
|
|
103
111
|
actionCode !== 'setRemote'
|
|
104
112
|
) {
|
|
105
|
-
|
|
113
|
+
const remoteResults = await this.appendRemoteToResultsOrPrompt()
|
|
114
|
+
|
|
115
|
+
results = actionUtil.mergeActionResults(results, remoteResults)
|
|
106
116
|
}
|
|
107
117
|
|
|
108
|
-
|
|
118
|
+
if (featureCode === 'node' && actionCode === 'upgrade' && isInstalled) {
|
|
119
|
+
const syncResults = await this.Action('event', 'sync.listeners').execute(
|
|
120
|
+
{}
|
|
121
|
+
)
|
|
122
|
+
results = actionUtil.mergeActionResults(results, syncResults)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return results
|
|
109
126
|
}
|
|
110
127
|
|
|
111
128
|
private async handleDidExecute(payload: {
|
|
@@ -151,8 +151,8 @@ export default class ListenAction extends AbstractAction<OptionsSchema> {
|
|
|
151
151
|
templateItems.responsePayloadSchemaTemplateItem
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
const
|
|
155
|
-
|
|
154
|
+
const writer = this.Writer('event')
|
|
155
|
+
response.files = await writer.writeListener(resolvedDestination, {
|
|
156
156
|
...normalizedOptions,
|
|
157
157
|
version: resolvedVersion,
|
|
158
158
|
eventName,
|
|
@@ -168,7 +168,9 @@ export default class ListenAction extends AbstractAction<OptionsSchema> {
|
|
|
168
168
|
schemaTypesLookupDir: resolvedSchemaTypesLookupDir,
|
|
169
169
|
})
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
const syncResults = await this.syncListeners()
|
|
172
|
+
|
|
173
|
+
response = actionUtil.mergeActionResults(syncResults, response)
|
|
172
174
|
|
|
173
175
|
if (isSkillEvent) {
|
|
174
176
|
const syncOptions = normalizeSchemaValues(
|
|
@@ -191,6 +193,10 @@ export default class ListenAction extends AbstractAction<OptionsSchema> {
|
|
|
191
193
|
}
|
|
192
194
|
}
|
|
193
195
|
|
|
196
|
+
private async syncListeners() {
|
|
197
|
+
return this.Action('event', 'sync.listeners').execute({})
|
|
198
|
+
}
|
|
199
|
+
|
|
194
200
|
private async collectEvent(
|
|
195
201
|
contracts: EventContract[],
|
|
196
202
|
namespace: string
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { buildSchema } from '@sprucelabs/schema'
|
|
2
|
+
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
|
|
3
|
+
import AbstractAction from '../../AbstractAction'
|
|
4
|
+
import ListenerTemplateItemBuilder from '../builders/ListenerTemplateItemBuilder'
|
|
5
|
+
|
|
6
|
+
const syncListenersOptionScheam = buildSchema({
|
|
7
|
+
id: 'syncListenersOptions',
|
|
8
|
+
fields: {},
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
type OptionsSchema = typeof syncListenersOptionScheam
|
|
12
|
+
|
|
13
|
+
export default class SyncListenerAction extends AbstractAction<OptionsSchema> {
|
|
14
|
+
public optionsSchema: OptionsSchema = syncListenersOptionScheam
|
|
15
|
+
public invocationMessage = 'Syncing listeners... 🎧'
|
|
16
|
+
public commandAliases = ['sync.listeners']
|
|
17
|
+
|
|
18
|
+
public async execute() {
|
|
19
|
+
const listeners = await this.Store('listener').loadListeners()
|
|
20
|
+
const builder = new ListenerTemplateItemBuilder()
|
|
21
|
+
|
|
22
|
+
const templateItems = builder.buildTemplateItems({
|
|
23
|
+
listeners,
|
|
24
|
+
cwd: this.cwd,
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
const files = await this.Writer('event').writeListenerMap(
|
|
28
|
+
diskUtil.resolveHashSprucePath(this.cwd, 'events'),
|
|
29
|
+
{
|
|
30
|
+
listeners: templateItems,
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
files,
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import pathUtil from 'path'
|
|
2
|
+
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
|
|
3
|
+
import { ListenerTemplateItem } from '@sprucelabs/spruce-templates'
|
|
4
|
+
import { Listener } from '../stores/ListenerStore'
|
|
5
|
+
|
|
6
|
+
export default class ListenerTemplateItemBuilder {
|
|
7
|
+
public buildTemplateItems(options: { listeners: Listener[]; cwd: string }) {
|
|
8
|
+
const destination = diskUtil.resolveHashSprucePath(
|
|
9
|
+
options.cwd,
|
|
10
|
+
'events',
|
|
11
|
+
'listeners.ts'
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
const listeners: ListenerTemplateItem[] = []
|
|
15
|
+
|
|
16
|
+
for (const match of options.listeners) {
|
|
17
|
+
listeners.push({
|
|
18
|
+
...match,
|
|
19
|
+
path: pathUtil
|
|
20
|
+
.relative(pathUtil.dirname(destination), match.path)
|
|
21
|
+
.replace('.ts', ''),
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return listeners
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -76,7 +76,7 @@ export default class EventStore extends AbstractStore {
|
|
|
76
76
|
try {
|
|
77
77
|
contracts = await this.fetchRemoteContracts(namespaces)
|
|
78
78
|
} catch (err: any) {
|
|
79
|
-
const error = err.options.responseErrors[0]
|
|
79
|
+
const error = err.options.responseErrors?.[0] ?? err
|
|
80
80
|
throw error
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { eventDiskUtil } from '@sprucelabs/spruce-event-utils'
|
|
2
|
+
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
|
|
3
|
+
import { ListenerTemplateItem } from '@sprucelabs/spruce-templates'
|
|
4
|
+
import globby from 'globby'
|
|
5
|
+
import AbstractStore from '../../../stores/AbstractStore'
|
|
6
|
+
|
|
7
|
+
export type Listener = ListenerTemplateItem & {
|
|
8
|
+
path: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default class ListenerStore extends AbstractStore {
|
|
12
|
+
public name = 'listener'
|
|
13
|
+
|
|
14
|
+
public async loadListeners() {
|
|
15
|
+
const matches = await globby(
|
|
16
|
+
diskUtil.resolvePath(this.cwd, 'src', 'listeners', '**/*.listener.ts')
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
const listeners: Listener[] = []
|
|
20
|
+
|
|
21
|
+
for (const match of matches) {
|
|
22
|
+
const listener = eventDiskUtil.splitPathToListener(match)
|
|
23
|
+
|
|
24
|
+
listeners.push({
|
|
25
|
+
...listener,
|
|
26
|
+
path: match,
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return listeners
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
EventContractTemplateItem,
|
|
11
11
|
EventListenerOptions,
|
|
12
|
+
ListenerTemplateItem,
|
|
12
13
|
} from '@sprucelabs/spruce-templates'
|
|
13
14
|
import { GeneratedFile } from '../../../types/cli.types'
|
|
14
15
|
import AbstractWriter from '../../../writers/AbstractWriter'
|
|
@@ -182,6 +183,24 @@ export default class EventWriter extends AbstractWriter {
|
|
|
182
183
|
return results
|
|
183
184
|
}
|
|
184
185
|
|
|
186
|
+
public async writeListenerMap(
|
|
187
|
+
destinationDir: string,
|
|
188
|
+
options: {
|
|
189
|
+
listeners: ListenerTemplateItem[]
|
|
190
|
+
}
|
|
191
|
+
) {
|
|
192
|
+
const destination = diskUtil.resolvePath(destinationDir, 'listeners.ts')
|
|
193
|
+
const contents = this.templates.listeners({ listeners: options.listeners })
|
|
194
|
+
|
|
195
|
+
const results = await this.writeFileIfChangedMixinResults(
|
|
196
|
+
destination,
|
|
197
|
+
contents,
|
|
198
|
+
'An object holding all your data stores for easy import!'
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
return results
|
|
202
|
+
}
|
|
203
|
+
|
|
185
204
|
public async writeEvent(
|
|
186
205
|
destinationDir: string,
|
|
187
206
|
options: {
|
|
@@ -59,12 +59,13 @@ export default class NodeFeature<
|
|
|
59
59
|
return {}
|
|
60
60
|
})
|
|
61
61
|
}
|
|
62
|
+
|
|
62
63
|
private async handleUpgrade(): Promise<FeatureActionResponse> {
|
|
63
64
|
try {
|
|
64
65
|
this.ui.startLoading('Cleaning build...')
|
|
65
66
|
await this.Service('command').execute('yarn clean.build')
|
|
66
67
|
|
|
67
|
-
this.ui.startLoading('
|
|
68
|
+
this.ui.startLoading('Building for development...')
|
|
68
69
|
await this.Service('command').execute('yarn build.dev')
|
|
69
70
|
|
|
70
71
|
return {
|
|
@@ -196,7 +196,7 @@ export default class SkillFeature<
|
|
|
196
196
|
|
|
197
197
|
if (isInstalled && featureCode === 'node' && actionCode === 'upgrade') {
|
|
198
198
|
const updater = new Updater(this, this.emitter)
|
|
199
|
-
const files = await updater.updateFiles(upgradeOptions
|
|
199
|
+
const files = await updater.updateFiles(upgradeOptions ?? {})
|
|
200
200
|
return {
|
|
201
201
|
files,
|
|
202
202
|
}
|
|
@@ -71,6 +71,7 @@ export default class SkillStore extends AbstractStore {
|
|
|
71
71
|
|
|
72
72
|
if (currentSkill) {
|
|
73
73
|
const client = await this.connectToApi({ shouldAuthAsCurrentSkill: true })
|
|
74
|
+
|
|
74
75
|
const response = await client.emit('get-skill::v2020_12_25', {
|
|
75
76
|
target: {
|
|
76
77
|
skillId: currentSkill.id,
|
|
@@ -85,6 +86,7 @@ export default class SkillStore extends AbstractStore {
|
|
|
85
86
|
isRegistered: true,
|
|
86
87
|
apiKey: currentSkill.apiKey,
|
|
87
88
|
}
|
|
89
|
+
|
|
88
90
|
return SkillStore.currentSkill as CurrentSkill
|
|
89
91
|
}
|
|
90
92
|
|
|
@@ -133,12 +135,11 @@ export default class SkillStore extends AbstractStore {
|
|
|
133
135
|
if (isRegistered) {
|
|
134
136
|
throw new SpruceError({
|
|
135
137
|
code: 'GENERIC',
|
|
136
|
-
friendlyMessage: `You can't
|
|
138
|
+
friendlyMessage: `You can't set the namespace of a skill that is registered.`,
|
|
137
139
|
})
|
|
138
140
|
}
|
|
139
141
|
|
|
140
|
-
|
|
141
|
-
pkg.set({ path: 'skill.namespace', value: namesUtil.toKebab(namespace) })
|
|
142
|
+
this.Service('auth').updateCurrentSkillNamespace(namespace)
|
|
142
143
|
}
|
|
143
144
|
|
|
144
145
|
private getEventNamespaceForNotRegistered() {
|
|
@@ -37,8 +37,8 @@ export default class StoreFeature extends AbstractFeature {
|
|
|
37
37
|
this.registerAbstractTestClassHandler.bind(this)
|
|
38
38
|
)
|
|
39
39
|
void this.emitter.on(
|
|
40
|
-
'feature.
|
|
41
|
-
this.
|
|
40
|
+
'feature.will-execute',
|
|
41
|
+
this.handleWillExecute.bind(this)
|
|
42
42
|
)
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -55,7 +55,7 @@ export default class StoreFeature extends AbstractFeature {
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
private async
|
|
58
|
+
private async handleWillExecute(payload: {
|
|
59
59
|
featureCode: string
|
|
60
60
|
actionCode: string
|
|
61
61
|
}) {
|
|
@@ -70,7 +70,10 @@ export default class StoreFeature extends AbstractFeature {
|
|
|
70
70
|
ui: this.ui,
|
|
71
71
|
headline: 'Resyncing data stores...',
|
|
72
72
|
})
|
|
73
|
-
|
|
73
|
+
|
|
74
|
+
const results = await this.Action('store', 'sync').execute({})
|
|
75
|
+
|
|
76
|
+
return results
|
|
74
77
|
}
|
|
75
78
|
|
|
76
79
|
return {}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SpruceSchemas } from '@sprucelabs/mercury-types'
|
|
2
2
|
import { normalizeSchemaValues, validateSchemaValues } from '@sprucelabs/schema'
|
|
3
|
-
import { EnvService } from '@sprucelabs/spruce-skill-utils'
|
|
3
|
+
import { EnvService, namesUtil } from '@sprucelabs/spruce-skill-utils'
|
|
4
4
|
import personWithTokenSchema from '#spruce/schemas/spruceCli/v2020_07_22/personWithToken.schema'
|
|
5
|
+
import PkgService from './PkgService'
|
|
5
6
|
|
|
6
7
|
type PersonWithToken = SpruceSchemas.SpruceCli.v2020_07_22.PersonWithToken
|
|
7
8
|
|
|
@@ -16,9 +17,11 @@ const LOGGED_IN_PERSON_KEY = 'LOGGED_IN_PERSON'
|
|
|
16
17
|
|
|
17
18
|
export default class AuthService {
|
|
18
19
|
private env: EnvService
|
|
20
|
+
private pkg: PkgService
|
|
19
21
|
|
|
20
|
-
public constructor(envService: EnvService) {
|
|
22
|
+
public constructor(envService: EnvService, pkgService: PkgService) {
|
|
21
23
|
this.env = envService
|
|
24
|
+
this.pkg = pkgService
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
public getLoggedInPerson(): PersonWithToken | null {
|
|
@@ -51,7 +54,7 @@ export default class AuthService {
|
|
|
51
54
|
const id = this.env.get('SKILL_ID') as string
|
|
52
55
|
const apiKey = this.env.get('SKILL_API_KEY') as string
|
|
53
56
|
const name = this.env.get('SKILL_NAME') as string
|
|
54
|
-
const slug = this.
|
|
57
|
+
const slug = this.pkg.get('skill.namespace') as string
|
|
55
58
|
|
|
56
59
|
if (id && apiKey) {
|
|
57
60
|
return {
|
|
@@ -69,13 +72,20 @@ export default class AuthService {
|
|
|
69
72
|
this.env.unset('SKILL_ID')
|
|
70
73
|
this.env.unset('SKILL_API_KEY')
|
|
71
74
|
this.env.unset('SKILL_NAME')
|
|
72
|
-
this.env.unset('SKILL_SLUG')
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
public updateCurrentSkill(skill: SkillAuth) {
|
|
76
78
|
this.env.set('SKILL_ID', skill.id)
|
|
77
79
|
this.env.set('SKILL_API_KEY', skill.apiKey)
|
|
78
80
|
this.env.set('SKILL_NAME', skill.name)
|
|
79
|
-
|
|
81
|
+
|
|
82
|
+
this.updateCurrentSkillNamespace(skill.slug)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public updateCurrentSkillNamespace(namespace: string) {
|
|
86
|
+
this.pkg.set({
|
|
87
|
+
path: 'skill.namespace',
|
|
88
|
+
value: namesUtil.toKebab(namespace),
|
|
89
|
+
})
|
|
80
90
|
}
|
|
81
91
|
}
|