diff --git a/.changeset/shy-tools-poke.md b/.changeset/shy-tools-poke.md new file mode 100644 index 00000000000..6853ce5289e --- /dev/null +++ b/.changeset/shy-tools-poke.md @@ -0,0 +1,6 @@ +--- +'@keystone-next/keystone': minor +'@keystone-next/utils': major +--- + +Moved `@keystone-next/utils` to `@keystone-next/keystone/fields/types/image/utils` for image ref related utilities and `@keystone-next/keystone/fields/types/file/utils` for file ref related utilities. diff --git a/packages/keystone/fields/types/file/utils/package.json b/packages/keystone/fields/types/file/utils/package.json new file mode 100644 index 00000000000..6cbbe144d0c --- /dev/null +++ b/packages/keystone/fields/types/file/utils/package.json @@ -0,0 +1,4 @@ +{ + "main": "dist/keystone.cjs.js", + "module": "dist/keystone.esm.js" +} diff --git a/packages/keystone/fields/types/image/utils/package.json b/packages/keystone/fields/types/image/utils/package.json new file mode 100644 index 00000000000..6cbbe144d0c --- /dev/null +++ b/packages/keystone/fields/types/image/utils/package.json @@ -0,0 +1,4 @@ +{ + "main": "dist/keystone.cjs.js", + "module": "dist/keystone.esm.js" +} diff --git a/packages/keystone/package.json b/packages/keystone/package.json index 5db3921cf39..29701a15f41 100644 --- a/packages/keystone/package.json +++ b/packages/keystone/package.json @@ -33,7 +33,6 @@ "@graphql-tools/schema": "^8.1.1", "@hapi/iron": "^6.0.0", "@keystone-next/types": "^24.0.0", - "@keystone-next/utils": "^1.0.4", "@keystone-ui/button": "^5.0.0", "@keystone-ui/core": "^3.1.1", "@keystone-ui/fields": "^4.1.2", @@ -154,7 +153,8 @@ "admin-ui/utils/index.ts", "fields/index.ts", "fields/types/*/views/index.tsx", - "fields/types/relationship/views/RelationshipSelect.tsx" + "fields/types/relationship/views/RelationshipSelect.tsx", + "fields/types/{image,file}/utils.ts" ] }, "repository": "https://github.com/keystonejs/keystone/tree/master/packages/keystone" diff --git a/packages/keystone/src/fields/types/file/index.ts b/packages/keystone/src/fields/types/file/index.ts index 8148e49b901..f74645c28c5 100644 --- a/packages/keystone/src/fields/types/file/index.ts +++ b/packages/keystone/src/fields/types/file/index.ts @@ -8,9 +8,9 @@ import { FileData, FieldDefaultValue, } from '@keystone-next/types'; -import { getFileRef } from '@keystone-next/utils'; import { FileUpload } from 'graphql-upload'; import { resolveView } from '../../resolve-view'; +import { getFileRef } from './utils'; export type FileFieldConfig = CommonFieldConfig & { diff --git a/packages/keystone/src/fields/types/file/utils.ts b/packages/keystone/src/fields/types/file/utils.ts new file mode 100644 index 00000000000..b3ca4e9e23a --- /dev/null +++ b/packages/keystone/src/fields/types/file/utils.ts @@ -0,0 +1,16 @@ +import { AssetMode } from '@keystone-next/types'; + +const FILEREGEX = /^(local|keystone-cloud):file:([^\\\/:\n]+)/; + +export const getFileRef = (mode: AssetMode, name: string) => `${mode}:file:${name}`; +export const parseFileRef = (ref: string) => { + const match = ref.match(FILEREGEX); + if (match) { + const [, mode, filename] = match; + return { + mode: mode as AssetMode, + filename: filename as string, + }; + } + return undefined; +}; diff --git a/packages/keystone/src/fields/types/file/views/Field.tsx b/packages/keystone/src/fields/types/file/views/Field.tsx index 8fb8ecdcd90..7429b5a14db 100644 --- a/packages/keystone/src/fields/types/file/views/Field.tsx +++ b/packages/keystone/src/fields/types/file/views/Field.tsx @@ -8,11 +8,11 @@ import { useToasts } from '@keystone-ui/toast'; import { FieldContainer, FieldLabel } from '@keystone-ui/fields'; import { TextInput } from '@keystone-ui/fields'; -import { parseFileRef } from '@keystone-next/utils'; import { Pill } from '@keystone-ui/pill'; import { Button } from '@keystone-ui/button'; import { FieldProps } from '@keystone-next/types'; +import { parseFileRef } from '../utils'; import { FileValue } from './index'; export function validateRef({ ref }: { ref: string }) { diff --git a/packages/keystone/src/fields/types/image/index.ts b/packages/keystone/src/fields/types/image/index.ts index 68b6b23dc31..fdfd04bd0db 100644 --- a/packages/keystone/src/fields/types/image/index.ts +++ b/packages/keystone/src/fields/types/image/index.ts @@ -9,9 +9,9 @@ import { KeystoneContext, schema, } from '@keystone-next/types'; -import { getImageRef, SUPPORTED_IMAGE_EXTENSIONS } from '@keystone-next/utils'; import { FileUpload } from 'graphql-upload'; import { resolveView } from '../../resolve-view'; +import { getImageRef, SUPPORTED_IMAGE_EXTENSIONS } from './utils'; export type ImageFieldConfig = CommonFieldConfig & { diff --git a/packages/keystone/src/fields/types/image/utils.ts b/packages/keystone/src/fields/types/image/utils.ts new file mode 100644 index 00000000000..35a72ca47ce --- /dev/null +++ b/packages/keystone/src/fields/types/image/utils.ts @@ -0,0 +1,23 @@ +import { AssetMode, ImageExtension } from '@keystone-next/types'; + +const IMAGEREGEX = /^(local|keystone-cloud):image:([^\\\/:\n]+)\.(gif|jpg|png|webp)$/; + +export const getImageRef = (mode: AssetMode, id: string, extension: ImageExtension) => + `${mode}:image:${id}.${extension}`; + +export const SUPPORTED_IMAGE_EXTENSIONS = ['jpg', 'png', 'webp', 'gif']; + +export const parseImageRef = ( + ref: string +): { mode: AssetMode; id: string; extension: ImageExtension } | undefined => { + const match = ref.match(IMAGEREGEX); + if (match) { + const [, mode, id, ext] = match; + return { + mode: mode as AssetMode, + id, + extension: ext as ImageExtension, + }; + } + return undefined; +}; diff --git a/packages/keystone/src/fields/types/image/views/Field.tsx b/packages/keystone/src/fields/types/image/views/Field.tsx index 26527ee3dd1..0f72a3c45c7 100644 --- a/packages/keystone/src/fields/types/image/views/Field.tsx +++ b/packages/keystone/src/fields/types/image/views/Field.tsx @@ -7,12 +7,12 @@ import { Fragment, ReactNode, RefObject, useEffect, useMemo, useRef, useState } import { jsx, Stack, useTheme, Text, VisuallyHidden } from '@keystone-ui/core'; import { useToasts } from '@keystone-ui/toast'; import { TextInput } from '@keystone-ui/fields'; -import { parseImageRef } from '@keystone-next/utils'; import { FieldContainer, FieldLabel } from '@keystone-ui/fields'; import { Pill } from '@keystone-ui/pill'; import { Button } from '@keystone-ui/button'; import { FieldProps } from '@keystone-next/types'; +import { parseImageRef } from '../utils'; import { ImageValue } from './index'; function useObjectURL(fileData: File | undefined) { diff --git a/packages/keystone/src/lib/context/createFilesContext.ts b/packages/keystone/src/lib/context/createFilesContext.ts index 9ea4471e723..83f456ee852 100644 --- a/packages/keystone/src/lib/context/createFilesContext.ts +++ b/packages/keystone/src/lib/context/createFilesContext.ts @@ -5,8 +5,8 @@ import filenamify from 'filenamify'; import { KeystoneConfig, FilesContext } from '@keystone-next/types'; import fs from 'fs-extra'; -import { parseFileRef, isLocalAsset, isKeystoneCloudAsset } from '@keystone-next/utils'; import slugify from '@sindresorhus/slugify'; +import { parseFileRef } from '../../fields/types/file/utils'; import { buildKeystoneCloudFileSrc, uploadFileToKeystoneCloud, @@ -59,13 +59,13 @@ export function createFilesContext(config: KeystoneConfig): FilesContext | undef restApiEndpoint = '', } = experimental?.keystoneCloud || {}; - if (isLocalAsset(files.upload)) { + if (files.upload === 'local') { fs.mkdirSync(storagePath, { recursive: true }); } return { getSrc: async (mode, filename) => { - if (isKeystoneCloudAsset(mode)) { + if (mode === 'keystone-cloud') { return await buildKeystoneCloudFileSrc({ apiKey, graphqlApiEndpoint, filename }); } @@ -80,7 +80,7 @@ export function createFilesContext(config: KeystoneConfig): FilesContext | undef const { mode, filename } = fileRef; - if (isKeystoneCloudAsset(mode)) { + if (mode === 'keystone-cloud') { const { filesize } = await getFileFromKeystoneCloud({ apiKey, filename, @@ -98,7 +98,7 @@ export function createFilesContext(config: KeystoneConfig): FilesContext | undef const { upload: mode } = files; const filename = generateSafeFilename(originalFilename, files.transformFilename); - if (isKeystoneCloudAsset(mode)) { + if (mode === 'keystone-cloud') { const { filesize } = await uploadFileToKeystoneCloud({ apiKey, stream, diff --git a/packages/keystone/src/lib/context/createImagesContext.ts b/packages/keystone/src/lib/context/createImagesContext.ts index 3ce52551114..090da5ec2c7 100644 --- a/packages/keystone/src/lib/context/createImagesContext.ts +++ b/packages/keystone/src/lib/context/createImagesContext.ts @@ -4,7 +4,7 @@ import { v4 as uuid } from 'uuid'; import fs from 'fs-extra'; import fromBuffer from 'image-type'; import imageSize from 'image-size'; -import { parseImageRef, isLocalAsset, isKeystoneCloudAsset } from '@keystone-next/utils'; +import { parseImageRef } from '../../fields/types/image/utils'; import { buildKeystoneCloudImageSrc, getImageMetadataFromKeystoneCloud, @@ -54,7 +54,7 @@ export function createImagesContext(config: KeystoneConfig): ImagesContext | und restApiEndpoint = '', } = experimental?.keystoneCloud || {}; - if (isLocalAsset(images.upload)) { + if (images.upload === 'local') { fs.mkdirSync(storagePath, { recursive: true }); } @@ -62,7 +62,7 @@ export function createImagesContext(config: KeystoneConfig): ImagesContext | und getSrc: async (mode, id, extension) => { const filename = `${id}.${extension}`; - if (isKeystoneCloudAsset(mode)) { + if (mode === 'keystone-cloud') { return await buildKeystoneCloudImageSrc({ apiKey, imagesDomain, @@ -82,7 +82,7 @@ export function createImagesContext(config: KeystoneConfig): ImagesContext | und const { mode } = imageRef; - if (isKeystoneCloudAsset(mode)) { + if (mode === 'keystone-cloud') { const { id, extension } = imageRef; const filename = `${id}.${extension}`; const metadata = await getImageMetadataFromKeystoneCloud({ @@ -105,7 +105,7 @@ export function createImagesContext(config: KeystoneConfig): ImagesContext | und const { upload: mode } = images; const id = uuid(); - if (isKeystoneCloudAsset(mode)) { + if (mode === 'keystone-cloud') { const metadata = await uploadImageToKeystoneCloud({ apiKey, stream, diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 97270a82079..241106ad0de 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,41 +1,5 @@ -import { AssetMode, ImageExtension } from '@keystone-next/types'; +throw new Error( + '`@keystone-next/utils` has been moved to `@keystone-next/keystone/fields/types/image/utils` for image ref related utilities and `@keystone-next/keystone/fields/types/file/utils` for file ref related utilities, please import from there instead.' +); -const IMAGEREGEX = /^(local|keystone-cloud):image:([^\\\/:\n]+)\.(gif|jpg|png|webp)$/; -const FILEREGEX = /^(local|keystone-cloud):file:([^\\\/:\n]+)/; - -export const getImageRef = (mode: AssetMode, id: string, extension: ImageExtension) => - `${mode}:image:${id}.${extension}`; - -export const getFileRef = (mode: AssetMode, name: string) => `${mode}:file:${name}`; -export const parseFileRef = (ref: string) => { - const match = ref.match(FILEREGEX); - if (match) { - const [, mode, filename] = match; - return { - mode: mode as AssetMode, - filename: filename as string, - }; - } - return undefined; -}; - -export const SUPPORTED_IMAGE_EXTENSIONS = ['jpg', 'png', 'webp', 'gif']; - -export const parseImageRef = ( - ref: string -): { mode: AssetMode; id: string; extension: ImageExtension } | undefined => { - const match = ref.match(IMAGEREGEX); - if (match) { - const [, mode, id, ext] = match; - return { - mode: mode as AssetMode, - id, - extension: ext as ImageExtension, - }; - } - return undefined; -}; - -export const isLocalAsset = (mode: AssetMode) => mode === 'local'; - -export const isKeystoneCloudAsset = (mode: AssetMode) => mode === 'keystone-cloud'; +export {}; diff --git a/tests/admin-ui-tests/package.json b/tests/admin-ui-tests/package.json index d57f5d56437..92f98924f4d 100644 --- a/tests/admin-ui-tests/package.json +++ b/tests/admin-ui-tests/package.json @@ -25,7 +25,6 @@ }, "dependencies": { "@keystone-next/types": "^24.0.0", - "@keystone-next/utils": "^1.0.4", "@manypkg/find-root": "^1.1.0", "dotenv": "^10.0.0", "tree-kill": "^1.2.2" diff --git a/tests/api-tests/package.json b/tests/api-tests/package.json index 98687ced6db..44dc5ca6485 100644 --- a/tests/api-tests/package.json +++ b/tests/api-tests/package.json @@ -27,7 +27,6 @@ }, "dependencies": { "@keystone-next/types": "^24.0.0", - "@keystone-next/utils": "^1.0.4", "apollo-cache-control": "^0.14.0", "express": "^4.17.1" }