@webstudio-is/react-sdk 0.0.0-588fe22 → 0.0.0-a5970cb
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/lib/index.js +192 -554
- package/lib/runtime.js +14 -7
- package/lib/types/__generated__/standard-attributes.d.ts +2 -0
- package/lib/types/component-generator.d.ts +16 -6
- package/lib/types/context.d.ts +6 -0
- package/lib/types/hook.d.ts +2 -2
- package/lib/types/index.d.ts +1 -3
- package/lib/types/page-settings-meta.d.ts +2 -1
- package/lib/types/props.d.ts +1337 -8
- package/lib/types/runtime.d.ts +0 -1
- package/package.json +11 -11
- package/placeholder.d.ts +14 -11
- package/lib/types/css/css.d.ts +0 -20
- package/lib/types/css/css.test.d.ts +0 -1
- package/lib/types/css/global-rules.d.ts +0 -6
- package/lib/types/css/index.d.ts +0 -2
- package/lib/types/embed-template.d.ts +0 -54
- package/lib/types/embed-template.test.d.ts +0 -1
- package/lib/types/instance-utils.d.ts +0 -3
- package/lib/types/instance-utils.test.d.ts +0 -1
package/lib/index.js
CHANGED
|
@@ -54,178 +54,6 @@ var generateRemixParams = (pathname) => {
|
|
|
54
54
|
return generated;
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
-
// src/css/global-rules.ts
|
|
58
|
-
import { getFontFaces } from "@webstudio-is/fonts";
|
|
59
|
-
var addGlobalRules = (sheet, { assets, assetBaseUrl }) => {
|
|
60
|
-
const fontAssets = [];
|
|
61
|
-
for (const asset of assets.values()) {
|
|
62
|
-
if (asset.type === "font") {
|
|
63
|
-
fontAssets.push(asset);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const fontFaces = getFontFaces(fontAssets, { assetBaseUrl });
|
|
67
|
-
for (const fontFace of fontFaces) {
|
|
68
|
-
sheet.addFontFaceRule(fontFace);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
// src/css/css.ts
|
|
73
|
-
import {
|
|
74
|
-
createRegularStyleSheet,
|
|
75
|
-
generateAtomic
|
|
76
|
-
} from "@webstudio-is/css-engine";
|
|
77
|
-
import {
|
|
78
|
-
ROOT_INSTANCE_ID,
|
|
79
|
-
createScope,
|
|
80
|
-
parseComponentName,
|
|
81
|
-
descendantComponent,
|
|
82
|
-
rootComponent
|
|
83
|
-
} from "@webstudio-is/sdk";
|
|
84
|
-
import { kebabCase } from "change-case";
|
|
85
|
-
var createImageValueTransformer = (assets, { assetBaseUrl }) => (styleValue) => {
|
|
86
|
-
if (styleValue.type === "image" && styleValue.value.type === "asset") {
|
|
87
|
-
const asset = assets.get(styleValue.value.value);
|
|
88
|
-
if (asset === void 0) {
|
|
89
|
-
return { type: "keyword", value: "none" };
|
|
90
|
-
}
|
|
91
|
-
const url = `${assetBaseUrl}${asset.name}`;
|
|
92
|
-
return {
|
|
93
|
-
type: "image",
|
|
94
|
-
value: {
|
|
95
|
-
type: "url",
|
|
96
|
-
url
|
|
97
|
-
},
|
|
98
|
-
hidden: styleValue.hidden
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
var normalizeClassName = (name) => kebabCase(name);
|
|
103
|
-
var generateCss = ({
|
|
104
|
-
assets,
|
|
105
|
-
instances,
|
|
106
|
-
props,
|
|
107
|
-
breakpoints,
|
|
108
|
-
styles,
|
|
109
|
-
styleSourceSelections,
|
|
110
|
-
componentMetas,
|
|
111
|
-
assetBaseUrl,
|
|
112
|
-
atomic
|
|
113
|
-
}) => {
|
|
114
|
-
const globalSheet = createRegularStyleSheet({ name: "ssr" });
|
|
115
|
-
const sheet = createRegularStyleSheet({ name: "ssr" });
|
|
116
|
-
addGlobalRules(globalSheet, { assets, assetBaseUrl });
|
|
117
|
-
globalSheet.addMediaRule("presets");
|
|
118
|
-
const presetClasses = /* @__PURE__ */ new Map();
|
|
119
|
-
const scope = createScope([], normalizeClassName, "-");
|
|
120
|
-
for (const [component, meta] of componentMetas) {
|
|
121
|
-
const [_namespace, componentName] = parseComponentName(component);
|
|
122
|
-
const className = `w-${scope.getName(component, meta.label ?? componentName)}`;
|
|
123
|
-
const presetStyle = Object.entries(meta.presetStyle ?? {});
|
|
124
|
-
if (presetStyle.length > 0) {
|
|
125
|
-
presetClasses.set(component, className);
|
|
126
|
-
}
|
|
127
|
-
for (const [tag, styles2] of presetStyle) {
|
|
128
|
-
const selector = component === rootComponent ? ":root" : `:where(${tag}.${className})`;
|
|
129
|
-
const rule = globalSheet.addNestingRule(selector);
|
|
130
|
-
for (const declaration of styles2) {
|
|
131
|
-
rule.setDeclaration({
|
|
132
|
-
breakpoint: "presets",
|
|
133
|
-
selector: declaration.state ?? "",
|
|
134
|
-
property: declaration.property,
|
|
135
|
-
value: declaration.value
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
for (const breakpoint of breakpoints.values()) {
|
|
141
|
-
sheet.addMediaRule(breakpoint.id, breakpoint);
|
|
142
|
-
}
|
|
143
|
-
const imageValueTransformer = createImageValueTransformer(assets, {
|
|
144
|
-
assetBaseUrl
|
|
145
|
-
});
|
|
146
|
-
sheet.setTransformer(imageValueTransformer);
|
|
147
|
-
for (const styleDecl of styles.values()) {
|
|
148
|
-
const rule = sheet.addMixinRule(styleDecl.styleSourceId);
|
|
149
|
-
rule.setDeclaration({
|
|
150
|
-
breakpoint: styleDecl.breakpointId,
|
|
151
|
-
selector: styleDecl.state ?? "",
|
|
152
|
-
property: styleDecl.property,
|
|
153
|
-
value: styleDecl.value
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
const classes = /* @__PURE__ */ new Map();
|
|
157
|
-
const parentIdByInstanceId = /* @__PURE__ */ new Map();
|
|
158
|
-
for (const instance of instances.values()) {
|
|
159
|
-
const presetClass = presetClasses.get(instance.component);
|
|
160
|
-
if (presetClass) {
|
|
161
|
-
classes.set(instance.id, [presetClass]);
|
|
162
|
-
}
|
|
163
|
-
for (const child of instance.children) {
|
|
164
|
-
if (child.type === "id") {
|
|
165
|
-
parentIdByInstanceId.set(child.value, instance.id);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const descendantSelectorByInstanceId = /* @__PURE__ */ new Map();
|
|
170
|
-
for (const prop of props.values()) {
|
|
171
|
-
if (prop.name === "selector" && prop.type === "string") {
|
|
172
|
-
descendantSelectorByInstanceId.set(prop.instanceId, prop.value);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
const instanceByRule = /* @__PURE__ */ new Map();
|
|
176
|
-
for (const selection of styleSourceSelections.values()) {
|
|
177
|
-
let { instanceId } = selection;
|
|
178
|
-
const { values } = selection;
|
|
179
|
-
if (instanceId === ROOT_INSTANCE_ID) {
|
|
180
|
-
const rule2 = sheet.addNestingRule(`:root`);
|
|
181
|
-
rule2.applyMixins(values);
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
let descendantSuffix = "";
|
|
185
|
-
const instance = instances.get(instanceId);
|
|
186
|
-
if (instance === void 0) {
|
|
187
|
-
continue;
|
|
188
|
-
}
|
|
189
|
-
if (instance.component === descendantComponent) {
|
|
190
|
-
const parentId = parentIdByInstanceId.get(instanceId);
|
|
191
|
-
const descendantSelector = descendantSelectorByInstanceId.get(instanceId);
|
|
192
|
-
if (parentId && descendantSelector) {
|
|
193
|
-
descendantSuffix = descendantSelector;
|
|
194
|
-
instanceId = parentId;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
const meta = componentMetas.get(instance.component);
|
|
198
|
-
const [_namespace, shortName] = parseComponentName(instance.component);
|
|
199
|
-
const baseName = instance.label ?? meta?.label ?? shortName;
|
|
200
|
-
const className = `w-${scope.getName(instanceId, baseName)}`;
|
|
201
|
-
if (atomic === false) {
|
|
202
|
-
let classList = classes.get(instanceId);
|
|
203
|
-
if (classList === void 0) {
|
|
204
|
-
classList = [];
|
|
205
|
-
classes.set(instanceId, classList);
|
|
206
|
-
}
|
|
207
|
-
classList.push(className);
|
|
208
|
-
}
|
|
209
|
-
const rule = sheet.addNestingRule(`.${className}`, descendantSuffix);
|
|
210
|
-
rule.applyMixins(values);
|
|
211
|
-
instanceByRule.set(rule, instanceId);
|
|
212
|
-
}
|
|
213
|
-
if (atomic) {
|
|
214
|
-
const { cssText } = generateAtomic(sheet, {
|
|
215
|
-
getKey: (rule) => instanceByRule.get(rule),
|
|
216
|
-
transformValue: imageValueTransformer,
|
|
217
|
-
classes
|
|
218
|
-
});
|
|
219
|
-
return { cssText: `${globalSheet.cssText}
|
|
220
|
-
${cssText}`, classes };
|
|
221
|
-
}
|
|
222
|
-
return {
|
|
223
|
-
cssText: `${globalSheet.cssText}
|
|
224
|
-
${sheet.cssText}`,
|
|
225
|
-
classes
|
|
226
|
-
};
|
|
227
|
-
};
|
|
228
|
-
|
|
229
57
|
// src/props.ts
|
|
230
58
|
import {
|
|
231
59
|
getPagePath,
|
|
@@ -325,11 +153,8 @@ var idAttribute = "data-ws-id";
|
|
|
325
153
|
var selectorIdAttribute = "data-ws-selector";
|
|
326
154
|
var componentAttribute = "data-ws-component";
|
|
327
155
|
var showAttribute = "data-ws-show";
|
|
328
|
-
var indexAttribute = "data-ws-index";
|
|
329
156
|
var collapsedAttribute = "data-ws-collapsed";
|
|
330
157
|
var textContentAttribute = "data-ws-text-content";
|
|
331
|
-
var editablePlaceholderVariable = "--data-ws-editable-placeholder";
|
|
332
|
-
var editingPlaceholderVariable = "--data-ws-editing-placeholder";
|
|
333
158
|
var attributeNameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
|
|
334
159
|
var attributeNameChar = attributeNameStartChar + ":\\-0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
|
|
335
160
|
var validAttributeNameRegex = new RegExp(
|
|
@@ -353,349 +178,128 @@ var isAttributeNameSafe = (attributeName) => {
|
|
|
353
178
|
return false;
|
|
354
179
|
};
|
|
355
180
|
|
|
356
|
-
// src/embed-template.ts
|
|
357
|
-
import { nanoid } from "nanoid";
|
|
358
|
-
import {
|
|
359
|
-
encodeDataSourceVariable,
|
|
360
|
-
transpileExpression
|
|
361
|
-
} from "@webstudio-is/sdk";
|
|
362
|
-
var getVariablValue = (value) => {
|
|
363
|
-
if (typeof value === "string") {
|
|
364
|
-
return { type: "string", value };
|
|
365
|
-
}
|
|
366
|
-
if (typeof value === "number") {
|
|
367
|
-
return { type: "number", value };
|
|
368
|
-
}
|
|
369
|
-
if (typeof value === "boolean") {
|
|
370
|
-
return { type: "boolean", value };
|
|
371
|
-
}
|
|
372
|
-
if (Array.isArray(value)) {
|
|
373
|
-
return { type: "string[]", value };
|
|
374
|
-
}
|
|
375
|
-
return { type: "json", value };
|
|
376
|
-
};
|
|
377
|
-
var createInstancesFromTemplate = (treeTemplate, instances, props, dataSourceByRef, styleSourceSelections, styleSources, styles, metas, defaultBreakpointId, generateId) => {
|
|
378
|
-
const parentChildren = [];
|
|
379
|
-
for (const item of treeTemplate) {
|
|
380
|
-
if (item.type === "instance") {
|
|
381
|
-
const instanceId = generateId();
|
|
382
|
-
if (item.variables) {
|
|
383
|
-
for (const [name, variable] of Object.entries(item.variables)) {
|
|
384
|
-
if (dataSourceByRef.has(name)) {
|
|
385
|
-
throw Error(`${name} data source already defined`);
|
|
386
|
-
}
|
|
387
|
-
dataSourceByRef.set(name, {
|
|
388
|
-
type: "variable",
|
|
389
|
-
id: generateId(),
|
|
390
|
-
scopeInstanceId: instanceId,
|
|
391
|
-
name: variable.alias ?? name,
|
|
392
|
-
value: getVariablValue(variable.initialValue)
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
if (item.props) {
|
|
397
|
-
for (const prop of item.props) {
|
|
398
|
-
const propId = generateId();
|
|
399
|
-
if (prop.type === "expression") {
|
|
400
|
-
props.push({
|
|
401
|
-
id: propId,
|
|
402
|
-
instanceId,
|
|
403
|
-
name: prop.name,
|
|
404
|
-
type: "expression",
|
|
405
|
-
// replace all references with variable names
|
|
406
|
-
value: transpileExpression({
|
|
407
|
-
expression: prop.code,
|
|
408
|
-
replaceVariable: (ref) => {
|
|
409
|
-
const id = dataSourceByRef.get(ref)?.id ?? ref;
|
|
410
|
-
return encodeDataSourceVariable(id);
|
|
411
|
-
}
|
|
412
|
-
})
|
|
413
|
-
});
|
|
414
|
-
continue;
|
|
415
|
-
}
|
|
416
|
-
if (prop.type === "action") {
|
|
417
|
-
props.push({
|
|
418
|
-
id: propId,
|
|
419
|
-
instanceId,
|
|
420
|
-
type: "action",
|
|
421
|
-
name: prop.name,
|
|
422
|
-
value: prop.value.map((value) => {
|
|
423
|
-
const args = value.args ?? [];
|
|
424
|
-
return {
|
|
425
|
-
type: "execute",
|
|
426
|
-
args,
|
|
427
|
-
// replace all references with variable names
|
|
428
|
-
code: transpileExpression({
|
|
429
|
-
expression: value.code,
|
|
430
|
-
replaceVariable: (ref) => {
|
|
431
|
-
if (args.includes(ref)) {
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
const id = dataSourceByRef.get(ref)?.id ?? ref;
|
|
435
|
-
return encodeDataSourceVariable(id);
|
|
436
|
-
}
|
|
437
|
-
})
|
|
438
|
-
};
|
|
439
|
-
})
|
|
440
|
-
});
|
|
441
|
-
continue;
|
|
442
|
-
}
|
|
443
|
-
if (prop.type === "parameter") {
|
|
444
|
-
const dataSourceId = generateId();
|
|
445
|
-
dataSourceByRef.set(prop.variableName, {
|
|
446
|
-
type: "parameter",
|
|
447
|
-
id: dataSourceId,
|
|
448
|
-
scopeInstanceId: instanceId,
|
|
449
|
-
name: prop.variableAlias ?? prop.variableName
|
|
450
|
-
});
|
|
451
|
-
props.push({
|
|
452
|
-
id: propId,
|
|
453
|
-
instanceId,
|
|
454
|
-
name: prop.name,
|
|
455
|
-
type: "parameter",
|
|
456
|
-
// replace variable reference with variable id
|
|
457
|
-
value: dataSourceId
|
|
458
|
-
});
|
|
459
|
-
continue;
|
|
460
|
-
}
|
|
461
|
-
props.push({ id: propId, instanceId, ...prop });
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
const styleSourceIds = [];
|
|
465
|
-
if (item.styles) {
|
|
466
|
-
const styleSourceId = generateId();
|
|
467
|
-
styleSources.push({
|
|
468
|
-
type: "local",
|
|
469
|
-
id: styleSourceId
|
|
470
|
-
});
|
|
471
|
-
styleSourceIds.push(styleSourceId);
|
|
472
|
-
for (const styleDecl of item.styles) {
|
|
473
|
-
styles.push({
|
|
474
|
-
breakpointId: defaultBreakpointId,
|
|
475
|
-
styleSourceId,
|
|
476
|
-
state: styleDecl.state,
|
|
477
|
-
property: styleDecl.property,
|
|
478
|
-
value: styleDecl.value
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
if (styleSourceIds.length > 0) {
|
|
483
|
-
styleSourceSelections.push({
|
|
484
|
-
instanceId,
|
|
485
|
-
values: styleSourceIds
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
const instance = {
|
|
489
|
-
type: "instance",
|
|
490
|
-
id: instanceId,
|
|
491
|
-
label: item.label,
|
|
492
|
-
component: item.component,
|
|
493
|
-
children: []
|
|
494
|
-
};
|
|
495
|
-
instances.push(instance);
|
|
496
|
-
instance.children = createInstancesFromTemplate(
|
|
497
|
-
item.children,
|
|
498
|
-
instances,
|
|
499
|
-
props,
|
|
500
|
-
dataSourceByRef,
|
|
501
|
-
styleSourceSelections,
|
|
502
|
-
styleSources,
|
|
503
|
-
styles,
|
|
504
|
-
metas,
|
|
505
|
-
defaultBreakpointId,
|
|
506
|
-
generateId
|
|
507
|
-
);
|
|
508
|
-
parentChildren.push({
|
|
509
|
-
type: "id",
|
|
510
|
-
value: instanceId
|
|
511
|
-
});
|
|
512
|
-
}
|
|
513
|
-
if (item.type === "text") {
|
|
514
|
-
parentChildren.push({
|
|
515
|
-
type: "text",
|
|
516
|
-
value: item.value,
|
|
517
|
-
placeholder: item.placeholder
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
if (item.type === "expression") {
|
|
521
|
-
parentChildren.push({
|
|
522
|
-
type: "expression",
|
|
523
|
-
// replace all references with variable names
|
|
524
|
-
value: transpileExpression({
|
|
525
|
-
expression: item.value,
|
|
526
|
-
replaceVariable: (ref) => {
|
|
527
|
-
const id = dataSourceByRef.get(ref)?.id ?? ref;
|
|
528
|
-
return encodeDataSourceVariable(id);
|
|
529
|
-
}
|
|
530
|
-
})
|
|
531
|
-
});
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
return parentChildren;
|
|
535
|
-
};
|
|
536
|
-
var generateDataFromEmbedTemplate = (treeTemplate, metas, generateId = nanoid) => {
|
|
537
|
-
const instances = [];
|
|
538
|
-
const props = [];
|
|
539
|
-
const dataSourceByRef = /* @__PURE__ */ new Map();
|
|
540
|
-
const styleSourceSelections = [];
|
|
541
|
-
const styleSources = [];
|
|
542
|
-
const styles = [];
|
|
543
|
-
const baseBreakpointId = generateId();
|
|
544
|
-
const children = createInstancesFromTemplate(
|
|
545
|
-
treeTemplate,
|
|
546
|
-
instances,
|
|
547
|
-
props,
|
|
548
|
-
dataSourceByRef,
|
|
549
|
-
styleSourceSelections,
|
|
550
|
-
styleSources,
|
|
551
|
-
styles,
|
|
552
|
-
metas,
|
|
553
|
-
baseBreakpointId,
|
|
554
|
-
generateId
|
|
555
|
-
);
|
|
556
|
-
const breakpoints = [];
|
|
557
|
-
if (styles.length > 0) {
|
|
558
|
-
breakpoints.push({
|
|
559
|
-
id: baseBreakpointId,
|
|
560
|
-
label: ""
|
|
561
|
-
});
|
|
562
|
-
}
|
|
563
|
-
return {
|
|
564
|
-
children,
|
|
565
|
-
instances,
|
|
566
|
-
props,
|
|
567
|
-
dataSources: Array.from(dataSourceByRef.values()),
|
|
568
|
-
styleSourceSelections,
|
|
569
|
-
styleSources,
|
|
570
|
-
styles,
|
|
571
|
-
breakpoints,
|
|
572
|
-
assets: [],
|
|
573
|
-
resources: []
|
|
574
|
-
};
|
|
575
|
-
};
|
|
576
|
-
var namespaceEmbedTemplateComponents = (template, namespace, components) => {
|
|
577
|
-
return template.map((item) => {
|
|
578
|
-
if (item.type === "text") {
|
|
579
|
-
return item;
|
|
580
|
-
}
|
|
581
|
-
if (item.type === "expression") {
|
|
582
|
-
return item;
|
|
583
|
-
}
|
|
584
|
-
if (item.type === "instance") {
|
|
585
|
-
const prefix = components.has(item.component) ? `${namespace}:` : "";
|
|
586
|
-
return {
|
|
587
|
-
...item,
|
|
588
|
-
component: `${prefix}${item.component}`,
|
|
589
|
-
children: namespaceEmbedTemplateComponents(
|
|
590
|
-
item.children,
|
|
591
|
-
namespace,
|
|
592
|
-
components
|
|
593
|
-
)
|
|
594
|
-
};
|
|
595
|
-
}
|
|
596
|
-
item;
|
|
597
|
-
throw Error("Impossible case");
|
|
598
|
-
});
|
|
599
|
-
};
|
|
600
|
-
var namespaceMatcher = (namespace, matcher) => {
|
|
601
|
-
const newMatcher = structuredClone(matcher);
|
|
602
|
-
if (newMatcher.component?.$eq) {
|
|
603
|
-
newMatcher.component.$eq = `${namespace}:${newMatcher.component.$eq}`;
|
|
604
|
-
}
|
|
605
|
-
if (newMatcher.component?.$neq) {
|
|
606
|
-
newMatcher.component.$neq = `${namespace}:${newMatcher.component.$neq}`;
|
|
607
|
-
}
|
|
608
|
-
if (newMatcher.component?.$in) {
|
|
609
|
-
newMatcher.component.$in = newMatcher.component.$in.map(
|
|
610
|
-
(component) => `${namespace}:${component}`
|
|
611
|
-
);
|
|
612
|
-
}
|
|
613
|
-
if (newMatcher.component?.$nin) {
|
|
614
|
-
newMatcher.component.$nin = newMatcher.component.$nin.map(
|
|
615
|
-
(component) => `${namespace}:${component}`
|
|
616
|
-
);
|
|
617
|
-
}
|
|
618
|
-
return newMatcher;
|
|
619
|
-
};
|
|
620
|
-
var namespaceMeta = (meta, namespace, components) => {
|
|
621
|
-
const newMeta = { ...meta };
|
|
622
|
-
if (newMeta.constraints) {
|
|
623
|
-
if (Array.isArray(newMeta.constraints)) {
|
|
624
|
-
newMeta.constraints = newMeta.constraints.map(
|
|
625
|
-
(matcher) => namespaceMatcher(namespace, matcher)
|
|
626
|
-
);
|
|
627
|
-
} else {
|
|
628
|
-
newMeta.constraints = namespaceMatcher(namespace, newMeta.constraints);
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
if (newMeta.indexWithinAncestor) {
|
|
632
|
-
newMeta.indexWithinAncestor = components.has(newMeta.indexWithinAncestor) ? `${namespace}:${newMeta.indexWithinAncestor}` : newMeta.indexWithinAncestor;
|
|
633
|
-
}
|
|
634
|
-
if (newMeta.template) {
|
|
635
|
-
newMeta.template = namespaceEmbedTemplateComponents(
|
|
636
|
-
newMeta.template,
|
|
637
|
-
namespace,
|
|
638
|
-
components
|
|
639
|
-
);
|
|
640
|
-
}
|
|
641
|
-
return newMeta;
|
|
642
|
-
};
|
|
643
|
-
|
|
644
|
-
// src/instance-utils.ts
|
|
645
|
-
var getIndexesWithinAncestors = (metas, instances, rootIds) => {
|
|
646
|
-
const ancestors = /* @__PURE__ */ new Set();
|
|
647
|
-
for (const meta of metas.values()) {
|
|
648
|
-
if (meta.indexWithinAncestor !== void 0) {
|
|
649
|
-
ancestors.add(meta.indexWithinAncestor);
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
const indexes = /* @__PURE__ */ new Map();
|
|
653
|
-
const traverseInstances = (instances2, instanceId, latestIndexes2 = /* @__PURE__ */ new Map()) => {
|
|
654
|
-
const instance = instances2.get(instanceId);
|
|
655
|
-
if (instance === void 0) {
|
|
656
|
-
return;
|
|
657
|
-
}
|
|
658
|
-
const meta = metas.get(instance.component);
|
|
659
|
-
if (meta === void 0) {
|
|
660
|
-
return;
|
|
661
|
-
}
|
|
662
|
-
if (ancestors.has(instance.component)) {
|
|
663
|
-
latestIndexes2 = new Map(latestIndexes2);
|
|
664
|
-
latestIndexes2.set(instance.component, /* @__PURE__ */ new Map());
|
|
665
|
-
}
|
|
666
|
-
if (meta.indexWithinAncestor !== void 0) {
|
|
667
|
-
const ancestorIndexes = latestIndexes2.get(meta.indexWithinAncestor);
|
|
668
|
-
if (ancestorIndexes !== void 0) {
|
|
669
|
-
let index = ancestorIndexes.get(instance.component) ?? -1;
|
|
670
|
-
index += 1;
|
|
671
|
-
ancestorIndexes.set(instance.component, index);
|
|
672
|
-
indexes.set(instance.id, index);
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
for (const child of instance.children) {
|
|
676
|
-
if (child.type === "id") {
|
|
677
|
-
traverseInstances(instances2, child.value, latestIndexes2);
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
};
|
|
681
|
-
const latestIndexes = /* @__PURE__ */ new Map();
|
|
682
|
-
for (const instanceId of rootIds) {
|
|
683
|
-
traverseInstances(instances, instanceId, latestIndexes);
|
|
684
|
-
}
|
|
685
|
-
return indexes;
|
|
686
|
-
};
|
|
687
|
-
|
|
688
181
|
// src/component-generator.ts
|
|
689
182
|
import {
|
|
690
|
-
parseComponentName
|
|
183
|
+
parseComponentName,
|
|
691
184
|
generateExpression,
|
|
692
185
|
decodeDataSourceVariable,
|
|
693
|
-
transpileExpression
|
|
186
|
+
transpileExpression,
|
|
694
187
|
blockComponent,
|
|
695
188
|
blockTemplateComponent,
|
|
696
189
|
collectionComponent,
|
|
697
|
-
descendantComponent
|
|
190
|
+
descendantComponent,
|
|
191
|
+
getIndexesWithinAncestors,
|
|
192
|
+
elementComponent
|
|
698
193
|
} from "@webstudio-is/sdk";
|
|
194
|
+
import { indexProperty, tagProperty } from "@webstudio-is/sdk/runtime";
|
|
195
|
+
|
|
196
|
+
// src/__generated__/standard-attributes.ts
|
|
197
|
+
var standardAttributesToReactProps = {
|
|
198
|
+
"accept-charset": "acceptCharset",
|
|
199
|
+
accesskey: "accessKey",
|
|
200
|
+
allowfullscreen: "allowFullScreen",
|
|
201
|
+
autocapitalize: "autoCapitalize",
|
|
202
|
+
autocomplete: "autoComplete",
|
|
203
|
+
autocorrect: "autoCorrect",
|
|
204
|
+
autofocus: "autoFocus",
|
|
205
|
+
autoplay: "autoPlay",
|
|
206
|
+
charset: "charSet",
|
|
207
|
+
class: "className",
|
|
208
|
+
colspan: "colSpan",
|
|
209
|
+
contenteditable: "contentEditable",
|
|
210
|
+
crossorigin: "crossOrigin",
|
|
211
|
+
datetime: "dateTime",
|
|
212
|
+
enctype: "encType",
|
|
213
|
+
enterkeyhint: "enterKeyHint",
|
|
214
|
+
fetchpriority: "fetchPriority",
|
|
215
|
+
for: "htmlFor",
|
|
216
|
+
formmethod: "formMethod",
|
|
217
|
+
formaction: "formAction",
|
|
218
|
+
formenctype: "formEncType",
|
|
219
|
+
formnovalidate: "formNoValidate",
|
|
220
|
+
formtarget: "formTarget",
|
|
221
|
+
hreflang: "hrefLang",
|
|
222
|
+
"http-equiv": "httpEquiv",
|
|
223
|
+
imagesizes: "imageSizes",
|
|
224
|
+
imagesrcset: "imageSrcSet",
|
|
225
|
+
inputmode: "inputMode",
|
|
226
|
+
itemid: "itemID",
|
|
227
|
+
itemprop: "itemProp",
|
|
228
|
+
itemref: "itemRef",
|
|
229
|
+
itemscope: "itemScope",
|
|
230
|
+
itemtype: "itemType",
|
|
231
|
+
maxlength: "maxLength",
|
|
232
|
+
minlength: "minLength",
|
|
233
|
+
nomodule: "noModule",
|
|
234
|
+
novalidate: "noValidate",
|
|
235
|
+
playsinline: "playsInline",
|
|
236
|
+
readonly: "readOnly",
|
|
237
|
+
referrerpolicy: "referrerPolicy",
|
|
238
|
+
rowspan: "rowSpan",
|
|
239
|
+
spellcheck: "spellCheck",
|
|
240
|
+
srcdoc: "srcDoc",
|
|
241
|
+
srclang: "srcLang",
|
|
242
|
+
srcset: "srcSet",
|
|
243
|
+
tabindex: "tabIndex",
|
|
244
|
+
usemap: "useMap",
|
|
245
|
+
popovertarget: "popoverTarget",
|
|
246
|
+
popovertargetaction: "popoverTargetAction",
|
|
247
|
+
dirname: "dirName"
|
|
248
|
+
};
|
|
249
|
+
var reactPropsToStandardAttributes = {
|
|
250
|
+
acceptCharset: "accept-charset",
|
|
251
|
+
accessKey: "accesskey",
|
|
252
|
+
allowFullScreen: "allowfullscreen",
|
|
253
|
+
autoCapitalize: "autocapitalize",
|
|
254
|
+
autoComplete: "autocomplete",
|
|
255
|
+
autoCorrect: "autocorrect",
|
|
256
|
+
autoFocus: "autofocus",
|
|
257
|
+
autoPlay: "autoplay",
|
|
258
|
+
charSet: "charset",
|
|
259
|
+
className: "class",
|
|
260
|
+
colSpan: "colspan",
|
|
261
|
+
contentEditable: "contenteditable",
|
|
262
|
+
crossOrigin: "crossorigin",
|
|
263
|
+
dateTime: "datetime",
|
|
264
|
+
encType: "enctype",
|
|
265
|
+
enterKeyHint: "enterkeyhint",
|
|
266
|
+
fetchPriority: "fetchpriority",
|
|
267
|
+
htmlFor: "for",
|
|
268
|
+
formMethod: "formmethod",
|
|
269
|
+
formAction: "formaction",
|
|
270
|
+
formEncType: "formenctype",
|
|
271
|
+
formNoValidate: "formnovalidate",
|
|
272
|
+
formTarget: "formtarget",
|
|
273
|
+
hrefLang: "hreflang",
|
|
274
|
+
httpEquiv: "http-equiv",
|
|
275
|
+
imageSizes: "imagesizes",
|
|
276
|
+
imageSrcSet: "imagesrcset",
|
|
277
|
+
inputMode: "inputmode",
|
|
278
|
+
itemID: "itemid",
|
|
279
|
+
itemProp: "itemprop",
|
|
280
|
+
itemRef: "itemref",
|
|
281
|
+
itemScope: "itemscope",
|
|
282
|
+
itemType: "itemtype",
|
|
283
|
+
maxLength: "maxlength",
|
|
284
|
+
minLength: "minlength",
|
|
285
|
+
noModule: "nomodule",
|
|
286
|
+
noValidate: "novalidate",
|
|
287
|
+
playsInline: "playsinline",
|
|
288
|
+
readOnly: "readonly",
|
|
289
|
+
referrerPolicy: "referrerpolicy",
|
|
290
|
+
rowSpan: "rowspan",
|
|
291
|
+
spellCheck: "spellcheck",
|
|
292
|
+
srcDoc: "srcdoc",
|
|
293
|
+
srcLang: "srclang",
|
|
294
|
+
srcSet: "srcset",
|
|
295
|
+
tabIndex: "tabindex",
|
|
296
|
+
useMap: "usemap",
|
|
297
|
+
popoverTarget: "popovertarget",
|
|
298
|
+
popoverTargetAction: "popovertargetaction",
|
|
299
|
+
dirName: "dirname"
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// src/component-generator.ts
|
|
699
303
|
var generateAction = ({
|
|
700
304
|
scope,
|
|
701
305
|
prop,
|
|
@@ -707,7 +311,7 @@ var generateAction = ({
|
|
|
707
311
|
let assignersCode = "";
|
|
708
312
|
for (const value of prop.value) {
|
|
709
313
|
args = value.args;
|
|
710
|
-
assignersCode +=
|
|
314
|
+
assignersCode += transpileExpression({
|
|
711
315
|
expression: value.code,
|
|
712
316
|
executable: true,
|
|
713
317
|
replaceVariable: (identifier, assignee) => {
|
|
@@ -758,7 +362,7 @@ var generatePropValue = ({
|
|
|
758
362
|
if (prop.type === "asset" || prop.type === "page") {
|
|
759
363
|
return;
|
|
760
364
|
}
|
|
761
|
-
if (prop.type === "string" || prop.type === "number" || prop.type === "boolean" || prop.type === "string[]" || prop.type === "json") {
|
|
365
|
+
if (prop.type === "string" || prop.type === "number" || prop.type === "boolean" || prop.type === "string[]" || prop.type === "json" || prop.type === "animationAction") {
|
|
762
366
|
return JSON.stringify(prop.value);
|
|
763
367
|
}
|
|
764
368
|
if (prop.type === "parameter") {
|
|
@@ -788,6 +392,8 @@ var generatePropValue = ({
|
|
|
788
392
|
var generateJsxElement = ({
|
|
789
393
|
context = "jsx",
|
|
790
394
|
scope,
|
|
395
|
+
metas,
|
|
396
|
+
tagsOverrides,
|
|
791
397
|
instance,
|
|
792
398
|
props,
|
|
793
399
|
dataSources,
|
|
@@ -796,14 +402,20 @@ var generateJsxElement = ({
|
|
|
796
402
|
children,
|
|
797
403
|
classesMap
|
|
798
404
|
}) => {
|
|
799
|
-
if (instance.component ===
|
|
405
|
+
if (instance.component === descendantComponent) {
|
|
800
406
|
return "";
|
|
801
407
|
}
|
|
408
|
+
const meta = metas.get(instance.component);
|
|
409
|
+
const hasTags = Object.keys(meta?.presetStyle ?? {}).length > 0;
|
|
802
410
|
let generatedProps = "";
|
|
803
411
|
const index = indexesWithinAncestors.get(instance.id);
|
|
804
412
|
if (index !== void 0) {
|
|
805
413
|
generatedProps += `
|
|
806
|
-
${
|
|
414
|
+
${indexProperty}="${index}"`;
|
|
415
|
+
}
|
|
416
|
+
if (instance.tag !== void 0 && instance.component !== elementComponent) {
|
|
417
|
+
generatedProps += `
|
|
418
|
+
${tagProperty}=${JSON.stringify(instance.tag)}`;
|
|
807
419
|
}
|
|
808
420
|
let conditionValue;
|
|
809
421
|
let collectionDataValue;
|
|
@@ -822,6 +434,10 @@ ${indexAttribute}="${index}"`;
|
|
|
822
434
|
if (isAttributeNameSafe(prop.name) === false) {
|
|
823
435
|
continue;
|
|
824
436
|
}
|
|
437
|
+
let name = prop.name;
|
|
438
|
+
if (hasTags && !meta?.props?.[prop.name]) {
|
|
439
|
+
name = standardAttributesToReactProps[prop.name] ?? prop.name;
|
|
440
|
+
}
|
|
825
441
|
if (prop.name === showAttribute) {
|
|
826
442
|
if (propValue === "true") {
|
|
827
443
|
continue;
|
|
@@ -841,13 +457,13 @@ ${indexAttribute}="${index}"`;
|
|
|
841
457
|
}
|
|
842
458
|
continue;
|
|
843
459
|
}
|
|
844
|
-
if (
|
|
460
|
+
if (name === "className" && propValue !== void 0) {
|
|
845
461
|
classNameValue = propValue;
|
|
846
462
|
continue;
|
|
847
463
|
}
|
|
848
464
|
if (propValue !== void 0) {
|
|
849
465
|
generatedProps += `
|
|
850
|
-
${
|
|
466
|
+
${name}={${propValue}}`;
|
|
851
467
|
}
|
|
852
468
|
}
|
|
853
469
|
const classMapArray = classesMap?.get(instance.id);
|
|
@@ -870,7 +486,7 @@ ${prop.name}={${propValue}}`;
|
|
|
870
486
|
return "";
|
|
871
487
|
}
|
|
872
488
|
const indexVariable = scope.getName(`${instance.id}-index`, "index");
|
|
873
|
-
generatedElement += `{${collectionDataValue}?.map((${collectionItemValue}: any, ${indexVariable}: number) =>
|
|
489
|
+
generatedElement += `{${collectionDataValue}?.map?.((${collectionItemValue}: any, ${indexVariable}: number) =>
|
|
874
490
|
`;
|
|
875
491
|
generatedElement += `<Fragment key={${indexVariable}}>
|
|
876
492
|
`;
|
|
@@ -882,8 +498,18 @@ ${prop.name}={${propValue}}`;
|
|
|
882
498
|
} else if (instance.component === blockComponent) {
|
|
883
499
|
generatedElement += children;
|
|
884
500
|
} else {
|
|
885
|
-
|
|
886
|
-
|
|
501
|
+
let componentVariable;
|
|
502
|
+
if (instance.component === elementComponent) {
|
|
503
|
+
componentVariable = instance.tag ?? "div";
|
|
504
|
+
const componentDescriptor = tagsOverrides?.[componentVariable];
|
|
505
|
+
if (componentDescriptor !== void 0) {
|
|
506
|
+
const [_importSource, importSpecifier] = componentDescriptor.split(":");
|
|
507
|
+
componentVariable = scope.getName(componentDescriptor, importSpecifier);
|
|
508
|
+
}
|
|
509
|
+
} else {
|
|
510
|
+
const [_namespace, shortName] = parseComponentName(instance.component);
|
|
511
|
+
componentVariable = scope.getName(instance.component, shortName);
|
|
512
|
+
}
|
|
887
513
|
if (instance.children.length === 0) {
|
|
888
514
|
generatedElement += `<${componentVariable}${generatedProps} />
|
|
889
515
|
`;
|
|
@@ -920,6 +546,8 @@ ${prop.name}={${propValue}}`;
|
|
|
920
546
|
};
|
|
921
547
|
var generateJsxChildren = ({
|
|
922
548
|
scope,
|
|
549
|
+
metas,
|
|
550
|
+
tagsOverrides,
|
|
923
551
|
children,
|
|
924
552
|
instances,
|
|
925
553
|
props,
|
|
@@ -960,6 +588,8 @@ var generateJsxChildren = ({
|
|
|
960
588
|
generatedChildren += generateJsxElement({
|
|
961
589
|
context: "jsx",
|
|
962
590
|
scope,
|
|
591
|
+
metas,
|
|
592
|
+
tagsOverrides,
|
|
963
593
|
instance,
|
|
964
594
|
props,
|
|
965
595
|
dataSources,
|
|
@@ -969,6 +599,8 @@ var generateJsxChildren = ({
|
|
|
969
599
|
children: generateJsxChildren({
|
|
970
600
|
classesMap,
|
|
971
601
|
scope,
|
|
602
|
+
metas,
|
|
603
|
+
tagsOverrides,
|
|
972
604
|
children: instance.children,
|
|
973
605
|
instances,
|
|
974
606
|
props,
|
|
@@ -992,49 +624,61 @@ var generateWebstudioComponent = ({
|
|
|
992
624
|
instances,
|
|
993
625
|
props,
|
|
994
626
|
dataSources,
|
|
995
|
-
|
|
627
|
+
metas,
|
|
628
|
+
tagsOverrides,
|
|
996
629
|
classesMap
|
|
997
630
|
}) => {
|
|
998
631
|
const instance = instances.get(rootInstanceId);
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
632
|
+
const indexesWithinAncestors = getIndexesWithinAncestors(metas, instances, [
|
|
633
|
+
rootInstanceId
|
|
634
|
+
]);
|
|
1002
635
|
const usedDataSources = /* @__PURE__ */ new Map();
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
props,
|
|
1008
|
-
dataSources,
|
|
1009
|
-
usedDataSources,
|
|
1010
|
-
indexesWithinAncestors,
|
|
1011
|
-
classesMap,
|
|
1012
|
-
children: generateJsxChildren({
|
|
636
|
+
let generatedJsx = "<></>\n";
|
|
637
|
+
if (instance) {
|
|
638
|
+
generatedJsx = generateJsxElement({
|
|
639
|
+
context: "expression",
|
|
1013
640
|
scope,
|
|
1014
|
-
|
|
1015
|
-
|
|
641
|
+
metas,
|
|
642
|
+
tagsOverrides,
|
|
643
|
+
instance,
|
|
1016
644
|
props,
|
|
1017
645
|
dataSources,
|
|
1018
646
|
usedDataSources,
|
|
1019
647
|
indexesWithinAncestors,
|
|
1020
|
-
classesMap
|
|
1021
|
-
|
|
1022
|
-
|
|
648
|
+
classesMap,
|
|
649
|
+
children: generateJsxChildren({
|
|
650
|
+
scope,
|
|
651
|
+
metas,
|
|
652
|
+
tagsOverrides,
|
|
653
|
+
children: instance.children,
|
|
654
|
+
instances,
|
|
655
|
+
props,
|
|
656
|
+
dataSources,
|
|
657
|
+
usedDataSources,
|
|
658
|
+
indexesWithinAncestors,
|
|
659
|
+
classesMap
|
|
660
|
+
})
|
|
661
|
+
});
|
|
662
|
+
}
|
|
1023
663
|
let generatedProps = "";
|
|
664
|
+
let generatedParameters = "";
|
|
665
|
+
const uniqueParameters = new Set(
|
|
666
|
+
parameters.map((parameter) => parameter.name)
|
|
667
|
+
);
|
|
1024
668
|
if (parameters.length > 0) {
|
|
1025
|
-
let
|
|
1026
|
-
|
|
669
|
+
let generatedPropsType = "";
|
|
670
|
+
for (const parameterName of uniqueParameters) {
|
|
671
|
+
generatedPropsType += `${parameterName}: any; `;
|
|
672
|
+
}
|
|
673
|
+
generatedProps = `_props: { ${generatedPropsType}}`;
|
|
1027
674
|
for (const parameter of parameters) {
|
|
1028
675
|
const dataSource = usedDataSources.get(parameter.value);
|
|
1029
676
|
if (dataSource) {
|
|
1030
677
|
const valueName = scope.getName(dataSource.id, dataSource.name);
|
|
1031
|
-
|
|
678
|
+
generatedParameters += `const ${valueName} = _props.${parameter.name};
|
|
679
|
+
`;
|
|
1032
680
|
}
|
|
1033
|
-
generatedPropsType += `${parameter.name}: any; `;
|
|
1034
681
|
}
|
|
1035
|
-
generatedPropsValue += `}`;
|
|
1036
|
-
generatedPropsType += `}`;
|
|
1037
|
-
generatedProps = `${generatedPropsValue}: ${generatedPropsType}`;
|
|
1038
682
|
}
|
|
1039
683
|
let generatedDataSources = "";
|
|
1040
684
|
for (const dataSource of usedDataSources.values()) {
|
|
@@ -1063,6 +707,7 @@ var generateWebstudioComponent = ({
|
|
|
1063
707
|
let generatedComponent = "";
|
|
1064
708
|
generatedComponent += `const ${name} = (${generatedProps}) => {
|
|
1065
709
|
`;
|
|
710
|
+
generatedComponent += `${generatedParameters}`;
|
|
1066
711
|
generatedComponent += `${generatedDataSources}`;
|
|
1067
712
|
generatedComponent += `return ${generatedJsx}`;
|
|
1068
713
|
generatedComponent += `}
|
|
@@ -1070,26 +715,19 @@ var generateWebstudioComponent = ({
|
|
|
1070
715
|
return generatedComponent;
|
|
1071
716
|
};
|
|
1072
717
|
export {
|
|
1073
|
-
addGlobalRules,
|
|
1074
718
|
collapsedAttribute,
|
|
1075
719
|
componentAttribute,
|
|
1076
|
-
createImageValueTransformer,
|
|
1077
|
-
editablePlaceholderVariable,
|
|
1078
|
-
editingPlaceholderVariable,
|
|
1079
|
-
generateCss,
|
|
1080
|
-
generateDataFromEmbedTemplate,
|
|
1081
720
|
generateJsxChildren,
|
|
1082
721
|
generateJsxElement,
|
|
1083
722
|
generateRemixParams,
|
|
1084
723
|
generateRemixRoute,
|
|
1085
724
|
generateWebstudioComponent,
|
|
1086
|
-
getIndexesWithinAncestors,
|
|
1087
725
|
idAttribute,
|
|
1088
|
-
indexAttribute,
|
|
1089
726
|
isAttributeNameSafe,
|
|
1090
|
-
namespaceMeta,
|
|
1091
727
|
normalizeProps,
|
|
728
|
+
reactPropsToStandardAttributes,
|
|
1092
729
|
selectorIdAttribute,
|
|
1093
730
|
showAttribute,
|
|
731
|
+
standardAttributesToReactProps,
|
|
1094
732
|
textContentAttribute
|
|
1095
733
|
};
|