webstudio 0.202.0 → 0.203.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/cli.js CHANGED
@@ -28,7 +28,6 @@ import { kebabCase, camelCase } from "change-case";
28
28
  import "nanoid";
29
29
  import { parseExpressionAt } from "acorn";
30
30
  import { simple } from "acorn-walk";
31
- import warnOnce from "warn-once";
32
31
  import reservedIdentifiers from "reserved-identifiers";
33
32
  import hash from "@emotion/hash";
34
33
  import { x } from "tinyexec";
@@ -80,13 +79,18 @@ const PROJECT_TEMPLATES = [
80
79
  {
81
80
  value: "docker",
82
81
  label: "Docker",
83
- expand: ["react-router-docker"]
82
+ expand: ["react-router", "react-router-docker"]
84
83
  },
85
84
  {
86
85
  value: "vercel",
87
86
  label: "Vercel",
88
87
  expand: ["defaults", "vercel"]
89
88
  },
89
+ {
90
+ value: "netlify",
91
+ label: "Netlify",
92
+ expand: ["react-router", "react-router-netlify"]
93
+ },
90
94
  {
91
95
  value: "netlify-functions",
92
96
  label: "Netlify Functions",
@@ -746,15 +750,6 @@ const prefixStyles = (styleMap) => {
746
750
  }
747
751
  return newStyleMap;
748
752
  };
749
- const captureError = (error, value) => {
750
- if (process.env.NODE_ENV === "development") {
751
- throw error;
752
- }
753
- setTimeout(() => {
754
- throw error;
755
- });
756
- return value;
757
- };
758
753
  const fallbackTransform = (styleValue) => {
759
754
  var _a;
760
755
  if (styleValue.type !== "fontFamily") {
@@ -846,7 +841,7 @@ const toValue = (styleValue, transformValue) => {
846
841
  if (value.type === "guaranteedInvalid") {
847
842
  return "";
848
843
  }
849
- return captureError(new Error("Unknown value type"), value);
844
+ return "";
850
845
  };
851
846
  const Unit = z.string();
852
847
  const UnitValue = z.object({
@@ -3447,7 +3442,7 @@ ${prop.name}={${propValue}}`;
3447
3442
  return "";
3448
3443
  }
3449
3444
  const indexVariable = scope.getName(`${instance.id}-index`, "index");
3450
- generatedElement += `{${collectionDataValue}?.map((${collectionItemValue}: any, ${indexVariable}: number) =>
3445
+ generatedElement += `{${collectionDataValue}?.map?.((${collectionItemValue}: any, ${indexVariable}: number) =>
3451
3446
  `;
3452
3447
  generatedElement += `<Fragment key={${indexVariable}}>
3453
3448
  `;
@@ -3645,47 +3640,6 @@ const generateWebstudioComponent = ({
3645
3640
  `;
3646
3641
  return generatedComponent;
3647
3642
  };
3648
- const imageSizes = [16, 32, 48, 64, 96, 128, 256, 384];
3649
- const deviceSizes = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];
3650
- const allSizes = [...imageSizes, ...deviceSizes];
3651
- const NON_EXISTING_DOMAIN = "https://a3cbcbec-cdb1-4ea4-ad60-43c795308ddc.ddc";
3652
- const joinPath = (...segments) => {
3653
- return segments.filter((segment) => segment !== "").map((segment) => segment.replace(/(^\/+|\/+$)/g, "")).join("/");
3654
- };
3655
- const encodePathFragment = (fragment) => {
3656
- return encodeURIComponent(fragment).replace(/%2F/g, "/");
3657
- };
3658
- const wsImageLoader = (props2) => {
3659
- const width = props2.format === "raw" ? 16 : props2.width;
3660
- const quality = props2.format === "raw" ? 100 : props2.quality;
3661
- if (process.env.NODE_ENV !== "production") {
3662
- warnOnce(
3663
- allSizes.includes(width) === false,
3664
- "Width must be only from allowed values"
3665
- );
3666
- }
3667
- let src = props2.src;
3668
- if (src.startsWith("/cgi/asset")) {
3669
- src = src.slice("/cgi/asset".length);
3670
- }
3671
- const resultUrl = new URL("/cgi/image/", NON_EXISTING_DOMAIN);
3672
- if (props2.format !== "raw") {
3673
- resultUrl.searchParams.set("width", width.toString());
3674
- resultUrl.searchParams.set("quality", quality.toString());
3675
- if (props2.height != null) {
3676
- resultUrl.searchParams.set("height", props2.height.toString());
3677
- }
3678
- if (props2.fit != null) {
3679
- resultUrl.searchParams.set("fit", props2.fit);
3680
- }
3681
- }
3682
- resultUrl.searchParams.set("format", props2.format ?? "auto");
3683
- resultUrl.pathname = joinPath(resultUrl.pathname, encodePathFragment(src));
3684
- if (resultUrl.href.startsWith(NON_EXISTING_DOMAIN)) {
3685
- return `${resultUrl.pathname}?${resultUrl.searchParams.toString()}`;
3686
- }
3687
- return resultUrl.href;
3688
- };
3689
3643
  const BOOLEAN_ATTRIBUTES = /* @__PURE__ */ new Set([
3690
3644
  "async",
3691
3645
  "autofocus",
@@ -5918,7 +5872,7 @@ Please check webstudio --help for more details`
5918
5872
  let framework;
5919
5873
  if (options.template.includes("ssg")) {
5920
5874
  framework = await createFramework();
5921
- } else if (options.template.includes("react-router-docker")) {
5875
+ } else if (options.template.includes("react-router")) {
5922
5876
  framework = await createFramework$1();
5923
5877
  } else {
5924
5878
  framework = await createFramework$2();
@@ -6034,14 +5988,10 @@ Please check webstudio --help for more details`
6034
5988
  const assetOrigin = siteData.origin;
6035
5989
  for (const asset of siteData.assets) {
6036
5990
  if (asset.type === "image") {
6037
- const imagePath = wsImageLoader({
6038
- src: asset.name,
6039
- format: "raw"
6040
- });
6041
5991
  assetsToDownload.push(
6042
5992
  limit(
6043
5993
  () => downloadAsset(
6044
- `${assetOrigin}${imagePath}`,
5994
+ `${assetOrigin}/cgi/image/${asset.name}?format=raw`,
6045
5995
  asset.name,
6046
5996
  assetBaseUrl
6047
5997
  )
@@ -6458,6 +6408,7 @@ const getDeploymentInstructions = (deployTarget) => {
6458
6408
  switch (deployTarget) {
6459
6409
  case "vercel":
6460
6410
  return `Run ${pc.dim("npx vercel")} to publish on Vercel.`;
6411
+ case "netlify":
6461
6412
  case "netlify-functions":
6462
6413
  case "netlify-edge-functions":
6463
6414
  return [
@@ -6472,7 +6423,7 @@ const getDeploymentInstructions = (deployTarget) => {
6472
6423
  }
6473
6424
  };
6474
6425
  const name = "webstudio";
6475
- const version = "0.202.0";
6426
+ const version = "0.203.0";
6476
6427
  const description = "Webstudio CLI";
6477
6428
  const author = "Webstudio <github@webstudio.is>";
6478
6429
  const homepage = "https://webstudio.is";
@@ -6514,18 +6465,17 @@ const dependencies = {
6514
6465
  "p-limit": "^6.2.0",
6515
6466
  parse5: "7.2.1",
6516
6467
  picocolors: "^1.1.1",
6517
- react: "18.3.0-canary-14898b6a9-20240318",
6518
6468
  "reserved-identifiers": "^1.0.0",
6519
6469
  tinyexec: "^0.3.2",
6520
- "warn-once": "^0.1.1",
6521
6470
  yargs: "^17.7.2",
6522
6471
  zod: "^3.22.4"
6523
6472
  };
6524
6473
  const devDependencies = {
6525
6474
  "@netlify/remix-adapter": "^2.5.1",
6526
6475
  "@netlify/remix-edge-adapter": "3.4.2",
6527
- "@react-router/dev": "^7.1.3",
6528
- "@react-router/fs-routes": "^7.1.3",
6476
+ "@netlify/vite-plugin-react-router": "^1.0.0",
6477
+ "@react-router/dev": "^7.1.5",
6478
+ "@react-router/fs-routes": "^7.1.5",
6529
6479
  "@remix-run/cloudflare": "^2.15.2",
6530
6480
  "@remix-run/cloudflare-pages": "^2.15.2",
6531
6481
  "@remix-run/dev": "^2.15.2",
@@ -6549,10 +6499,11 @@ const devDependencies = {
6549
6499
  h3: "^1.14.0",
6550
6500
  ipx: "^3.0.1",
6551
6501
  prettier: "3.4.2",
6502
+ react: "18.3.0-canary-14898b6a9-20240318",
6552
6503
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
6553
- "react-router": "^7.1.3",
6504
+ "react-router": "^7.1.5",
6554
6505
  "ts-expect": "^1.3.0",
6555
- vike: "^0.4.219",
6506
+ vike: "^0.4.220",
6556
6507
  vite: "^5.4.11",
6557
6508
  vitest: "^3.0.2",
6558
6509
  wrangler: "^3.63.2"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webstudio",
3
- "version": "0.202.0",
3
+ "version": "0.203.0",
4
4
  "description": "Webstudio CLI",
5
5
  "author": "Webstudio <github@webstudio.is>",
6
6
  "homepage": "https://webstudio.is",
@@ -37,18 +37,17 @@
37
37
  "p-limit": "^6.2.0",
38
38
  "parse5": "7.2.1",
39
39
  "picocolors": "^1.1.1",
40
- "react": "18.3.0-canary-14898b6a9-20240318",
41
40
  "reserved-identifiers": "^1.0.0",
42
41
  "tinyexec": "^0.3.2",
43
- "warn-once": "^0.1.1",
44
42
  "yargs": "^17.7.2",
45
43
  "zod": "^3.22.4"
46
44
  },
47
45
  "devDependencies": {
48
46
  "@netlify/remix-adapter": "^2.5.1",
49
47
  "@netlify/remix-edge-adapter": "3.4.2",
50
- "@react-router/dev": "^7.1.3",
51
- "@react-router/fs-routes": "^7.1.3",
48
+ "@netlify/vite-plugin-react-router": "^1.0.0",
49
+ "@react-router/dev": "^7.1.5",
50
+ "@react-router/fs-routes": "^7.1.5",
52
51
  "@remix-run/cloudflare": "^2.15.2",
53
52
  "@remix-run/cloudflare-pages": "^2.15.2",
54
53
  "@remix-run/dev": "^2.15.2",
@@ -62,22 +61,23 @@
62
61
  "h3": "^1.14.0",
63
62
  "ipx": "^3.0.1",
64
63
  "prettier": "3.4.2",
64
+ "react": "18.3.0-canary-14898b6a9-20240318",
65
65
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
66
- "react-router": "^7.1.3",
66
+ "react-router": "^7.1.5",
67
67
  "ts-expect": "^1.3.0",
68
- "vike": "^0.4.219",
68
+ "vike": "^0.4.220",
69
69
  "vite": "^5.4.11",
70
70
  "vitest": "^3.0.2",
71
71
  "wrangler": "^3.63.2",
72
- "@webstudio-is/http-client": "0.202.0",
73
- "@webstudio-is/image": "0.202.0",
74
- "@webstudio-is/react-sdk": "0.202.0",
75
- "@webstudio-is/sdk": "0.202.0",
76
- "@webstudio-is/sdk-components-animation": "0.202.0",
77
- "@webstudio-is/sdk-components-react-radix": "0.202.0",
78
- "@webstudio-is/sdk-components-react": "0.202.0",
79
- "@webstudio-is/sdk-components-react-remix": "0.202.0",
80
- "@webstudio-is/sdk-components-react-router": "0.202.0",
72
+ "@webstudio-is/image": "0.203.0",
73
+ "@webstudio-is/react-sdk": "0.203.0",
74
+ "@webstudio-is/http-client": "0.203.0",
75
+ "@webstudio-is/sdk": "0.203.0",
76
+ "@webstudio-is/sdk-components-animation": "0.203.0",
77
+ "@webstudio-is/sdk-components-react": "0.203.0",
78
+ "@webstudio-is/sdk-components-react-radix": "0.203.0",
79
+ "@webstudio-is/sdk-components-react-remix": "0.203.0",
80
+ "@webstudio-is/sdk-components-react-router": "0.203.0",
81
81
  "@webstudio-is/tsconfig": "1.0.7"
82
82
  },
83
83
  "scripts": {
@@ -11,14 +11,14 @@
11
11
  "@remix-run/node": "2.15.2",
12
12
  "@remix-run/react": "2.15.2",
13
13
  "@remix-run/server-runtime": "2.15.2",
14
- "@webstudio-is/image": "0.202.0",
15
- "@webstudio-is/react-sdk": "0.202.0",
16
- "@webstudio-is/sdk": "0.202.0",
17
- "@webstudio-is/sdk-components-react": "0.202.0",
18
- "@webstudio-is/sdk-components-animation": "0.202.0",
19
- "@webstudio-is/sdk-components-react-radix": "0.202.0",
20
- "@webstudio-is/sdk-components-react-remix": "0.202.0",
21
- "isbot": "^5.1.21",
14
+ "@webstudio-is/image": "0.203.0",
15
+ "@webstudio-is/react-sdk": "0.203.0",
16
+ "@webstudio-is/sdk": "0.203.0",
17
+ "@webstudio-is/sdk-components-react": "0.203.0",
18
+ "@webstudio-is/sdk-components-animation": "0.203.0",
19
+ "@webstudio-is/sdk-components-react-radix": "0.203.0",
20
+ "@webstudio-is/sdk-components-react-remix": "0.203.0",
21
+ "isbot": "^5.1.22",
22
22
  "react": "18.3.0-canary-14898b6a9-20240318",
23
23
  "react-dom": "18.3.0-canary-14898b6a9-20240318"
24
24
  },
@@ -0,0 +1,34 @@
1
+ {
2
+ "type": "module",
3
+ "private": true,
4
+ "sideEffects": false,
5
+ "scripts": {
6
+ "build": "react-router build",
7
+ "dev": "react-router dev",
8
+ "typecheck": "tsc"
9
+ },
10
+ "dependencies": {
11
+ "@react-router/dev": "^7.1.5",
12
+ "@react-router/fs-routes": "^7.1.5",
13
+ "@webstudio-is/image": "0.203.0",
14
+ "@webstudio-is/react-sdk": "0.203.0",
15
+ "@webstudio-is/sdk": "0.203.0",
16
+ "@webstudio-is/sdk-components-animation": "0.203.0",
17
+ "@webstudio-is/sdk-components-react-radix": "0.203.0",
18
+ "@webstudio-is/sdk-components-react-router": "0.203.0",
19
+ "@webstudio-is/sdk-components-react": "0.203.0",
20
+ "isbot": "^5.1.22",
21
+ "react": "18.3.0-canary-14898b6a9-20240318",
22
+ "react-dom": "18.3.0-canary-14898b6a9-20240318",
23
+ "react-router": "^7.1.5",
24
+ "vite": "^5.4.11"
25
+ },
26
+ "devDependencies": {
27
+ "@types/react": "^18.2.70",
28
+ "@types/react-dom": "^18.2.25",
29
+ "typescript": "5.7.3"
30
+ },
31
+ "engines": {
32
+ "node": ">=20.0.0"
33
+ }
34
+ }
@@ -1,39 +1,11 @@
1
1
  {
2
- "type": "module",
3
- "private": true,
4
- "sideEffects": false,
5
2
  "scripts": {
6
- "build": "react-router build",
7
- "dev": "react-router dev",
8
- "start": "react-router-serve ./build/server/index.js",
9
- "typecheck": "tsc"
3
+ "start": "react-router-serve ./build/server/index.js"
10
4
  },
11
5
  "dependencies": {
12
- "@react-router/dev": "^7.1.3",
13
- "@react-router/fs-routes": "^7.1.3",
14
- "@react-router/node": "^7.1.3",
15
- "@react-router/serve": "^7.1.3",
16
- "@webstudio-is/image": "0.202.0",
17
- "@webstudio-is/react-sdk": "0.202.0",
18
- "@webstudio-is/sdk": "0.202.0",
19
- "@webstudio-is/sdk-components-animation": "0.202.0",
20
- "@webstudio-is/sdk-components-react-radix": "0.202.0",
21
- "@webstudio-is/sdk-components-react-router": "0.202.0",
22
- "@webstudio-is/sdk-components-react": "0.202.0",
6
+ "@react-router/node": "^7.1.5",
7
+ "@react-router/serve": "^7.1.5",
23
8
  "h3": "^1.14.0",
24
- "ipx": "^3.0.1",
25
- "isbot": "^5.1.21",
26
- "react": "18.3.0-canary-14898b6a9-20240318",
27
- "react-dom": "18.3.0-canary-14898b6a9-20240318",
28
- "react-router": "^7.1.3",
29
- "vite": "^5.4.11"
30
- },
31
- "devDependencies": {
32
- "@types/react": "^18.2.70",
33
- "@types/react-dom": "^18.2.25",
34
- "typescript": "5.7.3"
35
- },
36
- "engines": {
37
- "node": ">=20.0.0"
9
+ "ipx": "^3.0.1"
38
10
  }
39
11
  }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * We use mjs extension as constants in this file is shared with the build script
3
+ * and we use `node --eval` to extract the constants.
4
+ */
5
+ export const assetBaseUrl = "/assets/";
6
+
7
+ /**
8
+ * @type {import("@webstudio-is/image").ImageLoader}
9
+ */
10
+ export const imageLoader = (props) => {
11
+ if (import.meta.env.DEV) {
12
+ return props.src;
13
+ }
14
+
15
+ if (props.format === "raw") {
16
+ return props.src;
17
+ }
18
+
19
+ // https://docs.netlify.com/image-cdn/overview/
20
+ const searchParams = new URLSearchParams();
21
+ searchParams.set("url", props.src);
22
+ searchParams.set("w", props.width.toString());
23
+ if (props.height) {
24
+ searchParams.set("h", props.height.toString());
25
+ }
26
+ searchParams.set("q", props.quality.toString());
27
+ // fit=contain by default
28
+ return `/.netlify/images?${searchParams}`;
29
+ };
@@ -0,0 +1,6 @@
1
+ [build]
2
+ command = "react-router build"
3
+ publish = "build/client"
4
+
5
+ [dev]
6
+ command = "react-router dev"
@@ -0,0 +1,10 @@
1
+ {
2
+ "scripts": {
3
+ "start": "npx netlify-cli serve",
4
+ "deploy": "npx netlify-cli deploy --build --prod"
5
+ },
6
+ "dependencies": {
7
+ "@netlify/vite-plugin-react-router": "^1.0.0",
8
+ "@react-router/node": "^7.1.5"
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ import { reactRouter } from "@react-router/dev/vite";
2
+ import { defineConfig } from "vite";
3
+ import netlifyPlugin from "@netlify/vite-plugin-react-router";
4
+
5
+ export default defineConfig({
6
+ plugins: [reactRouter(), netlifyPlugin()],
7
+ });
@@ -8,15 +8,15 @@
8
8
  "typecheck": "tsc"
9
9
  },
10
10
  "dependencies": {
11
- "@webstudio-is/image": "0.202.0",
12
- "@webstudio-is/react-sdk": "0.202.0",
13
- "@webstudio-is/sdk": "0.202.0",
14
- "@webstudio-is/sdk-components-react": "0.202.0",
15
- "@webstudio-is/sdk-components-animation": "0.202.0",
16
- "@webstudio-is/sdk-components-react-radix": "0.202.0",
11
+ "@webstudio-is/image": "0.203.0",
12
+ "@webstudio-is/react-sdk": "0.203.0",
13
+ "@webstudio-is/sdk": "0.203.0",
14
+ "@webstudio-is/sdk-components-react": "0.203.0",
15
+ "@webstudio-is/sdk-components-animation": "0.203.0",
16
+ "@webstudio-is/sdk-components-react-radix": "0.203.0",
17
17
  "react": "18.3.0-canary-14898b6a9-20240318",
18
18
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
19
- "vike": "^0.4.219"
19
+ "vike": "^0.4.220"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/react": "^18.2.70",