From b86594f3f9d58928d035be273411d0f2232ecea5 Mon Sep 17 00:00:00 2001 From: Nathan Clevenger Date: Sun, 10 Nov 2024 01:23:32 -0600 Subject: [PATCH 1/7] docs: fixed typo in `onSuccess` (#9096) Changed `if the task fails` to `if the task succeeds` --- docs/jobs-queue/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/jobs-queue/overview.mdx b/docs/jobs-queue/overview.mdx index 8c50db3ce7..ac57fcbb73 100644 --- a/docs/jobs-queue/overview.mdx +++ b/docs/jobs-queue/overview.mdx @@ -43,7 +43,7 @@ Simply add a task to the `jobs.tasks` array in your Payload config. A task consi | `outputSchema` | Define the output field schema - payload will generate a type for this schema. | | `label` | Define a human-friendly label for this task. | | `onFail` | Function to be executed if the task fails. | -| `onSuccess` | Function to be executed if the task fails. | +| `onSuccess` | Function to be executed if the task succeeds. | | `retries` | Specify the number of times that this step should be retried if it fails. | The logic for the Task is defined in the `handler` - which can be defined as a function, or a path to a function. The `handler` will run once a worker picks picks up a Job that includes this task. From a42150311110ba75c772f3a220f9230c6e4cf86d Mon Sep 17 00:00:00 2001 From: Ruy Monteiro Date: Sun, 10 Nov 2024 04:59:46 -0300 Subject: [PATCH 2/7] docs(storage-uploadthing): fix typo in README.md (#9090) --- packages/storage-uploadthing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/storage-uploadthing/README.md b/packages/storage-uploadthing/README.md index 76015df0f2..04d216b8e4 100644 --- a/packages/storage-uploadthing/README.md +++ b/packages/storage-uploadthing/README.md @@ -5,7 +5,7 @@ This package provides a way to use [uploadthing](https://uploadthing.com) with P ## Installation ```sh -pnpm add @paylaodcms/storage-uploadthing +pnpm add @payloadcms/storage-uploadthing ``` ## Usage From 0a15388edbbca66be46ba754cfd978bf725e732f Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Mon, 11 Nov 2024 16:31:47 +0200 Subject: [PATCH 3/7] feat(db-postgres): add point field support (#9078) ### What? Adds full support for the point field to Postgres and Vercel Postgres adapters through the Postgis extension. Fully the same API as with MongoDB, including support for `near`, `within` and `intersects` operators. Additionally, exposes to adapter args: * `tablesFilter`https://orm.drizzle.team/docs/drizzle-kit-push#including-tables-schemas-and-extensions. * `extensions` list of extensions to create, for example `['vector', 'pg_search']`, `postgis` is created automatically if there's any point field ### Why? It's essential to support that field type, especially if the postgres adapter should be out of beta on 3.0 stable. ### How? * Bumps `drizzle-orm` to `0.36.1` and `drizzle-kit` to `0.28.0` as we need this change https://github.com/drizzle-team/drizzle-orm/pull/3141 * Uses its functions to achieve querying functionality, for example the `near` operator works through `ST_DWithin` or `intersects` through `ST_Intersects`. * Removes MongoDB condition from all point field tests, but keeps for SQLite Resolves these discussions: https://github.com/payloadcms/payload/discussions/8996 https://github.com/payloadcms/payload/discussions/8644 --- .github/workflows/main.yml | 26 +- docs/database/overview.mdx | 2 +- docs/fields/point.mdx | 2 +- package.json | 4 +- packages/db-mongodb/src/models/buildSchema.ts | 3 + packages/db-postgres/package.json | 4 +- packages/db-postgres/src/connect.ts | 2 + packages/db-postgres/src/index.ts | 9 + packages/db-postgres/src/types.ts | 5 + packages/db-sqlite/package.json | 4 +- packages/db-vercel-postgres/package.json | 4 +- packages/db-vercel-postgres/src/connect.ts | 2 + packages/db-vercel-postgres/src/index.ts | 9 + packages/db-vercel-postgres/src/types.ts | 5 + packages/drizzle/package.json | 2 +- packages/drizzle/src/exports/postgres.ts | 1 + packages/drizzle/src/find/traverseFields.ts | 40 +++ packages/drizzle/src/migrate.ts | 4 + packages/drizzle/src/migrateFresh.ts | 7 +- .../drizzle/src/postgres/createExtensions.ts | 13 + .../drizzle/src/postgres/defaultSnapshot.ts | 2 + .../src/postgres/schema/geometryColumn.ts | 20 ++ .../src/postgres/schema/traverseFields.ts | 8 +- .../src/postgres/schema/withDefault.ts | 4 + packages/drizzle/src/postgres/types.ts | 3 + packages/drizzle/src/queries/operatorMap.ts | 4 - packages/drizzle/src/queries/parseParams.ts | 33 ++ .../drizzle/src/queries/sanitizeQueryValue.ts | 8 +- .../src/transform/write/traverseFields.ts | 4 + packages/drizzle/src/types.ts | 4 + .../drizzle/src/utilities/pushDevSchema.ts | 7 + pnpm-lock.yaml | 69 ++-- test/_community/payload-types.ts | 173 ++++++++++ test/collections-graphql/int.spec.ts | 206 +++++------ test/collections-rest/int.spec.ts | 321 +++++++++--------- test/database/config.ts | 5 + test/database/int.spec.ts | 4 + test/database/payload-types.ts | 9 + test/fields/int.spec.ts | 163 ++++----- test/package.json | 2 +- test/select/collections/Points/index.ts | 15 + test/select/config.ts | 2 + test/select/int.spec.ts | 46 +++ test/select/payload-types.ts | 31 ++ 44 files changed, 887 insertions(+), 404 deletions(-) create mode 100644 packages/drizzle/src/postgres/createExtensions.ts create mode 100644 packages/drizzle/src/postgres/schema/geometryColumn.ts create mode 100644 test/select/collections/Points/index.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 902df9bd77..3e6f45525d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -208,6 +208,19 @@ jobs: AWS_SECRET_ACCESS_KEY: localstack AWS_REGION: us-east-1 + services: + postgres: + image: ${{ (startsWith(matrix.database, 'postgres') ) && 'postgis/postgis:16-3.4' || '' }} + env: + # must specify password for PG Docker container image, see: https://registry.hub.docker.com/_/postgres?tab=description&page=1&name=10 + POSTGRES_USER: ${{ env.POSTGRES_USER }} + POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }} + POSTGRES_DB: ${{ env.POSTGRES_DB }} + ports: + - 5432:5432 + # needed because the postgres container does not provide a healthcheck + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + steps: - uses: actions/checkout@v4 with: @@ -232,15 +245,6 @@ jobs: - name: Start LocalStack run: pnpm docker:start - - name: Start PostgreSQL - uses: CasperWA/postgresql-action@v1.2 - with: - postgresql version: '14' # See https://hub.docker.com/_/postgres for available versions - postgresql db: ${{ env.POSTGRES_DB }} - postgresql user: ${{ env.POSTGRES_USER }} - postgresql password: ${{ env.POSTGRES_PASSWORD }} - if: startsWith(matrix.database, 'postgres') - - name: Install Supabase CLI uses: supabase/setup-cli@v1 with: @@ -253,10 +257,6 @@ jobs: supabase start if: matrix.database == 'supabase' - - name: Wait for PostgreSQL - run: sleep 30 - if: startsWith(matrix.database, 'postgres') - - name: Configure PostgreSQL run: | psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" -c "CREATE ROLE runner SUPERUSER LOGIN;" diff --git a/docs/database/overview.mdx b/docs/database/overview.mdx index 6aa7c1ca20..632fcb2bed 100644 --- a/docs/database/overview.mdx +++ b/docs/database/overview.mdx @@ -67,6 +67,6 @@ You should prefer a relational DB like Postgres or SQLite if: ## Payload Differences -It's important to note that nearly every Payload feature is available in all of our officially supported Database Adapters, including [Localization](../configuration/localization), [Arrays](../fields/array), [Blocks](../fields/blocks), etc. The only thing that is not supported in Postgres yet is the [Point Field](/docs/fields/point), but that should be added soon. +It's important to note that nearly every Payload feature is available in all of our officially supported Database Adapters, including [Localization](../configuration/localization), [Arrays](../fields/array), [Blocks](../fields/blocks), etc. The only thing that is not supported in SQLite yet is the [Point Field](/docs/fields/point), but that should be added soon. It's up to you to choose which database you would like to use based on the requirements of your project. Payload has no opinion on which database you should ultimately choose. diff --git a/docs/fields/point.mdx b/docs/fields/point.mdx index 49439b6acc..1208fefe08 100644 --- a/docs/fields/point.mdx +++ b/docs/fields/point.mdx @@ -28,7 +28,7 @@ export const MyPointField: Field = { Important: - The Point Field is currently only supported in MongoDB. + The Point Field currently is not supported in SQLite. ## Config diff --git a/package.json b/package.json index e59ffa83fd..9ed5906f04 100644 --- a/package.json +++ b/package.json @@ -132,8 +132,8 @@ "create-payload-app": "workspace:*", "cross-env": "7.0.3", "dotenv": "16.4.5", - "drizzle-kit": "0.26.2", - "drizzle-orm": "0.35.1", + "drizzle-kit": "0.28.0", + "drizzle-orm": "0.36.1", "escape-html": "^1.0.3", "execa": "5.1.1", "form-data": "3.0.1", diff --git a/packages/db-mongodb/src/models/buildSchema.ts b/packages/db-mongodb/src/models/buildSchema.ts index c2c8a4fcc6..d47f25ace9 100644 --- a/packages/db-mongodb/src/models/buildSchema.ts +++ b/packages/db-mongodb/src/models/buildSchema.ts @@ -353,6 +353,9 @@ const fieldToSchemaMap: Record = { type: { type: String, enum: ['Point'], + ...(typeof field.defaultValue !== 'undefined' && { + default: 'Point', + }), }, coordinates: { type: [Number], diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 096e8fd107..4b6c635499 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -50,8 +50,8 @@ "@payloadcms/drizzle": "workspace:*", "@types/pg": "8.10.2", "console-table-printer": "2.12.1", - "drizzle-kit": "0.26.2", - "drizzle-orm": "0.35.1", + "drizzle-kit": "0.28.0", + "drizzle-orm": "0.36.1", "pg": "8.11.3", "prompts": "2.4.2", "to-snake-case": "1.0.0", diff --git a/packages/db-postgres/src/connect.ts b/packages/db-postgres/src/connect.ts index 032ba7ba91..769ce6b73e 100644 --- a/packages/db-postgres/src/connect.ts +++ b/packages/db-postgres/src/connect.ts @@ -100,6 +100,8 @@ export const connect: Connect = async function connect( process.exit(1) } + await this.createExtensions() + // Only push schema if not in production if ( process.env.NODE_ENV !== 'production' && diff --git a/packages/db-postgres/src/index.ts b/packages/db-postgres/src/index.ts index 2fb83585cc..473436021e 100644 --- a/packages/db-postgres/src/index.ts +++ b/packages/db-postgres/src/index.ts @@ -36,6 +36,7 @@ import { convertPathToJSONTraversal, countDistinct, createDatabase, + createExtensions, createJSONQuery, createMigration, defaultDrizzleSnapshot, @@ -75,15 +76,22 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj adapterSchema = { enum: pgEnum, table: pgTable } } + const extensions = (args.extensions ?? []).reduce((acc, name) => { + acc[name] = true + return acc + }, {}) + return createDatabaseAdapter({ name: 'postgres', afterSchemaInit: args.afterSchemaInit ?? [], beforeSchemaInit: args.beforeSchemaInit ?? [], createDatabase, + createExtensions, defaultDrizzleSnapshot, disableCreateDatabase: args.disableCreateDatabase ?? false, drizzle: undefined, enums: {}, + extensions, features: { json: true, }, @@ -106,6 +114,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj sessions: {}, tableNameMap: new Map(), tables: {}, + tablesFilter: args.tablesFilter, transactionOptions: args.transactionOptions || undefined, versionsSuffix: args.versionsSuffix || '_v', diff --git a/packages/db-postgres/src/types.ts b/packages/db-postgres/src/types.ts index 53256e25d4..f3aaa5423f 100644 --- a/packages/db-postgres/src/types.ts +++ b/packages/db-postgres/src/types.ts @@ -29,6 +29,7 @@ export type Args = { * @default false */ disableCreateDatabase?: boolean + extensions?: string[] idType?: 'serial' | 'uuid' localesSuffix?: string logger?: DrizzleConfig['logger'] @@ -46,6 +47,7 @@ export type Args = { * @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle. */ schemaName?: string + tablesFilter?: string[] transactionOptions?: false | PgTransactionConfig versionsSuffix?: string } @@ -60,10 +62,12 @@ declare module 'payload' { extends Omit, DrizzleAdapter { afterSchemaInit: PostgresSchemaHook[] + beforeSchemaInit: PostgresSchemaHook[] beginTransaction: (options?: PgTransactionConfig) => Promise drizzle: PostgresDB enums: Record + extensions: Record /** * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name * Used for returning properly formed errors from unique fields @@ -88,6 +92,7 @@ declare module 'payload' { schema: Record schemaName?: Args['schemaName'] tableNameMap: Map + tablesFilter?: string[] versionsSuffix?: string } } diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json index 1ae730a849..533ffcd920 100644 --- a/packages/db-sqlite/package.json +++ b/packages/db-sqlite/package.json @@ -48,8 +48,8 @@ "@libsql/client": "0.14.0", "@payloadcms/drizzle": "workspace:*", "console-table-printer": "2.12.1", - "drizzle-kit": "0.26.2", - "drizzle-orm": "0.35.1", + "drizzle-kit": "0.28.0", + "drizzle-orm": "0.36.1", "prompts": "2.4.2", "to-snake-case": "1.0.0", "uuid": "9.0.0" diff --git a/packages/db-vercel-postgres/package.json b/packages/db-vercel-postgres/package.json index 4bbd5ea7d3..3e56837037 100644 --- a/packages/db-vercel-postgres/package.json +++ b/packages/db-vercel-postgres/package.json @@ -50,8 +50,8 @@ "@payloadcms/drizzle": "workspace:*", "@vercel/postgres": "^0.9.0", "console-table-printer": "2.12.1", - "drizzle-kit": "0.26.2", - "drizzle-orm": "0.35.1", + "drizzle-kit": "0.28.0", + "drizzle-orm": "0.36.1", "pg": "8.11.3", "prompts": "2.4.2", "to-snake-case": "1.0.0", diff --git a/packages/db-vercel-postgres/src/connect.ts b/packages/db-vercel-postgres/src/connect.ts index 1039db72cf..364859401d 100644 --- a/packages/db-vercel-postgres/src/connect.ts +++ b/packages/db-vercel-postgres/src/connect.ts @@ -64,6 +64,8 @@ export const connect: Connect = async function connect( process.exit(1) } + await this.createExtensions() + // Only push schema if not in production if ( process.env.NODE_ENV !== 'production' && diff --git a/packages/db-vercel-postgres/src/index.ts b/packages/db-vercel-postgres/src/index.ts index ebde82d9d0..e053dcccec 100644 --- a/packages/db-vercel-postgres/src/index.ts +++ b/packages/db-vercel-postgres/src/index.ts @@ -36,6 +36,7 @@ import { convertPathToJSONTraversal, countDistinct, createDatabase, + createExtensions, createJSONQuery, createMigration, defaultDrizzleSnapshot, @@ -75,15 +76,22 @@ export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj { + acc[name] = true + return acc + }, {}) + return createDatabaseAdapter({ name: 'postgres', afterSchemaInit: args.afterSchemaInit ?? [], beforeSchemaInit: args.beforeSchemaInit ?? [], createDatabase, + createExtensions, defaultDrizzleSnapshot, disableCreateDatabase: args.disableCreateDatabase ?? false, drizzle: undefined, enums: {}, + extensions, features: { json: true, }, @@ -107,6 +115,7 @@ export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj(), tables: {}, + tablesFilter: args.tablesFilter, transactionOptions: args.transactionOptions || undefined, versionsSuffix: args.versionsSuffix || '_v', diff --git a/packages/db-vercel-postgres/src/types.ts b/packages/db-vercel-postgres/src/types.ts index 35d022ac0f..85b90722ed 100644 --- a/packages/db-vercel-postgres/src/types.ts +++ b/packages/db-vercel-postgres/src/types.ts @@ -30,6 +30,7 @@ export type Args = { * @default false */ disableCreateDatabase?: boolean + extensions?: string[] idType?: 'serial' | 'uuid' localesSuffix?: string logger?: DrizzleConfig['logger'] @@ -51,6 +52,7 @@ export type Args = { * @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle. */ schemaName?: string + tablesFilter?: string[] transactionOptions?: false | PgTransactionConfig versionsSuffix?: string } @@ -69,6 +71,8 @@ declare module 'payload' { beginTransaction: (options?: PgTransactionConfig) => Promise drizzle: PostgresDB enums: Record + extensions: Record + extensionsFilter: Set /** * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name * Used for returning properly formed errors from unique fields @@ -93,6 +97,7 @@ declare module 'payload' { schema: Record schemaName?: Args['schemaName'] tableNameMap: Map + tablesFilter?: string[] versionsSuffix?: string } } diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json index e5e1ab20f1..a26c4439c8 100644 --- a/packages/drizzle/package.json +++ b/packages/drizzle/package.json @@ -46,7 +46,7 @@ }, "dependencies": { "console-table-printer": "2.12.1", - "drizzle-orm": "0.35.1", + "drizzle-orm": "0.36.1", "prompts": "2.4.2", "to-snake-case": "1.0.0", "uuid": "9.0.0" diff --git a/packages/drizzle/src/exports/postgres.ts b/packages/drizzle/src/exports/postgres.ts index 4700224332..a20bc2b6be 100644 --- a/packages/drizzle/src/exports/postgres.ts +++ b/packages/drizzle/src/exports/postgres.ts @@ -1,5 +1,6 @@ export { countDistinct } from '../postgres/countDistinct.js' export { createDatabase } from '../postgres/createDatabase.js' +export { createExtensions } from '../postgres/createExtensions.js' export { convertPathToJSONTraversal } from '../postgres/createJSONQuery/convertPathToJSONTraversal.js' export { createJSONQuery } from '../postgres/createJSONQuery/index.js' export { createMigration } from '../postgres/createMigration.js' diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index 9ea828d70b..0222536395 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -390,6 +390,46 @@ export const traverseFields = ({ break } + case 'point': { + if (adapter.name === 'sqlite') { + break + } + + const args = field.localized ? _locales : currentArgs + if (!args.columns) { + args.columns = {} + } + + if (!args.extras) { + args.extras = {} + } + + const name = `${path}${field.name}` + + // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526 + // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON + args.columns[name] = false + + let shouldSelect = false + + if (select || selectAllOnCurrentLevel) { + if ( + selectAllOnCurrentLevel || + (selectMode === 'include' && select[field.name] === true) || + (selectMode === 'exclude' && typeof select[field.name] === 'undefined') + ) { + shouldSelect = true + } + } else { + shouldSelect = true + } + + if (shouldSelect) { + args.extras[name] = sql.raw(`ST_AsGeoJSON(${toSnakeCase(name)})::jsonb`).as(name) + } + break + } + case 'join': { // when `joinsQuery` is false, do not join if (joinQuery === false) { diff --git a/packages/drizzle/src/migrate.ts b/packages/drizzle/src/migrate.ts index 7d2ac4ff92..6bb37472e2 100644 --- a/packages/drizzle/src/migrate.ts +++ b/packages/drizzle/src/migrate.ts @@ -20,6 +20,10 @@ export const migrate: DrizzleAdapter['migrate'] = async function migrate( return } + if ('createExtensions' in this && typeof this.createExtensions === 'function') { + await this.createExtensions() + } + let latestBatch = 0 let migrationsInDB = [] diff --git a/packages/drizzle/src/migrateFresh.ts b/packages/drizzle/src/migrateFresh.ts index fc05d8171d..8aea223782 100644 --- a/packages/drizzle/src/migrateFresh.ts +++ b/packages/drizzle/src/migrateFresh.ts @@ -3,7 +3,7 @@ import type { PayloadRequest } from 'payload' import { commitTransaction, initTransaction, killTransaction, readMigrationFiles } from 'payload' import prompts from 'prompts' -import type { DrizzleAdapter, Migration } from './types.js' +import type { DrizzleAdapter } from './types.js' import { parseError } from './utilities/parseError.js' @@ -48,6 +48,11 @@ export async function migrateFresh( }) const req = { payload } as PayloadRequest + + if ('createExtensions' in this && typeof this.createExtensions === 'function') { + await this.createExtensions() + } + // Run all migrate up for (const migration of migrationFiles) { payload.logger.info({ msg: `Migrating: ${migration.name}` }) diff --git a/packages/drizzle/src/postgres/createExtensions.ts b/packages/drizzle/src/postgres/createExtensions.ts new file mode 100644 index 0000000000..869e43a56c --- /dev/null +++ b/packages/drizzle/src/postgres/createExtensions.ts @@ -0,0 +1,13 @@ +import type { BasePostgresAdapter } from './types.js' + +export const createExtensions = async function (this: BasePostgresAdapter): Promise { + for (const extension in this.extensions) { + if (this.extensions[extension]) { + try { + await this.drizzle.execute(`CREATE EXTENSION IF NOT EXISTS "${extension}"`) + } catch (err) { + this.payload.logger.error({ err, msg: `Failed to create extension ${extension}` }) + } + } + } +} diff --git a/packages/drizzle/src/postgres/defaultSnapshot.ts b/packages/drizzle/src/postgres/defaultSnapshot.ts index 482d9c7ac5..91f93b505b 100644 --- a/packages/drizzle/src/postgres/defaultSnapshot.ts +++ b/packages/drizzle/src/postgres/defaultSnapshot.ts @@ -9,7 +9,9 @@ export const defaultDrizzleSnapshot: DrizzleSnapshotJSON = { }, dialect: 'postgresql', enums: {}, + policies: {}, prevId: '00000000-0000-0000-0000-00000000000', + roles: {}, schemas: {}, sequences: {}, tables: {}, diff --git a/packages/drizzle/src/postgres/schema/geometryColumn.ts b/packages/drizzle/src/postgres/schema/geometryColumn.ts new file mode 100644 index 0000000000..8bc5efbf1d --- /dev/null +++ b/packages/drizzle/src/postgres/schema/geometryColumn.ts @@ -0,0 +1,20 @@ +// Uses custom one instead of geometry() from drizzle-orm/pg-core because it's broken on pushDevSchema +// Why? +// It tries to give us a prompt "you're about to change.. from geometry(Point) to geometry(point)" +import { customType } from 'drizzle-orm/pg-core' +import { parseEWKB } from 'drizzle-orm/pg-core/columns/postgis_extension/utils' + +type Point = [number, number] + +export const geometryColumn = (name: string) => + customType<{ data: Point; driverData: string }>({ + dataType() { + return `geometry(Point)` + }, + fromDriver(value: string) { + return parseEWKB(value) + }, + toDriver(value: Point) { + return `SRID=4326;point(${value[0]} ${value[1]})` + }, + })(name) diff --git a/packages/drizzle/src/postgres/schema/traverseFields.ts b/packages/drizzle/src/postgres/schema/traverseFields.ts index 4a53ea784c..250a25a40d 100644 --- a/packages/drizzle/src/postgres/schema/traverseFields.ts +++ b/packages/drizzle/src/postgres/schema/traverseFields.ts @@ -6,6 +6,7 @@ import { relations } from 'drizzle-orm' import { boolean, foreignKey, + geometry, index, integer, jsonb, @@ -35,6 +36,7 @@ import { hasLocalesTable } from '../../utilities/hasLocalesTable.js' import { validateExistingBlockIsIdentical } from '../../utilities/validateExistingBlockIsIdentical.js' import { buildTable } from './build.js' import { createIndex } from './createIndex.js' +import { geometryColumn } from './geometryColumn.js' import { idToUUID } from './idToUUID.js' import { parentIDColumnMap } from './parentIDColumnMap.js' import { withDefault } from './withDefault.js' @@ -156,7 +158,7 @@ export const traverseFields = ({ if ( (field.unique || field.index || ['relationship', 'upload'].includes(field.type)) && - !['array', 'blocks', 'group', 'point'].includes(field.type) && + !['array', 'blocks', 'group'].includes(field.type) && !('hasMany' in field && field.hasMany === true) && !('relationTo' in field && Array.isArray(field.relationTo)) ) { @@ -261,6 +263,10 @@ export const traverseFields = ({ } case 'point': { + targetTable[fieldName] = withDefault(geometryColumn(columnName), field) + if (!adapter.extensions.postgis) { + adapter.extensions.postgis = true + } break } diff --git a/packages/drizzle/src/postgres/schema/withDefault.ts b/packages/drizzle/src/postgres/schema/withDefault.ts index 355d3cbc8b..f5d0cd90ae 100644 --- a/packages/drizzle/src/postgres/schema/withDefault.ts +++ b/packages/drizzle/src/postgres/schema/withDefault.ts @@ -14,5 +14,9 @@ export const withDefault = ( return column.default(escapedString) } + if (field.type === 'point' && Array.isArray(field.defaultValue)) { + return column.default(`SRID=4326;POINT(${field.defaultValue[0]} ${field.defaultValue[1]})`) + } + return column.default(field.defaultValue) } diff --git a/packages/drizzle/src/postgres/types.ts b/packages/drizzle/src/postgres/types.ts index bd22caa7ed..749bd68a12 100644 --- a/packages/drizzle/src/postgres/types.ts +++ b/packages/drizzle/src/postgres/types.ts @@ -131,6 +131,7 @@ export type BasePostgresAdapter = { beforeSchemaInit: PostgresSchemaHook[] countDistinct: CountDistinct createDatabase: CreateDatabase + createExtensions: () => Promise defaultDrizzleSnapshot: DrizzleSnapshotJSON deleteWhere: DeleteWhere disableCreateDatabase: boolean @@ -138,6 +139,7 @@ export type BasePostgresAdapter = { dropDatabase: DropDatabase enums: Record execute: Execute + extensions: Record /** * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name * Used for returning properly formed errors from unique fields @@ -171,6 +173,7 @@ export type BasePostgresAdapter = { } tableNameMap: Map tables: Record + tablesFilter?: string[] versionsSuffix?: string } & PostgresDrizzleAdapter diff --git a/packages/drizzle/src/queries/operatorMap.ts b/packages/drizzle/src/queries/operatorMap.ts index e583f644d0..0fe4a804f3 100644 --- a/packages/drizzle/src/queries/operatorMap.ts +++ b/packages/drizzle/src/queries/operatorMap.ts @@ -48,10 +48,6 @@ export const operatorMap: Operators = { less_than_equal: lte, like: ilike, not_equals: ne, - // TODO: geojson queries - // intersects: intersects, - // near: near, - // within: within, // all: all, not_in: notInArray, or, diff --git a/packages/drizzle/src/queries/parseParams.ts b/packages/drizzle/src/queries/parseParams.ts index e6e417abf4..63a9e0514f 100644 --- a/packages/drizzle/src/queries/parseParams.ts +++ b/packages/drizzle/src/queries/parseParams.ts @@ -285,6 +285,39 @@ export function parseParams({ break } + if (field.type === 'point' && adapter.name === 'postgres') { + switch (operator) { + case 'near': { + const [lng, lat, maxDistance, minDistance] = queryValue as number[] + + let constraint = sql`ST_DWithin(ST_Transform(${table[columnName]}, 3857), ST_Transform(ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326), 3857), ${maxDistance})` + if (typeof minDistance === 'number' && !Number.isNaN(minDistance)) { + constraint = sql`${constraint} AND ST_Distance(ST_Transform(${table[columnName]}, 3857), ST_Transform(ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326), 3857)) >= ${minDistance}` + } + constraints.push(constraint) + break + } + + case 'within': { + constraints.push( + sql`ST_Within(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`, + ) + break + } + + case 'intersects': { + constraints.push( + sql`ST_Intersects(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`, + ) + break + } + + default: + break + } + break + } + constraints.push( adapter.operators[queryOperator](rawColumn || table[columnName], queryValue), ) diff --git a/packages/drizzle/src/queries/sanitizeQueryValue.ts b/packages/drizzle/src/queries/sanitizeQueryValue.ts index 38a1f891bc..45f95914ed 100644 --- a/packages/drizzle/src/queries/sanitizeQueryValue.ts +++ b/packages/drizzle/src/queries/sanitizeQueryValue.ts @@ -212,10 +212,10 @@ export const sanitizeQueryValue = ({ operator = 'equals' } - if (operator === 'near' || operator === 'within' || operator === 'intersects') { - throw new APIError( - `Querying with '${operator}' is not supported with the postgres database adapter.`, - ) + if (operator === 'near' && field.type === 'point' && typeof formattedValue === 'string') { + const [lng, lat, maxDistance, minDistance] = formattedValue.split(',') + + formattedValue = [Number(lng), Number(lat), Number(maxDistance), Number(minDistance)] } if (operator === 'contains') { diff --git a/packages/drizzle/src/transform/write/traverseFields.ts b/packages/drizzle/src/transform/write/traverseFields.ts index f0addcf5d2..7b4f9529fc 100644 --- a/packages/drizzle/src/transform/write/traverseFields.ts +++ b/packages/drizzle/src/transform/write/traverseFields.ts @@ -1,5 +1,6 @@ import type { Field } from 'payload' +import { sql } from 'drizzle-orm' import { fieldAffectsData, fieldIsVirtual } from 'payload/shared' import toSnakeCase from 'to-snake-case' @@ -591,6 +592,9 @@ export const traverseFields = ({ valuesToTransform.forEach(({ localeKey, ref, value }) => { if (typeof value !== 'undefined') { let formattedValue = value + if (value && field.type === 'point' && adapter.name !== 'sqlite') { + formattedValue = sql`ST_GeomFromGeoJSON(${JSON.stringify(value)})` + } if (field.type === 'date') { if (typeof value === 'number' && !Number.isNaN(value)) { diff --git a/packages/drizzle/src/types.ts b/packages/drizzle/src/types.ts index c614e8d454..cb0c2cc6d9 100644 --- a/packages/drizzle/src/types.ts +++ b/packages/drizzle/src/types.ts @@ -121,6 +121,8 @@ export type RequireDrizzleKit = () => { schema: Record, drizzle: DrizzleAdapter['drizzle'], filterSchema?: string[], + tablesFilter?: string[], + extensionsFilter?: string[], ) => Promise<{ apply; hasDataLoss; warnings }> } @@ -164,6 +166,7 @@ export interface DrizzleAdapter extends BaseDatabaseAdapter { dropDatabase: DropDatabase enums?: never | Record execute: Execute + features: { json?: boolean } @@ -187,6 +190,7 @@ export interface DrizzleAdapter extends BaseDatabaseAdapter { requireDrizzleKit: RequireDrizzleKit resolveInitializing: () => void schema: Record + schemaName?: string sessions: { [id: string]: { diff --git a/packages/drizzle/src/utilities/pushDevSchema.ts b/packages/drizzle/src/utilities/pushDevSchema.ts index 3a23bcb088..71fbe315e9 100644 --- a/packages/drizzle/src/utilities/pushDevSchema.ts +++ b/packages/drizzle/src/utilities/pushDevSchema.ts @@ -1,5 +1,6 @@ import prompts from 'prompts' +import type { BasePostgresAdapter } from '../postgres/types.js' import type { DrizzleAdapter } from '../types.js' /** @@ -11,11 +12,17 @@ import type { DrizzleAdapter } from '../types.js' export const pushDevSchema = async (adapter: DrizzleAdapter) => { const { pushSchema } = adapter.requireDrizzleKit() + const { extensions = {}, tablesFilter } = adapter as BasePostgresAdapter + // This will prompt if clarifications are needed for Drizzle to push new schema const { apply, hasDataLoss, warnings } = await pushSchema( adapter.schema, adapter.drizzle, adapter.schemaName ? [adapter.schemaName] : undefined, + tablesFilter, + // Drizzle extensionsFilter supports only postgis for now + // https://github.com/drizzle-team/drizzle-orm/blob/83daf2d5cf023112de878bc2249ee2c41a2a5b1b/drizzle-kit/src/cli/validations/cli.ts#L26 + extensions.postgis ? ['postgis'] : undefined, ) if (warnings.length) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b64705b95..eafb6a9daf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ overrides: copyfiles: 2.4.1 cross-env: 7.0.3 dotenv: 16.4.5 - drizzle-orm: 0.35.1 + drizzle-orm: 0.36.1 graphql: ^16.8.1 mongodb-memory-server: ^9.0 react: 19.0.0-rc-65a56d0e-20241020 @@ -109,11 +109,11 @@ importers: specifier: 16.4.5 version: 16.4.5 drizzle-kit: - specifier: 0.26.2 - version: 0.26.2 + specifier: 0.28.0 + version: 0.28.0 drizzle-orm: - specifier: 0.35.1 - version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) + specifier: 0.36.1 + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) escape-html: specifier: ^1.0.3 version: 1.0.3 @@ -315,11 +315,11 @@ importers: specifier: 2.12.1 version: 2.12.1 drizzle-kit: - specifier: 0.26.2 - version: 0.26.2 + specifier: 0.28.0 + version: 0.28.0 drizzle-orm: - specifier: 0.35.1 - version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) + specifier: 0.36.1 + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) pg: specifier: 8.11.3 version: 8.11.3 @@ -361,11 +361,11 @@ importers: specifier: 2.12.1 version: 2.12.1 drizzle-kit: - specifier: 0.26.2 - version: 0.26.2 + specifier: 0.28.0 + version: 0.28.0 drizzle-orm: - specifier: 0.35.1 - version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) + specifier: 0.36.1 + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) prompts: specifier: 2.4.2 version: 2.4.2 @@ -401,11 +401,11 @@ importers: specifier: 2.12.1 version: 2.12.1 drizzle-kit: - specifier: 0.26.2 - version: 0.26.2 + specifier: 0.28.0 + version: 0.28.0 drizzle-orm: - specifier: 0.35.1 - version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) + specifier: 0.36.1 + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) pg: specifier: 8.11.3 version: 8.11.3 @@ -444,8 +444,8 @@ importers: specifier: 2.12.1 version: 2.12.1 drizzle-orm: - specifier: 0.35.1 - version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) + specifier: 0.36.1 + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1) prompts: specifier: 2.4.2 version: 2.4.2 @@ -1727,8 +1727,8 @@ importers: specifier: 16.4.5 version: 16.4.5 drizzle-kit: - specifier: 0.26.2 - version: 0.26.2 + specifier: 0.28.0 + version: 0.28.0 eslint-plugin-playwright: specifier: 1.7.0 version: 1.7.0(eslint-plugin-jest@28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6)) @@ -2724,8 +2724,8 @@ packages: peerDependencies: react: 19.0.0-rc-65a56d0e-20241020 - '@drizzle-team/brocli@0.10.1': - resolution: {integrity: sha512-AHy0vjc+n/4w/8Mif+w86qpppHuF3AyXbcWW+R/W7GNA3F5/p2nuhlkCJaTXSLZheB4l1rtHzOfr9A7NwoR/Zg==} + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} '@effect/schema@0.68.12': resolution: {integrity: sha512-UWJsFXzeYTBQYnftwI1KR2uaxIZ8fk+kffDS7BnJwnGjPPgODq3/AzeoBDSu1MAlnwBKOz+QRdMuSMxrT/pHig==} @@ -5861,17 +5861,18 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - drizzle-kit@0.26.2: - resolution: {integrity: sha512-cMq8omEKywjIy5KcqUo6LvEFxkl8/zYHsgYjFVXjmPWWtuW4blcz+YW9+oIhoaALgs2ebRjzXwsJgN9i6P49Dw==} + drizzle-kit@0.28.0: + resolution: {integrity: sha512-KqI+CS2Ga9GYIrXpxpCDUJJrH/AT/k4UY0Pb4oRgQEGkgN1EdCnqp664cXgwPWjDr5RBtTsjZipw8+8C//K63A==} hasBin: true - drizzle-orm@0.35.1: - resolution: {integrity: sha512-HQxDdYuXlZFuvDPztlUIzrX8TqWa/Ej6uN6L0hkbuGL4slexOUMc3u4nXVU15RQ5QYbk+uLQnR6v1+OIrdCTXQ==} + drizzle-orm@0.36.1: + resolution: {integrity: sha512-F4hbimnMEhyWzDowQB4xEuVJJWXLHZYD7FYwvo8RImY+N7pStGqsbfmT95jDbec1s4qKmQbiuxEDZY90LRrfIw==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' - '@electric-sql/pglite': '>=0.1.1' + '@electric-sql/pglite': '>=0.2.0' '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' '@neondatabase/serverless': '>=0.1' '@op-engineering/op-sqlite': '>=2' '@opentelemetry/api': ^1.4.1 @@ -5905,6 +5906,8 @@ packages: optional: true '@libsql/client': optional: true + '@libsql/client-wasm': + optional: true '@neondatabase/serverless': optional: true '@op-engineering/op-sqlite': @@ -11660,7 +11663,7 @@ snapshots: react: 19.0.0-rc-cd22717c-20241013 tslib: 2.6.3 - '@drizzle-team/brocli@0.10.1': {} + '@drizzle-team/brocli@0.10.2': {} '@effect/schema@0.68.12(effect@3.4.5)': dependencies: @@ -15403,16 +15406,16 @@ snapshots: dotenv@16.4.5: {} - drizzle-kit@0.26.2: + drizzle-kit@0.28.0: dependencies: - '@drizzle-team/brocli': 0.10.1 + '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 esbuild: 0.19.12 esbuild-register: 3.6.0(esbuild@0.19.12) transitivePeerDependencies: - supports-color - drizzle-orm@0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1): + drizzle-orm@0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1): optionalDependencies: '@libsql/client': 0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@neondatabase/serverless': 0.9.4 @@ -15423,7 +15426,7 @@ snapshots: pg: 8.11.3 react: 19.0.0-rc-65a56d0e-20241020 - drizzle-orm@0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1): + drizzle-orm@0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1): optionalDependencies: '@libsql/client': 0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@neondatabase/serverless': 0.9.4 diff --git a/test/_community/payload-types.ts b/test/_community/payload-types.ts index bea169827e..b70c8f2600 100644 --- a/test/_community/payload-types.ts +++ b/test/_community/payload-types.ts @@ -19,6 +19,16 @@ export interface Config { 'payload-preferences': PayloadPreference; 'payload-migrations': PayloadMigration; }; + collectionsJoins: {}; + collectionsSelect: { + posts: PostsSelect | PostsSelect; + simple: SimpleSelect | SimpleSelect; + media: MediaSelect | MediaSelect; + users: UsersSelect | UsersSelect; + 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; + 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; + 'payload-migrations': PayloadMigrationsSelect | PayloadMigrationsSelect; + }; db: { defaultIDType: string; }; @@ -26,6 +36,10 @@ export interface Config { menu: Menu; 'custom-ts': CustomT; }; + globalsSelect: { + menu: MenuSelect | MenuSelect; + 'custom-ts': CustomTsSelect | CustomTsSelect; + }; locale: null; user: User & { collection: 'users'; @@ -232,6 +246,143 @@ export interface PayloadMigration { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "posts_select". + */ +export interface PostsSelect { + text?: T; + serverTextField?: T; + richText?: T; + myBlocks?: + | T + | { + test?: + | T + | { + test?: T; + id?: T; + blockName?: T; + }; + someBlock2?: + | T + | { + test2?: T; + id?: T; + blockName?: T; + }; + }; + updatedAt?: T; + createdAt?: T; + _status?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "simple_select". + */ +export interface SimpleSelect { + text?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "media_select". + */ +export interface MediaSelect { + updatedAt?: T; + createdAt?: T; + url?: T; + thumbnailURL?: T; + filename?: T; + mimeType?: T; + filesize?: T; + width?: T; + height?: T; + focalX?: T; + focalY?: T; + sizes?: + | T + | { + thumbnail?: + | T + | { + url?: T; + width?: T; + height?: T; + mimeType?: T; + filesize?: T; + filename?: T; + }; + medium?: + | T + | { + url?: T; + width?: T; + height?: T; + mimeType?: T; + filesize?: T; + filename?: T; + }; + large?: + | T + | { + url?: T; + width?: T; + height?: T; + mimeType?: T; + filesize?: T; + filename?: T; + }; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users_select". + */ +export interface UsersSelect { + updatedAt?: T; + createdAt?: T; + email?: T; + resetPasswordToken?: T; + resetPasswordExpiration?: T; + salt?: T; + hash?: T; + loginAttempts?: T; + lockUntil?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-locked-documents_select". + */ +export interface PayloadLockedDocumentsSelect { + document?: T; + globalSlug?: T; + user?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences_select". + */ +export interface PayloadPreferencesSelect { + user?: T; + key?: T; + value?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations_select". + */ +export interface PayloadMigrationsSelect { + name?: T; + batch?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "menu". @@ -265,6 +416,28 @@ export interface CustomT { export interface ObjectWithNumber { id?: number; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "menu_select". + */ +export interface MenuSelect { + globalText?: T; + updatedAt?: T; + createdAt?: T; + globalType?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "custom-ts_select". + */ +export interface CustomTsSelect { + custom?: T; + withDefinitionsUsage?: T; + json?: T; + updatedAt?: T; + createdAt?: T; + globalType?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "auth". diff --git a/test/collections-graphql/int.spec.ts b/test/collections-graphql/int.spec.ts index 7d7da9052a..1ac0f32f70 100644 --- a/test/collections-graphql/int.spec.ts +++ b/test/collections-graphql/int.spec.ts @@ -29,7 +29,7 @@ describe('collections-graphql', () => { if (payload.db.name === 'mongoose') { await new Promise((resolve, reject) => { payload.db?.collections?.point?.ensureIndexes(function (err) { - if (err) reject(err) + if (err) {reject(err)} resolve(true) }) }) @@ -578,13 +578,13 @@ describe('collections-graphql', () => { expect(docs).toContainEqual(expect.objectContaining({ id: specialPost.id })) }) - if (['mongodb'].includes(process.env.PAYLOAD_DATABASE)) { - describe('near', () => { - const point = [10, 20] - const [lat, lng] = point + describe('near', () => { + const point = [10, 20] + const [lat, lng] = point - it('should return a document near a point', async () => { - const nearQuery = ` + it('should return a document near a point', async () => { + if (payload.db.name === 'sqlite') {return} + const nearQuery = ` query { Points( where: { @@ -600,16 +600,17 @@ describe('collections-graphql', () => { } }` - const { data } = await restClient - .GRAPHQL_POST({ body: JSON.stringify({ query: nearQuery }) }) - .then((res) => res.json()) - const { docs } = data.Points + const { data } = await restClient + .GRAPHQL_POST({ body: JSON.stringify({ query: nearQuery }) }) + .then((res) => res.json()) + const { docs } = data.Points - expect(docs).toHaveLength(1) - }) + expect(docs).toHaveLength(1) + }) - it('should not return a point far away', async () => { - const nearQuery = ` + it('should not return a point far away', async () => { + if (payload.db.name === 'sqlite') {return} + const nearQuery = ` query { Points( where: { @@ -625,29 +626,30 @@ describe('collections-graphql', () => { } }` - const { data } = await restClient - .GRAPHQL_POST({ body: JSON.stringify({ query: nearQuery }) }) - .then((res) => res.json()) - const { docs } = data.Points + const { data } = await restClient + .GRAPHQL_POST({ body: JSON.stringify({ query: nearQuery }) }) + .then((res) => res.json()) + const { docs } = data.Points - expect(docs).toHaveLength(0) + expect(docs).toHaveLength(0) + }) + + it('should sort find results by nearest distance', async () => { + if (payload.db.name === 'sqlite') {return} + // creating twice as many records as we are querying to get a random sample + await mapAsync([...Array(10)], async () => { + // randomize the creation timestamp + await wait(Math.random()) + await payload.create({ + collection: pointSlug, + data: { + // only randomize longitude to make distance comparison easy + point: [Math.random(), 0], + }, + }) }) - it('should sort find results by nearest distance', async () => { - // creating twice as many records as we are querying to get a random sample - await mapAsync([...Array(10)], async () => { - // randomize the creation timestamp - await wait(Math.random()) - await payload.create({ - collection: pointSlug, - data: { - // only randomize longitude to make distance comparison easy - point: [Math.random(), 0], - }, - }) - }) - - const nearQuery = ` + const nearQuery = ` query { Points( where: { @@ -655,6 +657,7 @@ describe('collections-graphql', () => { near: [0, 0, 100000, 0] } }, + sort: "point", limit: 5 ) { docs { @@ -664,32 +667,33 @@ describe('collections-graphql', () => { } }` - const { data } = await restClient - .GRAPHQL_POST({ body: JSON.stringify({ query: nearQuery }) }) - .then((res) => res.json()) - const { docs } = data.Points + const { data } = await restClient + .GRAPHQL_POST({ body: JSON.stringify({ query: nearQuery }) }) + .then((res) => res.json()) + const { docs } = data.Points - let previous = 0 - docs.forEach(({ point: coordinates }) => { - // The next document point should always be greater than the one before - expect(previous).toBeLessThanOrEqual(coordinates[0]) - ;[previous] = coordinates - }) + let previous = 0 + docs.forEach(({ point: coordinates }) => { + // The next document point should always be greater than the one before + expect(previous).toBeLessThanOrEqual(coordinates[0]) + ;[previous] = coordinates }) }) + }) - describe('within', () => { - type Point = [number, number] - const polygon: Point[] = [ - [9.0, 19.0], // bottom-left - [9.0, 21.0], // top-left - [11.0, 21.0], // top-right - [11.0, 19.0], // bottom-right - [9.0, 19.0], // back to starting point to close the polygon - ] + describe('within', () => { + type Point = [number, number] + const polygon: Point[] = [ + [9.0, 19.0], // bottom-left + [9.0, 21.0], // top-left + [11.0, 21.0], // top-right + [11.0, 19.0], // bottom-right + [9.0, 19.0], // back to starting point to close the polygon + ] - it('should return a document with the point inside the polygon', async () => { - const query = ` + it('should return a document with the point inside the polygon', async () => { + if (payload.db.name === 'sqlite') {return} + const query = ` query { Points( where: { @@ -707,18 +711,19 @@ describe('collections-graphql', () => { } }` - const { data } = await restClient - .GRAPHQL_POST({ body: JSON.stringify({ query }) }) - .then((res) => res.json()) - const { docs } = data.Points + const { data } = await restClient + .GRAPHQL_POST({ body: JSON.stringify({ query }) }) + .then((res) => res.json()) + const { docs } = data.Points - expect(docs).toHaveLength(1) - expect(docs[0].point).toEqual([10, 20]) - }) + expect(docs).toHaveLength(1) + expect(docs[0].point).toEqual([10, 20]) + }) - it('should not return a document with the point outside the polygon', async () => { - const reducedPolygon = polygon.map((vertex) => vertex.map((coord) => coord * 0.1)) - const query = ` + it('should not return a document with the point outside the polygon', async () => { + if (payload.db.name === 'sqlite') {return} + const reducedPolygon = polygon.map((vertex) => vertex.map((coord) => coord * 0.1)) + const query = ` query { Points( where: { @@ -736,27 +741,28 @@ describe('collections-graphql', () => { } }` - const { data } = await restClient - .GRAPHQL_POST({ body: JSON.stringify({ query }) }) - .then((res) => res.json()) - const { docs } = data.Points + const { data } = await restClient + .GRAPHQL_POST({ body: JSON.stringify({ query }) }) + .then((res) => res.json()) + const { docs } = data.Points - expect(docs).toHaveLength(0) - }) + expect(docs).toHaveLength(0) }) + }) - describe('intersects', () => { - type Point = [number, number] - const polygon: Point[] = [ - [9.0, 19.0], // bottom-left - [9.0, 21.0], // top-left - [11.0, 21.0], // top-right - [11.0, 19.0], // bottom-right - [9.0, 19.0], // back to starting point to close the polygon - ] + describe('intersects', () => { + type Point = [number, number] + const polygon: Point[] = [ + [9.0, 19.0], // bottom-left + [9.0, 21.0], // top-left + [11.0, 21.0], // top-right + [11.0, 19.0], // bottom-right + [9.0, 19.0], // back to starting point to close the polygon + ] - it('should return a document with the point intersecting the polygon', async () => { - const query = ` + it('should return a document with the point intersecting the polygon', async () => { + if (payload.db.name === 'sqlite') {return} + const query = ` query { Points( where: { @@ -774,18 +780,19 @@ describe('collections-graphql', () => { } }` - const { data } = await restClient - .GRAPHQL_POST({ body: JSON.stringify({ query }) }) - .then((res) => res.json()) - const { docs } = data.Points + const { data } = await restClient + .GRAPHQL_POST({ body: JSON.stringify({ query }) }) + .then((res) => res.json()) + const { docs } = data.Points - expect(docs).toHaveLength(1) - expect(docs[0].point).toEqual([10, 20]) - }) + expect(docs).toHaveLength(1) + expect(docs[0].point).toEqual([10, 20]) + }) - it('should not return a document with the point not intersecting a smaller polygon', async () => { - const reducedPolygon = polygon.map((vertex) => vertex.map((coord) => coord * 0.1)) - const query = ` + it('should not return a document with the point not intersecting a smaller polygon', async () => { + if (payload.db.name === 'sqlite') {return} + const reducedPolygon = polygon.map((vertex) => vertex.map((coord) => coord * 0.1)) + const query = ` query { Points( where: { @@ -803,15 +810,14 @@ describe('collections-graphql', () => { } }` - const { data } = await restClient - .GRAPHQL_POST({ body: JSON.stringify({ query }) }) - .then((res) => res.json()) - const { docs } = data.Points + const { data } = await restClient + .GRAPHQL_POST({ body: JSON.stringify({ query }) }) + .then((res) => res.json()) + const { docs } = data.Points - expect(docs).toHaveLength(0) - }) + expect(docs).toHaveLength(0) }) - } + }) it('can query deeply nested fields within rows, tabs, collapsibles', async () => { const withNestedField = await createPost({ D1: { D2: { D3: { D4: 'nested message' } } } }) diff --git a/test/collections-rest/int.spec.ts b/test/collections-rest/int.spec.ts index b5392ee087..69b1b5420c 100644 --- a/test/collections-rest/int.spec.ts +++ b/test/collections-rest/int.spec.ts @@ -1103,185 +1103,194 @@ describe('collections-rest', () => { }) }) - if (['mongodb'].includes(process.env.PAYLOAD_DATABASE)) { - describe('near', () => { - const point = [10, 20] - const [lat, lng] = point - it('should return a document near a point', async () => { - const near = `${lat + 0.01}, ${lng + 0.01}, 10000` - const response = await restClient.GET(`/${pointSlug}`, { - query: { - where: { - point: { - near, - }, + describe('near', () => { + const point = [10, 20] + const [lat, lng] = point + it('should return a document near a point', async () => { + if (payload.db.name === 'sqlite') {return} + + const near = `${lat + 0.01}, ${lng + 0.01}, 10000` + const response = await restClient.GET(`/${pointSlug}`, { + query: { + where: { + point: { + near, }, }, - }) - const result = await response.json() - - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(1) + }, }) + const result = await response.json() - it('should not return a point far away', async () => { - const near = `${lng + 1}, ${lat - 1}, 5000` - const response = await restClient.GET(`/${pointSlug}`, { - query: { - where: { - point: { - near, - }, - }, - }, - }) - const result = await response.json() - - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(0) - }) - - it('should sort find results by nearest distance', async () => { - // creating twice as many records as we are querying to get a random sample - const promises = [] - for (let i = 0; i < 11; i++) { - // setTimeout used to randomize the creation timestamp - setTimeout(() => { - promises.push( - payload.create({ - collection: pointSlug, - data: { - // only randomize longitude to make distance comparison easy - point: [Math.random(), 0], - }, - }), - ) - }, Math.random()) - } - await Promise.all(promises) - - const { docs } = await restClient - .GET(`/${pointSlug}`, { - query: { - limit: 5, - where: { - point: { - // querying large enough range to include all docs - near: '0, 0, 100000, 0', - }, - }, - }, - }) - .then((res) => res.json()) - - let previous = 0 - docs.forEach(({ point: coordinates }) => { - // the next document point should always be greater than the one before - expect(previous).toBeLessThanOrEqual(coordinates[0]) - ;[previous] = coordinates - }) - }) + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(1) }) - describe('within', () => { - type Point = [number, number] - const polygon: Point[] = [ - [9.0, 19.0], // bottom-left - [9.0, 21.0], // top-left - [11.0, 21.0], // top-right - [11.0, 19.0], // bottom-right - [9.0, 19.0], // back to starting point to close the polygon - ] - it('should return a document with the point inside the polygon', async () => { - // There should be 1 total points document populated by default with the point [10, 20] - const response = await restClient.GET(`/${pointSlug}`, { - query: { - where: { - point: { - within: { - type: 'Polygon', - coordinates: [polygon], - }, - }, + it('should not return a point far away', async () => { + if (payload.db.name === 'sqlite') {return} + + const near = `${lng + 1}, ${lat + 1}, 5000` + const response = await restClient.GET(`/${pointSlug}`, { + query: { + where: { + point: { + near, }, }, - }) - const result = await response.json() - - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(1) + }, }) + const result = await response.json() - it('should not return a document with the point outside a smaller polygon', async () => { - const response = await restClient.GET(`/${pointSlug}`, { - query: { - where: { - point: { - within: { - type: 'Polygon', - coordinates: [polygon.map((vertex) => vertex.map((coord) => coord * 0.1))], // Reduce polygon to 10% of its size - }, - }, - }, - }, - }) - const result = await response.json() - - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(0) - }) + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(0) }) - describe('intersects', () => { - type Point = [number, number] - const polygon: Point[] = [ - [9.0, 19.0], // bottom-left - [9.0, 21.0], // top-left - [11.0, 21.0], // top-right - [11.0, 19.0], // bottom-right - [9.0, 19.0], // back to starting point to close the polygon - ] + it('should sort find results by nearest distance', async () => { + if (payload.db.name === 'sqlite') {return} - it('should return a document with the point intersecting the polygon', async () => { - // There should be 1 total points document populated by default with the point [10, 20] - const response = await restClient.GET(`/${pointSlug}`, { + // creating twice as many records as we are querying to get a random sample + const promises = [] + for (let i = 0; i < 11; i++) { + // setTimeout used to randomize the creation timestamp + setTimeout(() => { + promises.push( + payload.create({ + collection: pointSlug, + data: { + // only randomize longitude to make distance comparison easy + point: [Math.random(), 0], + }, + }), + ) + }, Math.random()) + } + await Promise.all(promises) + + const { docs } = await restClient + .GET(`/${pointSlug}`, { query: { + limit: 5, + sort: 'point', where: { point: { - intersects: { - type: 'Polygon', - coordinates: [polygon], - }, + // querying large enough range to include all docs + near: '0, 0, 100000, 0', }, }, }, }) - const result = await response.json() + .then((res) => res.json()) - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(1) - }) - - it('should not return a document with the point not intersecting a smaller polygon', async () => { - const response = await restClient.GET(`/${pointSlug}`, { - query: { - where: { - point: { - intersects: { - type: 'Polygon', - coordinates: [polygon.map((vertex) => vertex.map((coord) => coord * 0.1))], // Reduce polygon to 10% of its size - }, - }, - }, - }, - }) - const result = await response.json() - - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(0) + let previous = 0 + docs.forEach(({ point: coordinates }) => { + // the next document point should always be greater than the one before + expect(previous).toBeLessThanOrEqual(coordinates[0]) + ;[previous] = coordinates }) }) - } + }) + + describe('within', () => { + type Point = [number, number] + const polygon: Point[] = [ + [9.0, 19.0], // bottom-left + [9.0, 21.0], // top-left + [11.0, 21.0], // top-right + [11.0, 19.0], // bottom-right + [9.0, 19.0], // back to starting point to close the polygon + ] + it('should return a document with the point inside the polygon', async () => { + if (payload.db.name === 'sqlite') {return} + // There should be 1 total points document populated by default with the point [10, 20] + const response = await restClient.GET(`/${pointSlug}`, { + query: { + where: { + point: { + within: { + type: 'Polygon', + coordinates: [polygon], + }, + }, + }, + }, + }) + const result = await response.json() + + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(1) + }) + + it('should not return a document with the point outside a smaller polygon', async () => { + if (payload.db.name === 'sqlite') {return} + const response = await restClient.GET(`/${pointSlug}`, { + query: { + where: { + point: { + within: { + type: 'Polygon', + coordinates: [polygon.map((vertex) => vertex.map((coord) => coord * 0.1))], // Reduce polygon to 10% of its size + }, + }, + }, + }, + }) + const result = await response.json() + + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(0) + }) + }) + + describe('intersects', () => { + type Point = [number, number] + const polygon: Point[] = [ + [9.0, 19.0], // bottom-left + [9.0, 21.0], // top-left + [11.0, 21.0], // top-right + [11.0, 19.0], // bottom-right + [9.0, 19.0], // back to starting point to close the polygon + ] + + it('should return a document with the point intersecting the polygon', async () => { + if (payload.db.name === 'sqlite') {return} + // There should be 1 total points document populated by default with the point [10, 20] + const response = await restClient.GET(`/${pointSlug}`, { + query: { + where: { + point: { + intersects: { + type: 'Polygon', + coordinates: [polygon], + }, + }, + }, + }, + }) + const result = await response.json() + + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(1) + }) + + it('should not return a document with the point not intersecting a smaller polygon', async () => { + if (payload.db.name === 'sqlite') {return} + const response = await restClient.GET(`/${pointSlug}`, { + query: { + where: { + point: { + intersects: { + type: 'Polygon', + coordinates: [polygon.map((vertex) => vertex.map((coord) => coord * 0.1))], // Reduce polygon to 10% of its size + }, + }, + }, + }, + }) + const result = await response.json() + + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(0) + }) + }) it('or', async () => { const post1 = await createPost({ title: 'post1' }) diff --git a/test/database/config.ts b/test/database/config.ts index 641dd7b352..4c7dba5d3b 100644 --- a/test/database/config.ts +++ b/test/database/config.ts @@ -103,6 +103,11 @@ export default buildConfigWithDefaults({ { value: 'default', label: 'Default' }, ], }, + { + name: 'point', + type: 'point', + defaultValue: [10, 20], + }, ], }, { diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index ed39466349..645cc61363 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -598,6 +598,10 @@ describe('database', () => { expect(result.array[0].defaultValue).toStrictEqual('default value from database') expect(result.group.defaultValue).toStrictEqual('default value from database') expect(result.select).toStrictEqual('default') + // eslint-disable-next-line jest/no-conditional-in-test + if (payload.db.name !== 'sqlite') { + expect(result.point).toStrictEqual({ coordinates: [10, 20], type: 'Point' }) + } }) }) describe('drizzle: schema hooks', () => { diff --git a/test/database/payload-types.ts b/test/database/payload-types.ts index 21259d61cc..43224e6097 100644 --- a/test/database/payload-types.ts +++ b/test/database/payload-types.ts @@ -25,6 +25,7 @@ export interface Config { 'payload-preferences': PayloadPreference; 'payload-migrations': PayloadMigration; }; + collectionsJoins: {}; collectionsSelect: { posts: PostsSelect | PostsSelect; 'default-values': DefaultValuesSelect | DefaultValuesSelect; @@ -106,6 +107,11 @@ export interface DefaultValue { defaultValue?: string | null; }; select?: ('option0' | 'option1' | 'default') | null; + /** + * @minItems 2 + * @maxItems 2 + */ + point?: [number, number] | null; updatedAt: string; createdAt: string; } @@ -263,6 +269,7 @@ export interface CustomId { id: string; updatedAt: string; createdAt: string; + _status?: ('draft' | 'published') | null; } /** * This interface was referenced by `Config`'s JSON-Schema @@ -400,6 +407,7 @@ export interface DefaultValuesSelect { defaultValue?: T; }; select?: T; + point?: T; updatedAt?: T; createdAt?: T; } @@ -531,6 +539,7 @@ export interface CustomIdsSelect { id?: T; updatedAt?: T; createdAt?: T; + _status?: T; } /** * This interface was referenced by `Config`'s JSON-Schema diff --git a/test/fields/int.spec.ts b/test/fields/int.spec.ts index 843eb291f4..ed7c0a7c26 100644 --- a/test/fields/int.spec.ts +++ b/test/fields/int.spec.ts @@ -982,88 +982,91 @@ describe('Fields', () => { expect(definitions['version.text']).toEqual(1) }) }) - - describe('point', () => { - let doc - const point = [7, -7] - const localized = [5, -2] - const group = { point: [1, 9] } - - beforeEach(async () => { - const findDoc = await payload.find({ - collection: 'point-fields', - pagination: false, - }) - ;[doc] = findDoc.docs - }) - - it('should read', async () => { - const find = await payload.find({ - collection: 'point-fields', - pagination: false, - }) - - ;[doc] = find.docs - - expect(doc.point).toEqual(pointDoc.point) - expect(doc.localized).toEqual(pointDoc.localized) - expect(doc.group).toMatchObject(pointDoc.group) - }) - - it('should create', async () => { - doc = await payload.create({ - collection: 'point-fields', - data: { - group, - localized, - point, - }, - }) - - expect(doc.point).toEqual(point) - expect(doc.localized).toEqual(localized) - expect(doc.group).toMatchObject(group) - }) - - it('should not create duplicate point when unique', async () => { - // first create the point field - doc = await payload.create({ - collection: 'point-fields', - data: { - group, - localized, - point, - }, - }) - - // Now make sure we can't create a duplicate (since 'localized' is a unique field) - await expect(() => - payload.create({ - collection: 'point-fields', - data: { - group, - localized, - point, - }, - }), - ).rejects.toThrow(Error) - - await expect(async () => - payload.create({ - collection: 'number-fields', - data: { - min: 5, - }, - }), - ).rejects.toThrow('The following field is invalid: min') - - expect(doc.point).toEqual(point) - expect(doc.localized).toEqual(localized) - expect(doc.group).toMatchObject(group) - }) - }) } + describe('point', () => { + let doc + const point = [7, -7] + const localized = [5, -2] + const group = { point: [1, 9] } + + beforeEach(async () => { + const findDoc = await payload.find({ + collection: 'point-fields', + pagination: false, + }) + ;[doc] = findDoc.docs + }) + + it('should read', async () => { + if (payload.db.name === 'sqlite') {return} + const find = await payload.find({ + collection: 'point-fields', + pagination: false, + }) + + ;[doc] = find.docs + + expect(doc.point).toEqual(pointDoc.point) + expect(doc.localized).toEqual(pointDoc.localized) + expect(doc.group).toMatchObject(pointDoc.group) + }) + + it('should create', async () => { + if (payload.db.name === 'sqlite') {return} + doc = await payload.create({ + collection: 'point-fields', + data: { + group, + localized, + point, + }, + }) + + expect(doc.point).toEqual(point) + expect(doc.localized).toEqual(localized) + expect(doc.group).toMatchObject(group) + }) + + it('should not create duplicate point when unique', async () => { + if (payload.db.name === 'sqlite') {return} + // first create the point field + doc = await payload.create({ + collection: 'point-fields', + data: { + group, + localized, + point, + }, + }) + + // Now make sure we can't create a duplicate (since 'localized' is a unique field) + await expect(() => + payload.create({ + collection: 'point-fields', + data: { + group, + localized, + point, + }, + }), + ).rejects.toThrow(Error) + + await expect(async () => + payload.create({ + collection: 'number-fields', + data: { + min: 5, + }, + }), + ).rejects.toThrow('The following field is invalid: min') + + expect(doc.point).toEqual(point) + expect(doc.localized).toEqual(localized) + expect(doc.group).toMatchObject(group) + }) + }) + describe('unique indexes', () => { it('should throw validation error saving on unique fields', async () => { const data = { diff --git a/test/package.json b/test/package.json index a9d9499928..809a6d479b 100644 --- a/test/package.json +++ b/test/package.json @@ -64,7 +64,7 @@ "comment-json": "^4.2.3", "create-payload-app": "workspace:*", "dotenv": "16.4.5", - "drizzle-kit": "0.26.2", + "drizzle-kit": "0.28.0", "eslint-plugin-playwright": "1.7.0", "execa": "5.1.1", "file-type": "19.3.0", diff --git a/test/select/collections/Points/index.ts b/test/select/collections/Points/index.ts new file mode 100644 index 0000000000..2b05dc6267 --- /dev/null +++ b/test/select/collections/Points/index.ts @@ -0,0 +1,15 @@ +import type { CollectionConfig } from 'payload' + +export const Points: CollectionConfig = { + slug: 'points', + fields: [ + { + type: 'text', + name: 'text', + }, + { + type: 'point', + name: 'point', + }, + ], +} diff --git a/test/select/config.ts b/test/select/config.ts index 8330e462f7..7f0cb3a728 100644 --- a/test/select/config.ts +++ b/test/select/config.ts @@ -7,6 +7,7 @@ import { devUser } from '../credentials.js' import { DeepPostsCollection } from './collections/DeepPosts/index.js' import { LocalizedPostsCollection } from './collections/LocalizedPosts/index.js' import { Pages } from './collections/Pages/index.js' +import { Points } from './collections/Points/index.js' import { PostsCollection } from './collections/Posts/index.js' import { VersionedPostsCollection } from './collections/VersionedPosts/index.js' @@ -21,6 +22,7 @@ export default buildConfigWithDefaults({ VersionedPostsCollection, DeepPostsCollection, Pages, + Points, ], globals: [ { diff --git a/test/select/int.spec.ts b/test/select/int.spec.ts index 07217d51f6..558309d8f7 100644 --- a/test/select/int.spec.ts +++ b/test/select/int.spec.ts @@ -9,6 +9,7 @@ import type { GlobalPost, LocalizedPost, Page, + Point, Post, VersionedPost, } from './payload-types.js' @@ -40,14 +41,21 @@ describe('Select', () => { let post: Post let postId: number | string + let point: Point + let pointId: number | string + beforeEach(async () => { post = await createPost() postId = post.id + + point = await createPoint() + pointId = point.id }) // Clean up to safely mutate in each test afterEach(async () => { await payload.delete({ id: postId, collection: 'posts' }) + await payload.delete({ id: pointId, collection: 'points' }) }) describe('Include mode', () => { @@ -307,6 +315,23 @@ describe('Select', () => { ), }) }) + + it('should select a point field', async () => { + if (payload.db.name === 'sqlite') { + return + } + + const res = await payload.findByID({ + collection: 'points', + id: pointId, + select: { point: true }, + }) + + expect(res).toStrictEqual({ + id: pointId, + point: point.point, + }) + }) }) describe('Exclude mode', () => { @@ -486,6 +511,23 @@ describe('Select', () => { }), }) }) + + it('should exclude a point field', async () => { + if (payload.db.name === 'sqlite') { + return + } + const res = await payload.findByID({ + collection: 'points', + id: pointId, + select: { point: false }, + }) + + const copy = { ...point } + + delete copy['point'] + + expect(res).toStrictEqual(copy) + }) }) }) @@ -2032,3 +2074,7 @@ function createVersionedPost() { }, }) } + +function createPoint() { + return payload.create({ collection: 'points', data: { text: 'some', point: [10, 20] } }) +} diff --git a/test/select/payload-types.ts b/test/select/payload-types.ts index 63f7a8c8f5..e28e1f4f72 100644 --- a/test/select/payload-types.ts +++ b/test/select/payload-types.ts @@ -16,6 +16,7 @@ export interface Config { 'versioned-posts': VersionedPost; 'deep-posts': DeepPost; pages: Page; + points: Point; users: User; 'payload-locked-documents': PayloadLockedDocument; 'payload-preferences': PayloadPreference; @@ -28,6 +29,7 @@ export interface Config { 'versioned-posts': VersionedPostsSelect | VersionedPostsSelect; 'deep-posts': DeepPostsSelect | DeepPostsSelect; pages: PagesSelect | PagesSelect; + points: PointsSelect | PointsSelect; users: UsersSelect | UsersSelect; 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; @@ -306,6 +308,21 @@ export interface Page { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "points". + */ +export interface Point { + id: string; + text?: string | null; + /** + * @minItems 2 + * @maxItems 2 + */ + point?: [number, number] | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users". @@ -350,6 +367,10 @@ export interface PayloadLockedDocument { relationTo: 'pages'; value: string | Page; } | null) + | ({ + relationTo: 'points'; + value: string | Point; + } | null) | ({ relationTo: 'users'; value: string | User; @@ -631,6 +652,16 @@ export interface PagesSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "points_select". + */ +export interface PointsSelect { + text?: T; + point?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users_select". From 0c19afcf91b4df82c9c6315b0dc645af8a2bfd2b Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Mon, 11 Nov 2024 09:56:14 -0500 Subject: [PATCH 4/7] chore(release): v3.0.0-beta.127 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/db-sqlite/package.json | 2 +- packages/db-vercel-postgres/package.json | 2 +- packages/drizzle/package.json | 2 +- packages/email-nodemailer/package.json | 2 +- packages/email-resend/package.json | 2 +- packages/graphql/package.json | 2 +- packages/live-preview-react/package.json | 2 +- packages/live-preview-vue/package.json | 2 +- packages/live-preview/package.json | 2 +- packages/next/package.json | 2 +- packages/payload-cloud/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-sentry/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/plugin-stripe/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/storage-azure/package.json | 2 +- packages/storage-gcs/package.json | 2 +- packages/storage-s3/package.json | 2 +- packages/storage-uploadthing/package.json | 2 +- packages/storage-vercel-blob/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 9ed5906f04..1a8a22b0d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "private": true, "type": "module", "scripts": { diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 0573b16a6b..ffdd3a80d3 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 174cddff5f..2e693617b1 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The officially supported MongoDB database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 4b6c635499..8b0c4f290c 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The officially supported Postgres database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json index 533ffcd920..d5fb935573 100644 --- a/packages/db-sqlite/package.json +++ b/packages/db-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-sqlite", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The officially supported SQLite database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-vercel-postgres/package.json b/packages/db-vercel-postgres/package.json index 3e56837037..13eed0ccaa 100644 --- a/packages/db-vercel-postgres/package.json +++ b/packages/db-vercel-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-vercel-postgres", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Vercel Postgres adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json index a26c4439c8..ca4c337807 100644 --- a/packages/drizzle/package.json +++ b/packages/drizzle/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/drizzle", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "A library of shared functions used by different payload database adapters", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-nodemailer/package.json b/packages/email-nodemailer/package.json index 600c6ca5d6..534e37be82 100644 --- a/packages/email-nodemailer/package.json +++ b/packages/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-nodemailer", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Payload Nodemailer Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-resend/package.json b/packages/email-resend/package.json index 5363d6d893..e0ed0881ea 100644 --- a/packages/email-resend/package.json +++ b/packages/email-resend/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-resend", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Payload Resend Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 4f45a1a925..f6aca9e43c 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/live-preview-react/package.json b/packages/live-preview-react/package.json index 272c922efa..7b831212fa 100644 --- a/packages/live-preview-react/package.json +++ b/packages/live-preview-react/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-react", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The official React SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview-vue/package.json b/packages/live-preview-vue/package.json index 543c2227a4..aa4e028d2f 100644 --- a/packages/live-preview-vue/package.json +++ b/packages/live-preview-vue/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-vue", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The official Vue SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview/package.json b/packages/live-preview/package.json index 74b84ab0b7..627a8240c2 100644 --- a/packages/live-preview/package.json +++ b/packages/live-preview/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The official live preview JavaScript SDK for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/next/package.json b/packages/next/package.json index e9b96677ab..d62366bbf1 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/payload-cloud/package.json b/packages/payload-cloud/package.json index 92e7326aa2..eda655b827 100644 --- a/packages/payload-cloud/package.json +++ b/packages/payload-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/payload-cloud", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The official Payload Cloud plugin", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/payload/package.json b/packages/payload/package.json index dc5e817443..7a97689f35 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Node, React, Headless CMS and Application Framework built on Next.js", "keywords": [ "admin panel", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index a96deb82c2..0db930a2f7 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-cloud-storage", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The official cloud storage plugin for Payload CMS", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index c896304284..5b55695a76 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-form-builder", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Form builder plugin for Payload CMS", "keywords": [ "payload", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index b76299a36e..d781fdf88e 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The official Nested Docs plugin for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 6891ae364c..8cd6ff664b 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Redirects plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 57b909e5f6..8eaeed733e 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Search plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-sentry/package.json b/packages/plugin-sentry/package.json index 19f4f4eede..6200961b85 100644 --- a/packages/plugin-sentry/package.json +++ b/packages/plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-sentry", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Sentry plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index c0b057f7a8..0a47a7d271 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "SEO plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-stripe/package.json b/packages/plugin-stripe/package.json index 073703a037..6eb52f9421 100644 --- a/packages/plugin-stripe/package.json +++ b/packages/plugin-stripe/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-stripe", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Stripe plugin for Payload", "keywords": [ "payload", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index b85433007e..a8ff4d6f21 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The officially supported Lexical richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 335adeef90..b19b5c0021 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "The officially supported Slate richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-azure/package.json b/packages/storage-azure/package.json index 39e5742486..4e9c0e482f 100644 --- a/packages/storage-azure/package.json +++ b/packages/storage-azure/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-azure", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Payload storage adapter for Azure Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-gcs/package.json b/packages/storage-gcs/package.json index 0eb5996f30..335c5662f4 100644 --- a/packages/storage-gcs/package.json +++ b/packages/storage-gcs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-gcs", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Payload storage adapter for Google Cloud Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-s3/package.json b/packages/storage-s3/package.json index fe9fc65c0c..ca0655d939 100644 --- a/packages/storage-s3/package.json +++ b/packages/storage-s3/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-s3", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Payload storage adapter for Amazon S3", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-uploadthing/package.json b/packages/storage-uploadthing/package.json index 71de27a8dc..b938e25dd1 100644 --- a/packages/storage-uploadthing/package.json +++ b/packages/storage-uploadthing/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-uploadthing", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Payload storage adapter for uploadthing", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-vercel-blob/package.json b/packages/storage-vercel-blob/package.json index 19bf2dfb83..cdefb33159 100644 --- a/packages/storage-vercel-blob/package.json +++ b/packages/storage-vercel-blob/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-vercel-blob", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "description": "Payload storage adapter for Vercel Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/translations/package.json b/packages/translations/package.json index 51770ebaf1..24335ffba9 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/ui/package.json b/packages/ui/package.json index c4feab918d..18712e6cdc 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.126", + "version": "3.0.0-beta.127", "homepage": "https://payloadcms.com", "repository": { "type": "git", From d7fc944792a04e1c7c2eca18f1950d4d3ff1b758 Mon Sep 17 00:00:00 2001 From: Nate <46680405+ncaminata@users.noreply.github.com> Date: Mon, 11 Nov 2024 10:18:11 -0500 Subject: [PATCH 5/7] fix: update README with new asset, image URL (#9099) --- README.md | 2 +- .../images/github-banner-nextjs-native.jpg | Bin 0 -> 257564 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/payload/src/assets/images/github-banner-nextjs-native.jpg diff --git a/README.md b/README.md index d568eb4c84..72955f7295 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Payload headless CMS Admin panel built with React +Payload headless CMS Admin panel built with React

diff --git a/packages/payload/src/assets/images/github-banner-nextjs-native.jpg b/packages/payload/src/assets/images/github-banner-nextjs-native.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1128fd71f1abaa3d96175cec83c177ad6d599b38 GIT binary patch literal 257564 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

@7Hesl)6(A5;K-Sq@M_X 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%0A6H%t_1SBQ zF4Q1F;kr_|fB#9yPxUz&)G&N(XuLwZi9GHrjjklTOQ~UO5!(MseWGuuTj(w#%QSrl{u?k(45fEO+oU)&;9wyskubrm3lGq)#0WLifel7>*X zjfmrY?y%z`68eF;jC7txuVmPStB@6BkPiawz@s8>aq!zYm+P_Oz z-OkaQgi5kO04K~eQ^Dd1DYEht-g!6>3+^8r^q+P8>9G|QSd@!Kzs6-uv*imO)eqHh%WB^riGc!yKbQgR)WEi2c(8+hlDbQDOAb z6WUXe^*naLa*2XpDg=Yhu@^*g%`G>aJs&DP)i_JlZW#Km(MA8BuprpV)U2vT2I<4+ zbOuZf4}$G)qTaz(mIKG+xv8{%UYaOaG2=CRZ2H$_LRiISKJl zk1-^~p|ltKSLvsvqQz-c@{-POQCjkDV9Vll;-&|HP`p3Fc3+D9!rvXDUjdCf66 zBUkmZb^^W1R*28D6|@nad#r&^Dw}4ji>C&13C0pPL?au+1eKDx+y_$4sH9}wvmAqR zEe=-ze&Tb`n$x1a7L5!er~p95wk_2yVrvT9W`C0f`zYAcii7Pftsc+@oIWv1h2ND)ZrCwsu+$4z}Y?(&2)RezX2c32A?6!%(Fcf%1+< zjINqaqbjXNhxedT1-#R5ew3Jg{Nrq_!IGgm9Nq0G@%`g(p)X0?PbyvYiTsz%hhjdj znK>*vDQMPMhiUrG_P{qR9UN?}G#pe9YU3<_CiW3t1R%D-q$x-ys`pW6>|W9ic_OfF0QQ!p@avbgzSrfLpy4w+aE59+@H@P-PpNo!z{- z=ofN+b|h25B<;dHjunfBNBdJ*V-pgV?sj@|r|4v9NqO1TI&jIkJ^94#RZizv3!=*^ zZq6;NH2l>)E&BGpo5hOS$&~ef?!ZJ!&Hk0T7gcBE=Ou3xhkOn*K5@2Uf5p|UYc1ap zT;HA!P%T`1uEgC#h98{2Dbm%naO|i`qmc3GSrN=oOyJQ1^I^APdkr^_b@?uq;0DAb)GJq2ZZNp%(?_o&$yU3 zCbq*)F(rznx>%($+b}bNUHbs(Tz}TdvJCNR!Ym2m7CBhpD138y1d^R?7^LNr`S|yN z)jJ|uqO%QRilD8Zy+z1!Nwm+NXw9T2r%Of8l`63y0n_2u5-*V}2N8U-55`k;1*PJ{ zsk*-t=CF@7u|EO^5Q@Gh%#kS(E8#F2+cOIRtMr9bkaR;G%q=7OmSf8`m{`29iB)<0 z=$w|l*vyEO&Uo|qQB##Rz6bj#jpk;m39NR~Xbs)pVeE7aAr~C0%_D9=)s`jV(3fM4 z{W7TxV0KtpK|#T@qf&QRTuPykk1oe@Q1(`mA465anzA5R@A0mq*^l(ZgK}YjQ@RfP z<`SsUBMWC}^%*`H-Kq++YztCqL8~r@ltw<*DY|o1EZ|Wn9}=ct;Qy?bIMgEȚs z$>8id*FkN(5nC{SzC|#WGt_y5q2aS@dHaH~8$`lk=W!Ltjl)Rk$db~|4ccJrltILT zP{p^@DKW|BmQ~3l&yGjqO%ozTf_$VaUD$WVRt;J7wy&BfRC5+w;7q|k8~;9NqS85v zFzj*{b)7zp1M~NC8Q<%-adx&r(M~15G#^~Oq^!L9#_XbX2U@zmlB~(rs$#(Y@7msqnW>M==a;Q=-x1 z^58IydK66G^Be)l@Cva2Amu>+v(cZg1$T#$33nlXhlO4+3*sBl43N<;6YC!lrAfp^ z&~;wT`X5GsvO?kaaw8sWZnQ=VZ8@LE4Hsn;1^-0@V0F-PvTEehKGA?xm=bj}mg(Yp z#_8qV#Y_9Ow6{EoM&tb_QKt8k#Y**&7lBtRY<)}=_H1jq6^rBG!AHC_m)!S0_-15X ztZY!gE%X_GA6SP$!r!WN0p)lWVUWw-cVxM9YVtxYmG1w1kOWr5gMBCYiJ3QHJn1gC zc9Ndxc#rJy;gAs*%b^MWg6>a9n*mJ*$5jj}mHpBSdtk_fAARC3d(wG;ZwW-?kInEm zP7LyyIebs?n79B|uFPNe!d#!d`C&UY9?j=6eh&V<&lkd0o@~Ih(G7w)B3H^j{7ZQD zAHBS3WzjGsB894_Kdpja`-f=B8tqi>A_+PkjS@YpD~GeHPYxxk6f2$5l`<7FHt5%! zPSrr>`1xnk-29sLXP_dn>t-qCzdV?K>O!Jyo$SWXJ8~$IFrv5^1xowZ=Y=VD_iyv z5}s~jvIECpTB5Te#}qnRWXp7&%NrjZ+t&Ah_H@36i;6kWrdZ+@RXqSf9>?$Y)BOV@#hzUz}Ko(n7BO zr~^z(l%Q9qmT-ag^fiWfM+5Eg)px;aoITd=8*WX3o2X{z^B~5ug)bLObBk(A*1?#` zdJI@>3BJd>)bQ6ghR z@`vQ2&ZcS+sRcx8^O=j-iUa9#7KBPpU^5QB5czdR&3$GrMjhQW#jxxws>SPt= zr(5^V+dEmoUf@0!w?#y8W^qiV0n0*|5mi%9=c(?02{~Ert!UDCJh5?Ky~lUc7irzN zKN|i$pkX_==PdMrCju=D|6U{fSQoJY@*?bOjEZ#m-dspLPmAK3w5xr070U~m7hLA`1{e&bW);ZXyefv0N1`tUtdsxz zl^9*%s=lSD!zwrnSi@MjqSU)u+ zLw&9;nxT*P%*k>O%C|Q&=pDN8cP5ONZCKXgUu}DuQ9{=%(k0RJGIfT@_0Ct% zTGpbzjP5-?;u^OauijGn+~n7rboil4jk04C#Vq(BYcfX3yk23Ff*u<8qrZl>_sA}r zDe77={~8bW9<}vJW=I$NvX9LrbayA?GJf`Xl3dnR#d$-psryb$X;r*-v66T2IxV(! zc_w$?x0&}wW1(V?Tu;8b_=MTrqsAXevo|)#zV~FjY@HXA7OF}A@lAT}<%pSoVM9k_ z_?qIjRd%VZjc?}feisyW+Wg$eh-|Jc80+L?YS+|A*j`G!XSvQVD0_ls^4A-NG(!@X z9%r433&mV0<9iFa0@L>r(KEh9@PzfT#N=ORaV@Mk$#C{WLN!mvYocFFn3Z6K6Uj|s z1s>l!aS}B~NdRxY2O6yrzy#D59P2tn0m(%XuCp?GB81t9->BFW;mpNQQ*%@`^-4|j zNT+x%rd`a+iUj}R7p|})f|9Q;F53|Bje)(X4Ag>f=6fdui9~XVWmZ*WN|ZykflQE? zt`euPDn}aE&A@Dkks{%+w;shQegm__*c&!i)wm*Epi*T|l2}(y(LI7#S@#cYsgS$` zPrA)1vuTdwz=$+O%vGN-^Pwg(JwAp&9cluz>4?G1c$#Ah&FxgAE7lq`qoc&ntP1!f z$`B?<`1R)3d5z#nfb<4q93<8PkyWAy6?Y^oxXEl7b~aWF_PZKV17+$nxSxFUh)j^8 zX1O8^F!nSm|4ri=0f;Md>^#oq;8M{GuLlV5C4J?l5+-A n=8Q$P)mf3qLP!X?8c#{Ny+oWnDB@X_I!C77eTTvP@7w Date: Mon, 11 Nov 2024 09:19:24 -0600 Subject: [PATCH 6/7] chore(templates): remove old ecommerce template (#8916) removes the previous v2 ecommerce template from the repo ahead of v3 launch until ecomm v3 is ready --- templates/ecommerce/.editorconfig | 10 - templates/ecommerce/.env.example | 31 - templates/ecommerce/.eslintrc.cjs | 38 - templates/ecommerce/.gitignore | 8 - templates/ecommerce/.prettierignore | 14 - templates/ecommerce/.prettierrc.json | 6 - templates/ecommerce/.vscode/launch.json | 14 - templates/ecommerce/Dockerfile | 27 - templates/ecommerce/README.md | 329 - templates/ecommerce/csp.js | 36 - templates/ecommerce/docker-compose.yml | 31 - templates/ecommerce/eject.ts | 36 - templates/ecommerce/next-env.d.ts | 5 - templates/ecommerce/next.config.js | 50 - templates/ecommerce/nodemon.json | 8 - templates/ecommerce/package.json | 65 - templates/ecommerce/public/favicon.ico | Bin 17223 -> 0 bytes templates/ecommerce/public/favicon.svg | 15 - templates/ecommerce/public/static-image.jpg | Bin 93586 -> 0 bytes templates/ecommerce/redirects.js | 81 - .../ecommerce/src/app/(pages)/[slug]/page.tsx | 98 - .../account/AccountForm/index.module.scss | 24 - .../app/(pages)/account/AccountForm/index.tsx | 161 - .../src/app/(pages)/account/index.module.scss | 25 - .../src/app/(pages)/account/page.tsx | 115 - .../(pages)/cart/CartPage/index.module.scss | 112 - .../src/app/(pages)/cart/CartPage/index.tsx | 157 - .../src/app/(pages)/cart/index.module.scss | 5 - .../ecommerce/src/app/(pages)/cart/page.tsx | 119 - .../checkout/CheckoutForm/index.module.scss | 13 - .../(pages)/checkout/CheckoutForm/index.tsx | 115 - .../checkout/CheckoutPage/index.module.scss | 81 - .../(pages)/checkout/CheckoutPage/index.tsx | 196 - .../app/(pages)/checkout/index.module.scss | 5 - .../src/app/(pages)/checkout/page.tsx | 117 - .../CreateAccountForm/index.module.scss | 22 - .../CreateAccountForm/index.tsx | 120 - .../(pages)/create-account/index.module.scss | 5 - .../src/app/(pages)/create-account/page.tsx | 35 - .../(pages)/login/LoginForm/index.module.scss | 22 - .../src/app/(pages)/login/LoginForm/index.tsx | 85 - .../src/app/(pages)/login/index.module.scss | 9 - .../ecommerce/src/app/(pages)/login/page.tsx | 33 - .../app/(pages)/logout/LogoutPage/index.tsx | 53 - .../src/app/(pages)/logout/index.module.scss | 3 - .../ecommerce/src/app/(pages)/logout/page.tsx | 39 - .../ecommerce/src/app/(pages)/not-found.tsx | 15 - .../OrderConfirmationPage/index.module.scss | 7 - .../OrderConfirmationPage/index.tsx | 58 - .../order-confirmation/index.module.scss | 5 - .../app/(pages)/order-confirmation/page.tsx | 27 - .../app/(pages)/orders/[id]/index.module.scss | 122 - .../src/app/(pages)/orders/[id]/page.tsx | 143 - .../src/app/(pages)/orders/index.module.scss | 65 - .../ecommerce/src/app/(pages)/orders/page.tsx | 100 - .../src/app/(pages)/products/[slug]/page.tsx | 114 - .../RecoverPasswordForm/index.module.scss | 22 - .../RecoverPasswordForm/index.tsx | 87 - .../recover-password/index.module.scss | 5 - .../src/app/(pages)/recover-password/page.tsx | 25 - .../ResetPasswordForm/index.module.scss | 13 - .../ResetPasswordForm/index.tsx | 86 - .../(pages)/reset-password/index.module.scss | 3 - .../src/app/(pages)/reset-password/page.tsx | 27 - .../app/(pages)/styleguide/buttons/page.tsx | 43 - .../styleguide/call-to-action/page.tsx | 100 - .../(pages)/styleguide/content-block/page.tsx | 48 - .../(pages)/styleguide/media-block/page.tsx | 45 - .../app/(pages)/styleguide/message/page.tsx | 44 - .../src/app/(pages)/styleguide/page.tsx | 40 - .../(pages)/styleguide/typography/page.tsx | 55 - templates/ecommerce/src/app/_api/fetchDoc.ts | 66 - templates/ecommerce/src/app/_api/fetchDocs.ts | 59 - .../ecommerce/src/app/_api/fetchGlobals.ts | 103 - templates/ecommerce/src/app/_api/getMe.ts | 50 - templates/ecommerce/src/app/_api/shared.ts | 3 - templates/ecommerce/src/app/_api/token.ts | 1 - .../_blocks/ArchiveBlock/index.module.scss | 13 - .../src/app/_blocks/ArchiveBlock/index.tsx | 46 - .../src/app/_blocks/ArchiveBlock/types.ts | 3 - .../_blocks/CallToAction/index.module.scss | 61 - .../src/app/_blocks/CallToAction/index.tsx | 38 - .../src/app/_blocks/Content/index.module.scss | 42 - .../src/app/_blocks/Content/index.tsx | 37 - .../app/_blocks/MediaBlock/index.module.scss | 8 - .../src/app/_blocks/MediaBlock/index.tsx | 42 - .../_blocks/RelatedProducts/index.module.scss | 58 - .../src/app/_blocks/RelatedProducts/index.tsx | 52 - .../AddToCartButton/index.module.scss | 14 - .../app/_components/AddToCartButton/index.tsx | 59 - .../_components/AdminBar/index.module.scss | 53 - .../src/app/_components/AdminBar/index.tsx | 64 - .../BackgroundColor/index.module.scss | 11 - .../app/_components/BackgroundColor/index.tsx | 20 - .../src/app/_components/Blocks/index.tsx | 86 - .../app/_components/Button/index.module.scss | 72 - .../src/app/_components/Button/index.tsx | 78 - .../app/_components/Card/index.module.scss | 93 - .../src/app/_components/Card/index.tsx | 120 - .../_components/CartLink/index.module.scss | 9 - .../src/app/_components/CartLink/index.tsx | 30 - .../src/app/_components/Chevron/index.tsx | 26 - .../CollectionArchive/index.module.scss | 73 - .../_components/CollectionArchive/index.tsx | 210 - .../app/_components/Footer/index.module.scss | 43 - .../src/app/_components/Footer/index.tsx | 58 - .../app/_components/Gutter/index.module.scss | 13 - .../src/app/_components/Gutter/index.tsx | 35 - .../src/app/_components/HR/index.module.scss | 8 - .../src/app/_components/HR/index.tsx | 11 - .../_components/Header/Nav/index.module.scss | 20 - .../src/app/_components/Header/Nav/index.tsx | 42 - .../app/_components/Header/index.module.scss | 22 - .../src/app/_components/Header/index.tsx | 48 - .../src/app/_components/Hero/index.tsx | 25 - .../app/_components/Input/index.module.scss | 61 - .../src/app/_components/Input/index.tsx | 61 - .../app/_components/Label/index.module.scss | 5 - .../src/app/_components/Label/index.tsx | 7 - .../_components/LargeBody/index.module.scss | 5 - .../src/app/_components/LargeBody/index.tsx | 7 - .../src/app/_components/Link/index.tsx | 67 - .../LoadingShimmer/index.module.scss | 29 - .../app/_components/LoadingShimmer/index.tsx | 18 - .../_components/Media/Image/index.module.scss | 7 - .../src/app/_components/Media/Image/index.tsx | 77 - .../_components/Media/Video/index.module.scss | 11 - .../src/app/_components/Media/Video/index.tsx | 45 - .../src/app/_components/Media/index.tsx | 27 - .../src/app/_components/Media/types.ts | 20 - .../app/_components/Message/index.module.scss | 46 - .../src/app/_components/Message/index.tsx | 33 - .../_components/PageRange/index.module.scss | 21 - .../src/app/_components/PageRange/index.tsx | 56 - .../_components/Pagination/index.module.scss | 29 - .../src/app/_components/Pagination/index.tsx | 45 - .../app/_components/PaywallBlocks/index.tsx | 121 - .../app/_components/Price/index.module.scss | 29 - .../src/app/_components/Price/index.tsx | 80 - .../RemoveFromCartButton/index.module.scss | 7 - .../RemoveFromCartButton/index.tsx | 33 - .../_components/RenderParams/Component.tsx | 51 - .../RenderParams/index.module.scss | 9 - .../app/_components/RenderParams/index.tsx | 17 - .../_components/RichText/index.module.scss | 8 - .../src/app/_components/RichText/index.tsx | 18 - .../app/_components/RichText/serialize.tsx | 110 - .../VerticalPadding/index.module.scss | 15 - .../app/_components/VerticalPadding/index.tsx | 29 - .../app/_components/icons/Chevron/index.tsx | 9 - .../src/app/_components/icons/Menu/index.tsx | 11 - templates/ecommerce/src/app/_css/app.scss | 123 - templates/ecommerce/src/app/_css/colors.scss | 105 - templates/ecommerce/src/app/_css/common.scss | 2 - templates/ecommerce/src/app/_css/queries.scss | 30 - templates/ecommerce/src/app/_css/theme.scss | 237 - templates/ecommerce/src/app/_css/type.scss | 110 - .../ecommerce/src/app/_graphql/blocks.ts | 74 - templates/ecommerce/src/app/_graphql/cart.ts | 13 - .../ecommerce/src/app/_graphql/categories.ts | 8 - .../ecommerce/src/app/_graphql/globals.ts | 43 - templates/ecommerce/src/app/_graphql/link.ts | 20 - templates/ecommerce/src/app/_graphql/me.ts | 14 - templates/ecommerce/src/app/_graphql/media.ts | 12 - templates/ecommerce/src/app/_graphql/meta.ts | 9 - .../ecommerce/src/app/_graphql/orders.ts | 27 - templates/ecommerce/src/app/_graphql/pages.ts | 41 - .../ecommerce/src/app/_graphql/products.ts | 56 - .../app/_heros/HighImpact/index.module.scss | 55 - .../src/app/_heros/HighImpact/index.tsx | 43 - .../app/_heros/LowImpact/index.module.scss | 4 - .../src/app/_heros/LowImpact/index.tsx | 20 - .../app/_heros/MediumImpact/index.module.scss | 62 - .../src/app/_heros/MediumImpact/index.tsx | 35 - .../src/app/_heros/Product/index.module.scss | 84 - .../src/app/_heros/Product/index.tsx | 94 - .../src/app/_providers/Auth/index.tsx | 218 - .../src/app/_providers/Cart/index.tsx | 278 - .../src/app/_providers/Cart/reducer.ts | 122 - .../app/_providers/Theme/InitTheme/index.tsx | 49 - .../Theme/ThemeSelector/index.module.scss | 52 - .../_providers/Theme/ThemeSelector/index.tsx | 55 - .../_providers/Theme/ThemeSelector/types.ts | 5 - .../src/app/_providers/Theme/index.tsx | 57 - .../src/app/_providers/Theme/shared.ts | 17 - .../src/app/_providers/Theme/types.ts | 10 - .../ecommerce/src/app/_providers/index.tsx | 19 - .../ecommerce/src/app/_utilities/canUseDOM.ts | 1 - .../src/app/_utilities/formatDateTime.ts | 20 - .../src/app/_utilities/generateMeta.ts | 32 - .../ecommerce/src/app/_utilities/getMeUser.ts | 41 - .../src/app/_utilities/mergeOpenGraph.ts | 21 - .../src/app/_utilities/toKebabCase.ts | 5 - templates/ecommerce/src/app/cssVariables.js | 17 - templates/ecommerce/src/app/layout.tsx | 42 - .../src/app/next/exit-preview/route.ts | 6 - .../ecommerce/src/app/next/preview/route.ts | 49 - .../src/app/next/revalidate/route.ts | 28 - templates/ecommerce/src/app/page.tsx | 5 - .../ecommerce/src/payload/access/admins.ts | 11 - .../src/payload/access/adminsOrLoggedIn.ts | 13 - .../ecommerce/src/payload/access/anyone.ts | 3 - .../src/payload/blocks/ArchiveBlock/index.ts | 100 - .../src/payload/blocks/CallToAction/index.ts | 23 - .../src/payload/blocks/Content/index.ts | 55 - .../src/payload/blocks/MediaBlock/index.ts | 31 - .../src/payload/collections/Categories.ts | 19 - .../src/payload/collections/Media.ts | 30 - .../Orders/access/adminsOrOrderedBy.ts | 15 - .../collections/Orders/hooks/clearUserCart.ts | 30 - .../Orders/hooks/populateOrderedBy.ts | 11 - .../Orders/hooks/updateUserPurchases.ts | 35 - .../src/payload/collections/Orders/index.ts | 76 - .../Orders/ui/LinkToPaymentIntent.tsx | 56 - .../Pages/access/adminsOrPublished.ts | 15 - .../collections/Pages/hooks/revalidatePage.ts | 15 - .../src/payload/collections/Pages/index.ts | 86 - .../Products/access/checkUserPurchases.ts | 25 - .../Products/hooks/beforeChange.ts | 56 - .../Products/hooks/deleteProductFromCarts.ts | 36 - .../Products/hooks/revalidateProduct.ts | 15 - .../src/payload/collections/Products/index.ts | 159 - .../collections/Products/ui/ProductSelect.tsx | 120 - .../collections/Users/access/adminsAndUser.ts | 21 - .../payload/collections/Users/checkRole.ts | 16 - .../collections/Users/endpoints/customer.ts | 80 - .../Users/hooks/createStripeCustomer.ts | 42 - .../Users/hooks/ensureFirstUserIsAdmin.ts | 22 - .../Users/hooks/loginAfterCreate.ts | 29 - .../Users/hooks/resolveDuplicatePurchases.ts | 15 - .../src/payload/collections/Users/index.ts | 158 - .../collections/Users/ui/CustomerSelect.tsx | 119 - .../BeforeDashboard/SeedButton/index.tsx | 40 - .../components/BeforeDashboard/index.scss | 24 - .../components/BeforeDashboard/index.tsx | 99 - .../payload/components/BeforeLogin/index.scss | 0 .../payload/components/BeforeLogin/index.tsx | 16 - templates/ecommerce/src/payload/dotenv.js | 3 - .../ecommerce/src/payload/emptyModuleMock.js | 4 - .../endpoints/create-payment-intent.ts | 110 - .../src/payload/endpoints/customers.ts | 34 - .../src/payload/endpoints/products.ts | 34 - .../ecommerce/src/payload/endpoints/seed.ts | 21 - .../ecommerce/src/payload/fields/hero.ts | 59 - .../src/payload/fields/invertBackground.ts | 6 - .../ecommerce/src/payload/fields/link.ts | 150 - .../ecommerce/src/payload/fields/linkGroup.ts | 28 - .../src/payload/fields/richText/elements.ts | 18 - .../src/payload/fields/richText/index.ts | 109 - .../fields/richText/label/Button/index.tsx | 16 - .../fields/richText/label/Element/index.scss | 9 - .../fields/richText/label/Element/index.tsx | 16 - .../fields/richText/label/Icon/index.tsx | 18 - .../payload/fields/richText/label/index.ts | 14 - .../payload/fields/richText/label/plugin.ts | 21 - .../richText/largeBody/Button/index.tsx | 16 - .../richText/largeBody/Element/index.scss | 5 - .../richText/largeBody/Element/index.tsx | 16 - .../fields/richText/largeBody/Icon/index.tsx | 18 - .../fields/richText/largeBody/index.ts | 14 - .../fields/richText/largeBody/plugin.ts | 21 - .../src/payload/fields/richText/leaves.ts | 5 - .../ecommerce/src/payload/fields/slug.ts | 23 - .../src/payload/generated-schema.graphql | 10545 ---------------- .../ecommerce/src/payload/globals/Footer.ts | 22 - .../ecommerce/src/payload/globals/Header.ts | 22 - .../ecommerce/src/payload/globals/Settings.ts | 22 - .../src/payload/hooks/populateArchiveBlock.ts | 62 - .../ecommerce/src/payload/payload-types.ts | 518 - .../ecommerce/src/payload/payload.config.ts | 148 - .../ecommerce/src/payload/seed/cart-page.ts | 118 - .../ecommerce/src/payload/seed/cart-static.ts | 109 - .../ecommerce/src/payload/seed/home-static.ts | 126 - templates/ecommerce/src/payload/seed/home.ts | 505 - .../ecommerce/src/payload/seed/image-1.jpg | Bin 93586 -> 0 bytes .../ecommerce/src/payload/seed/image-1.ts | 40 - .../ecommerce/src/payload/seed/image-2.jpg | Bin 349328 -> 0 bytes .../ecommerce/src/payload/seed/image-2.ts | 40 - .../ecommerce/src/payload/seed/image-3.jpg | Bin 248185 -> 0 bytes .../ecommerce/src/payload/seed/image-3.ts | 40 - templates/ecommerce/src/payload/seed/index.ts | 233 - .../ecommerce/src/payload/seed/product-1.ts | 38 - .../ecommerce/src/payload/seed/product-2.ts | 76 - .../ecommerce/src/payload/seed/product-3.ts | 76 - .../src/payload/seed/products-page.ts | 61 - .../payload/stripe/webhooks/priceUpdated.ts | 69 - .../payload/stripe/webhooks/productUpdated.ts | 81 - .../src/payload/utilities/deepMerge.ts | 34 - .../src/payload/utilities/formatSlug.ts | 27 - .../src/payload/utilities/revalidate.ts | 27 - templates/ecommerce/src/server.default.ts | 44 - templates/ecommerce/src/server.ts | 60 - templates/ecommerce/tsconfig.json | 32 - templates/ecommerce/tsconfig.server.json | 10 - templates/ecommerce/yarn.lock | 9870 --------------- 295 files changed, 35150 deletions(-) delete mode 100644 templates/ecommerce/.editorconfig delete mode 100644 templates/ecommerce/.env.example delete mode 100644 templates/ecommerce/.eslintrc.cjs delete mode 100644 templates/ecommerce/.gitignore delete mode 100644 templates/ecommerce/.prettierignore delete mode 100644 templates/ecommerce/.prettierrc.json delete mode 100644 templates/ecommerce/.vscode/launch.json delete mode 100644 templates/ecommerce/Dockerfile delete mode 100644 templates/ecommerce/README.md delete mode 100644 templates/ecommerce/csp.js delete mode 100644 templates/ecommerce/docker-compose.yml delete mode 100644 templates/ecommerce/eject.ts delete mode 100644 templates/ecommerce/next-env.d.ts delete mode 100644 templates/ecommerce/next.config.js delete mode 100644 templates/ecommerce/nodemon.json delete mode 100644 templates/ecommerce/package.json delete mode 100644 templates/ecommerce/public/favicon.ico delete mode 100644 templates/ecommerce/public/favicon.svg delete mode 100644 templates/ecommerce/public/static-image.jpg delete mode 100644 templates/ecommerce/redirects.js delete mode 100644 templates/ecommerce/src/app/(pages)/[slug]/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/account/AccountForm/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/account/AccountForm/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/account/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/account/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/cart/CartPage/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/cart/CartPage/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/cart/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/cart/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/checkout/CheckoutForm/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/checkout/CheckoutForm/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/checkout/CheckoutPage/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/checkout/CheckoutPage/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/checkout/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/checkout/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/create-account/CreateAccountForm/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/create-account/CreateAccountForm/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/create-account/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/create-account/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/login/LoginForm/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/login/LoginForm/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/login/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/login/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/logout/LogoutPage/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/logout/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/logout/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/not-found.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/order-confirmation/OrderConfirmationPage/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/order-confirmation/OrderConfirmationPage/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/order-confirmation/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/order-confirmation/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/orders/[id]/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/orders/[id]/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/orders/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/orders/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/products/[slug]/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/recover-password/RecoverPasswordForm/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/recover-password/RecoverPasswordForm/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/recover-password/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/recover-password/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/reset-password/ResetPasswordForm/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/reset-password/ResetPasswordForm/index.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/reset-password/index.module.scss delete mode 100644 templates/ecommerce/src/app/(pages)/reset-password/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/styleguide/buttons/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/styleguide/call-to-action/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/styleguide/content-block/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/styleguide/media-block/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/styleguide/message/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/styleguide/page.tsx delete mode 100644 templates/ecommerce/src/app/(pages)/styleguide/typography/page.tsx delete mode 100644 templates/ecommerce/src/app/_api/fetchDoc.ts delete mode 100644 templates/ecommerce/src/app/_api/fetchDocs.ts delete mode 100644 templates/ecommerce/src/app/_api/fetchGlobals.ts delete mode 100644 templates/ecommerce/src/app/_api/getMe.ts delete mode 100644 templates/ecommerce/src/app/_api/shared.ts delete mode 100644 templates/ecommerce/src/app/_api/token.ts delete mode 100644 templates/ecommerce/src/app/_blocks/ArchiveBlock/index.module.scss delete mode 100644 templates/ecommerce/src/app/_blocks/ArchiveBlock/index.tsx delete mode 100644 templates/ecommerce/src/app/_blocks/ArchiveBlock/types.ts delete mode 100644 templates/ecommerce/src/app/_blocks/CallToAction/index.module.scss delete mode 100644 templates/ecommerce/src/app/_blocks/CallToAction/index.tsx delete mode 100644 templates/ecommerce/src/app/_blocks/Content/index.module.scss delete mode 100644 templates/ecommerce/src/app/_blocks/Content/index.tsx delete mode 100644 templates/ecommerce/src/app/_blocks/MediaBlock/index.module.scss delete mode 100644 templates/ecommerce/src/app/_blocks/MediaBlock/index.tsx delete mode 100644 templates/ecommerce/src/app/_blocks/RelatedProducts/index.module.scss delete mode 100644 templates/ecommerce/src/app/_blocks/RelatedProducts/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/AddToCartButton/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/AddToCartButton/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/AdminBar/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/AdminBar/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/BackgroundColor/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/BackgroundColor/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Blocks/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Button/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Button/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Card/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Card/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/CartLink/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/CartLink/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Chevron/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/CollectionArchive/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/CollectionArchive/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Footer/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Footer/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Gutter/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Gutter/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/HR/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/HR/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Header/Nav/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Header/Nav/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Header/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Header/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Hero/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Input/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Input/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Label/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Label/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/LargeBody/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/LargeBody/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Link/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/LoadingShimmer/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/LoadingShimmer/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Media/Image/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Media/Image/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Media/Video/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Media/Video/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Media/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Media/types.ts delete mode 100644 templates/ecommerce/src/app/_components/Message/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Message/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/PageRange/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/PageRange/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Pagination/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Pagination/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/PaywallBlocks/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/Price/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/Price/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/RemoveFromCartButton/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/RemoveFromCartButton/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/RenderParams/Component.tsx delete mode 100644 templates/ecommerce/src/app/_components/RenderParams/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/RenderParams/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/RichText/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/RichText/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/RichText/serialize.tsx delete mode 100644 templates/ecommerce/src/app/_components/VerticalPadding/index.module.scss delete mode 100644 templates/ecommerce/src/app/_components/VerticalPadding/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/icons/Chevron/index.tsx delete mode 100644 templates/ecommerce/src/app/_components/icons/Menu/index.tsx delete mode 100644 templates/ecommerce/src/app/_css/app.scss delete mode 100644 templates/ecommerce/src/app/_css/colors.scss delete mode 100644 templates/ecommerce/src/app/_css/common.scss delete mode 100644 templates/ecommerce/src/app/_css/queries.scss delete mode 100644 templates/ecommerce/src/app/_css/theme.scss delete mode 100644 templates/ecommerce/src/app/_css/type.scss delete mode 100644 templates/ecommerce/src/app/_graphql/blocks.ts delete mode 100644 templates/ecommerce/src/app/_graphql/cart.ts delete mode 100644 templates/ecommerce/src/app/_graphql/categories.ts delete mode 100644 templates/ecommerce/src/app/_graphql/globals.ts delete mode 100644 templates/ecommerce/src/app/_graphql/link.ts delete mode 100644 templates/ecommerce/src/app/_graphql/me.ts delete mode 100644 templates/ecommerce/src/app/_graphql/media.ts delete mode 100644 templates/ecommerce/src/app/_graphql/meta.ts delete mode 100644 templates/ecommerce/src/app/_graphql/orders.ts delete mode 100644 templates/ecommerce/src/app/_graphql/pages.ts delete mode 100644 templates/ecommerce/src/app/_graphql/products.ts delete mode 100644 templates/ecommerce/src/app/_heros/HighImpact/index.module.scss delete mode 100644 templates/ecommerce/src/app/_heros/HighImpact/index.tsx delete mode 100644 templates/ecommerce/src/app/_heros/LowImpact/index.module.scss delete mode 100644 templates/ecommerce/src/app/_heros/LowImpact/index.tsx delete mode 100644 templates/ecommerce/src/app/_heros/MediumImpact/index.module.scss delete mode 100644 templates/ecommerce/src/app/_heros/MediumImpact/index.tsx delete mode 100644 templates/ecommerce/src/app/_heros/Product/index.module.scss delete mode 100644 templates/ecommerce/src/app/_heros/Product/index.tsx delete mode 100644 templates/ecommerce/src/app/_providers/Auth/index.tsx delete mode 100644 templates/ecommerce/src/app/_providers/Cart/index.tsx delete mode 100644 templates/ecommerce/src/app/_providers/Cart/reducer.ts delete mode 100644 templates/ecommerce/src/app/_providers/Theme/InitTheme/index.tsx delete mode 100644 templates/ecommerce/src/app/_providers/Theme/ThemeSelector/index.module.scss delete mode 100644 templates/ecommerce/src/app/_providers/Theme/ThemeSelector/index.tsx delete mode 100644 templates/ecommerce/src/app/_providers/Theme/ThemeSelector/types.ts delete mode 100644 templates/ecommerce/src/app/_providers/Theme/index.tsx delete mode 100644 templates/ecommerce/src/app/_providers/Theme/shared.ts delete mode 100644 templates/ecommerce/src/app/_providers/Theme/types.ts delete mode 100644 templates/ecommerce/src/app/_providers/index.tsx delete mode 100644 templates/ecommerce/src/app/_utilities/canUseDOM.ts delete mode 100644 templates/ecommerce/src/app/_utilities/formatDateTime.ts delete mode 100644 templates/ecommerce/src/app/_utilities/generateMeta.ts delete mode 100644 templates/ecommerce/src/app/_utilities/getMeUser.ts delete mode 100644 templates/ecommerce/src/app/_utilities/mergeOpenGraph.ts delete mode 100644 templates/ecommerce/src/app/_utilities/toKebabCase.ts delete mode 100644 templates/ecommerce/src/app/cssVariables.js delete mode 100644 templates/ecommerce/src/app/layout.tsx delete mode 100644 templates/ecommerce/src/app/next/exit-preview/route.ts delete mode 100644 templates/ecommerce/src/app/next/preview/route.ts delete mode 100644 templates/ecommerce/src/app/next/revalidate/route.ts delete mode 100644 templates/ecommerce/src/app/page.tsx delete mode 100644 templates/ecommerce/src/payload/access/admins.ts delete mode 100644 templates/ecommerce/src/payload/access/adminsOrLoggedIn.ts delete mode 100644 templates/ecommerce/src/payload/access/anyone.ts delete mode 100644 templates/ecommerce/src/payload/blocks/ArchiveBlock/index.ts delete mode 100644 templates/ecommerce/src/payload/blocks/CallToAction/index.ts delete mode 100644 templates/ecommerce/src/payload/blocks/Content/index.ts delete mode 100644 templates/ecommerce/src/payload/blocks/MediaBlock/index.ts delete mode 100644 templates/ecommerce/src/payload/collections/Categories.ts delete mode 100644 templates/ecommerce/src/payload/collections/Media.ts delete mode 100644 templates/ecommerce/src/payload/collections/Orders/access/adminsOrOrderedBy.ts delete mode 100644 templates/ecommerce/src/payload/collections/Orders/hooks/clearUserCart.ts delete mode 100644 templates/ecommerce/src/payload/collections/Orders/hooks/populateOrderedBy.ts delete mode 100644 templates/ecommerce/src/payload/collections/Orders/hooks/updateUserPurchases.ts delete mode 100644 templates/ecommerce/src/payload/collections/Orders/index.ts delete mode 100644 templates/ecommerce/src/payload/collections/Orders/ui/LinkToPaymentIntent.tsx delete mode 100644 templates/ecommerce/src/payload/collections/Pages/access/adminsOrPublished.ts delete mode 100644 templates/ecommerce/src/payload/collections/Pages/hooks/revalidatePage.ts delete mode 100644 templates/ecommerce/src/payload/collections/Pages/index.ts delete mode 100644 templates/ecommerce/src/payload/collections/Products/access/checkUserPurchases.ts delete mode 100644 templates/ecommerce/src/payload/collections/Products/hooks/beforeChange.ts delete mode 100644 templates/ecommerce/src/payload/collections/Products/hooks/deleteProductFromCarts.ts delete mode 100644 templates/ecommerce/src/payload/collections/Products/hooks/revalidateProduct.ts delete mode 100644 templates/ecommerce/src/payload/collections/Products/index.ts delete mode 100644 templates/ecommerce/src/payload/collections/Products/ui/ProductSelect.tsx delete mode 100644 templates/ecommerce/src/payload/collections/Users/access/adminsAndUser.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/checkRole.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/endpoints/customer.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/hooks/createStripeCustomer.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/hooks/ensureFirstUserIsAdmin.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/hooks/loginAfterCreate.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/hooks/resolveDuplicatePurchases.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/index.ts delete mode 100644 templates/ecommerce/src/payload/collections/Users/ui/CustomerSelect.tsx delete mode 100644 templates/ecommerce/src/payload/components/BeforeDashboard/SeedButton/index.tsx delete mode 100644 templates/ecommerce/src/payload/components/BeforeDashboard/index.scss delete mode 100644 templates/ecommerce/src/payload/components/BeforeDashboard/index.tsx delete mode 100644 templates/ecommerce/src/payload/components/BeforeLogin/index.scss delete mode 100644 templates/ecommerce/src/payload/components/BeforeLogin/index.tsx delete mode 100644 templates/ecommerce/src/payload/dotenv.js delete mode 100644 templates/ecommerce/src/payload/emptyModuleMock.js delete mode 100644 templates/ecommerce/src/payload/endpoints/create-payment-intent.ts delete mode 100644 templates/ecommerce/src/payload/endpoints/customers.ts delete mode 100644 templates/ecommerce/src/payload/endpoints/products.ts delete mode 100644 templates/ecommerce/src/payload/endpoints/seed.ts delete mode 100644 templates/ecommerce/src/payload/fields/hero.ts delete mode 100644 templates/ecommerce/src/payload/fields/invertBackground.ts delete mode 100644 templates/ecommerce/src/payload/fields/link.ts delete mode 100644 templates/ecommerce/src/payload/fields/linkGroup.ts delete mode 100644 templates/ecommerce/src/payload/fields/richText/elements.ts delete mode 100644 templates/ecommerce/src/payload/fields/richText/index.ts delete mode 100644 templates/ecommerce/src/payload/fields/richText/label/Button/index.tsx delete mode 100644 templates/ecommerce/src/payload/fields/richText/label/Element/index.scss delete mode 100644 templates/ecommerce/src/payload/fields/richText/label/Element/index.tsx delete mode 100644 templates/ecommerce/src/payload/fields/richText/label/Icon/index.tsx delete mode 100644 templates/ecommerce/src/payload/fields/richText/label/index.ts delete mode 100644 templates/ecommerce/src/payload/fields/richText/label/plugin.ts delete mode 100644 templates/ecommerce/src/payload/fields/richText/largeBody/Button/index.tsx delete mode 100644 templates/ecommerce/src/payload/fields/richText/largeBody/Element/index.scss delete mode 100644 templates/ecommerce/src/payload/fields/richText/largeBody/Element/index.tsx delete mode 100644 templates/ecommerce/src/payload/fields/richText/largeBody/Icon/index.tsx delete mode 100644 templates/ecommerce/src/payload/fields/richText/largeBody/index.ts delete mode 100644 templates/ecommerce/src/payload/fields/richText/largeBody/plugin.ts delete mode 100644 templates/ecommerce/src/payload/fields/richText/leaves.ts delete mode 100644 templates/ecommerce/src/payload/fields/slug.ts delete mode 100644 templates/ecommerce/src/payload/generated-schema.graphql delete mode 100644 templates/ecommerce/src/payload/globals/Footer.ts delete mode 100644 templates/ecommerce/src/payload/globals/Header.ts delete mode 100644 templates/ecommerce/src/payload/globals/Settings.ts delete mode 100644 templates/ecommerce/src/payload/hooks/populateArchiveBlock.ts delete mode 100644 templates/ecommerce/src/payload/payload-types.ts delete mode 100644 templates/ecommerce/src/payload/payload.config.ts delete mode 100644 templates/ecommerce/src/payload/seed/cart-page.ts delete mode 100644 templates/ecommerce/src/payload/seed/cart-static.ts delete mode 100644 templates/ecommerce/src/payload/seed/home-static.ts delete mode 100644 templates/ecommerce/src/payload/seed/home.ts delete mode 100644 templates/ecommerce/src/payload/seed/image-1.jpg delete mode 100644 templates/ecommerce/src/payload/seed/image-1.ts delete mode 100644 templates/ecommerce/src/payload/seed/image-2.jpg delete mode 100644 templates/ecommerce/src/payload/seed/image-2.ts delete mode 100644 templates/ecommerce/src/payload/seed/image-3.jpg delete mode 100644 templates/ecommerce/src/payload/seed/image-3.ts delete mode 100644 templates/ecommerce/src/payload/seed/index.ts delete mode 100644 templates/ecommerce/src/payload/seed/product-1.ts delete mode 100644 templates/ecommerce/src/payload/seed/product-2.ts delete mode 100644 templates/ecommerce/src/payload/seed/product-3.ts delete mode 100644 templates/ecommerce/src/payload/seed/products-page.ts delete mode 100644 templates/ecommerce/src/payload/stripe/webhooks/priceUpdated.ts delete mode 100644 templates/ecommerce/src/payload/stripe/webhooks/productUpdated.ts delete mode 100644 templates/ecommerce/src/payload/utilities/deepMerge.ts delete mode 100644 templates/ecommerce/src/payload/utilities/formatSlug.ts delete mode 100644 templates/ecommerce/src/payload/utilities/revalidate.ts delete mode 100644 templates/ecommerce/src/server.default.ts delete mode 100644 templates/ecommerce/src/server.ts delete mode 100644 templates/ecommerce/tsconfig.json delete mode 100644 templates/ecommerce/tsconfig.server.json delete mode 100644 templates/ecommerce/yarn.lock diff --git a/templates/ecommerce/.editorconfig b/templates/ecommerce/.editorconfig deleted file mode 100644 index d8e085abcb..0000000000 --- a/templates/ecommerce/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -end_of_line = lf -max_line_length = null diff --git a/templates/ecommerce/.env.example b/templates/ecommerce/.env.example deleted file mode 100644 index 6803b5ad26..0000000000 --- a/templates/ecommerce/.env.example +++ /dev/null @@ -1,31 +0,0 @@ -# Run on a specific port -PORT=3000 - -# Database connection string -DATABASE_URI=mongodb://127.0.0.1/payload-template-ecommerce - -# Used to encrypt JWT tokens -PAYLOAD_SECRET=YOUR_SECRET_HERE - -# Used to format links and URLs -PAYLOAD_PUBLIC_SERVER_URL=http://localhost:3000 -NEXT_PUBLIC_SERVER_URL=http://localhost:3000 - -# Enable Stripe integration -STRIPE_SECRET_KEY= -PAYLOAD_PUBLIC_STRIPE_IS_TEST_KEY=true -NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= - -# Enable Stripe webhooks (optional) -STRIPE_WEBHOOKS_SIGNING_SECRET= - -# Allow robots to index the site (optional) -NEXT_PUBLIC_IS_LIVE= - -# Used to preview drafts -PAYLOAD_PUBLIC_DRAFT_SECRET=demo-draft-secret -NEXT_PRIVATE_DRAFT_SECRET=demo-draft-secret - -# Used to revalidate static pages -REVALIDATION_KEY=demo-revalation-key -NEXT_PRIVATE_REVALIDATION_KEY=demo-revalation-key diff --git a/templates/ecommerce/.eslintrc.cjs b/templates/ecommerce/.eslintrc.cjs deleted file mode 100644 index cbb655ef53..0000000000 --- a/templates/ecommerce/.eslintrc.cjs +++ /dev/null @@ -1,38 +0,0 @@ -/** @type {import('eslint').Linter.Config} */ -module.exports = { - extends: ['plugin:@next/next/recommended', '@payloadcms'], - ignorePatterns: ['**/payload-types.ts'], - overrides: [ - { - extends: ['plugin:@typescript-eslint/disable-type-checked'], - files: ['*.js', '*.cjs', '*.json', '*.md', '*.yml', '*.yaml'], - }, - { - files: ['package.json', 'tsconfig.json'], - rules: { - 'perfectionist/sort-array-includes': 'off', - 'perfectionist/sort-astro-attributes': 'off', - 'perfectionist/sort-classes': 'off', - 'perfectionist/sort-enums': 'off', - 'perfectionist/sort-exports': 'off', - 'perfectionist/sort-imports': 'off', - 'perfectionist/sort-interfaces': 'off', - 'perfectionist/sort-jsx-props': 'off', - 'perfectionist/sort-keys': 'off', - 'perfectionist/sort-maps': 'off', - 'perfectionist/sort-named-exports': 'off', - 'perfectionist/sort-named-imports': 'off', - 'perfectionist/sort-object-types': 'off', - 'perfectionist/sort-objects': 'off', - 'perfectionist/sort-svelte-attributes': 'off', - 'perfectionist/sort-union-types': 'off', - 'perfectionist/sort-vue-attributes': 'off', - }, - }, - ], - parserOptions: { - project: ['./tsconfig.json'], - tsconfigRootDir: __dirname, - }, - root: true, -} diff --git a/templates/ecommerce/.gitignore b/templates/ecommerce/.gitignore deleted file mode 100644 index 1bbe951cc3..0000000000 --- a/templates/ecommerce/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -build -dist -/media -node_modules -.DS_Store -.env -.next -.vercel diff --git a/templates/ecommerce/.prettierignore b/templates/ecommerce/.prettierignore deleted file mode 100644 index 996b10e158..0000000000 --- a/templates/ecommerce/.prettierignore +++ /dev/null @@ -1,14 +0,0 @@ -**/payload-types.ts -.tmp -**/.git -**/.hg -**/.pnp.* -**/.svn -**/.yarn/** -**/build -**/dist/** -**/node_modules -**/temp -**/docs/** -tsconfig.json - diff --git a/templates/ecommerce/.prettierrc.json b/templates/ecommerce/.prettierrc.json deleted file mode 100644 index cb8ee2671d..0000000000 --- a/templates/ecommerce/.prettierrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "printWidth": 100, - "semi": false -} diff --git a/templates/ecommerce/.vscode/launch.json b/templates/ecommerce/.vscode/launch.json deleted file mode 100644 index 35316d56d8..0000000000 --- a/templates/ecommerce/.vscode/launch.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "command": "yarn dev", - "name": "Debug Ecommerce", - "request": "launch", - "type": "node-terminal" - } - ] -} diff --git a/templates/ecommerce/Dockerfile b/templates/ecommerce/Dockerfile deleted file mode 100644 index 27ace7fb4c..0000000000 --- a/templates/ecommerce/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM node:18.8-alpine as base - -FROM base as builder - -WORKDIR /home/node/app -COPY package*.json ./ - -COPY . . -RUN yarn install -RUN yarn build - -FROM base as runtime - -ENV NODE_ENV=production -ENV PAYLOAD_CONFIG_PATH=dist/payload.config.js - -WORKDIR /home/node/app -COPY package*.json ./ -COPY yarn.lock ./ - -RUN yarn install --production -COPY --from=builder /home/node/app/dist ./dist -COPY --from=builder /home/node/app/build ./build - -EXPOSE 3000 - -CMD ["node", "dist/server.js"] diff --git a/templates/ecommerce/README.md b/templates/ecommerce/README.md deleted file mode 100644 index 9fb2481aab..0000000000 --- a/templates/ecommerce/README.md +++ /dev/null @@ -1,329 +0,0 @@ -# Payload E-Commerce Template - -This is the official [Payload E-Commerce Template](https://github.com/payloadcms/payload/blob/main/templates/ecommerce). Use it to power e-commerce businesses and online stores of all sizes. This repo includes a fully-working backend, enterprise-grade admin panel, and a beautifully designed, production-ready website. - -This template is right for you if you are selling: - -- Physical products like clothing or merchandise -- Digital assets like ebooks or videos -- Access to content like courses or premium articles - -Core features: - -- [Pre-configured Payload Config](#how-it-works) -- [Authentication](#users-authentication) -- [Access Control](#access-control) -- [Shopping Cart](#shopping-cart) -- [Checkout](#checkout) -- [Paywall](#paywall) -- [Layout Builder](#layout-builder) -- [SEO](#seo) -- [Website](#website) - -## Quick Start - -To spin up this example locally, follow these steps: - -### Clone - -If you have not done so already, you need to have standalone copy of this repo on your machine. If you've already cloned this repo, skip to [Development](#development). - -#### Method 1 (recommended) - -Go to Payload Cloud and [clone this template](https://payloadcms.com/new/clone/ecommerce). This will create a new repository on your GitHub account with this template's code which you can then clone to your own machine. - -#### Method 2 - -Use the `create-payload-app` CLI to clone this template directly to your machine: - - npx create-payload-app@latest my-project -t ecommerce - -#### Method 3 - -Use the `git` CLI to clone this template directly to your machine: - - git clone -n --depth=1 --filter=tree:0 https://github.com/payloadcms/payload my-project && cd my-project && git sparse-checkout set --no-cone templates/ecommerce && git checkout && rm -rf .git && git init && git add . && git mv -f templates/ecommerce/{.,}* . && git add . && git commit -m "Initial commit" - -### Development - -1. First [clone the repo](#clone) if you have not done so already -1. `cd my-project && cp .env.example .env` to copy the example environment variables -1. `yarn && yarn dev` to install dependencies and start the dev server -1. `open http://localhost:3000` to open the app in your browser - -That's it! Changes made in `./src` will be reflected in your app. Follow the on-screen instructions to login and create your first admin user. To begin accepting payment, follow the [Stripe](#stripe) guide. Then check out [Production](#production) once you're ready to build and serve your app, and [Deployment](#deployment) when you're ready to go live. - -## How it works - -The Payload config is tailored specifically to the needs of most e-commerce businesses. It is pre-configured in the following ways: - -### Collections - -See the [Collections](https://payloadcms.com/docs/configuration/collections) docs for details on how to extend this functionality. - -- #### Users (Authentication) - - Users are auth-enabled and encompass both admins and customers based on the value of their `roles` field. Only `admin` users can access your admin panel to manage your store whereas `customer` can authenticate on your front-end to create [shopping carts](#shopping-cart) and place [orders](#orders) but have limited access to the platform. See [Access Control](#access-control) for more details. - - For additional help, see the official [Auth Example](https://github.com/payloadcms/payload/tree/main/examples/auth) or the [Authentication](https://payloadcms.com/docs/authentication/overview#authentication-overview) docs. - -- #### Products - - Products are linked to Stripe via a custom select field that is dynamically populated in the sidebar of each product. This field fetches all available products in the background and displays them as options. Once a product has been selected, prices get automatically synced between Stripe and Payload through [Payload Hooks](https://payloadcms.com/docs/hooks) and [Stripe Webhooks](https://stripe.com/docs/webhooks). See [Stripe](#stripe) for more details. - - All products are layout builder enabled so you can generate unique pages for each product using layout building blocks, see [Layout Builder](#layout-builder) for more details. - - Products can also restrict access to content or digital assets behind a paywall (gated content), see [Paywall](#paywall) for more details. - -- #### Orders - - Orders are created when a user successfully completes a checkout. They contain all the data about the order including the products purchased, the total price, and the user who placed the order. See [Checkout](#checkout) for more details. - -- #### Pages - - All pages are layout builder enabled so you can generate unique layouts for each page using layout-building blocks, see [Layout Builder](#layout-builder) for more details. - -- #### Media - - This is the uploads enabled collection used by products and pages to contain media like images, videos, downloads, and other assets. - -- #### Categories - - A taxonomy used to group products together. Categories can be nested inside of one another, for example "Courses > Technology". See the official [Payload Nested Docs Plugin](https://github.com/payloadcms/plugin-nested-docs) for more details. - -### Globals - -See the [Globals](https://payloadcms.com/docs/configuration/globals) docs for details on how to extend this functionality. - -- `Header` - - The data required by the header on your front-end like nav links. - -- `Footer` - - Same as above but for the footer of your site. - -## Access control - -Basic role-based access control is setup to determine what users can and cannot do based on their roles, which are: - -- `admin`: They can access the Payload admin panel to manage your store. They can see all data and make all operations. -- `customer`: They cannot access the Payload admin panel and can perform limited operations based on their user (see below). - -This applies to each collection in the following ways: - -- `users`: Only admins and the user themselves can access their profile. Anyone can create a user but only admins can delete users. -- `products`: Everyone can access products, but only admins can create, update, or delete them. Paywall-enabled products may also have content that is only accessible to only users who have purchased the product. See [Paywall](#paywall) for more details. - -For more details on how to extend this functionality, see the [Payload Access Control](https://payloadcms.com/docs/access-control/overview#access-control) docs. - -## Shopping cart - -Logged-in users can have their shopping carts saved to their profiles as they shop. This way they can continue shopping at a later date or on another device. When not logged in, the cart can be saved to local storage and synced to Payload on the next login. This works by maintaining a `cart` field on the `user`: - -```ts -{ - name: 'cart', - label: 'Shopping Cart', - type: 'object', - fields: [ - { - name: 'items', - label: 'Items', - type: 'array', - fields: [ - // product, quantity, etc - ] - }, - // other metadata like `createdOn`, etc - ] -} -``` - -## Stripe - -Payload itself handles no currency exchange. All payments are processed and billed using [Stripe](https://stripe.com). This means you must have access to a Stripe account via an API key, see [Connect Stripe](#connect-stripe) for how to get one. When you create a product in Payload that you wish to sell, it must be connected to a Stripe product by selecting one from the field in the product's sidebar, see [Products](#products) for more details. Once set, data is automatically synced between the two platforms in the following ways: - -1. Stripe to Payload using [Stripe Webhooks](https://stripe.com/docs/webhooks): - - - `product.created` - - `product.updated` - - `price.updated` - -1. Payload to Stripe using [Payload Hooks](https://payloadcms.com/docs/hooks/overview): - - `user.create` - -For more details on how to extend this functionality, see the the official [Payload Stripe Plugin](https://github.com/payloadcms/plugin-stripe). - -### Connect Stripe - -To integrate with Stripe, follow these steps: - -1. You will first need to create a [Stripe](https://stripe.com) account if you do not already have one. -1. Retrieve your [Stripe API keys](https://dashboard.stripe.com/test/apikeys) and paste them into your `env`: - ```bash - STRIPE_SECRET_KEY= - NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= - ``` -1. In another terminal, listen for webhooks (optional): - ```bash - stripe login # follow the prompts - yarn stripe:webhooks - ``` -1. Paste the given webhook signing secret into your `env`: - ```bash - STRIPE_WEBHOOKS_SIGNING_SECRET= - ``` -1. Reboot Payload to ensure that Stripe connects and the webhooks are registered. - -## Checkout - -A custom endpoint is opened at `POST /api/create-payment-intent` which initiates the checkout process. This endpoint totals your cart and creates a [Stripe Payment Intent](https://stripe.com/docs/payments/payment-intents). The total price is recalculated on the server to ensure accuracy and security, and once completed, passes the `client_secret` back in the response for your front-end to finalize the payment. Once the payment has succeeded, an [Order](#orders) will be created in Payload with a `stripePaymentIntentID`. Each purchased product will be recorded to the user's profile, and the user's cart will be automatically cleared. - -## Paywall - -Products can optionally restrict access to content or digital assets behind a paywall. This will require the product to be purchased before it's data and resources are accessible. To do this, a `purchases` field is maintained on each user to track their purchase history: - -```ts -{ - name: 'purchases', - label: 'Purchases', - type: 'array', - fields: [ - { - name: 'product', - label: 'Product', - type: 'relationship', - relationTo: 'products', - }, - // other metadata like `createdOn`, etc - ] -} -``` - -Then, a `paywall` field is added to the `product` with `read` access control set to check for associated purchases. Every time a user requests a product, this will only return data to those who have purchased it: - -```ts -{ - name: 'paywall', - label: 'Paywall', - type: 'blocks', - access: { - read: checkUserPurchases, - }, - fields: [ - // assets - ] -} -``` - -## Layout Builder - -Create unique product and page layouts for any type fo content using a powerful layout builder. This template comes pre-configured with the following layout building blocks: - -- Hero -- Content -- Media -- Call To Action -- Archive - -Each block is fully designed and built into the front-end website that comes with this template. See [Website](#website) for more details. - -## Draft Preview - -All pages and products are draft-enabled so you can preview them before publishing them to your website. To do this, these collections use [Versions](https://payloadcms.com/docs/configuration/collections#versions) with `drafts` set to `true`. This means that when you create a new page or product, it will be saved as a draft and will not be visible on your website until you publish it. This also means that you can preview your draft before publishing it to your website. To do this, we automatically format a custom URL which redirects to your front-end to securely fetch the draft version of your content. - -Since the front-end of this template is statically generated, this also means that pages and products will need to be regenerated as changes are made to published documents. To do this, we use an `afterChange` hook to regenerate the front-end when a document has changed and its `_status` is `published`. - -For more details on how to extend this functionality, see the official [Draft Preview Example](https://github.com/payloadcms/payload/tree/main/examples/draft-preview). - -## SEO - -This template comes pre-configured with the official [Payload SEO Plugin](https://github.com/payloadcms/plugin-seo) for complete SEO control from the admin panel. All SEO data is fully integrated into the front-end website that comes with this template. See [Website](#website) for more details. - -## Redirects - -If you are migrating an existing site or moving content to a new URL, you can use the `redirects` collection to create a proper redirect from old URLs to new ones. This will ensure that proper request status codes are returned to search engines and that your users are not left with a broken link. This template comes pre-configured with the official [Payload Redirects Plugin](https://github.com/payloadcms/plugin-redirects) for complete redirect control from the admin panel. All redirects are fully integrated into the front-end website that comes with this template. See [Website](#website) for more details. - -## Website - -This template includes a beautifully designed, production-ready front-end built with the [Next.js App Router](https://nextjs.org), served right alongside your Payload app in a single Express server. This makes is so that you can deploy both apps simultaneously and host them together. If you prefer a different front-end framework, this pattern works for any framework that supports a custom server. If you prefer to host your website separately from Payload, you can easily [Eject](#eject) the front-end out from this template to swap in your own, or to use it as a standalone CMS. For more details, see the official [Custom Server Example](https://github.com/payloadcms/payload/tree/main/examples/custom-server). - -Core features: - -- [Next.js App Router](https://nextjs.org) -- [Stripe](https://stripe.com) -- [GraphQL](https://graphql.org) -- [TypeScript](https://www.typescriptlang.org) -- [React Hook Form](https://react-hook-form.com) -- [Payload Admin Bar](https://github.com/payloadcms/payload-admin-bar) -- Authentication -- Publication workflow -- Shopping cart -- Checkout -- Customer accounts -- Dark mode -- Pre-made layout building blocks -- SEO -- Redirects -- Paywall - -### Cache - -Although Next.js includes a robust set of caching strategies out of the box, Payload Cloud proxies and caches all files through Cloudflare using the [Official Cloud Plugin](https://github.com/payloadcms/plugin-cloud). This means that Next.js caching is not needed and is disabled by default. If you are hosting your app outside of Payload Cloud, you can easily reenable the Next.js caching mechanisms by removing the `no-store` directive from all fetch requests in `./src/app/_api` and then removing all instances of `export const dynamic = 'force-dynamic'` from pages files, such as `./src/app/(pages)/[slug]/page.tsx`. For more details, see the official [Next.js Caching Docs](https://nextjs.org/docs/app/building-your-application/caching). - -### Eject - -If you prefer another front-end framework or would like to use Payload as a standalone CMS, you can easily eject the front-end from this template. To eject, simply run `yarn eject`. This will uninstall all Next.js related dependencies and delete all files and folders related to the Next.js front-end. It also removes all custom routing from your `server.ts` file and updates your `eslintrc.js`. - -> Note: Your eject script may not work as expected if you've made significant modifications to your project. If you run into any issues, compare your project's dependencies and file structure with this template. See [./src/eject](./src/eject) for full details. - -For more details on how setup a custom server, see the official [Custom Server Example](https://github.com/payloadcms/payload/tree/main/examples/custom-server). - -## Development - -To spin up this example locally, follow the [Quick Start](#quick-start). Then [Connect Stripe](#connect-stripe) to enable payments, and [Seed](#seed) the database with a few products and pages. - -### Docker - -Alternatively, you can use [Docker](https://www.docker.com) to spin up this template locally. To do so, follow these steps: - -1. Follow [steps 1 and 2 from above](#development), the docker-compose file will automatically use the `.env` file in your project root -1. Next run `docker-compose up` -1. Follow [steps 4 and 5 from above](#development) to login and create your first admin user - -That's it! The Docker instance will help you get up and running quickly while also standardizing the development environment across your teams. - -### Seed - -To seed the database with a few products and pages you can run `yarn seed`. This template also comes with a `GET /api/seed` endpoint you can use to seed the database from the admin panel. - -> NOTICE: seeding the database is destructive because it drops your current database to populate a fresh one from the seed template. Only run this command if you are starting a new project or can afford to lose your current data. - -### Conflicting routes - -> In a monorepo when routes are bootstrapped to the same host, they can conflict with Payload's own routes if they have the same name. In our template we've named the Nextjs API routes to `next` to avoid this conflict. -> -> This can happen with any other routes conflicting with Payload such as `admin` and we recommend using different names for custom routes. -> Alternatively you can also rename Payload's own routes via the [configuration](https://payloadcms.com/docs/configuration/overview). - -## Production - -To run Payload in production, you need to build and serve the Admin panel. To do so, follow these steps: - -1. Invoke the `payload build` script by running `yarn build` or `npm run build` in your project root. This creates a `./build` directory with a production-ready admin bundle. -1. Finally run `yarn serve` or `npm run serve` to run Node in production and serve Payload from the `./build` directory. -1. When you're ready to go live, see [Deployment](#deployment) for more details. - -### Deployment - -Before deploying your app, you need to: - -1. Switch [your Stripe account to live mode](https://stripe.com/docs/test-mode) and update your [Stripe API keys](https://dashboard.stripe.com/test/apikeys). See [Connect Stripe](#connect-stripe) for more details. -1. Ensure your app builds and serves in production. See [Production](#production) for more details. - -The easiest way to deploy your project is to use [Payload Cloud](https://payloadcms.com/new/import), a one-click hosting solution to deploy production-ready instances of your Payload apps directly from your GitHub repo. You can also deploy your app manually, check out the [deployment documentation](https://payloadcms.com/docs/production/deployment) for full details. - -## Questions - -If you have any issues or questions, reach out to us on [Discord](https://discord.com/invite/payload) or start a [GitHub discussion](https://github.com/payloadcms/payload/discussions). diff --git a/templates/ecommerce/csp.js b/templates/ecommerce/csp.js deleted file mode 100644 index 84b18d17bd..0000000000 --- a/templates/ecommerce/csp.js +++ /dev/null @@ -1,36 +0,0 @@ -const policies = { - 'child-src': ["'self'"], - 'connect-src': [ - "'self'", - 'https://checkout.stripe.com', - 'https://api.stripe.com', - 'https://maps.googleapis.com', - ], - 'default-src': ["'self'"], - 'font-src': ["'self'"], - 'frame-src': [ - "'self'", - 'https://checkout.stripe.com', - 'https://js.stripe.com', - 'https://hooks.stripe.com', - ], - 'img-src': ["'self'", 'https://*.stripe.com', 'https://raw.githubusercontent.com'], - 'script-src': [ - "'self'", - "'unsafe-inline'", - "'unsafe-eval'", - 'https://checkout.stripe.com', - 'https://js.stripe.com', - 'https://maps.googleapis.com', - ], - 'style-src': ["'self'", "'unsafe-inline'", 'https://fonts.googleapis.com'], -} - -module.exports = Object.entries(policies) - .map(([key, value]) => { - if (Array.isArray(value)) { - return `${key} ${value.join(' ')}` - } - return '' - }) - .join('; ') diff --git a/templates/ecommerce/docker-compose.yml b/templates/ecommerce/docker-compose.yml deleted file mode 100644 index 4c9fc51940..0000000000 --- a/templates/ecommerce/docker-compose.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: '3' - -services: - payload: - image: node:18-alpine - ports: - - '3000:3000' - volumes: - - .:/home/node/app - - node_modules:/home/node/app/node_modules - working_dir: /home/node/app/ - command: sh -c "yarn install && yarn dev" - depends_on: - - mongo - env_file: - - .env - - mongo: - image: mongo:latest - ports: - - '27017:27017' - command: - - --storageEngine=wiredTiger - volumes: - - data:/data/db - logging: - driver: none - -volumes: - data: - node_modules: diff --git a/templates/ecommerce/eject.ts b/templates/ecommerce/eject.ts deleted file mode 100644 index f3f119dd5b..0000000000 --- a/templates/ecommerce/eject.ts +++ /dev/null @@ -1,36 +0,0 @@ -import fs from 'fs' -import path from 'path' - -// Run this script to eject the front-end from this template -// This will remove all template-specific files and directories -// See `yarn eject` in `package.json` for the exact command -// See `./README.md#eject` for more information - -const files = ['./next.config.js', './next-env.d.ts', './redirects.js'] -const directories = ['./src/app'] - -const eject = async (): Promise => { - files.forEach((file) => { - fs.unlinkSync(path.join(__dirname, file)) - }) - - directories.forEach((directory) => { - fs.rm(path.join(__dirname, directory), { recursive: true }, (err) => { - if (err) throw err - }) - }) - - // create a new `./src/server.ts` file - // use contents from `./src/server.default.ts` - const serverFile = path.join(__dirname, './src/server.ts') - const serverDefaultFile = path.join(__dirname, './src/server.default.ts') - fs.copyFileSync(serverDefaultFile, serverFile) - - // remove `'plugin:@next/next/recommended', ` from `./.eslintrc.js` - const eslintConfigFile = path.join(__dirname, './.eslintrc.js') - const eslintConfig = fs.readFileSync(eslintConfigFile, 'utf8') - const updatedEslintConfig = eslintConfig.replace(`'plugin:@next/next/recommended', `, '') - fs.writeFileSync(eslintConfigFile, updatedEslintConfig, 'utf8') -} - -eject() diff --git a/templates/ecommerce/next-env.d.ts b/templates/ecommerce/next-env.d.ts deleted file mode 100644 index 4f11a03dc6..0000000000 --- a/templates/ecommerce/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/templates/ecommerce/next.config.js b/templates/ecommerce/next.config.js deleted file mode 100644 index 4f068b477a..0000000000 --- a/templates/ecommerce/next.config.js +++ /dev/null @@ -1,50 +0,0 @@ -/** @type {import('next').NextConfig} */ -const ContentSecurityPolicy = require('./csp') -const redirects = require('./redirects') - -const nextConfig = { - async headers() { - const headers = [] - - // Prevent search engines from indexing the site if it is not live - // This is useful for staging environments before they are ready to go live - // To allow robots to crawl the site, use the `NEXT_PUBLIC_IS_LIVE` env variable - // You may want to also use this variable to conditionally render any tracking scripts - if (!process.env.NEXT_PUBLIC_IS_LIVE) { - headers.push({ - headers: [ - { - key: 'X-Robots-Tag', - value: 'noindex', - }, - ], - source: '/:path*', - }) - } - - // Set the `Content-Security-Policy` header as a security measure to prevent XSS attacks - // It works by explicitly whitelisting trusted sources of content for your website - // This will block all inline scripts and styles except for those that are allowed - headers.push({ - headers: [ - { - key: 'Content-Security-Policy', - value: ContentSecurityPolicy, - }, - ], - source: '/(.*)', - }) - - return headers - }, - images: { - domains: ['localhost', process.env.NEXT_PUBLIC_SERVER_URL] - .filter(Boolean) - .map((url) => url.replace(/https?:\/\//, '')), - }, - reactStrictMode: true, - redirects, - swcMinify: true, -} - -module.exports = nextConfig diff --git a/templates/ecommerce/nodemon.json b/templates/ecommerce/nodemon.json deleted file mode 100644 index f94c3a7eef..0000000000 --- a/templates/ecommerce/nodemon.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/nodemon.json", - "exec": "ts-node --project tsconfig.server.json src/server.ts -- -I", - "ext": "js ts", - "ignore": ["src/app"], - "stdin": false, - "watch": ["server.ts"] -} diff --git a/templates/ecommerce/package.json b/templates/ecommerce/package.json deleted file mode 100644 index 3ff124cc28..0000000000 --- a/templates/ecommerce/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "@payloadcms/template-ecommerce", - "version": "1.0.0", - "description": "E-commerce template for Payload", - "license": "MIT", - "main": "dist/server.js", - "scripts": { - "build": "cross-env NODE_ENV=production yarn build:payload && yarn build:server && yarn copyfiles && yarn build:next", - "build:next": "cross-env PAYLOAD_CONFIG_PATH=dist/payload/payload.config.js NEXT_BUILD=true node dist/server.js", - "build:payload": "cross-env PAYLOAD_CONFIG_PATH=src/payload/payload.config.ts payload build", - "build:server": "tsc --project tsconfig.server.json", - "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,js}\" dist/", - "dev": "cross-env PAYLOAD_CONFIG_PATH=src/payload/payload.config.ts nodemon", - "eject": "yarn remove next react react-dom @next/eslint-plugin-next && ts-node eject.ts", - "generate:graphQLSchema": "PAYLOAD_CONFIG_PATH=src/payload/payload.config.ts payload generate:graphQLSchema", - "generate:types": "cross-env PAYLOAD_CONFIG_PATH=src/payload/payload.config.ts payload generate:types", - "lint": "eslint src", - "lint:fix": "eslint --fix --ext .ts,.tsx src", - "payload": "cross-env PAYLOAD_CONFIG_PATH=src/payload/payload.config.ts payload", - "seed": "rm -rf media && cross-env PAYLOAD_SEED=true PAYLOAD_DROP_DATABASE=true PAYLOAD_CONFIG_PATH=src/payload/payload.config.ts ts-node src/server.ts", - "serve": "cross-env PAYLOAD_CONFIG_PATH=dist/payload/payload.config.js NODE_ENV=production node dist/server.js", - "stripe:webhooks": "stripe listen --forward-to localhost:8000/stripe/webhooks" - }, - "dependencies": { - "@payloadcms/bundler-webpack": "^1.0.0", - "@payloadcms/db-mongodb": "^1.0.0", - "@payloadcms/plugin-cloud": "^3.0.0", - "@payloadcms/plugin-nested-docs": "^1.0.8", - "@payloadcms/plugin-redirects": "^1.0.0", - "@payloadcms/plugin-seo": "^1.0.10", - "@payloadcms/plugin-stripe": "^0.0.19", - "@payloadcms/richtext-slate": "^1.0.0", - "@stripe/react-stripe-js": "^1.16.3", - "@stripe/stripe-js": "^1.46.0", - "cross-env": "^7.0.3", - "dotenv": "^8.2.0", - "escape-html": "^1.0.3", - "express": "^4.17.1", - "next": "13.5.2", - "payload": "^2.0.7", - "payload-admin-bar": "^1.0.6", - "qs": "6.11.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "7.45.4", - "react-router-dom": "5.3.4", - "stripe": "^10.2.0" - }, - "devDependencies": { - "@next/eslint-plugin-next": "^13.1.6", - "@payloadcms/eslint-config": "^1.1.1", - "@swc/core": "1.3.76", - "@types/escape-html": "^1.0.2", - "@types/express": "^4.17.9", - "@types/node": "18.11.3", - "@types/qs": "^6.9.8", - "@types/react": "18.0.21", - "copyfiles": "^2.4.1", - "nodemon": "^2.0.6", - "prettier": "^3.0.3", - "slate": "0.91.4", - "ts-node": "10.9.1", - "typescript": "^4.8.4" - } -} diff --git a/templates/ecommerce/public/favicon.ico b/templates/ecommerce/public/favicon.ico deleted file mode 100644 index 601b77718ca588b59f2ff9da3cb5039856844e5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17223 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 diff --git a/templates/ecommerce/public/favicon.svg b/templates/ecommerce/public/favicon.svg deleted file mode 100644 index 86dc2defc4..0000000000 --- a/templates/ecommerce/public/favicon.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/templates/ecommerce/public/static-image.jpg b/templates/ecommerce/public/static-image.jpg deleted file mode 100644 index ae614855dc6633efe9fe1ff7da0de732becc945b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93586 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 diff --git a/templates/ecommerce/redirects.js b/templates/ecommerce/redirects.js deleted file mode 100644 index 9e81b7095c..0000000000 --- a/templates/ecommerce/redirects.js +++ /dev/null @@ -1,81 +0,0 @@ -// Note: This will not work in dev mode and will throw an error upon startup -// This is because the Payload APIs are not yet running when the Next.js server starts -// This is not a problem in production as Payload is booted up before building Next.js -// For this reason the errors can be silently ignored in dev mode - -module.exports = async () => { - const internetExplorerRedirect = { - destination: '/ie-incompatible.html', - has: [ - { - type: 'header', - key: 'user-agent', - value: '(.*Trident.*)', // all ie browsers - }, - ], - permanent: false, - source: '/:path((?!ie-incompatible.html$).*)', // all pages except the incompatibility page - } - - try { - const redirectsRes = await fetch( - `${process.env.NEXT_PUBLIC_SERVER_URL}/api/redirects?limit=1000&depth=1`, - ) - - const redirectsData = await redirectsRes.json() - const { docs } = redirectsData - - let dynamicRedirects = [] - - if (docs) { - docs.forEach((doc) => { - const { from, to: { type, reference, url } = {} } = doc - - let source = from - .replace(process.env.NEXT_PUBLIC_SERVER_URL, '') - .split('?')[0] - .toLowerCase() - - if (source.endsWith('/')) source = source.slice(0, -1) // a trailing slash will break this redirect - - let destination = '/' - - if (type === 'custom' && url) { - destination = url.replace(process.env.NEXT_PUBLIC_SERVER_URL, '') - } - - if ( - type === 'reference' && - typeof reference.value === 'object' && - reference?.value?._status === 'published' - ) { - destination = `${process.env.NEXT_PUBLIC_SERVER_URL}/${ - reference.relationTo !== 'pages' ? `${reference.relationTo}/` : '' - }${reference.value.slug}` - } - - const redirect = { - destination, - permanent: true, - source, - } - - if (source.startsWith('/') && destination && source !== destination) { - return dynamicRedirects.push(redirect) - } - - return - }) - } - - const redirects = [internetExplorerRedirect, ...dynamicRedirects] - - return redirects - } catch (error) { - if (process.env.NODE_ENV === 'production') { - console.error(`Error configuring redirects: ${error}`) // eslint-disable-line no-console - } - - return [] - } -} diff --git a/templates/ecommerce/src/app/(pages)/[slug]/page.tsx b/templates/ecommerce/src/app/(pages)/[slug]/page.tsx deleted file mode 100644 index 97ce360bf9..0000000000 --- a/templates/ecommerce/src/app/(pages)/[slug]/page.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import type { Metadata } from 'next' - -import { draftMode } from 'next/headers' -import { notFound } from 'next/navigation' -import React from 'react' - -import type { Page } from '../../../payload/payload-types' - -import { staticHome } from '../../../payload/seed/home-static' -import { fetchDoc } from '../../_api/fetchDoc' -import { fetchDocs } from '../../_api/fetchDocs' -import { Blocks } from '../../_components/Blocks' -import { Hero } from '../../_components/Hero' -import { generateMeta } from '../../_utilities/generateMeta' - -// Payload Cloud caches all files through Cloudflare, so we don't need Next.js to cache them as well -// This means that we can turn off Next.js data caching and instead rely solely on the Cloudflare CDN -// To do this, we include the `no-cache` header on the fetch requests used to get the data for this page -// But we also need to force Next.js to dynamically render this page on each request for preview mode to work -// See https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic -// If you are not using Payload Cloud then this line can be removed, see `../../../README.md#cache` -export const dynamic = 'force-dynamic' - -export default async function Page({ params: { slug = 'home' } }) { - const { isEnabled: isDraftMode } = draftMode() - - let page: Page | null = null - - try { - page = await fetchDoc({ - slug, - collection: 'pages', - draft: isDraftMode, - }) - } catch (error) { - // when deploying this template on Payload Cloud, this page needs to build before the APIs are live - // so swallow the error here and simply render the page with fallback data where necessary - // in production you may want to redirect to a 404 page or at least log the error somewhere - // console.error(error) - } - - // if no `home` page exists, render a static one using dummy content - // you should delete this code once you have a home page in the CMS - // this is really only useful for those who are demoing this template - if (!page && slug === 'home') { - page = staticHome - } - - if (!page) { - return notFound() - } - - const { hero, layout } = page - - return ( - - - - - ) -} - -export async function generateStaticParams() { - try { - const pages = await fetchDocs('pages') - return pages?.map(({ slug }) => slug) - } catch (error) { - return [] - } -} - -export async function generateMetadata({ params: { slug = 'home' } }): Promise { - const { isEnabled: isDraftMode } = draftMode() - - let page: Page | null = null - - try { - page = await fetchDoc({ - slug, - collection: 'pages', - draft: isDraftMode, - }) - } catch (error) { - // don't throw an error if the fetch fails - // this is so that we can render a static home page for the demo - // when deploying this template on Payload Cloud, this page needs to build before the APIs are live - // in production you may want to redirect to a 404 page or at least log the error somewhere - } - - if (!page && slug === 'home') { - page = staticHome - } - - return generateMeta({ doc: page }) -} diff --git a/templates/ecommerce/src/app/(pages)/account/AccountForm/index.module.scss b/templates/ecommerce/src/app/(pages)/account/AccountForm/index.module.scss deleted file mode 100644 index 9798e6489c..0000000000 --- a/templates/ecommerce/src/app/(pages)/account/AccountForm/index.module.scss +++ /dev/null @@ -1,24 +0,0 @@ -@import '../../../_css/common'; - -.form { - margin-bottom: var(--base); - display: flex; - flex-direction: column; - gap: calc(var(--base) / 2); - align-items: flex-start; - width: 66.66%; - - @include mid-break { - width: 100%; - } -} - -.changePassword { - all: unset; - cursor: pointer; - text-decoration: underline; -} - -.submit { - margin-top: calc(var(--base) / 2); -} diff --git a/templates/ecommerce/src/app/(pages)/account/AccountForm/index.tsx b/templates/ecommerce/src/app/(pages)/account/AccountForm/index.tsx deleted file mode 100644 index 95c7783c5c..0000000000 --- a/templates/ecommerce/src/app/(pages)/account/AccountForm/index.tsx +++ /dev/null @@ -1,161 +0,0 @@ -'use client' - -import { useRouter } from 'next/navigation' -import React, { Fragment, useCallback, useEffect, useRef, useState } from 'react' -import { useForm } from 'react-hook-form' - -import { Button } from '../../../_components/Button' -import { Input } from '../../../_components/Input' -import { Message } from '../../../_components/Message' -import { useAuth } from '../../../_providers/Auth' -import classes from './index.module.scss' - -type FormData = { - email: string - name: string - password: string - passwordConfirm: string -} - -const AccountForm: React.FC = () => { - const [error, setError] = useState('') - const [success, setSuccess] = useState('') - const { setUser, user } = useAuth() - const [changePassword, setChangePassword] = useState(false) - - const { - formState: { errors, isLoading }, - handleSubmit, - register, - reset, - watch, - } = useForm() - - const password = useRef({}) - password.current = watch('password', '') - - const router = useRouter() - - const onSubmit = useCallback( - async (data: FormData) => { - if (user) { - const response = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/${user.id}`, { - // Make sure to include cookies with fetch - body: JSON.stringify(data), - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'PATCH', - }) - - if (response.ok) { - const json = await response.json() - setUser(json.doc) - setSuccess('Successfully updated account.') - setError('') - setChangePassword(false) - reset({ - name: json.doc.name, - email: json.doc.email, - password: '', - passwordConfirm: '', - }) - } else { - setError('There was a problem updating your account.') - } - } - }, - [user, setUser, reset], - ) - - useEffect(() => { - if (user === null) { - router.push( - `/login?error=${encodeURIComponent( - 'You must be logged in to view this page.', - )}&redirect=${encodeURIComponent('/account')}`, - ) - } - - // Once user is loaded, reset form to have default values - if (user) { - reset({ - name: user.name, - email: user.email, - password: '', - passwordConfirm: '', - }) - } - }, [user, router, reset, changePassword]) - - return ( -

- - {!changePassword ? ( - -

- {'Change your account details below, or '} - - {' to change your password.'} -

- - -
- ) : ( - -

- {'Change your password below, or '} - - . -

- - value === password.current || 'The passwords do not match'} - /> -
- )} -
-
- - Page {page} of {totalPages} - -
- - - ) -} diff --git a/templates/ecommerce/src/app/_components/PaywallBlocks/index.tsx b/templates/ecommerce/src/app/_components/PaywallBlocks/index.tsx deleted file mode 100644 index 2589464766..0000000000 --- a/templates/ecommerce/src/app/_components/PaywallBlocks/index.tsx +++ /dev/null @@ -1,121 +0,0 @@ -'use client' - -import Link from 'next/link' -import React, { useEffect } from 'react' - -import type { Page } from '../../../payload/payload-types' - -import { PRODUCT_PAYWALL } from '../../_graphql/products' -import { useAuth } from '../../_providers/Auth' -import { Blocks } from '../Blocks' -import { Gutter } from '../Gutter' -import { LoadingShimmer } from '../LoadingShimmer' -import { Message } from '../Message' -import { VerticalPadding } from '../VerticalPadding' - -export const PaywallBlocks: React.FC<{ - disableTopPadding?: boolean - productSlug: string -}> = (props) => { - const { disableTopPadding, productSlug } = props - const { user } = useAuth() - - const [isLoading, setIsLoading] = React.useState(false) - const [blocks, setBlocks] = React.useState() - const hasInitialized = React.useRef(false) - const isRequesting = React.useRef(false) - - useEffect(() => { - if (!user || hasInitialized.current || isRequesting.current) return - hasInitialized.current = true - isRequesting.current = true - - const start = Date.now() - - const getPaywallContent = async () => { - setIsLoading(true) - - try { - const paywall = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/graphql`, { - body: JSON.stringify({ - query: PRODUCT_PAYWALL, - variables: { - slug: productSlug, - }, - }), - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - ?.then((res) => res.json()) - ?.then((res) => res?.data?.Products.docs[0]?.paywall) - - if (paywall) { - setBlocks(paywall) - } - - // wait before setting `isLoading` to `false` to give the illusion of loading - // this is to prevent a flash of the loading shimmer on fast networks - const end = Date.now() - if (end - start < 1000) { - await new Promise((resolve) => setTimeout(resolve, 500 - (end - start))) - } - - setIsLoading(false) - } catch (error) { - console.error(error) // eslint-disable-line no-console - setIsLoading(false) - } - } - - getPaywallContent() - }, [user, productSlug]) - - if (user === undefined) { - return null - } - - if (user === null) { - return ( - - - - {`This content is gated behind a paywall. You must be `} - - logged in - - {` as an admin or have purchased this product to view this content.`} - - } - /> - - - ) - } - - if (isLoading) { - return ( - - - - - - ) - } - - if (!blocks || blocks.length === 0) { - return ( - - - - - - ) - } - - return -} diff --git a/templates/ecommerce/src/app/_components/Price/index.module.scss b/templates/ecommerce/src/app/_components/Price/index.module.scss deleted file mode 100644 index 1b31033fe7..0000000000 --- a/templates/ecommerce/src/app/_components/Price/index.module.scss +++ /dev/null @@ -1,29 +0,0 @@ -@import '../../_css/common'; - -.actions { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: calc(var(--base) / 2); - - @include mid-break { - flex-direction: column; - align-items: flex-start; - } -} - -.price { - font-weight: 600; - line-height: 1; - display: flex; - flex-direction: column; - gap: 4px; - - > * { - margin: 0; - } -} - -.priceBreakdown { - color: var(--theme-elevation-500); -} diff --git a/templates/ecommerce/src/app/_components/Price/index.tsx b/templates/ecommerce/src/app/_components/Price/index.tsx deleted file mode 100644 index 5dc31f5b57..0000000000 --- a/templates/ecommerce/src/app/_components/Price/index.tsx +++ /dev/null @@ -1,80 +0,0 @@ -'use client' - -import React, { useEffect, useState } from 'react' - -import type { Product } from '../../../payload/payload-types' - -import { AddToCartButton } from '../AddToCartButton' -import { RemoveFromCartButton } from '../RemoveFromCartButton' -import classes from './index.module.scss' - -export const priceFromJSON = (priceJSON: string, quantity: number = 1, raw?: boolean): string => { - let price = '' - - if (priceJSON) { - try { - const parsed = JSON.parse(priceJSON)?.data[0] - const priceValue = parsed.unit_amount * quantity - const priceType = parsed.type - - if (raw) return priceValue.toString() - - price = (priceValue / 100).toLocaleString('en-US', { - currency: 'USD', // TODO: use `parsed.currency` - style: 'currency', - }) - - if (priceType === 'recurring') { - price += `/${ - parsed.recurring.interval_count > 1 - ? `${parsed.recurring.interval_count} ${parsed.recurring.interval}` - : parsed.recurring.interval - }` - } - } catch (e) { - console.error(`Cannot parse priceJSON`) // eslint-disable-line no-console - } - } - - return price -} - -export const Price: React.FC<{ - button?: 'addToCart' | 'removeFromCart' | false - product: Product - quantity?: number -}> = (props) => { - const { button = 'addToCart', product, product: { priceJSON } = {}, quantity } = props - - const [price, setPrice] = useState<{ - actualPrice: string - withQuantity: string - }>(() => ({ - actualPrice: priceFromJSON(priceJSON), - withQuantity: priceFromJSON(priceJSON, quantity), - })) - - useEffect(() => { - setPrice({ - actualPrice: priceFromJSON(priceJSON), - withQuantity: priceFromJSON(priceJSON, quantity), - }) - }, [priceJSON, quantity]) - - return ( -
- {typeof price?.actualPrice !== 'undefined' && price?.withQuantity !== '' && ( -
-

{price?.withQuantity}

- {quantity > 1 && ( - {`${price.actualPrice} x ${quantity}`} - )} -
- )} - {button && button === 'addToCart' && ( - - )} - {button && button === 'removeFromCart' && } -
- ) -} diff --git a/templates/ecommerce/src/app/_components/RemoveFromCartButton/index.module.scss b/templates/ecommerce/src/app/_components/RemoveFromCartButton/index.module.scss deleted file mode 100644 index 2519bfea48..0000000000 --- a/templates/ecommerce/src/app/_components/RemoveFromCartButton/index.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../_css/common'; - -.removeFromCartButton { - all: unset; - cursor: pointer; - @extend %label; -} diff --git a/templates/ecommerce/src/app/_components/RemoveFromCartButton/index.tsx b/templates/ecommerce/src/app/_components/RemoveFromCartButton/index.tsx deleted file mode 100644 index b27e4ce4fa..0000000000 --- a/templates/ecommerce/src/app/_components/RemoveFromCartButton/index.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react' - -import type { Product } from '../../../payload/payload-types' - -import { useCart } from '../../_providers/Cart' -import classes from './index.module.scss' - -export const RemoveFromCartButton: React.FC<{ - className?: string - product: Product -}> = (props) => { - const { className, product } = props - - const { deleteItemFromCart, isProductInCart } = useCart() - - const productIsInCart = isProductInCart(product) - - if (!productIsInCart) { - return
Item is not in the cart
- } - - return ( - - ) -} diff --git a/templates/ecommerce/src/app/_components/RenderParams/Component.tsx b/templates/ecommerce/src/app/_components/RenderParams/Component.tsx deleted file mode 100644 index f911d35786..0000000000 --- a/templates/ecommerce/src/app/_components/RenderParams/Component.tsx +++ /dev/null @@ -1,51 +0,0 @@ -'use client' - -import { useSearchParams } from 'next/navigation' -import { useEffect } from 'react' - -import { Message } from '../Message' -import classes from './index.module.scss' - -export type Props = { - className?: string - message?: string - onParams?: (paramValues: ((null | string | undefined) | string[])[]) => void - params?: string[] -} - -export const RenderParamsComponent: React.FC = ({ - className, - onParams, - params = ['error', 'warning', 'success', 'message'], -}) => { - const searchParams = useSearchParams() - const paramValues = params.map((param) => searchParams?.get(param)) - - useEffect(() => { - if (paramValues.length && onParams) { - onParams(paramValues) - } - }, [paramValues, onParams]) - - if (paramValues.length) { - return ( -
- {paramValues.map((paramValue, index) => { - if (!paramValue) return null - - return ( - - ) - })} -
- ) - } - - return null -} diff --git a/templates/ecommerce/src/app/_components/RenderParams/index.module.scss b/templates/ecommerce/src/app/_components/RenderParams/index.module.scss deleted file mode 100644 index 69f05b9490..0000000000 --- a/templates/ecommerce/src/app/_components/RenderParams/index.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../_css/common.scss'; - -.renderParams { - margin-bottom: calc(var(--base) * 2); - - @include mid-break { - margin-bottom: var(--base); - } -} diff --git a/templates/ecommerce/src/app/_components/RenderParams/index.tsx b/templates/ecommerce/src/app/_components/RenderParams/index.tsx deleted file mode 100644 index dd8b1f9517..0000000000 --- a/templates/ecommerce/src/app/_components/RenderParams/index.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Suspense } from 'react' - -import type { Props } from './Component' - -import { RenderParamsComponent } from './Component' - -// Using `useSearchParams` from `next/navigation` causes the entire route to de-optimize into client-side rendering -// To fix this, we wrap the component in a `Suspense` component -// See https://nextjs.org/docs/messages/deopted-into-client-rendering for more info - -export const RenderParams: React.FC = (props) => { - return ( - - - - ) -} diff --git a/templates/ecommerce/src/app/_components/RichText/index.module.scss b/templates/ecommerce/src/app/_components/RichText/index.module.scss deleted file mode 100644 index ef45c8d903..0000000000 --- a/templates/ecommerce/src/app/_components/RichText/index.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -.richText { - :first-child { - margin-top: 0; - } - :last-child { - margin-bottom: 0; - } -} diff --git a/templates/ecommerce/src/app/_components/RichText/index.tsx b/templates/ecommerce/src/app/_components/RichText/index.tsx deleted file mode 100644 index b0b28080cb..0000000000 --- a/templates/ecommerce/src/app/_components/RichText/index.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' - -import classes from './index.module.scss' -import serialize from './serialize' - -const RichText: React.FC<{ className?: string; content: any }> = ({ className, content }) => { - if (!content) { - return null - } - - return ( -
- {serialize(content)} -
- ) -} - -export default RichText diff --git a/templates/ecommerce/src/app/_components/RichText/serialize.tsx b/templates/ecommerce/src/app/_components/RichText/serialize.tsx deleted file mode 100644 index b071b813d9..0000000000 --- a/templates/ecommerce/src/app/_components/RichText/serialize.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import escapeHTML from 'escape-html' -import Link from 'next/link' -import React, { Fragment } from 'react' -import { Text } from 'slate' - -import { Label } from '../Label' -import { LargeBody } from '../LargeBody' -import { CMSLink } from '../Link' - -// eslint-disable-next-line no-use-before-define -type Children = Leaf[] - -type Leaf = { - [key: string]: unknown - children?: Children - type: string - url?: string - value?: { - alt: string - url: string - } -} - -const serialize = (children?: Children): React.ReactNode[] => - children?.map((node, i) => { - if (Text.isText(node)) { - let text = - - if (node.bold) { - text = {text} - } - - if (node.code) { - text = {text} - } - - if (node.italic) { - text = {text} - } - - if (node.underline) { - text = ( - - {text} - - ) - } - - if (node.strikethrough) { - text = ( - - {text} - - ) - } - - return {text} - } - - if (!node) { - return null - } - - switch (node.type) { - case 'h1': - return

{serialize(node?.children)}

- case 'h2': - return

{serialize(node?.children)}

- case 'h3': - return

{serialize(node?.children)}

- case 'h4': - return

{serialize(node?.children)}

- case 'h5': - return
{serialize(node?.children)}
- case 'h6': - return
{serialize(node?.children)}
- case 'quote': - return
{serialize(node?.children)}
- case 'ul': - return
    {serialize(node?.children)}
- case 'ol': - return
    {serialize(node.children)}
- case 'li': - return
  • {serialize(node.children)}
  • - case 'link': - return ( - - {serialize(node?.children)} - - ) - - case 'label': - return - - case 'large-body': { - return {serialize(node?.children)} - } - - default: - return

    {serialize(node?.children)}

    - } - }) || [] - -export default serialize diff --git a/templates/ecommerce/src/app/_components/VerticalPadding/index.module.scss b/templates/ecommerce/src/app/_components/VerticalPadding/index.module.scss deleted file mode 100644 index a9db566e8c..0000000000 --- a/templates/ecommerce/src/app/_components/VerticalPadding/index.module.scss +++ /dev/null @@ -1,15 +0,0 @@ -.top-large { - padding-top: var(--block-padding); -} - -.top-medium { - padding-top: calc(var(--block-padding) / 2); -} - -.bottom-large { - padding-bottom: var(--block-padding); -} - -.bottom-medium { - padding-bottom: calc(var(--block-padding) / 2); -} diff --git a/templates/ecommerce/src/app/_components/VerticalPadding/index.tsx b/templates/ecommerce/src/app/_components/VerticalPadding/index.tsx deleted file mode 100644 index d17a341b11..0000000000 --- a/templates/ecommerce/src/app/_components/VerticalPadding/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react' - -import classes from './index.module.scss' - -export type VerticalPaddingOptions = 'large' | 'medium' | 'none' - -type Props = { - bottom?: VerticalPaddingOptions - children: React.ReactNode - className?: string - top?: VerticalPaddingOptions -} - -export const VerticalPadding: React.FC = ({ - bottom = 'medium', - children, - className, - top = 'medium', -}) => { - return ( -
    - {children} -
    - ) -} diff --git a/templates/ecommerce/src/app/_components/icons/Chevron/index.tsx b/templates/ecommerce/src/app/_components/icons/Chevron/index.tsx deleted file mode 100644 index 9e07b0d94e..0000000000 --- a/templates/ecommerce/src/app/_components/icons/Chevron/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export const Chevron: React.FC = () => { - return ( - - - - ) -} diff --git a/templates/ecommerce/src/app/_components/icons/Menu/index.tsx b/templates/ecommerce/src/app/_components/icons/Menu/index.tsx deleted file mode 100644 index c513d7ba79..0000000000 --- a/templates/ecommerce/src/app/_components/icons/Menu/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react' - -export const MenuIcon: React.FC = () => { - return ( - - - - - - ) -} diff --git a/templates/ecommerce/src/app/_css/app.scss b/templates/ecommerce/src/app/_css/app.scss deleted file mode 100644 index da67c2347f..0000000000 --- a/templates/ecommerce/src/app/_css/app.scss +++ /dev/null @@ -1,123 +0,0 @@ -@use './queries.scss' as *; -@use './colors.scss' as *; -@use './type.scss' as *; -@import './theme.scss'; - -:root { - --base: 24px; - --font-body: system-ui; - --font-mono: 'Roboto Mono', monospace; - - --gutter-h: 180px; - --block-padding: 120px; - - @include large-break { - --gutter-h: 144px; - --block-padding: 96px; - } - - @include mid-break { - --gutter-h: 24px; - --block-padding: 60px; - } -} - -* { - box-sizing: border-box; -} - -html { - @extend %body; - background: var(--theme-bg); - -webkit-font-smoothing: antialiased; - opacity: 0; - - &[data-theme='dark'], - &[data-theme='light'] { - opacity: initial; - } -} - -html, -body, -#app { - height: 100%; -} - -body { - font-family: var(--font-body); - margin: 0; - color: var(--theme-text); -} - -::selection { - background: var(--theme-success-500); - color: var(--color-base-800); -} - -::-moz-selection { - background: var(--theme-success-500); - color: var(--color-base-800); -} - -img { - max-width: 100%; - height: auto; - display: block; -} - -h1 { - @extend %h1; -} - -h2 { - @extend %h2; -} - -h3 { - @extend %h3; -} - -h4 { - @extend %h4; -} - -h5 { - @extend %h5; -} - -h6 { - @extend %h6; -} - -p { - margin: var(--base) 0; - - @include mid-break { - margin: calc(var(--base) * 0.75) 0; - } -} - -ul, -ol { - padding-left: var(--base); - margin: 0 0 var(--base); -} - -a { - color: currentColor; - - &:focus { - opacity: 0.8; - outline: none; - } - - &:active { - opacity: 0.7; - outline: none; - } -} - -svg { - vertical-align: middle; -} diff --git a/templates/ecommerce/src/app/_css/colors.scss b/templates/ecommerce/src/app/_css/colors.scss deleted file mode 100644 index ce7655db30..0000000000 --- a/templates/ecommerce/src/app/_css/colors.scss +++ /dev/null @@ -1,105 +0,0 @@ -// Keep these in sync with the colors exported in '../cssVariables.js' - -:root { - --color-base-0: rgb(255, 255, 255); - --color-base-50: rgb(245, 245, 245); - --color-base-100: rgb(235, 235, 235); - --color-base-150: rgb(221, 221, 221); - --color-base-200: rgb(208, 208, 208); - --color-base-250: rgb(195, 195, 195); - --color-base-300: rgb(181, 181, 181); - --color-base-350: rgb(168, 168, 168); - --color-base-400: rgb(154, 154, 154); - --color-base-450: rgb(141, 141, 141); - --color-base-500: rgb(128, 128, 128); - --color-base-550: rgb(114, 114, 114); - --color-base-600: rgb(101, 101, 101); - --color-base-650: rgb(87, 87, 87); - --color-base-700: rgb(74, 74, 74); - --color-base-750: rgb(60, 60, 60); - --color-base-800: rgb(47, 47, 47); - --color-base-850: rgb(34, 34, 34); - --color-base-900: rgb(20, 20, 20); - --color-base-950: rgb(7, 7, 7); - --color-base-1000: rgb(0, 0, 0); - - --color-success-50: rgb(237, 245, 249); - --color-success-100: rgb(218, 237, 248); - --color-success-150: rgb(188, 225, 248); - --color-success-200: rgb(156, 216, 253); - --color-success-250: rgb(125, 204, 248); - --color-success-300: rgb(97, 190, 241); - --color-success-350: rgb(65, 178, 236); - --color-success-400: rgb(36, 164, 223); - --color-success-450: rgb(18, 148, 204); - --color-success-500: rgb(21, 135, 186); - --color-success-550: rgb(12, 121, 168); - --color-success-600: rgb(11, 110, 153); - --color-success-650: rgb(11, 97, 135); - --color-success-700: rgb(17, 88, 121); - --color-success-750: rgb(17, 76, 105); - --color-success-800: rgb(18, 66, 90); - --color-success-850: rgb(18, 56, 76); - --color-success-900: rgb(19, 44, 58); - --color-success-950: rgb(22, 33, 39); - - --color-error-50: rgb(250, 241, 240); - --color-error-100: rgb(252, 229, 227); - --color-error-150: rgb(247, 208, 204); - --color-error-200: rgb(254, 193, 188); - --color-error-250: rgb(253, 177, 170); - --color-error-300: rgb(253, 154, 146); - --color-error-350: rgb(253, 131, 123); - --color-error-400: rgb(246, 109, 103); - --color-error-450: rgb(234, 90, 86); - --color-error-500: rgb(218, 75, 72); - --color-error-550: rgb(200, 62, 61); - --color-error-600: rgb(182, 54, 54); - --color-error-650: rgb(161, 47, 47); - --color-error-700: rgb(144, 44, 43); - --color-error-750: rgb(123, 41, 39); - --color-error-800: rgb(105, 39, 37); - --color-error-850: rgb(86, 36, 33); - --color-error-900: rgb(64, 32, 29); - --color-error-950: rgb(44, 26, 24); - - --color-warning-50: rgb(249, 242, 237); - --color-warning-100: rgb(248, 232, 219); - --color-warning-150: rgb(243, 212, 186); - --color-warning-200: rgb(243, 200, 162); - --color-warning-250: rgb(240, 185, 136); - --color-warning-300: rgb(238, 166, 98); - --color-warning-350: rgb(234, 148, 58); - --color-warning-400: rgb(223, 132, 17); - --color-warning-450: rgb(204, 120, 15); - --color-warning-500: rgb(185, 108, 13); - --color-warning-550: rgb(167, 97, 10); - --color-warning-600: rgb(150, 87, 11); - --color-warning-650: rgb(134, 78, 11); - --color-warning-700: rgb(120, 70, 13); - --color-warning-750: rgb(105, 61, 13); - --color-warning-800: rgb(90, 55, 19); - --color-warning-850: rgb(73, 47, 21); - --color-warning-900: rgb(56, 38, 20); - --color-warning-950: rgb(38, 29, 21); - - --color-blue-50: rgb(237, 245, 249); - --color-blue-100: rgb(218, 237, 248); - --color-blue-150: rgb(188, 225, 248); - --color-blue-200: rgb(156, 216, 253); - --color-blue-250: rgb(125, 204, 248); - --color-blue-300: rgb(97, 190, 241); - --color-blue-350: rgb(65, 178, 236); - --color-blue-400: rgb(36, 164, 223); - --color-blue-450: rgb(18, 148, 204); - --color-blue-500: rgb(21, 135, 186); - --color-blue-550: rgb(12, 121, 168); - --color-blue-600: rgb(11, 110, 153); - --color-blue-650: rgb(11, 97, 135); - --color-blue-700: rgb(17, 88, 121); - --color-blue-750: rgb(17, 76, 105); - --color-blue-800: rgb(18, 66, 90); - --color-blue-850: rgb(18, 56, 76); - --color-blue-900: rgb(19, 44, 58); - --color-blue-950: rgb(22, 33, 39); -} diff --git a/templates/ecommerce/src/app/_css/common.scss b/templates/ecommerce/src/app/_css/common.scss deleted file mode 100644 index e66be0183d..0000000000 --- a/templates/ecommerce/src/app/_css/common.scss +++ /dev/null @@ -1,2 +0,0 @@ -@forward './queries.scss'; -@forward './type.scss'; diff --git a/templates/ecommerce/src/app/_css/queries.scss b/templates/ecommerce/src/app/_css/queries.scss deleted file mode 100644 index b5f8c282cd..0000000000 --- a/templates/ecommerce/src/app/_css/queries.scss +++ /dev/null @@ -1,30 +0,0 @@ -// Keep these in sync with the breakpoints exported in '../cssVariables.js' - -$breakpoint-xs-width: 400px; -$breakpoint-s-width: 768px; -$breakpoint-m-width: 1024px; -$breakpoint-l-width: 1440px; - -@mixin extra-small-break { - @media (max-width: #{$breakpoint-xs-width}) { - @content; - } -} - -@mixin small-break { - @media (max-width: #{$breakpoint-s-width}) { - @content; - } -} - -@mixin mid-break { - @media (max-width: #{$breakpoint-m-width}) { - @content; - } -} - -@mixin large-break { - @media (max-width: #{$breakpoint-l-width}) { - @content; - } -} diff --git a/templates/ecommerce/src/app/_css/theme.scss b/templates/ecommerce/src/app/_css/theme.scss deleted file mode 100644 index 17bd7caa9a..0000000000 --- a/templates/ecommerce/src/app/_css/theme.scss +++ /dev/null @@ -1,237 +0,0 @@ -[data-theme='light'] { - --theme-success-50: var(--color-success-50); - --theme-success-100: var(--color-success-100); - --theme-success-150: var(--color-success-150); - --theme-success-200: var(--color-success-200); - --theme-success-250: var(--color-success-250); - --theme-success-300: var(--color-success-300); - --theme-success-350: var(--color-success-350); - --theme-success-400: var(--color-success-400); - --theme-success-450: var(--color-success-450); - --theme-success-500: var(--color-success-500); - --theme-success-550: var(--color-success-550); - --theme-success-600: var(--color-success-600); - --theme-success-650: var(--color-success-650); - --theme-success-700: var(--color-success-700); - --theme-success-750: var(--color-success-750); - --theme-success-800: var(--color-success-800); - --theme-success-850: var(--color-success-850); - --theme-success-900: var(--color-success-900); - --theme-success-950: var(--color-success-950); - - --theme-warning-50: var(--color-warning-50); - --theme-warning-100: var(--color-warning-100); - --theme-warning-150: var(--color-warning-150); - --theme-warning-200: var(--color-warning-200); - --theme-warning-250: var(--color-warning-250); - --theme-warning-300: var(--color-warning-300); - --theme-warning-350: var(--color-warning-350); - --theme-warning-400: var(--color-warning-400); - --theme-warning-450: var(--color-warning-450); - --theme-warning-500: var(--color-warning-500); - --theme-warning-550: var(--color-warning-550); - --theme-warning-600: var(--color-warning-600); - --theme-warning-650: var(--color-warning-650); - --theme-warning-700: var(--color-warning-700); - --theme-warning-750: var(--color-warning-750); - --theme-warning-800: var(--color-warning-800); - --theme-warning-850: var(--color-warning-850); - --theme-warning-900: var(--color-warning-900); - --theme-warning-950: var(--color-warning-950); - - --theme-error-50: var(--color-error-50); - --theme-error-100: var(--color-error-100); - --theme-error-150: var(--color-error-150); - --theme-error-200: var(--color-error-200); - --theme-error-250: var(--color-error-250); - --theme-error-300: var(--color-error-300); - --theme-error-350: var(--color-error-350); - --theme-error-400: var(--color-error-400); - --theme-error-450: var(--color-error-450); - --theme-error-500: var(--color-error-500); - --theme-error-550: var(--color-error-550); - --theme-error-600: var(--color-error-600); - --theme-error-650: var(--color-error-650); - --theme-error-700: var(--color-error-700); - --theme-error-750: var(--color-error-750); - --theme-error-800: var(--color-error-800); - --theme-error-850: var(--color-error-850); - --theme-error-900: var(--color-error-900); - --theme-error-950: var(--color-error-950); - - --theme-elevation-0: var(--color-base-0); - --theme-elevation-50: var(--color-base-50); - --theme-elevation-100: var(--color-base-100); - --theme-elevation-150: var(--color-base-150); - --theme-elevation-200: var(--color-base-200); - --theme-elevation-250: var(--color-base-250); - --theme-elevation-300: var(--color-base-300); - --theme-elevation-350: var(--color-base-350); - --theme-elevation-400: var(--color-base-400); - --theme-elevation-450: var(--color-base-450); - --theme-elevation-500: var(--color-base-500); - --theme-elevation-550: var(--color-base-550); - --theme-elevation-600: var(--color-base-600); - --theme-elevation-650: var(--color-base-650); - --theme-elevation-700: var(--color-base-700); - --theme-elevation-750: var(--color-base-750); - --theme-elevation-800: var(--color-base-800); - --theme-elevation-850: var(--color-base-850); - --theme-elevation-900: var(--color-base-900); - --theme-elevation-950: var(--color-base-950); - --theme-elevation-1000: var(--color-base-1000); - - --theme-bg: var(--theme-elevation-0); - --theme-input-bg: var(--theme-elevation-50); - --theme-text: var(--theme-elevation-750); - --theme-border-color: var(--theme-elevation-150); - - color-scheme: light; - color: var(--theme-text); - - --highlight-default-bg-color: var(--theme-success-400); - --highlight-default-text-color: var(--theme-text); - - --highlight-danger-bg-color: var(--theme-error-150); - --highlight-danger-text-color: var(--theme-text); - - h1 a, - h2 a, - h3 a, - h4 a, - h5 a, - h6 a { - color: var(--theme-elevation-750); - - &:hover { - color: var(--theme-elevation-800); - } - - &:visited { - color: var(--theme-elevation-750); - - &:hover { - color: var(--theme-elevation-800); - } - } - } -} - -[data-theme='dark'] { - --theme-elevation-0: var(--color-base-1000); - --theme-elevation-50: var(--color-base-950); - --theme-elevation-100: var(--color-base-900); - --theme-elevation-150: var(--color-base-850); - --theme-elevation-200: var(--color-base-800); - --theme-elevation-250: var(--color-base-750); - --theme-elevation-300: var(--color-base-700); - --theme-elevation-350: var(--color-base-650); - --theme-elevation-400: var(--color-base-600); - --theme-elevation-450: var(--color-base-550); - --theme-elevation-500: var(--color-base-500); - --theme-elevation-550: var(--color-base-450); - --theme-elevation-600: var(--color-base-400); - --theme-elevation-650: var(--color-base-350); - --theme-elevation-700: var(--color-base-300); - --theme-elevation-750: var(--color-base-250); - --theme-elevation-800: var(--color-base-200); - --theme-elevation-850: var(--color-base-150); - --theme-elevation-900: var(--color-base-100); - --theme-elevation-950: var(--color-base-50); - --theme-elevation-1000: var(--color-base-0); - - --theme-success-50: var(--color-success-950); - --theme-success-100: var(--color-success-900); - --theme-success-150: var(--color-success-850); - --theme-success-200: var(--color-success-800); - --theme-success-250: var(--color-success-750); - --theme-success-300: var(--color-success-700); - --theme-success-350: var(--color-success-650); - --theme-success-400: var(--color-success-600); - --theme-success-450: var(--color-success-550); - --theme-success-500: var(--color-success-500); - --theme-success-550: var(--color-success-450); - --theme-success-600: var(--color-success-400); - --theme-success-650: var(--color-success-350); - --theme-success-700: var(--color-success-300); - --theme-success-750: var(--color-success-250); - --theme-success-800: var(--color-success-200); - --theme-success-850: var(--color-success-150); - --theme-success-900: var(--color-success-100); - --theme-success-950: var(--color-success-50); - - --theme-warning-50: var(--color-warning-950); - --theme-warning-100: var(--color-warning-900); - --theme-warning-150: var(--color-warning-850); - --theme-warning-200: var(--color-warning-800); - --theme-warning-250: var(--color-warning-750); - --theme-warning-300: var(--color-warning-700); - --theme-warning-350: var(--color-warning-650); - --theme-warning-400: var(--color-warning-600); - --theme-warning-450: var(--color-warning-550); - --theme-warning-500: var(--color-warning-500); - --theme-warning-550: var(--color-warning-450); - --theme-warning-600: var(--color-warning-400); - --theme-warning-650: var(--color-warning-350); - --theme-warning-700: var(--color-warning-300); - --theme-warning-750: var(--color-warning-250); - --theme-warning-800: var(--color-warning-200); - --theme-warning-850: var(--color-warning-150); - --theme-warning-900: var(--color-warning-100); - --theme-warning-950: var(--color-warning-50); - - --theme-error-50: var(--color-error-950); - --theme-error-100: var(--color-error-900); - --theme-error-150: var(--color-error-850); - --theme-error-200: var(--color-error-800); - --theme-error-250: var(--color-error-750); - --theme-error-300: var(--color-error-700); - --theme-error-350: var(--color-error-650); - --theme-error-400: var(--color-error-600); - --theme-error-450: var(--color-error-550); - --theme-error-500: var(--color-error-500); - --theme-error-550: var(--color-error-450); - --theme-error-600: var(--color-error-400); - --theme-error-650: var(--color-error-350); - --theme-error-700: var(--color-error-300); - --theme-error-750: var(--color-error-250); - --theme-error-800: var(--color-error-200); - --theme-error-850: var(--color-error-150); - --theme-error-900: var(--color-error-100); - --theme-error-950: var(--color-error-50); - - --theme-bg: var(--theme-elevation-100); - --theme-text: var(--theme-elevation-900); - --theme-input-bg: var(--theme-elevation-150); - --theme-border-color: var(--theme-elevation-250); - - color-scheme: dark; - color: var(--theme-text); - - --highlight-default-bg-color: var(--theme-success-100); - --highlight-default-text-color: var(--theme-success-600); - - --highlight-danger-bg-color: var(--theme-error-100); - --highlight-danger-text-color: var(--theme-error-550); - - h1 a, - h2 a, - h3 a, - h4 a, - h5 a, - h6 a { - color: var(--theme-success-600); - - &:hover { - color: var(--theme-success-400); - } - - &:visited { - color: var(--theme-success-700); - - &:hover { - color: var(--theme-success-500); - } - } - } -} diff --git a/templates/ecommerce/src/app/_css/type.scss b/templates/ecommerce/src/app/_css/type.scss deleted file mode 100644 index f8d1d07162..0000000000 --- a/templates/ecommerce/src/app/_css/type.scss +++ /dev/null @@ -1,110 +0,0 @@ -@use 'queries' as *; - -%h1, -%h2, -%h3, -%h4, -%h5, -%h6 { - font-weight: 700; -} - -%h1 { - margin: 40px 0; - font-size: 64px; - line-height: 70px; - font-weight: bold; - - @include mid-break { - margin: 24px 0; - font-size: 42px; - line-height: 42px; - } -} - -%h2 { - margin: 28px 0; - font-size: 48px; - line-height: 54px; - font-weight: bold; - - @include mid-break { - margin: 22px 0; - font-size: 32px; - line-height: 40px; - } -} - -%h3 { - margin: 24px 0; - font-size: 32px; - line-height: 40px; - font-weight: bold; - - @include mid-break { - margin: 20px 0; - font-size: 26px; - line-height: 32px; - } -} - -%h4 { - margin: 20px 0; - font-size: 26px; - line-height: 32px; - font-weight: bold; - - @include mid-break { - font-size: 22px; - line-height: 30px; - } -} - -%h5 { - margin: 20px 0; - font-size: 22px; - line-height: 30px; - font-weight: bold; - - @include mid-break { - font-size: 18px; - line-height: 24px; - } -} - -%h6 { - margin: 20px 0; - font-size: inherit; - line-height: inherit; - font-weight: bold; -} - -%body { - font-size: 18px; - line-height: 32px; - - @include mid-break { - font-size: 15px; - line-height: 24px; - } -} - -%large-body { - font-size: 25px; - line-height: 32px; - - @include mid-break { - font-size: 22px; - line-height: 30px; - } -} - -%label { - font-size: 16px; - line-height: 24px; - text-transform: uppercase; - - @include mid-break { - font-size: 13px; - } -} diff --git a/templates/ecommerce/src/app/_graphql/blocks.ts b/templates/ecommerce/src/app/_graphql/blocks.ts deleted file mode 100644 index 6f3aea1d7e..0000000000 --- a/templates/ecommerce/src/app/_graphql/blocks.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { CATEGORIES } from './categories' -import { LINK_FIELDS } from './link' -import { MEDIA } from './media' -import { META } from './meta' - -export const CALL_TO_ACTION = ` -...on Cta { - blockType - invertBackground - richText - links { - link ${LINK_FIELDS()} - } -} -` - -export const CONTENT = ` -...on Content { - blockType - invertBackground - columns { - size - richText - enableLink - link ${LINK_FIELDS()} - } -} -` - -export const MEDIA_BLOCK = ` -...on MediaBlock { - blockType - invertBackground - position - ${MEDIA} -} -` - -export const ARCHIVE_BLOCK = ` -...on Archive { - blockType - introContent - populateBy - relationTo - ${CATEGORIES} - limit - selectedDocs { - relationTo - value { - ...on Product { - id - slug - title - priceJSON - ${META} - } - } - } - populatedDocs { - relationTo - value { - ...on Product { - id - slug - title - priceJSON - ${CATEGORIES} - ${META} - } - } - } - populatedDocsTotal -} -` diff --git a/templates/ecommerce/src/app/_graphql/cart.ts b/templates/ecommerce/src/app/_graphql/cart.ts deleted file mode 100644 index 84d0b131ed..0000000000 --- a/templates/ecommerce/src/app/_graphql/cart.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { META } from './meta' - -export const CART = `cart { - items { - product { - id - slug - priceJSON - ${META} - } - quantity - } -}` diff --git a/templates/ecommerce/src/app/_graphql/categories.ts b/templates/ecommerce/src/app/_graphql/categories.ts deleted file mode 100644 index df8cbe9a15..0000000000 --- a/templates/ecommerce/src/app/_graphql/categories.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const CATEGORIES = `categories { - title - id - breadcrumbs { - id - label - } -}` diff --git a/templates/ecommerce/src/app/_graphql/globals.ts b/templates/ecommerce/src/app/_graphql/globals.ts deleted file mode 100644 index d43c597858..0000000000 --- a/templates/ecommerce/src/app/_graphql/globals.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { LINK_FIELDS } from './link' - -export const HEADER = ` - Header { - navItems { - link ${LINK_FIELDS({ disableAppearance: true })} - } - } -` - -export const HEADER_QUERY = ` -query Header { - ${HEADER} -} -` - -export const FOOTER = ` - Footer { - navItems { - link ${LINK_FIELDS({ disableAppearance: true })} - } - } -` - -export const FOOTER_QUERY = ` -query Footer { - ${FOOTER} -} -` - -export const SETTINGS = ` - Settings { - productsPage { - slug - } - } -` - -export const SETTINGS_QUERY = ` -query Settings { - ${SETTINGS} -} -` diff --git a/templates/ecommerce/src/app/_graphql/link.ts b/templates/ecommerce/src/app/_graphql/link.ts deleted file mode 100644 index 9c211b4189..0000000000 --- a/templates/ecommerce/src/app/_graphql/link.ts +++ /dev/null @@ -1,20 +0,0 @@ -interface Args { - disableAppearance?: true - disableLabel?: true -} - -export const LINK_FIELDS = ({ disableAppearance, disableLabel }: Args = {}): string => `{ - ${!disableLabel ? 'label' : ''} - ${!disableAppearance ? 'appearance' : ''} - type - newTab - url - reference { - relationTo - value { - ...on Page { - slug - } - } - } -}` diff --git a/templates/ecommerce/src/app/_graphql/me.ts b/templates/ecommerce/src/app/_graphql/me.ts deleted file mode 100644 index 8154ae2331..0000000000 --- a/templates/ecommerce/src/app/_graphql/me.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CART } from './cart' - -export const ME_QUERY = `query { - meUser { - user { - id - email - name - ${CART} - roles - } - exp - } -}` diff --git a/templates/ecommerce/src/app/_graphql/media.ts b/templates/ecommerce/src/app/_graphql/media.ts deleted file mode 100644 index fbf8e526b6..0000000000 --- a/templates/ecommerce/src/app/_graphql/media.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const MEDIA_FIELDS = ` -mimeType -filename -width -height -alt -caption -` - -export const MEDIA = `media { - ${MEDIA_FIELDS} -}` diff --git a/templates/ecommerce/src/app/_graphql/meta.ts b/templates/ecommerce/src/app/_graphql/meta.ts deleted file mode 100644 index fc87374928..0000000000 --- a/templates/ecommerce/src/app/_graphql/meta.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { MEDIA_FIELDS } from './media' - -export const META = `meta { - title - image { - ${MEDIA_FIELDS} - } - description -}` diff --git a/templates/ecommerce/src/app/_graphql/orders.ts b/templates/ecommerce/src/app/_graphql/orders.ts deleted file mode 100644 index da57fb5d51..0000000000 --- a/templates/ecommerce/src/app/_graphql/orders.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { PRODUCT } from './products' - -export const ORDERS = ` - query Orders { - Orders(limit: 300) { - docs { - id - } - } - } -` - -export const ORDER = ` - query Order($id: String ) { - Orders(where: { id: { equals: $id}}) { - docs { - id - orderedBy - items { - product ${PRODUCT} - title - priceJSON - } - } - } - } -` diff --git a/templates/ecommerce/src/app/_graphql/pages.ts b/templates/ecommerce/src/app/_graphql/pages.ts deleted file mode 100644 index 67aaa7f07a..0000000000 --- a/templates/ecommerce/src/app/_graphql/pages.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ARCHIVE_BLOCK, CALL_TO_ACTION, CONTENT, MEDIA_BLOCK } from './blocks' -import { LINK_FIELDS } from './link' -import { MEDIA } from './media' -import { META } from './meta' - -export const PAGES = ` - query Pages { - Pages(limit: 300, where: { slug: { not_equals: "cart" } }) { - docs { - slug - } - } - } -` - -export const PAGE = ` - query Page($slug: String, $draft: Boolean) { - Pages(where: { AND: [{ slug: { equals: $slug }}] }, limit: 1, draft: $draft) { - docs { - id - title - hero { - type - richText - links { - link ${LINK_FIELDS()} - } - ${MEDIA} - } - layout { - ${CONTENT} - ${CALL_TO_ACTION} - ${CONTENT} - ${MEDIA_BLOCK} - ${ARCHIVE_BLOCK} - } - ${META} - } - } - } -` diff --git a/templates/ecommerce/src/app/_graphql/products.ts b/templates/ecommerce/src/app/_graphql/products.ts deleted file mode 100644 index 13e579811a..0000000000 --- a/templates/ecommerce/src/app/_graphql/products.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { ARCHIVE_BLOCK, CALL_TO_ACTION, CONTENT, MEDIA_BLOCK } from './blocks' -import { CATEGORIES } from './categories' -import { META } from './meta' - -export const PRODUCTS = ` - query Products { - Products(limit: 300) { - docs { - slug - } - } - } -` - -export const PRODUCT = ` - query Product($slug: String, $draft: Boolean) { - Products(where: { slug: { equals: $slug}}, limit: 1, draft: $draft) { - docs { - id - title - stripeProductID - ${CATEGORIES} - layout { - ${CALL_TO_ACTION} - ${CONTENT} - ${MEDIA_BLOCK} - ${ARCHIVE_BLOCK} - } - priceJSON - enablePaywall - relatedProducts { - id - slug - title - ${META} - } - ${META} - } - } - } -` - -export const PRODUCT_PAYWALL = ` - query Product($slug: String, $draft: Boolean) { - Products(where: { slug: { equals: $slug}}, limit: 1, draft: $draft) { - docs { - paywall { - ${CALL_TO_ACTION} - ${CONTENT} - ${MEDIA_BLOCK} - ${ARCHIVE_BLOCK} - } - } - } - } -` diff --git a/templates/ecommerce/src/app/_heros/HighImpact/index.module.scss b/templates/ecommerce/src/app/_heros/HighImpact/index.module.scss deleted file mode 100644 index d6bffc2a23..0000000000 --- a/templates/ecommerce/src/app/_heros/HighImpact/index.module.scss +++ /dev/null @@ -1,55 +0,0 @@ -@import '../../_css/queries.scss'; - -.hero { - padding-top: calc(var(--base) * 2); - position: relative; - overflow: hidden; - - @include mid-break { - padding-top: var(--gutter-h); - } -} - -.media { - width: calc(100% + var(--gutter-h)); - left: calc(var(--gutter-h) / -2); - margin-top: calc(var(--base) * 3); - position: relative; - - @include mid-break { - left: 0; - margin-top: var(--base); - margin-left: calc(var(--gutter-h) * -1); - width: calc(100% + var(--gutter-h) * 2); - } -} - -.links { - list-style: none; - margin: 0; - padding: 0; - display: flex; - padding-top: var(--base); - flex-wrap: wrap; - margin: calc(var(--base) * -0.5); - - & > * { - margin: calc(var(--base) / 2); - } -} - -.caption { - margin-top: var(--base); - color: var(--theme-elevation-500); - left: calc(var(--gutter-h) / 2); - width: calc(100% - var(--gutter-h)); - position: relative; - - @include mid-break { - left: var(--gutter-h); - } -} - -.content { - position: relative; -} diff --git a/templates/ecommerce/src/app/_heros/HighImpact/index.tsx b/templates/ecommerce/src/app/_heros/HighImpact/index.tsx deleted file mode 100644 index 109616da9e..0000000000 --- a/templates/ecommerce/src/app/_heros/HighImpact/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { Fragment } from 'react' - -import type { Page } from '../../../payload/payload-types' - -import { Gutter } from '../../_components/Gutter' -import { CMSLink } from '../../_components/Link' -import { Media } from '../../_components/Media' -import RichText from '../../_components/RichText' -import classes from './index.module.scss' - -export const HighImpactHero: React.FC = ({ links, media, richText }) => { - return ( - -
    - - {Array.isArray(links) && links.length > 0 && ( -
      - {links.map(({ link }, i) => { - return ( -
    • - -
    • - ) - })} -
    - )} -
    -
    - {typeof media === 'object' && ( - - - {media?.caption && } - - )} -
    -
    - ) -} diff --git a/templates/ecommerce/src/app/_heros/LowImpact/index.module.scss b/templates/ecommerce/src/app/_heros/LowImpact/index.module.scss deleted file mode 100644 index 6b6fbea13d..0000000000 --- a/templates/ecommerce/src/app/_heros/LowImpact/index.module.scss +++ /dev/null @@ -1,4 +0,0 @@ -@use '../../_css/type.scss' as *; - -.lowImpactHero { -} diff --git a/templates/ecommerce/src/app/_heros/LowImpact/index.tsx b/templates/ecommerce/src/app/_heros/LowImpact/index.tsx deleted file mode 100644 index 3b1a34c598..0000000000 --- a/templates/ecommerce/src/app/_heros/LowImpact/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react' - -import type { Page } from '../../../payload/payload-types' - -import { Gutter } from '../../_components/Gutter' -import RichText from '../../_components/RichText' -import { VerticalPadding } from '../../_components/VerticalPadding' -import classes from './index.module.scss' - -export const LowImpactHero: React.FC = ({ richText }) => { - return ( - -
    - - - -
    -
    - ) -} diff --git a/templates/ecommerce/src/app/_heros/MediumImpact/index.module.scss b/templates/ecommerce/src/app/_heros/MediumImpact/index.module.scss deleted file mode 100644 index a0b58fef56..0000000000 --- a/templates/ecommerce/src/app/_heros/MediumImpact/index.module.scss +++ /dev/null @@ -1,62 +0,0 @@ -@use '../../_css/common.scss' as *; - -.hero { - padding-top: calc(var(--base) * 3); - - @include mid-break { - padding-top: var(--base); - } -} - -.richText { - position: relative; - - &::after { - content: ''; - display: block; - position: absolute; - width: 100vw; - left: calc(var(--gutter-h) * -1); - height: 200px; - background: linear-gradient(to bottom, var(--theme-elevation-100), transparent); - top: calc(100% + (var(--base) * 2)); - right: 0; - - @include mid-break { - display: none; - } - } -} - -.links { - position: relative; - list-style: none; - margin: 0; - padding: 0; - display: flex; - margin-top: calc(var(--base) * 4); - - li { - margin-right: 12px; - } - - @include mid-break { - display: block; - margin-top: var(--base); - - li { - margin-right: 0; - } - } -} - -.link { - @include mid-break { - width: 100%; - } -} - -.media { - position: relative; - width: calc(100% + var(--gutter-h)); -} diff --git a/templates/ecommerce/src/app/_heros/MediumImpact/index.tsx b/templates/ecommerce/src/app/_heros/MediumImpact/index.tsx deleted file mode 100644 index 980844a51b..0000000000 --- a/templates/ecommerce/src/app/_heros/MediumImpact/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React from 'react' - -import type { Page } from '../../../payload/payload-types' - -import { Gutter } from '../../_components/Gutter' -import { CMSLink } from '../../_components/Link' -import { Media } from '../../_components/Media' -import RichText from '../../_components/RichText' -import classes from './index.module.scss' - -export const MediumImpactHero: React.FC = (props) => { - const { links, media, richText } = props - - return ( - -
    - - {Array.isArray(links) && ( -
      - {links.map(({ link }, i) => { - return ( -
    • - -
    • - ) - })} -
    - )} -
    -
    - {typeof media === 'object' && } -
    -
    - ) -} diff --git a/templates/ecommerce/src/app/_heros/Product/index.module.scss b/templates/ecommerce/src/app/_heros/Product/index.module.scss deleted file mode 100644 index 50c9439a91..0000000000 --- a/templates/ecommerce/src/app/_heros/Product/index.module.scss +++ /dev/null @@ -1,84 +0,0 @@ -@use '../../_css/common.scss' as *; - -.productHero { - display: flex; - gap: calc(var(--base) * 2); - - @include mid-break { - flex-direction: column; - gap: var(--base); - } -} - -.content { - width: 50%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: flex-start; - gap: var(--base); - - @include mid-break { - width: 100%; - gap: calc(var(--base) / 2); - } -} - -.categories { - @extend %label; -} - -.title { - margin: 0; -} - -.warning { - margin-bottom: calc(var(--base) * 1.5); -} - -.description { - margin: 0; -} - -.media { - width: 50%; - - @include mid-break { - width: 100%; - } -} - -.mediaWrapper { - text-decoration: none; - display: block; - position: relative; - aspect-ratio: 5 / 4; - margin-bottom: calc(var(--base) / 2); - width: calc(100% + calc(var(--gutter-h) / 2)); - - @include mid-break { - margin-left: calc(var(--gutter-h) * -1); - width: calc(100% + var(--gutter-h) * 2); - } -} - -.image { - object-fit: cover; -} - -.placeholder { - background-color: var(--theme-elevation-50); - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; -} - -.caption { - color: var(--theme-elevation-500); -} - -.addToCartButton { - margin-top: calc(var(--base) / 2); -} diff --git a/templates/ecommerce/src/app/_heros/Product/index.tsx b/templates/ecommerce/src/app/_heros/Product/index.tsx deleted file mode 100644 index 4a7ab2f25f..0000000000 --- a/templates/ecommerce/src/app/_heros/Product/index.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import Link from 'next/link' -import React, { Fragment } from 'react' - -import type { Product } from '../../../payload/payload-types' - -import { AddToCartButton } from '../../_components/AddToCartButton' -import { Gutter } from '../../_components/Gutter' -import { Media } from '../../_components/Media' -import { Message } from '../../_components/Message' -import { Price } from '../../_components/Price' -import RichText from '../../_components/RichText' -import classes from './index.module.scss' - -export const ProductHero: React.FC<{ - product: Product -}> = ({ product }) => { - const { - id, - categories, - meta: { description, image: metaImage } = {}, - stripeProductID, - title, - } = product - - return ( - - {!stripeProductID && ( - - - {'This product is not yet connected to Stripe. To link this product, '} - - edit this product in the admin panel - - . - - } - /> - - )} - -
    -
    - {categories?.map((category, index) => { - if (typeof category === 'object' && category !== null) { - const { title: categoryTitle } = category - - const titleToUse = categoryTitle || 'Untitled category' - - const isLast = index === categories.length - 1 - - return ( - - {titleToUse} - {!isLast && ,  } - - ) - } - - return null - })} -
    -

    {title}

    -
    -

    - {`${description ? `${description} ` : ''}To edit this product, `} - - navigate to the admin dashboard - - . -

    -
    - - -
    -
    -
    - {!metaImage &&
    No image
    } - {metaImage && typeof metaImage !== 'string' && ( - - )} -
    - {metaImage && typeof metaImage !== 'string' && metaImage?.caption && ( - - )} -
    -
    - - ) -} diff --git a/templates/ecommerce/src/app/_providers/Auth/index.tsx b/templates/ecommerce/src/app/_providers/Auth/index.tsx deleted file mode 100644 index 19dc73cf2c..0000000000 --- a/templates/ecommerce/src/app/_providers/Auth/index.tsx +++ /dev/null @@ -1,218 +0,0 @@ -'use client' - -import React, { createContext, useCallback, useContext, useEffect, useState } from 'react' - -import type { User } from '../../../payload/payload-types' - -// eslint-disable-next-line no-unused-vars -type ResetPassword = (args: { - password: string - passwordConfirm: string - token: string -}) => Promise - -type ForgotPassword = (args: { email: string }) => Promise // eslint-disable-line no-unused-vars - -type Create = (args: { email: string; password: string; passwordConfirm: string }) => Promise // eslint-disable-line no-unused-vars - -type Login = (args: { email: string; password: string }) => Promise // eslint-disable-line no-unused-vars - -type Logout = () => Promise - -type AuthContext = { - create: Create - forgotPassword: ForgotPassword - login: Login - logout: Logout - resetPassword: ResetPassword - setUser: (user: User | null) => void // eslint-disable-line no-unused-vars - status: 'loggedIn' | 'loggedOut' | undefined - user?: User | null -} - -const Context = createContext({} as AuthContext) - -export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { - const [user, setUser] = useState() - - // used to track the single event of logging in or logging out - // useful for `useEffect` hooks that should only run once - const [status, setStatus] = useState<'loggedIn' | 'loggedOut' | undefined>() - const create = useCallback(async (args) => { - try { - const res = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/create`, { - body: JSON.stringify({ - email: args.email, - password: args.password, - passwordConfirm: args.passwordConfirm, - }), - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - - if (res.ok) { - const { data, errors } = await res.json() - if (errors) throw new Error(errors[0].message) - setUser(data?.loginUser?.user) - setStatus('loggedIn') - } else { - throw new Error('Invalid login') - } - } catch (e) { - throw new Error('An error occurred while attempting to login.') - } - }, []) - - const login = useCallback(async (args) => { - try { - const res = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/login`, { - body: JSON.stringify({ - email: args.email, - password: args.password, - }), - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - - if (res.ok) { - const { errors, user } = await res.json() - if (errors) throw new Error(errors[0].message) - setUser(user) - setStatus('loggedIn') - return user - } - - throw new Error('Invalid login') - } catch (e) { - throw new Error('An error occurred while attempting to login.') - } - }, []) - - const logout = useCallback(async () => { - try { - const res = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/logout`, { - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - - if (res.ok) { - setUser(null) - setStatus('loggedOut') - } else { - throw new Error('An error occurred while attempting to logout.') - } - } catch (e) { - throw new Error('An error occurred while attempting to logout.') - } - }, []) - - useEffect(() => { - const fetchMe = async () => { - try { - const res = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/me`, { - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'GET', - }) - - if (res.ok) { - const { user: meUser } = await res.json() - setUser(meUser || null) - setStatus(meUser ? 'loggedIn' : undefined) - } else { - throw new Error('An error occurred while fetching your account.') - } - } catch (e) { - setUser(null) - throw new Error('An error occurred while fetching your account.') - } - } - - fetchMe() - }, []) - - const forgotPassword = useCallback(async (args) => { - try { - const res = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/forgot-password`, { - body: JSON.stringify({ - email: args.email, - }), - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - - if (res.ok) { - const { data, errors } = await res.json() - if (errors) throw new Error(errors[0].message) - setUser(data?.loginUser?.user) - } else { - throw new Error('Invalid login') - } - } catch (e) { - throw new Error('An error occurred while attempting to login.') - } - }, []) - - const resetPassword = useCallback(async (args) => { - try { - const res = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/reset-password`, { - body: JSON.stringify({ - password: args.password, - passwordConfirm: args.passwordConfirm, - token: args.token, - }), - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - - if (res.ok) { - const { data, errors } = await res.json() - if (errors) throw new Error(errors[0].message) - setUser(data?.loginUser?.user) - setStatus(data?.loginUser?.user ? 'loggedIn' : undefined) - } else { - throw new Error('Invalid login') - } - } catch (e) { - throw new Error('An error occurred while attempting to login.') - } - }, []) - - return ( - - {children} - - ) -} - -type UseAuth = () => AuthContext // eslint-disable-line no-unused-vars - -export const useAuth: UseAuth = () => useContext(Context) diff --git a/templates/ecommerce/src/app/_providers/Cart/index.tsx b/templates/ecommerce/src/app/_providers/Cart/index.tsx deleted file mode 100644 index 5f0a890ba2..0000000000 --- a/templates/ecommerce/src/app/_providers/Cart/index.tsx +++ /dev/null @@ -1,278 +0,0 @@ -'use client' - -import React, { - createContext, - useCallback, - useContext, - useEffect, - useReducer, - useRef, - useState, -} from 'react' - -import type { Product, User } from '../../../payload/payload-types' -import type { CartItem } from './reducer' - -import { useAuth } from '../Auth' -import { cartReducer } from './reducer' - -export type CartContext = { - addItemToCart: (item: CartItem) => void - cart: User['cart'] - cartIsEmpty: boolean | undefined - cartTotal: { - formatted: string - raw: number - } - clearCart: () => void - deleteItemFromCart: (product: Product) => void - hasInitializedCart: boolean - isProductInCart: (product: Product) => boolean -} - -const Context = createContext({} as CartContext) - -export const useCart = () => useContext(Context) - -const arrayHasItems = (array) => Array.isArray(array) && array.length > 0 - -/** - * ensure that cart items are fully populated, filter out any items that are not - * this will prevent discontinued products from appearing in the cart - */ -const flattenCart = (cart: User['cart']): User['cart'] => ({ - ...cart, - items: cart.items - .map((item) => { - if (!item?.product || typeof item?.product !== 'object') { - return null - } - - return { - ...item, - // flatten relationship to product - product: item?.product?.id, - quantity: typeof item?.quantity === 'number' ? item?.quantity : 0, - } - }) - .filter(Boolean) as CartItem[], -}) - -// Step 1: Check local storage for a cart -// Step 2: If there is a cart, fetch the products and hydrate the cart -// Step 3: Authenticate the user -// Step 4: If the user is authenticated, merge the user's cart with the local cart -// Step 4B: Sync the cart to Payload and clear local storage -// Step 5: If the user is logged out, sync the cart to local storage only - -export const CartProvider = (props) => { - // const { setTimedNotification } = useNotifications(); - const { children } = props - const { status: authStatus, user } = useAuth() - - const [cart, dispatchCart] = useReducer(cartReducer, {}) - - const [total, setTotal] = useState<{ - formatted: string - raw: number - }>({ - formatted: '0.00', - raw: 0, - }) - - const hasInitialized = useRef(false) - const [hasInitializedCart, setHasInitialized] = useState(false) - - // Check local storage for a cart - // If there is a cart, fetch the products and hydrate the cart - useEffect(() => { - // wait for the user to be defined before initializing the cart - if (user === undefined) return - if (!hasInitialized.current) { - hasInitialized.current = true - - const syncCartFromLocalStorage = async () => { - const localCart = localStorage.getItem('cart') - - const parsedCart = JSON.parse(localCart || '{}') - - if (parsedCart?.items && parsedCart?.items?.length > 0) { - const initialCart = await Promise.all( - parsedCart.items.map(async ({ product, quantity }) => { - const res = await fetch( - `${process.env.NEXT_PUBLIC_SERVER_URL}/api/products/${product}`, - ) - const data = await res.json() - return { - product: data, - quantity, - } - }), - ) - - dispatchCart({ - type: 'SET_CART', - payload: { - items: initialCart, - }, - }) - } else { - dispatchCart({ - type: 'SET_CART', - payload: { - items: [], - }, - }) - } - } - - syncCartFromLocalStorage() - } - }, [user]) - - // authenticate the user and if logged in, merge the user's cart with local state - // only do this after we have initialized the cart to ensure we don't lose any items - useEffect(() => { - if (!hasInitialized.current) return - - if (authStatus === 'loggedIn') { - // merge the user's cart with the local state upon logging in - dispatchCart({ - type: 'MERGE_CART', - payload: user?.cart, - }) - } - - if (authStatus === 'loggedOut') { - // clear the cart from local state after logging out - dispatchCart({ - type: 'CLEAR_CART', - }) - } - }, [user, authStatus]) - - // every time the cart changes, determine whether to save to local storage or Payload based on authentication status - // upon logging in, merge and sync the existing local cart to Payload - useEffect(() => { - // wait until we have attempted authentication (the user is either an object or `null`) - if (!hasInitialized.current || user === undefined || !cart.items) return - - const flattenedCart = flattenCart(cart) - - if (user) { - // prevent updating the cart when the cart hasn't changed - if (JSON.stringify(flattenCart(user.cart)) === JSON.stringify(flattenedCart)) { - setHasInitialized(true) - return - } - - try { - const syncCartToPayload = async () => { - const req = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/${user.id}`, { - // Make sure to include cookies with fetch - body: JSON.stringify({ - cart: flattenedCart, - }), - credentials: 'include', - headers: { - 'Content-Type': 'application/json', - }, - method: 'PATCH', - }) - - if (req.ok) { - localStorage.setItem('cart', '[]') - } - } - - syncCartToPayload() - } catch (e) { - console.error('Error while syncing cart to Payload.') // eslint-disable-line no-console - } - } else { - localStorage.setItem('cart', JSON.stringify(flattenedCart)) - } - - setHasInitialized(true) - }, [user, cart]) - - const isProductInCart = useCallback( - (incomingProduct: Product): boolean => { - let isInCart = false - const { items: itemsInCart } = cart || {} - if (Array.isArray(itemsInCart) && itemsInCart.length > 0) { - isInCart = Boolean( - itemsInCart.find(({ product }) => - typeof product === 'string' - ? product === incomingProduct.id - : product?.id === incomingProduct.id, - ), // eslint-disable-line function-paren-newline - ) - } - return isInCart - }, - [cart], - ) - - // this method can be used to add new items AND update existing ones - const addItemToCart = useCallback((incomingItem) => { - dispatchCart({ - type: 'ADD_ITEM', - payload: incomingItem, - }) - }, []) - - const deleteItemFromCart = useCallback((incomingProduct: Product) => { - dispatchCart({ - type: 'DELETE_ITEM', - payload: incomingProduct, - }) - }, []) - - const clearCart = useCallback(() => { - dispatchCart({ - type: 'CLEAR_CART', - }) - }, []) - - // calculate the new cart total whenever the cart changes - useEffect(() => { - if (!hasInitialized) return - - const newTotal = - cart?.items?.reduce((acc, item) => { - return ( - acc + - (typeof item.product === 'object' - ? JSON.parse(item?.product?.priceJSON || '{}')?.data?.[0]?.unit_amount * - (typeof item?.quantity === 'number' ? item?.quantity : 0) - : 0) - ) - }, 0) || 0 - - setTotal({ - formatted: (newTotal / 100).toLocaleString('en-US', { - currency: 'USD', - style: 'currency', - }), - raw: newTotal, - }) - }, [cart, hasInitialized]) - - return ( - - {children && children} - - ) -} diff --git a/templates/ecommerce/src/app/_providers/Cart/reducer.ts b/templates/ecommerce/src/app/_providers/Cart/reducer.ts deleted file mode 100644 index 04171b8e42..0000000000 --- a/templates/ecommerce/src/app/_providers/Cart/reducer.ts +++ /dev/null @@ -1,122 +0,0 @@ -import type { CartItems, Product, User } from '../../../payload/payload-types' - -export type CartItem = CartItems[0] - -type CartType = User['cart'] - -type CartAction = - | { - payload: CartItem - type: 'ADD_ITEM' - } - | { - payload: CartType - type: 'MERGE_CART' - } - | { - payload: CartType - type: 'SET_CART' - } - | { - payload: Product - type: 'DELETE_ITEM' - } - | { - type: 'CLEAR_CART' - } - -export const cartReducer = (cart: CartType, action: CartAction): CartType => { - switch (action.type) { - case 'SET_CART': { - return action.payload - } - - case 'MERGE_CART': { - const { payload: incomingCart } = action - - const syncedItems: CartItem[] = [ - ...(cart?.items || []), - ...(incomingCart?.items || []), - ].reduce((acc: CartItem[], item) => { - // remove duplicates - const productId = typeof item.product === 'string' ? item.product : item?.product?.id - - const indexInAcc = acc.findIndex(({ product }) => - typeof product === 'string' ? product === productId : product?.id === productId, - ) // eslint-disable-line function-paren-newline - - if (indexInAcc > -1) { - acc[indexInAcc] = { - ...acc[indexInAcc], - // customize the merge logic here, e.g.: - // quantity: acc[indexInAcc].quantity + item.quantity - } - } else { - acc.push(item) - } - return acc - }, []) - - return { - ...cart, - items: syncedItems, - } - } - - case 'ADD_ITEM': { - // if the item is already in the cart, increase the quantity - const { payload: incomingItem } = action - const productId = - typeof incomingItem.product === 'string' ? incomingItem.product : incomingItem?.product?.id - - const indexInCart = cart?.items?.findIndex(({ product }) => - typeof product === 'string' ? product === productId : product?.id === productId, - ) // eslint-disable-line function-paren-newline - - const withAddedItem = [...(cart?.items || [])] - - if (indexInCart === -1) { - withAddedItem.push(incomingItem) - } - - if (typeof indexInCart === 'number' && indexInCart > -1) { - withAddedItem[indexInCart] = { - ...withAddedItem[indexInCart], - quantity: (incomingItem.quantity || 0) > 0 ? incomingItem.quantity : undefined, - } - } - - return { - ...cart, - items: withAddedItem, - } - } - - case 'DELETE_ITEM': { - const { payload: incomingProduct } = action - const withDeletedItem = { ...cart } - - const indexInCart = cart?.items?.findIndex(({ product }) => - typeof product === 'string' - ? product === incomingProduct.id - : product?.id === incomingProduct.id, - ) // eslint-disable-line function-paren-newline - - if (typeof indexInCart === 'number' && withDeletedItem.items && indexInCart > -1) - withDeletedItem.items.splice(indexInCart, 1) - - return withDeletedItem - } - - case 'CLEAR_CART': { - return { - ...cart, - items: [], - } - } - - default: { - return cart - } - } -} diff --git a/templates/ecommerce/src/app/_providers/Theme/InitTheme/index.tsx b/templates/ecommerce/src/app/_providers/Theme/InitTheme/index.tsx deleted file mode 100644 index 206d655ee5..0000000000 --- a/templates/ecommerce/src/app/_providers/Theme/InitTheme/index.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import Script from 'next/script' - -import { defaultTheme, themeLocalStorageKey } from '../ThemeSelector/types' - -export const InitTheme: React.FC = () => { - return ( - // eslint-disable-next-line @next/next/no-before-interactive-script-outside-document -