Merge branch 'feat/db-adapters' of github.com:payloadcms/payload into feat/db-adapters
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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') {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -10,4 +10,6 @@ export const operatorMap = {
|
||||
exists: '$exists',
|
||||
equals: '$eq',
|
||||
near: '$near',
|
||||
within: '$geoWithin',
|
||||
intersects: '$geoIntersects',
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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' };
|
||||
|
||||
@@ -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
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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[]],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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') {
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user