@kumwe/studio-testkit 0.1.0-alpha.7 → 0.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -23
- package/THIRD_PARTY_NOTICES.md +9 -0
- package/conformance/authoring-web/non-drag-move-equivalence.json +199 -0
- package/conformance/renderer-web/blob-default-deny.json +62 -0
- package/conformance/renderer-web/chart-fallback.json +54 -0
- package/conformance/renderer-web/complete-catalog.json +649 -0
- package/conformance/renderer-web/escaped-heading.json +43 -0
- package/conformance/renderer-web/interactive-behaviors.json +284 -0
- package/conformance/renderer-web/presentation-capabilities.json +104 -0
- package/conformance/renderer-web/responsive-grid.json +48 -0
- package/conformance/renderer-web/security-fallbacks.json +184 -0
- package/conformance/rich-text/advanced.first-party.json +67 -0
- package/corpus-manifest.json +571 -37
- package/dist/contextual-conformance.d.ts +81 -0
- package/dist/contextual-conformance.d.ts.map +1 -0
- package/dist/contextual-conformance.js +1 -0
- package/dist/host-testbed.d.ts +68 -5
- package/dist/host-testbed.d.ts.map +1 -1
- package/dist/host-testbed.js +1 -547
- package/dist/http-authoring-contract.d.ts +3 -0
- package/dist/http-authoring-contract.d.ts.map +1 -0
- package/dist/http-authoring-contract.js +1 -0
- package/dist/http-host-adapter.d.ts +12 -64
- package/dist/http-host-adapter.d.ts.map +1 -1
- package/dist/http-host-adapter.js +1 -256
- package/dist/http-host-responder.d.ts +58 -0
- package/dist/http-host-responder.d.ts.map +1 -0
- package/dist/http-host-responder.js +1 -0
- package/dist/index.d.ts +88 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -140
- package/dist/web-conformance.d.ts +112 -0
- package/dist/web-conformance.d.ts.map +1 -0
- package/dist/web-conformance.js +1 -0
- package/fixtures/authoring-message-catalog.en.json +1093 -0
- package/fixtures/authoring-save.plan.example.json +48 -0
- package/fixtures/authoring-session.example.json +212 -0
- package/fixtures/authoring-target.example.json +34 -0
- package/fixtures/host-capabilities.example.json +2 -2
- package/fixtures/host-operations.example.json +77 -0
- package/fixtures/plugin.example.json +12 -0
- package/fixtures/preview.render.example.json +1 -0
- package/fixtures/reusable-content-type.example.json +26 -0
- package/fixtures/studio-config.example.json +3 -3
- package/fixtures/studio-deployment.hosted.example.json +152 -0
- package/fixtures/studio-deployment.standalone.example.json +9 -0
- package/invalid/authoring-save.plan-missing-coordinates.json +16 -0
- package/invalid/authoring-save.plan-missing-successor-context.json +28 -0
- package/invalid/authoring-save.request-plan-missing-successor-context.json +26 -0
- package/invalid/authoring-session.missing-entry-state.json +9 -0
- package/invalid/authoring-target.missing-resource-types.json +24 -0
- package/invalid/binding-projection-vector.unknown-status.json +85 -0
- package/invalid/host-capabilities.invalid-protocol-version.json +1 -1
- package/invalid/host-error.retry-delay-without-retry.json +16 -0
- package/invalid/host-error.retry-delay-wrong-category.json +16 -0
- package/invalid/host-error.revision-without-conflict.json +16 -0
- package/invalid/host-sequence.pending-expectation.json +52 -0
- package/invalid/host-sequence.preview-render-missing-request-id.json +50 -0
- package/invalid/preview-message.activated-unknown-interaction.json +1 -1
- package/invalid/preview-message.duplicate-marker.json +24 -0
- package/invalid/preview-message.invalid-digest.json +1 -0
- package/invalid/preview-message.invalid-marker-grammar.json +19 -0
- package/invalid/preview-message.missing-marker-map.json +20 -0
- package/invalid/preview-message.missing-render-request-id.json +18 -0
- package/invalid/preview-message.unknown-type.json +13 -0
- package/invalid/preview-message.viewport-height-too-small.json +13 -0
- package/invalid/preview-message.viewport-unsafe-role.json +13 -0
- package/invalid/reusable-content-type.entry-values.json +32 -0
- package/invalid/studio-chart.script-config.json +10 -0
- package/invalid/studio-deployment.long-lived-token.json +24 -0
- package/invalid/studio-deployment.missing-required.json +5 -0
- package/invalid/studio-deployment.unknown-member.json +15 -0
- package/invalid/studio-drawing.svg-payload.json +10 -0
- package/invalid/studio-money.float.json +8 -0
- package/invalid/studio-presentation.css-injection.json +8 -0
- package/invalid/studio-table.html-cell.json +8 -0
- package/package.json +8 -4
- package/studio-release.json +35 -0
- package/vectors/authoring-http/transport-matrix.json +237 -0
- package/vectors/binding-projection/app-content-fields.resolved.json +286 -0
- package/vectors/binding-projection/field-removed.diagnostic.json +135 -0
- package/vectors/binding-projection/model-revision-mismatch.diagnostic.json +124 -0
- package/vectors/host/artifact.dependencies.result.json +2 -2
- package/vectors/host/artifact.load.stored.json +2 -2
- package/vectors/host/artifact.load.unknown.error.json +2 -2
- package/vectors/host/artifact.publish.accepted.json +2 -2
- package/vectors/host/artifact.publish.forbidden.error.json +1 -1
- package/vectors/host/artifact.publish.stale.error.json +2 -2
- package/vectors/host/artifact.save.accepted.json +2 -2
- package/vectors/host/artifact.save.forbidden.error.json +1 -1
- package/vectors/host/artifact.save.stale.error.json +2 -2
- package/vectors/host/artifact.unpublish.stale.error.json +2 -2
- package/vectors/host/envelope.malformed-context.error.json +2 -2
- package/vectors/host/envelope.protocol-version.error.json +1 -1
- package/vectors/host/envelope.stale-generation.error.json +2 -2
- package/vectors/host/localization.messages.unknown-locale.error.json +2 -2
- package/vectors/host/media.abort-upload.unknown.error.json +1 -1
- package/vectors/host/media.authorize-upload.granted.json +1 -1
- package/vectors/host/media.authorize-upload.path-filename.error.json +1 -1
- package/vectors/host/media.authorize-upload.too-large.error.json +1 -1
- package/vectors/host/media.complete-upload.unknown.error.json +1 -1
- package/vectors/host/media.get.unknown.json +2 -2
- package/vectors/host/media.import-external.private-host.error.json +1 -1
- package/vectors/host/media.list.cursor.error.json +2 -2
- package/vectors/host/media.list.limit.error.json +2 -2
- package/vectors/host/media.upload-status.unknown.error.json +1 -1
- package/vectors/host/model.get.stored.json +37 -0
- package/vectors/host/model.list.authorized.json +31 -0
- package/vectors/host/permission.explain.withheld.json +2 -2
- package/vectors/host/permission.refresh.snapshot.json +2 -2
- package/vectors/host/recovery.load.absent.json +2 -2
- package/vectors/host/telemetry.emit.accepted.json +2 -2
- package/vectors/host/telemetry.emit.non-primitive.error.json +2 -2
- package/vectors/host-sequence/artifact.publish.changed-intent.sequence.json +75 -0
- package/vectors/host-sequence/artifact.publish.idempotent-replay.sequence.json +111 -0
- package/vectors/host-sequence/preview.cancel.cross-context.sequence.json +78 -0
- package/vectors/host-sequence/preview.render.cancelled.sequence.json +75 -0
- package/vectors/host-sequence/recovery.store.canonical-number.sequence.json +72 -0
- package/vectors/host-sequence/recovery.store.changed-context.sequence.json +61 -0
- package/vectors/host-sequence/recovery.store.rate-limited.sequence.json +93 -0
- package/vectors/host-sequence/recovery.store.resource-scope.sequence.json +61 -0
- package/vectors/host-sequence/recovery.store.wrong-operation-id.sequence.json +56 -0
- package/vectors/preview/canonical-preorder.json +102 -0
- package/vectors/preview/empty-draft.json +36 -0
- package/vectors/schema-profile/alternative-limit.accepted.json +95 -0
- package/vectors/schema-profile/alternative-limit.rejected.json +92 -0
- package/vectors/schema-profile/array-composition.accepted.json +35 -0
- package/vectors/schema-profile/byte-limit.accepted.json +30 -0
- package/vectors/schema-profile/byte-limit.rejected.json +26 -0
- package/vectors/schema-profile/closed-object.accepted.json +38 -0
- package/vectors/schema-profile/decimal-multiple.accepted.json +54 -0
- package/vectors/schema-profile/depth-limit.accepted.json +90 -0
- package/vectors/schema-profile/depth-limit.rejected.json +88 -0
- package/vectors/schema-profile/description-limit.accepted.json +29 -0
- package/vectors/schema-profile/description-limit.rejected.json +25 -0
- package/vectors/schema-profile/diagnostic-precedence.rejected.json +26 -0
- package/vectors/schema-profile/duplicate-dependent-required.rejected.json +21 -0
- package/vectors/schema-profile/duplicate-required.rejected.json +18 -0
- package/vectors/schema-profile/empty-combinator.rejected.json +17 -0
- package/vectors/schema-profile/empty-enum.rejected.json +17 -0
- package/vectors/schema-profile/enum-limit.accepted.json +89 -0
- package/vectors/schema-profile/enum-limit.rejected.json +84 -0
- package/vectors/schema-profile/examples-limit.accepted.json +35 -0
- package/vectors/schema-profile/examples-limit.rejected.json +31 -0
- package/vectors/schema-profile/format-keyword.rejected.json +17 -0
- package/vectors/schema-profile/forward-reference-path-precedence.rejected.json +20 -0
- package/vectors/schema-profile/invalid-pointer.rejected.json +18 -0
- package/vectors/schema-profile/json-depth-limit.accepted.json +278 -0
- package/vectors/schema-profile/json-depth-limit.rejected.json +276 -0
- package/vectors/schema-profile/json-item-limit.accepted.json +686 -0
- package/vectors/schema-profile/json-item-limit.rejected.json +682 -0
- package/vectors/schema-profile/json-property-limit.accepted.json +1031 -0
- package/vectors/schema-profile/json-property-limit.rejected.json +1028 -0
- package/vectors/schema-profile/local-reference.accepted.json +28 -0
- package/vectors/schema-profile/memoized-diagnostic.accepted.json +31 -0
- package/vectors/schema-profile/node-limit.accepted.json +1097 -0
- package/vectors/schema-profile/node-limit.rejected.json +1094 -0
- package/vectors/schema-profile/non-object-root.rejected.json +9 -0
- package/vectors/schema-profile/non-schema-reference.rejected.json +21 -0
- package/vectors/schema-profile/object-key-limit.accepted.json +32 -0
- package/vectors/schema-profile/object-key-limit.rejected.json +28 -0
- package/vectors/schema-profile/open-root.rejected.json +13 -0
- package/vectors/schema-profile/percent-encoded-pointer.rejected.json +26 -0
- package/vectors/schema-profile/property-name-limit.accepted.json +543 -0
- package/vectors/schema-profile/property-name-limit.rejected.json +536 -0
- package/vectors/schema-profile/recursive-diagnostic-precedence.rejected.json +30 -0
- package/vectors/schema-profile/recursive-reference.rejected.json +24 -0
- package/vectors/schema-profile/reference-fanout.accepted.json +662 -0
- package/vectors/schema-profile/reference-length-limit.accepted.json +45 -0
- package/vectors/schema-profile/reference-length-limit.rejected.json +39 -0
- package/vectors/schema-profile/reference-limit.accepted.json +416 -0
- package/vectors/schema-profile/reference-limit.rejected.json +415 -0
- package/vectors/schema-profile/reference-vs-keyword-precedence.rejected.json +22 -0
- package/vectors/schema-profile/reserved-pointer.rejected.json +26 -0
- package/vectors/schema-profile/root-diagnostic-precedence.rejected.json +16 -0
- package/vectors/schema-profile/root-vs-reference-precedence.rejected.json +19 -0
- package/vectors/schema-profile/schema-map-limit.accepted.json +539 -0
- package/vectors/schema-profile/schema-map-limit.rejected.json +536 -0
- package/vectors/schema-profile/semantic-recursion-precedence.rejected.json +21 -0
- package/vectors/schema-profile/semantic-reference-precedence.rejected.json +21 -0
- package/vectors/schema-profile/title-limit.accepted.json +29 -0
- package/vectors/schema-profile/title-limit.rejected.json +25 -0
- package/vectors/schema-profile/unresolved-reference.rejected.json +17 -0
- package/vectors/schema-profile/unsafe-dependent-required.rejected.json +24 -0
- package/vectors/schema-profile/unsafe-member.rejected.json +17 -0
- package/vectors/schema-profile/unsafe-required.rejected.json +17 -0
- package/dist/host-testbed.js.map +0 -1
- package/dist/http-host-adapter.js.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { AuthoringSaveAsNewTypeRequest, AuthoringSaveIntent, AuthoringSaveItemRequest, AuthoringSaveNewTypeVersionRequest, AuthoringSavePlan, AuthoringSaveResult, AuthoringSessionSnapshot, AuthoringStartRequest, AuthoringTargetResolution, AuthoringTargetResolveRequest, AuthoringTypeListPage, AuthoringTypeListQuery, EntryDocument, QualifiedName, StudioCommand } from '@kumwe/studio-protocol';
|
|
2
|
+
export interface ContextualAuthoringLaunchAssertion {
|
|
3
|
+
expect: AuthoringSessionSnapshot;
|
|
4
|
+
/** Entry value sets that this launch must not have copied. */
|
|
5
|
+
forbiddenEntryValues?: EntryDocument['values'][];
|
|
6
|
+
name: string;
|
|
7
|
+
request: AuthoringStartRequest;
|
|
8
|
+
}
|
|
9
|
+
export interface ContextualAuthoringCommandAssertion {
|
|
10
|
+
commands: StudioCommand[];
|
|
11
|
+
expect: AuthoringSessionSnapshot;
|
|
12
|
+
startName: string;
|
|
13
|
+
}
|
|
14
|
+
export type ContextualAuthoringSaveRequest = AuthoringSaveAsNewTypeRequest | AuthoringSaveItemRequest | AuthoringSaveNewTypeVersionRequest;
|
|
15
|
+
export interface ContextualAuthoringSaveAssertion {
|
|
16
|
+
/** Exact coordinated state immediately before the save intent is planned. */
|
|
17
|
+
before: AuthoringSessionSnapshot;
|
|
18
|
+
expectPlan: AuthoringSavePlan;
|
|
19
|
+
expectResult: AuthoringSaveResult;
|
|
20
|
+
intent: AuthoringSaveIntent;
|
|
21
|
+
request: ContextualAuthoringSaveRequest;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Pure-data first-stride vector. It intentionally remains narrower than the
|
|
25
|
+
* complete `authoring-web` profile: presentation continuity, contribution
|
|
26
|
+
* lifecycle, browser accessibility, and real-host qualification remain open.
|
|
27
|
+
*/
|
|
28
|
+
export interface ContextualAuthoringStrideVector {
|
|
29
|
+
authoring?: ContextualAuthoringCommandAssertion;
|
|
30
|
+
contractVersion: string;
|
|
31
|
+
description: string;
|
|
32
|
+
id: QualifiedName;
|
|
33
|
+
kind: 'contextual-authoring-stride-vector';
|
|
34
|
+
launches: ContextualAuthoringLaunchAssertion[];
|
|
35
|
+
requirements: string[];
|
|
36
|
+
saves: ContextualAuthoringSaveAssertion[];
|
|
37
|
+
target: {
|
|
38
|
+
expect: AuthoringTargetResolution;
|
|
39
|
+
request: AuthoringTargetResolveRequest;
|
|
40
|
+
};
|
|
41
|
+
types: {
|
|
42
|
+
expect: AuthoringTypeListPage;
|
|
43
|
+
query: AuthoringTypeListQuery;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export interface ContextualAuthoringConformanceSession {
|
|
47
|
+
dispatch(command: Readonly<StudioCommand>): Promise<void> | void;
|
|
48
|
+
observe(): Promise<AuthoringSessionSnapshot> | AuthoringSessionSnapshot;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Selector- and framework-neutral adapter. A browser claimant maps these
|
|
52
|
+
* semantic calls onto its real shell; a core or host claimant maps them onto
|
|
53
|
+
* the public session/port APIs. Neither mapping leaks selectors into vectors.
|
|
54
|
+
*/
|
|
55
|
+
export interface ContextualAuthoringConformanceAdapter {
|
|
56
|
+
listTypes(query: Readonly<AuthoringTypeListQuery>): Promise<AuthoringTypeListPage>;
|
|
57
|
+
open(snapshot: Readonly<AuthoringSessionSnapshot>): ContextualAuthoringConformanceSession | Promise<ContextualAuthoringConformanceSession>;
|
|
58
|
+
planSave(intent: Readonly<AuthoringSaveIntent>): Promise<AuthoringSavePlan>;
|
|
59
|
+
resolveTarget(request: Readonly<AuthoringTargetResolveRequest>): Promise<AuthoringTargetResolution>;
|
|
60
|
+
saveAsNewType(request: Readonly<AuthoringSaveAsNewTypeRequest>): Promise<AuthoringSaveResult>;
|
|
61
|
+
saveItem(request: Readonly<AuthoringSaveItemRequest>): Promise<AuthoringSaveResult>;
|
|
62
|
+
saveNewTypeVersion(request: Readonly<AuthoringSaveNewTypeVersionRequest>): Promise<AuthoringSaveResult>;
|
|
63
|
+
start(request: Readonly<AuthoringStartRequest>): Promise<AuthoringSessionSnapshot>;
|
|
64
|
+
}
|
|
65
|
+
export interface ContextualAuthoringStrideResult {
|
|
66
|
+
/** This first increment is executable but is not the complete profile. */
|
|
67
|
+
completeProfile: false;
|
|
68
|
+
mismatches: string[];
|
|
69
|
+
passed: boolean;
|
|
70
|
+
profile: 'studio.profile/authoring-web';
|
|
71
|
+
vectorId: QualifiedName;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Replays target resolution, exact launches, coordinated typed commands, and
|
|
75
|
+
* all three host-authoritative save boundaries without consulting DOM/CSS
|
|
76
|
+
* selectors. The runner compares exact canonical observations and enforces
|
|
77
|
+
* cross-document invariants that a structurally valid individual document
|
|
78
|
+
* cannot express by itself.
|
|
79
|
+
*/
|
|
80
|
+
export declare function runContextualAuthoringStrideVector(vector: Readonly<ContextualAuthoringStrideVector>, adapter: Readonly<ContextualAuthoringConformanceAdapter>): Promise<ContextualAuthoringStrideResult>;
|
|
81
|
+
//# sourceMappingURL=contextual-conformance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextual-conformance.d.ts","sourceRoot":"","sources":["../src/contextual-conformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export async function runContextualAuthoringStrideVector(e,s){let f=d(e),p=[];l(p,`target resolution`,u(await s.resolveTarget(u(e.target.request))),e.target.expect);let m=u(await s.listTypes(u(e.types.query)));l(p,`reusable content type page`,m,e.types.expect);for(let[e,t]of m.items.entries())(c(t,`values`)||c(t,`entry`))&&p.push(`reusable content type summary ${e} contains Entry values`);let h=new Map;for(let[n,r]of e.launches.entries()){let e=`launches[${n}] (${r.name})`,i=u(await s.start(u(r.request)));l(p,e,i,r.expect),t(p,e,r,i),h.has(r.name)&&p.push(`${e} duplicates a launch name`),h.set(r.name,i)}if(e.authoring!==void 0){let t=h.get(e.authoring.startName);if(t===void 0)p.push(`authoring references unknown launch ${e.authoring.startName}`);else{let i=await s.open(u(t));for(let[n,a]of e.authoring.commands.entries())r(p,`authoring.commands[${n}]`,t,a),await i.dispatch(u(a));let a=u(await i.observe());l(p,`coordinated authoring state`,a,e.authoring.expect),n(p,`coordinated authoring state`,a)}}for(let[t,r]of e.saves.entries()){let e=`saves[${t}] (${r.intent.draft.outcome})`;r.before.sessionId!==r.intent.sessionId&&p.push(`${e}.before belongs to another session`);let c=u(await s.planSave(u(r.intent)));l(p,`${e}.plan`,c,r.expectPlan),i(p,e,r.before,r.intent,c,r.request);let d=u(await o(s,u(r.request)));l(p,`${e}.result`,d,r.expectResult),d.outcome!==r.intent.draft.outcome&&p.push(`${e}.result outcome differs from the planned intent`),l(p,`${e}.result plan`,d.plan,r.request.plan),n(p,`${e}.result.session`,d.session),a(p,e,r.before,r.intent,d)}return d(e)!==f&&p.push(`adapter mutated the contextual authoring vector`),{completeProfile:!1,mismatches:p,passed:p.length===0,profile:`studio.profile/authoring-web`,vectorId:e.id}}function t(e,t,r,i){i.target.id!==r.request.targetId&&e.push(`${t} resolved another target`),l(e,`${t}.resourceContext`,i.resourceContext,r.request.resourceContext),l(e,`${t}.start`,i.start,r.request.source),n(e,t,i),r.request.source.kind===`blank`?(i.type!==void 0||i.state.coordinates.type!==void 0)&&e.push(`${t} blank start unexpectedly resolves a reusable type`):r.request.source.kind===`from-type`&&(l(e,`${t}.type reference`,i.state.coordinates.type,r.request.source.type),i.type===void 0?e.push(`${t} did not return the selected reusable type definition`):(l(e,`${t}.type definition reference`,s(i.type),r.request.source.type),(c(i.type,`values`)||c(i.type,`entry`))&&e.push(`${t} reusable type contains Entry values`)));for(let[n,a]of(r.forbiddenEntryValues??[]).entries())d(i.state.entry.values)===d(a)&&e.push(`${t} copied forbidden Entry values set ${n}`)}function n(e,t,n){let{coordinates:r}=n.state;l(e,`${t}.model coordinate`,r.model,{id:n.state.model.id,revision:n.state.model.revision,version:n.state.model.version}),l(e,`${t}.blueprint coordinate`,r.blueprint,{id:n.state.blueprint.id,revision:n.state.blueprint.revision,version:n.state.blueprint.version}),l(e,`${t}.entry coordinate`,r.entry,{id:n.state.entry.id,revision:n.state.entry.revision}),l(e,`${t}.blueprint model lock`,n.state.blueprint.model,r.model),l(e,`${t}.entry model lock`,n.state.entry.model,r.model),n.type===void 0?r.type!==void 0&&e.push(`${t} has type coordinates without a type definition`):(l(e,`${t}.type coordinate`,r.type,s(n.type)),l(e,`${t}.type model lock`,n.type.model,r.model),n.type.authoringPolicy.itemComposition===`denied`&&l(e,`${t}.type blueprint lock`,n.type.blueprint,r.blueprint),(c(n.type,`values`)||c(n.type,`entry`))&&e.push(`${t} reusable type contains Entry values`))}function r(e,t,n,r){let i=r.type===`studio.command/add-model-field`?n.state.model.id:r.type===`studio.command/set-field-value`?n.state.entry.id:n.state.blueprint.id;r.artifactId!==i&&e.push(`${t} targets the wrong separately governed artifact`),r.sessionGeneration!==n.sessionGeneration&&e.push(`${t} carries another session generation`)}function i(e,t,n,r,i,a){let o=r.draft.outcome;if((i.outcome!==o||a.draft.outcome!==o)&&e.push(`${t} crosses save-outcome boundaries`),i.sessionId!==r.sessionId&&e.push(`${t}.plan belongs to another session`),l(e,`${t}.plan expected coordinates`,i.expected,r.expected),l(e,`${t}.request plan`,a.plan,{id:i.id,revision:i.revision,successorContext:i.successorContext}),l(e,`${t}.request draft`,a.draft,r.draft),o===`save-item`)a.kind!==`authoring-save-item-request`&&e.push(`${t} did not use the save-item host operation`),i.affectedArtifacts.includes(`entry`)||e.push(`${t}.plan does not affect the Entry`),i.affectedArtifacts.some(e=>e===`model`||e===`reusable-content-type`)&&e.push(`${t}.plan would mutate the reusable type during item save`),r.draft.itemBlueprint===void 0?i.affectedArtifacts.includes(`blueprint`)&&e.push(`${t}.plan affects a Blueprint without an item-local draft`):(n.type?.authoringPolicy.itemComposition!==`overrides`&&e.push(`${t} carries item-local composition without override authority`),i.affectedArtifacts.includes(`blueprint`)||e.push(`${t}.plan omits the item-local Blueprint`));else{let n=o===`save-new-type-version`?`authoring-save-new-type-version-request`:`authoring-save-as-new-type-request`;a.kind!==n&&e.push(`${t} did not use its distinct type-save host operation`),i.affectedArtifacts.includes(`entry`)&&e.push(`${t}.plan leaks the Entry into a reusable-type save`);for(let n of[`model`,`blueprint`,`reusable-content-type`])i.affectedArtifacts.includes(n)||e.push(`${t}.plan omits affected ${n}`);i.confirmationRequired||e.push(`${t}.plan does not require consequence confirmation`),(c(r.draft,`entry`)||c(a.draft,`entry`)||c(r.draft,`values`)||c(a.draft,`values`))&&e.push(`${t} carries an Entry artifact into a reusable-type operation`)}}function a(e,t,n,r,i){if(i.session.sessionId!==r.sessionId&&e.push(`${t}.result belongs to another session`),l(e,`${t}.result successor context`,i.session.presentation.returnContext,i.plan.successorContext),r.draft.outcome===`save-item`){l(e,`${t}.result reusable type`,i.session.type,n.type),l(e,`${t}.result reusable type coordinate`,i.session.state.coordinates.type,n.state.coordinates.type);return}l(e,`${t}.result Entry values`,i.session.state.entry.values,n.state.entry.values),l(e,`${t}.result Entry dirty state`,i.session.state.dirty.includes(`entry`),n.state.dirty.includes(`entry`)),i.session.type!==void 0&&(c(i.session.type,`entry`)||c(i.session.type,`values`))&&e.push(`${t}.result reusable type contains an Entry artifact`)}async function o(e,t){switch(t.kind){case`authoring-save-item-request`:return e.saveItem(t);case`authoring-save-new-type-version-request`:return e.saveNewTypeVersion(t);case`authoring-save-as-new-type-request`:return e.saveAsNewType(t)}}function s(e){return{id:e.id,revision:e.revision,version:e.version}}function c(e,t){return typeof e==`object`&&!!e&&Object.hasOwn(e,t)}function l(e,t,n,r){d(n)!==d(r)&&e.push(`${t} differs from the vector expectation`)}function u(e){return JSON.parse(JSON.stringify(e))}function d(e){return JSON.stringify(f(e))??`undefined`}function f(e){return Array.isArray(e)?e.map(e=>f(e)):typeof e==`object`&&e?Object.fromEntries(Object.entries(e).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>[e,f(t)])):e}
|
package/dist/host-testbed.d.ts
CHANGED
|
@@ -1,14 +1,75 @@
|
|
|
1
|
-
import { type HostAdapter, type HostErrorCategory, type HostPortError, type HostPortResult, type HostRequestContext, type MediaAsset, type MediaUploadAcceptedAsset, type PreviewRenderPayload, type PreviewRenderedPayload, type QualifiedName, type ResourceSearchHit, type Revision, type StableId, type StudioArtifact, type StudioWireProtocolVersion, type TelemetryEvent } from '@kumwe/studio-protocol';
|
|
2
|
-
export type TestbedPortName = 'artifact' | 'localization' | 'media' | 'permission' | 'preview' | 'recovery' | 'resource' | 'telemetry';
|
|
1
|
+
import { HostPortFailure, type AuthoringSaveAsNewTypeRequest, type AuthoringSaveIntent, type AuthoringSaveItemRequest, type AuthoringSaveNewTypeVersionRequest, type AuthoringSavePlan, type AuthoringSaveResult, type AuthoringSessionSnapshot, type AuthoringStartRequest, type AuthoringTargetResolution, type AuthoringTargetResolveRequest, type AuthoringTypeListQuery, type HostAdapter, type HostErrorCategory, type HostPortError, type HostPortResult, type HostRequestContext, type JsonObject, type MediaAsset, type MediaUploadAcceptedAsset, type PreviewRenderPayload, type PreviewRenderedPayload, type QualifiedName, type ReusableContentTypeDefinition, type ResourceSearchHit, type Revision, type StableId, type StudioArtifact, type StudioWireProtocolVersion, type TelemetryEvent } from '@kumwe/studio-protocol';
|
|
2
|
+
export type TestbedPortName = 'artifact' | 'authoring' | 'localization' | 'media' | 'model' | 'permission' | 'preview' | 'recovery' | 'resource' | 'telemetry';
|
|
3
3
|
export interface TestbedHostOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Permits the fixture-only `studio.test/operation` wildcard used by broad
|
|
6
|
+
* unit tests. Defaults to false and MUST remain false for conformance replay.
|
|
7
|
+
*/
|
|
8
|
+
allowTestOperationId?: boolean;
|
|
9
|
+
authoring?: TestbedAuthoringOptions;
|
|
4
10
|
documents?: StudioArtifact[];
|
|
11
|
+
initialClockMilliseconds?: number;
|
|
5
12
|
mediaAssets?: MediaAsset[];
|
|
6
13
|
messages?: Record<string, Record<QualifiedName, string>>;
|
|
7
14
|
permissions?: QualifiedName[];
|
|
8
|
-
|
|
15
|
+
rateLimits?: TestbedRateLimitPolicy[];
|
|
16
|
+
render?: (payload: PreviewRenderPayload) => PreviewRenderedPayload | Promise<PreviewRenderedPayload>;
|
|
9
17
|
resources?: ResourceSearchHit[];
|
|
18
|
+
/** Exact live generation to seed before the first portable request. */
|
|
19
|
+
sessionGeneration?: Revision;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Exact fixture exchanges for the additive contextual-authoring port. The
|
|
23
|
+
* testbed deliberately does not invent host business policy: a real host
|
|
24
|
+
* supplies the exact target, launch, plan, and accepted-result projections it
|
|
25
|
+
* authorizes, while the testbed supplies deterministic envelope, operation,
|
|
26
|
+
* isolation, and idempotency behavior around those exchanges.
|
|
27
|
+
*/
|
|
28
|
+
export interface TestbedAuthoringOptions {
|
|
29
|
+
plans?: TestbedAuthoringPlanFixture[];
|
|
30
|
+
saves?: TestbedAuthoringSaveFixture[];
|
|
31
|
+
starts?: TestbedAuthoringStartFixture[];
|
|
32
|
+
targets?: TestbedAuthoringTargetFixture[];
|
|
33
|
+
types?: TestbedAuthoringTypeFixture[];
|
|
34
|
+
}
|
|
35
|
+
export interface TestbedAuthoringTargetFixture {
|
|
36
|
+
request: AuthoringTargetResolveRequest;
|
|
37
|
+
resolution: AuthoringTargetResolution;
|
|
38
|
+
}
|
|
39
|
+
export interface TestbedAuthoringTypeFixture {
|
|
40
|
+
definition: ReusableContentTypeDefinition;
|
|
41
|
+
resourceContextKey: StableId;
|
|
42
|
+
targetId: QualifiedName;
|
|
43
|
+
}
|
|
44
|
+
export interface TestbedAuthoringStartFixture {
|
|
45
|
+
request: AuthoringStartRequest;
|
|
46
|
+
session: AuthoringSessionSnapshot;
|
|
47
|
+
}
|
|
48
|
+
export interface TestbedAuthoringPlanFixture {
|
|
49
|
+
intent: AuthoringSaveIntent;
|
|
50
|
+
plan: AuthoringSavePlan;
|
|
51
|
+
resourceContextKey: StableId;
|
|
52
|
+
}
|
|
53
|
+
export type TestbedAuthoringSaveRequest = AuthoringSaveAsNewTypeRequest | AuthoringSaveItemRequest | AuthoringSaveNewTypeVersionRequest;
|
|
54
|
+
export interface TestbedAuthoringSaveFixture {
|
|
55
|
+
request: TestbedAuthoringSaveRequest;
|
|
56
|
+
resourceContextKey: StableId;
|
|
57
|
+
result: AuthoringSaveResult;
|
|
58
|
+
}
|
|
59
|
+
export interface TestbedAuthoringOperation {
|
|
60
|
+
argument: AuthoringSaveIntent | AuthoringStartRequest | AuthoringTargetResolveRequest | AuthoringTypeListQuery | TestbedAuthoringSaveRequest;
|
|
61
|
+
operation: 'list-types' | 'plan-save' | 'resolve-target' | 'save-as-new-type' | 'save-item' | 'save-new-type-version' | 'start';
|
|
62
|
+
}
|
|
63
|
+
/** A deterministic fixed-window policy used by portable sequence replays. */
|
|
64
|
+
export interface TestbedRateLimitPolicy {
|
|
65
|
+
maximumRequests: number;
|
|
66
|
+
operationId: QualifiedName;
|
|
67
|
+
windowMilliseconds: number;
|
|
10
68
|
}
|
|
11
69
|
export interface TestbedControls {
|
|
70
|
+
advanceClock(milliseconds: number): void;
|
|
71
|
+
readonly authoringOperations: readonly TestbedAuthoringOperation[];
|
|
72
|
+
artifactStatus(id: StableId): StudioArtifact['status'] | undefined;
|
|
12
73
|
disconnect(): void;
|
|
13
74
|
failNext(portName: TestbedPortName, operation: string, category: HostErrorCategory): void;
|
|
14
75
|
/**
|
|
@@ -24,7 +85,10 @@ export interface TestbedControls {
|
|
|
24
85
|
*/
|
|
25
86
|
importExternalMedia(candidate: string, context: HostRequestContext): Promise<HostPortResult<MediaUploadAcceptedAsset>>;
|
|
26
87
|
reconnect(): void;
|
|
88
|
+
recoveryEnvelope(resourceContextKey: StableId): JsonObject | undefined;
|
|
27
89
|
revisionOf(id: StableId): Revision | undefined;
|
|
90
|
+
readonly pendingPreviewRenders: number;
|
|
91
|
+
readonly previewDeliveries: readonly string[];
|
|
28
92
|
readonly sessionGeneration: Revision;
|
|
29
93
|
setPermissions(permissions: QualifiedName[]): void;
|
|
30
94
|
readonly telemetryEvents: readonly TelemetryEvent[];
|
|
@@ -43,8 +107,7 @@ export interface HostRequestContextFixtureOptions {
|
|
|
43
107
|
resourceContextKey?: StableId;
|
|
44
108
|
sessionGeneration?: Revision;
|
|
45
109
|
}
|
|
46
|
-
export declare class TestbedHostError extends
|
|
47
|
-
readonly error: HostPortError;
|
|
110
|
+
export declare class TestbedHostError extends HostPortFailure {
|
|
48
111
|
constructor(error: HostPortError);
|
|
49
112
|
}
|
|
50
113
|
export declare function createHostRequestContextFixture(options?: HostRequestContextFixtureOptions): HostRequestContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-testbed.d.ts","sourceRoot":"","sources":["../src/host-testbed.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"host-testbed.d.ts","sourceRoot":"","sources":["../src/host-testbed.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAIf,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAElC,KAAK,sBAAsB,EAE3B,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAGf,KAAK,UAAU,EACf,KAAK,wBAAwB,EAI7B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,6BAA6B,EAClC,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,cAAc,EAEnB,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,WAAW,GACX,cAAc,GACd,OAAO,GACP,OAAO,GACP,YAAY,GACZ,SAAS,GACT,UAAU,GACV,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,oBAAoB,KAC1B,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,QAAQ,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACtC,KAAK,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,6BAA6B,EAAE,CAAC;IAC1C,KAAK,CAAC,EAAE,2BAA2B,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,6BAA6B,CAAC;IACvC,UAAU,EAAE,yBAAyB,CAAC;CACvC;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,6BAA6B,CAAC;IAC1C,kBAAkB,EAAE,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,wBAAwB,CAAC;CACnC;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,kBAAkB,EAAE,QAAQ,CAAC;CAC9B;AAED,MAAM,MAAM,2BAA2B,GACrC,6BAA6B,GAAG,wBAAwB,GAAG,kCAAkC,CAAC;AAEhG,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,2BAA2B,CAAC;IACrC,kBAAkB,EAAE,QAAQ,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EACJ,mBAAmB,GACnB,qBAAqB,GACrB,6BAA6B,GAC7B,sBAAsB,GACtB,2BAA2B,CAAC;IAChC,SAAS,EACL,YAAY,GACZ,WAAW,GACX,gBAAgB,GAChB,kBAAkB,GAClB,WAAW,GACX,uBAAuB,GACvB,OAAO,CAAC;CACb;AAED,6EAA6E;AAC7E,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,aAAa,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACnE,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IACnE,UAAU,IAAI,IAAI,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC1F;;;;;;;;;;OAUG;IACH,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACrD,SAAS,IAAI,IAAI,CAAC;IAClB,gBAAgB,CAAC,kBAAkB,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IACvE,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IACrC,cAAc,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,gCAAgC;IAC/C,gBAAgB,CAAC,EAAE,QAAQ,CAAC;IAC5B,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,kBAAkB,CAAC,EAAE,QAAQ,CAAC;IAC9B,iBAAiB,CAAC,EAAE,QAAQ,CAAC;CAC9B;AAED,qBAAa,gBAAiB,SAAQ,eAAe;gBAChC,KAAK,EAAE,aAAa;CAIxC;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,gCAAqC,GAC7C,kBAAkB,CAapB;AAiBD,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAm7B/E"}
|