diff --git a/.vscode/launch.json b/.vscode/launch.json index 2a0e95872..fc0407594 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,6 @@ { "command": "pnpm dev", "name": "Run Dev 3.0", - "cwd": "${workspaceFolder}/packages/dev", "request": "launch", "type": "node-terminal" }, diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/account/page.tsx b/app/(payload)/admin/(dashboard)/account/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/account/page.tsx rename to app/(payload)/admin/(dashboard)/account/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/layout.tsx b/app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/layout.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/layout.tsx rename to app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/layout.tsx diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/page.tsx b/app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/page.tsx rename to app/(payload)/admin/(dashboard)/collections/[collection]/[...segments]/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/collections/[collection]/page.tsx b/app/(payload)/admin/(dashboard)/collections/[collection]/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/collections/[collection]/page.tsx rename to app/(payload)/admin/(dashboard)/collections/[collection]/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/globals/[global]/[[...segments]]/page.tsx b/app/(payload)/admin/(dashboard)/globals/[global]/[[...segments]]/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/globals/[global]/[[...segments]]/page.tsx rename to app/(payload)/admin/(dashboard)/globals/[global]/[[...segments]]/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/globals/[global]/layout.tsx b/app/(payload)/admin/(dashboard)/globals/[global]/layout.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/globals/[global]/layout.tsx rename to app/(payload)/admin/(dashboard)/globals/[global]/layout.tsx diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/layout.tsx b/app/(payload)/admin/(dashboard)/layout.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/layout.tsx rename to app/(payload)/admin/(dashboard)/layout.tsx diff --git a/packages/dev/src/app/(payload)/admin/(dashboard)/page.tsx b/app/(payload)/admin/(dashboard)/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/(dashboard)/page.tsx rename to app/(payload)/admin/(dashboard)/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/create-first-user/page.tsx b/app/(payload)/admin/create-first-user/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/create-first-user/page.tsx rename to app/(payload)/admin/create-first-user/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/forgot/page.tsx b/app/(payload)/admin/forgot/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/forgot/page.tsx rename to app/(payload)/admin/forgot/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/login/page.tsx b/app/(payload)/admin/login/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/login/page.tsx rename to app/(payload)/admin/login/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/logout-inactivity/page.tsx b/app/(payload)/admin/logout-inactivity/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/logout-inactivity/page.tsx rename to app/(payload)/admin/logout-inactivity/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/logout/page.tsx b/app/(payload)/admin/logout/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/logout/page.tsx rename to app/(payload)/admin/logout/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/reset/[token]/page.tsx b/app/(payload)/admin/reset/[token]/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/reset/[token]/page.tsx rename to app/(payload)/admin/reset/[token]/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/unauthorized/page.tsx b/app/(payload)/admin/unauthorized/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/unauthorized/page.tsx rename to app/(payload)/admin/unauthorized/page.tsx diff --git a/packages/dev/src/app/(payload)/admin/verify/[token]/page.tsx b/app/(payload)/admin/verify/[token]/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/admin/verify/[token]/page.tsx rename to app/(payload)/admin/verify/[token]/page.tsx diff --git a/packages/dev/src/app/(payload)/api/[...slug]/route.ts b/app/(payload)/api/[...slug]/route.ts similarity index 100% rename from packages/dev/src/app/(payload)/api/[...slug]/route.ts rename to app/(payload)/api/[...slug]/route.ts diff --git a/packages/dev/src/app/(payload)/api/[collection]/file/[filename]/route.ts b/app/(payload)/api/[collection]/file/[filename]/route.ts similarity index 100% rename from packages/dev/src/app/(payload)/api/[collection]/file/[filename]/route.ts rename to app/(payload)/api/[collection]/file/[filename]/route.ts diff --git a/packages/dev/src/app/(payload)/api/graphql-playground/route.ts b/app/(payload)/api/graphql-playground/route.ts similarity index 100% rename from packages/dev/src/app/(payload)/api/graphql-playground/route.ts rename to app/(payload)/api/graphql-playground/route.ts diff --git a/packages/dev/src/app/(payload)/api/graphql/route.ts b/app/(payload)/api/graphql/route.ts similarity index 100% rename from packages/dev/src/app/(payload)/api/graphql/route.ts rename to app/(payload)/api/graphql/route.ts diff --git a/packages/dev/src/app/(payload)/layout.tsx b/app/(payload)/layout.tsx similarity index 100% rename from packages/dev/src/app/(payload)/layout.tsx rename to app/(payload)/layout.tsx diff --git a/packages/dev/src/app/(payload)/page.tsx b/app/(payload)/page.tsx similarity index 100% rename from packages/dev/src/app/(payload)/page.tsx rename to app/(payload)/page.tsx diff --git a/packages/dev/src/app/another.scss b/app/another.scss similarity index 100% rename from packages/dev/src/app/another.scss rename to app/another.scss diff --git a/app/layouter.tsx b/app/layouter.tsx new file mode 100644 index 000000000..b464bdee3 --- /dev/null +++ b/app/layouter.tsx @@ -0,0 +1,12 @@ +import React from 'react' + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + {/* Layout UI */} +
{children}
+ + + ) +} diff --git a/app/my-route/route.ts b/app/my-route/route.ts new file mode 100644 index 000000000..445f1db00 --- /dev/null +++ b/app/my-route/route.ts @@ -0,0 +1,10 @@ +export const GET = async () => { + console.log('1') + console.log('1') + console.log('1') + console.log('1') + console.log('1') + return Response.json({ + hello: 'elliot', + }) +} diff --git a/packages/dev/src/app/page.tsx b/app/page.tsx similarity index 100% rename from packages/dev/src/app/page.tsx rename to app/page.tsx diff --git a/packages/dev/src/app/test.scss b/app/test.scss similarity index 100% rename from packages/dev/src/app/test.scss rename to app/test.scss diff --git a/jest.config.js b/jest.config.js index 2b7cdc7b7..d56dfff7b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,18 +1,24 @@ +const nextJest = require('next/jest.js') + +const createJestConfig = nextJest({ + // Provide the path to your Next.js app to load next.config.js and .env files in your test environment + dir: './', +}) + const customJestConfig = { globalSetup: './test/jest.setup.ts', moduleNameMapper: { '\\.(css|scss)$': '/packages/payload/src/bundlers/mocks/emptyModule.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/packages/payload/src/bundlers/mocks/fileMock.js', - 'payload-config': '/__mocks__/payload-config.ts', }, - testEnvironment: 'node', + // testEnvironment: 'node', testMatch: ['/packages/payload/src/**/*.spec.ts', '/test/**/*int.spec.ts'], testTimeout: 90000, - transform: { - '^.+\\.(t|j)sx?$': ['@swc/jest'], - }, + // transform: { + // '^.+\\.(t|j)sx?$': ['@swc/jest'], + // }, verbose: true, } -module.exports = customJestConfig +module.exports = createJestConfig(customJestConfig) diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 000000000..4f11a03dc --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js new file mode 100644 index 000000000..b53acef56 --- /dev/null +++ b/next.config.js @@ -0,0 +1,50 @@ +const path = require('path') + +/** @type {import('next').NextConfig} */ +const nextConfig = { + experimental: { + outputFileTracingExcludes: { + '**/*': ['drizzle-kit', 'drizzle-kit/utils'], + }, + serverComponentsExternalPackages: ['drizzle-kit', 'drizzle-kit/utils', 'pino', 'pino-pretty'], + }, + webpack: (config) => { + return { + ...config, + externals: [ + ...config.externals, + 'drizzle-kit', + 'drizzle-kit/utils', + 'pino', + 'pino-pretty', + 'sharp', + 'mongodb-memory-server', + ], + ignoreWarnings: [ + ...(config.ignoreWarnings || []), + { module: /node_modules\/mongodb\/lib\/utils\.js/ }, + { file: /node_modules\/mongodb\/lib\/utils\.js/ }, + ], + resolve: { + ...config.resolve, + alias: { + ...config.resolve.alias, + 'payload-config': process.env.PAYLOAD_CONFIG_PATH, + }, + fallback: { + ...config.resolve.fallback, + '@aws-sdk/credential-providers': false, + '@mongodb-js/zstd': false, + aws4: false, + kerberos: false, + 'mongodb-client-encryption': false, + snappy: false, + 'supports-color': false, + 'yocto-queue': false, + }, + }, + } + }, +} + +module.exports = nextConfig diff --git a/package.json b/package.json index cf2558e13..3d99cb508 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,12 @@ ], "scripts": { "build": "pnpm --filter payload run build", + "build:next": "next build", "build:all": "turbo build", "clean": "rimraf dist && rimraf packages/payload/dist", "clean:cache": "rimraf node_modules/.cache && rimraf packages/payload/node_modules/.cache", "clean:unix": "find . \\( -type d \\( -name node_modules -o -name dist -o -name .cache \\) -o -type f -name tsconfig.tsbuildinfo \\) -exec rm -rf {} +", - "dev": "nodemon", + "dev": "next dev", "dev:generate-graphql-schema": "ts-node -T ./test/generateGraphQLSchema.ts", "dev:generate-types": "ts-node -T ./test/generateTypes.ts", "dev:postgres": "pnpm --filter payload run dev:postgres", @@ -82,12 +83,15 @@ "minimist": "1.2.8", "next": "14.1.1-canary.26", "node-fetch": "2.6.12", + "node-mocks-http": "^1.14.1", "nodemon": "3.0.2", "pino": "8.15.0", "pino-pretty": "10.2.0", "prettier": "^3.0.3", "prompts": "2.4.2", "qs": "6.11.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "read-stream": "^2.1.1", "rimraf": "3.0.2", "semver": "^7.5.4", @@ -100,7 +104,8 @@ "ts-node": "10.9.1", "turbo": "^1.11.1", "typescript": "5.2.2", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "yocto-queue": "^1.0.0" }, "peerDependencies": { "react": "18.2.0", diff --git a/packages/dev/package.json b/packages/dev/package.json index c3a7f8e54..8cc578d6c 100644 --- a/packages/dev/package.json +++ b/packages/dev/package.json @@ -15,7 +15,8 @@ "payload": "workspace:*", "postcss": "^8.4.35", "react": "18.3.0-canary-b36ae8d7a-20231207", - "react-dom": "18.3.0-canary-b36ae8d7a-20231207" + "react-dom": "18.3.0-canary-b36ae8d7a-20231207", + "tailwindcss": "^3.4.1" }, "devDependencies": { "@types/node": "^20", diff --git a/packages/dev/src/app/my-route/route.ts b/packages/dev/src/app/my-route/route.ts deleted file mode 100644 index f835ec700..000000000 --- a/packages/dev/src/app/my-route/route.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const GET = (request) => { - return Response.json({ - hello: 'elliot', - }) -} diff --git a/packages/dev/src/collections/Media.ts b/packages/dev/src/collections/Media.ts deleted file mode 100644 index 400b2435b..000000000 --- a/packages/dev/src/collections/Media.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { CollectionConfig } from 'payload/types' -import { BeforeInput } from './Pages/BeforeInput' - -export const Media: CollectionConfig = { - slug: 'media', - upload: { - staticDir: 'media', - }, - access: { - read: () => true, - }, - fields: [ - { - name: 'title', - type: 'text', - label: 'Title', - required: true, - admin: { - components: { - beforeInput: [BeforeInput], - }, - }, - }, - ], -} diff --git a/packages/dev/src/collections/Pages/AfterInput.tsx b/packages/dev/src/collections/Pages/AfterInput.tsx deleted file mode 100644 index a0979563a..000000000 --- a/packages/dev/src/collections/Pages/AfterInput.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react' - -export const AfterInput: React.FC = () => { - return
This is a custom `AfterInput` component
-} diff --git a/packages/dev/src/collections/Pages/BeforeInput.tsx b/packages/dev/src/collections/Pages/BeforeInput.tsx deleted file mode 100644 index f54ebdb20..000000000 --- a/packages/dev/src/collections/Pages/BeforeInput.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react' - -export const BeforeInput: React.FC = () => { - return
This is a custom `BeforeInput` component
-} diff --git a/packages/dev/src/collections/Pages/CustomCell.tsx b/packages/dev/src/collections/Pages/CustomCell.tsx deleted file mode 100644 index 4b0f6b88e..000000000 --- a/packages/dev/src/collections/Pages/CustomCell.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react' - -export const CustomCell: React.FC = () => { - return
This is a custom `Cell` component
-} diff --git a/packages/dev/src/collections/Pages/CustomDescription.tsx b/packages/dev/src/collections/Pages/CustomDescription.tsx deleted file mode 100644 index 900d7f125..000000000 --- a/packages/dev/src/collections/Pages/CustomDescription.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react' - -export const CustomDescription: React.FC = () => { - return
This is a custom `Description` component
-} diff --git a/packages/dev/src/collections/Pages/CustomField.tsx b/packages/dev/src/collections/Pages/CustomField.tsx deleted file mode 100644 index 3f7eb4d5e..000000000 --- a/packages/dev/src/collections/Pages/CustomField.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react' - -export const CustomField: React.FC = () => { - return
This is a custom `Field` component
-} diff --git a/packages/dev/src/collections/Pages/CustomLabel.tsx b/packages/dev/src/collections/Pages/CustomLabel.tsx deleted file mode 100644 index d5077afd6..000000000 --- a/packages/dev/src/collections/Pages/CustomLabel.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react' - -export const CustomLabel: React.FC = () => { - return
This is a custom `Label` component
-} diff --git a/packages/dev/src/collections/Pages/CustomView.tsx b/packages/dev/src/collections/Pages/CustomView.tsx deleted file mode 100644 index 3cc90a28e..000000000 --- a/packages/dev/src/collections/Pages/CustomView.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react' - -export const CustomView: React.FC = async (props) => { - return
CustomView
-} diff --git a/packages/dev/src/collections/Pages/index.ts b/packages/dev/src/collections/Pages/index.ts deleted file mode 100644 index 4e04adc1d..000000000 --- a/packages/dev/src/collections/Pages/index.ts +++ /dev/null @@ -1,324 +0,0 @@ -import { CollectionConfig } from 'payload/types' -import { CustomView } from './CustomView' -import { BeforeInput } from './BeforeInput' -import { AfterInput } from './AfterInput' -import { CustomField } from './CustomField' -import { CustomDescription } from './CustomDescription' -import { CustomLabel } from './CustomLabel' -import { CustomCell } from './CustomCell' - -export const Pages: CollectionConfig = { - slug: 'pages', - admin: { - // useAsTitle: 'title', - // defaultColumns: ['title', 'id'], - components: { - views: { - Edit: { - Custom: { - path: '/custom', - Component: CustomView, - Tab: { - label: 'Custom View', - href: '/custom', - }, - }, - }, - }, - }, - }, - versions: { - drafts: true, - }, - fields: [ - { - name: 'titleWithCustomComponents', - label: 'Title With Custom Components', - type: 'text', - required: true, - admin: { - description: CustomDescription, - components: { - beforeInput: [BeforeInput], - afterInput: [AfterInput], - Label: CustomLabel, - }, - }, - }, - { - name: 'title', - label: 'Title', - type: 'text', - required: true, - defaultValue: 'This is a default value', - admin: { - description: 'This is a description', - }, - }, - { - name: 'titleWithCustomField', - label: 'Title With Custom Field', - type: 'text', - admin: { - components: { - Field: CustomField, - }, - }, - }, - { - name: 'sidebarTitle', - label: 'Sidebar Title', - type: 'text', - required: true, - admin: { - position: 'sidebar', - }, - }, - { - name: 'enableConditionalField', - label: 'Enable Conditional Field', - type: 'checkbox', - }, - { - name: 'conditionalField', - label: 'Conditional Field', - type: 'text', - admin: { - condition: (data) => data.enableConditionalField, - }, - }, - { - name: 'number', - label: 'Number', - type: 'number', - required: true, - defaultValue: 4, - admin: { - description: 'Defaults to 4', - }, - }, - { - name: 'select', - label: 'Select', - type: 'select', - required: true, - defaultValue: 'option-2', - options: [ - { - label: 'Option 1', - value: 'option-1', - }, - { - label: 'Option 2 (This is a default value)', - value: 'option-2', - }, - ], - }, - { - type: 'textarea', - name: 'textarea', - label: 'Textarea', - required: true, - defaultValue: 'This is a default value', - admin: { - rows: 10, - }, - }, - { - type: 'point', - name: 'point', - label: 'Point', - required: true, - }, - { - type: 'radio', - name: 'radio', - label: 'Radio', - required: true, - options: [ - { - label: 'Option 1', - value: 'option-1', - }, - { - label: 'Option 2', - value: 'option-2', - }, - ], - }, - { - // TODO: fix this - // label: ({ data }) => `This is ${data?.title || 'Untitled'}`, - label: 'Hello', - type: 'collapsible', - admin: { - initCollapsed: true, - }, - fields: [ - { - name: 'collapsibleText', - label: 'Collapsible Text', - type: 'text', - required: true, - }, - ], - }, - { - name: 'group', - label: 'Group', - type: 'group', - fields: [ - { - name: 'groupText', - label: 'Group Text', - type: 'text', - required: true, - defaultValue: 'This is a default value', - }, - ], - }, - { - name: 'upload', - label: 'Upload', - type: 'upload', - relationTo: 'media', - }, - { - name: 'array', - label: 'Array', - type: 'array', - required: true, - fields: [ - { - name: 'arrayText', - label: 'Array Text', - type: 'text', - required: true, - defaultValue: 'This is a default value', - }, - ], - }, - { - name: 'blocks', - label: 'Blocks', - type: 'blocks', - required: true, - minRows: 1, - maxRows: 2, - blocks: [ - { - slug: 'text', - labels: { - singular: 'Text Block', - plural: 'Text Blocks', - }, - fields: [ - { - name: 'text', - label: 'Text', - type: 'text', - required: true, - admin: { - components: { - beforeInput: [BeforeInput], - }, - }, - }, - ], - }, - { - slug: 'textarea', - labels: { - singular: 'Textarea Block', - plural: 'Textarea Blocks', - }, - fields: [ - { - name: 'textarea', - label: 'Textarea', - type: 'textarea', - required: true, - }, - ], - }, - ], - }, - { - label: 'Tabs', - type: 'tabs', - tabs: [ - { - name: 'tab1', - label: 'Tab 1 (Named)', - validate: (value) => true, - fields: [ - { - name: 'tab1Text', - label: 'Tab 1 Text', - type: 'text', - required: true, - }, - ], - }, - { - label: 'Tab 2 (Unnamed)', - fields: [ - { - name: 'tab2Text', - label: 'Tab 2 Text', - type: 'text', - required: true, - }, - ], - }, - ], - }, - { - type: 'row', - fields: [ - { - name: 'rowText1', - label: 'Row Text', - type: 'text', - admin: { - width: '50%', - }, - }, - { - name: 'rowText2', - label: 'Row Text', - type: 'text', - admin: { - width: '50%', - }, - }, - ], - }, - { - name: 'json', - label: 'JSON', - type: 'json', - required: true, - }, - { - name: 'code', - label: 'Code', - type: 'code', - required: true, - admin: { - components: { - Cell: CustomCell, - }, - }, - }, - { - name: 'hidden', - label: 'Hidden', - type: 'text', - required: true, - admin: { - hidden: true, - }, - }, - ], -} diff --git a/packages/dev/src/collections/Users.ts b/packages/dev/src/collections/Users.ts deleted file mode 100644 index 626222d15..000000000 --- a/packages/dev/src/collections/Users.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { CollectionConfig } from 'payload/types' - -export const Users: CollectionConfig = { - slug: 'users', - auth: true, - admin: { - useAsTitle: 'email', - }, - fields: [], -} diff --git a/packages/dev/src/globals/Settings.ts b/packages/dev/src/globals/Settings.ts deleted file mode 100644 index 06cd8e394..000000000 --- a/packages/dev/src/globals/Settings.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { GlobalConfig } from 'payload/types' - -export const Settings: GlobalConfig = { - slug: 'settings', - fields: [ - { - name: 'title', - type: 'text', - }, - ], -} diff --git a/packages/dev/src/payload.config.ts b/packages/dev/src/payload.config.ts deleted file mode 100644 index f2b780494..000000000 --- a/packages/dev/src/payload.config.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { mongooseAdapter } from '@payloadcms/db-mongodb' -// import { postgresAdapter } from '@payloadcms/db-postgres' -// import { lexicalEditor } from '@payloadcms/richtext-lexical' -import { buildConfig } from 'payload/config' -import { Users } from './collections/Users' -import { Settings } from './globals/Settings' -import { Pages } from './collections/Pages' -import { lexicalEditor } from '@payloadcms/richtext-lexical' -import { Media } from './collections/Media' -import path from 'path' - -export default buildConfig({ - db: mongooseAdapter({ - url: process.env.DATABASE_URI, - }), - // db: postgresAdapter({ - // pool: { - // connectionString: 'postgres://127.0.0.1:5432/payloadtests', - // }, - // }), - secret: process.env.PAYLOAD_SECRET, - collections: [Users, Pages, Media], - globals: [Settings], - editor: lexicalEditor({}), - onInit: async (payload) => { - // await payload.create({ - // collection: 'users', - // data: { - // email: 'dev@payloadcms.com', - // password: 'test', - // }, - // }) - // const page = await payload.create({ - // collection: 'pages', - // data: { - // title: 'Test Page', - // }, - // }) - // await payload.update({ - // collection: 'pages', - // id: page.id, - // data: { - // title: 'Test Page (Updated)', - // }, - // }) - }, - upload: { - useTempFiles: true, - tempFileDir: path.join(__dirname, '../temp'), - limits: { fileSize: 200 * 1024 }, - abortOnLimit: true, - }, -}) diff --git a/packages/dev/tsconfig.json b/packages/dev/tsconfig.json index 225140966..897a9c7ee 100644 --- a/packages/dev/tsconfig.json +++ b/packages/dev/tsconfig.json @@ -30,19 +30,40 @@ "@payloadcms/translations/client": ["../translations/src/all"], "@payloadcms/translations/api": ["../translations/src/all"], "@payloadcms/next/*": ["../next/src/*"], - "payload-config": ["./src/payload.config.ts"] + "payload-config": ["../../src/payload.config.ts"] } }, - "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], + // "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"], "composite": true, // Make sure typescript knows that this module depends on their references "references": [ - { "path": "../payload" }, - { "path": "../next" }, - { "path": "../ui" }, - { "path": "../translations" }, - { "path": "../db-mongodb" }, - { "path": "../db-postgres" }, - { "path": "../richtext-lexical" } + { + "path": "../payload" + }, + { + "path": "../next" + }, + { + "path": "../ui" + }, + { + "path": "../translations" + }, + { + "path": "../db-mongodb" + }, + { + "path": "../db-postgres" + }, + { + "path": "../richtext-lexical" + } + ], + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx", + "../../src/payload.config.ts" ] } diff --git a/packages/next/src/routes/rest/RouteError.ts b/packages/next/src/routes/rest/RouteError.ts index 76927c1ee..72dc5aa2d 100644 --- a/packages/next/src/routes/rest/RouteError.ts +++ b/packages/next/src/routes/rest/RouteError.ts @@ -66,42 +66,44 @@ export const RouteError = async ({ err: APIError collection?: Collection }) => { - const { config, logger } = req.payload - let response = formatErrors(err) - let status = err.status || httpStatus.INTERNAL_SERVER_ERROR + return Response.json(err, { status: 500 }) - logger.error(err.stack) + // const { config, logger } = req.payload + // let response = formatErrors(err) + // let status = err.status || httpStatus.INTERNAL_SERVER_ERROR - // Internal server errors can contain anything, including potentially sensitive data. - // Therefore, error details will be hidden from the response unless `config.debug` is `true` - if (!config.debug && status === httpStatus.INTERNAL_SERVER_ERROR) { - response = formatErrors(new APIError('Something went wrong.')) - } + // logger.error(err.stack) - if (config.debug && config.debug === true) { - response.stack = err.stack - } + // // Internal server errors can contain anything, including potentially sensitive data. + // // Therefore, error details will be hidden from the response unless `config.debug` is `true` + // if (!config.debug && status === httpStatus.INTERNAL_SERVER_ERROR) { + // response = formatErrors(new APIError('Something went wrong.')) + // } - if (collection && typeof collection.config.hooks.afterError === 'function') { - ;({ response, status } = (await collection.config.hooks.afterError( - err, - response, - req.context, - collection.config, - )) || { response, status }) - } + // if (config.debug && config.debug === true) { + // response.stack = err.stack + // } - if (typeof config.hooks.afterError === 'function') { - ;({ response, status } = (await config.hooks.afterError( - err, - response, - req.context, - collection?.config, - )) || { - response, - status, - }) - } + // if (collection && typeof collection.config.hooks.afterError === 'function') { + // ;({ response, status } = (await collection.config.hooks.afterError( + // err, + // response, + // req.context, + // collection.config, + // )) || { response, status }) + // } - return Response.json(response, { status }) + // if (typeof config.hooks.afterError === 'function') { + // ;({ response, status } = (await config.hooks.afterError( + // err, + // response, + // req.context, + // collection?.config, + // )) || { + // response, + // status, + // }) + // } + + // return Response.json(response, { status }) } diff --git a/packages/next/src/routes/rest/[collection]/file/[filename]/route.ts b/packages/next/src/routes/rest/[collection]/file/[filename]/route.ts index 7e9ed6a0c..640cc2da1 100644 --- a/packages/next/src/routes/rest/[collection]/file/[filename]/route.ts +++ b/packages/next/src/routes/rest/[collection]/file/[filename]/route.ts @@ -2,7 +2,7 @@ import path from 'path' import { streamFile } from '../../../../../next-stream-file' import fsPromises from 'fs/promises' import type { Collection, PayloadRequest, SanitizedConfig, Where } from 'payload/types' -import executeAccess from 'payload/dist/auth/executeAccess' +import { executeAccess } from 'payload/auth' import { APIError, Forbidden } from 'payload/errors' import { RouteError } from '../../../RouteError' import { createPayloadRequest } from '../../../../../utilities/createPayloadRequest' diff --git a/packages/next/tsconfig.json b/packages/next/tsconfig.json index 72752e023..d6cdcca4b 100644 --- a/packages/next/tsconfig.json +++ b/packages/next/tsconfig.json @@ -6,8 +6,9 @@ "emitDeclarationOnly": true, "outDir": "./dist" /* Specify an output folder for all emitted files. */, "rootDir": "./src" /* Specify the root folder within your source files. */, + "sourceMap": true, "paths": { - "@payloadcms/graphql": ["../graphql/dist/index.ts"], + "@payloadcms/graphql": ["../graphql/src"], "@payloadcms/ui": ["../ui/src/exports/index.ts"], "@payloadcms/translations/*": ["../translations/dist/*"] }, @@ -32,7 +33,7 @@ "src/**/*.d.ts", "src/**/*.json", "../ui/src/createClientConfig.ts", - "../dev/src/app/(payload)/admin/login/action.ts", + "../../app/(payload)/admin/login/action.ts", "../payload/src/auth/cookies.ts" ], "references": [ diff --git a/packages/payload/src/database/migrations/readMigrationFiles.ts b/packages/payload/src/database/migrations/readMigrationFiles.ts index 80bad384a..2216b4f93 100644 --- a/packages/payload/src/database/migrations/readMigrationFiles.ts +++ b/packages/payload/src/database/migrations/readMigrationFiles.ts @@ -35,7 +35,7 @@ export const readMigrationFiles = async ({ return Promise.all( files.map(async (filePath) => { - const migration = (await import(`${filePath}`)) as Migration + const migration = eval(`(await import(${filePath}))`) as Migration migration.name = path.basename(filePath).split('.')?.[0] return migration }), diff --git a/packages/payload/src/exports/auth.ts b/packages/payload/src/exports/auth.ts index f3fc96403..98928adb2 100644 --- a/packages/payload/src/exports/auth.ts +++ b/packages/payload/src/exports/auth.ts @@ -1,4 +1,5 @@ export * from '../auth' +export { default as executeAccess } from '../auth/executeAccess' export { getAccessResults } from '../auth/getAccessResults' export { getAuthenticatedUser } from '../auth/getAuthenticatedUser' diff --git a/packages/ui/src/icons/Menu/index.scss b/packages/ui/src/icons/Menu/index.scss index d936e494c..8840e1cda 100644 --- a/packages/ui/src/icons/Menu/index.scss +++ b/packages/ui/src/icons/Menu/index.scss @@ -1,4 +1,4 @@ -@import 'payload-styles'; +@import '../../scss/styles.scss'; .icon--menu { .fill { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb97f39c2..09d878b13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ importers: '@sentry/react': specifier: ^7.77.0 version: 7.77.0(react@18.2.0) - react: - specifier: 18.2.0 - version: 18.2.0 react-router-dom: specifier: 5.3.4 version: 5.3.4(react@18.2.0) @@ -168,6 +165,9 @@ importers: node-fetch: specifier: 2.6.12 version: 2.6.12 + node-mocks-http: + specifier: ^1.14.1 + version: 1.14.1 nodemon: specifier: 3.0.2 version: 3.0.2 @@ -186,6 +186,12 @@ importers: qs: specifier: 6.11.2 version: 6.11.2 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) read-stream: specifier: ^2.1.1 version: 2.1.1 @@ -225,6 +231,9 @@ importers: uuid: specifier: ^9.0.1 version: 9.0.1 + yocto-queue: + specifier: ^1.0.0 + version: 1.0.0 packages/create-payload-app: dependencies: @@ -387,6 +396,9 @@ importers: react-dom: specifier: 18.3.0-canary-b36ae8d7a-20231207 version: 18.3.0-canary-b36ae8d7a-20231207(react@18.3.0-canary-b36ae8d7a-20231207) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.1(ts-node@10.9.1) devDependencies: '@types/node': specifier: ^20 @@ -1340,6 +1352,11 @@ packages: resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -3271,6 +3288,18 @@ packages: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -4271,6 +4300,13 @@ packages: engines: {node: '>=8.0.0'} dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + /@playwright/test@1.40.1: resolution: {integrity: sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==} engines: {node: '>=16'} @@ -5770,6 +5806,12 @@ packages: resolution: {integrity: sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==} dev: true + /@types/node@20.11.17: + resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/node@20.5.7: resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} @@ -6536,7 +6578,6 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: true /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -6557,7 +6598,6 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - dev: true /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -7174,6 +7214,11 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -7434,6 +7479,11 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -7961,6 +8011,12 @@ packages: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /cssfilter@0.0.10: resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} dev: false @@ -8255,6 +8311,11 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: false + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -8290,6 +8351,10 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + /diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -8325,6 +8390,10 @@ packages: hasBin: true dev: false + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -8506,7 +8575,6 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -9646,6 +9714,14 @@ packages: dependencies: is-callable: 1.2.7 + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + /form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -9968,6 +10044,18 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: false + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -11045,6 +11133,15 @@ packages: set-function-name: 2.0.1 dev: false + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11707,6 +11804,11 @@ packages: - supports-color - ts-node + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: false + /joi@17.12.1: resolution: {integrity: sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==} dependencies: @@ -12038,7 +12140,11 @@ packages: /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - dev: true + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: false /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -12241,7 +12347,6 @@ packages: /lru-cache@10.0.1: resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} engines: {node: 14 || >=16.14} - dev: true /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -12530,7 +12635,6 @@ packages: /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} - dev: true /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -12901,6 +13005,24 @@ packages: /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + /node-mocks-http@1.14.1: + resolution: {integrity: sha512-mfXuCGonz0A7uG1FEjnypjm34xegeN5+HI6xeGhYKecfgaZhjsmYoLE9LEFmT+53G1n8IuagPZmVnEL/xNsFaA==} + engines: {node: '>=14'} + dependencies: + '@types/express': 4.17.21 + '@types/node': 20.11.17 + accepts: 1.3.8 + content-disposition: 0.5.4 + depd: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + mime: 1.6.0 + parseurl: 1.3.3 + range-parser: 1.2.1 + type-is: 1.6.18 + dev: true + /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} @@ -13068,6 +13190,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -13473,7 +13600,6 @@ packages: dependencies: lru-cache: 10.0.1 minipass: 7.0.4 - dev: true /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -13605,7 +13731,6 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - dev: true /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} @@ -13700,6 +13825,68 @@ packages: engines: {node: '>=4'} dev: false + /postcss-import@15.1.0(postcss@8.4.35): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.6 + dev: false + + /postcss-js@4.0.1(postcss@8.4.35): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.35 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.35)(ts-node@10.9.1): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.35 + ts-node: 10.9.1(@swc/core@1.3.102)(@types/node@20.5.7)(typescript@5.2.2) + yaml: 2.3.4 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.35): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: false + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -14251,6 +14438,12 @@ packages: loose-envify: 1.4.0 dev: false + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + /read-pkg-up@10.1.0: resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} engines: {node: '>=16'} @@ -14916,6 +15109,11 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -15252,7 +15450,6 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} @@ -15322,7 +15519,6 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: true /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -15437,6 +15633,20 @@ packages: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} dev: false + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -15475,6 +15685,37 @@ packages: resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} dev: false + /tailwindcss@3.4.1(ts-node@10.9.1): + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.35 + postcss-import: 15.1.0(postcss@8.4.35) + postcss-js: 4.0.1(postcss@8.4.35) + postcss-load-config: 4.0.2(postcss@8.4.35)(ts-node@10.9.1) + postcss-nested: 6.0.1(postcss@8.4.35) + postcss-selector-parser: 6.0.15 + resolve: 1.22.6 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: false + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -15777,6 +16018,10 @@ packages: dependencies: typescript: 5.2.2 + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + /ts-jest@29.1.1(@babel/core@7.22.20)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16123,6 +16368,10 @@ packages: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: false @@ -16536,7 +16785,6 @@ packages: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -16633,6 +16881,11 @@ packages: engines: {node: '>= 14'} dev: true + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: false + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} diff --git a/test/_community/int.spec.ts b/test/_community/int.spec.ts index f14544365..92df518dc 100644 --- a/test/_community/int.spec.ts +++ b/test/_community/int.spec.ts @@ -1,15 +1,17 @@ import type { Payload } from '../../packages/payload/src' +import { GET as createGET, POST as createPOST } from '../../packages/next/src/routes/rest/index' +import { getPayload } from '../../packages/payload/src' import { devUser } from '../credentials' -import { initPayloadTest } from '../helpers/configHelpers' import { postsSlug } from './collections/Posts' - -require('isomorphic-fetch') +import config from './config' let payload: Payload -let apiURL: string let jwt +const GET = createGET(config) +const POST = createPOST(config) + const headers = { 'Content-Type': 'application/json', } @@ -20,27 +22,30 @@ describe('_Community Tests', () => { // Boilerplate test setup/teardown // --__--__--__--__--__--__--__--__--__ beforeAll(async () => { - const { payload: payloadClient, serverURL } = await initPayloadTest({ - __dirname, - init: { local: false }, - }) + payload = await getPayload({ config }) - apiURL = `${serverURL}/api` - payload = payloadClient - - const response = await fetch(`${apiURL}/users/login`, { + const req = new Request('http://localhost:3000/api/users/login', { + method: 'POST', + headers: new Headers(headers), body: JSON.stringify({ email, password, }), - headers, - method: 'post', }) - const data = await response.json() + const data = await POST(req, { + params: { + slug: ['users', 'login'], + }, + }).then((res) => res.json()) + jwt = data.token }) + beforeEach(() => { + jest.resetModules() + }) + afterAll(async () => { if (typeof payload.db.destroy === 'function') { await payload.db.destroy(payload) @@ -64,17 +69,23 @@ describe('_Community Tests', () => { }) it('rest API example', async () => { - const newPost = await fetch(`${apiURL}/${postsSlug}`, { + const req = new Request(`http://localhost:3000/posts`, { method: 'POST', - headers: { + headers: new Headers({ ...headers, Authorization: `JWT ${jwt}`, - }, + }), body: JSON.stringify({ text: 'REST API EXAMPLE', }), + }) + + const data = await POST(req, { + params: { + slug: ['posts'], + }, }).then((res) => res.json()) - expect(newPost.doc.text).toEqual('REST API EXAMPLE') + expect(data.doc.text).toEqual('REST API EXAMPLE') }) }) diff --git a/test/helpers/configHelpers.ts b/test/helpers/configHelpers.ts index c7a920898..0db98aab7 100644 --- a/test/helpers/configHelpers.ts +++ b/test/helpers/configHelpers.ts @@ -49,7 +49,7 @@ export async function initPayloadTest(options: Options): Promise