diff --git a/.vscode/launch.json b/.vscode/launch.json
index 2a0e958723..fc04075945 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 0000000000..b464bdee34
--- /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 0000000000..445f1db00d
--- /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 2b7cdc7b7e..d56dfff7b2 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 0000000000..4f11a03dc6
--- /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 0000000000..b53acef565
--- /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 cf2558e131..3d99cb508c 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 c3a7f8e545..8cc578d6c3 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 f835ec7000..0000000000
--- 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 400b2435b0..0000000000
--- 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 a0979563ad..0000000000
--- 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 f54ebdb20a..0000000000
--- 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 4b0f6b88ec..0000000000
--- 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 900d7f1254..0000000000
--- 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 3f7eb4d5e0..0000000000
--- 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 d5077afd6d..0000000000
--- 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 3cc90a28e1..0000000000
--- 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 4e04adc1d6..0000000000
--- 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 626222d156..0000000000
--- 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 06cd8e3944..0000000000
--- 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 f2b780494f..0000000000
--- 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 2251409663..897a9c7eee 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 76927c1eea..72dc5aa2db 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 7e9ed6a0cb..640cc2da17 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 72752e0238..d6cdcca4b5 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 80bad384a1..2216b4f93d 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 f3fc964037..98928adb22 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 d936e494c5..8840e1cda1 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 eb97f39c20..09d878b136 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 f145443650..92df518dc8 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 c7a920898b..0db98aab7c 100644
--- a/test/helpers/configHelpers.ts
+++ b/test/helpers/configHelpers.ts
@@ -49,7 +49,7 @@ export async function initPayloadTest(options: Options): Promise