@specverse/engines 4.3.0 → 4.3.2
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/dist/inference/ui-contracts/rules/action-buttons-present.d.ts +12 -5
- package/dist/inference/ui-contracts/rules/action-buttons-present.d.ts.map +1 -1
- package/dist/inference/ui-contracts/rules/action-buttons-present.js +135 -19
- package/dist/inference/ui-contracts/rules/action-buttons-present.js.map +1 -1
- package/dist/inference/ui-contracts/test-case-types.d.ts +3 -0
- package/dist/inference/ui-contracts/test-case-types.d.ts.map +1 -1
- package/dist/inference/ui-contracts/translator.d.ts.map +1 -1
- package/dist/inference/ui-contracts/translator.js +24 -1
- package/dist/inference/ui-contracts/translator.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,16 +2,23 @@
|
|
|
2
2
|
* Rule: action-buttons-present
|
|
3
3
|
*
|
|
4
4
|
* For every CURED operation supported by a controller, the
|
|
5
|
-
* corresponding model's view should expose a visible action
|
|
6
|
-
* (button, menu item, etc.) labeled with the operation name.
|
|
5
|
+
* corresponding model's form view should expose a visible action
|
|
6
|
+
* trigger (button, menu item, etc.) labeled with the operation name.
|
|
7
7
|
*
|
|
8
8
|
* CURED = create / update / retrieve / validate / evolve / delete.
|
|
9
9
|
* The spec declares which ones a controller supports via
|
|
10
10
|
* `cured: { create: {}, retrieve: {}, ... }`.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* Walker UX convention (Phase 4A, memory R16c): list views render
|
|
13
|
+
* data only. Mutation actions live on the form view. Create is
|
|
14
|
+
* visible whenever the form is on screen; Update / Delete / Evolve
|
|
15
|
+
* are gated on a selected entity, so we seed one via API + click
|
|
16
|
+
* its row before asserting. Retrieve + validate fire implicitly and
|
|
17
|
+
* have no user-facing button.
|
|
18
|
+
*
|
|
19
|
+
* Models with required `belongsTo` relationships have their parents
|
|
20
|
+
* seeded first (recursively) and the parent's id threaded into the
|
|
21
|
+
* FK field via `$expr:varName.id`.
|
|
15
22
|
*
|
|
16
23
|
* One TestCase per (controller, cured-operation) pair.
|
|
17
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-buttons-present.d.ts","sourceRoot":"","sources":["../../../../src/inference/ui-contracts/rules/action-buttons-present.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"action-buttons-present.d.ts","sourceRoot":"","sources":["../../../../src/inference/ui-contracts/rules/action-buttons-present.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAkF,MAAM,uBAAuB,CAAC;AAE5I,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAqHhD,eAAO,MAAM,oBAAoB,EAAE,cAyClC,CAAC"}
|
|
@@ -2,26 +2,27 @@
|
|
|
2
2
|
* Rule: action-buttons-present
|
|
3
3
|
*
|
|
4
4
|
* For every CURED operation supported by a controller, the
|
|
5
|
-
* corresponding model's view should expose a visible action
|
|
6
|
-
* (button, menu item, etc.) labeled with the operation name.
|
|
5
|
+
* corresponding model's form view should expose a visible action
|
|
6
|
+
* trigger (button, menu item, etc.) labeled with the operation name.
|
|
7
7
|
*
|
|
8
8
|
* CURED = create / update / retrieve / validate / evolve / delete.
|
|
9
9
|
* The spec declares which ones a controller supports via
|
|
10
10
|
* `cured: { create: {}, retrieve: {}, ... }`.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* Walker UX convention (Phase 4A, memory R16c): list views render
|
|
13
|
+
* data only. Mutation actions live on the form view. Create is
|
|
14
|
+
* visible whenever the form is on screen; Update / Delete / Evolve
|
|
15
|
+
* are gated on a selected entity, so we seed one via API + click
|
|
16
|
+
* its row before asserting. Retrieve + validate fire implicitly and
|
|
17
|
+
* have no user-facing button.
|
|
18
|
+
*
|
|
19
|
+
* Models with required `belongsTo` relationships have their parents
|
|
20
|
+
* seeded first (recursively) and the parent's id threaded into the
|
|
21
|
+
* FK field via `$expr:varName.id`.
|
|
15
22
|
*
|
|
16
23
|
* One TestCase per (controller, cured-operation) pair.
|
|
17
24
|
*/
|
|
18
25
|
export const RULE_ID = 'action-buttons-present';
|
|
19
|
-
/**
|
|
20
|
-
* Canonical CURED labels. Used both as the trigger text to search for
|
|
21
|
-
* AND as the keys inside `controller.cured`. If a controller declares
|
|
22
|
-
* a custom action, we'll pick it up too via the Object.keys iteration
|
|
23
|
-
* below — this set just records which labels are considered canonical.
|
|
24
|
-
*/
|
|
25
26
|
const CURED_LABELS = new Set([
|
|
26
27
|
'create',
|
|
27
28
|
'retrieve',
|
|
@@ -30,30 +31,145 @@ const CURED_LABELS = new Set([
|
|
|
30
31
|
'evolve',
|
|
31
32
|
'delete',
|
|
32
33
|
]);
|
|
34
|
+
/**
|
|
35
|
+
* Build a minimal-but-valid body for createEntity against a model.
|
|
36
|
+
* Covers required non-auto business attributes with type-based
|
|
37
|
+
* defaults. Skips metadata + relationship categories — relationship
|
|
38
|
+
* FK values are provided separately by the seed-chain builder.
|
|
39
|
+
*/
|
|
40
|
+
function synthesizeBody(model) {
|
|
41
|
+
const out = {};
|
|
42
|
+
for (const attr of model.attributes || []) {
|
|
43
|
+
if (!attr?.name)
|
|
44
|
+
continue;
|
|
45
|
+
if (attr.category === 'metadata' || attr.category === 'relationship')
|
|
46
|
+
continue;
|
|
47
|
+
if (!attr.required)
|
|
48
|
+
continue;
|
|
49
|
+
if (attr.auto)
|
|
50
|
+
continue;
|
|
51
|
+
out[attr.name] = defaultValueForAttribute(attr);
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
function defaultValueForAttribute(attr) {
|
|
56
|
+
const typeRaw = String(attr.type || 'String');
|
|
57
|
+
const type = typeRaw.replace(/[^A-Za-z].*$/, '').toLowerCase();
|
|
58
|
+
switch (type) {
|
|
59
|
+
case 'integer':
|
|
60
|
+
case 'int':
|
|
61
|
+
case 'number':
|
|
62
|
+
return 1;
|
|
63
|
+
case 'float':
|
|
64
|
+
case 'double':
|
|
65
|
+
case 'decimal':
|
|
66
|
+
return 1.0;
|
|
67
|
+
case 'boolean':
|
|
68
|
+
case 'bool':
|
|
69
|
+
return false;
|
|
70
|
+
case 'datetime':
|
|
71
|
+
case 'timestamp':
|
|
72
|
+
return '2026-01-01T00:00:00.000Z';
|
|
73
|
+
case 'date':
|
|
74
|
+
return '2026-01-01';
|
|
75
|
+
case 'uuid':
|
|
76
|
+
return '00000000-0000-0000-0000-000000000000';
|
|
77
|
+
default:
|
|
78
|
+
return `test-${attr.name}`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Walk a model's belongsTo relationships and emit createEntity steps
|
|
83
|
+
* for every dependency, seeding leaves first. Each seed binds to a
|
|
84
|
+
* unique variable name; FK fields on downstream models reference
|
|
85
|
+
* those variables via `$expr:varName.id`.
|
|
86
|
+
*
|
|
87
|
+
* Returns the ordered step list + the variable name bound to the
|
|
88
|
+
* final (target) model.
|
|
89
|
+
*
|
|
90
|
+
* Cycles are guarded: if A → B → A, the second visit skips. Cyclic
|
|
91
|
+
* required-FK specs would be unsatisfiable anyway.
|
|
92
|
+
*/
|
|
93
|
+
function buildSeedChain(model, modelByName) {
|
|
94
|
+
const steps = [];
|
|
95
|
+
const bindings = new Map(); // modelName -> varName
|
|
96
|
+
const inProgress = new Set();
|
|
97
|
+
function seed(m) {
|
|
98
|
+
const existing = bindings.get(m.name);
|
|
99
|
+
if (existing)
|
|
100
|
+
return existing;
|
|
101
|
+
if (inProgress.has(m.name)) {
|
|
102
|
+
// Cycle — fall back to bare body without the FK (will likely
|
|
103
|
+
// fail at the backend, but the test will surface the issue
|
|
104
|
+
// rather than the rule crashing).
|
|
105
|
+
return `seed_${m.name}`;
|
|
106
|
+
}
|
|
107
|
+
inProgress.add(m.name);
|
|
108
|
+
const body = synthesizeBody(m);
|
|
109
|
+
for (const rel of m.relationships || []) {
|
|
110
|
+
if (!isBelongsTo(rel))
|
|
111
|
+
continue;
|
|
112
|
+
if (!rel.target)
|
|
113
|
+
continue;
|
|
114
|
+
const parent = modelByName.get(rel.target);
|
|
115
|
+
if (!parent)
|
|
116
|
+
continue;
|
|
117
|
+
const parentVar = seed(parent);
|
|
118
|
+
body[`${rel.name}Id`] = `$expr:${parentVar}.id`;
|
|
119
|
+
}
|
|
120
|
+
const myVar = `seed_${m.name}`;
|
|
121
|
+
steps.push({
|
|
122
|
+
action: 'createEntity',
|
|
123
|
+
modelName: m.name,
|
|
124
|
+
data: body,
|
|
125
|
+
bindAs: myVar,
|
|
126
|
+
});
|
|
127
|
+
bindings.set(m.name, myVar);
|
|
128
|
+
inProgress.delete(m.name);
|
|
129
|
+
return myVar;
|
|
130
|
+
}
|
|
131
|
+
const targetVar = seed(model);
|
|
132
|
+
return { steps, targetVar };
|
|
133
|
+
}
|
|
134
|
+
function isBelongsTo(rel) {
|
|
135
|
+
return String(rel.type || '').toLowerCase() === 'belongsto';
|
|
136
|
+
}
|
|
33
137
|
export const actionButtonsPresent = (spec) => {
|
|
34
138
|
const cases = [];
|
|
139
|
+
const modelByName = new Map();
|
|
140
|
+
for (const m of spec.models || [])
|
|
141
|
+
modelByName.set(m.name, m);
|
|
35
142
|
for (const controller of spec.controllers || []) {
|
|
36
143
|
const cured = controller.cured;
|
|
37
144
|
if (!cured)
|
|
38
145
|
continue;
|
|
39
146
|
const modelName = controller.model || controller.name.replace(/Controller$/, '');
|
|
147
|
+
const model = modelByName.get(modelName);
|
|
148
|
+
if (!model)
|
|
149
|
+
continue;
|
|
40
150
|
for (const opName of Object.keys(cured)) {
|
|
41
|
-
// Skip the common 'retrieve' and 'validate' which typically
|
|
42
|
-
// don't have their own button (they fire implicitly). Keep
|
|
43
|
-
// create/update/delete/evolve — the ones users trigger.
|
|
44
151
|
if (!CURED_LABELS.has(opName))
|
|
45
152
|
continue;
|
|
46
153
|
if (opName === 'retrieve' || opName === 'validate')
|
|
47
154
|
continue;
|
|
155
|
+
const steps = [
|
|
156
|
+
{ action: 'bootRuntime' },
|
|
157
|
+
{ action: 'navigateToModelForm', modelName },
|
|
158
|
+
];
|
|
159
|
+
if (opName !== 'create') {
|
|
160
|
+
// Seed an entity (plus any belongsTo parents) via API, then
|
|
161
|
+
// click its row to put the form into update mode where
|
|
162
|
+
// Update / Delete / Evolve render.
|
|
163
|
+
const { steps: seedSteps, targetVar } = buildSeedChain(model, modelByName);
|
|
164
|
+
steps.push(...seedSteps);
|
|
165
|
+
steps.push({ action: 'selectEntityInList', idExpr: `${targetVar}.id` });
|
|
166
|
+
}
|
|
167
|
+
steps.push({ action: 'expectActionButton', modelName, actionLabel: opName });
|
|
48
168
|
cases.push({
|
|
49
169
|
ruleId: RULE_ID,
|
|
50
170
|
specElement: `${controller.name}.${opName}`,
|
|
51
171
|
name: `[${RULE_ID}] ${modelName}.${opName} action button is visible`,
|
|
52
|
-
steps
|
|
53
|
-
{ action: 'bootRuntime' },
|
|
54
|
-
{ action: 'navigateToModel', modelName },
|
|
55
|
-
{ action: 'expectActionButton', modelName, actionLabel: opName },
|
|
56
|
-
],
|
|
172
|
+
steps,
|
|
57
173
|
});
|
|
58
174
|
}
|
|
59
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-buttons-present.js","sourceRoot":"","sources":["../../../../src/inference/ui-contracts/rules/action-buttons-present.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"action-buttons-present.js","sourceRoot":"","sources":["../../../../src/inference/ui-contracts/rules/action-buttons-present.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-types.d.ts","sourceRoot":"","sources":["../../../src/inference/ui-contracts/test-case-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAChB;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,MAAM,EAAE,uBAAuB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,GAC/B;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3F;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,2BAA2B,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAMxE;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"test-case-types.d.ts","sourceRoot":"","sources":["../../../src/inference/ui-contracts/test-case-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../../../src/inference/ui-contracts/translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../../../src/inference/ui-contracts/translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AA+H/D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CA6B5E"}
|
|
@@ -7,6 +7,21 @@
|
|
|
7
7
|
* helpers. The translator is intentionally dumb: each step maps to a
|
|
8
8
|
* helper call, nothing more.
|
|
9
9
|
*/
|
|
10
|
+
/**
|
|
11
|
+
* Render a `createEntity` data object. String values prefixed with
|
|
12
|
+
* `$expr:` emit as raw JS identifiers (e.g. `$expr:p.id` → `p.id`),
|
|
13
|
+
* so rules can thread bound variables from earlier steps into FK
|
|
14
|
+
* fields. Everything else round-trips through JSON.stringify.
|
|
15
|
+
*/
|
|
16
|
+
function renderDataLit(data) {
|
|
17
|
+
const parts = Object.entries(data).map(([k, v]) => {
|
|
18
|
+
if (typeof v === 'string' && v.startsWith('$expr:')) {
|
|
19
|
+
return `${JSON.stringify(k)}: ${v.slice(6)}`;
|
|
20
|
+
}
|
|
21
|
+
return `${JSON.stringify(k)}: ${JSON.stringify(v)}`;
|
|
22
|
+
});
|
|
23
|
+
return `{ ${parts.join(', ')} }`;
|
|
24
|
+
}
|
|
10
25
|
/**
|
|
11
26
|
* Render a single step as a line of test body code.
|
|
12
27
|
*/
|
|
@@ -40,12 +55,18 @@ function renderStep(step) {
|
|
|
40
55
|
return ` await expectActionButton(page, ${JSON.stringify(step.modelName)}, ${JSON.stringify(step.actionLabel)});`;
|
|
41
56
|
case 'createEntity': {
|
|
42
57
|
const varName = step.bindAs || 'created';
|
|
43
|
-
|
|
58
|
+
// String values prefixed with `$expr:` are emitted as raw
|
|
59
|
+
// identifier expressions (not JSON literals). Lets rules
|
|
60
|
+
// reference other bound variables — e.g. pollId = parentPoll.id
|
|
61
|
+
// when seeding Option after Poll.
|
|
62
|
+
const dataLit = renderDataLit(step.data);
|
|
44
63
|
const optsLit = step.uniqueField
|
|
45
64
|
? `, { uniqueField: ${JSON.stringify(step.uniqueField)} }`
|
|
46
65
|
: '';
|
|
47
66
|
return ` const ${varName} = await createEntity(page, ${JSON.stringify(step.modelName)}, ${dataLit}${optsLit});`;
|
|
48
67
|
}
|
|
68
|
+
case 'selectEntityInList':
|
|
69
|
+
return ` await selectEntityInList(page, ${step.idExpr});`;
|
|
49
70
|
case 'deleteEntity':
|
|
50
71
|
return ` await deleteEntity(page, ${JSON.stringify(step.modelName)}, ${step.idExpr});`;
|
|
51
72
|
case 'evolveEntity':
|
|
@@ -94,6 +115,8 @@ function helpersFor(step) {
|
|
|
94
115
|
return ['expectActionButton'];
|
|
95
116
|
case 'createEntity':
|
|
96
117
|
return ['createEntity'];
|
|
118
|
+
case 'selectEntityInList':
|
|
119
|
+
return ['selectEntityInList'];
|
|
97
120
|
case 'deleteEntity':
|
|
98
121
|
return ['deleteEntity'];
|
|
99
122
|
case 'evolveEntity':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translator.js","sourceRoot":"","sources":["../../../src/inference/ui-contracts/translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;GAEG;AACH,SAAS,UAAU,CAAC,IAAc;IAChC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,aAAa;YAChB,+DAA+D;YAC/D,iEAAiE;YACjE,OAAO,gDAAgD,CAAC;QAC1D,KAAK,mBAAmB;YACtB,OAAO,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC/E,KAAK,iBAAiB;YACpB,OAAO,iCAAiC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC7E,KAAK,qBAAqB;YACxB,OAAO,qCAAqC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACjF,KAAK,uBAAuB;YAC1B,OAAO,uCAAuC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACnF,KAAK,mBAAmB;YACtB,OAAO,kCAAkC,CAAC;QAC5C,KAAK,kBAAkB;YACrB,OAAO,kCAAkC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QACrH,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,iCAAiC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,IAAI,CAAC;QAC3H,CAAC;QACD,KAAK,sBAAsB;YACzB,OAAO,sCAAsC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACrH,KAAK,2BAA2B;YAC9B,OAAO,2CAA2C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACjI,KAAK,oBAAoB;YACvB,OAAO,oCAAoC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACrH,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;YACzC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"translator.js","sourceRoot":"","sources":["../../../src/inference/ui-contracts/translator.ts"],"names":[],"mappings":"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"}
|