@kumwe/studio-testkit 0.1.0-alpha.3 → 0.1.0-alpha.5

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.
@@ -0,0 +1,74 @@
1
+ import { type HostAdapter } from '@kumwe/studio-protocol';
2
+ /**
3
+ * Minimal structural view of an HTTP response the adapter needs: the status
4
+ * code and the raw body text. Deliberately narrower than any platform
5
+ * response class so implementations from any runtime satisfy it.
6
+ */
7
+ export interface HttpResponseLike {
8
+ status: number;
9
+ text(): Promise<string>;
10
+ }
11
+ /** The request shape the adapter hands to the injected transport. */
12
+ export interface HttpRequestInit {
13
+ body: string;
14
+ headers: Record<string, string>;
15
+ method: 'POST';
16
+ /** Opaque abort signal produced by the injected timeout factory, if any. */
17
+ signal?: unknown;
18
+ }
19
+ /**
20
+ * The injected fetch-like transport — the adapter's portability seam.
21
+ *
22
+ * Testkit source is deliberately free of host globals (no fetch, no DOM, no
23
+ * Node), so the embedder supplies the platform transport: a Node test injects
24
+ * a `node:http`-backed implementation, a browser host would inject the
25
+ * platform fetch, and either stays outside this package. The function must
26
+ * resolve with the terminal HTTP response (any status) and reject only for
27
+ * transport-level failures: network refusal, connection loss, or an abort
28
+ * raised by the injected timeout signal.
29
+ */
30
+ export type HttpFetchLike = (url: string, init: HttpRequestInit) => Promise<HttpResponseLike>;
31
+ /**
32
+ * An abort signal handle minted per request by the injected timeout factory.
33
+ * `signal` is passed through to the transport untouched; `release` (when
34
+ * present) is invoked once the request settles so timer-backed factories can
35
+ * clean up.
36
+ */
37
+ export interface HttpTimeoutHandle {
38
+ release?(): void;
39
+ signal: unknown;
40
+ }
41
+ export interface HttpHostAdapterOptions {
42
+ /**
43
+ * Second half of the portability seam: mints the per-request timeout
44
+ * signal. When omitted, requests carry no deadline. A rejection whose
45
+ * reason is named `AbortError` or `TimeoutError` is mapped to the canonical
46
+ * deadline failure.
47
+ */
48
+ createTimeoutSignal?: (timeoutMilliseconds: number) => HttpTimeoutHandle;
49
+ fetchImplementation: HttpFetchLike;
50
+ /** Transport deadline handed to `createTimeoutSignal`. Defaults to 10 000. */
51
+ timeoutMilliseconds?: number;
52
+ }
53
+ /**
54
+ * A `HostAdapter` that speaks JSON over an injected fetch-like transport to a
55
+ * host server: every port operation becomes
56
+ * `POST {baseUrl}/ports/{port}/{operation}` with a
57
+ * `{ arguments, context }` JSON body.
58
+ *
59
+ * Success responses (2xx) must carry a `HostPortResult` JSON body. Failure
60
+ * responses that carry a guard-conforming `HostPortError` body are re-thrown
61
+ * as that canonical error, so a host-authored category (with its safe
62
+ * revision on conflicts) crosses the transport intact. Everything else is
63
+ * mapped onto the canonical host error categories without disclosing
64
+ * transport details: network refusal and deadline expiry become
65
+ * `unavailable`, HTTP statuses map by class (401 `unauthenticated`, 403
66
+ * `forbidden`, 404 `not-found`, 409 `conflict`, 413 `limit-exceeded`, 422
67
+ * `validation-failed`, 429 `rate-limited`, 5xx `internal`/`unavailable`), and
68
+ * a malformed body — unparseable JSON, a result without `value`, or an error
69
+ * document the guard rejects — becomes `internal`. Every rejection is a
70
+ * `TestbedHostError` whose `error` satisfies `isHostPortError`, and no
71
+ * message ever echoes response bodies, addresses, or underlying reasons.
72
+ */
73
+ export declare function createHttpHostAdapter(baseUrl: string, options: HttpHostAdapterOptions): HostAdapter;
74
+ //# sourceMappingURL=http-host-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-host-adapter.d.ts","sourceRoot":"","sources":["../src/http-host-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAkBjB,MAAM,wBAAwB,CAAC;AAGhC;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE9F;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,CAAC,mBAAmB,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACzE,mBAAmB,EAAE,aAAa,CAAC;IACnC,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,GAC9B,WAAW,CAmKb"}
@@ -0,0 +1,241 @@
1
+ import { isHostPortError, STUDIO_CONTRACT_VERSION, } from '@kumwe/studio-protocol';
2
+ import { TestbedHostError } from './host-testbed.js';
3
+ /**
4
+ * A `HostAdapter` that speaks JSON over an injected fetch-like transport to a
5
+ * host server: every port operation becomes
6
+ * `POST {baseUrl}/ports/{port}/{operation}` with a
7
+ * `{ arguments, context }` JSON body.
8
+ *
9
+ * Success responses (2xx) must carry a `HostPortResult` JSON body. Failure
10
+ * responses that carry a guard-conforming `HostPortError` body are re-thrown
11
+ * as that canonical error, so a host-authored category (with its safe
12
+ * revision on conflicts) crosses the transport intact. Everything else is
13
+ * mapped onto the canonical host error categories without disclosing
14
+ * transport details: network refusal and deadline expiry become
15
+ * `unavailable`, HTTP statuses map by class (401 `unauthenticated`, 403
16
+ * `forbidden`, 404 `not-found`, 409 `conflict`, 413 `limit-exceeded`, 422
17
+ * `validation-failed`, 429 `rate-limited`, 5xx `internal`/`unavailable`), and
18
+ * a malformed body — unparseable JSON, a result without `value`, or an error
19
+ * document the guard rejects — becomes `internal`. Every rejection is a
20
+ * `TestbedHostError` whose `error` satisfies `isHostPortError`, and no
21
+ * message ever echoes response bodies, addresses, or underlying reasons.
22
+ */
23
+ export function createHttpHostAdapter(baseUrl, options) {
24
+ const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
25
+ const timeoutMilliseconds = options.timeoutMilliseconds ?? 10_000;
26
+ let correlationSerial = 0;
27
+ function createError(failure) {
28
+ correlationSerial += 1;
29
+ const error = {
30
+ category: failure.category,
31
+ contractVersion: STUDIO_CONTRACT_VERSION,
32
+ correlationId: `http-transport-${correlationSerial}`,
33
+ kind: 'host-error',
34
+ message: { defaultMessage: failure.defaultMessage, key: failure.key },
35
+ retryable: failure.retryable,
36
+ };
37
+ return new TestbedHostError(error);
38
+ }
39
+ async function call(portName, operation, callArguments, context) {
40
+ const handle = options.createTimeoutSignal?.(timeoutMilliseconds);
41
+ let response;
42
+ try {
43
+ response = await options.fetchImplementation(`${base}/ports/${portName}/${operation}`, {
44
+ body: JSON.stringify({ arguments: callArguments, context }),
45
+ headers: { 'content-type': 'application/json' },
46
+ method: 'POST',
47
+ ...(handle === undefined ? {} : { signal: handle.signal }),
48
+ });
49
+ }
50
+ catch (reason) {
51
+ throw createError(classifyTransportFailure(reason));
52
+ }
53
+ finally {
54
+ handle?.release?.();
55
+ }
56
+ let bodyText;
57
+ try {
58
+ bodyText = await response.text();
59
+ }
60
+ catch {
61
+ throw createError(malformedResponse());
62
+ }
63
+ if (response.status >= 200 && response.status < 300) {
64
+ const parsed = parseJson(bodyText);
65
+ if (!isHostPortResult(parsed)) {
66
+ throw createError(malformedResponse());
67
+ }
68
+ const result = {
69
+ ...(parsed.revision === undefined ? {} : { revision: parsed.revision }),
70
+ value: parsed.value,
71
+ };
72
+ return result;
73
+ }
74
+ const parsed = parseJson(bodyText);
75
+ if (isHostPortError(parsed)) {
76
+ // The host authored a canonical error; transport it verbatim.
77
+ throw new TestbedHostError(parsed);
78
+ }
79
+ throw createError(statusFailure(response.status));
80
+ }
81
+ return {
82
+ artifact: {
83
+ dependencies(reference, context) {
84
+ return call('artifact', 'dependencies', { reference: asJson(reference) }, context);
85
+ },
86
+ load(reference, context) {
87
+ return call('artifact', 'load', { reference: asJson(reference) }, context);
88
+ },
89
+ publish(reference, context) {
90
+ return call('artifact', 'publish', { reference: asJson(reference) }, context);
91
+ },
92
+ save(document, context) {
93
+ return call('artifact', 'save', { document: asJson(document) }, context);
94
+ },
95
+ unpublish(reference, context) {
96
+ return call('artifact', 'unpublish', { reference: asJson(reference) }, context);
97
+ },
98
+ },
99
+ localization: {
100
+ messages(locale, namespaces, context) {
101
+ return call('localization', 'messages', { locale, namespaces }, context);
102
+ },
103
+ },
104
+ media: {
105
+ get(assetId, context) {
106
+ return call('media', 'get', { assetId }, context);
107
+ },
108
+ list(query, context) {
109
+ return call('media', 'list', { query: asJson(query) }, context);
110
+ },
111
+ },
112
+ permission: {
113
+ explain(operation, context) {
114
+ return call('permission', 'explain', { operation }, context);
115
+ },
116
+ refresh(context) {
117
+ return call('permission', 'refresh', {}, context);
118
+ },
119
+ },
120
+ preview: {
121
+ cancel(draftDigest, context) {
122
+ return call('preview', 'cancel', { draftDigest }, context);
123
+ },
124
+ render(payload, context) {
125
+ return call('preview', 'render', { payload: asJson(payload) }, context);
126
+ },
127
+ },
128
+ recovery: {
129
+ discard(context) {
130
+ return call('recovery', 'discard', {}, context);
131
+ },
132
+ load(context) {
133
+ return call('recovery', 'load', {}, context);
134
+ },
135
+ store(envelope, context) {
136
+ return call('recovery', 'store', { envelope }, context);
137
+ },
138
+ },
139
+ resource: {
140
+ search(query, context) {
141
+ return call('resource', 'search', { query: asJson(query) }, context);
142
+ },
143
+ },
144
+ telemetry: {
145
+ emit(event, context) {
146
+ return call('telemetry', 'emit', { event: asJson(event) }, context);
147
+ },
148
+ },
149
+ };
150
+ }
151
+ /** Serializable typed values cross the wire as their JSON projections. */
152
+ function asJson(value) {
153
+ return JSON.parse(JSON.stringify(value));
154
+ }
155
+ function parseJson(text) {
156
+ try {
157
+ return JSON.parse(text);
158
+ }
159
+ catch {
160
+ return undefined;
161
+ }
162
+ }
163
+ function isHostPortResult(value) {
164
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
165
+ return false;
166
+ }
167
+ const record = value;
168
+ if (!Object.hasOwn(record, 'value')) {
169
+ return false;
170
+ }
171
+ const revision = record.revision;
172
+ if (revision !== undefined && (typeof revision !== 'string' || revision.length === 0)) {
173
+ return false;
174
+ }
175
+ return Object.keys(record).every((key) => key === 'value' || key === 'revision');
176
+ }
177
+ function classifyTransportFailure(reason) {
178
+ const name = typeof reason === 'object' && reason !== null && 'name' in reason ? reason.name : undefined;
179
+ if (name === 'AbortError' || name === 'TimeoutError') {
180
+ // The injected deadline signal fired before the host answered.
181
+ return {
182
+ category: 'unavailable',
183
+ defaultMessage: 'The host did not respond within the transport deadline.',
184
+ key: 'studio.testkit/http-timeout',
185
+ retryable: true,
186
+ };
187
+ }
188
+ return {
189
+ category: 'unavailable',
190
+ defaultMessage: 'The host could not be reached.',
191
+ key: 'studio.testkit/http-unreachable',
192
+ retryable: true,
193
+ };
194
+ }
195
+ function malformedResponse() {
196
+ return {
197
+ category: 'internal',
198
+ defaultMessage: 'The host response could not be interpreted.',
199
+ key: 'studio.testkit/http-malformed-response',
200
+ retryable: false,
201
+ };
202
+ }
203
+ function statusFailure(status) {
204
+ const category = categoryForStatus(status);
205
+ return {
206
+ category,
207
+ defaultMessage: 'The host rejected the request.',
208
+ key: `studio.testkit/http-status-${category}`,
209
+ retryable: category === 'rate-limited' || category === 'unavailable',
210
+ };
211
+ }
212
+ function categoryForStatus(status) {
213
+ switch (status) {
214
+ case 401:
215
+ return 'unauthenticated';
216
+ case 403:
217
+ return 'forbidden';
218
+ case 404:
219
+ return 'not-found';
220
+ case 408:
221
+ return 'unavailable';
222
+ case 409:
223
+ return 'conflict';
224
+ case 413:
225
+ return 'limit-exceeded';
226
+ case 422:
227
+ return 'validation-failed';
228
+ case 429:
229
+ return 'rate-limited';
230
+ case 502:
231
+ case 503:
232
+ case 504:
233
+ return 'unavailable';
234
+ default:
235
+ if (status >= 400 && status < 500) {
236
+ return 'invalid-request';
237
+ }
238
+ return 'internal';
239
+ }
240
+ }
241
+ //# sourceMappingURL=http-host-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-host-adapter.js","sourceRoot":"","sources":["../src/http-host-adapter.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { type BlockDefinition, type BlockSlotDefinition, type BlockType, type BlueprintDocument, type BlueprintBlockLock, type BlueprintNode, type JsonSchema, type StudioConfiguration, type StudioDiagnostic } from '@kumwe/studio-protocol';
2
2
  export { createHostRequestContextFixture, createTestbedHost, TestbedHostError, type HostRequestContextFixtureOptions, type TestbedControls, type TestbedHost, type TestbedHostOptions, type TestbedPortName, } from './host-testbed.js';
3
+ export { createHttpHostAdapter, type HttpFetchLike, type HttpHostAdapterOptions, type HttpRequestInit, type HttpResponseLike, type HttpTimeoutHandle, } from './http-host-adapter.js';
3
4
  export interface BlueprintFixtureOptions {
4
5
  blockLocks?: BlueprintBlockLock[];
5
6
  id?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,+BAA+B,EAC/B,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,gCAAgC,EACrC,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAChC,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IACzC,YAAY,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;CACzC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,iBAAiB,CAiB/F;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CA2B1E;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,mBAAmB,CAqErB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,SAAS,eAAe,EAAE,GACtC,IAAI,CAKN;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,WAAW,EAAE,gBAAgB,EAAE,CAAC;gBAE7B,WAAW,EAAE,gBAAgB,EAAE;CASnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,+BAA+B,EAC/B,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,gCAAgC,EACrC,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAChC,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IACzC,YAAY,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;CACzC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,iBAAiB,CAiB/F;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CA2B1E;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,mBAAmB,CAqErB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,SAAS,eAAe,EAAE,GACtC,IAAI,CAKN;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,WAAW,EAAE,gBAAgB,EAAE,CAAC;gBAE7B,WAAW,EAAE,gBAAgB,EAAE;CASnD"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { BlockRegistry, validateBlueprint } from '@kumwe/studio-core';
2
2
  import { STUDIO_CONTRACT_VERSION, STUDIO_WIRE_PROTOCOL_VERSION, } from '@kumwe/studio-protocol';
3
3
  export { createHostRequestContextFixture, createTestbedHost, TestbedHostError, } from './host-testbed.js';
4
+ export { createHttpHostAdapter, } from './http-host-adapter.js';
4
5
  export function createBlueprintFixture(options = {}) {
5
6
  return {
6
7
  contractVersion: STUDIO_CONTRACT_VERSION,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,4BAA4B,GAU7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,+BAA+B,EAC/B,iBAAiB,EACjB,gBAAgB,GAMjB,MAAM,mBAAmB,CAAC;AAuB3B,MAAM,UAAU,sBAAsB,CAAC,UAAmC,EAAE;IAC1E,OAAO;QACL,eAAe,EAAE,uBAAuB;QACxC,cAAc,EAAE;YACd,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;YAC5C,KAAK,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE;SAC3E;QACD,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,gBAAgB;QAClC,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,EAAE,uBAAuB,EAAE;QACzE,KAAK,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE;QAC1E,KAAK,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,OAAO,EAAE,eAAe,EAAE;QAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,cAAc;QAC5C,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;IAC5C,OAAO;QACL,aAAa,EAAE;YACb,cAAc,EAAE,gBAAgB;YAChC,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,EAAE,cAAc,EAAE,uBAAuB,EAAE,GAAG,EAAE,4BAA4B,EAAE;YACxF,YAAY,EAAE,CAAC,yBAAyB,CAAC;YACzC,aAAa,EAAE,gBAAgB;SAChC;QACD,QAAQ,EAAE,sBAAsB;QAChC,eAAe,EAAE,uBAAuB;QACxC,YAAY,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;QACtC,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,yBAAyB,EAAE;QAChE,KAAK,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,OAAO,EAAE,eAAe,EAAE;QAC9D,KAAK,EAAE,EAAE;QACT,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACxE,oBAAoB,EAAE;YACpB,EAAE,UAAU,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE;SAC/E;QACD,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,aAAa,EAAE,EAAE;QACjB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,UAA6C,EAAE;IAE/C,OAAO;QACL,KAAK,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE,EAAE,mBAAmB,EAAE;QAC9D,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,QAAQ;QACxC,eAAe,EAAE,uBAAuB;QACxC,kBAAkB,EAAE;YAClB,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,KAAK;YAChB,iBAAiB,EAAE,QAAQ;YAC3B,eAAe,EAAE,MAAM;SACxB;QACD,QAAQ,EAAE;YACR,oBAAoB,EAAE,KAAK;YAC3B,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,KAAK;YACvB,iBAAiB,EAAE,KAAK;YACxB,mBAAmB,EAAE,KAAK;YAC1B,eAAe,EAAE,KAAK;SACvB;QACD,gBAAgB,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,uBAAuB;YACxC,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE;YACzE,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,EAAE;YACT,gBAAgB,EAAE,CAAC,4BAA4B,CAAC;SACjD;QACD,MAAM,EAAE;YACN,kBAAkB,EAAE,KAAK;YACzB,eAAe,EAAE,GAAG;YACpB,yBAAyB,EAAE,GAAG;YAC9B,QAAQ,EAAE,EAAE;YACZ,iBAAiB,EAAE,SAAS;YAC5B,iBAAiB,EAAE,GAAG;YACtB,cAAc,EAAE,SAAS;YACzB,aAAa,EAAE,EAAE;YACjB,mBAAmB,EAAE,aAAa;YAClC,QAAQ,EAAE,KAAK;YACf,cAAc,EAAE,EAAE;YAClB,eAAe,EAAE,UAAU;YAC3B,2BAA2B,EAAE,GAAG;YAChC,gBAAgB,EAAE,SAAS;YAC3B,gBAAgB,EAAE,SAAS;YAC3B,gBAAgB,EAAE,EAAE;YACpB,eAAe,EAAE,EAAE;SACpB;QACD,MAAM,EAAE;YACN,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,KAAK;SAChB;QACD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW;QACjC,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,4BAA4B;QAC7C,OAAO,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE;QACtF,iBAAiB,EAAE,YAAY;QAC/B,SAAS,EAAE,cAAc;QACzB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,UAAU;QAChD,eAAe,EAAE;YACf,GAAG,EAAE,eAAe;YACpB,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,qBAAqB;SAC/B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAA4B,EAC5B,WAAuC;IAEvC,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/B,WAAW,CAAqB;IAEhD,YAAmB,WAA+B;QAChD,KAAK,CACH,WAAW;aACR,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;aACrF,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "schema": "command.schema.json",
3
+ "description": "A size role must be a bounded lower-case identifier, never free text or CSS.",
4
+ "value": {
5
+ "artifactId": "vector.blueprint",
6
+ "baseStateVersion": 0,
7
+ "contractVersion": "0.1-draft",
8
+ "id": "vector.command.malformed-size-role",
9
+ "kind": "command",
10
+ "payload": {
11
+ "axis": "inline",
12
+ "nodeId": "text-a",
13
+ "role": "calc(50% - 1rem)"
14
+ },
15
+ "sessionGeneration": "session-r1",
16
+ "type": "studio.command/set-size-role"
17
+ }
18
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kumwe/studio-testkit",
3
- "version": "0.1.0-alpha.3",
3
+ "version": "0.1.0-alpha.5",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/kumwe/studio.git",
@@ -34,8 +34,8 @@
34
34
  "build": "tsc -b"
35
35
  },
36
36
  "dependencies": {
37
- "@kumwe/studio-core": "0.1.0-alpha.3",
38
- "@kumwe/studio-protocol": "0.1.0-alpha.2"
37
+ "@kumwe/studio-core": "0.1.0-alpha.5",
38
+ "@kumwe/studio-protocol": "0.1.0-alpha.3"
39
39
  },
40
40
  "publishConfig": {
41
41
  "access": "public",
@@ -0,0 +1,180 @@
1
+ {
2
+ "contractVersion": "0.1-draft",
3
+ "kind": "command-vector",
4
+ "id": "vector.command-vector.batch.size-roles",
5
+ "description": "Size-role commands participate in atomic batches: one batch assigns the base role and a responsive override, and the inverse batch unsets them in reverse order.",
6
+ "initial": {
7
+ "contractVersion": "0.1-draft",
8
+ "dependencyLock": {
9
+ "blocks": [
10
+ {
11
+ "revision": "block-r1",
12
+ "type": "studio.vector/section",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "revision": "block-r1",
17
+ "type": "studio.vector/text",
18
+ "version": "1.0.0"
19
+ }
20
+ ],
21
+ "theme": {
22
+ "id": "studio.vector/theme",
23
+ "revision": "theme-r1",
24
+ "version": "1.0.0"
25
+ }
26
+ },
27
+ "id": "vector.blueprint",
28
+ "kind": "blueprint",
29
+ "label": {
30
+ "defaultMessage": "Vector Blueprint",
31
+ "key": "studio.vector/blueprint"
32
+ },
33
+ "model": {
34
+ "id": "studio.vector/model",
35
+ "revision": "model-r1",
36
+ "version": "1.0.0"
37
+ },
38
+ "owner": {
39
+ "id": "studio.vector/suite",
40
+ "version": "0.1.0-alpha.0"
41
+ },
42
+ "revision": "blueprint-r1",
43
+ "roots": [
44
+ {
45
+ "authoring": {
46
+ "mode": "designer"
47
+ },
48
+ "bindings": {},
49
+ "id": "text-a",
50
+ "properties": {},
51
+ "slots": {},
52
+ "type": "studio.vector/text",
53
+ "version": "1.0.0"
54
+ }
55
+ ],
56
+ "status": "draft",
57
+ "version": "1.0.0"
58
+ },
59
+ "command": {
60
+ "artifactId": "vector.blueprint",
61
+ "baseStateVersion": 0,
62
+ "contractVersion": "0.1-draft",
63
+ "id": "vector.command.batch.size-roles",
64
+ "kind": "command",
65
+ "payload": {
66
+ "operations": [
67
+ {
68
+ "payload": {
69
+ "axis": "inline",
70
+ "nodeId": "text-a",
71
+ "role": "full"
72
+ },
73
+ "type": "studio.command/set-size-role"
74
+ },
75
+ {
76
+ "payload": {
77
+ "axis": "inline",
78
+ "nodeId": "text-a",
79
+ "role": "half",
80
+ "viewport": "wide"
81
+ },
82
+ "type": "studio.command/set-size-role"
83
+ }
84
+ ]
85
+ },
86
+ "sessionGeneration": "session-r1",
87
+ "type": "studio.command/batch"
88
+ },
89
+ "expect": {
90
+ "document": {
91
+ "contractVersion": "0.1-draft",
92
+ "dependencyLock": {
93
+ "blocks": [
94
+ {
95
+ "revision": "block-r1",
96
+ "type": "studio.vector/section",
97
+ "version": "1.0.0"
98
+ },
99
+ {
100
+ "revision": "block-r1",
101
+ "type": "studio.vector/text",
102
+ "version": "1.0.0"
103
+ }
104
+ ],
105
+ "theme": {
106
+ "id": "studio.vector/theme",
107
+ "revision": "theme-r1",
108
+ "version": "1.0.0"
109
+ }
110
+ },
111
+ "id": "vector.blueprint",
112
+ "kind": "blueprint",
113
+ "label": {
114
+ "defaultMessage": "Vector Blueprint",
115
+ "key": "studio.vector/blueprint"
116
+ },
117
+ "model": {
118
+ "id": "studio.vector/model",
119
+ "revision": "model-r1",
120
+ "version": "1.0.0"
121
+ },
122
+ "owner": {
123
+ "id": "studio.vector/suite",
124
+ "version": "0.1.0-alpha.0"
125
+ },
126
+ "revision": "blueprint-r1",
127
+ "roots": [
128
+ {
129
+ "authoring": {
130
+ "mode": "designer"
131
+ },
132
+ "bindings": {},
133
+ "id": "text-a",
134
+ "properties": {},
135
+ "slots": {},
136
+ "type": "studio.vector/text",
137
+ "version": "1.0.0",
138
+ "responsiveSizeRoles": {
139
+ "inline": {
140
+ "wide": "half"
141
+ }
142
+ },
143
+ "sizeRoles": {
144
+ "inline": "full"
145
+ }
146
+ }
147
+ ],
148
+ "status": "draft",
149
+ "version": "1.0.0"
150
+ }
151
+ },
152
+ "inverse": {
153
+ "artifactId": "vector.blueprint",
154
+ "baseStateVersion": 1,
155
+ "contractVersion": "0.1-draft",
156
+ "id": "vector.inverse.batch.size-roles",
157
+ "kind": "command",
158
+ "payload": {
159
+ "operations": [
160
+ {
161
+ "payload": {
162
+ "axis": "inline",
163
+ "nodeId": "text-a",
164
+ "viewport": "wide"
165
+ },
166
+ "type": "studio.command/unset-size-role"
167
+ },
168
+ {
169
+ "payload": {
170
+ "axis": "inline",
171
+ "nodeId": "text-a"
172
+ },
173
+ "type": "studio.command/unset-size-role"
174
+ }
175
+ ]
176
+ },
177
+ "sessionGeneration": "session-r1",
178
+ "type": "studio.command/batch"
179
+ }
180
+ }
@@ -0,0 +1,144 @@
1
+ {
2
+ "contractVersion": "0.1-draft",
3
+ "kind": "command-vector",
4
+ "id": "vector.command-vector.set-size-role.base",
5
+ "description": "Assigning a base size role materialises the sizeRoles record for that axis; the inverse unset drops the emptied record again.",
6
+ "initial": {
7
+ "contractVersion": "0.1-draft",
8
+ "dependencyLock": {
9
+ "blocks": [
10
+ {
11
+ "revision": "block-r1",
12
+ "type": "studio.vector/section",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "revision": "block-r1",
17
+ "type": "studio.vector/text",
18
+ "version": "1.0.0"
19
+ }
20
+ ],
21
+ "theme": {
22
+ "id": "studio.vector/theme",
23
+ "revision": "theme-r1",
24
+ "version": "1.0.0"
25
+ }
26
+ },
27
+ "id": "vector.blueprint",
28
+ "kind": "blueprint",
29
+ "label": {
30
+ "defaultMessage": "Vector Blueprint",
31
+ "key": "studio.vector/blueprint"
32
+ },
33
+ "model": {
34
+ "id": "studio.vector/model",
35
+ "revision": "model-r1",
36
+ "version": "1.0.0"
37
+ },
38
+ "owner": {
39
+ "id": "studio.vector/suite",
40
+ "version": "0.1.0-alpha.0"
41
+ },
42
+ "revision": "blueprint-r1",
43
+ "roots": [
44
+ {
45
+ "authoring": {
46
+ "mode": "designer"
47
+ },
48
+ "bindings": {},
49
+ "id": "text-a",
50
+ "properties": {},
51
+ "slots": {},
52
+ "type": "studio.vector/text",
53
+ "version": "1.0.0"
54
+ }
55
+ ],
56
+ "status": "draft",
57
+ "version": "1.0.0"
58
+ },
59
+ "command": {
60
+ "artifactId": "vector.blueprint",
61
+ "baseStateVersion": 0,
62
+ "contractVersion": "0.1-draft",
63
+ "id": "vector.command.set-size-role.base",
64
+ "kind": "command",
65
+ "payload": {
66
+ "axis": "inline",
67
+ "nodeId": "text-a",
68
+ "role": "half"
69
+ },
70
+ "sessionGeneration": "session-r1",
71
+ "type": "studio.command/set-size-role"
72
+ },
73
+ "expect": {
74
+ "document": {
75
+ "contractVersion": "0.1-draft",
76
+ "dependencyLock": {
77
+ "blocks": [
78
+ {
79
+ "revision": "block-r1",
80
+ "type": "studio.vector/section",
81
+ "version": "1.0.0"
82
+ },
83
+ {
84
+ "revision": "block-r1",
85
+ "type": "studio.vector/text",
86
+ "version": "1.0.0"
87
+ }
88
+ ],
89
+ "theme": {
90
+ "id": "studio.vector/theme",
91
+ "revision": "theme-r1",
92
+ "version": "1.0.0"
93
+ }
94
+ },
95
+ "id": "vector.blueprint",
96
+ "kind": "blueprint",
97
+ "label": {
98
+ "defaultMessage": "Vector Blueprint",
99
+ "key": "studio.vector/blueprint"
100
+ },
101
+ "model": {
102
+ "id": "studio.vector/model",
103
+ "revision": "model-r1",
104
+ "version": "1.0.0"
105
+ },
106
+ "owner": {
107
+ "id": "studio.vector/suite",
108
+ "version": "0.1.0-alpha.0"
109
+ },
110
+ "revision": "blueprint-r1",
111
+ "roots": [
112
+ {
113
+ "authoring": {
114
+ "mode": "designer"
115
+ },
116
+ "bindings": {},
117
+ "id": "text-a",
118
+ "properties": {},
119
+ "slots": {},
120
+ "type": "studio.vector/text",
121
+ "version": "1.0.0",
122
+ "sizeRoles": {
123
+ "inline": "half"
124
+ }
125
+ }
126
+ ],
127
+ "status": "draft",
128
+ "version": "1.0.0"
129
+ }
130
+ },
131
+ "inverse": {
132
+ "artifactId": "vector.blueprint",
133
+ "baseStateVersion": 1,
134
+ "contractVersion": "0.1-draft",
135
+ "id": "vector.inverse.set-size-role.base",
136
+ "kind": "command",
137
+ "payload": {
138
+ "axis": "inline",
139
+ "nodeId": "text-a"
140
+ },
141
+ "sessionGeneration": "session-r1",
142
+ "type": "studio.command/unset-size-role"
143
+ }
144
+ }
@@ -0,0 +1,148 @@
1
+ {
2
+ "contractVersion": "0.1-draft",
3
+ "kind": "command-vector",
4
+ "id": "vector.command-vector.set-size-role.duplicate",
5
+ "description": "Re-assigning the role an axis already carries leaves the document unchanged and still inverts to a set of the previous role, so the round trip is byte-identical.",
6
+ "initial": {
7
+ "contractVersion": "0.1-draft",
8
+ "dependencyLock": {
9
+ "blocks": [
10
+ {
11
+ "revision": "block-r1",
12
+ "type": "studio.vector/section",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "revision": "block-r1",
17
+ "type": "studio.vector/text",
18
+ "version": "1.0.0"
19
+ }
20
+ ],
21
+ "theme": {
22
+ "id": "studio.vector/theme",
23
+ "revision": "theme-r1",
24
+ "version": "1.0.0"
25
+ }
26
+ },
27
+ "id": "vector.blueprint",
28
+ "kind": "blueprint",
29
+ "label": {
30
+ "defaultMessage": "Vector Blueprint",
31
+ "key": "studio.vector/blueprint"
32
+ },
33
+ "model": {
34
+ "id": "studio.vector/model",
35
+ "revision": "model-r1",
36
+ "version": "1.0.0"
37
+ },
38
+ "owner": {
39
+ "id": "studio.vector/suite",
40
+ "version": "0.1.0-alpha.0"
41
+ },
42
+ "revision": "blueprint-r1",
43
+ "roots": [
44
+ {
45
+ "authoring": {
46
+ "mode": "designer"
47
+ },
48
+ "bindings": {},
49
+ "id": "text-a",
50
+ "properties": {},
51
+ "slots": {},
52
+ "type": "studio.vector/text",
53
+ "version": "1.0.0",
54
+ "sizeRoles": {
55
+ "inline": "half"
56
+ }
57
+ }
58
+ ],
59
+ "status": "draft",
60
+ "version": "1.0.0"
61
+ },
62
+ "command": {
63
+ "artifactId": "vector.blueprint",
64
+ "baseStateVersion": 0,
65
+ "contractVersion": "0.1-draft",
66
+ "id": "vector.command.set-size-role.duplicate",
67
+ "kind": "command",
68
+ "payload": {
69
+ "axis": "inline",
70
+ "nodeId": "text-a",
71
+ "role": "half"
72
+ },
73
+ "sessionGeneration": "session-r1",
74
+ "type": "studio.command/set-size-role"
75
+ },
76
+ "expect": {
77
+ "document": {
78
+ "contractVersion": "0.1-draft",
79
+ "dependencyLock": {
80
+ "blocks": [
81
+ {
82
+ "revision": "block-r1",
83
+ "type": "studio.vector/section",
84
+ "version": "1.0.0"
85
+ },
86
+ {
87
+ "revision": "block-r1",
88
+ "type": "studio.vector/text",
89
+ "version": "1.0.0"
90
+ }
91
+ ],
92
+ "theme": {
93
+ "id": "studio.vector/theme",
94
+ "revision": "theme-r1",
95
+ "version": "1.0.0"
96
+ }
97
+ },
98
+ "id": "vector.blueprint",
99
+ "kind": "blueprint",
100
+ "label": {
101
+ "defaultMessage": "Vector Blueprint",
102
+ "key": "studio.vector/blueprint"
103
+ },
104
+ "model": {
105
+ "id": "studio.vector/model",
106
+ "revision": "model-r1",
107
+ "version": "1.0.0"
108
+ },
109
+ "owner": {
110
+ "id": "studio.vector/suite",
111
+ "version": "0.1.0-alpha.0"
112
+ },
113
+ "revision": "blueprint-r1",
114
+ "roots": [
115
+ {
116
+ "authoring": {
117
+ "mode": "designer"
118
+ },
119
+ "bindings": {},
120
+ "id": "text-a",
121
+ "properties": {},
122
+ "slots": {},
123
+ "type": "studio.vector/text",
124
+ "version": "1.0.0",
125
+ "sizeRoles": {
126
+ "inline": "half"
127
+ }
128
+ }
129
+ ],
130
+ "status": "draft",
131
+ "version": "1.0.0"
132
+ }
133
+ },
134
+ "inverse": {
135
+ "artifactId": "vector.blueprint",
136
+ "baseStateVersion": 1,
137
+ "contractVersion": "0.1-draft",
138
+ "id": "vector.inverse.set-size-role.duplicate",
139
+ "kind": "command",
140
+ "payload": {
141
+ "axis": "inline",
142
+ "nodeId": "text-a",
143
+ "role": "half"
144
+ },
145
+ "sessionGeneration": "session-r1",
146
+ "type": "studio.command/set-size-role"
147
+ }
148
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "contractVersion": "0.1-draft",
3
+ "kind": "command-vector",
4
+ "id": "vector.command-vector.set-size-role.viewport-add",
5
+ "description": "Assigning a responsive size-role override materialises the responsiveSizeRoles map for that axis and viewport while the base role stays untouched; the inverse unset removes the empty containers again.",
6
+ "initial": {
7
+ "contractVersion": "0.1-draft",
8
+ "dependencyLock": {
9
+ "blocks": [
10
+ {
11
+ "revision": "block-r1",
12
+ "type": "studio.vector/section",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "revision": "block-r1",
17
+ "type": "studio.vector/text",
18
+ "version": "1.0.0"
19
+ }
20
+ ],
21
+ "theme": {
22
+ "id": "studio.vector/theme",
23
+ "revision": "theme-r1",
24
+ "version": "1.0.0"
25
+ }
26
+ },
27
+ "id": "vector.blueprint",
28
+ "kind": "blueprint",
29
+ "label": {
30
+ "defaultMessage": "Vector Blueprint",
31
+ "key": "studio.vector/blueprint"
32
+ },
33
+ "model": {
34
+ "id": "studio.vector/model",
35
+ "revision": "model-r1",
36
+ "version": "1.0.0"
37
+ },
38
+ "owner": {
39
+ "id": "studio.vector/suite",
40
+ "version": "0.1.0-alpha.0"
41
+ },
42
+ "revision": "blueprint-r1",
43
+ "roots": [
44
+ {
45
+ "authoring": {
46
+ "mode": "designer"
47
+ },
48
+ "bindings": {},
49
+ "id": "text-a",
50
+ "properties": {},
51
+ "slots": {},
52
+ "type": "studio.vector/text",
53
+ "version": "1.0.0",
54
+ "sizeRoles": {
55
+ "inline": "full"
56
+ }
57
+ }
58
+ ],
59
+ "status": "draft",
60
+ "version": "1.0.0"
61
+ },
62
+ "command": {
63
+ "artifactId": "vector.blueprint",
64
+ "baseStateVersion": 0,
65
+ "contractVersion": "0.1-draft",
66
+ "id": "vector.command.set-size-role.viewport-add",
67
+ "kind": "command",
68
+ "payload": {
69
+ "axis": "inline",
70
+ "nodeId": "text-a",
71
+ "role": "half",
72
+ "viewport": "wide"
73
+ },
74
+ "sessionGeneration": "session-r1",
75
+ "type": "studio.command/set-size-role"
76
+ },
77
+ "expect": {
78
+ "document": {
79
+ "contractVersion": "0.1-draft",
80
+ "dependencyLock": {
81
+ "blocks": [
82
+ {
83
+ "revision": "block-r1",
84
+ "type": "studio.vector/section",
85
+ "version": "1.0.0"
86
+ },
87
+ {
88
+ "revision": "block-r1",
89
+ "type": "studio.vector/text",
90
+ "version": "1.0.0"
91
+ }
92
+ ],
93
+ "theme": {
94
+ "id": "studio.vector/theme",
95
+ "revision": "theme-r1",
96
+ "version": "1.0.0"
97
+ }
98
+ },
99
+ "id": "vector.blueprint",
100
+ "kind": "blueprint",
101
+ "label": {
102
+ "defaultMessage": "Vector Blueprint",
103
+ "key": "studio.vector/blueprint"
104
+ },
105
+ "model": {
106
+ "id": "studio.vector/model",
107
+ "revision": "model-r1",
108
+ "version": "1.0.0"
109
+ },
110
+ "owner": {
111
+ "id": "studio.vector/suite",
112
+ "version": "0.1.0-alpha.0"
113
+ },
114
+ "revision": "blueprint-r1",
115
+ "roots": [
116
+ {
117
+ "authoring": {
118
+ "mode": "designer"
119
+ },
120
+ "bindings": {},
121
+ "id": "text-a",
122
+ "properties": {},
123
+ "slots": {},
124
+ "type": "studio.vector/text",
125
+ "version": "1.0.0",
126
+ "responsiveSizeRoles": {
127
+ "inline": {
128
+ "wide": "half"
129
+ }
130
+ },
131
+ "sizeRoles": {
132
+ "inline": "full"
133
+ }
134
+ }
135
+ ],
136
+ "status": "draft",
137
+ "version": "1.0.0"
138
+ }
139
+ },
140
+ "inverse": {
141
+ "artifactId": "vector.blueprint",
142
+ "baseStateVersion": 1,
143
+ "contractVersion": "0.1-draft",
144
+ "id": "vector.inverse.set-size-role.viewport-add",
145
+ "kind": "command",
146
+ "payload": {
147
+ "axis": "inline",
148
+ "nodeId": "text-a",
149
+ "viewport": "wide"
150
+ },
151
+ "sessionGeneration": "session-r1",
152
+ "type": "studio.command/unset-size-role"
153
+ }
154
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "contractVersion": "0.1-draft",
3
+ "kind": "command-vector",
4
+ "id": "vector.command-vector.unset-size-role.missing.error",
5
+ "description": "Unsetting an axis that carries no size role fails with property-not-found even when the other axis is assigned.",
6
+ "initial": {
7
+ "contractVersion": "0.1-draft",
8
+ "dependencyLock": {
9
+ "blocks": [
10
+ {
11
+ "revision": "block-r1",
12
+ "type": "studio.vector/section",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "revision": "block-r1",
17
+ "type": "studio.vector/text",
18
+ "version": "1.0.0"
19
+ }
20
+ ],
21
+ "theme": {
22
+ "id": "studio.vector/theme",
23
+ "revision": "theme-r1",
24
+ "version": "1.0.0"
25
+ }
26
+ },
27
+ "id": "vector.blueprint",
28
+ "kind": "blueprint",
29
+ "label": {
30
+ "defaultMessage": "Vector Blueprint",
31
+ "key": "studio.vector/blueprint"
32
+ },
33
+ "model": {
34
+ "id": "studio.vector/model",
35
+ "revision": "model-r1",
36
+ "version": "1.0.0"
37
+ },
38
+ "owner": {
39
+ "id": "studio.vector/suite",
40
+ "version": "0.1.0-alpha.0"
41
+ },
42
+ "revision": "blueprint-r1",
43
+ "roots": [
44
+ {
45
+ "authoring": {
46
+ "mode": "designer"
47
+ },
48
+ "bindings": {},
49
+ "id": "text-a",
50
+ "properties": {},
51
+ "slots": {},
52
+ "type": "studio.vector/text",
53
+ "version": "1.0.0",
54
+ "sizeRoles": {
55
+ "inline": "full"
56
+ }
57
+ }
58
+ ],
59
+ "status": "draft",
60
+ "version": "1.0.0"
61
+ },
62
+ "command": {
63
+ "artifactId": "vector.blueprint",
64
+ "baseStateVersion": 0,
65
+ "contractVersion": "0.1-draft",
66
+ "id": "vector.command.unset-size-role.missing.error",
67
+ "kind": "command",
68
+ "payload": {
69
+ "axis": "block",
70
+ "nodeId": "text-a"
71
+ },
72
+ "sessionGeneration": "session-r1",
73
+ "type": "studio.command/unset-size-role"
74
+ },
75
+ "expect": {
76
+ "errorCode": "property-not-found"
77
+ }
78
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "contractVersion": "0.1-draft",
3
+ "kind": "command-vector",
4
+ "id": "vector.command-vector.unset-size-role.viewport",
5
+ "description": "Unsetting the only responsive size-role override drops the emptied responsiveSizeRoles containers so the viewport inherits the base role again; the inverse restores the override.",
6
+ "initial": {
7
+ "contractVersion": "0.1-draft",
8
+ "dependencyLock": {
9
+ "blocks": [
10
+ {
11
+ "revision": "block-r1",
12
+ "type": "studio.vector/section",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "revision": "block-r1",
17
+ "type": "studio.vector/text",
18
+ "version": "1.0.0"
19
+ }
20
+ ],
21
+ "theme": {
22
+ "id": "studio.vector/theme",
23
+ "revision": "theme-r1",
24
+ "version": "1.0.0"
25
+ }
26
+ },
27
+ "id": "vector.blueprint",
28
+ "kind": "blueprint",
29
+ "label": {
30
+ "defaultMessage": "Vector Blueprint",
31
+ "key": "studio.vector/blueprint"
32
+ },
33
+ "model": {
34
+ "id": "studio.vector/model",
35
+ "revision": "model-r1",
36
+ "version": "1.0.0"
37
+ },
38
+ "owner": {
39
+ "id": "studio.vector/suite",
40
+ "version": "0.1.0-alpha.0"
41
+ },
42
+ "revision": "blueprint-r1",
43
+ "roots": [
44
+ {
45
+ "authoring": {
46
+ "mode": "designer"
47
+ },
48
+ "bindings": {},
49
+ "id": "text-a",
50
+ "properties": {},
51
+ "slots": {},
52
+ "type": "studio.vector/text",
53
+ "version": "1.0.0",
54
+ "responsiveSizeRoles": {
55
+ "inline": {
56
+ "wide": "half"
57
+ }
58
+ },
59
+ "sizeRoles": {
60
+ "inline": "full"
61
+ }
62
+ }
63
+ ],
64
+ "status": "draft",
65
+ "version": "1.0.0"
66
+ },
67
+ "command": {
68
+ "artifactId": "vector.blueprint",
69
+ "baseStateVersion": 0,
70
+ "contractVersion": "0.1-draft",
71
+ "id": "vector.command.unset-size-role.viewport",
72
+ "kind": "command",
73
+ "payload": {
74
+ "axis": "inline",
75
+ "nodeId": "text-a",
76
+ "viewport": "wide"
77
+ },
78
+ "sessionGeneration": "session-r1",
79
+ "type": "studio.command/unset-size-role"
80
+ },
81
+ "expect": {
82
+ "document": {
83
+ "contractVersion": "0.1-draft",
84
+ "dependencyLock": {
85
+ "blocks": [
86
+ {
87
+ "revision": "block-r1",
88
+ "type": "studio.vector/section",
89
+ "version": "1.0.0"
90
+ },
91
+ {
92
+ "revision": "block-r1",
93
+ "type": "studio.vector/text",
94
+ "version": "1.0.0"
95
+ }
96
+ ],
97
+ "theme": {
98
+ "id": "studio.vector/theme",
99
+ "revision": "theme-r1",
100
+ "version": "1.0.0"
101
+ }
102
+ },
103
+ "id": "vector.blueprint",
104
+ "kind": "blueprint",
105
+ "label": {
106
+ "defaultMessage": "Vector Blueprint",
107
+ "key": "studio.vector/blueprint"
108
+ },
109
+ "model": {
110
+ "id": "studio.vector/model",
111
+ "revision": "model-r1",
112
+ "version": "1.0.0"
113
+ },
114
+ "owner": {
115
+ "id": "studio.vector/suite",
116
+ "version": "0.1.0-alpha.0"
117
+ },
118
+ "revision": "blueprint-r1",
119
+ "roots": [
120
+ {
121
+ "authoring": {
122
+ "mode": "designer"
123
+ },
124
+ "bindings": {},
125
+ "id": "text-a",
126
+ "properties": {},
127
+ "slots": {},
128
+ "type": "studio.vector/text",
129
+ "version": "1.0.0",
130
+ "sizeRoles": {
131
+ "inline": "full"
132
+ }
133
+ }
134
+ ],
135
+ "status": "draft",
136
+ "version": "1.0.0"
137
+ }
138
+ },
139
+ "inverse": {
140
+ "artifactId": "vector.blueprint",
141
+ "baseStateVersion": 1,
142
+ "contractVersion": "0.1-draft",
143
+ "id": "vector.inverse.unset-size-role.viewport",
144
+ "kind": "command",
145
+ "payload": {
146
+ "axis": "inline",
147
+ "nodeId": "text-a",
148
+ "role": "half",
149
+ "viewport": "wide"
150
+ },
151
+ "sessionGeneration": "session-r1",
152
+ "type": "studio.command/set-size-role"
153
+ }
154
+ }