diff --git a/.idea/runConfigurations/_template__of_JavaScriptTestRunnerJest.xml b/.idea/runConfigurations/_template__of_JavaScriptTestRunnerJest.xml new file mode 100644 index 000000000..2ece9ce5c --- /dev/null +++ b/.idea/runConfigurations/_template__of_JavaScriptTestRunnerJest.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 135c29599..124fa3e68 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -41,5 +41,6 @@ "source.fixAll.eslint": "explicit" } }, - "files.insertFinalNewline": true + "files.insertFinalNewline": true, + "jestrunner.jestCommand": "pnpm exec cross-env NODE_OPTIONS=\"--experimental-vm-modules --no-deprecation\" node 'node_modules/jest/bin/jest.js'" } diff --git a/jest.config.js b/jest.config.js index 6b07c6f93..6863ebfbf 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,24 +1,7 @@ -/** - * Ignores all ESM packages that make Jest mad. - * - * "Jest encountered an unexpected token" - * - * Direct packages: - * - file-type - */ -const esModules = [ - // file-type and all dependencies: https://github.com/sindresorhus/file-type - 'file-type', - 'strtok3', - 'readable-web-to-node-stream', - 'token-types', - 'peek-readable', -].join('|') - -/** @type {import('jest').Config} */ -const baseJestConfig = { +/** @type {import('jest').Config} */ const baseJestConfig = { extensionsToTreatAsEsm: ['.ts', '.tsx'], - setupFilesAfterEnv: ['/test/jest.setup.ts'], + setupFiles: ['/test/jest.setup.env.js'], + setupFilesAfterEnv: ['/test/jest.setup.js'], moduleNameMapper: { '\\.(css|scss)$': '/test/helpers/mocks/emptyModule.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': @@ -31,10 +14,6 @@ const baseJestConfig = { transform: { '^.+\\.(t|j)sx?$': ['@swc/jest'], }, - transformIgnorePatterns: [ - `/node_modules/(?!.pnpm)(?!(${esModules})/)`, - `/node_modules/.pnpm/(?!(${esModules.replace(/\//g, '\\+')})@)`, - ], verbose: true, } diff --git a/packages/create-payload-app/jest.config.js b/packages/create-payload-app/jest.config.js index a8b434a87..a73df5e61 100644 --- a/packages/create-payload-app/jest.config.js +++ b/packages/create-payload-app/jest.config.js @@ -13,7 +13,7 @@ /** @type {import('jest').Config} */ const customJestConfig = { extensionsToTreatAsEsm: ['.ts', '.tsx'], - // setupFilesAfterEnv: ['/jest.setup.ts'], + // setupFilesAfterEnv: ['/jest.setup.js'], moduleNameMapper: { '\\.(css|scss)$': '/helpers/mocks/emptyModule.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': diff --git a/packages/next/package.json b/packages/next/package.json index 3ad3b0aaf..badd3c9b0 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -47,7 +47,7 @@ "@payloadcms/translations": "workspace:*", "@payloadcms/ui": "workspace:*", "busboy": "^1.6.0", - "file-type": "19.0.0 || 19.0.0-rc-f994737d14-20240522", + "file-type": "17.1.6", "graphql-http": "^1.22.0", "graphql-playground-html": "1.6.30", "http-status": "1.6.2", diff --git a/packages/payload/package.json b/packages/payload/package.json index 86c5b7abc..a0f2c3580 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -89,7 +89,7 @@ "console-table-printer": "2.11.2", "dataloader": "2.2.2", "deepmerge": "4.3.1", - "file-type": "16.5.4", + "file-type": "17.1.6", "find-up": "7.0.0", "get-tsconfig": "^4.7.2", "http-status": "1.6.2", diff --git a/packages/payload/src/uploads/generateFileData.ts b/packages/payload/src/uploads/generateFileData.ts index 461761461..1d8a9c5ce 100644 --- a/packages/payload/src/uploads/generateFileData.ts +++ b/packages/payload/src/uploads/generateFileData.ts @@ -1,7 +1,6 @@ import type { OutputInfo, Sharp, SharpOptions } from 'sharp' -import fileType from 'file-type' -const { fromBuffer } = fileType +import { fileTypeFromBuffer } from 'file-type' import fs from 'fs' import mkdirp from 'mkdirp' import sanitize from 'sanitize-filename' @@ -161,7 +160,7 @@ export const generateFileData = async ({ if (sharpFile) { const metadata = await sharpFile.metadata() fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true }) - ;({ ext, mime } = await fromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back. + ;({ ext, mime } = await fileTypeFromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back. fileData.width = fileBuffer.info.width fileData.height = fileBuffer.info.height fileData.filesize = fileBuffer.info.size diff --git a/packages/payload/src/uploads/getFileByPath.ts b/packages/payload/src/uploads/getFileByPath.ts index 5a7c044d1..2bb498c9d 100644 --- a/packages/payload/src/uploads/getFileByPath.ts +++ b/packages/payload/src/uploads/getFileByPath.ts @@ -1,7 +1,6 @@ -import fileType from 'file-type' +import { fileTypeFromFile } from 'file-type' import fs from 'fs' import path from 'path' -const { fromFile } = fileType import type { PayloadRequestWithData } from '../types/index.js' @@ -12,7 +11,7 @@ const mimeTypeEstimate = { export const getFileByPath = async (filePath: string): Promise => { if (typeof filePath === 'string') { const data = fs.readFileSync(filePath) - const mimetype = fromFile(filePath) + const mimetype = fileTypeFromFile(filePath) const { size } = fs.statSync(filePath) const name = path.basename(filePath) diff --git a/packages/payload/src/uploads/imageResizer.ts b/packages/payload/src/uploads/imageResizer.ts index bab0e166e..f17a26350 100644 --- a/packages/payload/src/uploads/imageResizer.ts +++ b/packages/payload/src/uploads/imageResizer.ts @@ -1,8 +1,6 @@ import type { OutputInfo, Sharp, SharpOptions } from 'sharp' -import fileType from 'file-type' -const { fromBuffer } = fileType - +import { fileTypeFromBuffer } from 'file-type' import fs from 'fs' import sanitize from 'sanitize-filename' @@ -343,7 +341,7 @@ export async function resizeAndTransformImageSizes({ req.payloadUploadSizes[imageResizeConfig.name] = bufferData } - const mimeInfo = await fromBuffer(bufferData) + const mimeInfo = await fileTypeFromBuffer(bufferData) const imageNameWithDimensions = createImageName( sanitizedImage.name, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1dcd281ff..aa71f5779 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -571,8 +571,8 @@ importers: specifier: ^1.6.0 version: 1.6.0 file-type: - specifier: 19.0.0 || 19.0.0-rc-f994737d14-20240522 - version: 19.0.0 + specifier: 17.1.6 + version: 17.1.6 graphql: specifier: ^16.8.1 version: 16.8.1 @@ -701,8 +701,8 @@ importers: specifier: 4.3.1 version: 4.3.1 file-type: - specifier: 16.5.4 - version: 16.5.4 + specifier: 17.1.6 + version: 17.1.6 find-up: specifier: 7.0.0 version: 7.0.0 @@ -10762,15 +10762,6 @@ packages: dependencies: flat-cache: 3.2.0 - /file-type@16.5.4: - resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} - engines: {node: '>=10'} - dependencies: - readable-web-to-node-stream: 3.0.2 - strtok3: 6.3.0 - token-types: 4.2.1 - dev: false - /file-type@17.1.6: resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -10778,16 +10769,6 @@ packages: readable-web-to-node-stream: 3.0.2 strtok3: 7.0.0 token-types: 5.0.1 - dev: true - - /file-type@19.0.0: - resolution: {integrity: sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==} - engines: {node: '>=18'} - dependencies: - readable-web-to-node-stream: 3.0.2 - strtok3: 7.0.0 - token-types: 5.0.1 - dev: false /filename-reserved-regex@3.0.0: resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} @@ -14029,11 +14010,6 @@ packages: resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} dev: false - /peek-readable@4.1.0: - resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} - engines: {node: '>=8'} - dev: false - /peek-readable@5.0.0: resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} engines: {node: '>=14.16'} @@ -16404,14 +16380,6 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - /strtok3@6.3.0: - resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} - engines: {node: '>=10'} - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 4.1.0 - dev: false - /strtok3@7.0.0: resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} engines: {node: '>=14.16'} @@ -16755,14 +16723,6 @@ packages: engines: {node: '>=0.6'} dev: false - /token-types@4.2.1: - resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} - engines: {node: '>=10'} - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - dev: false - /token-types@5.0.1: resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} engines: {node: '>=14.16'} diff --git a/test/helpers/startMemoryDB.ts b/test/helpers/startMemoryDB.ts index d5f64f707..e0dbe9d99 100644 --- a/test/helpers/startMemoryDB.ts +++ b/test/helpers/startMemoryDB.ts @@ -7,6 +7,7 @@ export default async () => { process.env.PAYLOAD_DROP_DATABASE = 'true' process.env.NODE_OPTIONS = '--no-deprecation' process.env.DISABLE_PAYLOAD_HMR = 'true' + process.env.NODE_OPTIONS = '--experimental-vm-modules --no-deprecation' if ( (!process.env.PAYLOAD_DATABASE || process.env.PAYLOAD_DATABASE === 'mongodb') && diff --git a/test/jest.config.js b/test/jest.config.js index 7f4c5ea14..21311ed8f 100644 --- a/test/jest.config.js +++ b/test/jest.config.js @@ -9,10 +9,8 @@ const dirname = path.dirname(filename) const customJestConfig = { ...jestBaseConfig, testMatch: ['/**/*int.spec.ts'], - setupFilesAfterEnv: [ - //path.resolve(dirname, './helpers/startMemoryDB.ts'), - '/jest.setup.ts', - ], + setupFiles: ['/jest.setup.env.js'], + setupFilesAfterEnv: ['/jest.setup.js'], globalSetup: path.resolve(dirname, './helpers/startMemoryDB.ts'), moduleNameMapper: { '\\.(css|scss)$': '/helpers/mocks/emptyModule.js', diff --git a/test/jest.setup.env.js b/test/jest.setup.env.js new file mode 100644 index 000000000..3489e8c6d --- /dev/null +++ b/test/jest.setup.env.js @@ -0,0 +1 @@ +process.env.NODE_OPTIONS = '--experimental-vm-modules --no-deprecation' diff --git a/test/jest.setup.ts b/test/jest.setup.js similarity index 66% rename from test/jest.setup.ts rename to test/jest.setup.js index bc20d2f8e..e8d18ed9b 100644 --- a/test/jest.setup.ts +++ b/test/jest.setup.js @@ -2,3 +2,5 @@ process.env.PAYLOAD_DISABLE_ADMIN = 'true' process.env.PAYLOAD_DROP_DATABASE = 'true' process.env.PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER = 's3' + +process.env.NODE_OPTIONS = '--experimental-vm-modules --no-deprecation'