diff --git a/.eslintrc.js b/.eslintrc.js index 1ed087471..5d825c514 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -57,6 +57,7 @@ module.exports = { { ignore: [ 'payload-config', + 'payload/generated-types', ], }, ], diff --git a/src/auth/operations/resetPassword.ts b/src/auth/operations/resetPassword.ts index 7bbe9c645..2faadb62b 100644 --- a/src/auth/operations/resetPassword.ts +++ b/src/auth/operations/resetPassword.ts @@ -9,7 +9,7 @@ import { PayloadRequest } from '../../express/types'; export type Result = { token: string - user: UserDocument + user: Record } export type Arguments = { diff --git a/src/collections/graphql/resolvers/findByID.ts b/src/collections/graphql/resolvers/findByID.ts index 23dbe93d3..55d244149 100644 --- a/src/collections/graphql/resolvers/findByID.ts +++ b/src/collections/graphql/resolvers/findByID.ts @@ -1,4 +1,4 @@ -import { BaseConfig } from '../../../config/types'; +import { Config as SchemaConfig } from 'payload/generated-types'; import { PayloadRequest } from '../../../express/types'; import { Collection } from '../../config/types'; import findByID from '../../operations/findByID'; @@ -15,7 +15,7 @@ export type Resolver = (_: unknown, args: { } ) => Promise -export default function findByIDResolver(collection: Collection): Resolver { +export default function findByIDResolver(collection: Collection): Resolver { return async function resolver(_, args, context) { const { req } = context; if (args.locale) req.locale = args.locale; diff --git a/src/collections/graphql/resolvers/update.ts b/src/collections/graphql/resolvers/update.ts index 579f1d2e1..91dabe690 100644 --- a/src/collections/graphql/resolvers/update.ts +++ b/src/collections/graphql/resolvers/update.ts @@ -1,13 +1,13 @@ /* eslint-disable no-param-reassign */ import { Response } from 'express'; +import { Config as SchemaConfig } from 'payload/generated-types'; import { Collection } from '../../config/types'; import update from '../../operations/update'; import { PayloadRequest } from '../../../express/types'; -import { BaseConfig } from '../../../config/types'; -export type Resolver = (_: unknown, args: { +export type Resolver = (_: unknown, args: { id: string | number - data: Config['collections'][Slug] + data: SchemaConfig['collections'][TSlug] locale?: string draft: boolean autosave: boolean @@ -16,11 +16,11 @@ export type Resolver Promise +) => Promise -export default function updateResolver( +export default function updateResolver( collection: Collection, -): Resolver { +): Resolver { async function resolver(_, args, context) { if (args.locale) context.req.locale = args.locale; if (args.fallbackLocale) context.req.fallbackLocale = args.fallbackLocale; @@ -35,7 +35,7 @@ export default function updateResolver(options); + const result = await update(options); return result; } diff --git a/src/collections/operations/local/findByID.ts b/src/collections/operations/local/findByID.ts index cc02e191e..4848dad43 100644 --- a/src/collections/operations/local/findByID.ts +++ b/src/collections/operations/local/findByID.ts @@ -1,4 +1,4 @@ -import { BaseConfig } from '../../../config/types'; +import { Config as GeneratedTypes } from 'payload/generated-types'; import { PayloadRequest } from '../../../express/types'; import { Document } from '../../../types'; import findByID from '../findByID'; @@ -6,7 +6,7 @@ import { Payload } from '../../../payload'; import { getDataLoader } from '../../dataloader'; import i18n from '../../../translations/init'; -export type Options = { +export type Options = { collection: T id: string depth?: number @@ -21,7 +21,7 @@ export type Options = { draft?: boolean } -export default async function findByIDLocal(payload: Payload, options: Options): Promise { +export default async function findByIDLocal(payload: Payload, options: Options): Promise { const { collection: collectionSlug, depth, @@ -51,7 +51,7 @@ export default async function findByIDLocal({ + return findByID({ depth, currentDepth, id, diff --git a/src/collections/operations/local/update.ts b/src/collections/operations/local/update.ts index 22579e571..d34519da6 100644 --- a/src/collections/operations/local/update.ts +++ b/src/collections/operations/local/update.ts @@ -1,3 +1,4 @@ +import { Config as SchemaConfig } from 'payload/generated-types'; import { Payload } from '../../../payload'; import { Document } from '../../../types'; import getFileByPath from '../../../uploads/getFileByPath'; @@ -6,12 +7,11 @@ import { PayloadRequest } from '../../../express/types'; import { getDataLoader } from '../../dataloader'; import { File } from '../../../uploads/types'; import i18nInit from '../../../translations/init'; -import { BaseConfig } from '../../../config/types'; -export type Options = { - collection: Slug +export type Options = { + collection: TSlug id: string | number - data: Config['collections'][Slug] + data: SchemaConfig['collections'][TSlug] depth?: number locale?: string fallbackLocale?: string @@ -25,10 +25,10 @@ export type Options( - payload: Payload, - options: Options, -): Promise { +export default async function updateLocal( + payload: Payload, + options: Options, +): Promise { const { collection: collectionSlug, depth, @@ -79,5 +79,5 @@ export default async function updateLocal(args); + return update(args); } diff --git a/src/collections/operations/update.ts b/src/collections/operations/update.ts index 336dcdf03..a5b6ddcdf 100644 --- a/src/collections/operations/update.ts +++ b/src/collections/operations/update.ts @@ -1,5 +1,5 @@ import httpStatus from 'http-status'; -import { BaseConfig } from '../../config/types'; +import { Config as SchemaConfig } from 'payload/generated-types'; import { Where, Document } from '../../types'; import { Collection } from '../config/types'; import sanitizeInternalFields from '../../utilities/sanitizeInternalFields'; @@ -19,7 +19,7 @@ import { afterRead } from '../../fields/hooks/afterRead'; import { generateFileData } from '../../uploads/generateFileData'; import { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion'; -export type Arguments = { +export type Arguments = { collection: Collection req: PayloadRequest id: string | number @@ -33,9 +33,9 @@ export type Arguments = { autosave?: boolean } -async function update( - incomingArgs: Arguments, -): Promise { +async function update( + incomingArgs: Arguments, +): Promise { let args = incomingArgs; // ///////////////////////////////////// @@ -150,7 +150,7 @@ async function update({ + data = await beforeValidate({ data, doc: originalDoc, entityConfig: collectionConfig, @@ -202,7 +202,7 @@ async function update({ + let result = await beforeChange({ data, doc: originalDoc, docWithLocales, @@ -253,7 +253,7 @@ async function update({ + result = await saveCollectionDraft({ payload, config: collectionConfig, req, @@ -285,7 +285,7 @@ async function update(result); + result = sanitizeInternalFields(result); // ///////////////////////////////////// // afterRead - Fields @@ -317,7 +317,7 @@ async function update({ + result = await afterChange({ data, doc: result, previousDoc: originalDoc, diff --git a/src/config/types.ts b/src/config/types.ts index 7815f6946..afbe5a103 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -20,15 +20,6 @@ import { PayloadRequest } from '../express/types'; import { Where } from '../types'; import { User } from '../auth/types'; -export interface BaseConfig { - collections: { - [slug: string | number | symbol]: Record - } - globals: { - [slug: string | number | symbol]: Record - } -} - type Email = { fromName: string; fromAddress: string; @@ -109,7 +100,7 @@ export type InitOptions = { /** * A function that is called immediately following startup that receives the Payload instance as it's only argument. */ - onInit?: (payload: Payload) => Promise | void; + onInit?: (payload: Payload) => Promise | void; /** * Specify options for the built-in Pino logger that Payload uses for internal logging. @@ -541,7 +532,7 @@ export type Config = { /** Send anonymous telemetry data about general usage. */ telemetry?: boolean; /** A function that is called immediately following startup that receives the Payload instance as its only argument. */ - onInit?: (payload: Payload) => Promise | void; + onInit?: (payload: Payload) => Promise | void; }; export type SanitizedConfig = Omit< diff --git a/src/generated-types.ts b/src/generated-types.ts new file mode 100644 index 000000000..f69189f7f --- /dev/null +++ b/src/generated-types.ts @@ -0,0 +1,12 @@ +// This is a stub for Payload's generated types. +// It will not be used. +// Instead, configure a path within your `tsconfig.json`'s `compilerOptions.paths` to point to your generated types. + +export type Config = { + collections: { + [slug: string | number | symbol]: Record + } + globals: { + [slug: string | number | symbol]: Record + } +} diff --git a/src/index.ts b/src/index.ts index dffc9d6e4..74d240f5d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,17 +1,17 @@ +import { Config as GeneratedTypes } from 'payload/generated-types'; import { - BaseConfig, InitOptions, } from './config/types'; import { initHTTP } from './initHTTP'; -import { Payload } from './payload'; +import { Payload, BasePayload } from './payload'; export { getPayload } from './payload'; require('isomorphic-fetch'); -export class PayloadHTTP extends Payload { - async init(options: InitOptions): Promise> { - const payload = await initHTTP(options); +export class PayloadHTTP extends BasePayload { + async init(options: InitOptions): Promise { + const payload = await initHTTP(options); Object.assign(this, payload); return payload; } diff --git a/src/initHTTP.ts b/src/initHTTP.ts index 7356a4941..9a8ca3e2a 100644 --- a/src/initHTTP.ts +++ b/src/initHTTP.ts @@ -1,6 +1,7 @@ /* eslint-disable no-param-reassign */ import express, { NextFunction, Response } from 'express'; -import { BaseConfig, InitOptions } from './config/types'; +import { Config as GeneratedTypes } from 'payload/generated-types'; +import { InitOptions } from './config/types'; import authenticate from './express/middleware/authenticate'; import expressMiddleware from './express/middleware'; @@ -20,8 +21,8 @@ import { getDataLoader } from './collections/dataloader'; import mountEndpoints from './express/mountEndpoints'; import { Payload, getPayload } from './payload'; -export const initHTTP = async (options: InitOptions): Promise> => { - const payload = await getPayload(options); +export const initHTTP = async (options: InitOptions): Promise => { + const payload = await getPayload(options); if (!options.local) { payload.router = express.Router(); diff --git a/src/payload.ts b/src/payload.ts index 93cfbdb82..f22d4d693 100644 --- a/src/payload.ts +++ b/src/payload.ts @@ -4,6 +4,7 @@ import { GraphQLError, GraphQLFormattedError, GraphQLSchema } from 'graphql'; import crypto from 'crypto'; import path from 'path'; import mongoose from 'mongoose'; +import { Config as GeneratedTypes } from 'payload/generated-types'; import { TypeWithID, Collection, @@ -13,7 +14,6 @@ import { SanitizedConfig, EmailOptions, InitOptions, - BaseConfig, } from './config/types'; import { TypeWithVersion } from './versions/types'; import { PaginatedDocs } from './mongoose/types'; @@ -65,7 +65,7 @@ import findConfig from './config/find'; /** * @description Payload */ -export class Payload { +export class BasePayload { config: SanitizedConfig; collections: { @@ -139,7 +139,7 @@ export class Payload { * @description Initializes Payload * @param options */ - async init(options: InitOptions): Promise> { + async init(options: InitOptions): Promise { this.logger = Logger('payload', options.loggerOptions); this.mongoURL = options.mongoURL; @@ -272,7 +272,7 @@ export class Payload { * @returns document with specified ID */ - findByID = async (options: FindByIDOptions): Promise => { + findByID = async (options: FindByIDOptions): Promise => { const { findByID } = localOperations; return findByID(this, options); } @@ -282,9 +282,9 @@ export class Payload { * @param options * @returns Updated document */ - update = async (options: UpdateOptions): Promise => { + update = async (options: UpdateOptions): Promise => { const { update } = localOperations; - return update(this, options); + return update(this, options); } delete = async (options: DeleteOptions): Promise => { @@ -348,20 +348,22 @@ export class Payload { } } -let cached = global.payload; +export type Payload = BasePayload + +let cached = global._payload; if (!cached) { // eslint-disable-next-line no-multi-assign - cached = global.payload = { payload: null, promise: null }; + cached = global._payload = { payload: null, promise: null }; } -export const getPayload = async (options: InitOptions): Promise> => { +export const getPayload = async (options: InitOptions): Promise => { if (cached.payload) { return cached.payload; } if (!cached.promise) { - cached.promise = new Payload().init(options); + cached.promise = new BasePayload().init(options); } try { diff --git a/test/fields/config.ts b/test/fields/config.ts index 75285a028..8fe6cb361 100644 --- a/test/fields/config.ts +++ b/test/fields/config.ts @@ -23,6 +23,8 @@ import JSONFields, { jsonDoc } from './collections/JSON'; import RelationshipFields from './collections/Relationship'; import RadioFields, { radiosDoc } from './collections/Radio'; import Uploads2 from './collections/Upload2'; +import { Payload } from '../../src/payload'; +import { Config } from './payload-types'; export default buildConfig({ admin: { @@ -63,7 +65,7 @@ export default buildConfig({ locales: ['en', 'es'], fallback: true, }, - onInit: async (payload) => { + onInit: async (payload: Payload) => { await payload.create({ collection: 'users', data: { @@ -102,8 +104,8 @@ export default buildConfig({ ...uploadsDoc, media: createdPNGDoc.id, }, - file: jpgFile - }); + file: jpgFile, + }); const richTextDocWithRelId = JSON.parse(JSON.stringify(richTextDoc).replace('{{ARRAY_DOC_ID}}', createdArrayDoc.id)); const richTextDocWithRelationship = { ...richTextDocWithRelId }; @@ -128,5 +130,16 @@ export default buildConfig({ blocksDocWithRichText.localizedBlocks[0].richText = richTextDocWithRelationship.richText; await payload.create({ collection: 'block-fields', data: blocksDocWithRichText }); + + const arrayField = await payload.findByID({ + collection: 'array-fields', + id: 'test', + }); + + const updatedArray = await payload.update({ + collection: 'array-fields', + data: arrayField, + id: 'test', + }); }, }); diff --git a/tsconfig.json b/tsconfig.json index 977258503..22418458e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,9 @@ "strict": false, /* Enable all strict type-checking options. */ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ "paths": { + "payload/generated-types": [ + "./src/generated-types.ts", + ], "payload/config": [ "./src/config/types.ts" ],