@webstudio-is/react-sdk 0.127.0 → 0.129.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.
- package/lib/index.js +79 -99
- package/lib/types/component-generator.d.ts +7 -3
- package/lib/types/expression.d.ts +1 -128
- package/lib/types/index.d.ts +2 -2
- package/package.json +6 -6
package/lib/index.js
CHANGED
|
@@ -31,6 +31,8 @@ var generateRemixRoute = (pathname) => {
|
|
|
31
31
|
var generateRemixParams = (pathname) => {
|
|
32
32
|
const name = pathname.match(/:(?<name>\w+)\*$/)?.groups?.name;
|
|
33
33
|
let generated = "";
|
|
34
|
+
generated += `type Params = Record<string, string | undefined>;
|
|
35
|
+
`;
|
|
34
36
|
generated += `export const getRemixParams = ({ ...params }: Params): Params => {
|
|
35
37
|
`;
|
|
36
38
|
if (name) {
|
|
@@ -802,82 +804,6 @@ var generateExpression = ({
|
|
|
802
804
|
}
|
|
803
805
|
});
|
|
804
806
|
};
|
|
805
|
-
var generateDataSources = ({
|
|
806
|
-
scope,
|
|
807
|
-
typed = false,
|
|
808
|
-
dataSources,
|
|
809
|
-
props
|
|
810
|
-
}) => {
|
|
811
|
-
const variables = /* @__PURE__ */ new Map();
|
|
812
|
-
let body = "";
|
|
813
|
-
const output = /* @__PURE__ */ new Map();
|
|
814
|
-
for (const dataSource of dataSources.values()) {
|
|
815
|
-
if (dataSource.type === "variable") {
|
|
816
|
-
const valueName = scope.getName(dataSource.id, dataSource.name);
|
|
817
|
-
const setterName = scope.getName(
|
|
818
|
-
`set$${dataSource.id}`,
|
|
819
|
-
`set$${dataSource.name}`
|
|
820
|
-
);
|
|
821
|
-
const initialValue = dataSource.value.value;
|
|
822
|
-
output.set(dataSource.id, valueName);
|
|
823
|
-
variables.set(dataSource.id, { valueName, setterName, initialValue });
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
for (const prop of props.values()) {
|
|
827
|
-
if (prop.type === "action") {
|
|
828
|
-
const name = scope.getName(prop.id, prop.name);
|
|
829
|
-
output.set(prop.id, name);
|
|
830
|
-
const setters = /* @__PURE__ */ new Set();
|
|
831
|
-
let args = [];
|
|
832
|
-
let newCode = "";
|
|
833
|
-
for (const value of prop.value) {
|
|
834
|
-
args = value.args;
|
|
835
|
-
newCode += validateExpression(value.code, {
|
|
836
|
-
optional: true,
|
|
837
|
-
effectful: true,
|
|
838
|
-
transformIdentifier: (identifier, assignee) => {
|
|
839
|
-
if (args?.includes(identifier)) {
|
|
840
|
-
return identifier;
|
|
841
|
-
}
|
|
842
|
-
const depId = decodeDataSourceVariable(identifier);
|
|
843
|
-
const dep = depId ? dataSources.get(depId) : void 0;
|
|
844
|
-
if (dep) {
|
|
845
|
-
const name2 = scope.getName(dep.id, dep.name);
|
|
846
|
-
if (assignee) {
|
|
847
|
-
setters.add(dep.id);
|
|
848
|
-
}
|
|
849
|
-
return name2;
|
|
850
|
-
}
|
|
851
|
-
console.error(`Unknown dependency "${identifier}"`);
|
|
852
|
-
return identifier;
|
|
853
|
-
}
|
|
854
|
-
});
|
|
855
|
-
newCode += `
|
|
856
|
-
`;
|
|
857
|
-
}
|
|
858
|
-
if (typed) {
|
|
859
|
-
args = args.map((arg) => `${arg}: any`);
|
|
860
|
-
}
|
|
861
|
-
body += `let ${name} = (${args.join(", ")}) => {
|
|
862
|
-
`;
|
|
863
|
-
body += newCode;
|
|
864
|
-
for (const dataSourceId of setters.values()) {
|
|
865
|
-
const variable = variables.get(dataSourceId);
|
|
866
|
-
if (variable) {
|
|
867
|
-
body += `${variable.setterName}(${variable.valueName})
|
|
868
|
-
`;
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
body += `}
|
|
872
|
-
`;
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
return {
|
|
876
|
-
variables,
|
|
877
|
-
body,
|
|
878
|
-
output
|
|
879
|
-
};
|
|
880
|
-
};
|
|
881
807
|
|
|
882
808
|
// src/embed-template.ts
|
|
883
809
|
var EmbedTemplateText = z2.object({
|
|
@@ -1399,6 +1325,58 @@ var generateUtilsExport = (siteData) => {
|
|
|
1399
1325
|
|
|
1400
1326
|
// src/component-generator.ts
|
|
1401
1327
|
import { parseComponentName } from "@webstudio-is/sdk";
|
|
1328
|
+
var generateAction = ({
|
|
1329
|
+
scope,
|
|
1330
|
+
prop,
|
|
1331
|
+
dataSources
|
|
1332
|
+
}) => {
|
|
1333
|
+
const setters = /* @__PURE__ */ new Set();
|
|
1334
|
+
let args = [];
|
|
1335
|
+
let assignersCode = "";
|
|
1336
|
+
for (const value of prop.value) {
|
|
1337
|
+
args = value.args;
|
|
1338
|
+
assignersCode += validateExpression(value.code, {
|
|
1339
|
+
optional: true,
|
|
1340
|
+
effectful: true,
|
|
1341
|
+
transformIdentifier: (identifier, assignee) => {
|
|
1342
|
+
if (args?.includes(identifier)) {
|
|
1343
|
+
return identifier;
|
|
1344
|
+
}
|
|
1345
|
+
const depId = decodeDataSourceVariable(identifier);
|
|
1346
|
+
const dep = depId ? dataSources.get(depId) : void 0;
|
|
1347
|
+
if (dep) {
|
|
1348
|
+
if (assignee) {
|
|
1349
|
+
setters.add(dep);
|
|
1350
|
+
}
|
|
1351
|
+
const valueName = scope.getName(dep.id, dep.name);
|
|
1352
|
+
return valueName;
|
|
1353
|
+
}
|
|
1354
|
+
console.error(`Unknown dependency "${identifier}"`);
|
|
1355
|
+
return identifier;
|
|
1356
|
+
}
|
|
1357
|
+
});
|
|
1358
|
+
assignersCode += `
|
|
1359
|
+
`;
|
|
1360
|
+
}
|
|
1361
|
+
let settersCode = "";
|
|
1362
|
+
for (const dataSource of setters) {
|
|
1363
|
+
const valueName = scope.getName(dataSource.id, dataSource.name);
|
|
1364
|
+
const setterName = scope.getName(
|
|
1365
|
+
`set$${dataSource.id}`,
|
|
1366
|
+
`set$${dataSource.name}`
|
|
1367
|
+
);
|
|
1368
|
+
settersCode += `${setterName}(${valueName})
|
|
1369
|
+
`;
|
|
1370
|
+
}
|
|
1371
|
+
const argsList = args.map((arg) => `${arg}: any`).join(", ");
|
|
1372
|
+
let generated = "";
|
|
1373
|
+
generated += `(${argsList}) => {
|
|
1374
|
+
`;
|
|
1375
|
+
generated += assignersCode;
|
|
1376
|
+
generated += settersCode;
|
|
1377
|
+
generated += `}`;
|
|
1378
|
+
return generated;
|
|
1379
|
+
};
|
|
1402
1380
|
var generatePropValue = ({
|
|
1403
1381
|
scope,
|
|
1404
1382
|
prop,
|
|
@@ -1425,7 +1403,7 @@ var generatePropValue = ({
|
|
|
1425
1403
|
});
|
|
1426
1404
|
}
|
|
1427
1405
|
if (prop.type === "action") {
|
|
1428
|
-
return scope
|
|
1406
|
+
return generateAction({ scope, prop, dataSources });
|
|
1429
1407
|
}
|
|
1430
1408
|
prop;
|
|
1431
1409
|
};
|
|
@@ -1588,25 +1566,38 @@ var generateJsxChildren = ({
|
|
|
1588
1566
|
}
|
|
1589
1567
|
return generatedChildren;
|
|
1590
1568
|
};
|
|
1591
|
-
var
|
|
1569
|
+
var generateWebstudioComponent = ({
|
|
1592
1570
|
scope,
|
|
1593
|
-
|
|
1571
|
+
name,
|
|
1572
|
+
rootInstanceId,
|
|
1573
|
+
parameters,
|
|
1594
1574
|
instances,
|
|
1595
1575
|
props,
|
|
1596
1576
|
dataSources,
|
|
1597
1577
|
indexesWithinAncestors,
|
|
1598
1578
|
classesMap
|
|
1599
1579
|
}) => {
|
|
1600
|
-
const instance = instances.get(
|
|
1580
|
+
const instance = instances.get(rootInstanceId);
|
|
1601
1581
|
if (instance === void 0) {
|
|
1602
1582
|
return "";
|
|
1603
1583
|
}
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1584
|
+
let generatedProps = "";
|
|
1585
|
+
if (parameters.length > 0) {
|
|
1586
|
+
let generatedPropsValue = "{ ";
|
|
1587
|
+
let generatedPropsType = "{ ";
|
|
1588
|
+
for (const parameter of parameters) {
|
|
1589
|
+
const dataSource = dataSources.get(parameter.value);
|
|
1590
|
+
if (dataSource === void 0) {
|
|
1591
|
+
continue;
|
|
1592
|
+
}
|
|
1593
|
+
const valueName = scope.getName(dataSource.id, dataSource.name);
|
|
1594
|
+
generatedPropsValue += `${parameter.name}: ${valueName}, `;
|
|
1595
|
+
generatedPropsType += `${parameter.name}: any; `;
|
|
1596
|
+
}
|
|
1597
|
+
generatedPropsValue += `}`;
|
|
1598
|
+
generatedPropsType += `}`;
|
|
1599
|
+
generatedProps = `${generatedPropsValue}: ${generatedPropsType}`;
|
|
1600
|
+
}
|
|
1610
1601
|
let generatedDataSources = "";
|
|
1611
1602
|
for (const dataSource of dataSources.values()) {
|
|
1612
1603
|
if (dataSource.type === "variable") {
|
|
@@ -1620,13 +1611,6 @@ var generatePageComponent = ({
|
|
|
1620
1611
|
generatedDataSources += `let [${valueName}, ${setterName}] = useState<any>(${initialValueString})
|
|
1621
1612
|
`;
|
|
1622
1613
|
}
|
|
1623
|
-
if (dataSource.type === "parameter") {
|
|
1624
|
-
if (dataSource.id === page.pathVariableId) {
|
|
1625
|
-
const valueName = scope.getName(dataSource.id, dataSource.name);
|
|
1626
|
-
generatedDataSources += `let ${valueName} = _props.params
|
|
1627
|
-
`;
|
|
1628
|
-
}
|
|
1629
|
-
}
|
|
1630
1614
|
if (dataSource.type === "resource") {
|
|
1631
1615
|
const valueName = scope.getName(dataSource.id, dataSource.name);
|
|
1632
1616
|
const resourceName = scope.getName(
|
|
@@ -1638,7 +1622,6 @@ var generatePageComponent = ({
|
|
|
1638
1622
|
`;
|
|
1639
1623
|
}
|
|
1640
1624
|
}
|
|
1641
|
-
generatedDataSources += dataSourcesBody;
|
|
1642
1625
|
const generatedJsx = generateJsxElement({
|
|
1643
1626
|
scope,
|
|
1644
1627
|
instance,
|
|
@@ -1657,9 +1640,7 @@ var generatePageComponent = ({
|
|
|
1657
1640
|
})
|
|
1658
1641
|
});
|
|
1659
1642
|
let generatedComponent = "";
|
|
1660
|
-
generatedComponent += `
|
|
1661
|
-
`;
|
|
1662
|
-
generatedComponent += `const Page = (_props: { params: Params }) => {
|
|
1643
|
+
generatedComponent += `const ${name} = (${generatedProps}) => {
|
|
1663
1644
|
`;
|
|
1664
1645
|
generatedComponent += `${generatedDataSources}`;
|
|
1665
1646
|
generatedComponent += `return ${generatedJsx}`;
|
|
@@ -1797,14 +1778,13 @@ export {
|
|
|
1797
1778
|
encodeDataSourceVariable,
|
|
1798
1779
|
generateCss,
|
|
1799
1780
|
generateDataFromEmbedTemplate,
|
|
1800
|
-
generateDataSources,
|
|
1801
1781
|
generateJsxChildren,
|
|
1802
1782
|
generateJsxElement,
|
|
1803
|
-
generatePageComponent,
|
|
1804
1783
|
generateRemixParams,
|
|
1805
1784
|
generateRemixRoute,
|
|
1806
1785
|
generateResourcesLoader,
|
|
1807
1786
|
generateUtilsExport,
|
|
1787
|
+
generateWebstudioComponent,
|
|
1808
1788
|
getClosestInstance,
|
|
1809
1789
|
getIndexWithinAncestorFromComponentProps,
|
|
1810
1790
|
getIndexesWithinAncestors,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Instances, Instance, Props, Scope, DataSources,
|
|
1
|
+
import type { Instances, Instance, Props, Scope, DataSources, Prop } from "@webstudio-is/sdk";
|
|
2
2
|
import type { IndexesWithinAncestors } from "./instance-utils";
|
|
3
3
|
export declare const generateJsxElement: ({ scope, instance, props, dataSources, indexesWithinAncestors, children, classesMap, }: {
|
|
4
4
|
scope: Scope;
|
|
@@ -257,9 +257,13 @@ export declare const generateJsxChildren: ({ scope, children, instances, props,
|
|
|
257
257
|
indexesWithinAncestors: IndexesWithinAncestors;
|
|
258
258
|
classesMap?: Map<string, string[]> | undefined;
|
|
259
259
|
}) => string;
|
|
260
|
-
export declare const
|
|
260
|
+
export declare const generateWebstudioComponent: ({ scope, name, rootInstanceId, parameters, instances, props, dataSources, indexesWithinAncestors, classesMap, }: {
|
|
261
261
|
scope: Scope;
|
|
262
|
-
|
|
262
|
+
name: string;
|
|
263
|
+
rootInstanceId: Instance["id"];
|
|
264
|
+
parameters: Extract<Prop, {
|
|
265
|
+
type: "parameter";
|
|
266
|
+
}>[];
|
|
263
267
|
instances: Map<string, {
|
|
264
268
|
type: "instance";
|
|
265
269
|
id: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DataSources,
|
|
1
|
+
import type { DataSources, Scope } from "@webstudio-is/sdk";
|
|
2
2
|
type TransformIdentifier = (id: string, assignee: boolean) => string;
|
|
3
3
|
export declare const validateExpression: (code: string, options?: {
|
|
4
4
|
/**
|
|
@@ -51,131 +51,4 @@ export declare const generateExpression: ({ expression, dataSources, scope, }: {
|
|
|
51
51
|
}>;
|
|
52
52
|
scope: Scope;
|
|
53
53
|
}) => string;
|
|
54
|
-
type VariableName = string;
|
|
55
|
-
export declare const generateDataSources: ({ scope, typed, dataSources, props, }: {
|
|
56
|
-
scope: Scope;
|
|
57
|
-
typed?: boolean | undefined;
|
|
58
|
-
dataSources: Map<string, {
|
|
59
|
-
value: {
|
|
60
|
-
value: number;
|
|
61
|
-
type: "number";
|
|
62
|
-
} | {
|
|
63
|
-
value: string;
|
|
64
|
-
type: "string";
|
|
65
|
-
} | {
|
|
66
|
-
value: boolean;
|
|
67
|
-
type: "boolean";
|
|
68
|
-
} | {
|
|
69
|
-
value: string[];
|
|
70
|
-
type: "string[]";
|
|
71
|
-
} | {
|
|
72
|
-
type: "json";
|
|
73
|
-
value?: unknown;
|
|
74
|
-
};
|
|
75
|
-
type: "variable";
|
|
76
|
-
name: string;
|
|
77
|
-
id: string;
|
|
78
|
-
scopeInstanceId?: string | undefined;
|
|
79
|
-
} | {
|
|
80
|
-
type: "parameter";
|
|
81
|
-
name: string;
|
|
82
|
-
id: string;
|
|
83
|
-
scopeInstanceId?: string | undefined;
|
|
84
|
-
} | {
|
|
85
|
-
type: "resource";
|
|
86
|
-
name: string;
|
|
87
|
-
id: string;
|
|
88
|
-
resourceId: string;
|
|
89
|
-
scopeInstanceId?: string | undefined;
|
|
90
|
-
}>;
|
|
91
|
-
props: Map<string, {
|
|
92
|
-
value: number;
|
|
93
|
-
type: "number";
|
|
94
|
-
name: string;
|
|
95
|
-
id: string;
|
|
96
|
-
instanceId: string;
|
|
97
|
-
required?: boolean | undefined;
|
|
98
|
-
} | {
|
|
99
|
-
value: string;
|
|
100
|
-
type: "string";
|
|
101
|
-
name: string;
|
|
102
|
-
id: string;
|
|
103
|
-
instanceId: string;
|
|
104
|
-
required?: boolean | undefined;
|
|
105
|
-
} | {
|
|
106
|
-
value: boolean;
|
|
107
|
-
type: "boolean";
|
|
108
|
-
name: string;
|
|
109
|
-
id: string;
|
|
110
|
-
instanceId: string;
|
|
111
|
-
required?: boolean | undefined;
|
|
112
|
-
} | {
|
|
113
|
-
type: "json";
|
|
114
|
-
name: string;
|
|
115
|
-
id: string;
|
|
116
|
-
instanceId: string;
|
|
117
|
-
value?: unknown;
|
|
118
|
-
required?: boolean | undefined;
|
|
119
|
-
} | {
|
|
120
|
-
value: string;
|
|
121
|
-
type: "asset";
|
|
122
|
-
name: string;
|
|
123
|
-
id: string;
|
|
124
|
-
instanceId: string;
|
|
125
|
-
required?: boolean | undefined;
|
|
126
|
-
} | {
|
|
127
|
-
value: (string | {
|
|
128
|
-
instanceId: string;
|
|
129
|
-
pageId: string;
|
|
130
|
-
}) & (string | {
|
|
131
|
-
instanceId: string;
|
|
132
|
-
pageId: string;
|
|
133
|
-
} | undefined);
|
|
134
|
-
type: "page";
|
|
135
|
-
name: string;
|
|
136
|
-
id: string;
|
|
137
|
-
instanceId: string;
|
|
138
|
-
required?: boolean | undefined;
|
|
139
|
-
} | {
|
|
140
|
-
value: string[];
|
|
141
|
-
type: "string[]";
|
|
142
|
-
name: string;
|
|
143
|
-
id: string;
|
|
144
|
-
instanceId: string;
|
|
145
|
-
required?: boolean | undefined;
|
|
146
|
-
} | {
|
|
147
|
-
value: string;
|
|
148
|
-
type: "parameter";
|
|
149
|
-
name: string;
|
|
150
|
-
id: string;
|
|
151
|
-
instanceId: string;
|
|
152
|
-
required?: boolean | undefined;
|
|
153
|
-
} | {
|
|
154
|
-
value: string;
|
|
155
|
-
type: "expression";
|
|
156
|
-
name: string;
|
|
157
|
-
id: string;
|
|
158
|
-
instanceId: string;
|
|
159
|
-
required?: boolean | undefined;
|
|
160
|
-
} | {
|
|
161
|
-
value: {
|
|
162
|
-
code: string;
|
|
163
|
-
type: "execute";
|
|
164
|
-
args: string[];
|
|
165
|
-
}[];
|
|
166
|
-
type: "action";
|
|
167
|
-
name: string;
|
|
168
|
-
id: string;
|
|
169
|
-
instanceId: string;
|
|
170
|
-
required?: boolean | undefined;
|
|
171
|
-
}>;
|
|
172
|
-
}) => {
|
|
173
|
-
variables: Map<string, {
|
|
174
|
-
valueName: VariableName;
|
|
175
|
-
setterName: VariableName;
|
|
176
|
-
initialValue: unknown;
|
|
177
|
-
}>;
|
|
178
|
-
body: string;
|
|
179
|
-
output: Map<string, string>;
|
|
180
|
-
};
|
|
181
54
|
export {};
|
package/lib/types/index.d.ts
CHANGED
|
@@ -9,9 +9,9 @@ export { type WsComponentPropsMeta, type ComponentState, type PresetStyle, WsCom
|
|
|
9
9
|
export * from "./embed-template";
|
|
10
10
|
export * from "./props";
|
|
11
11
|
export * from "./context";
|
|
12
|
-
export { validateExpression, encodeDataSourceVariable, decodeDataSourceVariable,
|
|
12
|
+
export { validateExpression, encodeDataSourceVariable, decodeDataSourceVariable, } from "./expression";
|
|
13
13
|
export { getIndexesWithinAncestors } from "./instance-utils";
|
|
14
14
|
export * from "./hook";
|
|
15
15
|
export { generateUtilsExport } from "./generator";
|
|
16
|
-
export {
|
|
16
|
+
export { generateWebstudioComponent, generateJsxElement, generateJsxChildren, } from "./component-generator";
|
|
17
17
|
export { generateResourcesLoader } from "./resources-generator";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webstudio-is/react-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.129.0",
|
|
4
4
|
"description": "Webstudio JavaScript / TypeScript API",
|
|
5
5
|
"author": "Webstudio <github@webstudio.is>",
|
|
6
6
|
"homepage": "https://webstudio.is",
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
"jsep": "^1.3.8",
|
|
34
34
|
"nanoid": "^5.0.1",
|
|
35
35
|
"title-case": "^4.1.0",
|
|
36
|
-
"@webstudio-is/
|
|
37
|
-
"@webstudio-is/
|
|
38
|
-
"@webstudio-is/
|
|
39
|
-
"@webstudio-is/
|
|
40
|
-
"@webstudio-is/
|
|
36
|
+
"@webstudio-is/fonts": "0.129.0",
|
|
37
|
+
"@webstudio-is/css-engine": "0.129.0",
|
|
38
|
+
"@webstudio-is/icons": "^0.129.0",
|
|
39
|
+
"@webstudio-is/image": "0.129.0",
|
|
40
|
+
"@webstudio-is/sdk": "0.129.0"
|
|
41
41
|
},
|
|
42
42
|
"exports": {
|
|
43
43
|
".": {
|