@meetelise/studio-components 0.0.17 → 0.0.19
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/dist/componentSchema.json +116 -17
- package/dist/components/ContactForm.d.ts.map +1 -1
- package/dist/components/ContactForm.js +4 -1
- package/dist/components/ContactForm.js.map +1 -1
- package/dist/components/LocationsDirectory.d.ts +17 -0
- package/dist/components/LocationsDirectory.d.ts.map +1 -0
- package/dist/components/LocationsDirectory.js +72 -0
- package/dist/components/LocationsDirectory.js.map +1 -0
- package/dist/components/PropertyCard.d.ts +14 -0
- package/dist/components/PropertyCard.d.ts.map +1 -0
- package/dist/components/PropertyCard.js +31 -0
- package/dist/components/PropertyCard.js.map +1 -0
- package/dist/components/PropertyGrid.d.ts +12 -0
- package/dist/components/PropertyGrid.d.ts.map +1 -0
- package/dist/components/PropertyGrid.js +55 -0
- package/dist/components/PropertyGrid.js.map +1 -0
- package/dist/components/ScheduleTour.d.ts.map +1 -1
- package/dist/components/ScheduleTour.js +2 -0
- package/dist/components/ScheduleTour.js.map +1 -1
- package/dist/components/browser/componentMeta.d.ts +1 -1
- package/dist/components/browser/componentMeta.d.ts.map +1 -1
- package/dist/components/browser/componentMeta.js +43 -0
- package/dist/components/browser/componentMeta.js.map +1 -1
- package/dist/components/registry.d.ts.map +1 -1
- package/dist/components/registry.js +6 -2
- package/dist/components/registry.js.map +1 -1
- package/dist/hooks/useProperties.d.ts +58 -0
- package/dist/hooks/useProperties.d.ts.map +1 -0
- package/dist/hooks/useProperties.js +56 -0
- package/dist/hooks/useProperties.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/router.d.ts +2 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +31 -1
- package/dist/router.js.map +1 -1
- package/dist/schema/componentSchema.d.ts +23 -3
- package/dist/schema/componentSchema.d.ts.map +1 -1
- package/dist/schema/componentSchema.js +80 -11
- package/dist/schema/componentSchema.js.map +1 -1
- package/dist/schema/releasePolicy.d.ts +41 -0
- package/dist/schema/releasePolicy.d.ts.map +1 -0
- package/dist/schema/releasePolicy.js +529 -0
- package/dist/schema/releasePolicy.js.map +1 -0
- package/dist/utils/utm.d.ts +17 -0
- package/dist/utils/utm.d.ts.map +1 -0
- package/dist/utils/utm.js +20 -0
- package/dist/utils/utm.js.map +1 -0
- package/package.json +4 -2
- package/dist/components/EliseChat.d.ts +0 -8
- package/dist/components/EliseChat.d.ts.map +0 -1
- package/dist/components/EliseChat.js +0 -22
- package/dist/components/EliseChat.js.map +0 -1
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
import { COMPONENT_KINDS, PROP_KINDS, } from "./componentSchema";
|
|
2
|
+
const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
3
|
+
const SEMVER = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
4
|
+
const PROP_DIFF_KEYS = new Set(["deprecated", "subFields", "item", "options", "allowedComponents"]);
|
|
5
|
+
// Handled by dedicated breaking-aware diff helpers rather than the generic value loop.
|
|
6
|
+
const BREAKING_PROP_KEYS = new Set(["kind", "required"]);
|
|
7
|
+
export function evaluateReleasePolicy(previous, current, options = {}) {
|
|
8
|
+
const today = options.today ?? todayIsoDate();
|
|
9
|
+
const issues = [
|
|
10
|
+
...validateIsoDate(today, "today"),
|
|
11
|
+
...validateComponentSchemaArtifact(current, "current"),
|
|
12
|
+
...(previous ? validateComponentSchemaArtifact(previous, "previous") : []),
|
|
13
|
+
];
|
|
14
|
+
if (issues.length > 0) {
|
|
15
|
+
return {
|
|
16
|
+
ok: false,
|
|
17
|
+
classification: "validation-failed",
|
|
18
|
+
changes: [],
|
|
19
|
+
blockedRemovals: [],
|
|
20
|
+
issues,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (!previous) {
|
|
24
|
+
return {
|
|
25
|
+
ok: true,
|
|
26
|
+
classification: "first-publish",
|
|
27
|
+
releaseType: "patch",
|
|
28
|
+
changes: [],
|
|
29
|
+
blockedRemovals: [],
|
|
30
|
+
issues: [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const changes = diffSchemaArtifacts(previous, current);
|
|
34
|
+
const gateIssues = [];
|
|
35
|
+
const blockedRemovals = [];
|
|
36
|
+
let hasAllowedBreakingChange = false;
|
|
37
|
+
for (const change of changes) {
|
|
38
|
+
if (change.kind !== "removed" && !change.breaking) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const issues = validateBreakingGate(change, today);
|
|
42
|
+
if (issues.length > 0) {
|
|
43
|
+
blockedRemovals.push(change);
|
|
44
|
+
gateIssues.push(...issues);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
hasAllowedBreakingChange = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (blockedRemovals.length > 0) {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
classification: "blocked-removal",
|
|
54
|
+
changes,
|
|
55
|
+
blockedRemovals,
|
|
56
|
+
issues: gateIssues,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
classification: changes.length === 0 ? "no-schema-change" : "schema-change",
|
|
62
|
+
releaseType: resolveReleaseType(changes.length, hasAllowedBreakingChange),
|
|
63
|
+
changes,
|
|
64
|
+
blockedRemovals: [],
|
|
65
|
+
issues: [],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function resolveReleaseType(changeCount, hasAllowedBreakingChange) {
|
|
69
|
+
if (hasAllowedBreakingChange) {
|
|
70
|
+
return "major";
|
|
71
|
+
}
|
|
72
|
+
return changeCount === 0 ? "patch" : "minor";
|
|
73
|
+
}
|
|
74
|
+
export function diffSchemaArtifacts(previous, current) {
|
|
75
|
+
const changes = [];
|
|
76
|
+
if (previous.schemaVersion !== current.schemaVersion) {
|
|
77
|
+
changes.push({
|
|
78
|
+
kind: "changed",
|
|
79
|
+
path: "schemaVersion",
|
|
80
|
+
message: `schemaVersion changed from ${previous.schemaVersion} to ${current.schemaVersion}`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const previousComponents = previous.components;
|
|
84
|
+
const currentComponents = current.components;
|
|
85
|
+
for (const name of sortedKeys(previousComponents)) {
|
|
86
|
+
const path = componentPath(name);
|
|
87
|
+
if (!(name in currentComponents)) {
|
|
88
|
+
changes.push({
|
|
89
|
+
kind: "removed",
|
|
90
|
+
path,
|
|
91
|
+
message: `component removed: ${name}`,
|
|
92
|
+
deprecation: previousComponents[name].deprecated,
|
|
93
|
+
});
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
diffComponentSpec(previousComponents[name], currentComponents[name], path, changes);
|
|
97
|
+
}
|
|
98
|
+
for (const name of sortedKeys(currentComponents)) {
|
|
99
|
+
if (!(name in previousComponents)) {
|
|
100
|
+
changes.push({
|
|
101
|
+
kind: "added",
|
|
102
|
+
path: componentPath(name),
|
|
103
|
+
message: `component added: ${name}`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return changes;
|
|
108
|
+
}
|
|
109
|
+
export function validateComponentSchemaArtifact(artifact, path = "schema") {
|
|
110
|
+
if (!isRecord(artifact)) {
|
|
111
|
+
return [{ path, message: "schema artifact must be an object" }];
|
|
112
|
+
}
|
|
113
|
+
const issues = [];
|
|
114
|
+
if (typeof artifact.schemaVersion !== "number" || !Number.isInteger(artifact.schemaVersion)) {
|
|
115
|
+
issues.push({ path: `${path}.schemaVersion`, message: "schemaVersion must be an integer" });
|
|
116
|
+
}
|
|
117
|
+
if (!isRecord(artifact.components)) {
|
|
118
|
+
issues.push({ path: `${path}.components`, message: "components must be an object" });
|
|
119
|
+
return issues;
|
|
120
|
+
}
|
|
121
|
+
for (const [name, spec] of Object.entries(artifact.components)) {
|
|
122
|
+
issues.push(...validateComponentSpec(spec, `${path}.components.${name}`));
|
|
123
|
+
}
|
|
124
|
+
return issues;
|
|
125
|
+
}
|
|
126
|
+
export function validateDeprecationMetadata(metadata, path = "deprecated") {
|
|
127
|
+
if (!isRecord(metadata)) {
|
|
128
|
+
return [{ path, message: "deprecation metadata must be an object" }];
|
|
129
|
+
}
|
|
130
|
+
const issues = [];
|
|
131
|
+
if (typeof metadata.sinceVersion !== "string" || metadata.sinceVersion.trim() === "") {
|
|
132
|
+
issues.push({ path: `${path}.sinceVersion`, message: "sinceVersion is required" });
|
|
133
|
+
}
|
|
134
|
+
else if (!SEMVER.test(metadata.sinceVersion)) {
|
|
135
|
+
issues.push({ path: `${path}.sinceVersion`, message: "sinceVersion must be a semver string" });
|
|
136
|
+
}
|
|
137
|
+
if (typeof metadata.removeAfter !== "string") {
|
|
138
|
+
issues.push({ path: `${path}.removeAfter`, message: "removeAfter is required" });
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
issues.push(...validateIsoDate(metadata.removeAfter, `${path}.removeAfter`));
|
|
142
|
+
}
|
|
143
|
+
if (typeof metadata.reason !== "string" || metadata.reason.trim() === "") {
|
|
144
|
+
issues.push({ path: `${path}.reason`, message: "reason is required" });
|
|
145
|
+
}
|
|
146
|
+
if (metadata.replacement !== undefined &&
|
|
147
|
+
(typeof metadata.replacement !== "string" || metadata.replacement.trim() === "")) {
|
|
148
|
+
issues.push({ path: `${path}.replacement`, message: "replacement must be a non-empty string" });
|
|
149
|
+
}
|
|
150
|
+
const breakingChangePath = `${path}.breakingChange`;
|
|
151
|
+
if (!isRecord(metadata.breakingChange)) {
|
|
152
|
+
issues.push({ path: breakingChangePath, message: "breakingChange is required" });
|
|
153
|
+
return issues;
|
|
154
|
+
}
|
|
155
|
+
for (const field of ["id", "summary", "migration"]) {
|
|
156
|
+
const value = metadata.breakingChange[field];
|
|
157
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
158
|
+
issues.push({ path: `${breakingChangePath}.${field}`, message: `${field} is required` });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return issues;
|
|
162
|
+
}
|
|
163
|
+
function diffComponentSpec(previous, current, path, changes) {
|
|
164
|
+
// A component's authoring taxonomy bucket retype reinterprets every stored instance.
|
|
165
|
+
diffValue(previous.kind, current.kind, `${path}.kind`, changes, {
|
|
166
|
+
breakingOnChange: true,
|
|
167
|
+
deprecation: previous.deprecated,
|
|
168
|
+
});
|
|
169
|
+
diffValue(previous.category, current.category, `${path}.category`, changes);
|
|
170
|
+
diffValue(previous.description, current.description, `${path}.description`, changes);
|
|
171
|
+
diffAcceptsChildren(previous.acceptsChildren, current.acceptsChildren, `${path}.acceptsChildren`, previous.deprecated, changes);
|
|
172
|
+
diffValue(previous.needsApi, current.needsApi, `${path}.needsApi`, changes);
|
|
173
|
+
diffValue(previous.isDirective, current.isDirective, `${path}.isDirective`, changes);
|
|
174
|
+
diffDeprecation(previous.deprecated, current.deprecated, `${path}.deprecated`, changes);
|
|
175
|
+
diffPropMap(previous.props, current.props, `${path}.props`, changes);
|
|
176
|
+
}
|
|
177
|
+
function diffPropMap(previous, current, path, changes) {
|
|
178
|
+
for (const name of sortedKeys(previous)) {
|
|
179
|
+
const propPath = `${path}.${name}`;
|
|
180
|
+
if (!(name in current)) {
|
|
181
|
+
changes.push({
|
|
182
|
+
kind: "removed",
|
|
183
|
+
path: propPath,
|
|
184
|
+
message: `prop removed: ${propPath}`,
|
|
185
|
+
deprecation: previous[name].deprecated,
|
|
186
|
+
});
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
diffPropSpec(previous[name], current[name], propPath, changes);
|
|
190
|
+
}
|
|
191
|
+
for (const name of sortedKeys(current)) {
|
|
192
|
+
if (!(name in previous)) {
|
|
193
|
+
changes.push({
|
|
194
|
+
kind: "added",
|
|
195
|
+
path: `${path}.${name}`,
|
|
196
|
+
message: `prop added: ${path}.${name}`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function diffPropSpec(previous, current, path, changes) {
|
|
202
|
+
const keys = new Set([...Object.keys(previous), ...Object.keys(current)]);
|
|
203
|
+
for (const key of keys) {
|
|
204
|
+
if (PROP_DIFF_KEYS.has(key) || BREAKING_PROP_KEYS.has(key)) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
diffValue(previous[key], current[key], `${path}.${key}`, changes);
|
|
208
|
+
}
|
|
209
|
+
// A prop retype reinterprets every stored value of that prop.
|
|
210
|
+
diffValue(previous.kind, current.kind, `${path}.kind`, changes, {
|
|
211
|
+
breakingOnChange: true,
|
|
212
|
+
deprecation: previous.deprecated,
|
|
213
|
+
});
|
|
214
|
+
diffRequired(previous.required, current.required, `${path}.required`, previous.deprecated, changes);
|
|
215
|
+
diffDeprecation(previous.deprecated, current.deprecated, `${path}.deprecated`, changes);
|
|
216
|
+
diffStringOrNumberArray(previous.options, current.options, `${path}.options`, previous.deprecated, changes);
|
|
217
|
+
diffStringArray(previous.allowedComponents, current.allowedComponents, `${path}.allowedComponents`, previous.deprecated, changes);
|
|
218
|
+
diffChildProp(previous.item, current.item, `${path}.item`, previous.deprecated, changes);
|
|
219
|
+
if (previous.subFields && current.subFields) {
|
|
220
|
+
diffPropMap(previous.subFields, current.subFields, `${path}.subFields`, changes);
|
|
221
|
+
}
|
|
222
|
+
else if (previous.subFields && !current.subFields) {
|
|
223
|
+
changes.push({
|
|
224
|
+
kind: "removed",
|
|
225
|
+
path: `${path}.subFields`,
|
|
226
|
+
message: `subFields removed: ${path}.subFields`,
|
|
227
|
+
deprecation: previous.deprecated,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
else if (!previous.subFields && current.subFields) {
|
|
231
|
+
changes.push({
|
|
232
|
+
kind: "added",
|
|
233
|
+
path: `${path}.subFields`,
|
|
234
|
+
message: `subFields added: ${path}.subFields`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function diffChildProp(previous, current, path, deprecation, changes) {
|
|
239
|
+
if (previous && current) {
|
|
240
|
+
diffPropSpec(previous, current, path, changes);
|
|
241
|
+
}
|
|
242
|
+
else if (previous && !current) {
|
|
243
|
+
changes.push({
|
|
244
|
+
kind: "removed",
|
|
245
|
+
path,
|
|
246
|
+
message: `item schema removed: ${path}`,
|
|
247
|
+
deprecation,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
else if (!previous && current) {
|
|
251
|
+
changes.push({
|
|
252
|
+
kind: "added",
|
|
253
|
+
path,
|
|
254
|
+
message: `item schema added: ${path}`,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function diffStringOrNumberArray(previous, current, path, deprecation, changes) {
|
|
259
|
+
diffArrayValues(previous, current, path, deprecation, changes);
|
|
260
|
+
}
|
|
261
|
+
function diffStringArray(previous, current, path, deprecation, changes) {
|
|
262
|
+
diffArrayValues(previous, current, path, deprecation, changes);
|
|
263
|
+
}
|
|
264
|
+
function diffArrayValues(previous, current, path, deprecation, changes) {
|
|
265
|
+
if (!previous && !current) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (previous && !current) {
|
|
269
|
+
changes.push({ kind: "removed", path, message: `array removed: ${path}`, deprecation });
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (!previous && current) {
|
|
273
|
+
changes.push({ kind: "added", path, message: `array added: ${path}` });
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const previousValues = previous ?? [];
|
|
277
|
+
const currentValues = current ?? [];
|
|
278
|
+
const previousKeys = new Set(previousValues.map(stableStringify));
|
|
279
|
+
const currentKeys = new Set(currentValues.map(stableStringify));
|
|
280
|
+
const initialChangeCount = changes.length;
|
|
281
|
+
for (const value of previousValues) {
|
|
282
|
+
const key = stableStringify(value);
|
|
283
|
+
if (!currentKeys.has(key)) {
|
|
284
|
+
changes.push({
|
|
285
|
+
kind: "removed",
|
|
286
|
+
path: `${path}[${key}]`,
|
|
287
|
+
message: `array value removed at ${path}: ${key}`,
|
|
288
|
+
deprecation,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
for (const value of currentValues) {
|
|
293
|
+
const key = stableStringify(value);
|
|
294
|
+
if (!previousKeys.has(key)) {
|
|
295
|
+
changes.push({
|
|
296
|
+
kind: "added",
|
|
297
|
+
path: `${path}[${key}]`,
|
|
298
|
+
message: `array value added at ${path}: ${key}`,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (changes.length === initialChangeCount && !deepEqual(previousValues, currentValues)) {
|
|
303
|
+
changes.push({ kind: "changed", path, message: `array order changed: ${path}` });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function diffDeprecation(previous, current, path, changes) {
|
|
307
|
+
if (deepEqual(previous, current)) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
changes.push({
|
|
311
|
+
kind: current && !previous ? "added" : "changed",
|
|
312
|
+
path,
|
|
313
|
+
message: current && !previous ? `deprecation metadata added: ${path}` : `deprecation metadata changed: ${path}`,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
function diffValue(previous, current, path, changes, options = {}) {
|
|
317
|
+
if (deepEqual(previous, current)) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
// Introducing a field for the first time is additive; mutating an existing value may break.
|
|
321
|
+
const kind = previous === undefined ? "added" : "changed";
|
|
322
|
+
const breaking = options.breakingOnChange === true && kind === "changed";
|
|
323
|
+
changes.push({
|
|
324
|
+
kind,
|
|
325
|
+
path,
|
|
326
|
+
message: `schema value changed: ${path}`,
|
|
327
|
+
breaking,
|
|
328
|
+
...(breaking && options.deprecation ? { deprecation: options.deprecation } : {}),
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* `required` tightens to `true` when a previously optional/absent prop becomes mandatory —
|
|
333
|
+
* that invalidates stored instances omitting it. Relaxing back to optional is additive.
|
|
334
|
+
*/
|
|
335
|
+
function diffRequired(previous, current, path, deprecation, changes) {
|
|
336
|
+
const previousRequired = previous === true;
|
|
337
|
+
const currentRequired = current === true;
|
|
338
|
+
if (previousRequired === currentRequired) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
changes.push({
|
|
342
|
+
kind: "changed",
|
|
343
|
+
path,
|
|
344
|
+
message: currentRequired ? `prop became required: ${path}` : `prop became optional: ${path}`,
|
|
345
|
+
breaking: currentRequired,
|
|
346
|
+
...(currentRequired && deprecation ? { deprecation } : {}),
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* `acceptsChildren` narrows — and so breaks authored child trees — when it goes from
|
|
351
|
+
* accepting children to not, or when its `allowedComponents` allowlist drops entries.
|
|
352
|
+
* Going from no children to accepting them, or widening the allowlist, is additive.
|
|
353
|
+
*/
|
|
354
|
+
function diffAcceptsChildren(previous, current, path, deprecation, changes) {
|
|
355
|
+
if (deepEqual(previous, current)) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
const previousAccepts = acceptsAnyChildren(previous);
|
|
359
|
+
const currentAccepts = acceptsAnyChildren(current);
|
|
360
|
+
if (previousAccepts && !currentAccepts) {
|
|
361
|
+
changes.push({
|
|
362
|
+
kind: "changed",
|
|
363
|
+
path,
|
|
364
|
+
message: `acceptsChildren disabled: ${path}`,
|
|
365
|
+
breaking: true,
|
|
366
|
+
deprecation,
|
|
367
|
+
});
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const previousAllowed = allowedChildComponents(previous);
|
|
371
|
+
const currentAllowed = allowedChildComponents(current);
|
|
372
|
+
// Only an already-accepting parent can narrow its allowlist; false→{allowedComponents}
|
|
373
|
+
// widens (children were forbidden, now some are allowed). An unconstrained allowlist
|
|
374
|
+
// (undefined) accepts everything, so constraining it — or dropping entries — narrows.
|
|
375
|
+
if (previousAccepts && currentAllowed !== undefined) {
|
|
376
|
+
const removed = previousAllowed === undefined
|
|
377
|
+
? []
|
|
378
|
+
: previousAllowed.filter((component) => !currentAllowed.includes(component));
|
|
379
|
+
const narrowed = previousAllowed === undefined || removed.length > 0;
|
|
380
|
+
if (narrowed) {
|
|
381
|
+
changes.push({
|
|
382
|
+
kind: "changed",
|
|
383
|
+
path: `${path}.allowedComponents`,
|
|
384
|
+
message: previousAllowed === undefined
|
|
385
|
+
? `allowedComponents constrained: ${path}.allowedComponents`
|
|
386
|
+
: `allowedComponents narrowed: ${path}.allowedComponents (removed ${removed.join(", ")})`,
|
|
387
|
+
breaking: true,
|
|
388
|
+
deprecation,
|
|
389
|
+
});
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
changes.push({
|
|
394
|
+
kind: "changed",
|
|
395
|
+
path,
|
|
396
|
+
message: `acceptsChildren changed: ${path}`,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
function acceptsAnyChildren(value) {
|
|
400
|
+
return value !== false;
|
|
401
|
+
}
|
|
402
|
+
function allowedChildComponents(value) {
|
|
403
|
+
return typeof value === "object" ? value.allowedComponents : undefined;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Gates removals and in-place breaking mutations: each needs an attached, expired
|
|
407
|
+
* deprecation window. Precondition: `change.deprecation` (when present) originates from
|
|
408
|
+
* the previous artifact, whose deprecation metadata is fully validated by
|
|
409
|
+
* `validateComponentSchemaArtifact(previous)` before any change reaches this gate — so we
|
|
410
|
+
* only re-check the window here, not the metadata shape.
|
|
411
|
+
*/
|
|
412
|
+
function validateBreakingGate(change, today) {
|
|
413
|
+
const path = `${change.path}.deprecated`;
|
|
414
|
+
if (!change.deprecation) {
|
|
415
|
+
return [{ path, message: "breaking schema changes require previous deprecation metadata" }];
|
|
416
|
+
}
|
|
417
|
+
if (change.deprecation.removeAfter > today) {
|
|
418
|
+
return [
|
|
419
|
+
{
|
|
420
|
+
path: `${path}.removeAfter`,
|
|
421
|
+
message: `deprecation window has not expired: ${change.deprecation.removeAfter} > ${today}`,
|
|
422
|
+
},
|
|
423
|
+
];
|
|
424
|
+
}
|
|
425
|
+
return [];
|
|
426
|
+
}
|
|
427
|
+
function validateComponentSpec(spec, path) {
|
|
428
|
+
if (!isRecord(spec)) {
|
|
429
|
+
return [{ path, message: "component spec must be an object" }];
|
|
430
|
+
}
|
|
431
|
+
const issues = [];
|
|
432
|
+
if (!COMPONENT_KINDS.includes(spec.kind)) {
|
|
433
|
+
issues.push({ path: `${path}.kind`, message: "kind must be a valid ComponentKind" });
|
|
434
|
+
}
|
|
435
|
+
for (const field of ["category", "description"]) {
|
|
436
|
+
if (typeof spec[field] !== "string" || spec[field].trim() === "") {
|
|
437
|
+
issues.push({ path: `${path}.${field}`, message: `${field} is required` });
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if (spec.deprecated !== undefined) {
|
|
441
|
+
issues.push(...validateDeprecationMetadata(spec.deprecated, `${path}.deprecated`));
|
|
442
|
+
}
|
|
443
|
+
if (typeof spec.acceptsChildren !== "boolean" && !isRecord(spec.acceptsChildren)) {
|
|
444
|
+
issues.push({
|
|
445
|
+
path: `${path}.acceptsChildren`,
|
|
446
|
+
message: "acceptsChildren must be a boolean or object",
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
if (spec.kind === "directive" && spec.isDirective !== true) {
|
|
450
|
+
issues.push({ path: `${path}.isDirective`, message: "directive components must set isDirective" });
|
|
451
|
+
}
|
|
452
|
+
if (!isRecord(spec.props)) {
|
|
453
|
+
issues.push({ path: `${path}.props`, message: "props must be an object" });
|
|
454
|
+
return issues;
|
|
455
|
+
}
|
|
456
|
+
for (const [name, prop] of Object.entries(spec.props)) {
|
|
457
|
+
issues.push(...validatePropSpec(prop, `${path}.props.${name}`));
|
|
458
|
+
}
|
|
459
|
+
return issues;
|
|
460
|
+
}
|
|
461
|
+
function validatePropSpec(prop, path) {
|
|
462
|
+
if (!isRecord(prop)) {
|
|
463
|
+
return [{ path, message: "prop spec must be an object" }];
|
|
464
|
+
}
|
|
465
|
+
const issues = [];
|
|
466
|
+
if (!PROP_KINDS.includes(prop.kind)) {
|
|
467
|
+
issues.push({ path: `${path}.kind`, message: "kind must be a valid PropKind" });
|
|
468
|
+
}
|
|
469
|
+
if (prop.deprecated !== undefined) {
|
|
470
|
+
issues.push(...validateDeprecationMetadata(prop.deprecated, `${path}.deprecated`));
|
|
471
|
+
}
|
|
472
|
+
if (prop.kind === "enum" && (!Array.isArray(prop.options) || prop.options.length === 0)) {
|
|
473
|
+
issues.push({ path: `${path}.options`, message: "enum props require a non-empty options array" });
|
|
474
|
+
}
|
|
475
|
+
if (prop.kind === "array" && !isRecord(prop.item)) {
|
|
476
|
+
issues.push({ path: `${path}.item`, message: "array props require an item schema" });
|
|
477
|
+
}
|
|
478
|
+
if (prop.kind === "object" && !isRecord(prop.subFields)) {
|
|
479
|
+
issues.push({ path: `${path}.subFields`, message: "object props require subFields" });
|
|
480
|
+
}
|
|
481
|
+
if (isRecord(prop.item)) {
|
|
482
|
+
issues.push(...validatePropSpec(prop.item, `${path}.item`));
|
|
483
|
+
}
|
|
484
|
+
if (isRecord(prop.subFields)) {
|
|
485
|
+
for (const [name, subField] of Object.entries(prop.subFields)) {
|
|
486
|
+
issues.push(...validatePropSpec(subField, `${path}.subFields.${name}`));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return issues;
|
|
490
|
+
}
|
|
491
|
+
function validateIsoDate(value, path) {
|
|
492
|
+
if (!ISO_DATE.test(value)) {
|
|
493
|
+
return [{ path, message: "date must be formatted YYYY-MM-DD" }];
|
|
494
|
+
}
|
|
495
|
+
const parsed = new Date(`${value}T00:00:00.000Z`);
|
|
496
|
+
if (Number.isNaN(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== value) {
|
|
497
|
+
return [{ path, message: "date must be a real calendar date" }];
|
|
498
|
+
}
|
|
499
|
+
return [];
|
|
500
|
+
}
|
|
501
|
+
function todayIsoDate() {
|
|
502
|
+
return new Date().toISOString().slice(0, 10);
|
|
503
|
+
}
|
|
504
|
+
function componentPath(name) {
|
|
505
|
+
return `components.${name}`;
|
|
506
|
+
}
|
|
507
|
+
function sortedKeys(record) {
|
|
508
|
+
return Object.keys(record).sort();
|
|
509
|
+
}
|
|
510
|
+
function deepEqual(left, right) {
|
|
511
|
+
return stableStringify(left) === stableStringify(right);
|
|
512
|
+
}
|
|
513
|
+
function stableStringify(value) {
|
|
514
|
+
if (Array.isArray(value)) {
|
|
515
|
+
return `[${value.map(stableStringify).join(",")}]`;
|
|
516
|
+
}
|
|
517
|
+
if (isRecord(value)) {
|
|
518
|
+
return `{${Object.keys(value)
|
|
519
|
+
.sort()
|
|
520
|
+
.map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)
|
|
521
|
+
.join(",")}}`;
|
|
522
|
+
}
|
|
523
|
+
const serialized = JSON.stringify(value);
|
|
524
|
+
return serialized === undefined ? String(value) : serialized;
|
|
525
|
+
}
|
|
526
|
+
function isRecord(value) {
|
|
527
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=releasePolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releasePolicy.js","sourceRoot":"","sources":["../../src/schema/releasePolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect marketing-attribution params from the current page for lead capture.
|
|
3
|
+
*
|
|
4
|
+
* The Studio API resolves the lead's marketing source from `building_marketing_sources`
|
|
5
|
+
* using these UTM params + referrer (falling back to a default website source). The
|
|
6
|
+
* returned keys match the snake_case fields the prospect endpoints expect, so the result
|
|
7
|
+
* can be spread directly into a request body.
|
|
8
|
+
*/
|
|
9
|
+
export interface UtmParams {
|
|
10
|
+
utm_source?: string;
|
|
11
|
+
utm_medium?: string;
|
|
12
|
+
utm_campaign?: string;
|
|
13
|
+
referrer?: string;
|
|
14
|
+
tracking_url?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function collectUtmParams(): UtmParams;
|
|
17
|
+
//# sourceMappingURL=utm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utm.d.ts","sourceRoot":"","sources":["../../src/utils/utm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,IAAI,SAAS,CAiB5C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function collectUtmParams() {
|
|
2
|
+
if (typeof window === "undefined")
|
|
3
|
+
return {};
|
|
4
|
+
const out = {};
|
|
5
|
+
const params = new URLSearchParams(window.location.search);
|
|
6
|
+
const utmSource = params.get("utm_source");
|
|
7
|
+
const utmMedium = params.get("utm_medium");
|
|
8
|
+
const utmCampaign = params.get("utm_campaign");
|
|
9
|
+
if (utmSource)
|
|
10
|
+
out.utm_source = utmSource;
|
|
11
|
+
if (utmMedium)
|
|
12
|
+
out.utm_medium = utmMedium;
|
|
13
|
+
if (utmCampaign)
|
|
14
|
+
out.utm_campaign = utmCampaign;
|
|
15
|
+
if (typeof document !== "undefined" && document.referrer)
|
|
16
|
+
out.referrer = document.referrer;
|
|
17
|
+
out.tracking_url = window.location.href;
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=utm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utm.js","sourceRoot":"","sources":["../../src/utils/utm.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE/C,IAAI,SAAS;QAAE,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;IAC1C,IAAI,SAAS;QAAE,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;IAC1C,IAAI,WAAW;QAAE,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC;IAChD,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ;QAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAE3F,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meetelise/studio-components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.19",
|
|
4
4
|
"description": "Elise Studio component library — renderer, layout primitives, and data-fetching components for property websites",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,8 +41,9 @@
|
|
|
41
41
|
"dist"
|
|
42
42
|
],
|
|
43
43
|
"scripts": {
|
|
44
|
-
"typecheck": "tsc --noEmit",
|
|
44
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.scripts.json",
|
|
45
45
|
"build": "tsc -p tsconfig.build.json && bun run scripts/generateComponentSchema.ts",
|
|
46
|
+
"release:policy": "bun run scripts/checkReleasePolicy.ts",
|
|
46
47
|
"test": "vitest run",
|
|
47
48
|
"test:watch": "vitest"
|
|
48
49
|
},
|
|
@@ -64,6 +65,7 @@
|
|
|
64
65
|
"devDependencies": {
|
|
65
66
|
"@testing-library/jest-dom": "^6",
|
|
66
67
|
"@testing-library/react": "^16",
|
|
68
|
+
"@types/node": "^20",
|
|
67
69
|
"@types/react": "^19.1.0",
|
|
68
70
|
"@types/react-dom": "^19.1.0",
|
|
69
71
|
"jsdom": "^25",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EliseChat.d.ts","sourceRoot":"","sources":["../../src/components/EliseChat.tsx"],"names":[],"mappings":"AAEA,UAAU,cAAc;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,SAAS,CAAC,EACxB,UAAU,EACV,SAA8B,GAC/B,EAAE,cAAc,QAqBhB"}
|