@rasamjs/core 0.2.0 → 0.3.0

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 (162) hide show
  1. package/API.md +14 -4
  2. package/CHANGELOG.md +59 -0
  3. package/COMPONENTS.md +229 -0
  4. package/README.md +39 -6
  5. package/RELEASING.md +4 -2
  6. package/dist/advanced.d.ts +1 -1
  7. package/dist/advanced.d.ts.map +1 -1
  8. package/dist/catalog/fragment.d.ts +2 -2
  9. package/dist/catalog/fragment.d.ts.map +1 -1
  10. package/dist/catalog/fragment.js.map +1 -1
  11. package/dist/changes/derived.d.ts +10 -0
  12. package/dist/changes/derived.d.ts.map +1 -0
  13. package/dist/changes/derived.js +14 -0
  14. package/dist/changes/derived.js.map +1 -0
  15. package/dist/changes/restore.d.ts.map +1 -1
  16. package/dist/changes/restore.js +22 -4
  17. package/dist/changes/restore.js.map +1 -1
  18. package/dist/changes/service.d.ts +5 -0
  19. package/dist/changes/service.d.ts.map +1 -1
  20. package/dist/changes/service.js +16 -2
  21. package/dist/changes/service.js.map +1 -1
  22. package/dist/components/changes.d.ts +34 -0
  23. package/dist/components/changes.d.ts.map +1 -0
  24. package/dist/components/changes.js +119 -0
  25. package/dist/components/changes.js.map +1 -0
  26. package/dist/components/component.d.ts +62 -0
  27. package/dist/components/component.d.ts.map +1 -0
  28. package/dist/components/component.js +355 -0
  29. package/dist/components/component.js.map +1 -0
  30. package/dist/components/decorators.d.ts +7 -0
  31. package/dist/components/decorators.d.ts.map +1 -0
  32. package/dist/components/decorators.js +81 -0
  33. package/dist/components/decorators.js.map +1 -0
  34. package/dist/components/metadata.d.ts +10 -0
  35. package/dist/components/metadata.d.ts.map +1 -0
  36. package/dist/components/metadata.js +85 -0
  37. package/dist/components/metadata.js.map +1 -0
  38. package/dist/components/registry.d.ts +24 -0
  39. package/dist/components/registry.d.ts.map +1 -0
  40. package/dist/components/registry.js +78 -0
  41. package/dist/components/registry.js.map +1 -0
  42. package/dist/components/types.d.ts +54 -0
  43. package/dist/components/types.d.ts.map +1 -0
  44. package/dist/components/types.js +2 -0
  45. package/dist/components/types.js.map +1 -0
  46. package/dist/components/view.d.ts +9 -0
  47. package/dist/components/view.d.ts.map +1 -0
  48. package/dist/components/view.js +104 -0
  49. package/dist/components/view.js.map +1 -0
  50. package/dist/components.d.ts +6 -0
  51. package/dist/components.d.ts.map +1 -0
  52. package/dist/components.js +5 -0
  53. package/dist/components.js.map +1 -0
  54. package/dist/core/node.d.ts +7 -0
  55. package/dist/core/node.d.ts.map +1 -1
  56. package/dist/core/node.js +30 -0
  57. package/dist/core/node.js.map +1 -1
  58. package/dist/interchange/clone.d.ts.map +1 -1
  59. package/dist/interchange/clone.js +3 -2
  60. package/dist/interchange/clone.js.map +1 -1
  61. package/dist/interchange/reconstruct.d.ts.map +1 -1
  62. package/dist/interchange/reconstruct.js +16 -12
  63. package/dist/interchange/reconstruct.js.map +1 -1
  64. package/dist/interchange/references.d.ts.map +1 -1
  65. package/dist/interchange/references.js +10 -4
  66. package/dist/interchange/references.js.map +1 -1
  67. package/dist/mixins/parent-internals.d.ts +6 -0
  68. package/dist/mixins/parent-internals.d.ts.map +1 -1
  69. package/dist/mixins/parent-internals.js +34 -0
  70. package/dist/mixins/parent-internals.js.map +1 -1
  71. package/dist/mixins/parent.d.ts.map +1 -1
  72. package/dist/mixins/parent.js +6 -1
  73. package/dist/mixins/parent.js.map +1 -1
  74. package/dist/mixins/types.d.ts +2 -2
  75. package/dist/mixins/types.d.ts.map +1 -1
  76. package/dist/resources/references.d.ts +2 -0
  77. package/dist/resources/references.d.ts.map +1 -1
  78. package/dist/resources/references.js +3 -3
  79. package/dist/resources/references.js.map +1 -1
  80. package/dist/services/catalog.d.ts.map +1 -1
  81. package/dist/services/catalog.js +5 -3
  82. package/dist/services/catalog.js.map +1 -1
  83. package/dist/services/defs-manager.d.ts +2 -0
  84. package/dist/services/defs-manager.d.ts.map +1 -1
  85. package/dist/services/defs-manager.js +4 -0
  86. package/dist/services/defs-manager.js.map +1 -1
  87. package/dist/services/element-key.d.ts +4 -0
  88. package/dist/services/element-key.d.ts.map +1 -0
  89. package/dist/services/element-key.js +12 -0
  90. package/dist/services/element-key.js.map +1 -0
  91. package/dist/services/initialization.d.ts +7 -0
  92. package/dist/services/initialization.d.ts.map +1 -0
  93. package/dist/services/initialization.js +27 -0
  94. package/dist/services/initialization.js.map +1 -0
  95. package/dist/services/registry.d.ts +8 -0
  96. package/dist/services/registry.d.ts.map +1 -1
  97. package/dist/services/registry.js +45 -10
  98. package/dist/services/registry.js.map +1 -1
  99. package/dist/services/types.d.ts +17 -0
  100. package/dist/services/types.d.ts.map +1 -1
  101. package/dist/template/parts.d.ts +12 -6
  102. package/dist/template/parts.d.ts.map +1 -1
  103. package/dist/template/parts.js +36 -29
  104. package/dist/template/parts.js.map +1 -1
  105. package/dist/template/render.d.ts +6 -7
  106. package/dist/template/render.d.ts.map +1 -1
  107. package/dist/template/render.js +188 -44
  108. package/dist/template/render.js.map +1 -1
  109. package/dist/template/svg-tag.d.ts +5 -1
  110. package/dist/template/svg-tag.d.ts.map +1 -1
  111. package/dist/template/svg-tag.js.map +1 -1
  112. package/dist/text/internals.d.ts +1 -0
  113. package/dist/text/internals.d.ts.map +1 -1
  114. package/dist/types/common.d.ts +27 -0
  115. package/dist/types/common.d.ts.map +1 -1
  116. package/package.json +156 -148
  117. package/reports/adoption.json +20 -20
  118. package/reports/animation-benchmark.json +612 -612
  119. package/reports/benchmark.json +40 -40
  120. package/reports/components-benchmark-before.json +10 -0
  121. package/reports/components-benchmark.json +10 -0
  122. package/reports/creation.json +26 -26
  123. package/reports/interchange-benchmark.json +85 -85
  124. package/reports/public-api-contract.json +334 -17
  125. package/reports/size-components.json +102 -0
  126. package/reports/size-parity.json +47 -34
  127. package/reports/size.json +6 -4
  128. package/reports/svgjs-comparison.json +3100 -3100
  129. package/reports/svgjs-comparison.md +16 -16
  130. package/reports/svgjs-parity-current.json +135 -42
  131. package/src/advanced.ts +1 -1
  132. package/src/catalog/fragment.ts +2 -2
  133. package/src/changes/derived.ts +19 -0
  134. package/src/changes/restore.ts +27 -4
  135. package/src/changes/service.ts +21 -6
  136. package/src/components/changes.ts +131 -0
  137. package/src/components/component.ts +401 -0
  138. package/src/components/decorators.ts +104 -0
  139. package/src/components/metadata.ts +111 -0
  140. package/src/components/registry.ts +79 -0
  141. package/src/components/types.ts +66 -0
  142. package/src/components/view.ts +123 -0
  143. package/src/components.ts +15 -0
  144. package/src/core/node.ts +32 -1
  145. package/src/interchange/clone.ts +3 -2
  146. package/src/interchange/reconstruct.ts +16 -12
  147. package/src/interchange/references.ts +12 -4
  148. package/src/mixins/parent-internals.ts +37 -0
  149. package/src/mixins/parent.ts +13 -4
  150. package/src/mixins/types.ts +2 -2
  151. package/src/resources/references.ts +5 -5
  152. package/src/services/catalog.ts +5 -3
  153. package/src/services/defs-manager.ts +5 -0
  154. package/src/services/element-key.ts +14 -0
  155. package/src/services/initialization.ts +25 -0
  156. package/src/services/registry.ts +47 -10
  157. package/src/services/types.ts +21 -0
  158. package/src/template/parts.ts +54 -39
  159. package/src/template/render.ts +211 -54
  160. package/src/template/svg-tag.ts +6 -1
  161. package/src/text/internals.ts +1 -0
  162. package/src/types/common.ts +29 -0
@@ -0,0 +1,355 @@
1
+ import { Group } from '../elements/group.js';
2
+ import { beginChangeGroup } from '../changes.js';
3
+ import { derivesChildren, markDerived } from '../changes/derived.js';
4
+ import { initializeElement } from '../services/initialization.js';
5
+ import { definition, isSize, validatePorts, validateProp } from './metadata.js';
6
+ import { ComponentView } from './view.js';
7
+ import { ComponentChanges } from './changes.js';
8
+ import { Attributes } from '../dom/attributes.js';
9
+ export const installField = Symbol('installComponentField');
10
+ export const assertField = Symbol('assertComponentField');
11
+ export const editComponent = Symbol('editComponent');
12
+ export const registerAction = Symbol('registerComponentAction');
13
+ const restoredHooks = new WeakSet();
14
+ const sizes = ['width', 'height'];
15
+ const copy = (value) => value && typeof value === 'object' ? structuredClone(value) : value;
16
+ /** A closed rasam group whose children are rendered from decorated props and live state. */
17
+ export class Component extends Group {
18
+ static ownsChildren = true;
19
+ /** @internal History restores props; the component redraws its children after replay. */
20
+ static [derivesChildren] = true;
21
+ #fields = new Map();
22
+ #view = new ComponentView(this);
23
+ #initialized = false;
24
+ #constructing = true;
25
+ #schedule;
26
+ #observedProps = {};
27
+ #propsCache;
28
+ #propDefinitions;
29
+ #actions = new Map();
30
+ #ports;
31
+ #readingPorts = false;
32
+ #input;
33
+ #reserved;
34
+ constructor(context, input = {}, existing) {
35
+ super(context, {}, existing);
36
+ this.#input = input;
37
+ this.#reserved = new Set(Object.getOwnPropertyNames(this));
38
+ }
39
+ get componentDefinition() {
40
+ return definition(this.constructor);
41
+ }
42
+ get editRules() {
43
+ const { rotate, flip, resize } = this.componentDefinition;
44
+ return Object.freeze({ rotate, flip, resize });
45
+ }
46
+ get propDefinitions() {
47
+ return (this.#propDefinitions ??= Object.freeze([...this.#fields]
48
+ .filter(([, field]) => field.kind === 'prop')
49
+ .map(([name, field]) => Object.freeze({ ...field.options, name, initial: field.initial }))));
50
+ }
51
+ /** `@action` methods with their undo labels, in declaration order; overrides relabel. */
52
+ get actionDefinitions() {
53
+ return Object.freeze([...this.#actions].map(([name, label]) => Object.freeze({ name, label })));
54
+ }
55
+ /** @internal The `@action` decorator records each method once per instance. */
56
+ [registerAction](name, label) {
57
+ this.#actions.set(name, label);
58
+ }
59
+ render() {
60
+ throw new TypeError('Components must implement render()');
61
+ }
62
+ /**
63
+ * Override to declare connection points, in local coordinates at 0°, from props and
64
+ * the saved size. Live state never moves a port. Defaults to none.
65
+ */
66
+ ports() {
67
+ return [];
68
+ }
69
+ /** Validated, frozen `ports()`, computed again only when the saved props change. */
70
+ get portDefinitions() {
71
+ const props = this.#readProps();
72
+ if (this.#ports?.props === props)
73
+ return this.#ports.ports;
74
+ this.#readingPorts = true;
75
+ try {
76
+ const ports = validatePorts(this.ports());
77
+ this.#ports = { props, ports };
78
+ return ports;
79
+ }
80
+ finally {
81
+ this.#readingPorts = false;
82
+ }
83
+ }
84
+ created() { }
85
+ destroyed() { }
86
+ changed(_name) { }
87
+ validateAttribute(name, value) {
88
+ super.validateAttribute(name, value);
89
+ if (Attributes.normalizeName(name) === 'data-rasam-props' &&
90
+ #initialized in this &&
91
+ this.#initialized)
92
+ this.#assertProps(parseProps(value));
93
+ }
94
+ setAttributeValue(name, value) {
95
+ if (restoredHooks.has(this) && Attributes.normalizeName(name) === 'data-rasam-props')
96
+ return this;
97
+ return super.setAttributeValue(name, value);
98
+ }
99
+ attrs(values) {
100
+ if (restoredHooks.has(this))
101
+ values = Object.fromEntries(Object.entries(values).filter(([name]) => Attributes.normalizeName(name) !== 'data-rasam-props'));
102
+ return super.attrs(values);
103
+ }
104
+ /** `resize: 'props'` components keep their size as saved `width` and `height` props. */
105
+ get #sized() {
106
+ return this.componentDefinition.resize === 'props';
107
+ }
108
+ width(value) {
109
+ if (!this.#sized)
110
+ return value === undefined ? super.width() : super.width(value);
111
+ return value === undefined ? this.#size('width') : this.size(value, this.#size('height'));
112
+ }
113
+ height(value) {
114
+ if (!this.#sized)
115
+ return value === undefined ? super.height() : super.height(value);
116
+ return value === undefined ? this.#size('height') : this.size(this.#size('width'), value);
117
+ }
118
+ /** For `resize: 'props'`, one undo step that redraws at once, so callers read new bounds. */
119
+ size(width, height) {
120
+ if (!this.#sized)
121
+ return super.size(width, height);
122
+ this.assertLive();
123
+ const next = {
124
+ width: toSize(width),
125
+ height: height === undefined ? undefined : toSize(height),
126
+ };
127
+ const target = {
128
+ width: next.width,
129
+ height: next.height ?? (next.width * this.#size('height')) / this.#size('width'),
130
+ };
131
+ if (restoredHooks.has(this))
132
+ return this;
133
+ if (target.width === this.#size('width') && target.height === this.#size('height'))
134
+ return this;
135
+ this[editComponent](`Resize ${this.componentDefinition.name}`, () => {
136
+ this.setAttributeValue('data-rasam-props', JSON.stringify({ ...this.#readProps(), ...target }));
137
+ });
138
+ if (this.#initialized && this.#notifyProps())
139
+ this.#redraw();
140
+ return this;
141
+ }
142
+ #size(name) {
143
+ const saved = this.#readProps()[name] ?? this.#input[name];
144
+ return isSize(saved) ? saved : this.componentDefinition[name];
145
+ }
146
+ resetState() {
147
+ this.assertLive();
148
+ for (const [name, field] of this.#fields)
149
+ if (field.kind === 'state')
150
+ Reflect.set(this, name, copy(field.initial));
151
+ }
152
+ /** @internal Called after decorated fields and reconstructed children are available. */
153
+ [initializeElement]() {
154
+ if (this.#initialized)
155
+ return;
156
+ const metadata = this.componentDefinition;
157
+ const saved = this.#readProps();
158
+ const rawVersion = this.getAttributeValue('data-rasam-version');
159
+ const version = rawVersion === undefined ? metadata.version : Number(rawVersion);
160
+ if (!Number.isInteger(version) || version < 1 || version > metadata.version)
161
+ throw new TypeError(`Unsupported ${metadata.type} component version: ${rawVersion}`);
162
+ if (version < metadata.version && !metadata.migrate)
163
+ throw new TypeError(`No migration for ${metadata.type} version ${version}`);
164
+ const values = version < metadata.version ? metadata.migrate(saved, version) : saved;
165
+ this.#assertProps(values);
166
+ this.#assertProps(this.#input);
167
+ const props = {};
168
+ for (const [name, field] of this.#fields)
169
+ if (field.kind === 'prop') {
170
+ const value = Object.hasOwn(this.#input, name)
171
+ ? this.#input[name]
172
+ : Object.hasOwn(values, name)
173
+ ? values[name]
174
+ : field.initial;
175
+ validateProp(value, field.initial, field.options, name);
176
+ props[name] = value;
177
+ }
178
+ if (metadata.resize === 'props')
179
+ for (const name of sizes)
180
+ props[name] = (this.#input[name] ?? values[name] ?? metadata[name]);
181
+ this.#initialized = true;
182
+ if (!this.context.changes.replaying) {
183
+ this.setAttributeValue('data-rasam-version', metadata.version);
184
+ this.setAttributeValue('data-rasam-props', JSON.stringify(props));
185
+ this.#redraw();
186
+ }
187
+ this.#observedProps = this.#readProps();
188
+ const changes = ComponentChanges.for(this);
189
+ const binding = {
190
+ node: this,
191
+ derive: () => {
192
+ if (this.#notifyProps())
193
+ this.#redraw();
194
+ },
195
+ replay: () => {
196
+ this.#notifyProps();
197
+ },
198
+ paint: () => this.#redraw(),
199
+ };
200
+ const stop = changes.bind(binding);
201
+ this.#schedule = () => changes.schedule(binding);
202
+ this.onDispose(() => {
203
+ stop();
204
+ this.destroyed();
205
+ });
206
+ this.context.changes.local(() => {
207
+ if (this.adopting)
208
+ restoredHooks.add(this);
209
+ try {
210
+ this.created();
211
+ }
212
+ finally {
213
+ restoredHooks.delete(this);
214
+ this.#constructing = false;
215
+ }
216
+ // A newly constructed, detached node is not eligible for change derivation yet.
217
+ if (this.#readProps() !== this.#observedProps && this.#notifyProps())
218
+ this.#redraw();
219
+ });
220
+ }
221
+ /** @internal Field decorators install accessors after their initializers execute. */
222
+ [assertField](name) {
223
+ if (name in Component.prototype || this.#fields.has(name) || this.#reserved.has(name))
224
+ throw new TypeError(`Component field conflicts with an inherited rasam member: ${name}`);
225
+ }
226
+ /** @internal Field decorators install accessors after their initializers execute. */
227
+ [installField](name, kind, options, initial) {
228
+ this[assertField](name);
229
+ if (kind === 'prop')
230
+ validateProp(initial, initial, options, name);
231
+ const field = {
232
+ kind,
233
+ options: Object.freeze({
234
+ ...options,
235
+ ...(options.options ? { options: Object.freeze([...options.options]) } : {}),
236
+ }),
237
+ initial: copy(initial),
238
+ value: initial,
239
+ };
240
+ this.#fields.set(name, field);
241
+ this.#propDefinitions = undefined;
242
+ Object.defineProperty(this, name, {
243
+ enumerable: true,
244
+ configurable: false,
245
+ get: () => {
246
+ if (kind === 'state') {
247
+ if (this.#readingPorts)
248
+ throw new TypeError(`ports() cannot read live state: ${name}`);
249
+ return field.value;
250
+ }
251
+ const props = this.#readProps();
252
+ return Object.hasOwn(props, name)
253
+ ? props[name]
254
+ : Object.hasOwn(this.#input, name)
255
+ ? this.#input[name]
256
+ : initial;
257
+ },
258
+ set: (value) => {
259
+ this.assertLive();
260
+ if (kind === 'state') {
261
+ if (Object.is(field.value, value))
262
+ return;
263
+ field.value = value;
264
+ if (this.#initialized) {
265
+ this.changed(name);
266
+ this.#schedule?.();
267
+ }
268
+ return;
269
+ }
270
+ if (restoredHooks.has(this))
271
+ return;
272
+ validateProp(value, initial, options, name);
273
+ if (Object.is(Reflect.get(this, name), value))
274
+ return;
275
+ this[editComponent](`Set ${options.label ?? name}`, () => {
276
+ this.setAttributeValue('data-rasam-props', JSON.stringify({ ...this.#readProps(), [name]: value }));
277
+ });
278
+ },
279
+ });
280
+ }
281
+ /** @internal Actions share one change group across nested calls and instances. */
282
+ [editComponent](label, callback) {
283
+ this.assertLive();
284
+ if (this.#constructing || this.context.changes.currentGroup !== undefined)
285
+ return callback();
286
+ const group = beginChangeGroup(this, { source: 'components', label });
287
+ try {
288
+ const result = group.run(callback);
289
+ if (result && typeof result.then === 'function')
290
+ throw new TypeError('Component actions must be synchronous');
291
+ group.end();
292
+ return result;
293
+ }
294
+ catch (error) {
295
+ try {
296
+ group.cancel();
297
+ }
298
+ catch (rollback) {
299
+ throw new AggregateError([error, rollback], 'Component edit and rollback failed');
300
+ }
301
+ throw error;
302
+ }
303
+ }
304
+ #readProps() {
305
+ // Retain ordinary field-read semantics for destroyed() and post-disposal inspection.
306
+ const raw = this.attributes.get('data-rasam-props');
307
+ if (this.#propsCache && this.#propsCache.raw === raw)
308
+ return this.#propsCache.props;
309
+ this.#propsCache = { raw, props: Object.freeze(parseProps(raw)) };
310
+ return this.#propsCache.props;
311
+ }
312
+ #assertProps(props) {
313
+ if (!props || typeof props !== 'object' || Array.isArray(props))
314
+ throw new TypeError('Component props must be an object');
315
+ for (const [name, value] of Object.entries(props)) {
316
+ if (this.#sized && sizes.includes(name)) {
317
+ if (!isSize(value))
318
+ throw new RangeError(`Component ${name} must be a positive number`);
319
+ continue;
320
+ }
321
+ const field = this.#fields.get(name);
322
+ if (!field || field.kind !== 'prop')
323
+ throw new TypeError(`Unknown component prop: ${name}`);
324
+ validateProp(value, field.initial, field.options, name);
325
+ }
326
+ }
327
+ #notifyProps() {
328
+ const props = this.#readProps(), previous = this.#observedProps;
329
+ if (props === previous)
330
+ return false;
331
+ this.#observedProps = props;
332
+ const names = [...this.propDefinitions.map((field) => field.name), ...sizes].filter((name) => !Object.is(previous[name], props[name]));
333
+ for (const name of names)
334
+ this.changed(name);
335
+ return names.length > 0;
336
+ }
337
+ #redraw() {
338
+ this.withOwnChildren(() => this.#view.render(this.render()));
339
+ markDerived(this);
340
+ }
341
+ }
342
+ /** Sizes are user units of at least 1, so a collapsing resize never reaches zero. */
343
+ function toSize(value) {
344
+ const size = typeof value === 'number' ? value : Number(value);
345
+ if (!Number.isFinite(size) || size < 0)
346
+ throw new RangeError('Component sizes must be finite non-negative numbers');
347
+ return Math.max(size, 1);
348
+ }
349
+ function parseProps(raw) {
350
+ const props = raw == null ? {} : JSON.parse(String(raw));
351
+ if (!props || typeof props !== 'object' || Array.isArray(props))
352
+ throw new TypeError('Component props must be a JSON object');
353
+ return props;
354
+ }
355
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/components/component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Component } from './component.js';
2
+ import type { ComponentClass, ComponentOptions, PropOptions } from './types.js';
3
+ export declare function component(options: ComponentOptions): <Class extends ComponentClass>(target: Class, _context: ClassDecoratorContext<Class>) => Class;
4
+ export declare function prop(options?: PropOptions): <Host extends Component, Value>(_target: undefined, context: ClassFieldDecoratorContext<Host, Value>) => (this: Host, value: Value) => Value;
5
+ export declare function state(): <Host extends Component, Value>(_target: undefined, context: ClassFieldDecoratorContext<Host, Value>) => (this: Host, value: Value) => Value;
6
+ export declare function action(label: string): <Host extends Component, Args extends unknown[], Result>(method: (this: Host, ...args: Args) => Result, context: ClassMethodDecoratorContext<Host, (this: Host, ...args: Args) => Result>) => (this: Host, ...args: Args) => Result;
7
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/components/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAKV,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhF,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,IACzC,KAAK,SAAS,cAAc,UAC1B,KAAK,YACH,qBAAqB,CAAC,KAAK,CAAC,KACrC,KAAK,CAkCT;AAwBD,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,IArBpC,IAAI,SAAS,SAAS,EAAE,KAAK,WAC1B,SAAS,WACT,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,YAYzB,IAAI,SAAS,KAAK,KAAG,KAAK,CASpD;AACD,wBAAgB,KAAK,KAxBX,IAAI,SAAS,SAAS,EAAE,KAAK,WAC1B,SAAS,WACT,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,YAYzB,IAAI,SAAS,KAAK,KAAG,KAAK,CAYpD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,IAC1B,IAAI,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,UACpD,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,WACpC,2BAA2B,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,YAc1D,IAAI,WAAW,IAAI,KAAG,MAAM,CAItD"}
@@ -0,0 +1,81 @@
1
+ import { Component, installField, assertField, editComponent, registerAction, } from './component.js';
2
+ import { defineComponent } from './metadata.js';
3
+ import { initializeElement } from '../services/initialization.js';
4
+ import { destroySubtrees } from '../core/destruction.js';
5
+ import { withInternalStructure } from '../mixins/parent-internals.js';
6
+ export function component(options) {
7
+ return (target, _context) => {
8
+ if (!(target.prototype instanceof Component))
9
+ throw new TypeError('@component requires extends Component');
10
+ const Base = target;
11
+ const Decorated = class extends Base {
12
+ constructor(...args) {
13
+ const context = args[0], before = new Set(context.registry.nodes);
14
+ try {
15
+ super(...args);
16
+ if (new.target === Decorated && !this.adopting)
17
+ this[initializeElement]();
18
+ }
19
+ catch (error) {
20
+ const created = context.registry.nodes.filter((node) => !before.has(node));
21
+ if (created.length) {
22
+ try {
23
+ withInternalStructure(() => created[0][destroySubtrees](created));
24
+ }
25
+ catch (cleanup) {
26
+ throw new AggregateError([error, cleanup], 'Component construction and cleanup failed');
27
+ }
28
+ }
29
+ throw error;
30
+ }
31
+ }
32
+ };
33
+ // Inherit edit rules from the decorated application base, not this wrapper's implementation base.
34
+ defineComponent(Decorated, options);
35
+ Object.defineProperty(Decorated, 'variant', {
36
+ value: Object.freeze({ attribute: 'data-rasam-component', value: options.type }),
37
+ });
38
+ return Decorated;
39
+ };
40
+ }
41
+ function field(kind, options) {
42
+ return (_target, context) => {
43
+ if (context.kind !== 'field' ||
44
+ context.private ||
45
+ context.static ||
46
+ typeof context.name !== 'string')
47
+ throw new TypeError(`@${kind} requires a public instance field`);
48
+ context.addInitializer(function () {
49
+ this[installField](context.name, kind, options, context.access.get(this));
50
+ });
51
+ return function (value) {
52
+ // Validate before the JS field definition can overwrite a base instance member.
53
+ this[assertField](context.name);
54
+ return value;
55
+ };
56
+ };
57
+ }
58
+ export function prop(options = {}) {
59
+ return field('prop', options);
60
+ }
61
+ export function state() {
62
+ return field('state', {});
63
+ }
64
+ export function action(label) {
65
+ return (method, context) => {
66
+ if (context.static ||
67
+ context.private ||
68
+ typeof context.name !== 'string' ||
69
+ !label.trim() ||
70
+ method.constructor.name === 'AsyncFunction')
71
+ throw new TypeError('@action requires a synchronous public instance method and label');
72
+ const name = context.name;
73
+ context.addInitializer(function () {
74
+ this[registerAction](name, label);
75
+ });
76
+ return function (...args) {
77
+ return this[editComponent](label, () => method.apply(this, args));
78
+ };
79
+ };
80
+ }
81
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/components/decorators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { PortDefinition } from '../types/common.js';
2
+ import type { ComponentClass, ComponentDefinition, ComponentOptions, PropOptions, PropValue } from './types.js';
3
+ export declare function definition(Constructor: object): ComponentDefinition;
4
+ export declare function defineComponent(Constructor: ComponentClass, options: ComponentOptions): void;
5
+ /** A saved size of a `resize: 'props'` component, in user units. */
6
+ export declare const isSize: (value: unknown) => value is number;
7
+ export declare function validateProp(value: unknown, initial: PropValue, options: PropOptions, name: string): asserts value is PropValue;
8
+ /** Checks what `ports()` returned and freezes a copy with only the known fields. */
9
+ export declare function validatePorts(ports: unknown): readonly PortDefinition[];
10
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/components/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACV,MAAM,YAAY,CAAC;AAIpB,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAInE;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CA4C5F;AAED,oEAAoE;AACpE,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,KAAK,IAAI,MACiB,CAAC;AAEnE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,KAAK,IAAI,SAAS,CAc5B;AAID,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,cAAc,EAAE,CAmBvE"}
@@ -0,0 +1,85 @@
1
+ const definitions = new WeakMap();
2
+ export function definition(Constructor) {
3
+ const result = definitions.get(Constructor);
4
+ if (!result)
5
+ throw new TypeError('Component classes require their own @component decorator');
6
+ return result;
7
+ }
8
+ export function defineComponent(Constructor, options) {
9
+ let parent = Object.getPrototypeOf(Constructor);
10
+ while (parent && !definitions.has(parent))
11
+ parent = Object.getPrototypeOf(parent);
12
+ const inherited = definitions.get(parent);
13
+ const result = {
14
+ category: 'General',
15
+ version: 1,
16
+ rotate: 'free',
17
+ flip: true,
18
+ resize: 'scale',
19
+ ...(inherited
20
+ ? {
21
+ rotate: inherited.rotate,
22
+ flip: inherited.flip,
23
+ resize: inherited.resize,
24
+ width: inherited.width,
25
+ height: inherited.height,
26
+ }
27
+ : {}),
28
+ ...options,
29
+ };
30
+ if (result.resize === 'props')
31
+ Object.assign(result, { width: result.width ?? 100, height: result.height ?? 100 });
32
+ if (!/^[a-z][a-z0-9-]*$/.test(result.type) || !result.name?.trim() || !result.category?.trim())
33
+ throw new TypeError('Components need a lowercase type, display name and category');
34
+ if (!Number.isInteger(result.version) || result.version < 1)
35
+ throw new TypeError('Component version must be a positive integer');
36
+ if (result.rotate !== 'free' &&
37
+ result.rotate !== false &&
38
+ (!Number.isFinite(result.rotate) ||
39
+ result.rotate <= 0 ||
40
+ Math.abs(360 / result.rotate - Math.round(360 / result.rotate)) > 1e-8))
41
+ throw new TypeError('Rotation steps must be positive divisors of 360');
42
+ if (typeof result.flip !== 'boolean' || !['scale', 'props', false].includes(result.resize))
43
+ throw new TypeError('Invalid component flip or resize rule');
44
+ if (result.resize === 'props'
45
+ ? !isSize(result.width) || !isSize(result.height)
46
+ : result.width !== undefined || result.height !== undefined)
47
+ throw new TypeError("Default sizes need resize: 'props' and positive finite numbers");
48
+ definitions.set(Constructor, Object.freeze(result));
49
+ }
50
+ /** A saved size of a `resize: 'props'` component, in user units. */
51
+ export const isSize = (value) => typeof value === 'number' && Number.isFinite(value) && value > 0;
52
+ export function validateProp(value, initial, options, name) {
53
+ if (value !== null && !['string', 'number', 'boolean'].includes(typeof value))
54
+ throw new TypeError(`Invalid component prop: ${name}`);
55
+ if (value !== null && initial !== null && typeof value !== typeof initial)
56
+ throw new TypeError(`Wrong type for component prop: ${name}`);
57
+ if (typeof value === 'number' &&
58
+ (!Number.isFinite(value) ||
59
+ value < (options.min ?? -Infinity) ||
60
+ value > (options.max ?? Infinity)))
61
+ throw new RangeError(`Component prop is outside its limits: ${name}`);
62
+ if (options.options && !options.options.includes(value))
63
+ throw new RangeError(`Unknown option for component prop: ${name}`);
64
+ }
65
+ const sides = ['left', 'right', 'top', 'bottom'];
66
+ /** Checks what `ports()` returned and freezes a copy with only the known fields. */
67
+ export function validatePorts(ports) {
68
+ if (!Array.isArray(ports))
69
+ throw new TypeError('Component ports() must return an array');
70
+ const names = new Set();
71
+ return Object.freeze(ports.map((port) => {
72
+ const { name, x, y, side } = port ?? {};
73
+ if (typeof name !== 'string' || !name)
74
+ throw new TypeError('Component port names must be non-empty strings');
75
+ if (names.has(name))
76
+ throw new TypeError(`Duplicate component port: ${name}`);
77
+ names.add(name);
78
+ if (!Number.isFinite(x) || !Number.isFinite(y))
79
+ throw new RangeError(`Component port ${name} needs finite x and y`);
80
+ if (side !== undefined && !sides.includes(side))
81
+ throw new TypeError(`Unknown side for component port ${name}: ${String(side)}`);
82
+ return Object.freeze(side === undefined ? { name, x: x, y: y } : { name, x: x, y: y, side });
83
+ }));
84
+ }
85
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/components/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { AnyNode } from '../core/types.js';
2
+ import type { ParentNode } from '../mixins/types.js';
3
+ import { Component } from './component.js';
4
+ import type { ComponentClass, ComponentDefinition } from './types.js';
5
+ /** Per-drawing type registration, palette metadata, icons and unknown-type warnings. */
6
+ export declare class ComponentTypes {
7
+ private readonly drawing;
8
+ private readonly types;
9
+ private readonly warned;
10
+ private readonly seen;
11
+ private readonly stop;
12
+ constructor(drawing: AnyNode, types?: readonly ComponentClass[]);
13
+ private inspect;
14
+ private warn;
15
+ register(Constructor: ComponentClass): this;
16
+ list(category?: string): readonly ComponentDefinition[];
17
+ get(type: string): ComponentClass | undefined;
18
+ icon(type: string, parent: ParentNode): Component;
19
+ resetState(): void;
20
+ destroy(): void;
21
+ }
22
+ /** Compose with selection's existing filter to keep rendered children closed. */
23
+ export declare function isComponentChild(node: AnyNode): boolean;
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/components/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,wFAAwF;AACxF,qBAAa,cAAc;IAMvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,YACmB,OAAO,EAAE,OAAO,EACjC,KAAK,GAAE,SAAS,cAAc,EAAO,EAStC;IACD,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,IAAI;IAOZ,QAAQ,CAAC,WAAW,EAAE,cAAc,GAAG,IAAI,CAQ1C;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,mBAAmB,EAAE,CAOtD;IACD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE5C;IACD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAIhD;IACD,UAAU,IAAI,IAAI,CAEjB;IACD,OAAO,IAAI,IAAI,CAEd;CACF;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAIvD"}