@selvajs/server 0.2.0-beta.3 → 0.2.0-beta.4
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/LICENSE +1 -1
- package/README.md +32 -0
- package/dist/compute/client-cache.d.ts.map +1 -1
- package/dist/compute/client-cache.js +6 -0
- package/dist/compute/client-cache.js.map +1 -1
- package/dist/compute/safe-url.d.ts.map +1 -1
- package/dist/compute/safe-url.js +16 -0
- package/dist/compute/safe-url.js.map +1 -1
- package/dist/compute/solve-cache-single-flight.d.ts +8 -1
- package/dist/compute/solve-cache-single-flight.d.ts.map +1 -1
- package/dist/compute/solve-cache-single-flight.js +4 -2
- package/dist/compute/solve-cache-single-flight.js.map +1 -1
- package/dist/compute/solve-pipeline.d.ts.map +1 -1
- package/dist/compute/solve-pipeline.js +3 -1
- package/dist/compute/solve-pipeline.js.map +1 -1
- package/package.json +14 -18
- package/dist/access/__tests__/project-access-input.test.d.ts +0 -2
- package/dist/access/__tests__/project-access-input.test.d.ts.map +0 -1
- package/dist/access/__tests__/project-access-input.test.js +0 -146
- package/dist/access/__tests__/project-access-input.test.js.map +0 -1
- package/dist/compute/__tests__/client-cache.test.d.ts +0 -11
- package/dist/compute/__tests__/client-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/client-cache.test.js +0 -218
- package/dist/compute/__tests__/client-cache.test.js.map +0 -1
- package/dist/compute/__tests__/definition-byte-cache.test.d.ts +0 -2
- package/dist/compute/__tests__/definition-byte-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/definition-byte-cache.test.js +0 -107
- package/dist/compute/__tests__/definition-byte-cache.test.js.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.d.ts +0 -2
- package/dist/compute/__tests__/rate-limit.test.d.ts.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.js +0 -98
- package/dist/compute/__tests__/rate-limit.test.js.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.d.ts +0 -11
- package/dist/compute/__tests__/remote-definition.test.d.ts.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.js +0 -114
- package/dist/compute/__tests__/remote-definition.test.js.map +0 -1
- package/dist/compute/__tests__/safe-url.test.d.ts +0 -2
- package/dist/compute/__tests__/safe-url.test.d.ts.map +0 -1
- package/dist/compute/__tests__/safe-url.test.js +0 -71
- package/dist/compute/__tests__/safe-url.test.js.map +0 -1
- package/dist/compute/__tests__/solve-cache.test.d.ts +0 -13
- package/dist/compute/__tests__/solve-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/solve-cache.test.js +0 -234
- package/dist/compute/__tests__/solve-cache.test.js.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.d.ts +0 -11
- package/dist/compute/__tests__/solve-pipeline.test.d.ts.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.js +0 -557
- package/dist/compute/__tests__/solve-pipeline.test.js.map +0 -1
- package/dist/compute/__tests__/transform-input.test.d.ts +0 -14
- package/dist/compute/__tests__/transform-input.test.d.ts.map +0 -1
- package/dist/compute/__tests__/transform-input.test.js +0 -120
- package/dist/compute/__tests__/transform-input.test.js.map +0 -1
- package/dist/definitions/__tests__/definition-service.test.d.ts +0 -14
- package/dist/definitions/__tests__/definition-service.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/definition-service.test.js +0 -95
- package/dist/definitions/__tests__/definition-service.test.js.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.d.ts +0 -8
- package/dist/definitions/__tests__/load-for-render.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.js +0 -196
- package/dist/definitions/__tests__/load-for-render.test.js.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.d.ts +0 -11
- package/dist/definitions/__tests__/schema-extraction.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.js +0 -115
- package/dist/definitions/__tests__/schema-extraction.test.js.map +0 -1
- package/dist/http/__tests__/body-size.test.d.ts +0 -2
- package/dist/http/__tests__/body-size.test.d.ts.map +0 -1
- package/dist/http/__tests__/body-size.test.js +0 -24
- package/dist/http/__tests__/body-size.test.js.map +0 -1
- package/dist/http/__tests__/route-classifier.test.d.ts +0 -2
- package/dist/http/__tests__/route-classifier.test.d.ts.map +0 -1
- package/dist/http/__tests__/route-classifier.test.js +0 -54
- package/dist/http/__tests__/route-classifier.test.js.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.d.ts +0 -2
- package/dist/http/__tests__/safe-redirect.test.d.ts.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.js +0 -44
- package/dist/http/__tests__/safe-redirect.test.js.map +0 -1
- package/dist/http/__tests__/security-headers.test.d.ts +0 -2
- package/dist/http/__tests__/security-headers.test.d.ts.map +0 -1
- package/dist/http/__tests__/security-headers.test.js +0 -24
- package/dist/http/__tests__/security-headers.test.js.map +0 -1
- package/dist/ops/__tests__/semver.test.d.ts +0 -2
- package/dist/ops/__tests__/semver.test.d.ts.map +0 -1
- package/dist/ops/__tests__/semver.test.js +0 -38
- package/dist/ops/__tests__/semver.test.js.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.d.ts +0 -7
- package/dist/providers/__tests__/create-selva-providers.test.d.ts.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.js +0 -135
- package/dist/providers/__tests__/create-selva-providers.test.js.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.d.ts +0 -2
- package/dist/tokens/__tests__/token-codec.test.d.ts.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.js +0 -50
- package/dist/tokens/__tests__/token-codec.test.js.map +0 -1
- package/src/access/__tests__/project-access-input.test.ts +0 -175
- package/src/access/index.ts +0 -9
- package/src/access/project-access-input.ts +0 -145
- package/src/compute/__tests__/client-cache.test.ts +0 -244
- package/src/compute/__tests__/definition-byte-cache.test.ts +0 -129
- package/src/compute/__tests__/rate-limit.test.ts +0 -106
- package/src/compute/__tests__/remote-definition.test.ts +0 -140
- package/src/compute/__tests__/safe-url.test.ts +0 -72
- package/src/compute/__tests__/solve-cache.test.ts +0 -268
- package/src/compute/__tests__/solve-pipeline.test.ts +0 -660
- package/src/compute/__tests__/transform-input.test.ts +0 -162
- package/src/compute/client-cache.ts +0 -321
- package/src/compute/definition-byte-cache.ts +0 -168
- package/src/compute/index.ts +0 -82
- package/src/compute/limits.ts +0 -237
- package/src/compute/memory-solve-cache.ts +0 -0
- package/src/compute/rate-limit.ts +0 -110
- package/src/compute/remote-definition.ts +0 -149
- package/src/compute/safe-url.ts +0 -186
- package/src/compute/solve-cache-envelope.ts +0 -98
- package/src/compute/solve-cache-key.ts +0 -85
- package/src/compute/solve-cache-single-flight.ts +0 -59
- package/src/compute/solve-pipeline.ts +0 -603
- package/src/compute/transform-input.ts +0 -66
- package/src/definitions/__tests__/definition-service.test.ts +0 -131
- package/src/definitions/__tests__/load-for-render.test.ts +0 -244
- package/src/definitions/__tests__/schema-extraction.test.ts +0 -137
- package/src/definitions/definition-service.ts +0 -247
- package/src/definitions/index.ts +0 -22
- package/src/definitions/load-for-render.ts +0 -272
- package/src/definitions/schema-extraction.ts +0 -117
- package/src/errors/SentryErrorReporter.ts +0 -88
- package/src/errors/index.ts +0 -3
- package/src/http/__tests__/body-size.test.ts +0 -27
- package/src/http/__tests__/route-classifier.test.ts +0 -60
- package/src/http/__tests__/safe-redirect.test.ts +0 -47
- package/src/http/__tests__/security-headers.test.ts +0 -29
- package/src/http/body-size.ts +0 -24
- package/src/http/index.ts +0 -10
- package/src/http/redirect.ts +0 -16
- package/src/http/route-classifier.ts +0 -74
- package/src/http/security-headers.ts +0 -42
- package/src/index.ts +0 -27
- package/src/ops/__tests__/semver.test.ts +0 -42
- package/src/ops/index.ts +0 -3
- package/src/ops/semver.ts +0 -60
- package/src/providers/__tests__/create-selva-providers.test.ts +0 -172
- package/src/providers/__tests__/fixtures/override-config.mjs +0 -8
- package/src/providers/create-selva-providers.ts +0 -241
- package/src/providers/index.ts +0 -12
- package/src/tokens/__tests__/token-codec.test.ts +0 -63
- package/src/tokens/index.ts +0 -8
- package/src/tokens/token-codec.ts +0 -86
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `transformInputParameter` — the adapter that turns a persisted `SchemaInput`
|
|
3
|
-
* (plus the user's chosen value) into the `@selvajs/compute` `InputParam` that
|
|
4
|
-
* `TreeBuilder.fromInputParams` serializes for the solve.
|
|
5
|
-
*
|
|
6
|
-
* The adapter delegates to the package's `processInput`, so these assert the
|
|
7
|
-
* package-aligned behavior: correct `paramType` for every type (not the old
|
|
8
|
-
* coerce-everything-to-Text), and `default` carrying the user's value. Where a value/
|
|
9
|
-
* default is absent, `processInput` leaves `default` undefined and `fromInputParams`
|
|
10
|
-
* omits the input entirely — letting Grasshopper use its own internal default rather
|
|
11
|
-
* than forcing `''`/`false`.
|
|
12
|
-
*/
|
|
13
|
-
import { describe, it, expect } from 'vitest';
|
|
14
|
-
import { transformInputParameter } from '../transform-input.js';
|
|
15
|
-
function input(partial) {
|
|
16
|
-
return {
|
|
17
|
-
id: 'id-1',
|
|
18
|
-
nickname: 'Param',
|
|
19
|
-
paramType: 'text',
|
|
20
|
-
...partial
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
describe('transformInputParameter — identity fields', () => {
|
|
24
|
-
it('carries id, name, nickname, description through', () => {
|
|
25
|
-
const out = transformInputParameter(input({ id: 'guid-x', nickname: 'Width', description: 'the width' }), 5);
|
|
26
|
-
expect(out.id).toBe('guid-x');
|
|
27
|
-
expect(out.name).toBe('Width');
|
|
28
|
-
expect(out.nickname).toBe('Width');
|
|
29
|
-
expect(out.description).toBe('the width');
|
|
30
|
-
});
|
|
31
|
-
it('defaults a blank nickname to null and an absent description to empty string', () => {
|
|
32
|
-
const out = transformInputParameter(input({ nickname: '', description: undefined }), 'v');
|
|
33
|
-
expect(out.nickname).toBeNull();
|
|
34
|
-
expect(out.description).toBe('');
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe('transformInputParameter — number / integer', () => {
|
|
38
|
-
it('maps number with the user value winning over the schema default', () => {
|
|
39
|
-
const out = transformInputParameter(input({ paramType: 'number', default: 1, minimum: 0, maximum: 10, stepSize: 0.5 }), 7);
|
|
40
|
-
expect(out).toMatchObject({ paramType: 'Number', default: 7, minimum: 0, maximum: 10 });
|
|
41
|
-
});
|
|
42
|
-
it('falls back to the schema default when no value is supplied', () => {
|
|
43
|
-
const out = transformInputParameter(input({ paramType: 'number', default: 3 }), undefined);
|
|
44
|
-
expect(out.default).toBe(3);
|
|
45
|
-
});
|
|
46
|
-
it('honors a schema-authored stepSize verbatim for integers (compute ≥3.1.0-beta.5)', () => {
|
|
47
|
-
// The package used to force integer stepSize to 1; since beta.5 a
|
|
48
|
-
// server-authored stepSize wins and the 1-heuristic is only the fallback.
|
|
49
|
-
const out = transformInputParameter(input({ paramType: 'integer', stepSize: 0.5, default: 2 }), 4);
|
|
50
|
-
expect(out).toMatchObject({ paramType: 'Integer', stepSize: 0.5, default: 4 });
|
|
51
|
-
});
|
|
52
|
-
it('falls back to stepSize 1 for integers without an authored stepSize', () => {
|
|
53
|
-
const out = transformInputParameter(input({ paramType: 'integer', default: 2 }), 4);
|
|
54
|
-
expect(out).toMatchObject({ paramType: 'Integer', stepSize: 1, default: 4 });
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
describe('transformInputParameter — text', () => {
|
|
58
|
-
it('maps text and keeps the user value', () => {
|
|
59
|
-
const out = transformInputParameter(input({ paramType: 'text', default: 'd' }), 'hello');
|
|
60
|
-
expect(out).toMatchObject({ paramType: 'Text', default: 'hello' });
|
|
61
|
-
});
|
|
62
|
-
it('falls back to the schema default when no value is supplied', () => {
|
|
63
|
-
expect(transformInputParameter(input({ paramType: 'text', default: 'd' }), undefined).default).toBe('d');
|
|
64
|
-
});
|
|
65
|
-
it('leaves default undefined when neither value nor schema default exist (input is then omitted)', () => {
|
|
66
|
-
// processInput does not force ''. fromInputParams filters undefined defaults, so the
|
|
67
|
-
// param is simply not sent and Grasshopper uses its own internal default.
|
|
68
|
-
expect(transformInputParameter(input({ paramType: 'text', default: undefined }), undefined).default).toBeUndefined();
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('transformInputParameter — boolean', () => {
|
|
72
|
-
it('maps boolean and preserves an explicit false (the bug-prone case)', () => {
|
|
73
|
-
const out = transformInputParameter(input({ paramType: 'boolean', default: true }), false);
|
|
74
|
-
expect(out).toMatchObject({ paramType: 'Boolean', default: false });
|
|
75
|
-
});
|
|
76
|
-
it('falls back to the schema default when no value is supplied', () => {
|
|
77
|
-
expect(transformInputParameter(input({ paramType: 'boolean', default: true }), undefined).default).toBe(true);
|
|
78
|
-
});
|
|
79
|
-
it('leaves default undefined when neither value nor schema default exist (input is then omitted)', () => {
|
|
80
|
-
expect(transformInputParameter(input({ paramType: 'boolean', default: undefined }), undefined)
|
|
81
|
-
.default).toBeUndefined();
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
describe('transformInputParameter — value-list / file / color / generic', () => {
|
|
85
|
-
// The regression that motivated the swap: these used to be silently coerced to Text.
|
|
86
|
-
// processInput now types them correctly. (The options map for ValueList isn't carried
|
|
87
|
-
// on SchemaInput, so `values` is empty and the selected value rides on `default` —
|
|
88
|
-
// which is exactly the string a contextual ValueList param consumes.)
|
|
89
|
-
it('maps valueList to ValueList, carrying the selected value', () => {
|
|
90
|
-
const out = transformInputParameter(input({ paramType: 'valueList', default: '0' }), '1');
|
|
91
|
-
expect(out).toMatchObject({ paramType: 'ValueList', default: '1' });
|
|
92
|
-
});
|
|
93
|
-
// Regression: processInput has no dynamicValueList handler, so without the explicit
|
|
94
|
-
// mapping it fell to the Geometry fallback with a null default — and fromInputParams
|
|
95
|
-
// then DROPPED the input, so the user's selection never reached the definition.
|
|
96
|
-
// The plugin's GetDynamicValueListParameter reuses the ValueList wire contract
|
|
97
|
-
// (TypeName "ValueList"), so ValueList is the correct target type.
|
|
98
|
-
it('maps dynamicValueList to ValueList, carrying the selected value', () => {
|
|
99
|
-
const out = transformInputParameter(input({ paramType: 'dynamicValueList', default: '0' }), '3.5');
|
|
100
|
-
expect(out).toMatchObject({ paramType: 'ValueList', default: '3.5' });
|
|
101
|
-
});
|
|
102
|
-
it('maps dynamicValueList checklist (array value) to ValueList, carrying all selections', () => {
|
|
103
|
-
const out = transformInputParameter(input({ paramType: 'dynamicValueList' }), ['a', 'b']);
|
|
104
|
-
expect(out.paramType).toBe('ValueList');
|
|
105
|
-
expect(out.default).toEqual(['a', 'b']);
|
|
106
|
-
});
|
|
107
|
-
it('maps file to File', () => {
|
|
108
|
-
const out = transformInputParameter(input({ paramType: 'file' }), { fileName: 'a.3dm' });
|
|
109
|
-
expect(out.paramType).toBe('File');
|
|
110
|
-
});
|
|
111
|
-
it('maps color to Color, carrying the value', () => {
|
|
112
|
-
const out = transformInputParameter(input({ paramType: 'color' }), '255,0,0');
|
|
113
|
-
expect(out).toMatchObject({ paramType: 'Color', default: '255,0,0' });
|
|
114
|
-
});
|
|
115
|
-
it('maps generic to the package fallback type (Geometry), not Text', () => {
|
|
116
|
-
const out = transformInputParameter(input({ paramType: 'generic', default: 'd' }), undefined);
|
|
117
|
-
expect(out.paramType).toBe('Geometry');
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
//# sourceMappingURL=transform-input.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform-input.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/transform-input.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `DefinitionService.uploadVersion` version-number allocation (caching
|
|
3
|
-
* Phase 1.5). The root-cause fix: the next version number comes from the store's
|
|
4
|
-
* monotonic `reserveNextVersionNumber` counter — NOT max(existing)+1, which
|
|
5
|
-
* reused a number (and its `fileKey`) after delete-latest and let a stale storage
|
|
6
|
-
* blob serve the old version's bytes for new content.
|
|
7
|
-
*
|
|
8
|
-
* These run against fakes that record the store/storage calls, so they pin the
|
|
9
|
-
* SERVICE's contract (reserve → derive fileKey from the reserved number). That a
|
|
10
|
-
* real provider's counter is truly monotonic across delete-then-reupload is
|
|
11
|
-
* covered by the definition-store conformance suite (both providers).
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=definition-service.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definition-service.test.d.ts","sourceRoot":"","sources":["../../../src/definitions/__tests__/definition-service.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `DefinitionService.uploadVersion` version-number allocation (caching
|
|
3
|
-
* Phase 1.5). The root-cause fix: the next version number comes from the store's
|
|
4
|
-
* monotonic `reserveNextVersionNumber` counter — NOT max(existing)+1, which
|
|
5
|
-
* reused a number (and its `fileKey`) after delete-latest and let a stale storage
|
|
6
|
-
* blob serve the old version's bytes for new content.
|
|
7
|
-
*
|
|
8
|
-
* These run against fakes that record the store/storage calls, so they pin the
|
|
9
|
-
* SERVICE's contract (reserve → derive fileKey from the reserved number). That a
|
|
10
|
-
* real provider's counter is truly monotonic across delete-then-reupload is
|
|
11
|
-
* covered by the definition-store conformance suite (both providers).
|
|
12
|
-
*/
|
|
13
|
-
import { describe, it, expect } from 'vitest';
|
|
14
|
-
import { DefinitionService } from '../definition-service.js';
|
|
15
|
-
const CTX = { userId: 'u-1' };
|
|
16
|
-
const SCHEMA = {};
|
|
17
|
-
function fakeRecord(guid, nextVersionNumber) {
|
|
18
|
-
const now = new Date().toISOString();
|
|
19
|
-
return {
|
|
20
|
-
guid,
|
|
21
|
-
projectId: 'p-1',
|
|
22
|
-
ownerId: 'u-1',
|
|
23
|
-
createdBy: 'u-1',
|
|
24
|
-
updatedBy: 'u-1',
|
|
25
|
-
displayName: 'Def',
|
|
26
|
-
status: 'draft',
|
|
27
|
-
solveCount: 0,
|
|
28
|
-
nextVersionNumber,
|
|
29
|
-
liveVersionId: 'v-existing',
|
|
30
|
-
draftVersionId: 'v-existing',
|
|
31
|
-
createdAt: now,
|
|
32
|
-
updatedAt: now,
|
|
33
|
-
deletedAt: null
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* A minimal data provider whose `definitions` store hands out the reserved
|
|
38
|
-
* number and records the version row it was told to create. Only the methods
|
|
39
|
-
* `uploadVersion` touches are implemented.
|
|
40
|
-
*/
|
|
41
|
-
function fakeDeps(record) {
|
|
42
|
-
let counter = record.nextVersionNumber;
|
|
43
|
-
const created = [];
|
|
44
|
-
const puts = [];
|
|
45
|
-
const data = {
|
|
46
|
-
definitions: {
|
|
47
|
-
get: async () => record,
|
|
48
|
-
reserveNextVersionNumber: async () => counter++, // monotonic, never reused
|
|
49
|
-
createVersion: async (_ctx, v) => {
|
|
50
|
-
created.push(v);
|
|
51
|
-
},
|
|
52
|
-
setDraftVersion: async () => { }
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
const storage = {
|
|
56
|
-
put: async (key) => {
|
|
57
|
-
puts.push(key);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
return { data, storage, created, puts };
|
|
61
|
-
}
|
|
62
|
-
describe('DefinitionService.uploadVersion — version-number allocation', () => {
|
|
63
|
-
it('reserves the next number from the record counter and derives the fileKey from it', async () => {
|
|
64
|
-
const record = fakeRecord('11111111-1111-1111-1111-111111111111', 3);
|
|
65
|
-
const { data, storage, created, puts } = fakeDeps(record);
|
|
66
|
-
const svc = new DefinitionService(data, storage);
|
|
67
|
-
const version = await svc.uploadVersion(CTX, record.guid, new Uint8Array([1, 2, 3]), 'gh', 'model.gh', SCHEMA);
|
|
68
|
-
expect(version.versionNumber).toBe(3);
|
|
69
|
-
// fileKey encodes the reserved number — so a fresh number ⇒ fresh key.
|
|
70
|
-
expect(version.fileKey).toContain('v3');
|
|
71
|
-
expect(puts).toEqual([version.fileKey]);
|
|
72
|
-
expect(created).toHaveLength(1);
|
|
73
|
-
expect(created[0].versionNumber).toBe(3);
|
|
74
|
-
});
|
|
75
|
-
it('two consecutive uploads mint distinct numbers and distinct fileKeys', async () => {
|
|
76
|
-
const record = fakeRecord('22222222-2222-2222-2222-222222222222', 5);
|
|
77
|
-
const { data, storage } = fakeDeps(record);
|
|
78
|
-
const svc = new DefinitionService(data, storage);
|
|
79
|
-
const a = await svc.uploadVersion(CTX, record.guid, new Uint8Array([1]), 'gh', 'a.gh', SCHEMA);
|
|
80
|
-
const b = await svc.uploadVersion(CTX, record.guid, new Uint8Array([2]), 'gh', 'b.gh', SCHEMA);
|
|
81
|
-
expect(a.versionNumber).toBe(5);
|
|
82
|
-
expect(b.versionNumber).toBe(6);
|
|
83
|
-
expect(a.fileKey).not.toBe(b.fileKey);
|
|
84
|
-
});
|
|
85
|
-
it('does NOT derive the number from the version list (no listVersions call)', async () => {
|
|
86
|
-
// The old bug read the version list; the fix must not. A deps object with no
|
|
87
|
-
// listVersions still works — reserveNextVersionNumber is the only source.
|
|
88
|
-
const record = fakeRecord('33333333-3333-3333-3333-333333333333', 9);
|
|
89
|
-
const { data, storage } = fakeDeps(record);
|
|
90
|
-
const svc = new DefinitionService(data, storage);
|
|
91
|
-
const version = await svc.uploadVersion(CTX, record.guid, new Uint8Array([1]), 'gh', 'a.gh', SCHEMA);
|
|
92
|
-
expect(version.versionNumber).toBe(9);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
//# sourceMappingURL=definition-service.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definition-service.test.js","sourceRoot":"","sources":["../../../src/definitions/__tests__/definition-service.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `createDefinitionLoader` (K4) — version resolution, error
|
|
3
|
-
* classification, and the ADR 0005 schema-staleness behavior: a cached schema
|
|
4
|
-
* is used only at the app's current format version; anything else re-extracts
|
|
5
|
-
* from compute and persists back (best-effort, current-version only).
|
|
6
|
-
*/
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=load-for-render.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-for-render.test.d.ts","sourceRoot":"","sources":["../../../src/definitions/__tests__/load-for-render.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `createDefinitionLoader` (K4) — version resolution, error
|
|
3
|
-
* classification, and the ADR 0005 schema-staleness behavior: a cached schema
|
|
4
|
-
* is used only at the app's current format version; anything else re-extracts
|
|
5
|
-
* from compute and persists back (best-effort, current-version only).
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
8
|
-
import { UI_SCHEMA_VERSION } from '@selvajs/schemas';
|
|
9
|
-
import { createDefinitionLoader, DefinitionLoadError } from '../load-for-render.js';
|
|
10
|
-
const ctx = { userId: 'user-1' };
|
|
11
|
-
function uiSchema(version, inputs = []) {
|
|
12
|
-
return {
|
|
13
|
-
id: 'schema-1',
|
|
14
|
-
name: 'Test',
|
|
15
|
-
schemaVersion: version,
|
|
16
|
-
inputs,
|
|
17
|
-
outputs: [],
|
|
18
|
-
layout: { type: 'tabbed', tabs: [] }
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
const record = {
|
|
22
|
-
guid: 'def-1',
|
|
23
|
-
projectId: 'proj-1',
|
|
24
|
-
computeServerId: null,
|
|
25
|
-
liveVersionId: 'v-live',
|
|
26
|
-
draftVersionId: 'v-draft'
|
|
27
|
-
};
|
|
28
|
-
function version(overrides = {}) {
|
|
29
|
-
return {
|
|
30
|
-
id: 'v-live',
|
|
31
|
-
definitionId: 'def-1',
|
|
32
|
-
versionNumber: 1,
|
|
33
|
-
fileExt: 'gh',
|
|
34
|
-
fileKey: 'definitions/def-1/versions/v1.gh',
|
|
35
|
-
uploadedBy: 'user-1',
|
|
36
|
-
uploadedAt: '2026-07-01T00:00:00Z',
|
|
37
|
-
...overrides
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
const computeServer = { id: 'srv-1', serverUrl: 'http://c.example' };
|
|
41
|
-
function makeDeps(overrides = {}) {
|
|
42
|
-
const getIO = vi.fn(async () => ({ inputs: [{ id: 'a', default: 42 }], outputs: [] }));
|
|
43
|
-
const deps = {
|
|
44
|
-
storage: { get: vi.fn(async () => new Uint8Array([1, 2, 3])) },
|
|
45
|
-
definitions: {
|
|
46
|
-
getVersion: vi.fn(async () => version()),
|
|
47
|
-
setVersionSchema: vi.fn(async () => { })
|
|
48
|
-
},
|
|
49
|
-
projects: { getProject: vi.fn(async () => ({ id: 'proj-1', orgId: 'org-1' })) },
|
|
50
|
-
resolveServer: vi.fn(async () => computeServer),
|
|
51
|
-
getClient: vi.fn(async () => ({ client: { getIO, getRawIO: vi.fn() } })),
|
|
52
|
-
fetchSchema: vi.fn(async () => uiSchema(UI_SCHEMA_VERSION, [{ id: 'a' }])),
|
|
53
|
-
onWarn: vi.fn(),
|
|
54
|
-
...overrides
|
|
55
|
-
};
|
|
56
|
-
return {
|
|
57
|
-
deps: deps,
|
|
58
|
-
mocks: deps,
|
|
59
|
-
getIO
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
async function flushMicrotasks() {
|
|
63
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
64
|
-
}
|
|
65
|
-
describe('schema cache staleness (ADR 0005)', () => {
|
|
66
|
-
it('uses the cached schema when its version matches, without re-extracting or persisting', async () => {
|
|
67
|
-
const cached = uiSchema(UI_SCHEMA_VERSION, [{ id: 'a' }]);
|
|
68
|
-
const { deps, mocks } = makeDeps();
|
|
69
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ schema: cached }));
|
|
70
|
-
const result = await createDefinitionLoader(deps)(ctx, record, 'live');
|
|
71
|
-
expect(mocks.fetchSchema).not.toHaveBeenCalled();
|
|
72
|
-
expect(mocks.definitions.setVersionSchema).not.toHaveBeenCalled();
|
|
73
|
-
// Compute defaults are merged into the cached schema's inputs.
|
|
74
|
-
expect(result.schema.inputs[0].default).toBe(42);
|
|
75
|
-
});
|
|
76
|
-
it('re-extracts and persists when the cached schema is at an older format version', async () => {
|
|
77
|
-
const { deps, mocks } = makeDeps();
|
|
78
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ schema: uiSchema('2.10.0') }));
|
|
79
|
-
await createDefinitionLoader(deps)(ctx, record, 'live');
|
|
80
|
-
await flushMicrotasks();
|
|
81
|
-
expect(mocks.fetchSchema).toHaveBeenCalledTimes(1);
|
|
82
|
-
expect(mocks.definitions.setVersionSchema).toHaveBeenCalledWith(ctx, 'v-live', expect.objectContaining({ schemaVersion: UI_SCHEMA_VERSION }));
|
|
83
|
-
});
|
|
84
|
-
it('re-extracts and persists when no schema is cached (pre-caching row)', async () => {
|
|
85
|
-
const { deps, mocks } = makeDeps();
|
|
86
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ schema: undefined }));
|
|
87
|
-
await createDefinitionLoader(deps)(ctx, record, 'live');
|
|
88
|
-
await flushMicrotasks();
|
|
89
|
-
expect(mocks.fetchSchema).toHaveBeenCalledTimes(1);
|
|
90
|
-
expect(mocks.definitions.setVersionSchema).toHaveBeenCalledTimes(1);
|
|
91
|
-
});
|
|
92
|
-
it('does NOT persist a re-extracted schema that is still not at the current version', async () => {
|
|
93
|
-
// Compute plugin behind the app: re-extraction yields an older format.
|
|
94
|
-
const { deps, mocks } = makeDeps({
|
|
95
|
-
fetchSchema: vi.fn(async () => uiSchema('2.10.0'))
|
|
96
|
-
});
|
|
97
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ schema: undefined }));
|
|
98
|
-
const result = await createDefinitionLoader(deps)(ctx, record, 'live');
|
|
99
|
-
await flushMicrotasks();
|
|
100
|
-
expect(mocks.definitions.setVersionSchema).not.toHaveBeenCalled();
|
|
101
|
-
// The older schema still renders (older shapes only lack optional additions).
|
|
102
|
-
expect(result.schema.schemaVersion).toBe('2.10.0');
|
|
103
|
-
});
|
|
104
|
-
it('a failed persist warns but does not fail the render', async () => {
|
|
105
|
-
const { deps, mocks } = makeDeps();
|
|
106
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ schema: undefined }));
|
|
107
|
-
mocks.definitions.setVersionSchema.mockRejectedValue(new Error('RLS: not allowed'));
|
|
108
|
-
const result = await createDefinitionLoader(deps)(ctx, record, 'live');
|
|
109
|
-
await flushMicrotasks();
|
|
110
|
-
expect(result.schema.schemaVersion).toBe(UI_SCHEMA_VERSION);
|
|
111
|
-
expect(mocks.onWarn).toHaveBeenCalledWith(expect.stringContaining('cache refresh failed'));
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
describe('version resolution', () => {
|
|
115
|
-
it('resolves the draft pointer for the draft channel', async () => {
|
|
116
|
-
const { deps, mocks } = makeDeps();
|
|
117
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ id: 'v-draft' }));
|
|
118
|
-
await createDefinitionLoader(deps)(ctx, record, 'draft');
|
|
119
|
-
expect(mocks.definitions.getVersion).toHaveBeenCalledWith(ctx, 'v-draft');
|
|
120
|
-
});
|
|
121
|
-
it('an explicit versionId wins over the channel pointer', async () => {
|
|
122
|
-
const { deps, mocks } = makeDeps();
|
|
123
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ id: 'v-7' }));
|
|
124
|
-
await createDefinitionLoader(deps)(ctx, record, 'live', 'v-7');
|
|
125
|
-
expect(mocks.definitions.getVersion).toHaveBeenCalledWith(ctx, 'v-7');
|
|
126
|
-
});
|
|
127
|
-
it("rejects a version that belongs to another definition ('data')", async () => {
|
|
128
|
-
const { deps, mocks } = makeDeps();
|
|
129
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ definitionId: 'other-def' }));
|
|
130
|
-
await expect(createDefinitionLoader(deps)(ctx, record, 'live')).rejects.toMatchObject({
|
|
131
|
-
name: 'DefinitionLoadError',
|
|
132
|
-
kind: 'data'
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
describe('error classification', () => {
|
|
137
|
-
it("no pointer for the channel → 'data'", async () => {
|
|
138
|
-
const { deps } = makeDeps();
|
|
139
|
-
const bare = { ...record, liveVersionId: null };
|
|
140
|
-
await expect(createDefinitionLoader(deps)(ctx, bare, 'live')).rejects.toMatchObject({
|
|
141
|
-
kind: 'data'
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
it("missing blob → 'data'", async () => {
|
|
145
|
-
const { deps, mocks } = makeDeps();
|
|
146
|
-
mocks.storage.get.mockResolvedValue(null);
|
|
147
|
-
await expect(createDefinitionLoader(deps)(ctx, record, 'live')).rejects.toMatchObject({
|
|
148
|
-
kind: 'data'
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
it("unresolvable compute server → 'missing-config'", async () => {
|
|
152
|
-
const { deps, mocks } = makeDeps();
|
|
153
|
-
mocks.resolveServer.mockRejectedValue(new Error('none visible'));
|
|
154
|
-
await expect(createDefinitionLoader(deps)(ctx, record, 'live')).rejects.toMatchObject({
|
|
155
|
-
kind: 'missing-config'
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
it("client connect failure → 'connect'", async () => {
|
|
159
|
-
const { deps, mocks } = makeDeps();
|
|
160
|
-
mocks.getClient.mockRejectedValue(new Error('ECONNREFUSED'));
|
|
161
|
-
await expect(createDefinitionLoader(deps)(ctx, record, 'live')).rejects.toMatchObject({
|
|
162
|
-
kind: 'connect'
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
it("IO/schema phase failure → 'schema'", async () => {
|
|
166
|
-
const { deps, mocks } = makeDeps({
|
|
167
|
-
fetchSchema: vi.fn(async () => {
|
|
168
|
-
throw new Error('no Schema output');
|
|
169
|
-
})
|
|
170
|
-
});
|
|
171
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ schema: undefined }));
|
|
172
|
-
const err = await createDefinitionLoader(deps)(ctx, record, 'live').catch((e) => e);
|
|
173
|
-
expect(err).toBeInstanceOf(DefinitionLoadError);
|
|
174
|
-
expect(err.kind).toBe('schema');
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
describe('compute default merging', () => {
|
|
178
|
-
beforeEach(() => vi.clearAllMocks());
|
|
179
|
-
it('converts Color defaults to hex', async () => {
|
|
180
|
-
const { deps, mocks } = makeDeps({
|
|
181
|
-
getClient: vi.fn(async () => ({
|
|
182
|
-
client: {
|
|
183
|
-
getIO: vi.fn(async () => ({
|
|
184
|
-
inputs: [{ id: 'col', paramType: 'Color', default: '255,128,0' }],
|
|
185
|
-
outputs: []
|
|
186
|
-
})),
|
|
187
|
-
getRawIO: vi.fn()
|
|
188
|
-
}
|
|
189
|
-
}))
|
|
190
|
-
});
|
|
191
|
-
mocks.definitions.getVersion.mockResolvedValue(version({ schema: uiSchema(UI_SCHEMA_VERSION, [{ id: 'col' }]) }));
|
|
192
|
-
const result = await createDefinitionLoader(deps)(ctx, record, 'live');
|
|
193
|
-
expect(result.schema.inputs[0].default).toBe('#ff8000');
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
//# sourceMappingURL=load-for-render.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-for-render.test.js","sourceRoot":"","sources":["../../../src/definitions/__tests__/load-for-render.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the compute-schema extraction gate (K4 / ADR 0005).
|
|
3
|
-
*
|
|
4
|
-
* `fetch` is stubbed per test to script the compute `/grasshopper/schema`
|
|
5
|
-
* response. The version-compat gate (`assertSupportedSchemaVersion`) is also
|
|
6
|
-
* exercised directly: newer-than-supported must throw 'unsupported', while
|
|
7
|
-
* older / missing versions pass (compute's C# migrator emits its own current
|
|
8
|
-
* version; older shapes only lack optional additions).
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=schema-extraction.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-extraction.test.d.ts","sourceRoot":"","sources":["../../../src/definitions/__tests__/schema-extraction.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the compute-schema extraction gate (K4 / ADR 0005).
|
|
3
|
-
*
|
|
4
|
-
* `fetch` is stubbed per test to script the compute `/grasshopper/schema`
|
|
5
|
-
* response. The version-compat gate (`assertSupportedSchemaVersion`) is also
|
|
6
|
-
* exercised directly: newer-than-supported must throw 'unsupported', while
|
|
7
|
-
* older / missing versions pass (compute's C# migrator emits its own current
|
|
8
|
-
* version; older shapes only lack optional additions).
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
11
|
-
import { UI_SCHEMA_VERSION } from '@selvajs/schemas';
|
|
12
|
-
import { fetchSchemaFromCompute, assertSupportedSchemaVersion, SchemaExtractionError } from '../schema-extraction.js';
|
|
13
|
-
function schema(version) {
|
|
14
|
-
return {
|
|
15
|
-
id: 'schema-1',
|
|
16
|
-
name: 'Test',
|
|
17
|
-
...(version !== undefined && { schemaVersion: version }),
|
|
18
|
-
inputs: [],
|
|
19
|
-
outputs: [],
|
|
20
|
-
layout: { type: 'tabbed', tabs: [] }
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
function bump(version, part) {
|
|
24
|
-
const nums = version.split('.').map(Number);
|
|
25
|
-
nums[part] += 1;
|
|
26
|
-
return nums.join('.');
|
|
27
|
-
}
|
|
28
|
-
const server = {
|
|
29
|
-
id: 'srv-1',
|
|
30
|
-
serverUrl: 'http://compute.example.com',
|
|
31
|
-
apiKey: 'secret'
|
|
32
|
-
};
|
|
33
|
-
describe('assertSupportedSchemaVersion', () => {
|
|
34
|
-
it('passes the current version', () => {
|
|
35
|
-
expect(() => assertSupportedSchemaVersion(schema(UI_SCHEMA_VERSION))).not.toThrow();
|
|
36
|
-
});
|
|
37
|
-
it('passes older versions (older shapes only lack optional additions)', () => {
|
|
38
|
-
expect(() => assertSupportedSchemaVersion(schema('1.0.0'))).not.toThrow();
|
|
39
|
-
expect(() => assertSupportedSchemaVersion(schema('2.0.0'))).not.toThrow();
|
|
40
|
-
});
|
|
41
|
-
it('passes a schema without a version (pre-2.12.0 plugin)', () => {
|
|
42
|
-
expect(() => assertSupportedSchemaVersion(schema())).not.toThrow();
|
|
43
|
-
});
|
|
44
|
-
it.each([
|
|
45
|
-
['major', 0],
|
|
46
|
-
['minor', 1],
|
|
47
|
-
['patch', 2]
|
|
48
|
-
])('throws unsupported for a newer %s version', (_label, part) => {
|
|
49
|
-
const newer = bump(UI_SCHEMA_VERSION, part);
|
|
50
|
-
try {
|
|
51
|
-
assertSupportedSchemaVersion(schema(newer));
|
|
52
|
-
expect.unreachable('should have thrown');
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
expect(err).toBeInstanceOf(SchemaExtractionError);
|
|
56
|
-
expect(err.kind).toBe('unsupported');
|
|
57
|
-
expect(err.message).toContain(newer);
|
|
58
|
-
expect(err.message).toContain(UI_SCHEMA_VERSION);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
it('passes an unparseable version string (fail open — invalid is not "newer")', () => {
|
|
62
|
-
expect(() => assertSupportedSchemaVersion(schema('abc'))).not.toThrow();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
describe('fetchSchemaFromCompute', () => {
|
|
66
|
-
let fetchMock;
|
|
67
|
-
beforeEach(() => {
|
|
68
|
-
fetchMock = vi.fn();
|
|
69
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
70
|
-
});
|
|
71
|
-
afterEach(() => {
|
|
72
|
-
vi.unstubAllGlobals();
|
|
73
|
-
});
|
|
74
|
-
function computeResponse(schemas) {
|
|
75
|
-
// Compute wraps results with PascalCase keys.
|
|
76
|
-
return new Response(JSON.stringify([{ FileName: 'definition.gh', Schemas: schemas }]), {
|
|
77
|
-
status: 200,
|
|
78
|
-
headers: { 'content-type': 'application/json' }
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
it('extracts the first schema and sends the API key header', async () => {
|
|
82
|
-
fetchMock.mockResolvedValue(computeResponse([schema(UI_SCHEMA_VERSION)]));
|
|
83
|
-
const result = await fetchSchemaFromCompute(new Uint8Array([1]), server);
|
|
84
|
-
expect(result.id).toBe('schema-1');
|
|
85
|
-
const [url, init] = fetchMock.mock.calls[0];
|
|
86
|
-
expect(url).toBe('http://compute.example.com/grasshopper/schema');
|
|
87
|
-
expect(init.headers['RhinoComputeKey']).toBe('secret');
|
|
88
|
-
});
|
|
89
|
-
it('throws unreachable when the network request fails', async () => {
|
|
90
|
-
fetchMock.mockRejectedValue(new Error('ECONNREFUSED'));
|
|
91
|
-
await expect(fetchSchemaFromCompute(new Uint8Array([1]), server)).rejects.toMatchObject({
|
|
92
|
-
name: 'SchemaExtractionError',
|
|
93
|
-
kind: 'unreachable'
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
it('throws unreachable on a non-OK status', async () => {
|
|
97
|
-
fetchMock.mockResolvedValue(new Response('nope', { status: 500 }));
|
|
98
|
-
await expect(fetchSchemaFromCompute(new Uint8Array([1]), server)).rejects.toMatchObject({
|
|
99
|
-
kind: 'unreachable'
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
it('throws invalid when the definition yields no schemas', async () => {
|
|
103
|
-
fetchMock.mockResolvedValue(computeResponse([]));
|
|
104
|
-
await expect(fetchSchemaFromCompute(new Uint8Array([1]), server)).rejects.toMatchObject({
|
|
105
|
-
kind: 'invalid'
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
it('applies the version gate to the extracted schema', async () => {
|
|
109
|
-
fetchMock.mockResolvedValue(computeResponse([schema(bump(UI_SCHEMA_VERSION, 1))]));
|
|
110
|
-
await expect(fetchSchemaFromCompute(new Uint8Array([1]), server)).rejects.toMatchObject({
|
|
111
|
-
kind: 'unsupported'
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
//# sourceMappingURL=schema-extraction.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-extraction.test.js","sourceRoot":"","sources":["../../../src/definitions/__tests__/schema-extraction.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"body-size.test.d.ts","sourceRoot":"","sources":["../../../src/http/__tests__/body-size.test.ts"],"names":[],"mappings":""}
|