webstudio 0.0.0-4f7bf18 → 0.0.0-5558cd0

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.
Files changed (25) hide show
  1. package/lib/cli.js +49 -77
  2. package/package.json +17 -17
  3. package/templates/defaults/package.json +8 -8
  4. package/templates/react-router/package.json +34 -0
  5. package/templates/react-router-docker/Dockerfile +6 -11
  6. package/templates/react-router-docker/package.json +4 -32
  7. package/templates/react-router-netlify/app/constants.mjs +29 -0
  8. package/templates/react-router-netlify/netlify.toml +6 -0
  9. package/templates/react-router-netlify/package.json +10 -0
  10. package/templates/react-router-netlify/vite.config.ts +7 -0
  11. package/templates/react-router-vercel/app/constants.mjs +25 -0
  12. package/templates/react-router-vercel/package.json +9 -0
  13. package/templates/react-router-vercel/vercel.json +11 -0
  14. package/templates/ssg/package.json +7 -7
  15. /package/templates/{react-router-docker → react-router}/app/extension.ts +0 -0
  16. /package/templates/{react-router-docker → react-router}/app/root.tsx +0 -0
  17. /package/templates/{react-router-docker → react-router}/app/route-templates/default-sitemap.tsx +0 -0
  18. /package/templates/{react-router-docker → react-router}/app/route-templates/html.tsx +0 -0
  19. /package/templates/{react-router-docker → react-router}/app/route-templates/redirect.tsx +0 -0
  20. /package/templates/{react-router-docker → react-router}/app/route-templates/xml.tsx +0 -0
  21. /package/templates/{react-router-docker → react-router}/app/routes/[robots.txt].tsx +0 -0
  22. /package/templates/{react-router-docker → react-router}/app/routes.ts +0 -0
  23. /package/templates/{react-router-docker → react-router}/public/favicon.ico +0 -0
  24. /package/templates/{react-router-docker → react-router}/tsconfig.json +0 -0
  25. /package/templates/{react-router-docker → react-router}/vite.config.ts +0 -0
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";
@@ -77,18 +76,40 @@ const PROJECT_TEMPLATES = [
77
76
  label: "Vanilla",
78
77
  expand: ["defaults"]
79
78
  },
80
- { value: "vercel", label: "Vercel", expand: ["defaults", "vercel"] },
79
+ {
80
+ value: "docker",
81
+ label: "Docker",
82
+ expand: ["react-router", "react-router-docker"]
83
+ },
84
+ {
85
+ value: "vercel",
86
+ label: "Vercel",
87
+ expand: ["react-router", "react-router-vercel"]
88
+ },
89
+ {
90
+ value: "vercel-legacy",
91
+ label: "Vercel (legacy)",
92
+ expand: ["defaults", "vercel"]
93
+ },
94
+ {
95
+ value: "netlify",
96
+ label: "Netlify",
97
+ expand: ["react-router", "react-router-netlify"]
98
+ },
81
99
  {
82
100
  value: "netlify-functions",
83
- label: "Netlify Functions",
101
+ label: "Netlify Functions (legacy)",
84
102
  expand: ["defaults", "netlify-functions"]
85
103
  },
86
104
  {
87
105
  value: "netlify-edge-functions",
88
- label: "Netlify Edge Functions",
106
+ label: "Netlify Edge Functions (legacy)",
89
107
  expand: ["defaults", "netlify-edge-functions"]
90
108
  },
91
- { value: "ssg", label: "Static Site Generation (SSG)" },
109
+ {
110
+ value: "ssg",
111
+ label: "Static Site Generation (SSG)"
112
+ },
92
113
  {
93
114
  value: "ssg-netlify",
94
115
  label: "Static Site Generation (SSG) Netlify",
@@ -105,11 +126,6 @@ const INTERNAL_TEMPLATES = [
105
126
  value: "cloudflare",
106
127
  label: "Cloudflare",
107
128
  expand: ["defaults", "cloudflare"]
108
- },
109
- {
110
- value: "react-router-docker",
111
- label: "Dokcer",
112
- expand: ["react-router-docker"]
113
129
  }
114
130
  ];
115
131
  const isFileExists = async (filePath) => {
@@ -735,19 +751,13 @@ const prefixStyles = (styleMap) => {
735
751
  if (property === "backdrop-filter") {
736
752
  newStyleMap.set("-webkit-backdrop-filter", value);
737
753
  }
754
+ if (property === "view-timeline-name" || property === "scroll-timeline-name") {
755
+ newStyleMap.set(`--${property}`, value);
756
+ }
738
757
  newStyleMap.set(property, value);
739
758
  }
740
759
  return newStyleMap;
741
760
  };
742
- const captureError = (error, value) => {
743
- if (process.env.NODE_ENV === "development") {
744
- throw error;
745
- }
746
- setTimeout(() => {
747
- throw error;
748
- });
749
- return value;
750
- };
751
761
  const fallbackTransform = (styleValue) => {
752
762
  var _a;
753
763
  if (styleValue.type !== "fontFamily") {
@@ -839,7 +849,7 @@ const toValue = (styleValue, transformValue) => {
839
849
  if (value.type === "guaranteedInvalid") {
840
850
  return "";
841
851
  }
842
- return captureError(new Error("Unknown value type"), value);
852
+ return "";
843
853
  };
844
854
  const Unit = z.string();
845
855
  const UnitValue = z.object({
@@ -2490,6 +2500,7 @@ const generateExpression = ({
2490
2500
  usedDataSources == null ? void 0 : usedDataSources.set(dep.id, dep);
2491
2501
  return scope.getName(dep.id, dep.name);
2492
2502
  }
2503
+ return "undefined";
2493
2504
  }
2494
2505
  });
2495
2506
  };
@@ -3439,7 +3450,7 @@ ${prop.name}={${propValue}}`;
3439
3450
  return "";
3440
3451
  }
3441
3452
  const indexVariable = scope.getName(`${instance.id}-index`, "index");
3442
- generatedElement += `{${collectionDataValue}?.map((${collectionItemValue}: any, ${indexVariable}: number) =>
3453
+ generatedElement += `{${collectionDataValue}?.map?.((${collectionItemValue}: any, ${indexVariable}: number) =>
3443
3454
  `;
3444
3455
  generatedElement += `<Fragment key={${indexVariable}}>
3445
3456
  `;
@@ -3637,47 +3648,6 @@ const generateWebstudioComponent = ({
3637
3648
  `;
3638
3649
  return generatedComponent;
3639
3650
  };
3640
- const imageSizes = [16, 32, 48, 64, 96, 128, 256, 384];
3641
- const deviceSizes = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];
3642
- const allSizes = [...imageSizes, ...deviceSizes];
3643
- const NON_EXISTING_DOMAIN = "https://a3cbcbec-cdb1-4ea4-ad60-43c795308ddc.ddc";
3644
- const joinPath = (...segments) => {
3645
- return segments.filter((segment) => segment !== "").map((segment) => segment.replace(/(^\/+|\/+$)/g, "")).join("/");
3646
- };
3647
- const encodePathFragment = (fragment) => {
3648
- return encodeURIComponent(fragment).replace(/%2F/g, "/");
3649
- };
3650
- const wsImageLoader = (props2) => {
3651
- const width = props2.format === "raw" ? 16 : props2.width;
3652
- const quality = props2.format === "raw" ? 100 : props2.quality;
3653
- if (process.env.NODE_ENV !== "production") {
3654
- warnOnce(
3655
- allSizes.includes(width) === false,
3656
- "Width must be only from allowed values"
3657
- );
3658
- }
3659
- let src = props2.src;
3660
- if (src.startsWith("/cgi/asset")) {
3661
- src = src.slice("/cgi/asset".length);
3662
- }
3663
- const resultUrl = new URL("/cgi/image/", NON_EXISTING_DOMAIN);
3664
- if (props2.format !== "raw") {
3665
- resultUrl.searchParams.set("width", width.toString());
3666
- resultUrl.searchParams.set("quality", quality.toString());
3667
- if (props2.height != null) {
3668
- resultUrl.searchParams.set("height", props2.height.toString());
3669
- }
3670
- if (props2.fit != null) {
3671
- resultUrl.searchParams.set("fit", props2.fit);
3672
- }
3673
- }
3674
- resultUrl.searchParams.set("format", props2.format ?? "auto");
3675
- resultUrl.pathname = joinPath(resultUrl.pathname, encodePathFragment(src));
3676
- if (resultUrl.href.startsWith(NON_EXISTING_DOMAIN)) {
3677
- return `${resultUrl.pathname}?${resultUrl.searchParams.toString()}`;
3678
- }
3679
- return resultUrl.href;
3680
- };
3681
3651
  const BOOLEAN_ATTRIBUTES = /* @__PURE__ */ new Set([
3682
3652
  "async",
3683
3653
  "autofocus",
@@ -5871,6 +5841,11 @@ const copyTemplates = async (template) => {
5871
5841
  const importFrom = (importee, importer) => {
5872
5842
  return relative(dirname(importer), importee).replaceAll("\\", "/");
5873
5843
  };
5844
+ const npmrc = `force=true
5845
+ loglevel=error
5846
+ audit=false
5847
+ fund=false
5848
+ `;
5874
5849
  const prebuild = async (options) => {
5875
5850
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
5876
5851
  if (options.template.length === 0) {
@@ -5898,14 +5873,14 @@ Please check webstudio --help for more details`
5898
5873
  await rm(generatedDir, { recursive: true, force: true });
5899
5874
  const routesDir = join(appRoot, "routes");
5900
5875
  await rm(routesDir, { recursive: true, force: true });
5901
- await writeFile(join(cwd(), ".npmrc"), "force=true");
5876
+ await writeFile(join(cwd(), ".npmrc"), npmrc);
5902
5877
  for (const template of options.template) {
5903
5878
  await copyTemplates(template);
5904
5879
  }
5905
5880
  let framework;
5906
5881
  if (options.template.includes("ssg")) {
5907
5882
  framework = await createFramework();
5908
- } else if (options.template.includes("react-router-docker")) {
5883
+ } else if (options.template.includes("react-router")) {
5909
5884
  framework = await createFramework$1();
5910
5885
  } else {
5911
5886
  framework = await createFramework$2();
@@ -6021,14 +5996,10 @@ Please check webstudio --help for more details`
6021
5996
  const assetOrigin = siteData.origin;
6022
5997
  for (const asset of siteData.assets) {
6023
5998
  if (asset.type === "image") {
6024
- const imagePath = wsImageLoader({
6025
- src: asset.name,
6026
- format: "raw"
6027
- });
6028
5999
  assetsToDownload.push(
6029
6000
  limit(
6030
6001
  () => downloadAsset(
6031
- `${assetOrigin}${imagePath}`,
6002
+ `${assetOrigin}/cgi/image/${asset.name}?format=raw`,
6032
6003
  asset.name,
6033
6004
  assetBaseUrl
6034
6005
  )
@@ -6445,6 +6416,7 @@ const getDeploymentInstructions = (deployTarget) => {
6445
6416
  switch (deployTarget) {
6446
6417
  case "vercel":
6447
6418
  return `Run ${pc.dim("npx vercel")} to publish on Vercel.`;
6419
+ case "netlify":
6448
6420
  case "netlify-functions":
6449
6421
  case "netlify-edge-functions":
6450
6422
  return [
@@ -6459,7 +6431,7 @@ const getDeploymentInstructions = (deployTarget) => {
6459
6431
  }
6460
6432
  };
6461
6433
  const name = "webstudio";
6462
- const version = "0.0.0-4f7bf18";
6434
+ const version = "0.0.0-5558cd0";
6463
6435
  const description = "Webstudio CLI";
6464
6436
  const author = "Webstudio <github@webstudio.is>";
6465
6437
  const homepage = "https://webstudio.is";
@@ -6501,18 +6473,17 @@ const dependencies = {
6501
6473
  "p-limit": "^6.2.0",
6502
6474
  parse5: "7.2.1",
6503
6475
  picocolors: "^1.1.1",
6504
- react: "18.3.0-canary-14898b6a9-20240318",
6505
6476
  "reserved-identifiers": "^1.0.0",
6506
6477
  tinyexec: "^0.3.2",
6507
- "warn-once": "^0.1.1",
6508
6478
  yargs: "^17.7.2",
6509
6479
  zod: "^3.22.4"
6510
6480
  };
6511
6481
  const devDependencies = {
6512
6482
  "@netlify/remix-adapter": "^2.5.1",
6513
6483
  "@netlify/remix-edge-adapter": "3.4.2",
6514
- "@react-router/dev": "^7.1.3",
6515
- "@react-router/fs-routes": "^7.1.3",
6484
+ "@netlify/vite-plugin-react-router": "^1.0.0",
6485
+ "@react-router/dev": "^7.1.5",
6486
+ "@react-router/fs-routes": "^7.1.5",
6516
6487
  "@remix-run/cloudflare": "^2.15.2",
6517
6488
  "@remix-run/cloudflare-pages": "^2.15.2",
6518
6489
  "@remix-run/dev": "^2.15.2",
@@ -6536,12 +6507,13 @@ const devDependencies = {
6536
6507
  h3: "^1.14.0",
6537
6508
  ipx: "^3.0.1",
6538
6509
  prettier: "3.4.2",
6510
+ react: "18.3.0-canary-14898b6a9-20240318",
6539
6511
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
6540
- "react-router": "^7.1.3",
6512
+ "react-router": "^7.1.5",
6541
6513
  "ts-expect": "^1.3.0",
6542
- vike: "^0.4.218",
6514
+ vike: "^0.4.220",
6543
6515
  vite: "^5.4.11",
6544
- vitest: "^3.0.2",
6516
+ vitest: "^3.0.4",
6545
6517
  wrangler: "^3.63.2"
6546
6518
  };
6547
6519
  const packageJson = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webstudio",
3
- "version": "0.0.0-4f7bf18",
3
+ "version": "0.0.0-5558cd0",
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.218",
68
+ "vike": "^0.4.220",
69
69
  "vite": "^5.4.11",
70
- "vitest": "^3.0.2",
70
+ "vitest": "^3.0.4",
71
71
  "wrangler": "^3.63.2",
72
- "@webstudio-is/http-client": "0.0.0-4f7bf18",
73
- "@webstudio-is/image": "0.0.0-4f7bf18",
74
- "@webstudio-is/react-sdk": "0.0.0-4f7bf18",
75
- "@webstudio-is/sdk": "0.0.0-4f7bf18",
76
- "@webstudio-is/sdk-components-animation": "0.0.0-4f7bf18",
77
- "@webstudio-is/sdk-components-react": "0.0.0-4f7bf18",
78
- "@webstudio-is/sdk-components-react-radix": "0.0.0-4f7bf18",
79
- "@webstudio-is/sdk-components-react-remix": "0.0.0-4f7bf18",
80
- "@webstudio-is/sdk-components-react-router": "0.0.0-4f7bf18",
72
+ "@webstudio-is/http-client": "0.0.0-5558cd0",
73
+ "@webstudio-is/image": "0.0.0-5558cd0",
74
+ "@webstudio-is/react-sdk": "0.0.0-5558cd0",
75
+ "@webstudio-is/sdk": "0.0.0-5558cd0",
76
+ "@webstudio-is/sdk-components-animation": "0.0.0-5558cd0",
77
+ "@webstudio-is/sdk-components-react": "0.0.0-5558cd0",
78
+ "@webstudio-is/sdk-components-react-remix": "0.0.0-5558cd0",
79
+ "@webstudio-is/sdk-components-react-radix": "0.0.0-5558cd0",
80
+ "@webstudio-is/sdk-components-react-router": "0.0.0-5558cd0",
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.0.0-4f7bf18",
15
- "@webstudio-is/react-sdk": "0.0.0-4f7bf18",
16
- "@webstudio-is/sdk": "0.0.0-4f7bf18",
17
- "@webstudio-is/sdk-components-react": "0.0.0-4f7bf18",
18
- "@webstudio-is/sdk-components-animation": "0.0.0-4f7bf18",
19
- "@webstudio-is/sdk-components-react-radix": "0.0.0-4f7bf18",
20
- "@webstudio-is/sdk-components-react-remix": "0.0.0-4f7bf18",
21
- "isbot": "^5.1.19",
14
+ "@webstudio-is/image": "0.0.0-5558cd0",
15
+ "@webstudio-is/react-sdk": "0.0.0-5558cd0",
16
+ "@webstudio-is/sdk": "0.0.0-5558cd0",
17
+ "@webstudio-is/sdk-components-react": "0.0.0-5558cd0",
18
+ "@webstudio-is/sdk-components-animation": "0.0.0-5558cd0",
19
+ "@webstudio-is/sdk-components-react-radix": "0.0.0-5558cd0",
20
+ "@webstudio-is/sdk-components-react-remix": "0.0.0-5558cd0",
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.0.0-5558cd0",
14
+ "@webstudio-is/react-sdk": "0.0.0-5558cd0",
15
+ "@webstudio-is/sdk": "0.0.0-5558cd0",
16
+ "@webstudio-is/sdk-components-animation": "0.0.0-5558cd0",
17
+ "@webstudio-is/sdk-components-react-radix": "0.0.0-5558cd0",
18
+ "@webstudio-is/sdk-components-react-router": "0.0.0-5558cd0",
19
+ "@webstudio-is/sdk-components-react": "0.0.0-5558cd0",
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,22 +1,17 @@
1
- FROM node:22-alpine AS development-dependencies-env
2
- COPY . /app
3
- WORKDIR /app
4
- RUN npm install
5
-
6
- FROM node:22-alpine AS production-dependencies-env
7
- COPY .npmrc ./package.json /app/
1
+ FROM node:22-alpine AS dependencies-env
2
+ COPY .npmrc package.json /app/
8
3
  WORKDIR /app
9
4
  RUN npm install --omit=dev
10
5
 
11
- FROM node:22-alpine AS build-env
6
+ FROM dependencies-env AS build-env
12
7
  COPY . /app/
13
- COPY --from=development-dependencies-env /app/node_modules /app/node_modules
14
8
  WORKDIR /app
9
+ RUN npm install
15
10
  RUN npm run build
16
11
 
17
12
  FROM node:22-alpine
18
- COPY .npmrc ./package.json /app/
19
- COPY --from=production-dependencies-env /app/node_modules /app/node_modules
13
+ COPY .npmrc package.json /app/
14
+ COPY --from=dependencies-env /app/node_modules /app/node_modules
20
15
  COPY --from=build-env /app/build /app/build
21
16
  COPY --from=build-env /app/public /app/public
22
17
  WORKDIR /app
@@ -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.0.0-4f7bf18",
17
- "@webstudio-is/react-sdk": "0.0.0-4f7bf18",
18
- "@webstudio-is/sdk": "0.0.0-4f7bf18",
19
- "@webstudio-is/sdk-components-animation": "0.0.0-4f7bf18",
20
- "@webstudio-is/sdk-components-react-radix": "0.0.0-4f7bf18",
21
- "@webstudio-is/sdk-components-react-router": "0.0.0-4f7bf18",
22
- "@webstudio-is/sdk-components-react": "0.0.0-4f7bf18",
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.19",
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
+ });
@@ -0,0 +1,25 @@
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 (process.env.NODE_ENV !== "production") {
12
+ return props.src;
13
+ }
14
+
15
+ if (props.format === "raw") {
16
+ return props.src;
17
+ }
18
+
19
+ // https://vercel.com/blog/build-your-own-web-framework#automatic-image-optimization
20
+ const searchParams = new URLSearchParams();
21
+ searchParams.set("url", props.src);
22
+ searchParams.set("w", props.width.toString());
23
+ searchParams.set("q", props.quality.toString());
24
+ return `/_vercel/image?${searchParams}`;
25
+ };
@@ -0,0 +1,9 @@
1
+ {
2
+ "scripts": {
3
+ "start": "npx vercel dev",
4
+ "deploy": "npx vercel deploy"
5
+ },
6
+ "dependencies": {
7
+ "@react-router/node": "^7.1.5"
8
+ }
9
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "images": {
3
+ "domains": [],
4
+ "sizes": [
5
+ 16, 32, 48, 64, 96, 128, 144, 256, 384, 640, 750, 828, 1080, 1200, 1920,
6
+ 2048, 3840
7
+ ],
8
+ "minimumCacheTTL": 60,
9
+ "formats": ["image/webp", "image/avif"]
10
+ }
11
+ }
@@ -8,15 +8,15 @@
8
8
  "typecheck": "tsc"
9
9
  },
10
10
  "dependencies": {
11
- "@webstudio-is/image": "0.0.0-4f7bf18",
12
- "@webstudio-is/react-sdk": "0.0.0-4f7bf18",
13
- "@webstudio-is/sdk": "0.0.0-4f7bf18",
14
- "@webstudio-is/sdk-components-react": "0.0.0-4f7bf18",
15
- "@webstudio-is/sdk-components-animation": "0.0.0-4f7bf18",
16
- "@webstudio-is/sdk-components-react-radix": "0.0.0-4f7bf18",
11
+ "@webstudio-is/image": "0.0.0-5558cd0",
12
+ "@webstudio-is/react-sdk": "0.0.0-5558cd0",
13
+ "@webstudio-is/sdk": "0.0.0-5558cd0",
14
+ "@webstudio-is/sdk-components-react": "0.0.0-5558cd0",
15
+ "@webstudio-is/sdk-components-animation": "0.0.0-5558cd0",
16
+ "@webstudio-is/sdk-components-react-radix": "0.0.0-5558cd0",
17
17
  "react": "18.3.0-canary-14898b6a9-20240318",
18
18
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
19
- "vike": "^0.4.218"
19
+ "vike": "^0.4.220"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/react": "^18.2.70",