diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ad7744834d8..2619788045f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -152,6 +152,8 @@ jobs: matrix: database: - mongodb + - documentdb + - cosmosdb - firestore - postgres - postgres-custom-schema diff --git a/packages/payload/src/database/getLocalizedPaths.ts b/packages/payload/src/database/getLocalizedPaths.ts index ad9aecca94d..82aa0d417c7 100644 --- a/packages/payload/src/database/getLocalizedPaths.ts +++ b/packages/payload/src/database/getLocalizedPaths.ts @@ -204,6 +204,11 @@ export function getLocalizedPaths({ case 'json': case 'richText': { const upcomingSegments = pathSegments.slice(i + 1).join('.') + pathSegments.forEach((path) => { + if (!/^\w+(?:\.\w+)*$/.test(path)) { + lastIncompletePath.invalid = true + } + }) lastIncompletePath.complete = true lastIncompletePath.path = upcomingSegments ? `${currentPath}.${upcomingSegments}` diff --git a/test/custom-graphql/int.spec.ts b/test/custom-graphql/int.spec.ts index fb86c56f442..879e7c5ce1e 100644 --- a/test/custom-graphql/int.spec.ts +++ b/test/custom-graphql/int.spec.ts @@ -22,7 +22,9 @@ describe('Custom GraphQL', () => { await payload.destroy() }) - if (!['sqlite', 'sqlite-uuid'].includes(process.env.PAYLOAD_DATABASE || '')) { + if ( + !['cosmosdb', 'firestore', 'sqlite', 'sqlite-uuid'].includes(process.env.PAYLOAD_DATABASE || '') + ) { describe('Isolated Transaction ID', () => { it('should isolate transaction IDs between queries in the same request', async () => { const query = `query { @@ -58,7 +60,7 @@ describe('Custom GraphQL', () => { }) }) } else { - it('should not run isolated transaction ID tests for sqlite', () => { + it('should not run isolated transaction ID tests for sqlite/firestore/cosmosdb', () => { expect(true).toBe(true) }) } diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index e932ab992d8..fc68b8054b1 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -1640,7 +1640,9 @@ describe('database', () => { describe('transactions', () => { describe('local api', () => { // sqlite cannot handle concurrent write transactions - if (!['sqlite', 'sqlite-uuid'].includes(process.env.PAYLOAD_DATABASE)) { + if ( + !['cosmosdb', 'firestore', 'sqlite', 'sqlite-uuid'].includes(process.env.PAYLOAD_DATABASE) + ) { it('should commit multiple operations in isolation', async () => { const req = { payload, diff --git a/test/generateDatabaseAdapter.ts b/test/generateDatabaseAdapter.ts index 7bab41aa349..55456627151 100644 --- a/test/generateDatabaseAdapter.ts +++ b/test/generateDatabaseAdapter.ts @@ -5,11 +5,7 @@ import { fileURLToPath } from 'node:url' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) -export const allDatabaseAdapters = { - mongodb: ` - import { mongooseAdapter } from '@payloadcms/db-mongodb' - - export const databaseAdapter = mongooseAdapter({ +const mongooseAdapterArgs = ` ensureIndexes: true, // required for connect to detect that we are using a memory server mongoMemoryServer: global._mongoMemoryServer, @@ -20,23 +16,38 @@ export const allDatabaseAdapters = { collation: { strength: 1, }, +` + +export const allDatabaseAdapters = { + mongodb: ` + import { mongooseAdapter } from '@payloadcms/db-mongodb' + + export const databaseAdapter = mongooseAdapter({ + ${mongooseAdapterArgs} + })`, + cosmosdb: ` + import { mongooseAdapter, compatibilityOptions } from '@payloadcms/db-mongodb' + + export const databaseAdapter = mongooseAdapter({ + ...compatibilityOptions.cosmosdb, + ${mongooseAdapterArgs} + })`, + documentdb: ` + import { mongooseAdapter, compatibilityOptions } from '@payloadcms/db-mongodb' + + export const databaseAdapter = mongooseAdapter({ + ...compatibilityOptions.documentdb, + ${mongooseAdapterArgs} })`, firestore: ` import { mongooseAdapter, compatibilityOptions } from '@payloadcms/db-mongodb' export const databaseAdapter = mongooseAdapter({ ...compatibilityOptions.firestore, - url: - process.env.DATABASE_URI || - process.env.MONGODB_MEMORY_SERVER_URI || - 'mongodb://127.0.0.1/payloadtests', - collation: { - strength: 1, - }, + ${mongooseAdapterArgs} // The following options prevent some tests from failing. // More work needed to get tests succeeding without these options. ensureIndexes: true, - transactionOptions: {}, disableIndexHints: false, useAlternativeDropDatabase: false, })`, diff --git a/test/helpers/isMongoose.ts b/test/helpers/isMongoose.ts index 2f1b7e152fd..3343d292793 100644 --- a/test/helpers/isMongoose.ts +++ b/test/helpers/isMongoose.ts @@ -1,8 +1,7 @@ import type { Payload } from 'payload' +export const mongooseList = ['cosmosdb', 'documentdb', 'firestore', 'mongodb'] + export function isMongoose(_payload?: Payload) { - return ( - _payload?.db?.name === 'mongoose' || - ['firestore', 'mongodb'].includes(process.env.PAYLOAD_DATABASE) - ) + return _payload?.db?.name === 'mongoose' || mongooseList.includes(process.env.PAYLOAD_DATABASE) } diff --git a/test/helpers/startMemoryDB.ts b/test/helpers/startMemoryDB.ts index 0f9536e4952..423a3c2bfa1 100644 --- a/test/helpers/startMemoryDB.ts +++ b/test/helpers/startMemoryDB.ts @@ -2,6 +2,7 @@ import { D1DatabaseAPI } from '@miniflare/d1' import { createSQLiteDB } from '@miniflare/shared' import dotenv from 'dotenv' import { MongoMemoryReplSet } from 'mongodb-memory-server' + dotenv.config() declare global { @@ -31,7 +32,7 @@ export default async () => { } if ( (!process.env.PAYLOAD_DATABASE || - ['firestore', 'mongodb'].includes(process.env.PAYLOAD_DATABASE)) && + ['cosmosdb', 'documentdb', 'firestore', 'mongodb'].includes(process.env.PAYLOAD_DATABASE)) && !global._mongoMemoryServer ) { console.log('Starting memory db...') diff --git a/test/localization/int.spec.ts b/test/localization/int.spec.ts index 7535e7901b3..c97cd67268a 100644 --- a/test/localization/int.spec.ts +++ b/test/localization/int.spec.ts @@ -14,6 +14,7 @@ import type { } from './payload-types.js' import { devUser } from '../credentials.js' +import { isMongoose, mongooseList } from '../helpers/isMongoose.js' // eslint-disable-next-line payload/no-relative-monorepo-imports import { copyDataFromLocaleHandler } from '../../packages/ui/src/utilities/copyDataFromLocale.js' @@ -398,7 +399,7 @@ describe('Localization', () => { expect(docs[2].id).toBe(doc_3.id) }) - if (['mongodb'].includes(process.env.PAYLOAD_DATABASE)) { + if (mongooseList.includes(process.env.PAYLOAD_DATABASE)) { describe('Localized sorting', () => { let localizedAccentPostOne: LocalizedPost let localizedAccentPostTwo: LocalizedPost @@ -1249,7 +1250,7 @@ describe('Localization', () => { }) // eslint-disable-next-line jest/no-conditional-in-test - if (['firestore', 'mongodb'].includes(process.env.PAYLOAD_DATABASE!)) { + if (isMongoose(payload)) { expect(docWithoutFallback.items).toStrictEqual(null) } else { // TODO: build out compatability with SQL databases diff --git a/test/relationships/int.spec.ts b/test/relationships/int.spec.ts index ab36e2b26e8..03e4265f05b 100644 --- a/test/relationships/int.spec.ts +++ b/test/relationships/int.spec.ts @@ -17,6 +17,7 @@ import type { } from './payload-types.js' import { initPayloadInt } from '../helpers/initPayloadInt.js' +import { mongooseList } from '../helpers/isMongoose.js' import { chainedRelSlug, customIdNumberSlug, @@ -38,7 +39,7 @@ const dirname = path.dirname(filename) type EasierChained = { id: string; relation: EasierChained } -const mongoIt = ['firestore', 'mongodb'].includes(process.env.PAYLOAD_DATABASE || '') ? it : it.skip +const mongoIt = mongooseList.includes(process.env.PAYLOAD_DATABASE || '') ? it : it.skip describe('Relationships', () => { beforeAll(async () => {