@owlmeans/planning 0.1.18-rc.2 → 0.1.18-rc.21
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/README.md +69 -26
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/planning/SKILL.md +157 -45
- package/build/aliases/types.d.ts +49 -0
- package/build/aliases/types.d.ts.map +1 -0
- package/build/aliases/types.js +2 -0
- package/build/aliases/types.js.map +1 -0
- package/build/aliases.d.ts +4 -0
- package/build/aliases.d.ts.map +1 -0
- package/build/aliases.js +27 -0
- package/build/aliases.js.map +1 -0
- package/build/consts.d.ts +23 -34
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +26 -25
- package/build/consts.js.map +1 -1
- package/build/entrypoints/types.d.ts +96 -0
- package/build/entrypoints/types.d.ts.map +1 -0
- package/build/entrypoints/types.js +2 -0
- package/build/entrypoints/types.js.map +1 -0
- package/build/entrypoints.d.ts +5 -1
- package/build/entrypoints.d.ts.map +1 -1
- package/build/entrypoints.js +17 -6
- package/build/entrypoints.js.map +1 -1
- package/build/errors.d.ts +41 -0
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js +61 -0
- package/build/errors.js.map +1 -1
- package/build/helpers/apply/consts.local.d.ts +7 -0
- package/build/helpers/apply/consts.local.d.ts.map +1 -0
- package/build/helpers/apply/consts.local.js +9 -0
- package/build/helpers/apply/consts.local.js.map +1 -0
- package/build/helpers/apply/types.d.ts +32 -0
- package/build/helpers/apply/types.d.ts.map +1 -0
- package/build/helpers/apply/types.js +2 -0
- package/build/helpers/apply/types.js.map +1 -0
- package/build/helpers/apply.d.ts +5 -23
- package/build/helpers/apply.d.ts.map +1 -1
- package/build/helpers/apply.js +121 -143
- package/build/helpers/apply.js.map +1 -1
- package/build/helpers/card/types.d.ts +20 -0
- package/build/helpers/card/types.d.ts.map +1 -0
- package/build/helpers/card/types.js +2 -0
- package/build/helpers/card/types.js.map +1 -0
- package/build/helpers/card.d.ts +11 -7
- package/build/helpers/card.d.ts.map +1 -1
- package/build/helpers/card.js +41 -28
- package/build/helpers/card.js.map +1 -1
- package/build/helpers/changes/consts.local.d.ts +13 -0
- package/build/helpers/changes/consts.local.d.ts.map +1 -0
- package/build/helpers/changes/consts.local.js +13 -0
- package/build/helpers/changes/consts.local.js.map +1 -0
- package/build/helpers/changes/types.d.ts +58 -0
- package/build/helpers/changes/types.d.ts.map +1 -0
- package/build/helpers/changes/types.js +2 -0
- package/build/helpers/changes/types.js.map +1 -0
- package/build/helpers/changes.d.ts +11 -42
- package/build/helpers/changes.d.ts.map +1 -1
- package/build/helpers/changes.js +234 -251
- package/build/helpers/changes.js.map +1 -1
- package/build/helpers/code/types.d.ts +27 -0
- package/build/helpers/code/types.d.ts.map +1 -0
- package/build/helpers/code/types.js +2 -0
- package/build/helpers/code/types.js.map +1 -0
- package/build/helpers/code.d.ts +6 -17
- package/build/helpers/code.d.ts.map +1 -1
- package/build/helpers/code.js +39 -40
- package/build/helpers/code.js.map +1 -1
- package/build/helpers/index.d.ts +12 -0
- package/build/helpers/index.d.ts.map +1 -1
- package/build/helpers/index.js +2 -0
- package/build/helpers/index.js.map +1 -1
- package/build/helpers/query/types.d.ts +23 -0
- package/build/helpers/query/types.d.ts.map +1 -0
- package/build/helpers/query/types.js +2 -0
- package/build/helpers/query/types.js.map +1 -0
- package/build/helpers/query.d.ts +25 -17
- package/build/helpers/query.d.ts.map +1 -1
- package/build/helpers/query.js +108 -280
- package/build/helpers/query.js.map +1 -1
- package/build/helpers/scoped/types.d.ts +59 -0
- package/build/helpers/scoped/types.d.ts.map +1 -0
- package/build/helpers/scoped/types.js +2 -0
- package/build/helpers/scoped/types.js.map +1 -0
- package/build/helpers/scoped.d.ts +24 -0
- package/build/helpers/scoped.d.ts.map +1 -0
- package/build/helpers/scoped.js +197 -0
- package/build/helpers/scoped.js.map +1 -0
- package/build/helpers/specification/types.d.ts +24 -0
- package/build/helpers/specification/types.d.ts.map +1 -0
- package/build/helpers/specification/types.js +2 -0
- package/build/helpers/specification/types.js.map +1 -0
- package/build/helpers/specification.d.ts +9 -13
- package/build/helpers/specification.d.ts.map +1 -1
- package/build/helpers/specification.js +47 -44
- package/build/helpers/specification.js.map +1 -1
- package/build/helpers/status/types.d.ts +48 -0
- package/build/helpers/status/types.d.ts.map +1 -0
- package/build/helpers/status/types.js +2 -0
- package/build/helpers/status/types.js.map +1 -0
- package/build/helpers/status.d.ts +16 -29
- package/build/helpers/status.d.ts.map +1 -1
- package/build/helpers/status.js +77 -73
- package/build/helpers/status.js.map +1 -1
- package/build/helpers/types.local.d.ts +17 -0
- package/build/helpers/types.local.d.ts.map +1 -0
- package/build/helpers/types.local.js +2 -0
- package/build/helpers/types.local.js.map +1 -0
- package/build/helpers/validate/types.d.ts +30 -0
- package/build/helpers/validate/types.d.ts.map +1 -0
- package/build/helpers/validate/types.js +2 -0
- package/build/helpers/validate/types.js.map +1 -0
- package/build/helpers/validate.d.ts +8 -19
- package/build/helpers/validate.d.ts.map +1 -1
- package/build/helpers/validate.js +74 -79
- package/build/helpers/validate.js.map +1 -1
- package/build/helpers/wire/types.d.ts +28 -0
- package/build/helpers/wire/types.d.ts.map +1 -0
- package/build/helpers/wire/types.js +2 -0
- package/build/helpers/wire/types.js.map +1 -0
- package/build/helpers/wire.d.ts +4 -0
- package/build/helpers/wire.d.ts.map +1 -0
- package/build/helpers/wire.js +215 -0
- package/build/helpers/wire.js.map +1 -0
- package/build/i18n/be.json +5 -0
- package/build/i18n/de.json +5 -0
- package/build/i18n/en.json +5 -0
- package/build/i18n/es.json +5 -0
- package/build/i18n/fr.json +56 -0
- package/build/i18n/pl.json +5 -0
- package/build/i18n/ru.json +5 -0
- package/build/i18n/uk.json +5 -0
- package/build/i18n.js +5 -4
- package/build/i18n.js.map +1 -1
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/models/index.d.ts +2 -3
- package/build/models/index.d.ts.map +1 -1
- package/build/models/index.js +1 -15
- package/build/models/index.js.map +1 -1
- package/build/models/model.d.ts +5 -0
- package/build/models/model.d.ts.map +1 -0
- package/build/models/model.js +16 -0
- package/build/models/model.js.map +1 -0
- package/build/models/project.d.ts +2 -1
- package/build/models/project.d.ts.map +1 -1
- package/build/models/project.js.map +1 -1
- package/build/models/specification.d.ts +2 -1
- package/build/models/specification.d.ts.map +1 -1
- package/build/models/specification.js.map +1 -1
- package/build/models/types.d.ts +69 -0
- package/build/models/types.d.ts.map +1 -0
- package/build/models/types.js +2 -0
- package/build/models/types.js.map +1 -0
- package/build/models/workcard.d.ts +2 -1
- package/build/models/workcard.d.ts.map +1 -1
- package/build/models/workcard.js +12 -12
- package/build/models/workcard.js.map +1 -1
- package/build/schemas.d.ts +10 -2
- package/build/schemas.d.ts.map +1 -1
- package/build/schemas.js +87 -1
- package/build/schemas.js.map +1 -1
- package/build/types.d.ts +199 -148
- package/build/types.d.ts.map +1 -1
- package/build/utils.d.ts +6 -0
- package/build/utils.d.ts.map +1 -0
- package/build/utils.js +6 -0
- package/build/utils.js.map +1 -0
- package/package.json +11 -11
- package/src/aliases/types.ts +38 -0
- package/src/aliases.ts +31 -0
- package/src/consts.ts +26 -25
- package/src/entrypoints/types.ts +68 -0
- package/src/entrypoints.ts +34 -14
- package/src/errors.ts +71 -0
- package/src/helpers/apply/consts.local.ts +10 -0
- package/src/helpers/apply/types.ts +32 -0
- package/src/helpers/apply.ts +135 -152
- package/src/helpers/card/types.ts +20 -0
- package/src/helpers/card.ts +59 -33
- package/src/helpers/changes/consts.local.ts +17 -0
- package/src/helpers/changes/types.ts +66 -0
- package/src/helpers/changes.ts +267 -280
- package/src/helpers/code/types.ts +31 -0
- package/src/helpers/code.ts +52 -48
- package/src/helpers/index.ts +13 -0
- package/src/helpers/query/types.ts +26 -0
- package/src/helpers/query.ts +144 -314
- package/src/helpers/scoped/types.ts +64 -0
- package/src/helpers/scoped.ts +257 -0
- package/src/helpers/specification/types.ts +26 -0
- package/src/helpers/specification.ts +69 -51
- package/src/helpers/status/types.ts +46 -0
- package/src/helpers/status.ts +117 -93
- package/src/helpers/types.local.ts +18 -0
- package/src/helpers/validate/types.ts +30 -0
- package/src/helpers/validate.ts +84 -77
- package/src/helpers/wire/types.ts +31 -0
- package/src/helpers/wire.ts +251 -0
- package/src/i18n/be.json +5 -0
- package/src/i18n/de.json +5 -0
- package/src/i18n/en.json +5 -0
- package/src/i18n/es.json +5 -0
- package/src/i18n/fr.json +56 -0
- package/src/i18n/pl.json +5 -0
- package/src/i18n/ru.json +5 -0
- package/src/i18n/uk.json +5 -0
- package/src/i18n.ts +6 -4
- package/src/index.ts +4 -0
- package/src/models/index.ts +2 -17
- package/src/models/model.ts +18 -0
- package/src/models/project.ts +2 -1
- package/src/models/specification.ts +2 -1
- package/src/models/types.ts +70 -0
- package/src/models/workcard.ts +14 -16
- package/src/schemas.ts +98 -2
- package/src/types.ts +207 -126
- package/src/utils.ts +9 -0
- package/tests/apply.spec.ts +95 -31
- package/tests/code.spec.ts +9 -9
- package/tests/entrypoints.spec.ts +18 -2
- package/tests/error-status.spec.ts +6 -1
- package/tests/models.spec.ts +16 -15
- package/tests/query.spec.ts +13 -15
- package/tests/schemas.spec.ts +8 -8
- package/tests/scoped.spec.ts +154 -0
- package/tests/status.spec.ts +31 -22
package/build/helpers/status.js
CHANGED
|
@@ -1,78 +1,82 @@
|
|
|
1
1
|
import { ANY_STATUS, INTRINSIC_ORDER, IntrinsicPolicy, IntrinsicStatus } from '../consts.js';
|
|
2
2
|
import { PlanningError, UnknownStatusFlow } from '../errors.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
]));
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* The card's intrinsic state over its flows. {@link IntrinsicPolicy.Primary} reads the primary
|
|
61
|
-
* flow; {@link IntrinsicPolicy.All} takes the least advanced flow. A status the flow does not
|
|
62
|
-
* declare reads as planned.
|
|
63
|
-
*
|
|
64
|
-
* @throws {UnknownStatusFlow}
|
|
65
|
-
*/
|
|
66
|
-
export const resolveIntrinsic = (type, flows, registry) => {
|
|
67
|
-
const read = (id) => {
|
|
68
|
-
const status = flows[id];
|
|
69
|
-
return status == null
|
|
70
|
-
? IntrinsicStatus.Planned
|
|
71
|
-
: intrinsicOf(registry.flow(id), status) ?? IntrinsicStatus.Planned;
|
|
3
|
+
export const createStatusHelper = () => {
|
|
4
|
+
const primaryFlowOf = (type) => {
|
|
5
|
+
const primary = type.flows[0];
|
|
6
|
+
if (primary == null) {
|
|
7
|
+
throw new UnknownStatusFlow(`${type.type}:primary`);
|
|
8
|
+
}
|
|
9
|
+
return primary;
|
|
10
|
+
};
|
|
11
|
+
const flowIdsOf = (type) => [...type.flows];
|
|
12
|
+
const statusDefinitionOf = (flow, status) => flow.statuses.find(definition => definition.key === status);
|
|
13
|
+
const intrinsicOf = (flow, status) => statusDefinitionOf(flow, status)?.intrinsic;
|
|
14
|
+
const initialStatusOf = (flow) => {
|
|
15
|
+
const status = flow.statuses.find(definition => definition.initial === true) ?? flow.statuses[0];
|
|
16
|
+
if (status == null) {
|
|
17
|
+
throw new PlanningError(`flow-empty:${flow.id}`);
|
|
18
|
+
}
|
|
19
|
+
return status.key;
|
|
20
|
+
};
|
|
21
|
+
const isTerminal = (flow, status) => statusDefinitionOf(flow, status)?.terminal === true;
|
|
22
|
+
const fromMatches = (rule, status) => rule.from === ANY_STATUS || (Array.isArray(rule.from) && rule.from.includes(status));
|
|
23
|
+
const ruleOf = (flow, transition, from) => {
|
|
24
|
+
const named = flow.transitions.filter(rule => rule.name === transition);
|
|
25
|
+
return named.find(rule => rule.from !== ANY_STATUS && fromMatches(rule, from))
|
|
26
|
+
?? named.find(rule => rule.from === ANY_STATUS)
|
|
27
|
+
?? (statusDefinitionOf(flow, from) == null ? named[0] : undefined);
|
|
28
|
+
};
|
|
29
|
+
const canTransit = (flow, transition, from) => ruleOf(flow, transition, from) != null;
|
|
30
|
+
const transitionsFrom = (flow, status, opts) => {
|
|
31
|
+
const names = [...new Set(flow.transitions.map(rule => rule.name))];
|
|
32
|
+
return names.map(name => ruleOf(flow, name, status))
|
|
33
|
+
.filter((rule) => rule != null)
|
|
34
|
+
.filter(rule => opts?.explicit !== true || rule.explicit === true);
|
|
35
|
+
};
|
|
36
|
+
const initialFlowsOf = (type, registry, status) => {
|
|
37
|
+
const primary = primaryFlowOf(type);
|
|
38
|
+
return Object.fromEntries(type.flows.map(id => [
|
|
39
|
+
id, id === primary && status != null ? status : initialStatusOf(registry.flow(id)),
|
|
40
|
+
]));
|
|
41
|
+
};
|
|
42
|
+
const resolveIntrinsic = (type, flows, registry) => {
|
|
43
|
+
const read = (id) => {
|
|
44
|
+
const status = flows[id];
|
|
45
|
+
return status == null
|
|
46
|
+
? IntrinsicStatus.Planned
|
|
47
|
+
: intrinsicOf(registry.flow(id), status) ?? IntrinsicStatus.Planned;
|
|
48
|
+
};
|
|
49
|
+
if (type.intrinsic !== IntrinsicPolicy.All) {
|
|
50
|
+
return read(primaryFlowOf(type));
|
|
51
|
+
}
|
|
52
|
+
return type.flows.map(read).reduce((least, intrinsic) => INTRINSIC_ORDER[intrinsic] < INTRINSIC_ORDER[least] ? intrinsic : least, IntrinsicStatus.Closed);
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
primaryFlowOf, flowIdsOf, statusDefinitionOf, intrinsicOf, initialStatusOf, isTerminal, ruleOf, canTransit,
|
|
56
|
+
transitionsFrom, initialFlowsOf, resolveIntrinsic,
|
|
72
57
|
};
|
|
73
|
-
if (type.intrinsic !== IntrinsicPolicy.All) {
|
|
74
|
-
return read(primaryFlowOf(type));
|
|
75
|
-
}
|
|
76
|
-
return type.flows.map(read).reduce((least, intrinsic) => INTRINSIC_ORDER[intrinsic] < INTRINSIC_ORDER[least] ? intrinsic : least, IntrinsicStatus.Closed);
|
|
77
58
|
};
|
|
59
|
+
export const statusHelper = createStatusHelper();
|
|
60
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.primaryFlowOf(…)` */
|
|
61
|
+
export const primaryFlowOf = (type) => statusHelper.primaryFlowOf(type);
|
|
62
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.flowIdsOf(…)` */
|
|
63
|
+
export const flowIdsOf = (type) => statusHelper.flowIdsOf(type);
|
|
64
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.statusDefinitionOf(…)` */
|
|
65
|
+
export const statusDefinitionOf = (flow, status) => statusHelper.statusDefinitionOf(flow, status);
|
|
66
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.intrinsicOf(…)` */
|
|
67
|
+
export const intrinsicOf = (flow, status) => statusHelper.intrinsicOf(flow, status);
|
|
68
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.initialStatusOf(…)` */
|
|
69
|
+
export const initialStatusOf = (flow) => statusHelper.initialStatusOf(flow);
|
|
70
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.isTerminal(…)` */
|
|
71
|
+
export const isTerminal = (flow, status) => statusHelper.isTerminal(flow, status);
|
|
72
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.ruleOf(…)` */
|
|
73
|
+
export const ruleOf = (flow, transition, from) => statusHelper.ruleOf(flow, transition, from);
|
|
74
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.canTransit(…)` */
|
|
75
|
+
export const canTransit = (flow, transition, from) => statusHelper.canTransit(flow, transition, from);
|
|
76
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.transitionsFrom(…)` */
|
|
77
|
+
export const transitionsFrom = (flow, status, opts) => statusHelper.transitionsFrom(flow, status, opts);
|
|
78
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.initialFlowsOf(…)` */
|
|
79
|
+
export const initialFlowsOf = (type, registry, status) => statusHelper.initialFlowsOf(type, registry, status);
|
|
80
|
+
/** @deprecated compat:factory-refactor — use `statusHelper.resolveIntrinsic(…)` */
|
|
81
|
+
export const resolveIntrinsic = (type, flows, registry) => statusHelper.resolveIntrinsic(type, flows, registry);
|
|
78
82
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/helpers/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC5F,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/helpers/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PlanningSchemaRegistry, PlanningScope } from '../types.js';
|
|
2
|
+
import type { SchemaOrigin } from '../consts.js';
|
|
3
|
+
export interface FlowLookup extends Pick<PlanningSchemaRegistry, 'flow'> {
|
|
4
|
+
}
|
|
5
|
+
export interface Scope extends Pick<PlanningScope, 'entityId'> {
|
|
6
|
+
}
|
|
7
|
+
export interface Candidate<T> {
|
|
8
|
+
origin: SchemaOrigin;
|
|
9
|
+
definition: T;
|
|
10
|
+
retired: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface Resolved<T> {
|
|
13
|
+
definitions: T[];
|
|
14
|
+
origins: Record<string, SchemaOrigin>;
|
|
15
|
+
retired: string[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.local.d.ts","sourceRoot":"","sources":["../../src/helpers/types.local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC;CAAG;AAE3E,MAAM,WAAW,KAAM,SAAQ,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;CAAG;AAEjE,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,CAAC,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,WAAW,EAAE,CAAC,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACrC,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.local.js","sourceRoot":"","sources":["../../src/helpers/types.local.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ErrorObject } from 'ajv';
|
|
2
|
+
import type { PlanningSchemaRegistry, SpecificationSlot, Workcard } from '../../types.js';
|
|
3
|
+
/** A record's shape, its type's `fields` and a document's body, checked against their schemas. */
|
|
4
|
+
export interface ValidateHelper {
|
|
5
|
+
/** One line per ajv error: `/path message`. */
|
|
6
|
+
ajvErrorText: (errors?: ErrorObject[] | null) => string;
|
|
7
|
+
/** Keys holding `.` or `$` at any depth — a document store cannot hold them. */
|
|
8
|
+
invalidFieldKeys: (fields: unknown, path?: string) => string[];
|
|
9
|
+
/**
|
|
10
|
+
* Check `fields` against the type's schema, and its keys against the store rule.
|
|
11
|
+
*
|
|
12
|
+
* @throws {FieldsInvalid}
|
|
13
|
+
*/
|
|
14
|
+
validateFields: (registry: Pick<PlanningSchemaRegistry, 'validator'>, type: string, fields: Record<string, unknown>) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Check a whole record: its shape by kind, then its `fields` by type.
|
|
17
|
+
*
|
|
18
|
+
* @throws {PlanningError} `malformed:card:…` for a shape fault
|
|
19
|
+
* @throws {FieldsInvalid}
|
|
20
|
+
*/
|
|
21
|
+
validateCard: (card: Workcard, registry: Pick<PlanningSchemaRegistry, 'validator'>) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Check a document body against its slot: a JSON slot must parse, and match the slot's schema when
|
|
24
|
+
* it declares one.
|
|
25
|
+
*
|
|
26
|
+
* @throws {FieldsInvalid}
|
|
27
|
+
*/
|
|
28
|
+
validateSpecificationBody: (slot: SpecificationSlot, body?: string | null) => void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/helpers/validate/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzF,kGAAkG;AAClG,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,KAAK,MAAM,CAAA;IACvD,gFAAgF;IAChF,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;IAC9D;;;;OAIG;IACH,cAAc,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC5H;;;;;OAKG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC,KAAK,IAAI,CAAA;IAC3F;;;;;OAKG;IACH,yBAAyB,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CACnF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/helpers/validate/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,30 +1,19 @@
|
|
|
1
1
|
import { Ajv } from 'ajv';
|
|
2
2
|
import type { ErrorObject } from 'ajv';
|
|
3
3
|
import type { PlanningSchemaRegistry, SpecificationSlot, Workcard } from '../types.js';
|
|
4
|
+
import type { ValidateHelper } from './validate/types.js';
|
|
4
5
|
/** The ajv every planning validation compiles with: lenient about unknown keywords, all errors, formats. */
|
|
5
6
|
export declare const makeAjv: () => Ajv;
|
|
6
|
-
|
|
7
|
+
export declare const createValidateHelper: () => ValidateHelper;
|
|
8
|
+
export declare const validateHelper: ValidateHelper;
|
|
9
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.ajvErrorText(…)` */
|
|
7
10
|
export declare const ajvErrorText: (errors?: ErrorObject[] | null) => string;
|
|
8
|
-
/**
|
|
11
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.invalidFieldKeys(…)` */
|
|
9
12
|
export declare const invalidFieldKeys: (fields: unknown, path?: string) => string[];
|
|
10
|
-
/**
|
|
11
|
-
* Check `fields` against the type's schema, and its keys against the store rule.
|
|
12
|
-
*
|
|
13
|
-
* @throws {FieldsInvalid}
|
|
14
|
-
*/
|
|
13
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.validateFields(…)` */
|
|
15
14
|
export declare const validateFields: (registry: Pick<PlanningSchemaRegistry, 'validator'>, type: string, fields: Record<string, unknown>) => void;
|
|
16
|
-
/**
|
|
17
|
-
* Check a whole record: its shape by kind, then its `fields` by type.
|
|
18
|
-
*
|
|
19
|
-
* @throws {PlanningError} `malformed:card:…` for a shape fault
|
|
20
|
-
* @throws {FieldsInvalid}
|
|
21
|
-
*/
|
|
15
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.validateCard(…)` */
|
|
22
16
|
export declare const validateCard: (card: Workcard, registry: Pick<PlanningSchemaRegistry, 'validator'>) => void;
|
|
23
|
-
/**
|
|
24
|
-
* Check a document body against its slot: a JSON slot must parse, and match the slot's schema when
|
|
25
|
-
* it declares one.
|
|
26
|
-
*
|
|
27
|
-
* @throws {FieldsInvalid}
|
|
28
|
-
*/
|
|
17
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.validateSpecificationBody(…)` */
|
|
29
18
|
export declare const validateSpecificationBody: (slot: SpecificationSlot, body?: string | null) => void;
|
|
30
19
|
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/helpers/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/helpers/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,KAAK,CAAA;AAMxD,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,4GAA4G;AAC5G,eAAO,MAAM,OAAO,QAAO,GAK1B,CAAA;AAED,eAAO,MAAM,oBAAoB,QAAO,cA0EvC,CAAA;AAED,eAAO,MAAM,cAAc,gBAAyB,CAAA;AAEpD,iFAAiF;AACjF,eAAO,MAAM,YAAY,YAAa,WAAW,EAAE,GAAG,IAAI,KAAG,MAA6C,CAAA;AAE1G,qFAAqF;AACrF,eAAO,MAAM,gBAAgB,WAAY,OAAO,SAAQ,MAAM,KAAQ,MAAM,EAAmD,CAAA;AAE/H,mFAAmF;AACnF,eAAO,MAAM,cAAc,aACf,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC,QAAQ,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACjG,IAA6D,CAAA;AAEhE,iFAAiF;AACjF,eAAO,MAAM,YAAY,SAAU,QAAQ,YAAY,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC,KAAG,IACtD,CAAA;AAE7C,8FAA8F;AAC9F,eAAO,MAAM,yBAAyB,SAAU,iBAAiB,SAAS,MAAM,GAAG,IAAI,KAAG,IACpC,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Ajv } from 'ajv';
|
|
2
2
|
import formatsPlugin from 'ajv-formats';
|
|
3
|
+
import { memoHelper } from '@owlmeans/context';
|
|
3
4
|
import { SpecificationFormat, WorkcardKind } from '../consts.js';
|
|
4
5
|
import { FieldsInvalid, PlanningError } from '../errors.js';
|
|
5
6
|
import { AnyWorkcardSchema, SpecificationSchema, WorkcardSchema } from '../schemas.js';
|
|
@@ -9,85 +10,79 @@ export const makeAjv = () => {
|
|
|
9
10
|
formatsPlugin(ajv);
|
|
10
11
|
return ajv;
|
|
11
12
|
};
|
|
12
|
-
|
|
13
|
-
const ajvOf = (
|
|
14
|
-
const compiled = new Map();
|
|
15
|
-
const compile = (schema) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return fields.flatMap((
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
*
|
|
73
|
-
* @throws {FieldsInvalid}
|
|
74
|
-
*/
|
|
75
|
-
export const validateSpecificationBody = (slot, body) => {
|
|
76
|
-
if (body == null || slot.format !== SpecificationFormat.Json) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
let parsed;
|
|
80
|
-
try {
|
|
81
|
-
parsed = JSON.parse(body);
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
throw new FieldsInvalid(`body:${slot.category}:not-json`);
|
|
85
|
-
}
|
|
86
|
-
if (slot.schema != null && typeof slot.schema === 'object') {
|
|
87
|
-
const validate = compile(slot.schema);
|
|
88
|
-
if (!validate(parsed)) {
|
|
89
|
-
throw new FieldsInvalid(`body:${slot.category}:${ajvErrorText(validate.errors)}`);
|
|
13
|
+
export const createValidateHelper = () => {
|
|
14
|
+
const ajvOf = memoHelper.once(makeAjv);
|
|
15
|
+
const compiled = new Map();
|
|
16
|
+
const compile = (schema) => {
|
|
17
|
+
let validate = compiled.get(schema);
|
|
18
|
+
if (validate == null) {
|
|
19
|
+
validate = ajvOf().compile(schema);
|
|
20
|
+
compiled.set(schema, validate);
|
|
21
|
+
}
|
|
22
|
+
return validate;
|
|
23
|
+
};
|
|
24
|
+
const ajvErrorText = (errors) => (errors ?? []).map(error => `${error.instancePath === '' ? '/' : error.instancePath} ${error.message ?? 'invalid'}`)
|
|
25
|
+
.join('; ');
|
|
26
|
+
const invalidFieldKeys = (fields, path = '') => {
|
|
27
|
+
if (fields == null || typeof fields !== 'object') {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(fields)) {
|
|
31
|
+
return fields.flatMap((entry, index) => invalidFieldKeys(entry, `${path}${index}.`));
|
|
32
|
+
}
|
|
33
|
+
return Object.entries(fields).flatMap(([key, value]) => [
|
|
34
|
+
...(key.includes('.') || key.includes('$') ? [`${path}${key}`] : []),
|
|
35
|
+
...invalidFieldKeys(value, `${path}${key}.`),
|
|
36
|
+
]);
|
|
37
|
+
};
|
|
38
|
+
const validateFields = (registry, type, fields) => {
|
|
39
|
+
const keys = invalidFieldKeys(fields);
|
|
40
|
+
if (keys.length > 0) {
|
|
41
|
+
throw new FieldsInvalid(`keys:${keys.join(',')}`);
|
|
42
|
+
}
|
|
43
|
+
const validate = registry.validator(type);
|
|
44
|
+
if (!validate(fields)) {
|
|
45
|
+
throw new FieldsInvalid(`${type}:${ajvErrorText(validate.errors)}`);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const validateCard = (card, registry) => {
|
|
49
|
+
const validate = compile(card.kind === WorkcardKind.Specification
|
|
50
|
+
? SpecificationSchema
|
|
51
|
+
: card.kind === WorkcardKind.Card || card.kind === WorkcardKind.Project ? WorkcardSchema : AnyWorkcardSchema);
|
|
52
|
+
if (!validate(card)) {
|
|
53
|
+
throw new PlanningError(`malformed:card:${ajvErrorText(validate.errors)}`);
|
|
54
|
+
}
|
|
55
|
+
validateFields(registry, card.type, card.fields);
|
|
56
|
+
};
|
|
57
|
+
const validateSpecificationBody = (slot, body) => {
|
|
58
|
+
if (body == null || slot.format !== SpecificationFormat.Json) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
let parsed;
|
|
62
|
+
try {
|
|
63
|
+
parsed = JSON.parse(body);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new FieldsInvalid(`body:${slot.category}:not-json`);
|
|
67
|
+
}
|
|
68
|
+
if (slot.schema != null && typeof slot.schema === 'object') {
|
|
69
|
+
const validate = compile(slot.schema);
|
|
70
|
+
if (!validate(parsed)) {
|
|
71
|
+
throw new FieldsInvalid(`body:${slot.category}:${ajvErrorText(validate.errors)}`);
|
|
72
|
+
}
|
|
90
73
|
}
|
|
91
|
-
}
|
|
74
|
+
};
|
|
75
|
+
return { ajvErrorText, invalidFieldKeys, validateFields, validateCard, validateSpecificationBody };
|
|
92
76
|
};
|
|
77
|
+
export const validateHelper = createValidateHelper();
|
|
78
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.ajvErrorText(…)` */
|
|
79
|
+
export const ajvErrorText = (errors) => validateHelper.ajvErrorText(errors);
|
|
80
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.invalidFieldKeys(…)` */
|
|
81
|
+
export const invalidFieldKeys = (fields, path = '') => validateHelper.invalidFieldKeys(fields, path);
|
|
82
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.validateFields(…)` */
|
|
83
|
+
export const validateFields = (registry, type, fields) => validateHelper.validateFields(registry, type, fields);
|
|
84
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.validateCard(…)` */
|
|
85
|
+
export const validateCard = (card, registry) => validateHelper.validateCard(card, registry);
|
|
86
|
+
/** @deprecated compat:factory-refactor — use `validateHelper.validateSpecificationBody(…)` */
|
|
87
|
+
export const validateSpecificationBody = (slot, body) => validateHelper.validateSpecificationBody(slot, body);
|
|
93
88
|
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/helpers/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,OAAO,aAAa,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/helpers/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Sort } from '@owlmeans/resource';
|
|
2
|
+
import type { RelationshipQuery, RelationshipQueryWire, SpecificationQuery, SpecificationQueryWire, SummaryQuery, SummaryQueryWire, TransitionQuery, TransitionQueryWire, WorkcardQuery, WorkcardQueryWire } from '../../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The query objects to and from the shape they travel in a URL (`*QueryWire`): a list is
|
|
5
|
+
* comma-joined (JSON when an element holds a comma), an object is JSON, a sort is `field,-field`.
|
|
6
|
+
* Every decoder also accepts the rich form.
|
|
7
|
+
*/
|
|
8
|
+
export interface WireHelper {
|
|
9
|
+
/** A list as one query value: comma-joined, or JSON when an element itself holds a comma. */
|
|
10
|
+
encodeList: (value?: string | readonly string[] | null) => string | undefined;
|
|
11
|
+
/** Every entry of a list query value, whatever shape the transport left it in. */
|
|
12
|
+
decodeList: (value: unknown, key?: string) => string[] | undefined;
|
|
13
|
+
/** `[{ field: 'order' }, { field: 'updatedAt', order: 'desc' }]` ⇄ `order,-updatedAt`. */
|
|
14
|
+
encodeSort: <T>(sort?: Sort<T>[] | null) => string | undefined;
|
|
15
|
+
decodeSort: <T>(value: unknown) => Sort<T>[] | undefined;
|
|
16
|
+
encodeWorkcardQuery: (query?: WorkcardQuery | null) => WorkcardQueryWire;
|
|
17
|
+
/** @throws {PlanningError} `malformed:query:<key>` for a value that does not decode */
|
|
18
|
+
decodeWorkcardQuery: (wire?: WorkcardQueryWire | WorkcardQuery | null) => WorkcardQuery;
|
|
19
|
+
encodeSummaryQuery: (query: SummaryQuery) => SummaryQueryWire;
|
|
20
|
+
decodeSummaryQuery: (wire?: SummaryQueryWire | SummaryQuery | null) => SummaryQuery;
|
|
21
|
+
encodeTransitionQuery: (query?: TransitionQuery | null) => TransitionQueryWire;
|
|
22
|
+
decodeTransitionQuery: (wire?: TransitionQueryWire | TransitionQuery | null) => TransitionQuery;
|
|
23
|
+
encodeSpecificationQuery: (query?: SpecificationQuery | null) => SpecificationQueryWire;
|
|
24
|
+
decodeSpecificationQuery: (wire?: SpecificationQueryWire | SpecificationQuery | null) => SpecificationQuery;
|
|
25
|
+
encodeRelationshipQuery: (query?: RelationshipQuery | null) => RelationshipQueryWire;
|
|
26
|
+
decodeRelationshipQuery: (wire?: RelationshipQueryWire | RelationshipQuery | null) => RelationshipQuery;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/helpers/wire/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,KAAK,EACV,iBAAiB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,YAAY,EAAE,gBAAgB,EACpH,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EACvE,MAAM,gBAAgB,CAAA;AAEvB;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,6FAA6F;IAC7F,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,KAAK,MAAM,GAAG,SAAS,CAAA;IAC7E,kFAAkF;IAClF,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,SAAS,CAAA;IAClE,0FAA0F;IAC1F,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,KAAK,MAAM,GAAG,SAAS,CAAA;IAC9D,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAA;IACxD,mBAAmB,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,KAAK,iBAAiB,CAAA;IACxE,uFAAuF;IACvF,mBAAmB,EAAE,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,aAAa,GAAG,IAAI,KAAK,aAAa,CAAA;IACvF,kBAAkB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,gBAAgB,CAAA;IAC7D,kBAAkB,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,KAAK,YAAY,CAAA;IACnF,qBAAqB,EAAE,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,KAAK,mBAAmB,CAAA;IAC9E,qBAAqB,EAAE,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,eAAe,GAAG,IAAI,KAAK,eAAe,CAAA;IAC/F,wBAAwB,EAAE,CAAC,KAAK,CAAC,EAAE,kBAAkB,GAAG,IAAI,KAAK,sBAAsB,CAAA;IACvF,wBAAwB,EAAE,CAAC,IAAI,CAAC,EAAE,sBAAsB,GAAG,kBAAkB,GAAG,IAAI,KAAK,kBAAkB,CAAA;IAC3G,uBAAuB,EAAE,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,KAAK,qBAAqB,CAAA;IACpF,uBAAuB,EAAE,CAAC,IAAI,CAAC,EAAE,qBAAqB,GAAG,iBAAiB,GAAG,IAAI,KAAK,iBAAiB,CAAA;CACxG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/helpers/wire/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/helpers/wire.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAKjD,eAAO,MAAM,gBAAgB,QAAO,UA+OnC,CAAA;AAED,eAAO,MAAM,UAAU,YAAqB,CAAA"}
|