From 850f65faec16d06c3124091df8106aec50eca0a5 Mon Sep 17 00:00:00 2001 From: Oleg Isonen Date: Wed, 14 Sep 2022 10:28:27 +0200 Subject: [PATCH 01/24] wip upload single font file --- packages/asset-uploader/src/db/create.ts | 26 ++++++++++++++-- .../asset-uploader/src/targets/fs/upload.ts | 7 +++-- packages/asset-uploader/src/types.ts | 8 ++--- .../asset-uploader/src/utils/format-asset.ts | 20 +++++++------ .../src/utils/get-asset-data.ts | 30 ++++++++++++++----- 5 files changed, 64 insertions(+), 27 deletions(-) diff --git a/packages/asset-uploader/src/db/create.ts b/packages/asset-uploader/src/db/create.ts index 9eff5759aa..51e1780ce2 100644 --- a/packages/asset-uploader/src/db/create.ts +++ b/packages/asset-uploader/src/db/create.ts @@ -6,23 +6,45 @@ import { import { type Metadata } from "sharp"; import { formatAsset } from "../utils/format-asset"; -type Options = { +type BaseOptions = { name: string; size: number; metadata: Metadata; location: Location; }; +type Options = + | ({ + type: "image"; + } & BaseOptions) + | ({ type: "font" } & BaseOptions); + const create = (projectId: Project["id"], options: Options) => { const size = options.size || options.metadata.size || 0; const { metadata, name, location } = options; + + if (options.type === "image") { + return prisma.asset.create({ + data: { + location, + name, + size, + format: metadata.format, + meta: JSON.stringify({ + width: metadata.width, + height: metadata.height, + }), + projectId, + }, + }); + } + return prisma.asset.create({ data: { location, name, size, format: metadata.format, - meta: JSON.stringify({ width: metadata.width, height: metadata.height }), projectId, }, }); diff --git a/packages/asset-uploader/src/targets/fs/upload.ts b/packages/asset-uploader/src/targets/fs/upload.ts index 9ee88ab8ca..46d22d136f 100644 --- a/packages/asset-uploader/src/targets/fs/upload.ts +++ b/packages/asset-uploader/src/targets/fs/upload.ts @@ -33,11 +33,12 @@ export const uploadToFs = async ({ uploadHandler ); const formDataImages = AssetsFromFs.parse(formData.getAll("image")); + const formDataFonts = AssetsFromFs.parse(formData.getAll("font")); + const formDataAll = [...formDataImages, ...formDataFonts]; - // @todo fonts - const assets = formDataImages.map(async (asset) => + const assets = formDataAll.map(async (asset) => getAssetData({ - type: "image" as const, + type: formDataFonts.includes(asset) ? "font" : "image", name: asset.name, size: asset.size, buffer: (await asset.arrayBuffer()) as Uint8Array, diff --git a/packages/asset-uploader/src/types.ts b/packages/asset-uploader/src/types.ts index 5928b82cde..92b1146fb3 100644 --- a/packages/asset-uploader/src/types.ts +++ b/packages/asset-uploader/src/types.ts @@ -1,12 +1,8 @@ import { Asset as DbAsset } from "@webstudio-is/prisma-client"; - -type ImageMeta = { - width?: number; - height?: number; -}; +import type { FontMeta, ImageMeta } from "./utils/format-asset"; export type Asset = Omit & { path?: string; status?: "uploading" | "uploaded"; - meta: ImageMeta; + meta: ImageMeta | FontMeta; }; diff --git a/packages/asset-uploader/src/utils/format-asset.ts b/packages/asset-uploader/src/utils/format-asset.ts index 310c41cfad..7b5b07cf21 100644 --- a/packages/asset-uploader/src/utils/format-asset.ts +++ b/packages/asset-uploader/src/utils/format-asset.ts @@ -3,22 +3,24 @@ import { Asset as DbAsset } from "@webstudio-is/prisma-client"; import { Asset } from "../types"; import { getAssetPath } from "./get-asset-path"; -// @todo to use to distinguish between images and fonts -//const formatTypeMap = { -// woff: "font", -// woff2: "font", -// ttf: "font", -// otf: "font", -// eot: "font", -//} as const; +const fontExtensions = ["ttf", "otf", "woff", "woff2", "eot"]; const ImageMeta = z.object({ width: z.number().optional(), height: z.number().optional(), }); +export type ImageMeta = z.infer; + +// @todo fonts meta +const FontMeta = z.object({}); +export type FontMeta = z.infer; export const formatAsset = (asset: DbAsset): Asset => { - const meta = ImageMeta.parse(JSON.parse(asset.meta)); + const Schema = + asset.format && fontExtensions.includes(asset.format) + ? FontMeta + : ImageMeta; + const meta = Schema.parse(JSON.parse(asset.meta)); return { ...asset, meta, diff --git a/packages/asset-uploader/src/utils/get-asset-data.ts b/packages/asset-uploader/src/utils/get-asset-data.ts index 5f89db037c..49c012f58e 100644 --- a/packages/asset-uploader/src/utils/get-asset-data.ts +++ b/packages/asset-uploader/src/utils/get-asset-data.ts @@ -1,25 +1,38 @@ import { Location } from "@webstudio-is/prisma-client"; import sharp, { type Metadata } from "sharp"; -//type FontData = any; - -type ImageData = { +type BaseData = { name: string; size: number; - metadata: Metadata; location: Location; }; -export type AssetData = ImageData; // | FontData; +type ImageData = BaseData & { + type: "image"; + metadata: Metadata; +}; -type AssetOptions = { - type: "image" | "font"; +type FontData = BaseData & { + type: "font"; + // @todo fonts meta + metadata: {}; +}; + +export type AssetData = ImageData | FontData; + +type BaseAssetOptions = { name: string; size: number; buffer: Buffer | Uint8Array; location: Location; }; +type AssetOptions = + | ({ + type: "image"; + } & BaseAssetOptions) + | ({ type: "font" } & BaseAssetOptions); + export const getAssetData = async ( options: AssetOptions ): Promise => { @@ -27,6 +40,8 @@ export const getAssetData = async ( if (options.type === "image") { const sharpImage = sharp(options.buffer); metadata = await sharpImage.metadata(); + } else { + metadata = {}; } if (metadata === undefined) { @@ -35,6 +50,7 @@ export const getAssetData = async ( // @todo fonts return { + type: options.type, name: options.name, size: options.size, location: options.location, From d0688d62f870f909ab219154ab4f6faf7f81258f Mon Sep 17 00:00:00 2001 From: Oleg Isonen Date: Wed, 14 Sep 2022 13:56:56 +0200 Subject: [PATCH 02/24] types --- .../panels/asset-manager/asset-info.tsx | 30 ++++++++++--------- .../src/utils/get-asset-data.ts | 23 +++++--------- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/apps/designer/app/designer/features/sidebar-left/panels/asset-manager/asset-info.tsx b/apps/designer/app/designer/features/sidebar-left/panels/asset-manager/asset-info.tsx index 94ce843b40..659179607c 100644 --- a/apps/designer/app/designer/features/sidebar-left/panels/asset-manager/asset-info.tsx +++ b/apps/designer/app/designer/features/sidebar-left/panels/asset-manager/asset-info.tsx @@ -81,20 +81,22 @@ export const AssetInfo = ({ - - - - - - {meta.width} x {meta.height} - - {" "} - - - {getFormattedAspectRatio(meta)} - - - + {"width" in meta && "height" in meta ? ( + + + + + + {meta.width} x {meta.height} + + {" "} + + + {getFormattedAspectRatio(meta)} + + + + ) : null}