@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 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.getName(prop.id, prop.name);
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 generatePageComponent = ({
1569
+ var generateWebstudioComponent = ({
1592
1570
  scope,
1593
- page,
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(page.rootInstanceId);
1580
+ const instance = instances.get(rootInstanceId);
1601
1581
  if (instance === void 0) {
1602
1582
  return "";
1603
1583
  }
1604
- const { body: dataSourcesBody } = generateDataSources({
1605
- typed: true,
1606
- scope,
1607
- dataSources,
1608
- props
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 += `type Params = Record<string, string | undefined>
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, Page } from "@webstudio-is/sdk";
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 generatePageComponent: ({ scope, page, instances, props, dataSources, indexesWithinAncestors, classesMap, }: {
260
+ export declare const generateWebstudioComponent: ({ scope, name, rootInstanceId, parameters, instances, props, dataSources, indexesWithinAncestors, classesMap, }: {
261
261
  scope: Scope;
262
- page: Page;
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, Props, Scope } from "@webstudio-is/sdk";
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 {};
@@ -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, generateDataSources, } from "./expression";
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 { generatePageComponent, generateJsxElement, generateJsxChildren, } from "./component-generator";
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.127.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/css-engine": "0.127.0",
37
- "@webstudio-is/fonts": "0.127.0",
38
- "@webstudio-is/image": "0.127.0",
39
- "@webstudio-is/sdk": "0.127.0",
40
- "@webstudio-is/icons": "^0.127.0"
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
  ".": {