@oddkin/workbench 0.0.0-stage → 1.0.0-beta.1

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.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -2
  3. package/dist/app/card-previews.d.ts +14 -0
  4. package/dist/app/card-previews.d.ts.map +1 -0
  5. package/dist/app/card-previews.js +140 -0
  6. package/dist/app/card-previews.js.map +1 -0
  7. package/dist/app/copy.d.ts +48 -0
  8. package/dist/app/copy.d.ts.map +1 -0
  9. package/dist/app/copy.js +52 -0
  10. package/dist/app/copy.js.map +1 -0
  11. package/dist/app/define.d.ts +3 -0
  12. package/dist/app/define.d.ts.map +1 -0
  13. package/dist/app/define.js +10 -0
  14. package/dist/app/define.js.map +1 -0
  15. package/dist/app/details.d.ts +22 -0
  16. package/dist/app/details.d.ts.map +1 -0
  17. package/dist/app/details.js +17 -0
  18. package/dist/app/details.js.map +1 -0
  19. package/dist/app/index.d.ts +12 -0
  20. package/dist/app/index.d.ts.map +1 -0
  21. package/dist/app/index.js +9 -0
  22. package/dist/app/index.js.map +1 -0
  23. package/dist/app/routes.d.ts +26 -0
  24. package/dist/app/routes.d.ts.map +1 -0
  25. package/dist/app/routes.js +96 -0
  26. package/dist/app/routes.js.map +1 -0
  27. package/dist/app/search.d.ts +17 -0
  28. package/dist/app/search.d.ts.map +1 -0
  29. package/dist/app/search.js +52 -0
  30. package/dist/app/search.js.map +1 -0
  31. package/dist/app/shell.d.ts +29 -0
  32. package/dist/app/shell.d.ts.map +1 -0
  33. package/dist/app/shell.js +478 -0
  34. package/dist/app/shell.js.map +1 -0
  35. package/dist/app/styles.d.ts +2 -0
  36. package/dist/app/styles.d.ts.map +1 -0
  37. package/dist/app/styles.js +356 -0
  38. package/dist/app/styles.js.map +1 -0
  39. package/dist/app/theme-studio.d.ts +12 -0
  40. package/dist/app/theme-studio.d.ts.map +1 -0
  41. package/dist/app/theme-studio.js +14 -0
  42. package/dist/app/theme-studio.js.map +1 -0
  43. package/dist/app/views.d.ts +38 -0
  44. package/dist/app/views.d.ts.map +1 -0
  45. package/dist/app/views.js +252 -0
  46. package/dist/app/views.js.map +1 -0
  47. package/dist/config/index.d.ts +170 -0
  48. package/dist/config/index.d.ts.map +1 -0
  49. package/dist/config/index.js +148 -0
  50. package/dist/config/index.js.map +1 -0
  51. package/dist/conformance/button.d.ts +2 -0
  52. package/dist/conformance/button.d.ts.map +1 -0
  53. package/dist/conformance/button.js +233 -0
  54. package/dist/conformance/button.js.map +1 -0
  55. package/dist/conformance/index.d.ts +107 -0
  56. package/dist/conformance/index.d.ts.map +1 -0
  57. package/dist/conformance/index.js +60 -0
  58. package/dist/conformance/index.js.map +1 -0
  59. package/dist/data/build.d.ts +36 -0
  60. package/dist/data/build.d.ts.map +1 -0
  61. package/dist/data/build.js +260 -0
  62. package/dist/data/build.js.map +1 -0
  63. package/dist/data/import-map.d.ts +59 -0
  64. package/dist/data/import-map.d.ts.map +1 -0
  65. package/dist/data/import-map.js +195 -0
  66. package/dist/data/import-map.js.map +1 -0
  67. package/dist/data/index.d.ts +14 -0
  68. package/dist/data/index.d.ts.map +1 -0
  69. package/dist/data/index.js +10 -0
  70. package/dist/data/index.js.map +1 -0
  71. package/dist/data/theme-studio.d.ts +21 -0
  72. package/dist/data/theme-studio.d.ts.map +1 -0
  73. package/dist/data/theme-studio.js +112 -0
  74. package/dist/data/theme-studio.js.map +1 -0
  75. package/dist/data/types.d.ts +187 -0
  76. package/dist/data/types.d.ts.map +1 -0
  77. package/dist/data/types.js +4 -0
  78. package/dist/data/types.js.map +1 -0
  79. package/dist/examples/index.d.ts +101 -0
  80. package/dist/examples/index.d.ts.map +1 -0
  81. package/dist/examples/index.js +106 -0
  82. package/dist/examples/index.js.map +1 -0
  83. package/dist/frame/index.d.ts +9 -0
  84. package/dist/frame/index.d.ts.map +1 -0
  85. package/dist/frame/index.js +482 -0
  86. package/dist/frame/index.js.map +1 -0
  87. package/dist/internal/diagnostics.d.ts +17 -0
  88. package/dist/internal/diagnostics.d.ts.map +1 -0
  89. package/dist/internal/diagnostics.js +19 -0
  90. package/dist/internal/diagnostics.js.map +1 -0
  91. package/dist/node/bin.d.ts +3 -0
  92. package/dist/node/bin.d.ts.map +1 -0
  93. package/dist/node/bin.js +12 -0
  94. package/dist/node/bin.js.map +1 -0
  95. package/dist/node/cli.d.ts +17 -0
  96. package/dist/node/cli.d.ts.map +1 -0
  97. package/dist/node/cli.js +198 -0
  98. package/dist/node/cli.js.map +1 -0
  99. package/dist/node/config.d.ts +28 -0
  100. package/dist/node/config.d.ts.map +1 -0
  101. package/dist/node/config.js +80 -0
  102. package/dist/node/config.js.map +1 -0
  103. package/dist/node/example-modules.d.ts +8 -0
  104. package/dist/node/example-modules.d.ts.map +1 -0
  105. package/dist/node/example-modules.js +28 -0
  106. package/dist/node/example-modules.js.map +1 -0
  107. package/dist/node/generated.d.ts +19 -0
  108. package/dist/node/generated.d.ts.map +1 -0
  109. package/dist/node/generated.js +109 -0
  110. package/dist/node/generated.js.map +1 -0
  111. package/dist/node/html.d.ts +35 -0
  112. package/dist/node/html.d.ts.map +1 -0
  113. package/dist/node/html.js +51 -0
  114. package/dist/node/html.js.map +1 -0
  115. package/dist/node/index.d.ts +24 -0
  116. package/dist/node/index.d.ts.map +1 -0
  117. package/dist/node/index.js +15 -0
  118. package/dist/node/index.js.map +1 -0
  119. package/dist/node/inputs.d.ts +26 -0
  120. package/dist/node/inputs.d.ts.map +1 -0
  121. package/dist/node/inputs.js +282 -0
  122. package/dist/node/inputs.js.map +1 -0
  123. package/dist/node/packages.d.ts +35 -0
  124. package/dist/node/packages.d.ts.map +1 -0
  125. package/dist/node/packages.js +87 -0
  126. package/dist/node/packages.js.map +1 -0
  127. package/dist/node/preload.d.ts +10 -0
  128. package/dist/node/preload.d.ts.map +1 -0
  129. package/dist/node/preload.js +61 -0
  130. package/dist/node/preload.js.map +1 -0
  131. package/dist/node/server.d.ts +42 -0
  132. package/dist/node/server.d.ts.map +1 -0
  133. package/dist/node/server.js +410 -0
  134. package/dist/node/server.js.map +1 -0
  135. package/dist/node/static.d.ts +43 -0
  136. package/dist/node/static.d.ts.map +1 -0
  137. package/dist/node/static.js +157 -0
  138. package/dist/node/static.js.map +1 -0
  139. package/dist/node/workbench.d.ts +43 -0
  140. package/dist/node/workbench.d.ts.map +1 -0
  141. package/dist/node/workbench.js +204 -0
  142. package/dist/node/workbench.js.map +1 -0
  143. package/dist/pages/build.d.ts +22 -0
  144. package/dist/pages/build.d.ts.map +1 -0
  145. package/dist/pages/build.js +363 -0
  146. package/dist/pages/build.js.map +1 -0
  147. package/dist/pages/defaults.d.ts +16 -0
  148. package/dist/pages/defaults.d.ts.map +1 -0
  149. package/dist/pages/defaults.js +88 -0
  150. package/dist/pages/defaults.js.map +1 -0
  151. package/dist/pages/index.d.ts +14 -0
  152. package/dist/pages/index.d.ts.map +1 -0
  153. package/dist/pages/index.js +10 -0
  154. package/dist/pages/index.js.map +1 -0
  155. package/dist/pages/navigation.d.ts +48 -0
  156. package/dist/pages/navigation.d.ts.map +1 -0
  157. package/dist/pages/navigation.js +83 -0
  158. package/dist/pages/navigation.js.map +1 -0
  159. package/dist/pages/types.d.ts +148 -0
  160. package/dist/pages/types.d.ts.map +1 -0
  161. package/dist/pages/types.js +3 -0
  162. package/dist/pages/types.js.map +1 -0
  163. package/dist/panels/catalog-define.d.ts +3 -0
  164. package/dist/panels/catalog-define.d.ts.map +1 -0
  165. package/dist/panels/catalog-define.js +7 -0
  166. package/dist/panels/catalog-define.js.map +1 -0
  167. package/dist/panels/catalog-layout-styles.d.ts +2 -0
  168. package/dist/panels/catalog-layout-styles.d.ts.map +1 -0
  169. package/dist/panels/catalog-layout-styles.js +54 -0
  170. package/dist/panels/catalog-layout-styles.js.map +1 -0
  171. package/dist/panels/catalog-styles.d.ts +2 -0
  172. package/dist/panels/catalog-styles.d.ts.map +1 -0
  173. package/dist/panels/catalog-styles.js +106 -0
  174. package/dist/panels/catalog-styles.js.map +1 -0
  175. package/dist/panels/catalog.d.ts +37 -0
  176. package/dist/panels/catalog.d.ts.map +1 -0
  177. package/dist/panels/catalog.js +74 -0
  178. package/dist/panels/catalog.js.map +1 -0
  179. package/dist/panels/component-define.d.ts +3 -0
  180. package/dist/panels/component-define.d.ts.map +1 -0
  181. package/dist/panels/component-define.js +6 -0
  182. package/dist/panels/component-define.js.map +1 -0
  183. package/dist/panels/component-detail.d.ts +49 -0
  184. package/dist/panels/component-detail.d.ts.map +1 -0
  185. package/dist/panels/component-detail.js +1352 -0
  186. package/dist/panels/component-detail.js.map +1 -0
  187. package/dist/panels/component.d.ts +17 -0
  188. package/dist/panels/component.d.ts.map +1 -0
  189. package/dist/panels/component.js +10 -0
  190. package/dist/panels/component.js.map +1 -0
  191. package/dist/panels/example-styles.d.ts +2 -0
  192. package/dist/panels/example-styles.d.ts.map +1 -0
  193. package/dist/panels/example-styles.js +343 -0
  194. package/dist/panels/example-styles.js.map +1 -0
  195. package/dist/panels/foundation-define.d.ts +3 -0
  196. package/dist/panels/foundation-define.d.ts.map +1 -0
  197. package/dist/panels/foundation-define.js +6 -0
  198. package/dist/panels/foundation-define.js.map +1 -0
  199. package/dist/panels/foundation-detail.d.ts +23 -0
  200. package/dist/panels/foundation-detail.d.ts.map +1 -0
  201. package/dist/panels/foundation-detail.js +216 -0
  202. package/dist/panels/foundation-detail.js.map +1 -0
  203. package/dist/panels/foundation.d.ts +15 -0
  204. package/dist/panels/foundation.d.ts.map +1 -0
  205. package/dist/panels/foundation.js +9 -0
  206. package/dist/panels/foundation.js.map +1 -0
  207. package/dist/panels/model.d.ts +184 -0
  208. package/dist/panels/model.d.ts.map +1 -0
  209. package/dist/panels/model.js +488 -0
  210. package/dist/panels/model.js.map +1 -0
  211. package/dist/panels/styles.d.ts +3 -0
  212. package/dist/panels/styles.d.ts.map +1 -0
  213. package/dist/panels/styles.js +265 -0
  214. package/dist/panels/styles.js.map +1 -0
  215. package/dist/panels/theme-model.d.ts +69 -0
  216. package/dist/panels/theme-model.d.ts.map +1 -0
  217. package/dist/panels/theme-model.js +166 -0
  218. package/dist/panels/theme-model.js.map +1 -0
  219. package/dist/panels/theme-studio.d.ts +32 -0
  220. package/dist/panels/theme-studio.d.ts.map +1 -0
  221. package/dist/panels/theme-studio.js +375 -0
  222. package/dist/panels/theme-studio.js.map +1 -0
  223. package/dist/preview/frame.d.ts +44 -0
  224. package/dist/preview/frame.d.ts.map +1 -0
  225. package/dist/preview/frame.js +260 -0
  226. package/dist/preview/frame.js.map +1 -0
  227. package/dist/preview/index.d.ts +26 -0
  228. package/dist/preview/index.d.ts.map +1 -0
  229. package/dist/preview/index.js +58 -0
  230. package/dist/preview/index.js.map +1 -0
  231. package/dist/preview/theme-generation.d.ts +33 -0
  232. package/dist/preview/theme-generation.d.ts.map +1 -0
  233. package/dist/preview/theme-generation.js +48 -0
  234. package/dist/preview/theme-generation.js.map +1 -0
  235. package/dist/protocol/index.d.ts +222 -0
  236. package/dist/protocol/index.d.ts.map +1 -0
  237. package/dist/protocol/index.js +272 -0
  238. package/dist/protocol/index.js.map +1 -0
  239. package/dist/testing/index.d.ts +47 -0
  240. package/dist/testing/index.d.ts.map +1 -0
  241. package/dist/testing/index.js +145 -0
  242. package/dist/testing/index.js.map +1 -0
  243. package/package.json +118 -4
@@ -0,0 +1,222 @@
1
+ /** DOM-free message contracts shared by the Workbench host and preview frames. */
2
+ export declare const FRAME_PROTOCOL = "oddkin.frame";
3
+ export declare const FRAME_PROTOCOL_VERSION = 1;
4
+ export type JsonValue = null | boolean | number | string | readonly JsonValue[] | {
5
+ readonly [key: string]: JsonValue;
6
+ };
7
+ export type ExampleId = `example:${string}/${string}`;
8
+ export type EventId = `event:${string}#${string}`;
9
+ export type PropertyId = `property:${string}#${string}`;
10
+ export interface FrameIdentity {
11
+ readonly frame: string;
12
+ readonly generation: number;
13
+ }
14
+ export interface FrameSettings {
15
+ readonly viewport?: {
16
+ readonly width: number;
17
+ readonly height: number;
18
+ };
19
+ readonly container?: {
20
+ readonly width: number;
21
+ readonly height?: number;
22
+ };
23
+ readonly direction?: 'ltr' | 'rtl';
24
+ readonly mode?: 'light' | 'dark';
25
+ readonly density?: string;
26
+ readonly product?: string;
27
+ readonly profile?: string;
28
+ }
29
+ export interface FrameMountPayload {
30
+ readonly tag: string;
31
+ readonly registration: string;
32
+ readonly example: ExampleId;
33
+ readonly properties?: Readonly<Record<string, JsonValue>>;
34
+ readonly attributes?: Readonly<Record<string, string | null>>;
35
+ readonly slots?: Readonly<Record<string, string>>;
36
+ readonly events?: readonly string[];
37
+ /**
38
+ * Declared property ↔ event sync pairs (metadata `syncPairs`). After such an event the frame
39
+ * reports the property's value in a `state` notification (`{ property, value }`); nothing is
40
+ * inferred from event names.
41
+ */
42
+ readonly sync?: readonly {
43
+ readonly property: string;
44
+ readonly event: string;
45
+ }[];
46
+ /** CSS custom property values set on the element (`style.setProperty`); names start with `--`. */
47
+ readonly styles?: Readonly<Record<string, string>>;
48
+ /**
49
+ * URL of the example module (a `defineExamples` default export) whose fixture for `example`
50
+ * runs after the element is connected, as `mountExample` runs it in tests.
51
+ */
52
+ readonly fixture?: string;
53
+ readonly settings?: FrameSettings;
54
+ }
55
+ /**
56
+ * One write: a property (a value, or `unset`), an attribute (a string, or `null` to remove it), or
57
+ * a CSS custom property on the element's style (a value, or `null` to remove it).
58
+ */
59
+ export interface FrameSetPayload {
60
+ readonly property?: string;
61
+ readonly value?: JsonValue;
62
+ readonly unset?: boolean;
63
+ readonly attribute?: string;
64
+ readonly attributeValue?: string | null;
65
+ readonly cssProperty?: string;
66
+ readonly cssValue?: string | null;
67
+ }
68
+ export interface FrameSlotPayload {
69
+ readonly name: string;
70
+ readonly text: string;
71
+ }
72
+ /** One element per preview role, mounted together (Theme Studio specimens). */
73
+ export interface FrameSpecimenItem extends FrameMountPayload {
74
+ /** The preview role this element plays, e.g. `primaryAction`. */
75
+ readonly role: string;
76
+ /** Visible caption naming the role. */
77
+ readonly label: string;
78
+ }
79
+ export interface FrameSpecimenPayload {
80
+ readonly items: readonly FrameSpecimenItem[];
81
+ readonly settings?: FrameSettings;
82
+ }
83
+ export interface FrameThemePayload {
84
+ readonly cssText: string;
85
+ }
86
+ export interface InspectPreviewRequest {
87
+ /** Stable example id, e.g. `example:odd-button/primary`. */
88
+ readonly example: ExampleId;
89
+ readonly settings?: FrameSettings;
90
+ readonly properties?: Readonly<Record<string, JsonValue>>;
91
+ readonly slots?: Readonly<Record<string, string>>;
92
+ readonly interactions?: readonly {
93
+ readonly id: EventId;
94
+ readonly event: string;
95
+ readonly target?: string;
96
+ }[];
97
+ readonly limits?: {
98
+ readonly errors?: number;
99
+ readonly events?: number;
100
+ readonly state?: number;
101
+ readonly checks?: number;
102
+ };
103
+ }
104
+ export interface InspectPreviewResponse {
105
+ readonly errors: readonly {
106
+ readonly id: EventId;
107
+ readonly phase: string;
108
+ readonly message: string;
109
+ }[];
110
+ readonly events: readonly {
111
+ readonly id: EventId;
112
+ readonly name: string;
113
+ readonly time: number;
114
+ readonly bubbles: boolean;
115
+ readonly composed: boolean;
116
+ readonly cancelable: boolean;
117
+ readonly detail?: JsonValue;
118
+ }[];
119
+ readonly state: readonly {
120
+ readonly id: PropertyId;
121
+ readonly value: JsonValue;
122
+ }[];
123
+ readonly checks: readonly {
124
+ readonly id: string;
125
+ readonly status: 'pass' | 'fail' | 'skip';
126
+ readonly engine: string;
127
+ readonly version: string;
128
+ readonly configuration: JsonValue;
129
+ readonly verification: string;
130
+ }[];
131
+ readonly conditions: JsonValue;
132
+ readonly engine: string;
133
+ readonly version: string;
134
+ readonly configuration: JsonValue;
135
+ readonly truncated: {
136
+ readonly errors: boolean;
137
+ readonly events: boolean;
138
+ readonly state: boolean;
139
+ readonly checks: boolean;
140
+ };
141
+ }
142
+ interface Envelope extends FrameIdentity {
143
+ readonly protocol: typeof FRAME_PROTOCOL;
144
+ readonly version: number;
145
+ }
146
+ export interface FrameHello extends Envelope {
147
+ readonly kind: 'hello';
148
+ }
149
+ export interface FrameConnect extends Envelope {
150
+ readonly kind: 'connect';
151
+ }
152
+ export type FrameRequest = (Envelope & {
153
+ readonly kind: 'mount';
154
+ readonly id: number;
155
+ readonly payload: FrameMountPayload;
156
+ }) | (Envelope & {
157
+ readonly kind: 'specimen';
158
+ readonly id: number;
159
+ readonly payload: FrameSpecimenPayload;
160
+ }) | (Envelope & {
161
+ readonly kind: 'set';
162
+ readonly id: number;
163
+ readonly payload: FrameSetPayload;
164
+ }) | (Envelope & {
165
+ readonly kind: 'slot';
166
+ readonly id: number;
167
+ readonly payload: FrameSlotPayload;
168
+ }) | (Envelope & {
169
+ readonly kind: 'reset';
170
+ readonly id: number;
171
+ }) | (Envelope & {
172
+ readonly kind: 'dispose';
173
+ readonly id: number;
174
+ }) | (Envelope & {
175
+ readonly kind: 'theme';
176
+ readonly id: number;
177
+ readonly payload: FrameThemePayload;
178
+ }) | (Envelope & {
179
+ readonly kind: 'settings';
180
+ readonly id: number;
181
+ readonly payload: FrameSettings;
182
+ }) | (Envelope & {
183
+ readonly kind: 'inspect';
184
+ readonly id: number;
185
+ readonly payload: InspectPreviewRequest;
186
+ });
187
+ export interface FrameReply extends Envelope {
188
+ readonly kind: 'reply';
189
+ readonly replyTo: number;
190
+ readonly payload?: JsonValue;
191
+ readonly error?: {
192
+ readonly code: string;
193
+ readonly message: string;
194
+ };
195
+ }
196
+ export interface FrameNotification extends Envelope {
197
+ readonly kind: 'event' | 'error' | 'state' | 'size';
198
+ readonly payload?: JsonValue;
199
+ }
200
+ export type FrameRequestPayload = Extract<FrameRequest, {
201
+ readonly payload: unknown;
202
+ }>['payload'];
203
+ export type FrameMessage = FrameHello | FrameConnect | FrameRequest | FrameReply | FrameNotification;
204
+ /** True only for finite, acyclic data that can be transferred as plain JSON without coercion. */
205
+ export declare function isJsonValue(value: unknown): value is JsonValue;
206
+ /** A CSS custom property name: `--` and at least one more character, no spaces or colons. */
207
+ export declare const isCustomPropertyName: (value: unknown) => value is string;
208
+ export declare const isExampleId: (value: unknown) => value is ExampleId;
209
+ export declare function isFrameMountPayload(value: unknown): value is FrameMountPayload;
210
+ export declare function isFrameSpecimenPayload(value: unknown): value is FrameSpecimenPayload;
211
+ /** Validates the common envelope and its JSON payload, without accepting a specific version. */
212
+ export declare function isFrameMessage(value: unknown): value is FrameMessage;
213
+ export declare function isCompatibleFrameMessage(value: unknown): value is FrameMessage;
214
+ export declare const isFrameHello: (value: unknown) => value is FrameHello;
215
+ export declare function isInspectPreviewRequest(value: unknown): value is InspectPreviewRequest;
216
+ export declare function isFrameRequest(value: unknown): value is FrameRequest;
217
+ export declare const isFrameReply: (value: unknown) => value is FrameReply;
218
+ export declare function frameEnvelope<T extends FrameMessage['kind']>(identity: FrameIdentity, kind: T): Envelope & {
219
+ readonly kind: T;
220
+ };
221
+ export {};
222
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ /** DOM-free message contracts shared by the Workbench host and preview frames. */
2
+ export const FRAME_PROTOCOL = 'oddkin.frame';
3
+ export const FRAME_PROTOCOL_VERSION = 1;
4
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
5
+ /** True only for finite, acyclic data that can be transferred as plain JSON without coercion. */
6
+ export function isJsonValue(value) {
7
+ const active = new WeakSet();
8
+ const stack = [{ value, exit: false }];
9
+ while (stack.length) {
10
+ const item = stack.pop();
11
+ const current = item.value;
12
+ if (current === null ||
13
+ typeof current === 'string' ||
14
+ typeof current === 'boolean' ||
15
+ (typeof current === 'number' && Number.isFinite(current)))
16
+ continue;
17
+ if (typeof current !== 'object')
18
+ return false;
19
+ if (item.exit) {
20
+ active.delete(current);
21
+ continue;
22
+ }
23
+ if (active.has(current))
24
+ return false;
25
+ const array = Array.isArray(current);
26
+ if (array ? Object.getPrototypeOf(current) !== Array.prototype : !isRecord(current))
27
+ return false;
28
+ if (!array) {
29
+ const prototype = Object.getPrototypeOf(current);
30
+ if (prototype !== Object.prototype && prototype !== null)
31
+ return false;
32
+ }
33
+ active.add(current);
34
+ stack.push({ value: current, exit: true });
35
+ const keys = Reflect.ownKeys(current);
36
+ if (array) {
37
+ const list = current;
38
+ if (keys.length !== list.length + 1 || !keys.includes('length'))
39
+ return false;
40
+ for (let i = 0; i < list.length; i++) {
41
+ const descriptor = Object.getOwnPropertyDescriptor(list, String(i));
42
+ if (!descriptor?.enumerable || !('value' in descriptor))
43
+ return false;
44
+ stack.push({ value: descriptor.value, exit: false });
45
+ }
46
+ continue;
47
+ }
48
+ for (const key of keys) {
49
+ if (typeof key !== 'string')
50
+ return false;
51
+ const descriptor = Object.getOwnPropertyDescriptor(current, key);
52
+ if (!descriptor?.enumerable || !('value' in descriptor))
53
+ return false;
54
+ stack.push({ value: descriptor.value, exit: false });
55
+ }
56
+ }
57
+ return true;
58
+ }
59
+ const isPositiveInteger = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
60
+ const isStringRecord = (value) => isRecord(value) && Object.values(value).every((item) => typeof item === 'string');
61
+ /** A CSS custom property name: `--` and at least one more character, no spaces or colons. */
62
+ export const isCustomPropertyName = (value) => typeof value === 'string' && /^--[^\s:;{}]+$/.test(value);
63
+ export const isExampleId = (value) => typeof value === 'string' && /^example:[^/]+\/[^/]+$/.test(value);
64
+ const isEventId = (value) => typeof value === 'string' && /^event:[^#]+#[^#]+$/.test(value);
65
+ function isFrameSettings(value) {
66
+ if (!isRecord(value))
67
+ return false;
68
+ if (value['direction'] !== undefined &&
69
+ value['direction'] !== 'ltr' &&
70
+ value['direction'] !== 'rtl')
71
+ return false;
72
+ if (value['mode'] !== undefined && value['mode'] !== 'light' && value['mode'] !== 'dark')
73
+ return false;
74
+ for (const key of ['density', 'product', 'profile'])
75
+ if (value[key] !== undefined && typeof value[key] !== 'string')
76
+ return false;
77
+ for (const key of ['viewport', 'container']) {
78
+ const size = value[key];
79
+ if (size === undefined)
80
+ continue;
81
+ if (!isRecord(size) ||
82
+ typeof size['width'] !== 'number' ||
83
+ !Number.isFinite(size['width']) ||
84
+ size['width'] <= 0)
85
+ return false;
86
+ if (size['height'] !== undefined &&
87
+ (typeof size['height'] !== 'number' ||
88
+ !Number.isFinite(size['height']) ||
89
+ size['height'] <= 0))
90
+ return false;
91
+ }
92
+ return true;
93
+ }
94
+ export function isFrameMountPayload(value) {
95
+ if (!isRecord(value) ||
96
+ typeof value['tag'] !== 'string' ||
97
+ typeof value['registration'] !== 'string' ||
98
+ !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/.test(value['tag']) ||
99
+ !isExampleId(value['example']) ||
100
+ !value['example'].startsWith(`example:${value['tag']}/`))
101
+ return false;
102
+ if (value['properties'] !== undefined && !isJsonValue(value['properties']))
103
+ return false;
104
+ if (value['attributes'] !== undefined) {
105
+ const attributes = value['attributes'];
106
+ if (!isRecord(attributes) ||
107
+ !Object.values(attributes).every((item) => item === null || typeof item === 'string'))
108
+ return false;
109
+ }
110
+ if (value['slots'] !== undefined && !isStringRecord(value['slots']))
111
+ return false;
112
+ if (value['fixture'] !== undefined && typeof value['fixture'] !== 'string')
113
+ return false;
114
+ if (value['styles'] !== undefined &&
115
+ (!isStringRecord(value['styles']) || !Object.keys(value['styles']).every(isCustomPropertyName)))
116
+ return false;
117
+ if (value['events'] !== undefined &&
118
+ (!Array.isArray(value['events']) || !value['events'].every((item) => typeof item === 'string')))
119
+ return false;
120
+ if (value['sync'] !== undefined &&
121
+ (!Array.isArray(value['sync']) ||
122
+ !value['sync'].every((pair) => isRecord(pair) &&
123
+ typeof pair['property'] === 'string' &&
124
+ typeof pair['event'] === 'string')))
125
+ return false;
126
+ return value['settings'] === undefined || isFrameSettings(value['settings']);
127
+ }
128
+ export function isFrameSpecimenPayload(value) {
129
+ return (isRecord(value) &&
130
+ Array.isArray(value['items']) &&
131
+ value['items'].every((item) => isFrameMountPayload(item) &&
132
+ typeof item['role'] === 'string' &&
133
+ typeof item['label'] === 'string') &&
134
+ (value['settings'] === undefined || isFrameSettings(value['settings'])));
135
+ }
136
+ /** Validates the common envelope and its JSON payload, without accepting a specific version. */
137
+ export function isFrameMessage(value) {
138
+ if (!isRecord(value))
139
+ return false;
140
+ if (value['protocol'] !== FRAME_PROTOCOL ||
141
+ !Number.isSafeInteger(value['version']) ||
142
+ typeof value['frame'] !== 'string' ||
143
+ value['frame'].length === 0 ||
144
+ !isPositiveInteger(value['generation']) ||
145
+ typeof value['kind'] !== 'string')
146
+ return false;
147
+ const hasPayload = Object.hasOwn(value, 'payload');
148
+ if (hasPayload && !isJsonValue(value['payload']))
149
+ return false;
150
+ switch (value['kind']) {
151
+ case 'hello':
152
+ case 'connect':
153
+ return !Object.hasOwn(value, 'id') && !Object.hasOwn(value, 'replyTo');
154
+ case 'mount':
155
+ case 'specimen':
156
+ case 'set':
157
+ case 'slot':
158
+ case 'reset':
159
+ case 'theme':
160
+ case 'settings':
161
+ case 'dispose':
162
+ case 'inspect':
163
+ return isPositiveInteger(value['id']) && !Object.hasOwn(value, 'replyTo');
164
+ case 'reply':
165
+ return (isPositiveInteger(value['replyTo']) &&
166
+ !(Object.hasOwn(value, 'payload') && Object.hasOwn(value, 'error')) &&
167
+ (!Object.hasOwn(value, 'error') ||
168
+ (isRecord(value['error']) &&
169
+ typeof value['error']['code'] === 'string' &&
170
+ typeof value['error']['message'] === 'string')));
171
+ case 'event':
172
+ case 'error':
173
+ case 'state':
174
+ case 'size':
175
+ return !Object.hasOwn(value, 'id') && !Object.hasOwn(value, 'replyTo');
176
+ default:
177
+ return false;
178
+ }
179
+ }
180
+ export function isCompatibleFrameMessage(value) {
181
+ return isFrameMessage(value) && value.version === FRAME_PROTOCOL_VERSION;
182
+ }
183
+ export const isFrameHello = (value) => isCompatibleFrameMessage(value) && value.kind === 'hello';
184
+ export function isInspectPreviewRequest(value) {
185
+ if (!isRecord(value) || !isExampleId(value['example']))
186
+ return false;
187
+ if ((value['settings'] !== undefined && !isFrameSettings(value['settings'])) ||
188
+ (value['properties'] !== undefined && !isJsonValue(value['properties'])) ||
189
+ (value['slots'] !== undefined && !isStringRecord(value['slots'])))
190
+ return false;
191
+ const limits = value['limits'];
192
+ if (limits !== undefined &&
193
+ (!isRecord(limits) ||
194
+ !['errors', 'events', 'state', 'checks'].every((key) => {
195
+ const limit = limits[key];
196
+ return (limit === undefined ||
197
+ (typeof limit === 'number' && Number.isSafeInteger(limit) && limit >= 0));
198
+ })))
199
+ return false;
200
+ const interactions = value['interactions'];
201
+ return (interactions === undefined ||
202
+ (Array.isArray(interactions) &&
203
+ interactions.every((item) => isRecord(item) &&
204
+ isEventId(item['id']) &&
205
+ typeof item['event'] === 'string' &&
206
+ (item['target'] === undefined || typeof item['target'] === 'string'))));
207
+ }
208
+ export function isFrameRequest(value) {
209
+ if (!isCompatibleFrameMessage(value))
210
+ return false;
211
+ if (![
212
+ 'mount',
213
+ 'specimen',
214
+ 'set',
215
+ 'slot',
216
+ 'reset',
217
+ 'theme',
218
+ 'settings',
219
+ 'dispose',
220
+ 'inspect',
221
+ ].includes(value.kind))
222
+ return false;
223
+ const request = value;
224
+ switch (request.kind) {
225
+ case 'mount':
226
+ return isFrameMountPayload(request.payload);
227
+ case 'specimen':
228
+ return isFrameSpecimenPayload(request.payload);
229
+ case 'set': {
230
+ if (!isRecord(request.payload))
231
+ return false;
232
+ const hasProperty = typeof request.payload['property'] === 'string';
233
+ const hasAttribute = typeof request.payload['attribute'] === 'string';
234
+ const hasCss = request.payload['cssProperty'] !== undefined;
235
+ if (Number(hasProperty) + Number(hasAttribute) + Number(hasCss) !== 1)
236
+ return false;
237
+ if (hasCss)
238
+ return (isCustomPropertyName(request.payload['cssProperty']) &&
239
+ (request.payload['cssValue'] === null || typeof request.payload['cssValue'] === 'string'));
240
+ return hasProperty
241
+ ? (request.payload['unset'] === true ||
242
+ (Object.hasOwn(request.payload, 'value') && isJsonValue(request.payload['value']))) &&
243
+ (request.payload['unset'] !== true || !Object.hasOwn(request.payload, 'value'))
244
+ : request.payload['attributeValue'] === null ||
245
+ typeof request.payload['attributeValue'] === 'string';
246
+ }
247
+ case 'slot':
248
+ return (isRecord(request.payload) &&
249
+ typeof request.payload['name'] === 'string' &&
250
+ typeof request.payload['text'] === 'string');
251
+ case 'reset':
252
+ case 'dispose':
253
+ return !Object.hasOwn(request, 'payload');
254
+ case 'theme':
255
+ return isRecord(request.payload) && typeof request.payload['cssText'] === 'string';
256
+ case 'settings':
257
+ return isFrameSettings(request.payload);
258
+ case 'inspect':
259
+ return isInspectPreviewRequest(request.payload);
260
+ }
261
+ }
262
+ export const isFrameReply = (value) => isCompatibleFrameMessage(value) && value.kind === 'reply';
263
+ export function frameEnvelope(identity, kind) {
264
+ return {
265
+ protocol: FRAME_PROTOCOL,
266
+ version: FRAME_PROTOCOL_VERSION,
267
+ frame: identity.frame,
268
+ generation: identity.generation,
269
+ kind,
270
+ };
271
+ }
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `@oddkin/workbench/testing` — run examples and conformance suites inside the project's own
3
+ * browser test runner. The runner's `expect` and user-input API are passed in, so this entry
4
+ * depends on no test framework. Contract: change-impact-and-verification.md §3.
5
+ */
6
+ import { type Scope } from '@oddkin/core/scope';
7
+ import type { Adapter, ConformanceResult, ConformanceSuite, Expect, UserInput } from '../conformance/index.js';
8
+ import { type ExampleSet } from '../examples/index.js';
9
+ /** Default adapter: anatomy roles are named parts (`part~="role"`) in the shadow root. */
10
+ export declare const partAdapter: Adapter;
11
+ export interface RunConformanceOptions {
12
+ /** Tag of a registered implementation. */
13
+ readonly tag: string;
14
+ readonly expect: Expect;
15
+ readonly user: UserInput;
16
+ readonly adapter?: Adapter;
17
+ /** Recorded with the result (theme, product, density, …). */
18
+ readonly configuration?: Readonly<Record<string, string>>;
19
+ readonly implementation?: {
20
+ readonly package?: string;
21
+ readonly definition?: string;
22
+ };
23
+ /** Run only these case ids; the others are reported `not-executed`. */
24
+ readonly only?: readonly string[];
25
+ }
26
+ /**
27
+ * Run every case of `suite` against `options.tag`. Each case gets a fresh container that is
28
+ * removed afterwards. Failures are recorded, not thrown.
29
+ */
30
+ export declare function runConformance(suite: ConformanceSuite, options: RunConformanceOptions): Promise<ConformanceResult>;
31
+ export interface MountedExample<E extends Element> {
32
+ /** The example's element. */
33
+ readonly element: E;
34
+ /** Holds the element and everything the fixture mounted; `data-example` is the example id. */
35
+ readonly root: HTMLElement;
36
+ /** The scope passed to the fixture. */
37
+ readonly scope: Scope;
38
+ /** Dispose the fixture's scope and templates and remove the root. */
39
+ dispose(): void;
40
+ }
41
+ /**
42
+ * Mount one authored example the way a preview frame does: create the registered element, set
43
+ * its attributes, properties, and slot text, connect it, then run its fixture. The tag (and any
44
+ * element the fixture uses) must already be registered.
45
+ */
46
+ export declare function mountExample<E extends Element>(set: ExampleSet<E>, name: string, container?: HTMLElement): Promise<MountedExample<E>>;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAA2B,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,KAAK,EACV,OAAO,EAGP,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,EAEN,SAAS,EACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElE,0FAA0F;AAC1F,eAAO,MAAM,WAAW,EAAE,OAKzB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,cAAc,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtF,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CA0D5B;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,OAAO;IAC/C,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,qEAAqE;IACrE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,OAAO,EAClD,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,WAA2B,GACrC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAqD5B"}