Merge branch 'feat/db-adapters' of github.com:payloadcms/payload into feat/db-adapters

This commit is contained in:
James
2023-08-25 15:59:30 -04:00
287 changed files with 5636 additions and 3278 deletions

View File

@@ -12,8 +12,8 @@
"devDependencies": {
"@types/mongoose-aggregate-paginate-v2": "^1.0.5",
"mongodb-memory-server": "^8.13.0",
"payload": "^1.11.8",
"typescript": "^4.9.4"
"typescript": "^4.9.4",
"payload": "payloadcms/payload#build/chore/update-2.0"
},
"dependencies": {
"bson-objectid": "^2.0.4",
@@ -24,4 +24,4 @@
"mongoose-paginate-v2": "1.7.22",
"uuid": "^9.0.0"
}
}
}

View File

@@ -3,7 +3,7 @@
/* eslint-disable @typescript-eslint/no-use-before-define */
/* eslint-disable no-use-before-define */
import { IndexOptions, Schema, SchemaOptions, SchemaTypeOptions } from 'mongoose';
import { SanitizedConfig } from 'payload/dist/config/types';
import { SanitizedConfig, SanitizedLocalizationConfig } from 'payload/dist/config/types';
import {
ArrayField,
Block,
@@ -66,10 +66,10 @@ const formatBaseSchema = (field: FieldAffectingData, buildSchemaOptions: BuildSc
return schema;
};
const localizeSchema = (entity: NonPresentationalField | Tab, schema, localization) => {
const localizeSchema = (entity: NonPresentationalField | Tab, schema, localization: false | SanitizedLocalizationConfig) => {
if (fieldIsLocalized(entity) && localization && Array.isArray(localization.locales)) {
return {
type: localization.locales.reduce((localeSchema, locale) => ({
type: localization.localeCodes.reduce((localeSchema, locale) => ({
...localeSchema,
[locale]: schema,
}), {
@@ -242,7 +242,7 @@ const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = {
if (field.localized && config.localization) {
schemaToReturn = {
type: config.localization.locales.reduce((locales, locale) => {
type: config.localization.localeCodes.reduce((locales, locale) => {
let localeSchema: { [key: string]: any } = {};
if (hasManyRelations) {
@@ -454,10 +454,10 @@ const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = {
});
if (field.localized && config.localization) {
config.localization.locales.forEach((locale) => {
config.localization.localeCodes.forEach((localeCode) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore Possible incorrect typing in mongoose types, this works
schema.path(`${field.name}.${locale}`).discriminator(blockItem.slug, blockSchema);
schema.path(`${field.name}.${localeCode}`).discriminator(blockItem.slug, blockSchema);
});
} else {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment

View File

@@ -2,8 +2,10 @@ import mongoose from 'mongoose';
import objectID from 'bson-objectid';
import { getLocalizedPaths } from 'payload/dist/database/getLocalizedPaths';
import { Field, fieldAffectsData } from 'payload/dist/fields/config/types';
import { PathToQuery, validOperators } from 'payload/dist/database/queryValidation/types';
import { PathToQuery } from 'payload/dist/database/queryValidation/types';
import { validOperators } from 'payload/dist/types/constants';
import { Payload } from 'payload';
import { Operator } from 'payload/types';
import { operatorMap } from './operatorMap';
import { sanitizeQueryValue } from './sanitizeQueryValue';
import { MongooseAdapter } from '..';
@@ -179,7 +181,7 @@ export async function buildSearchParam({
return relationshipQuery;
}
if (operator && validOperators.includes(operator)) {
if (operator && validOperators.includes(operator as Operator)) {
const operatorKey = operatorMap[operator];
if (field.type === 'relationship' || field.type === 'upload') {

View File

@@ -1,11 +1,11 @@
import { PaginateOptions } from 'mongoose';
import { Config } from 'payload/dist/config/types';
import { SanitizedConfig } from 'payload/dist/config/types';
import { Field } from 'payload/dist/fields/config/types';
import { getLocalizedSortProperty } from './getLocalizedSortProperty';
type Args = {
sort: string
config: Config
config: SanitizedConfig
fields: Field[]
timestamps: boolean
locale: string

View File

@@ -1,3 +1,4 @@
import { sanitizeConfig } from 'payload/dist/config/sanitize';
import { Config } from 'payload/dist/config/types';
import { getLocalizedSortProperty } from './getLocalizedSortProperty';
@@ -11,7 +12,7 @@ describe('get localized sort property', () => {
it('passes through a non-localized sort property', () => {
const result = getLocalizedSortProperty({
segments: ['title'],
config,
config: sanitizeConfig(config),
fields: [
{
name: 'title',
@@ -27,7 +28,7 @@ describe('get localized sort property', () => {
it('properly localizes an un-localized sort property', () => {
const result = getLocalizedSortProperty({
segments: ['title'],
config,
config: sanitizeConfig(config),
fields: [
{
name: 'title',
@@ -44,7 +45,7 @@ describe('get localized sort property', () => {
it('keeps specifically asked-for localized sort properties', () => {
const result = getLocalizedSortProperty({
segments: ['title', 'es'],
config,
config: sanitizeConfig(config),
fields: [
{
name: 'title',
@@ -61,7 +62,7 @@ describe('get localized sort property', () => {
it('properly localizes nested sort properties', () => {
const result = getLocalizedSortProperty({
segments: ['group', 'title'],
config,
config: sanitizeConfig(config),
fields: [
{
name: 'group',
@@ -84,7 +85,7 @@ describe('get localized sort property', () => {
it('keeps requested locale with nested sort properties', () => {
const result = getLocalizedSortProperty({
segments: ['group', 'title', 'es'],
config,
config: sanitizeConfig(config),
fields: [
{
name: 'group',
@@ -107,7 +108,7 @@ describe('get localized sort property', () => {
it('properly localizes field within row', () => {
const result = getLocalizedSortProperty({
segments: ['title'],
config,
config: sanitizeConfig(config),
fields: [
{
type: 'row',
@@ -129,7 +130,7 @@ describe('get localized sort property', () => {
it('properly localizes field within named tab', () => {
const result = getLocalizedSortProperty({
segments: ['tab', 'title'],
config,
config: sanitizeConfig(config),
fields: [
{
type: 'tabs',
@@ -156,7 +157,7 @@ describe('get localized sort property', () => {
it('properly localizes field within unnamed tab', () => {
const result = getLocalizedSortProperty({
segments: ['title'],
config,
config: sanitizeConfig(config),
fields: [
{
type: 'tabs',

View File

@@ -1,10 +1,10 @@
import { Config } from 'payload/dist/config/types';
import { SanitizedConfig } from 'payload/dist/config/types';
import { Field, fieldAffectsData, fieldIsPresentationalOnly } from 'payload/dist/fields/config/types';
import flattenTopLevelFields from 'payload/dist/utilities/flattenTopLevelFields';
type Args = {
segments: string[]
config: Config
config: SanitizedConfig
fields: Field[]
locale: string
result?: string
@@ -42,7 +42,7 @@ export const getLocalizedSortProperty = ({
if (matchedField.localized) {
// Check to see if next segment is a locale
if (segments.length > 0) {
const nextSegmentIsLocale = config.localization.locales.includes(remainingSegments[0]);
const nextSegmentIsLocale = config.localization.localeCodes.includes(remainingSegments[0]);
// If next segment is locale, remove it from remaining segments
// and use it to localize the current segment

View File

@@ -10,4 +10,6 @@ export const operatorMap = {
exists: '$exists',
equals: '$eq',
near: '$near',
within: '$geoWithin',
intersects: '$geoIntersects',
};

View File

@@ -2,10 +2,10 @@
/* eslint-disable no-await-in-loop */
import { FilterQuery } from 'mongoose';
import deepmerge from 'deepmerge';
import { Where } from 'payload/types';
import { Operator, Where } from 'payload/types';
import { combineMerge } from 'payload/dist/utilities/combineMerge';
import { Field } from 'payload/dist/fields/config/types';
import { validOperators } from 'payload/dist/database/queryValidation/types';
import { validOperators } from 'payload/dist/types/constants';
import { Payload } from 'payload';
import { buildSearchParam } from './buildSearchParams';
import { buildAndOrConditions } from './buildAndOrConditions';
@@ -54,7 +54,7 @@ export async function parseParams({
const pathOperators = where[relationOrPath];
if (typeof pathOperators === 'object') {
for (const operator of Object.keys(pathOperators)) {
if (validOperators.includes(operator)) {
if (validOperators.includes(operator as Operator)) {
const searchParam = await buildSearchParam({
collectionSlug,
globalSlug,

View File

@@ -95,7 +95,7 @@ export const sanitizeQueryValue = ({ field, path, operator, val, hasCustomID }:
[lng, lat, maxDistance, minDistance] = createArrayFromCommaDelineated(formattedValue);
}
if (!lng || !lat || (!maxDistance && !minDistance)) {
if (lng == null || lat == null || (maxDistance == null && minDistance == null)) {
formattedValue = undefined;
} else {
formattedValue = {
@@ -107,6 +107,12 @@ export const sanitizeQueryValue = ({ field, path, operator, val, hasCustomID }:
}
}
if (operator === 'within' || operator === 'intersects') {
formattedValue = {
$geometry: formattedValue,
};
}
if (path !== '_id' || (path === '_id' && hasCustomID && field.type === 'text')) {
if (operator === 'contains') {
formattedValue = { $regex: formattedValue, $options: 'i' };

View File

@@ -1,15 +1,16 @@
import { ValidationError } from 'payload/errors';
import type { PayloadRequest } from 'payload/types';
import type { UpdateOne } from 'payload/dist/database/types';
import sanitizeInternalFields from './utilities/sanitizeInternalFields';
import i18nInit from 'payload/dist/translations/init';
import sanitizeInternalFields from './utilities/sanitizeInternalFields';
import type { MongooseAdapter } from '.';
import { withSession } from './withSession';
export const updateOne: UpdateOne = async function updateOne(
this: MongooseAdapter,
{ collection, data, where, locale, req = {} as PayloadRequest },
{ collection, data, where: whereArg, id, locale, req = {} as PayloadRequest },
) {
const where = id ? { id: { equals: id } } : whereArg;
const Model = this.collections[collection];
const options = {
...withSession(this, req.transactionID),
@@ -25,7 +26,7 @@ export const updateOne: UpdateOne = async function updateOne(
let result;
try {
result = await Model.findOneAndUpdate(query, data, options).lean();
result = await Model.findOneAndUpdate(query, data, options);
} catch (error) {
// Handle uniqueness error from MongoDB
throw error.code === 11000 && error.keyValue

File diff suppressed because it is too large Load Diff

View File

@@ -10,8 +10,7 @@
"build": "tsc"
},
"peerDependencies": {
"better-sqlite3": "^8.5.0",
"payload": "^1.12.0"
"better-sqlite3": "^8.5.0"
},
"dependencies": {
"@libsql/client": "^0.3.1",
@@ -25,7 +24,7 @@
"@types/pg": "^8.10.2",
"@types/to-snake-case": "^1.0.0",
"better-sqlite3": "^8.5.0",
"payload": "^1.12.0",
"payload": "payloadcms/payload#build/chore/update-2.0",
"typescript": "^4.9.4"
}
}

View File

@@ -9,7 +9,9 @@ export const init: Init = async function init(this: PostgresAdapter) {
if (this.payload.config.localization) {
this.enums._locales = pgEnum(
'_locales',
this.payload.config.localization.locales as [string, ...string[]],
// TODO: types out of sync with core, monorepo please
// this.payload.config.localization.localeCodes,
(this.payload.config.localization.locales as unknown as {code: string}[]).map(({ code }) => code) as [string, ...string[]],
);
}

View File

@@ -3,7 +3,9 @@ import { inArray } from 'drizzle-orm';
import { a as SQL } from 'drizzle-orm/column.d-aa4e525d';
import { getLocalizedPaths } from 'payload/dist/database/getLocalizedPaths';
import { Field, fieldAffectsData } from 'payload/dist/fields/config/types';
import { PathToQuery, validOperators } from 'payload/dist/database/queryValidation/types';
import { PathToQuery } from 'payload/dist/database/queryValidation/types';
import { validOperators } from 'payload/dist/types/constants';
import { Operator } from 'payload/types';
import { operatorMap } from './operatorMap';
import { PostgresAdapter } from '../types';
@@ -177,7 +179,7 @@ export async function buildSearchParam({
return relationshipQuery;
}
if (operator && validOperators.includes(operator)) {
if (operator && validOperators.includes(operator as Operator)) {
const operatorKey = operatorMap[operator];
if (field.type === 'relationship' || field.type === 'upload') {

View File

@@ -1,8 +1,8 @@
/* eslint-disable no-restricted-syntax */
/* eslint-disable no-await-in-loop */
import { Where } from 'payload/types';
import { Operator, Where } from 'payload/types';
import { Field } from 'payload/dist/fields/config/types';
import { validOperators } from 'payload/dist/database/queryValidation/types';
import { validOperators } from 'payload/dist/types/constants';
import { and, SQL } from 'drizzle-orm';
import { buildSearchParam } from './buildSearchParams';
import { buildAndOrConditions } from './buildAndOrConditions';
@@ -53,7 +53,7 @@ export async function parseParams({
const pathOperators = where[relationOrPath];
if (typeof pathOperators === 'object') {
for (const operator of Object.keys(pathOperators)) {
if (validOperators.includes(operator)) {
if (validOperators.includes(operator as Operator)) {
const searchParam = await buildSearchParam({
collectionSlug,
globalSlug,

File diff suppressed because it is too large Load Diff