diff --git a/apps/builder/app/routes/rest.ai._index.ts b/apps/builder/app/routes/rest.ai._index.ts index 34401c5b570f..931d97dc6c67 100644 --- a/apps/builder/app/routes/rest.ai._index.ts +++ b/apps/builder/app/routes/rest.ai._index.ts @@ -17,7 +17,7 @@ import { import env from "~/env/env.server"; import { createContext } from "~/shared/context.server"; import { authorizeProject } from "@webstudio-is/trpc-interface/index.server"; -import { loadBuildByProjectId } from "@webstudio-is/project-build/index.server"; +import { loadDevBuildByProjectId } from "@webstudio-is/project-build/index.server"; export const RequestParams = z.object({ projectId: z.string().min(1, "nonempty"), @@ -139,7 +139,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { }; } - const { instances } = await loadBuildByProjectId(context, projectId); + const { instances } = await loadDevBuildByProjectId(context, projectId); const model = createGptModel({ apiKey: env.OPENAI_KEY, @@ -154,7 +154,9 @@ export const action = async ({ request }: ActionFunctionArgs) => { context: { prompt, textInstances: copywriter.collectTextInstances({ - instances: new Map(instances), + instances: new Map( + instances.map((instance) => [instance.id, instance]) + ), rootInstanceId: instanceId, }), }, diff --git a/apps/builder/app/shared/db/canvas.server.ts b/apps/builder/app/shared/db/canvas.server.ts index 05ee5309f296..011a552a0fd1 100644 --- a/apps/builder/app/shared/db/canvas.server.ts +++ b/apps/builder/app/shared/db/canvas.server.ts @@ -2,10 +2,15 @@ import type { Data } from "@webstudio-is/http-client"; import { loadBuildById } from "@webstudio-is/project-build/index.server"; import { loadAssetsByProject } from "@webstudio-is/asset-uploader/index.server"; import type { AppContext } from "@webstudio-is/trpc-interface/index.server"; -import { findPageByIdOrPath } from "@webstudio-is/sdk"; +import { findPageByIdOrPath, getStyleDeclKey } from "@webstudio-is/sdk"; import type { Build } from "@webstudio-is/prisma-client"; import { db as domainDb } from "@webstudio-is/domain/index.server"; +const getPair = (item: Item): [string, Item] => [ + item.id, + item, +]; + export const loadProductionCanvasData = async ( buildId: Build["id"], context: AppContext @@ -35,17 +40,16 @@ export const loadProductionCanvasData = async ( // Check that build deployment domains are still active and verified // for examle: redeploy created few days later - const domains = - deployment.destination === "static" - ? [] - : deployment.domains.filter((domain) => - currentProjectDomains.some( - (projectDomain) => - projectDomain.domain.domain === domain && - projectDomain.domain.status === "ACTIVE" && - projectDomain.verified - ) - ); + if (deployment.destination !== "static") { + deployment.domains = deployment.domains.filter((domain) => + currentProjectDomains.some( + (projectDomain) => + projectDomain.domain.domain === domain && + projectDomain.domain.status === "ACTIVE" && + projectDomain.verified + ) + ); + } const page = findPageByIdOrPath("/", build.pages); @@ -55,23 +59,9 @@ export const loadProductionCanvasData = async ( const allAssets = await loadAssetsByProject(build.projectId, context); - const canvasData = { - build: { - ...build, - deployment: { - ...deployment, - domains, - }, - }, - page, - pages: [build.pages.homePage, ...build.pages.pages], - }; - - const styles = canvasData.build?.styles ?? []; - // Find all fonts referenced in styles const fontFamilySet = new Set(); - for (const [, { value }] of styles) { + for (const { value } of build.styles) { if (value.type === "fontFamily") { for (const fontFamily of value.value) { fontFamilySet.add(fontFamily); @@ -87,7 +77,28 @@ export const loadProductionCanvasData = async ( ); return { - ...canvasData, + build: { + id: build.id, + projectId: build.projectId, + version: build.version, + createdAt: build.createdAt, + updatedAt: build.updatedAt, + pages: build.pages, + breakpoints: build.breakpoints.map(getPair), + styles: build.styles.map((item) => [getStyleDeclKey(item), item]), + styleSources: build.styleSources.map(getPair), + styleSourceSelections: build.styleSourceSelections.map((item) => [ + item.instanceId, + item, + ]), + props: build.props.map(getPair), + dataSources: build.dataSources.map(getPair), + resources: build.resources.map(getPair), + instances: build.instances.map(getPair), + deployment, + }, + page, + pages: [build.pages.homePage, ...build.pages.pages], assets, }; }; diff --git a/fixtures/ssg/.webstudio/data.json b/fixtures/ssg/.webstudio/data.json index fed27ab56c1c..56bf884ddf45 100644 --- a/fixtures/ssg/.webstudio/data.json +++ b/fixtures/ssg/.webstudio/data.json @@ -410,8 +410,7 @@ "deployment": { "domains": [], "projectDomain": "cli-basic-test-d0osr" - }, - "marketplaceProduct": {} + } }, "page": { "id": "9di_L14CzctvSruIoKVvE", diff --git a/fixtures/webstudio-cloudflare-template/.webstudio/data.json b/fixtures/webstudio-cloudflare-template/.webstudio/data.json index fed27ab56c1c..56bf884ddf45 100644 --- a/fixtures/webstudio-cloudflare-template/.webstudio/data.json +++ b/fixtures/webstudio-cloudflare-template/.webstudio/data.json @@ -410,8 +410,7 @@ "deployment": { "domains": [], "projectDomain": "cli-basic-test-d0osr" - }, - "marketplaceProduct": {} + } }, "page": { "id": "9di_L14CzctvSruIoKVvE", diff --git a/fixtures/webstudio-custom-template/.webstudio/data.json b/fixtures/webstudio-custom-template/.webstudio/data.json index 180e25b65666..d6144ae77dc0 100644 --- a/fixtures/webstudio-custom-template/.webstudio/data.json +++ b/fixtures/webstudio-custom-template/.webstudio/data.json @@ -2200,8 +2200,7 @@ "deployment": { "domains": [], "projectDomain": "webstudio-custom-template-cochj" - }, - "marketplaceProduct": {} + } }, "page": { "id": "nfzls_SkTc9jKYyxcZ8Lw", diff --git a/fixtures/webstudio-remix-netlify-edge-functions/.webstudio/data.json b/fixtures/webstudio-remix-netlify-edge-functions/.webstudio/data.json index fed27ab56c1c..56bf884ddf45 100644 --- a/fixtures/webstudio-remix-netlify-edge-functions/.webstudio/data.json +++ b/fixtures/webstudio-remix-netlify-edge-functions/.webstudio/data.json @@ -410,8 +410,7 @@ "deployment": { "domains": [], "projectDomain": "cli-basic-test-d0osr" - }, - "marketplaceProduct": {} + } }, "page": { "id": "9di_L14CzctvSruIoKVvE", diff --git a/fixtures/webstudio-remix-netlify-functions/.webstudio/data.json b/fixtures/webstudio-remix-netlify-functions/.webstudio/data.json index fed27ab56c1c..56bf884ddf45 100644 --- a/fixtures/webstudio-remix-netlify-functions/.webstudio/data.json +++ b/fixtures/webstudio-remix-netlify-functions/.webstudio/data.json @@ -410,8 +410,7 @@ "deployment": { "domains": [], "projectDomain": "cli-basic-test-d0osr" - }, - "marketplaceProduct": {} + } }, "page": { "id": "9di_L14CzctvSruIoKVvE", diff --git a/packages/project-build/package.json b/packages/project-build/package.json index 17e6c25c3119..71ccc6c0014b 100644 --- a/packages/project-build/package.json +++ b/packages/project-build/package.json @@ -29,7 +29,6 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", - "@webstudio-is/http-client": "workspace:*", "@webstudio-is/jest-config": "workspace:*", "@webstudio-is/tsconfig": "workspace:*", "type-fest": "^4.24.0", diff --git a/packages/project-build/src/db/build.ts b/packages/project-build/src/db/build.ts index b3e8107516d7..aab43a7b3275 100644 --- a/packages/project-build/src/db/build.ts +++ b/packages/project-build/src/db/build.ts @@ -15,17 +15,14 @@ import { type DataSource, type Instance, type Breakpoint, + type StyleSourceSelection, + type StyleDecl, Pages, initialBreakpoints, - StyleSourceSelection, - StyleDecl, } from "@webstudio-is/sdk"; -import type { Data } from "@webstudio-is/http-client"; import type { Build, CompactBuild } from "../types"; -import { parseStyles } from "./styles"; -import { parseStyleSourceSelections } from "./style-source-selections"; import { parseDeployment } from "./deployment"; -import { parsePages, serializePages } from "./pages"; +import { serializePages } from "./pages"; import { createDefaultPages } from "../shared/pages-utils"; import type { MarketplaceProduct } from "../shared//marketplace"; @@ -54,44 +51,6 @@ export const serializeConfig = (data: Type) => { return JSON.stringify(data); }; -const parseBuild = async ( - build: Database["public"]["Tables"]["Build"]["Row"] -): Promise => { - console.time("parseBuild"); - try { - const pages = parsePages(build.pages); - const styles = Array.from(parseStyles(build.styles)); - const styleSourceSelections = Array.from( - parseStyleSourceSelections(build.styleSourceSelections) - ); - const deployment = parseDeployment(build.deployment); - - const result: Build = { - id: build.id, - projectId: build.projectId, - version: build.version, - createdAt: build.createdAt, - updatedAt: build.updatedAt, - pages, - breakpoints: Array.from(parseData(build.breakpoints)), - styles, - styleSources: Array.from(parseData(build.styleSources)), - styleSourceSelections, - props: Array.from(parseData(build.props)), - dataSources: Array.from(parseData(build.dataSources)), - resources: Array.from(parseData(build.resources)), - instances: Array.from(parseData(build.instances)), - deployment, - marketplaceProduct: parseConfig( - build.marketplaceProduct - ), - } satisfies Data["build"] & { marketplaceProduct: MarketplaceProduct }; - return result; - } finally { - console.timeEnd("parseBuild"); - } -}; - const parseCompactBuild = async ( build: Database["public"]["Tables"]["Build"]["Row"] ) => { @@ -146,13 +105,10 @@ export const loadRawBuildById = async ( return build.data[0]; }; -export const loadBuildById = async ( - context: AppContext, - id: Build["id"] -): Promise => { +export const loadBuildById = async (context: AppContext, id: Build["id"]) => { const build = await loadRawBuildById(context, id); - return parseBuild(build); + return parseCompactBuild(build); }; export const loadBuildIdAndVersionByProjectId = async ( @@ -179,7 +135,7 @@ export const loadBuildIdAndVersionByProjectId = async ( return build.data[0]; }; -const loadRawBuildByProjectId = async ( +export const loadDevBuildByProjectId = async ( context: AppContext, projectId: Build["projectId"] ) => { @@ -200,23 +156,7 @@ const loadRawBuildByProjectId = async ( ); } - return build.data[0]; -}; - -export const loadBuildByProjectId = async ( - context: AppContext, - projectId: Build["projectId"] -): Promise => { - const build = await loadRawBuildByProjectId(context, projectId); - return parseBuild(build); -}; - -export const loadDevBuildByProjectId = async ( - context: AppContext, - projectId: Build["projectId"] -) => { - const build = await loadRawBuildByProjectId(context, projectId); - return parseCompactBuild(build); + return parseCompactBuild(build.data[0]); }; export const loadApprovedProdBuildByProjectId = async ( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5500e6a76903..ff7d539b05f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1720,9 +1720,6 @@ importers: '@jest/globals': specifier: ^29.7.0 version: 29.7.0 - '@webstudio-is/http-client': - specifier: workspace:* - version: link:../http-client '@webstudio-is/jest-config': specifier: workspace:* version: link:../jest-config