@substrat-run/contract-tests 0.87.0 → 0.88.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/dist/concurrency-suite.d.ts +3 -0
- package/dist/concurrency-suite.d.ts.map +1 -0
- package/dist/concurrency-suite.js +228 -0
- package/dist/concurrency-suite.js.map +1 -0
- package/dist/conformance.d.ts +85 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +17 -0
- package/dist/conformance.js.map +1 -0
- package/dist/entity-check-plan.d.ts +138 -0
- package/dist/entity-check-plan.d.ts.map +1 -0
- package/dist/entity-check-plan.js +181 -0
- package/dist/entity-check-plan.js.map +1 -0
- package/dist/entity-check-suite.d.ts +3 -90
- package/dist/entity-check-suite.d.ts.map +1 -1
- package/dist/entity-check-suite.js +42 -71
- package/dist/entity-check-suite.js.map +1 -1
- package/dist/entity-version-suite.d.ts +3 -0
- package/dist/entity-version-suite.d.ts.map +1 -0
- package/dist/entity-version-suite.js +160 -0
- package/dist/entity-version-suite.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/input-parse-suite.d.ts +3 -0
- package/dist/input-parse-suite.d.ts.map +1 -0
- package/dist/input-parse-suite.js +149 -0
- package/dist/input-parse-suite.js.map +1 -0
- package/dist/modules.d.ts +378 -160
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +224 -1
- package/dist/modules.js.map +1 -1
- package/dist/node-only-suite.d.ts +28 -0
- package/dist/node-only-suite.d.ts.map +1 -1
- package/dist/node-only-suite.js +43 -1
- package/dist/node-only-suite.js.map +1 -1
- package/dist/permission-suite.d.ts.map +1 -1
- package/dist/permission-suite.js +125 -0
- package/dist/permission-suite.js.map +1 -1
- package/package.json +11 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-version-suite.js","sourceRoot":"","sources":["../src/entity-version-suite.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,12 +3,17 @@ export type { ScopeHostFixture, ScopeHostSuiteOptions } from './scope-host-suite
|
|
|
3
3
|
export { permissionContractSuite } from './permission-suite.js';
|
|
4
4
|
export { atomicContractSuite } from './atomic-suite.js';
|
|
5
5
|
export { searchContractSuite } from './search-suite.js';
|
|
6
|
+
export { entityVersionContractSuite } from './entity-version-suite.js';
|
|
7
|
+
export { concurrencyContractSuite } from './concurrency-suite.js';
|
|
6
8
|
export { listContractSuite } from './list-suite.js';
|
|
7
9
|
export { scheduleContractSuite } from './schedule-suite.js';
|
|
10
|
+
export { inputParseContractSuite } from './input-parse-suite.js';
|
|
8
11
|
export { entityCheckConformanceSuite, planEntityCheckCoverage } from './entity-check-suite.js';
|
|
9
12
|
export type { EntityCheckFixture, EntityCheckSuiteOptions, PlannedCheck } from './entity-check-suite.js';
|
|
10
|
-
export { nodeOnlySuite } from './node-only-suite.js';
|
|
13
|
+
export { nodeOnlySuite, declaredNodeOnlySuite } from './node-only-suite.js';
|
|
11
14
|
export type { NodeOnlyOptions } from './node-only-suite.js';
|
|
12
|
-
export {
|
|
15
|
+
export { declareEntityChecks, declareNodeOnly, assertNodeOnly } from './conformance.js';
|
|
16
|
+
export type { ConformanceDeclaration, DrivenConformance, DeclaredNodeOnlyConformance, AssertedNodeOnlyConformance, } from './conformance.js';
|
|
17
|
+
export { atomicMod, billedMod, brokenMod, connectorMod, contractTestBareOps, contractTestInitialModules, contractTestModules, permMod, scheduleMod, searchMod, searchModManifest, listMod, listModManifest, parseMod, parseModManifest, } from './modules.js';
|
|
13
18
|
export { connectorCalls, connectorTestFetch, resetConnectorCalls, type ConnectorCall, } from './connector-fixture.js';
|
|
14
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxF,YAAY,EACV,sBAAsB,EACtB,iBAAiB,EACjB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,eAAe,EACf,QAAQ,EACR,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,14 @@ export { scopeHostContractSuite } from './scope-host-suite.js';
|
|
|
2
2
|
export { permissionContractSuite } from './permission-suite.js';
|
|
3
3
|
export { atomicContractSuite } from './atomic-suite.js';
|
|
4
4
|
export { searchContractSuite } from './search-suite.js';
|
|
5
|
+
export { entityVersionContractSuite } from './entity-version-suite.js';
|
|
6
|
+
export { concurrencyContractSuite } from './concurrency-suite.js';
|
|
5
7
|
export { listContractSuite } from './list-suite.js';
|
|
6
8
|
export { scheduleContractSuite } from './schedule-suite.js';
|
|
9
|
+
export { inputParseContractSuite } from './input-parse-suite.js';
|
|
7
10
|
export { entityCheckConformanceSuite, planEntityCheckCoverage } from './entity-check-suite.js';
|
|
8
|
-
export { nodeOnlySuite } from './node-only-suite.js';
|
|
9
|
-
export {
|
|
11
|
+
export { nodeOnlySuite, declaredNodeOnlySuite } from './node-only-suite.js';
|
|
12
|
+
export { declareEntityChecks, declareNodeOnly, assertNodeOnly } from './conformance.js';
|
|
13
|
+
export { atomicMod, billedMod, brokenMod, connectorMod, contractTestBareOps, contractTestInitialModules, contractTestModules, permMod, scheduleMod, searchMod, searchModManifest, listMod, listModManifest, parseMod, parseModManifest, } from './modules.js';
|
|
10
14
|
export { connectorCalls, connectorTestFetch, resetConnectorCalls, } from './connector-fixture.js';
|
|
11
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAE/F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAE/F,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOxF,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,eAAe,EACf,QAAQ,EACR,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-parse-suite.d.ts","sourceRoot":"","sources":["../src/input-parse-suite.ts"],"names":[],"mappings":"AAmDA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAC3C,IAAI,CA4HN"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract suite for the declared-input parse at the scope door (#893).
|
|
3
|
+
*
|
|
4
|
+
* What it pins is one sentence: **an operation's declared `input` is parsed by
|
|
5
|
+
* the HOST, before the guards and the handler, on every path into a scope.**
|
|
6
|
+
*
|
|
7
|
+
* ## Why this is a host contract and not a house rule
|
|
8
|
+
*
|
|
9
|
+
* `OperationShape.input` has always described itself as *"the SAME Zod object
|
|
10
|
+
* the handler parses"*. Across the fleet it mostly was not: of ~85 declared
|
|
11
|
+
* inputs, 40 were parsed, and `demos/rally` declared 32 and parsed 2. The
|
|
12
|
+
* declaration was true about the shape — the compiler holds `idFrom` and
|
|
13
|
+
* `entityIdFrom` to it — and false about the parsing, which is the half that
|
|
14
|
+
* refuses a malformed call. Every operation authored after the fix would have
|
|
15
|
+
* had to remember, forever, in every vertical.
|
|
16
|
+
*
|
|
17
|
+
* The alternative was a lint rule, and it is strictly weaker: it can ask only
|
|
18
|
+
* whether *some* `.parse` appears in a handler body, never whether it is the
|
|
19
|
+
* declared schema at the boundary. It also cannot be satisfied at all where the
|
|
20
|
+
* schema is declared inline (`input: z.object({…})`) — callout, handlebar and
|
|
21
|
+
* todo declare 25 such inputs between them, the reference implementation among
|
|
22
|
+
* them. So the host parses, from the declaration that already produces the
|
|
23
|
+
* manifest, the routes and the OpenAPI document. `mountOperations` had already
|
|
24
|
+
* made this argument for the page trio, in those words.
|
|
25
|
+
*
|
|
26
|
+
* ## Why it belongs to every adapter
|
|
27
|
+
*
|
|
28
|
+
* A vertical's isolation now depends on it. If one host parses and another does
|
|
29
|
+
* not, the same operation refuses a malformed call on SQLite and accepts it on
|
|
30
|
+
* the DO — and "parse, don't trust" becomes a fact about which substrate a
|
|
31
|
+
* tenant landed on. That is exactly the class of divergence `atomicContractSuite`
|
|
32
|
+
* exists to close for `ctx.atomic`.
|
|
33
|
+
*
|
|
34
|
+
* The suite deliberately drives operations through `stub.invoke` rather than
|
|
35
|
+
* over HTTP. Parsing at the HTTP mount alone would leave every scenario test,
|
|
36
|
+
* seed and schedule on an unparsed path — the demos' own suites would exercise
|
|
37
|
+
* the one route the fix did not cover.
|
|
38
|
+
*/
|
|
39
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
40
|
+
import { errorCodeOf, moduleId, permissionKey, platformActorId, principalId, scopeId, tenantId, toProblem, } from '@substrat-run/contracts';
|
|
41
|
+
import { ulid } from '@substrat-run/kernel';
|
|
42
|
+
import { parseMod, parseModManifest } from './modules.js';
|
|
43
|
+
const PARSE_USE = permissionKey.parse('parse:use');
|
|
44
|
+
export function inputParseContractSuite(adapterName, makeFixture) {
|
|
45
|
+
describe(`declared input is parsed at the door (#893): ${adapterName}`, () => {
|
|
46
|
+
let fixture;
|
|
47
|
+
let host;
|
|
48
|
+
let stub;
|
|
49
|
+
const t1 = tenantId.parse(ulid());
|
|
50
|
+
const s1 = scopeId.parse(ulid());
|
|
51
|
+
const alice = principalId.parse(ulid());
|
|
52
|
+
const staff = platformActorId.parse(ulid());
|
|
53
|
+
beforeAll(async () => {
|
|
54
|
+
fixture = await makeFixture();
|
|
55
|
+
host = fixture.host;
|
|
56
|
+
host.registerModule(parseMod);
|
|
57
|
+
await host.admin.createTenant(staff, { id: t1, slug: 'parse-tenant', name: 'Parse Tenant' });
|
|
58
|
+
await host.admin.grantEntitlement(staff, t1, 'parse');
|
|
59
|
+
await host.admin.defineRole(staff, t1, {
|
|
60
|
+
key: 'parser',
|
|
61
|
+
permissions: [PARSE_USE],
|
|
62
|
+
source: 'vertical',
|
|
63
|
+
});
|
|
64
|
+
await host.admin.assignRole(staff, {
|
|
65
|
+
principalId: alice,
|
|
66
|
+
roleKey: 'parser',
|
|
67
|
+
node: { tenantId: t1, scopeId: null },
|
|
68
|
+
});
|
|
69
|
+
await host.provisionScope(staff, { tenantId: t1, scopeId: s1, vertical: 'parse-vertical' });
|
|
70
|
+
await host.admin.activateScope(staff, t1, s1);
|
|
71
|
+
stub = await host.getScope(alice, t1, s1);
|
|
72
|
+
});
|
|
73
|
+
afterAll(async () => {
|
|
74
|
+
await fixture.cleanup();
|
|
75
|
+
});
|
|
76
|
+
const received = async (op, input) => (await stub.invoke(op, input)).received;
|
|
77
|
+
it('refuses an invocation whose declared field has the wrong type', async () => {
|
|
78
|
+
// The handler never runs: a `name` of the wrong type is not a domain
|
|
79
|
+
// decision the module gets to make badly, it is a call that never had a
|
|
80
|
+
// meaning. Refused before the transaction opens.
|
|
81
|
+
await expect(stub.invoke('parse/echo', { name: 42 })).rejects.toThrow();
|
|
82
|
+
});
|
|
83
|
+
it('refuses an invocation missing a required declared field', async () => {
|
|
84
|
+
await expect(stub.invoke('parse/echo', { tag: 'x' })).rejects.toThrow();
|
|
85
|
+
});
|
|
86
|
+
/**
|
|
87
|
+
* #831. Refusing is half a contract; saying WHICH field was wrong is the half a
|
|
88
|
+
* client — or a build agent — recovers from without a person reading a log.
|
|
89
|
+
*
|
|
90
|
+
* This belongs beside the refusals above rather than in `contracts` alone, because
|
|
91
|
+
* the two substrates lose the answer differently. Under `adapter-sqlite` the parse
|
|
92
|
+
* throws in-process and the `ZodError` arrives with `issues` intact. Under
|
|
93
|
+
* `adapter-cloudflare` it is raised INSIDE the ScopeDO and crosses the hop, where a
|
|
94
|
+
* throw carries only its message — so the field list used to survive nowhere but as
|
|
95
|
+
* JSON inside that message, and every vertical re-parsed the string to get it back.
|
|
96
|
+
*
|
|
97
|
+
* A suite that ran on one adapter would have called that fixed.
|
|
98
|
+
*/
|
|
99
|
+
it('names the field that was wrong, whichever substrate refused it', async () => {
|
|
100
|
+
const err = await stub.invoke('parse/echo', { name: 42 }).then(() => {
|
|
101
|
+
throw new Error('the invoke should have been refused');
|
|
102
|
+
}, (e) => e);
|
|
103
|
+
expect(errorCodeOf(err)).toBe('validation_failed');
|
|
104
|
+
const body = toProblem(err);
|
|
105
|
+
expect(body.status).toBe(400);
|
|
106
|
+
expect(body.errors?.map((issue) => issue.path)).toContain('name');
|
|
107
|
+
});
|
|
108
|
+
it('strips a field the declaration does not name', async () => {
|
|
109
|
+
// The undeclared key is gone before module code sees it — so a caller
|
|
110
|
+
// cannot smuggle a field past a handler that reads more than it declared.
|
|
111
|
+
const out = await received('parse/echo', { name: 'a', unexpected: 'smuggled' });
|
|
112
|
+
expect(out).not.toHaveProperty('unexpected');
|
|
113
|
+
expect(out).toMatchObject({ name: 'a' });
|
|
114
|
+
});
|
|
115
|
+
it("applies the declaration's own default", async () => {
|
|
116
|
+
// The case a handler cannot fake by being careful: `size` arrives SET on a
|
|
117
|
+
// call that never sent it, which only a parse against the declaration does.
|
|
118
|
+
expect(await received('parse/echo', { name: 'a' })).toMatchObject({ size: 7 });
|
|
119
|
+
});
|
|
120
|
+
it('keeps an optional declared field absent rather than inventing it', async () => {
|
|
121
|
+
const out = await received('parse/echo', { name: 'a' });
|
|
122
|
+
expect(out).not.toHaveProperty('tag');
|
|
123
|
+
});
|
|
124
|
+
it('lets the platform page trio through a paged operation (#811)', async () => {
|
|
125
|
+
// A strict parse against `input` alone would strip these back out and hand
|
|
126
|
+
// every paged read an unpaged request.
|
|
127
|
+
const out = await received('parse/paged', { q: 'find', limit: 5, cursor: 'c1', order: 'desc', sort: 'name' });
|
|
128
|
+
expect(out).toMatchObject({ q: 'find', limit: 5, cursor: 'c1', order: 'desc', sort: 'name' });
|
|
129
|
+
});
|
|
130
|
+
it('rejects a page value outside the platform ceiling', async () => {
|
|
131
|
+
await expect(stub.invoke('parse/paged', { limit: 10_000 })).rejects.toThrow();
|
|
132
|
+
});
|
|
133
|
+
it('hands an operation that declares no input its `undefined` unchanged', async () => {
|
|
134
|
+
// `z.object({})` cannot say "no body", so the host must not invent one:
|
|
135
|
+
// a handler typed for `undefined` is not one accepting `{}`.
|
|
136
|
+
expect(await received('parse/bare')).toBeNull();
|
|
137
|
+
});
|
|
138
|
+
it('refuses a schema declared for an operation the module does not bind', () => {
|
|
139
|
+
// A schema on nothing enforces nothing while reading as coverage — the
|
|
140
|
+
// same reasoning `checksDeclaredElsewhere` applies to a stale exemption.
|
|
141
|
+
expect(() => host.registerModule({
|
|
142
|
+
manifest: { ...parseModManifest, id: moduleId.parse('@test/parse-unbound') },
|
|
143
|
+
operations: { 'unbound/act': (() => 'ran') },
|
|
144
|
+
operationInputs: { 'unbound/nope': { parse: (v) => v } },
|
|
145
|
+
})).toThrow(/unbound/i);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=input-parse-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-parse-suite.js","sourceRoot":"","sources":["../src/input-parse-suite.ts"],"names":[],"mappings":"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"}
|