@auto-engineer/narrative 1.138.0 → 1.140.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.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +5 -5
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +41 -0
- package/dist/scripts/convert-flow-exec.js +2 -2
- package/dist/scripts/convert-flow-exec.js.map +1 -1
- package/dist/scripts/print-schema.js +5 -5
- package/dist/scripts/print-schema.js.map +1 -1
- package/dist/src/fluent-builder.d.ts +29 -29
- package/dist/src/fluent-builder.d.ts.map +1 -1
- package/dist/src/fluent-builder.js +81 -81
- package/dist/src/fluent-builder.js.map +1 -1
- package/dist/src/{getNarratives.d.ts → getScenes.d.ts} +6 -6
- package/dist/src/getScenes.d.ts.map +1 -0
- package/dist/src/{getNarratives.js → getScenes.js} +16 -16
- package/dist/src/getScenes.js.map +1 -0
- package/dist/src/id/addAutoIds.d.ts.map +1 -1
- package/dist/src/id/addAutoIds.js +22 -22
- package/dist/src/id/addAutoIds.js.map +1 -1
- package/dist/src/id/hasAllIds.d.ts.map +1 -1
- package/dist/src/id/hasAllIds.js +2 -2
- package/dist/src/id/hasAllIds.js.map +1 -1
- package/dist/src/index.d.ts +8 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/loader/index.js +1 -1
- package/dist/src/loader/index.js.map +1 -1
- package/dist/src/loader/runtime-cjs.js +1 -1
- package/dist/src/loader/runtime-cjs.js.map +1 -1
- package/dist/src/narrative-context.d.ts +9 -9
- package/dist/src/narrative-context.d.ts.map +1 -1
- package/dist/src/narrative-context.js +47 -47
- package/dist/src/narrative-context.js.map +1 -1
- package/dist/src/narrative-registry.d.ts +6 -6
- package/dist/src/narrative-registry.d.ts.map +1 -1
- package/dist/src/narrative-registry.js +26 -26
- package/dist/src/narrative-registry.js.map +1 -1
- package/dist/src/narrative.d.ts +5 -5
- package/dist/src/narrative.d.ts.map +1 -1
- package/dist/src/narrative.js +26 -27
- package/dist/src/narrative.js.map +1 -1
- package/dist/src/parse-graphql-request.d.ts +1 -1
- package/dist/src/parse-graphql-request.d.ts.map +1 -1
- package/dist/src/parse-graphql-request.js +3 -3
- package/dist/src/parse-graphql-request.js.map +1 -1
- package/dist/src/samples/items.narrative.js +2 -2
- package/dist/src/samples/items.narrative.js.map +1 -1
- package/dist/src/samples/mixed-given-types.narrative.js +2 -2
- package/dist/src/samples/mixed-given-types.narrative.js.map +1 -1
- package/dist/src/samples/place-order.narrative.js +2 -2
- package/dist/src/samples/place-order.narrative.js.map +1 -1
- package/dist/src/samples/questionnaires.narrative.js +2 -2
- package/dist/src/samples/questionnaires.narrative.js.map +1 -1
- package/dist/src/samples/seasonal-assistant.schema.json +2 -2
- package/dist/src/samples/test-with-ids.narrative.js +2 -2
- package/dist/src/samples/test-with-ids.narrative.js.map +1 -1
- package/dist/src/schema.d.ts +136 -136
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +76 -76
- package/dist/src/schema.js.map +1 -1
- package/dist/src/slice-builder.d.ts +6 -6
- package/dist/src/slice-builder.d.ts.map +1 -1
- package/dist/src/slice-builder.js +21 -21
- package/dist/src/slice-builder.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js +4 -4
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/compose.js +3 -3
- package/dist/src/transformers/model-to-narrative/generators/compose.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.js +20 -20
- package/dist/src/transformers/model-to-narrative/generators/flow.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/module-code.js +14 -14
- package/dist/src/transformers/model-to-narrative/generators/module-code.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.d.ts +4 -4
- package/dist/src/transformers/model-to-narrative/index.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.js +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.js +5 -5
- package/dist/src/transformers/model-to-narrative/spec-traversal.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js +4 -4
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.js +19 -19
- package/dist/src/transformers/model-to-narrative/validate-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/assemble.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.js +10 -3
- package/dist/src/transformers/narrative-to-model/assemble.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.js +9 -9
- package/dist/src/transformers/narrative-to-model/derive-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/index.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.js +39 -39
- package/dist/src/transformers/narrative-to-model/index.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.js +6 -6
- package/dist/src/transformers/narrative-to-model/strings.js.map +1 -1
- package/dist/src/validate-slice-requests.d.ts +4 -4
- package/dist/src/validate-slice-requests.d.ts.map +1 -1
- package/dist/src/validate-slice-requests.js +34 -34
- package/dist/src/validate-slice-requests.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/scripts/convert-flow-exec.ts +2 -2
- package/scripts/print-schema.ts +8 -8
- package/src/fluent-builder.specs.ts +3 -3
- package/src/fluent-builder.ts +141 -141
- package/src/{getNarratives.cache.specs.ts → getScenes.cache.specs.ts} +45 -45
- package/src/{getNarratives.specs.ts → getScenes.specs.ts} +302 -300
- package/src/{getNarratives.ts → getScenes.ts} +20 -20
- package/src/id/addAutoIds.specs.ts +105 -105
- package/src/id/addAutoIds.ts +26 -26
- package/src/id/hasAllIds.specs.ts +59 -59
- package/src/id/hasAllIds.ts +6 -6
- package/src/index.ts +12 -13
- package/src/loader/index.ts +1 -1
- package/src/loader/runtime-cjs.ts +1 -1
- package/src/model-to-narrative.specs.ts +133 -135
- package/src/narrative-context.specs.ts +24 -24
- package/src/narrative-context.ts +61 -61
- package/src/narrative-registry.ts +31 -31
- package/src/narrative.ts +31 -33
- package/src/parse-graphql-request.specs.ts +5 -5
- package/src/parse-graphql-request.ts +3 -3
- package/src/samples/items.narrative.ts +2 -2
- package/src/samples/mixed-given-types.narrative.ts +2 -2
- package/src/samples/place-order.narrative.ts +2 -2
- package/src/samples/questionnaires.narrative.ts +2 -2
- package/src/samples/seasonal-assistant.schema.json +2 -2
- package/src/samples/test-with-ids.narrative.ts +2 -2
- package/src/schema.specs.ts +99 -91
- package/src/schema.ts +89 -89
- package/src/slice-builder.ts +30 -30
- package/src/transformers/model-to-narrative/analysis/lint-helpers.ts +1 -1
- package/src/transformers/model-to-narrative/cross-module-imports.specs.ts +43 -43
- package/src/transformers/model-to-narrative/cross-module-imports.ts +4 -4
- package/src/transformers/model-to-narrative/generators/compose.ts +4 -4
- package/src/transformers/model-to-narrative/generators/flow.ts +36 -36
- package/src/transformers/model-to-narrative/generators/imports.ts +1 -1
- package/src/transformers/model-to-narrative/generators/module-code.ts +15 -15
- package/src/transformers/model-to-narrative/index.ts +4 -4
- package/src/transformers/model-to-narrative/modules.specs.ts +58 -58
- package/src/transformers/model-to-narrative/spec-traversal.specs.ts +43 -43
- package/src/transformers/model-to-narrative/spec-traversal.ts +6 -6
- package/src/transformers/model-to-narrative/types.ts +1 -1
- package/src/transformers/model-to-narrative/utils/integration-extractor.ts +5 -5
- package/src/transformers/model-to-narrative/validate-modules.ts +22 -22
- package/src/transformers/narrative-to-model/assemble.ts +12 -4
- package/src/transformers/narrative-to-model/debug.ts +1 -1
- package/src/transformers/narrative-to-model/derive-modules.specs.ts +35 -35
- package/src/transformers/narrative-to-model/derive-modules.ts +11 -11
- package/src/transformers/narrative-to-model/index.ts +47 -47
- package/src/transformers/narrative-to-model/spec-processors.ts +1 -1
- package/src/transformers/narrative-to-model/strings.ts +6 -6
- package/src/transformers/narrative-to-model/type-inference.specs.ts +11 -11
- package/src/validate-slice-requests.specs.ts +113 -113
- package/src/validate-slice-requests.ts +49 -49
- package/dist/src/getNarratives.d.ts.map +0 -1
- package/dist/src/getNarratives.js.map +0 -1
package/src/id/addAutoIds.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientSpecNode, Example, Model,
|
|
1
|
+
import type { ClientSpecNode, Example, Model, Moment, Rule, Spec, Step } from '../index';
|
|
2
2
|
import { generateAutoId } from './generators';
|
|
3
3
|
|
|
4
4
|
function ensureId(item: { id?: string }): void {
|
|
@@ -42,18 +42,18 @@ function processSpecs(specs: Spec[]): Spec[] {
|
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
function processServerSpecs(slice:
|
|
45
|
+
function processServerSpecs(slice: Moment): Moment {
|
|
46
46
|
if (!('server' in slice) || slice.server?.specs === undefined || !Array.isArray(slice.server.specs)) return slice;
|
|
47
47
|
|
|
48
|
-
const
|
|
48
|
+
const modifiedMoment = structuredClone(slice);
|
|
49
49
|
if (
|
|
50
|
-
'server' in
|
|
51
|
-
|
|
52
|
-
Array.isArray(
|
|
50
|
+
'server' in modifiedMoment &&
|
|
51
|
+
modifiedMoment.server?.specs !== undefined &&
|
|
52
|
+
Array.isArray(modifiedMoment.server.specs)
|
|
53
53
|
) {
|
|
54
|
-
|
|
54
|
+
modifiedMoment.server.specs = processSpecs(modifiedMoment.server.specs);
|
|
55
55
|
}
|
|
56
|
-
return
|
|
56
|
+
return modifiedMoment;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
function processClientSpecNodes(nodes: ClientSpecNode[]): ClientSpecNode[] {
|
|
@@ -67,27 +67,27 @@ function processClientSpecNodes(nodes: ClientSpecNode[]): ClientSpecNode[] {
|
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
function processClientSpecs(slice:
|
|
70
|
+
function processClientSpecs(slice: Moment): Moment {
|
|
71
71
|
if (!('client' in slice) || slice.client?.specs === undefined || !Array.isArray(slice.client.specs)) return slice;
|
|
72
72
|
|
|
73
|
-
const
|
|
74
|
-
if ('client' in
|
|
75
|
-
|
|
73
|
+
const modifiedMoment = structuredClone(slice);
|
|
74
|
+
if ('client' in modifiedMoment && modifiedMoment.client?.specs !== undefined) {
|
|
75
|
+
modifiedMoment.client.specs = processClientSpecNodes(modifiedMoment.client.specs);
|
|
76
76
|
}
|
|
77
|
-
return
|
|
77
|
+
return modifiedMoment;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
function processDataItems(slice:
|
|
80
|
+
function processDataItems(slice: Moment): Moment {
|
|
81
81
|
if (!('server' in slice) || !slice.server?.data) return slice;
|
|
82
82
|
|
|
83
|
-
const
|
|
84
|
-
if ('server' in
|
|
83
|
+
const modifiedMoment = structuredClone(slice);
|
|
84
|
+
if ('server' in modifiedMoment && modifiedMoment.server?.data) {
|
|
85
85
|
// Ensure the data wrapper has an ID
|
|
86
|
-
ensureId(
|
|
86
|
+
ensureId(modifiedMoment.server.data);
|
|
87
87
|
|
|
88
88
|
// Process items array if it exists
|
|
89
|
-
if (Array.isArray(
|
|
90
|
-
|
|
89
|
+
if (Array.isArray(modifiedMoment.server.data.items)) {
|
|
90
|
+
modifiedMoment.server.data.items = modifiedMoment.server.data.items.map((item) => {
|
|
91
91
|
const itemCopy = { ...item };
|
|
92
92
|
ensureId(itemCopy);
|
|
93
93
|
if ('destination' in itemCopy && itemCopy._withState) {
|
|
@@ -98,10 +98,10 @@ function processDataItems(slice: Slice): Slice {
|
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
return
|
|
101
|
+
return modifiedMoment;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
function
|
|
104
|
+
function processMoment(slice: Moment): Moment {
|
|
105
105
|
let sliceCopy = { ...slice };
|
|
106
106
|
ensureId(sliceCopy);
|
|
107
107
|
sliceCopy = processServerSpecs(sliceCopy);
|
|
@@ -112,11 +112,11 @@ function processSlice(slice: Slice): Slice {
|
|
|
112
112
|
|
|
113
113
|
export function addAutoIds(specs: Model): Model {
|
|
114
114
|
const result = structuredClone(specs);
|
|
115
|
-
result.
|
|
116
|
-
const
|
|
117
|
-
ensureId(
|
|
118
|
-
|
|
119
|
-
return
|
|
115
|
+
result.scenes = result.scenes.map((scene) => {
|
|
116
|
+
const sceneCopy = { ...scene };
|
|
117
|
+
ensureId(sceneCopy);
|
|
118
|
+
sceneCopy.moments = scene.moments.map(processMoment);
|
|
119
|
+
return sceneCopy;
|
|
120
120
|
});
|
|
121
121
|
return result;
|
|
122
122
|
}
|
|
@@ -5,13 +5,13 @@ import { addAutoIds, hasAllIds } from './index';
|
|
|
5
5
|
describe('hasAllIds', () => {
|
|
6
6
|
const createModelWithoutIds = (): Model => ({
|
|
7
7
|
variant: 'specs',
|
|
8
|
-
|
|
8
|
+
scenes: [
|
|
9
9
|
{
|
|
10
10
|
name: 'Test Flow Without IDs',
|
|
11
|
-
|
|
11
|
+
moments: [
|
|
12
12
|
{
|
|
13
13
|
type: 'command',
|
|
14
|
-
name: 'Test
|
|
14
|
+
name: 'Test moment without ID',
|
|
15
15
|
client: { specs: [] },
|
|
16
16
|
server: {
|
|
17
17
|
description: 'Test server',
|
|
@@ -39,14 +39,14 @@ describe('hasAllIds', () => {
|
|
|
39
39
|
|
|
40
40
|
const createModelWithIds = (): Model => ({
|
|
41
41
|
variant: 'specs',
|
|
42
|
-
|
|
42
|
+
scenes: [
|
|
43
43
|
{
|
|
44
44
|
name: 'Test Flow with IDs',
|
|
45
45
|
id: 'FLOW-001',
|
|
46
|
-
|
|
46
|
+
moments: [
|
|
47
47
|
{
|
|
48
48
|
type: 'command',
|
|
49
|
-
name: 'Test
|
|
49
|
+
name: 'Test moment with ID',
|
|
50
50
|
id: 'SLICE-001',
|
|
51
51
|
client: { specs: [] },
|
|
52
52
|
server: {
|
|
@@ -77,14 +77,14 @@ describe('hasAllIds', () => {
|
|
|
77
77
|
|
|
78
78
|
const createModelWithFullIds = (): Model => ({
|
|
79
79
|
variant: 'specs',
|
|
80
|
-
|
|
80
|
+
scenes: [
|
|
81
81
|
{
|
|
82
82
|
name: 'Test Flow with Full IDs',
|
|
83
83
|
id: 'FLOW-001',
|
|
84
|
-
|
|
84
|
+
moments: [
|
|
85
85
|
{
|
|
86
86
|
type: 'command',
|
|
87
|
-
name: 'Test
|
|
87
|
+
name: 'Test moment with ID',
|
|
88
88
|
id: 'SLICE-001',
|
|
89
89
|
client: { specs: [] },
|
|
90
90
|
server: {
|
|
@@ -136,14 +136,14 @@ describe('hasAllIds', () => {
|
|
|
136
136
|
modules: [],
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
-
const createMultipleFlowsModel = (includeAllIds: boolean,
|
|
139
|
+
const createMultipleFlowsModel = (includeAllIds: boolean, includeAllMomentIds: boolean): Model => ({
|
|
140
140
|
variant: 'specs',
|
|
141
|
-
|
|
141
|
+
scenes: [
|
|
142
142
|
{
|
|
143
143
|
name: 'Home Screen',
|
|
144
144
|
id: 'aifPcU3hw',
|
|
145
145
|
sourceFile: '/path/to/homepage.narrative.ts',
|
|
146
|
-
|
|
146
|
+
moments: [
|
|
147
147
|
{
|
|
148
148
|
name: 'Active Surveys Summary',
|
|
149
149
|
id: 'slice1',
|
|
@@ -156,10 +156,10 @@ describe('hasAllIds', () => {
|
|
|
156
156
|
name: 'Create Survey',
|
|
157
157
|
id: includeAllIds ? 'MPviTMrQC' : undefined,
|
|
158
158
|
sourceFile: '/path/to/homepage.narrative.ts',
|
|
159
|
-
|
|
159
|
+
moments: [
|
|
160
160
|
{
|
|
161
161
|
name: 'Create Survey Form',
|
|
162
|
-
id:
|
|
162
|
+
id: includeAllMomentIds ? 'slice2' : undefined,
|
|
163
163
|
type: 'experience',
|
|
164
164
|
client: { specs: [{ type: 'it', id: 'it2', title: 'allow entering survey title' }] },
|
|
165
165
|
},
|
|
@@ -169,7 +169,7 @@ describe('hasAllIds', () => {
|
|
|
169
169
|
name: 'Response Analytics',
|
|
170
170
|
id: 'eME978Euk',
|
|
171
171
|
sourceFile: '/path/to/homepage.narrative.ts',
|
|
172
|
-
|
|
172
|
+
moments: [
|
|
173
173
|
{
|
|
174
174
|
name: 'Response Rate Charts',
|
|
175
175
|
id: 'slice3',
|
|
@@ -200,17 +200,17 @@ describe('hasAllIds', () => {
|
|
|
200
200
|
expect(hasAllIds(model)).toBe(true);
|
|
201
201
|
});
|
|
202
202
|
|
|
203
|
-
it('should return false if any
|
|
203
|
+
it('should return false if any moment is missing an ID', () => {
|
|
204
204
|
const model = createModelWithIds();
|
|
205
205
|
const modifiedModel = structuredClone(model);
|
|
206
|
-
modifiedModel.
|
|
206
|
+
modifiedModel.scenes[0].moments[0].id = '';
|
|
207
207
|
expect(hasAllIds(modifiedModel)).toBe(false);
|
|
208
208
|
});
|
|
209
209
|
|
|
210
210
|
it('should return false if any rule is missing an ID', () => {
|
|
211
211
|
const model = createModelWithIds();
|
|
212
212
|
const modifiedModel = structuredClone(model);
|
|
213
|
-
const slice = modifiedModel.
|
|
213
|
+
const slice = modifiedModel.scenes[0].moments[0];
|
|
214
214
|
if ('server' in slice && slice.server?.specs !== undefined && Array.isArray(slice.server.specs)) {
|
|
215
215
|
slice.server.specs[0].rules[0].id = '';
|
|
216
216
|
}
|
|
@@ -227,7 +227,7 @@ describe('hasAllIds', () => {
|
|
|
227
227
|
expect(hasAllIds(model)).toBe(false);
|
|
228
228
|
});
|
|
229
229
|
|
|
230
|
-
it('should return false when any
|
|
230
|
+
it('should return false when any moment in multiple flows with same sourceFile is missing ID', () => {
|
|
231
231
|
const model = createMultipleFlowsModel(true, false);
|
|
232
232
|
expect(hasAllIds(model)).toBe(false);
|
|
233
233
|
});
|
|
@@ -235,7 +235,7 @@ describe('hasAllIds', () => {
|
|
|
235
235
|
it('should return false if any spec is missing an ID', () => {
|
|
236
236
|
const model = createModelWithFullIds();
|
|
237
237
|
const modifiedModel = structuredClone(model);
|
|
238
|
-
const slice = modifiedModel.
|
|
238
|
+
const slice = modifiedModel.scenes[0].moments[0];
|
|
239
239
|
if ('server' in slice && slice.server?.specs !== undefined && Array.isArray(slice.server.specs)) {
|
|
240
240
|
slice.server.specs[0].id = '';
|
|
241
241
|
}
|
|
@@ -245,7 +245,7 @@ describe('hasAllIds', () => {
|
|
|
245
245
|
it('should return false if any example is missing an ID', () => {
|
|
246
246
|
const model = createModelWithFullIds();
|
|
247
247
|
const modifiedModel = structuredClone(model);
|
|
248
|
-
const slice = modifiedModel.
|
|
248
|
+
const slice = modifiedModel.scenes[0].moments[0];
|
|
249
249
|
if ('server' in slice && slice.server?.specs !== undefined && Array.isArray(slice.server.specs)) {
|
|
250
250
|
slice.server.specs[0].rules[0].examples[0].id = '';
|
|
251
251
|
}
|
|
@@ -255,7 +255,7 @@ describe('hasAllIds', () => {
|
|
|
255
255
|
it('should return false if any step is missing an ID', () => {
|
|
256
256
|
const model = createModelWithFullIds();
|
|
257
257
|
const modifiedModel = structuredClone(model);
|
|
258
|
-
const slice = modifiedModel.
|
|
258
|
+
const slice = modifiedModel.scenes[0].moments[0];
|
|
259
259
|
if ('server' in slice && slice.server?.specs !== undefined && Array.isArray(slice.server.specs)) {
|
|
260
260
|
slice.server.specs[0].rules[0].examples[0].steps[0].id = '';
|
|
261
261
|
}
|
|
@@ -265,14 +265,14 @@ describe('hasAllIds', () => {
|
|
|
265
265
|
it('should return false if step with error is missing an ID', () => {
|
|
266
266
|
const model: Model = {
|
|
267
267
|
variant: 'specs',
|
|
268
|
-
|
|
268
|
+
scenes: [
|
|
269
269
|
{
|
|
270
270
|
name: 'Test Flow',
|
|
271
271
|
id: 'FLOW-001',
|
|
272
|
-
|
|
272
|
+
moments: [
|
|
273
273
|
{
|
|
274
274
|
type: 'command',
|
|
275
|
-
name: 'Test
|
|
275
|
+
name: 'Test moment',
|
|
276
276
|
id: 'SLICE-001',
|
|
277
277
|
client: { specs: [] },
|
|
278
278
|
server: {
|
|
@@ -322,13 +322,13 @@ describe('hasAllIds', () => {
|
|
|
322
322
|
it('should return false if client it spec is missing an ID', () => {
|
|
323
323
|
const model: Model = {
|
|
324
324
|
variant: 'specs',
|
|
325
|
-
|
|
325
|
+
scenes: [
|
|
326
326
|
{
|
|
327
327
|
name: 'Test Flow',
|
|
328
328
|
id: 'FLOW-001',
|
|
329
|
-
|
|
329
|
+
moments: [
|
|
330
330
|
{
|
|
331
|
-
name: 'Test
|
|
331
|
+
name: 'Test moment',
|
|
332
332
|
id: 'SLICE-001',
|
|
333
333
|
type: 'experience',
|
|
334
334
|
client: {
|
|
@@ -348,13 +348,13 @@ describe('hasAllIds', () => {
|
|
|
348
348
|
it('should return false if client describe spec is missing an ID', () => {
|
|
349
349
|
const model: Model = {
|
|
350
350
|
variant: 'specs',
|
|
351
|
-
|
|
351
|
+
scenes: [
|
|
352
352
|
{
|
|
353
353
|
name: 'Test Flow',
|
|
354
354
|
id: 'FLOW-001',
|
|
355
|
-
|
|
355
|
+
moments: [
|
|
356
356
|
{
|
|
357
|
-
name: 'Test
|
|
357
|
+
name: 'Test moment',
|
|
358
358
|
id: 'SLICE-001',
|
|
359
359
|
type: 'experience',
|
|
360
360
|
client: {
|
|
@@ -380,13 +380,13 @@ describe('hasAllIds', () => {
|
|
|
380
380
|
it('should return false if nested client it spec is missing an ID', () => {
|
|
381
381
|
const model: Model = {
|
|
382
382
|
variant: 'specs',
|
|
383
|
-
|
|
383
|
+
scenes: [
|
|
384
384
|
{
|
|
385
385
|
name: 'Test Flow',
|
|
386
386
|
id: 'FLOW-001',
|
|
387
|
-
|
|
387
|
+
moments: [
|
|
388
388
|
{
|
|
389
|
-
name: 'Test
|
|
389
|
+
name: 'Test moment',
|
|
390
390
|
id: 'SLICE-001',
|
|
391
391
|
type: 'experience',
|
|
392
392
|
client: {
|
|
@@ -413,13 +413,13 @@ describe('hasAllIds', () => {
|
|
|
413
413
|
it('should return true for client specs with all IDs', () => {
|
|
414
414
|
const model: Model = {
|
|
415
415
|
variant: 'specs',
|
|
416
|
-
|
|
416
|
+
scenes: [
|
|
417
417
|
{
|
|
418
418
|
name: 'Test Flow',
|
|
419
419
|
id: 'FLOW-001',
|
|
420
|
-
|
|
420
|
+
moments: [
|
|
421
421
|
{
|
|
422
|
-
name: 'Test
|
|
422
|
+
name: 'Test moment',
|
|
423
423
|
id: 'SLICE-001',
|
|
424
424
|
type: 'experience',
|
|
425
425
|
client: {
|
|
@@ -455,14 +455,14 @@ describe('hasAllIds', () => {
|
|
|
455
455
|
it('should return false when data wrapper is missing an ID', () => {
|
|
456
456
|
const model: Model = {
|
|
457
457
|
variant: 'specs',
|
|
458
|
-
|
|
458
|
+
scenes: [
|
|
459
459
|
{
|
|
460
460
|
name: 'Test Flow',
|
|
461
461
|
id: 'FLOW-001',
|
|
462
|
-
|
|
462
|
+
moments: [
|
|
463
463
|
{
|
|
464
464
|
type: 'command',
|
|
465
|
-
name: 'Test
|
|
465
|
+
name: 'Test moment',
|
|
466
466
|
id: 'SLICE-001',
|
|
467
467
|
client: { specs: [] },
|
|
468
468
|
server: {
|
|
@@ -492,14 +492,14 @@ describe('hasAllIds', () => {
|
|
|
492
492
|
it('should return false when data sink item is missing an ID', () => {
|
|
493
493
|
const model: Model = {
|
|
494
494
|
variant: 'specs',
|
|
495
|
-
|
|
495
|
+
scenes: [
|
|
496
496
|
{
|
|
497
497
|
name: 'Test Flow',
|
|
498
498
|
id: 'FLOW-001',
|
|
499
|
-
|
|
499
|
+
moments: [
|
|
500
500
|
{
|
|
501
501
|
type: 'command',
|
|
502
|
-
name: 'Test
|
|
502
|
+
name: 'Test moment',
|
|
503
503
|
id: 'SLICE-001',
|
|
504
504
|
client: { specs: [] },
|
|
505
505
|
server: {
|
|
@@ -529,14 +529,14 @@ describe('hasAllIds', () => {
|
|
|
529
529
|
it('should return false when data source item is missing an ID', () => {
|
|
530
530
|
const model: Model = {
|
|
531
531
|
variant: 'specs',
|
|
532
|
-
|
|
532
|
+
scenes: [
|
|
533
533
|
{
|
|
534
534
|
name: 'Test Flow',
|
|
535
535
|
id: 'FLOW-001',
|
|
536
|
-
|
|
536
|
+
moments: [
|
|
537
537
|
{
|
|
538
538
|
type: 'query',
|
|
539
|
-
name: 'Test
|
|
539
|
+
name: 'Test moment',
|
|
540
540
|
id: 'SLICE-001',
|
|
541
541
|
client: { specs: [] },
|
|
542
542
|
server: {
|
|
@@ -566,14 +566,14 @@ describe('hasAllIds', () => {
|
|
|
566
566
|
it('should return false when nested _withState source is missing an ID', () => {
|
|
567
567
|
const model: Model = {
|
|
568
568
|
variant: 'specs',
|
|
569
|
-
|
|
569
|
+
scenes: [
|
|
570
570
|
{
|
|
571
571
|
name: 'Test Flow',
|
|
572
572
|
id: 'FLOW-001',
|
|
573
|
-
|
|
573
|
+
moments: [
|
|
574
574
|
{
|
|
575
575
|
type: 'command',
|
|
576
|
-
name: 'Test
|
|
576
|
+
name: 'Test moment',
|
|
577
577
|
id: 'SLICE-001',
|
|
578
578
|
client: { specs: [] },
|
|
579
579
|
server: {
|
|
@@ -608,14 +608,14 @@ describe('hasAllIds', () => {
|
|
|
608
608
|
it('should return true when all data items have IDs', () => {
|
|
609
609
|
const model: Model = {
|
|
610
610
|
variant: 'specs',
|
|
611
|
-
|
|
611
|
+
scenes: [
|
|
612
612
|
{
|
|
613
613
|
name: 'Test Flow',
|
|
614
614
|
id: 'FLOW-001',
|
|
615
|
-
|
|
615
|
+
moments: [
|
|
616
616
|
{
|
|
617
617
|
type: 'command',
|
|
618
|
-
name: 'Test
|
|
618
|
+
name: 'Test moment',
|
|
619
619
|
id: 'SLICE-001',
|
|
620
620
|
client: { specs: [] },
|
|
621
621
|
server: {
|
|
@@ -651,14 +651,14 @@ describe('hasAllIds', () => {
|
|
|
651
651
|
it('should return true when sink with _withState both have IDs', () => {
|
|
652
652
|
const model: Model = {
|
|
653
653
|
variant: 'specs',
|
|
654
|
-
|
|
654
|
+
scenes: [
|
|
655
655
|
{
|
|
656
656
|
name: 'Test Flow',
|
|
657
657
|
id: 'FLOW-001',
|
|
658
|
-
|
|
658
|
+
moments: [
|
|
659
659
|
{
|
|
660
660
|
type: 'command',
|
|
661
|
-
name: 'Test
|
|
661
|
+
name: 'Test moment',
|
|
662
662
|
id: 'SLICE-001',
|
|
663
663
|
client: { specs: [] },
|
|
664
664
|
server: {
|
|
@@ -691,17 +691,17 @@ describe('hasAllIds', () => {
|
|
|
691
691
|
expect(hasAllIds(model)).toBe(true);
|
|
692
692
|
});
|
|
693
693
|
|
|
694
|
-
it('should return true when
|
|
694
|
+
it('should return true when moment has no data', () => {
|
|
695
695
|
const model: Model = {
|
|
696
696
|
variant: 'specs',
|
|
697
|
-
|
|
697
|
+
scenes: [
|
|
698
698
|
{
|
|
699
699
|
name: 'Test Flow',
|
|
700
700
|
id: 'FLOW-001',
|
|
701
|
-
|
|
701
|
+
moments: [
|
|
702
702
|
{
|
|
703
703
|
type: 'command',
|
|
704
|
-
name: 'Test
|
|
704
|
+
name: 'Test moment',
|
|
705
705
|
id: 'SLICE-001',
|
|
706
706
|
client: { specs: [] },
|
|
707
707
|
server: {
|
package/src/id/hasAllIds.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientSpecNode, Example, Model,
|
|
1
|
+
import type { ClientSpecNode, Example, Model, Moment, Rule, Spec, Step } from '../index';
|
|
2
2
|
|
|
3
3
|
function hasValidId(item: { id?: string }): boolean {
|
|
4
4
|
return item.id !== undefined && item.id !== '';
|
|
@@ -20,7 +20,7 @@ function hasSpecIds(specs: Spec[]): boolean {
|
|
|
20
20
|
return specs.every((spec) => hasValidId(spec) && hasRuleIds(spec.rules));
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
function hasServerSpecIds(slice:
|
|
23
|
+
function hasServerSpecIds(slice: Moment): boolean {
|
|
24
24
|
if (!('server' in slice) || slice.server?.specs === undefined || !Array.isArray(slice.server.specs)) return true;
|
|
25
25
|
return hasSpecIds(slice.server.specs);
|
|
26
26
|
}
|
|
@@ -35,12 +35,12 @@ function hasClientSpecNodeIds(nodes: ClientSpecNode[]): boolean {
|
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
function hasClientSpecIds(slice:
|
|
38
|
+
function hasClientSpecIds(slice: Moment): boolean {
|
|
39
39
|
if (!('client' in slice) || slice.client?.specs === undefined || !Array.isArray(slice.client.specs)) return true;
|
|
40
40
|
return hasClientSpecNodeIds(slice.client.specs);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function hasDataIds(slice:
|
|
43
|
+
function hasDataIds(slice: Moment): boolean {
|
|
44
44
|
if (!('server' in slice) || !slice.server?.data) return true;
|
|
45
45
|
|
|
46
46
|
// Validate the data wrapper has an ID
|
|
@@ -58,10 +58,10 @@ function hasDataIds(slice: Slice): boolean {
|
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
function
|
|
61
|
+
function hasMomentIds(slice: Moment): boolean {
|
|
62
62
|
return hasValidId(slice) && hasServerSpecIds(slice) && hasClientSpecIds(slice) && hasDataIds(slice);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
export function hasAllIds(specs: Model): boolean {
|
|
66
|
-
return specs.
|
|
66
|
+
return specs.scenes.every((scene) => hasValidId(scene) && scene.moments.every(hasMomentIds));
|
|
67
67
|
}
|
package/src/index.ts
CHANGED
|
@@ -28,38 +28,37 @@ export type { DataTargetItem, FieldSelector } from './data-narrative-builders';
|
|
|
28
28
|
|
|
29
29
|
export { sink, source, target } from './data-narrative-builders';
|
|
30
30
|
export type {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
FluentCommandMomentBuilder,
|
|
32
|
+
FluentExperienceMomentBuilder,
|
|
33
|
+
FluentQueryMomentBuilder,
|
|
34
|
+
FluentReactionMomentBuilder,
|
|
35
35
|
} from './fluent-builder';
|
|
36
36
|
export { command, decide, evolve, experience, query, react } from './fluent-builder';
|
|
37
|
-
export {
|
|
37
|
+
export { getScenes } from './getScenes';
|
|
38
38
|
export { addAutoIds, hasAllIds } from './id';
|
|
39
|
-
export type { ExampleBuilder, GivenBuilder,
|
|
39
|
+
export type { ExampleBuilder, GivenBuilder, MomentTypeValueInterface, ThenBuilder, WhenBuilder } from './narrative';
|
|
40
40
|
export {
|
|
41
41
|
client,
|
|
42
42
|
data,
|
|
43
43
|
describe,
|
|
44
44
|
example,
|
|
45
45
|
it,
|
|
46
|
-
|
|
47
|
-
narrative as flow,
|
|
46
|
+
MomentType,
|
|
48
47
|
request,
|
|
49
48
|
rule,
|
|
50
|
-
|
|
49
|
+
scene,
|
|
51
50
|
server,
|
|
52
51
|
should,
|
|
53
52
|
specs,
|
|
54
53
|
thenError,
|
|
55
54
|
} from './narrative';
|
|
56
55
|
export type { ParsedArg, ParsedGraphQlOperation } from './parse-graphql-request';
|
|
57
|
-
export { parseGraphQlRequest,
|
|
56
|
+
export { parseGraphQlRequest, parseMomentRequest } from './parse-graphql-request';
|
|
58
57
|
export * from './schema';
|
|
59
58
|
export { createNarrativeSpec, given as testGiven, when as testWhen } from './testing';
|
|
60
|
-
export type {
|
|
59
|
+
export type { GeneratedScenes } from './transformers/model-to-narrative';
|
|
61
60
|
export { modelToNarrative } from './transformers/model-to-narrative';
|
|
62
61
|
export { detectQueryAction, extractQueryNameFromRequest } from './transformers/narrative-to-model/spec-processors';
|
|
63
62
|
export { isInlineObject, isInlineObjectArray, parseInlineObjectFields } from './ts-type-helpers';
|
|
64
|
-
export type {
|
|
65
|
-
export {
|
|
63
|
+
export type { MomentRequestValidationError } from './validate-slice-requests';
|
|
64
|
+
export { validateMomentRequests } from './validate-slice-requests';
|
package/src/loader/index.ts
CHANGED
|
@@ -65,7 +65,7 @@ export async function executeAST(
|
|
|
65
65
|
|
|
66
66
|
runGraph(entryFiles, final.graph);
|
|
67
67
|
|
|
68
|
-
const flowsCount = registry.
|
|
68
|
+
const flowsCount = registry.getAllScenes().length;
|
|
69
69
|
const integrationsCount = integrationRegistry.getAll().length;
|
|
70
70
|
|
|
71
71
|
debug(
|
|
@@ -160,5 +160,5 @@ export function runGraph(entryFiles: string[], graph: Graph): void {
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
for (const entry of entryFiles) loadFromVfs(entry);
|
|
163
|
-
debug('runGraph: flows=%d integrations=%d', registry.
|
|
163
|
+
debug('runGraph: flows=%d integrations=%d', registry.getAllScenes().length, integrationRegistry.getAll().length);
|
|
164
164
|
}
|