@kumwe/studio-testkit 0.1.0-alpha.8 → 0.1.0-beta.3
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 +79 -19
- 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 +190 -2
- 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 +47 -4
- package/dist/host-testbed.d.ts.map +1 -1
- package/dist/host-testbed.js +1 -742
- 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 +49 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -174
- 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-operations.example.json +77 -0
- package/fixtures/plugin.example.json +12 -0
- package/fixtures/reusable-content-type.example.json +26 -0
- 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-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/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/model.get.stored.json +37 -0
- package/vectors/host/model.list.authorized.json +31 -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
package/README.md
CHANGED
|
@@ -1,31 +1,42 @@
|
|
|
1
1
|
# `@kumwe/studio-testkit`
|
|
2
2
|
|
|
3
|
-
Status: pre-Gate-A
|
|
3
|
+
Status: governed beta development, still pre-Gate-A and not production-supported. The exact coordinated
|
|
4
|
+
version is in the workspace `studio-release.json`; these conformance helpers do not by themselves constitute
|
|
5
|
+
gate evidence.
|
|
4
6
|
|
|
5
|
-
The current
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
The current candidate combines fixture builders and `assertBlueprintConforms` with deterministic host and HTTP
|
|
8
|
+
testbeds plus executable command, canonical, host, host-sequence, media, preview, property-schema,
|
|
9
|
+
binding-projection, renderer-web, rich-text, and authoring-web corpus runners. Those helpers let another
|
|
10
|
+
implementation replay the same portable assertions without adopting Studio internals. A green repository
|
|
11
|
+
replay is implementation evidence, not an accepted gate or support claim; every advertised profile still
|
|
12
|
+
needs exact-candidate evidence and independent review.
|
|
10
13
|
|
|
11
14
|
Package subpaths under `@kumwe/studio-testkit/fixtures/<filename>` contain byte-identical copies of the
|
|
12
15
|
canonical valid examples, including separate MediaAsset and persisted MediaReference examples. There
|
|
13
16
|
is no aggregate runtime `fixtures` export. The helpers do not depend on Vitest or another test runner,
|
|
14
17
|
so consumers may call the current assertion from any JavaScript test environment.
|
|
15
18
|
|
|
19
|
+
`fixtures/authoring-message-catalog.en.json` is the byte-identical canonical English shell catalog.
|
|
20
|
+
It lets hosts validate localization imports and parameter declarations without importing the Lit
|
|
21
|
+
runtime. Its schema ships with `@kumwe/studio-protocol`.
|
|
22
|
+
|
|
16
23
|
## Host testbed
|
|
17
24
|
|
|
18
25
|
`createTestbedHost(options)` builds a deterministic, fully in-memory `HostAdapter` reference host
|
|
19
|
-
for conformance and failure testing. Every standard port
|
|
26
|
+
for conformance and failure testing. Every standard port is implemented against
|
|
20
27
|
seeded fixtures (`documents`, `resources`, `mediaAssets`, `messages`, `permissions`, and an
|
|
21
28
|
optional asynchronous preview `render` callback). Each operation first validates connectivity and the
|
|
22
29
|
`HostRequestContext`, including exact operation-capability matching, wire protocol, and current session
|
|
23
30
|
generation. Every failure rejects with `TestbedHostError`, whose `error` document satisfies
|
|
24
|
-
`isHostPortError
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
`isHostPortError`. `TestbedHostError` extends the protocol's public `HostPortFailure`, so the same
|
|
32
|
+
rejection satisfies `isHostPortFailure` without consumers depending on the testbed-specific class.
|
|
33
|
+
Stale-generation rejection is `invalid-request` with the exact
|
|
34
|
+
`studio.host/stale-session-generation` diagnostic used for whole-handle invalidation; unrelated
|
|
35
|
+
invalid requests do not carry that meaning. `not-found` messages never disclose which identifiers
|
|
36
|
+
exist. Seed artifact kinds, revisions, and the optional initial `sessionGeneration` are retained
|
|
37
|
+
exactly; subsequent revisions advance as deterministic counters (`<id>-r<n>`).
|
|
38
|
+
Optimistic-concurrency conflicts return the safe current revision without changing stored state, and
|
|
39
|
+
search/media pagination uses opaque cursors. The returned `controls` drive
|
|
29
40
|
failure scenarios: `disconnect()`/`reconnect()` for retryable `unavailable` outages,
|
|
30
41
|
`failNext(port, operation, category)` for exactly one injected failure (retryable only for
|
|
31
42
|
`unavailable` and `rate-limited`), and `setPermissions(...)`, which replaces the permission list
|
|
@@ -42,6 +53,23 @@ strict hosts. The `allowTestOperationId` option permits only the fixture wildcar
|
|
|
42
53
|
defaults off, and must never be enabled for conformance replay. The testbed uses no wall clock,
|
|
43
54
|
randomness, or timers, so runs are fully reproducible.
|
|
44
55
|
|
|
56
|
+
The optional `authoring` fixtures add the canonical contextual target, reusable-type listing, exact start,
|
|
57
|
+
save-plan, and three distinct save operations to that same testbed. Resolve, list, and start reject a body/
|
|
58
|
+
envelope resource-context mismatch; start and the three saves share the deterministic idempotency boundary;
|
|
59
|
+
and `controls.authoringOperations` exposes detached observations for assertions. The compatibility HTTP adapter
|
|
60
|
+
reuses `@kumwe/studio-core`'s production transport and maps the seven operations to `/ports/authoring/*` without
|
|
61
|
+
introducing a server-side JavaScript runtime requirement. It preserves the historical `TestbedHostError`
|
|
62
|
+
subclass; production core and browser consumers receive the protocol's canonical `HostPortFailure`.
|
|
63
|
+
`runContextualAuthoringStrideVector(vector, adapter)` is a selector-neutral first-stride runner for exact blank,
|
|
64
|
+
from-type, and existing hydration; separately governed Model, Blueprint, and Entry commands; typed values;
|
|
65
|
+
item-local composition; and host-authoritative save boundaries. Its result always carries
|
|
66
|
+
`completeProfile: false`: presentation continuity, contribution lifecycle, real-shell accessibility, and the
|
|
67
|
+
remaining browser matrix still prevent a complete `studio.profile/authoring-web` claim.
|
|
68
|
+
|
|
69
|
+
The language-neutral `vectors/authoring-http/transport-matrix.json` additionally fixes accepted and mismatched
|
|
70
|
+
save-successor-context cases. A host replay must advance from the prior context to the plan reference's exact
|
|
71
|
+
`successorContext` on acceptance and reject a result carrying any other context.
|
|
72
|
+
|
|
45
73
|
## Host conformance corpus
|
|
46
74
|
|
|
47
75
|
`@kumwe/studio-testkit/vectors/host/<filename>` publishes the executable assertion set for
|
|
@@ -65,6 +93,17 @@ TypeScript replay is `test/host-sequence-vectors.test.ts`; other runtimes consum
|
|
|
65
93
|
schema directly. The exact assertion list and deliberately recorded limits live in
|
|
66
94
|
`docs/contracts/conformance-profiles.md`.
|
|
67
95
|
|
|
96
|
+
`@kumwe/studio-testkit/vectors/authoring-http/transport-matrix.json` is the language-neutral authoring HTTP
|
|
97
|
+
matrix for PHP and independent hosts. It fixes all seven route/capability/schema bindings, mutation and
|
|
98
|
+
idempotency classification, resource-context equality requirements, success status, every canonical error
|
|
99
|
+
status, and authentication/CSRF/schema/context refusal cases. A host replays this JSON in its own test runner;
|
|
100
|
+
it does not execute TypeScript or require Node.js in production.
|
|
101
|
+
|
|
102
|
+
The host corpus includes `model.get` and `model.list` exchanges over seeded content models. The testbed
|
|
103
|
+
resolves exact ID/version/revision coordinates and lists detached projections in deterministic coordinate
|
|
104
|
+
order. The injected HTTP adapter maps the same operations to `POST /ports/model/get` and
|
|
105
|
+
`POST /ports/model/list`.
|
|
106
|
+
|
|
68
107
|
`@kumwe/studio-testkit/vectors/canonical/<filename>` publishes the canonical serialization corpus:
|
|
69
108
|
each vector carries a bounded value and either the exact canonical string with the SRI-style digest of
|
|
70
109
|
its UTF-8 bytes, or the stable reason the canonical form refuses it. Its expectations were produced by
|
|
@@ -91,14 +130,35 @@ duplicate an otherwise identical keyword, instance pointer, and message diagnost
|
|
|
91
130
|
Competing-failure vectors also pin one admission order across root invariants, local-reference
|
|
92
131
|
resolution, recursion, and structural keyword checks.
|
|
93
132
|
|
|
133
|
+
`@kumwe/studio-testkit/vectors/binding-projection/<filename>` publishes
|
|
134
|
+
`studio.profile/binding-projection-v1`. Each vector carries a complete Blueprint, authorized content model,
|
|
135
|
+
block definitions and exact normalized candidate/control/status/diagnostic output.
|
|
136
|
+
`runBindingProjectionVector(vector)` replays one vector without reading its expected result; another runtime
|
|
137
|
+
consumes the same JSON directly. The runner and reference projection never mutate vector input.
|
|
138
|
+
|
|
94
139
|
`@kumwe/studio-testkit/corpus-manifest.json` carries the sha256 digest of every file in the published
|
|
95
|
-
corpus, grouped by the directory it ships in.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
140
|
+
corpus, grouped by the directory it ships in. The current generated manifest inventories 297 files across 14
|
|
141
|
+
groups, including positive examples, invalid fixtures, portable vectors, and conformance lanes. A host that
|
|
142
|
+
vendors the corpus verifies its copy against this manifest, so a stale or altered fixture is detected before it
|
|
143
|
+
silently changes what a conformance claim means. The schema manifest in `@kumwe/studio-protocol` covers the
|
|
144
|
+
schemas; this covers everything replayed against them.
|
|
145
|
+
|
|
146
|
+
`@kumwe/studio-testkit/conformance/authoring-web/<filename>` publishes selector-neutral authoring
|
|
147
|
+
lanes. `runAuthoringWebVector(vector, adapter)` opens a fresh adapter session for every lane, performs
|
|
148
|
+
only the vector actions, and compares the returned canonical document, command intents, focus,
|
|
149
|
+
selection, announcements and dirty state. The adapter is deliberately injected: a browser host maps
|
|
150
|
+
the semantic steps onto its real DOM without exposing Lit, Editor.js, drag-and-drop, or host types in
|
|
151
|
+
the corpus. The current runner test proves fixture isolation and comparison behavior; it is not a
|
|
152
|
+
claim that the production shell has completed the entire authoring-web profile.
|
|
153
|
+
|
|
154
|
+
`@kumwe/studio-testkit/studio-release.json` is byte-identical to the workspace and protocol copies. A
|
|
155
|
+
host can vendor this record with the corpus, verify `corpusManifestDigest`, and resolve the exact eight
|
|
156
|
+
package versions named by one Studio release coordinate. An empty `claimedProfiles` array is deliberate:
|
|
157
|
+
repository tests and declared targets are not evidence-backed release claims.
|
|
99
158
|
|
|
100
159
|
Gate A requires valid and invalid fixture corpora plus runner-neutral assertions for block, theme,
|
|
101
160
|
plugin, host-port, command, preview, media, compatibility, migration, lifecycle, security,
|
|
102
|
-
accessibility, localization, and TypeScript
|
|
103
|
-
|
|
104
|
-
|
|
161
|
+
accessibility, localization, and the applicable Version 2 TypeScript profile. Eight Version 2 profiles are
|
|
162
|
+
declared executable in the repository; `studio.profile/authoring-web` alone remains a target until its complete
|
|
163
|
+
real-shell assertion set and manual matrix exist. None is claimed by the current release record, and this beta
|
|
164
|
+
development tree must not be cited as accepted gate evidence. Dart/Flutter parity belongs to Version 3.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/generate-third-party-notices.mjs. Do not edit by hand. -->
|
|
4
|
+
|
|
5
|
+
Package: `@kumwe/studio-testkit`
|
|
6
|
+
|
|
7
|
+
Production closure SHA-256: `4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945`
|
|
8
|
+
|
|
9
|
+
This package has no third-party runtime dependencies.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
{
|
|
2
|
+
"contractVersion": "0.1-draft",
|
|
3
|
+
"kind": "authoring-web-vector",
|
|
4
|
+
"id": "studio.conformance/non-drag-move-equivalence",
|
|
5
|
+
"description": "Keyboard, explicit structural control, and pointer enhancement dispatch the same root move while keeping the moved node selected and focused.",
|
|
6
|
+
"requirements": ["SR-001", "SR-003", "SR-017", "SR-029"],
|
|
7
|
+
"given": {
|
|
8
|
+
"document": {
|
|
9
|
+
"contractVersion": "0.1-draft",
|
|
10
|
+
"kind": "blueprint",
|
|
11
|
+
"id": "studio.conformance/authoring-move",
|
|
12
|
+
"version": "1.0.0",
|
|
13
|
+
"revision": "authoring-move-r1",
|
|
14
|
+
"owner": { "id": "studio.conformance/suite", "version": "1.0.0" },
|
|
15
|
+
"status": "draft",
|
|
16
|
+
"label": {
|
|
17
|
+
"key": "studio.conformance/authoring-move-label",
|
|
18
|
+
"defaultMessage": "Authoring move vector"
|
|
19
|
+
},
|
|
20
|
+
"model": {
|
|
21
|
+
"id": "studio.conformance/model",
|
|
22
|
+
"version": "1.0.0",
|
|
23
|
+
"revision": "model-r1"
|
|
24
|
+
},
|
|
25
|
+
"dependencyLock": {
|
|
26
|
+
"theme": {
|
|
27
|
+
"id": "studio.conformance/theme",
|
|
28
|
+
"version": "1.0.0",
|
|
29
|
+
"revision": "theme-r1"
|
|
30
|
+
},
|
|
31
|
+
"blocks": [
|
|
32
|
+
{
|
|
33
|
+
"type": "studio.core/heading",
|
|
34
|
+
"version": "1.0.0",
|
|
35
|
+
"revision": "heading-r1"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"roots": [
|
|
40
|
+
{
|
|
41
|
+
"id": "node-first",
|
|
42
|
+
"type": "studio.core/heading",
|
|
43
|
+
"version": "1.0.0",
|
|
44
|
+
"properties": { "level": 2 },
|
|
45
|
+
"bindings": {
|
|
46
|
+
"text": {
|
|
47
|
+
"source": { "kind": "static-value", "value": "First" },
|
|
48
|
+
"transforms": [],
|
|
49
|
+
"onNull": "empty",
|
|
50
|
+
"onError": "error"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"slots": {},
|
|
54
|
+
"authoring": { "mode": "content" }
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "node-second",
|
|
58
|
+
"type": "studio.core/heading",
|
|
59
|
+
"version": "1.0.0",
|
|
60
|
+
"properties": { "level": 2 },
|
|
61
|
+
"bindings": {
|
|
62
|
+
"text": {
|
|
63
|
+
"source": { "kind": "static-value", "value": "Second" },
|
|
64
|
+
"transforms": [],
|
|
65
|
+
"onNull": "empty",
|
|
66
|
+
"onError": "error"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"slots": {},
|
|
70
|
+
"authoring": { "mode": "content" }
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
"direction": "ltr",
|
|
75
|
+
"locale": "en",
|
|
76
|
+
"readOnly": false,
|
|
77
|
+
"reducedMotion": false,
|
|
78
|
+
"selection": "node-first",
|
|
79
|
+
"viewport": { "height": 900, "width": 1440, "zoomPercent": 100 }
|
|
80
|
+
},
|
|
81
|
+
"lanes": [
|
|
82
|
+
{
|
|
83
|
+
"name": "keyboard-move-down",
|
|
84
|
+
"surface": "keyboard",
|
|
85
|
+
"steps": [
|
|
86
|
+
{ "kind": "focus-node", "nodeId": "node-first", "region": "outline" },
|
|
87
|
+
{
|
|
88
|
+
"kind": "key",
|
|
89
|
+
"key": "ArrowDown",
|
|
90
|
+
"modifiers": ["Alt"],
|
|
91
|
+
"region": "outline"
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "explicit-move-control",
|
|
97
|
+
"surface": "structural-control",
|
|
98
|
+
"steps": [
|
|
99
|
+
{ "kind": "focus-node", "nodeId": "node-first", "region": "outline" },
|
|
100
|
+
{
|
|
101
|
+
"kind": "activate-command",
|
|
102
|
+
"region": "command-palette",
|
|
103
|
+
"type": "studio.command/move-node",
|
|
104
|
+
"payload": { "nodeId": "node-first", "destination": { "position": 1 } }
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "pointer-drag-enhancement",
|
|
110
|
+
"surface": "pointer",
|
|
111
|
+
"steps": [
|
|
112
|
+
{ "kind": "focus-node", "nodeId": "node-first", "region": "canvas" },
|
|
113
|
+
{
|
|
114
|
+
"kind": "drag-node",
|
|
115
|
+
"nodeId": "node-first",
|
|
116
|
+
"destination": { "position": 1 }
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"expect": {
|
|
122
|
+
"announcements": [{ "key": "studio.authoring/node-moved", "politeness": "polite" }],
|
|
123
|
+
"commands": [
|
|
124
|
+
{
|
|
125
|
+
"type": "studio.command/move-node",
|
|
126
|
+
"payload": { "nodeId": "node-first", "destination": { "position": 1 } }
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"dirty": true,
|
|
130
|
+
"document": {
|
|
131
|
+
"contractVersion": "0.1-draft",
|
|
132
|
+
"kind": "blueprint",
|
|
133
|
+
"id": "studio.conformance/authoring-move",
|
|
134
|
+
"version": "1.0.0",
|
|
135
|
+
"revision": "authoring-move-r1",
|
|
136
|
+
"owner": { "id": "studio.conformance/suite", "version": "1.0.0" },
|
|
137
|
+
"status": "draft",
|
|
138
|
+
"label": {
|
|
139
|
+
"key": "studio.conformance/authoring-move-label",
|
|
140
|
+
"defaultMessage": "Authoring move vector"
|
|
141
|
+
},
|
|
142
|
+
"model": {
|
|
143
|
+
"id": "studio.conformance/model",
|
|
144
|
+
"version": "1.0.0",
|
|
145
|
+
"revision": "model-r1"
|
|
146
|
+
},
|
|
147
|
+
"dependencyLock": {
|
|
148
|
+
"theme": {
|
|
149
|
+
"id": "studio.conformance/theme",
|
|
150
|
+
"version": "1.0.0",
|
|
151
|
+
"revision": "theme-r1"
|
|
152
|
+
},
|
|
153
|
+
"blocks": [
|
|
154
|
+
{
|
|
155
|
+
"type": "studio.core/heading",
|
|
156
|
+
"version": "1.0.0",
|
|
157
|
+
"revision": "heading-r1"
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"roots": [
|
|
162
|
+
{
|
|
163
|
+
"id": "node-second",
|
|
164
|
+
"type": "studio.core/heading",
|
|
165
|
+
"version": "1.0.0",
|
|
166
|
+
"properties": { "level": 2 },
|
|
167
|
+
"bindings": {
|
|
168
|
+
"text": {
|
|
169
|
+
"source": { "kind": "static-value", "value": "Second" },
|
|
170
|
+
"transforms": [],
|
|
171
|
+
"onNull": "empty",
|
|
172
|
+
"onError": "error"
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
"slots": {},
|
|
176
|
+
"authoring": { "mode": "content" }
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"id": "node-first",
|
|
180
|
+
"type": "studio.core/heading",
|
|
181
|
+
"version": "1.0.0",
|
|
182
|
+
"properties": { "level": 2 },
|
|
183
|
+
"bindings": {
|
|
184
|
+
"text": {
|
|
185
|
+
"source": { "kind": "static-value", "value": "First" },
|
|
186
|
+
"transforms": [],
|
|
187
|
+
"onNull": "empty",
|
|
188
|
+
"onError": "error"
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"slots": {},
|
|
192
|
+
"authoring": { "mode": "content" }
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
},
|
|
196
|
+
"focus": { "region": "outline", "nodeId": "node-first" },
|
|
197
|
+
"selection": "node-first"
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "renderer-web/blob-default-deny",
|
|
3
|
+
"coverage": {
|
|
4
|
+
"blockTypes": ["studio.core/image"],
|
|
5
|
+
"behaviors": [],
|
|
6
|
+
"presentation": [],
|
|
7
|
+
"security": ["blob-default-deny"]
|
|
8
|
+
},
|
|
9
|
+
"roots": [
|
|
10
|
+
{
|
|
11
|
+
"authoring": { "mode": "content" },
|
|
12
|
+
"bindings": {},
|
|
13
|
+
"id": "blob-default",
|
|
14
|
+
"properties": { "fit": "cover", "loading": "lazy" },
|
|
15
|
+
"slots": {},
|
|
16
|
+
"type": "studio.core/image",
|
|
17
|
+
"version": "1.0.0"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"bindings": [
|
|
21
|
+
{
|
|
22
|
+
"nodeId": "blob-default",
|
|
23
|
+
"port": "asset",
|
|
24
|
+
"value": {
|
|
25
|
+
"contractVersion": "0.1-draft",
|
|
26
|
+
"kind": "media-reference",
|
|
27
|
+
"assetId": "local",
|
|
28
|
+
"usage": "studio.media/content",
|
|
29
|
+
"accessibility": { "mode": "informative", "altText": "Local" }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"media": [
|
|
34
|
+
{
|
|
35
|
+
"assetId": "local",
|
|
36
|
+
"src": "blob:https://studio.example.test/323e4567-e89b-12d3-a456-426614174000",
|
|
37
|
+
"altText": "Local",
|
|
38
|
+
"mediaType": "image/png"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"expect": {
|
|
42
|
+
"activationMarkers": [],
|
|
43
|
+
"cssBytes": 6320,
|
|
44
|
+
"cssSha256": "8d4d00dfa489396dc0a4207b3d1efa207d7658e325c9db4bba2e74b91a607649",
|
|
45
|
+
"htmlBytes": 153,
|
|
46
|
+
"htmlSha256": "c4bc7134b14028faf96ee6166f3925e0cbbbc0f17457a969fcbacf1d1f4dd79f",
|
|
47
|
+
"publicStyleAsset": {
|
|
48
|
+
"path": "assets/studio-public-8d4d00dfa489396d.min.css",
|
|
49
|
+
"role": "public-style",
|
|
50
|
+
"mediaType": "text/css",
|
|
51
|
+
"bytes": 6320,
|
|
52
|
+
"budgetBytes": 262144,
|
|
53
|
+
"contentHash": "8d4d00dfa489396dc0a4207b3d1efa207d7658e325c9db4bba2e74b91a607649",
|
|
54
|
+
"integrity": "sha256-jU0A36SJOW3ApCB7PR76IH12WOMlydtLui50uRpgdkk=",
|
|
55
|
+
"minified": true
|
|
56
|
+
},
|
|
57
|
+
"htmlContains": ["Image unavailable"],
|
|
58
|
+
"htmlExcludes": ["blob:https://"],
|
|
59
|
+
"cssContains": ["prefers-reduced-motion"],
|
|
60
|
+
"enhancements": []
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "renderer-web/chart-fallback",
|
|
3
|
+
"coverage": {
|
|
4
|
+
"blockTypes": ["studio.core/chart"],
|
|
5
|
+
"behaviors": [],
|
|
6
|
+
"presentation": [],
|
|
7
|
+
"security": ["typed-data-fallback"]
|
|
8
|
+
},
|
|
9
|
+
"roots": [
|
|
10
|
+
{
|
|
11
|
+
"authoring": { "mode": "content" },
|
|
12
|
+
"bindings": {},
|
|
13
|
+
"id": "chart",
|
|
14
|
+
"properties": {},
|
|
15
|
+
"slots": {},
|
|
16
|
+
"type": "studio.core/chart",
|
|
17
|
+
"version": "1.0.0"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"bindings": [
|
|
21
|
+
{
|
|
22
|
+
"nodeId": "chart",
|
|
23
|
+
"port": "chart",
|
|
24
|
+
"value": {
|
|
25
|
+
"type": "bar",
|
|
26
|
+
"title": "Revenue",
|
|
27
|
+
"labels": ["Q1", "Q2"],
|
|
28
|
+
"datasets": [{ "label": "NAD", "values": [10, 20] }]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"media": [],
|
|
33
|
+
"expect": {
|
|
34
|
+
"activationMarkers": [],
|
|
35
|
+
"cssBytes": 6320,
|
|
36
|
+
"cssSha256": "8d4d00dfa489396dc0a4207b3d1efa207d7658e325c9db4bba2e74b91a607649",
|
|
37
|
+
"htmlBytes": 398,
|
|
38
|
+
"htmlSha256": "5f95e47df5ec5ea95dfafd5c1c76cc3cb4e529f0ba80d307ba99d4fab6b73f9e",
|
|
39
|
+
"publicStyleAsset": {
|
|
40
|
+
"path": "assets/studio-public-8d4d00dfa489396d.min.css",
|
|
41
|
+
"role": "public-style",
|
|
42
|
+
"mediaType": "text/css",
|
|
43
|
+
"bytes": 6320,
|
|
44
|
+
"budgetBytes": 262144,
|
|
45
|
+
"contentHash": "8d4d00dfa489396dc0a4207b3d1efa207d7658e325c9db4bba2e74b91a607649",
|
|
46
|
+
"integrity": "sha256-jU0A36SJOW3ApCB7PR76IH12WOMlydtLui50uRpgdkk=",
|
|
47
|
+
"minified": true
|
|
48
|
+
},
|
|
49
|
+
"htmlContains": ["<table data-studio-chart-table>", "Revenue", "Q1", "20"],
|
|
50
|
+
"htmlExcludes": ["<script", "onClick"],
|
|
51
|
+
"cssContains": ["data-studio-chart-table"],
|
|
52
|
+
"enhancements": ["chart"]
|
|
53
|
+
}
|
|
54
|
+
}
|