chore: dynamically uses generated types via tsconfig paths
This commit is contained in:
@@ -57,6 +57,7 @@ module.exports = {
|
||||
{
|
||||
ignore: [
|
||||
'payload-config',
|
||||
'payload/generated-types',
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -9,7 +9,7 @@ import { PayloadRequest } from '../../express/types';
|
||||
|
||||
export type Result = {
|
||||
token: string
|
||||
user: UserDocument
|
||||
user: Record<string, unknown>
|
||||
}
|
||||
|
||||
export type Arguments = {
|
||||
|
||||
@@ -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<T> = (_: unknown, args: {
|
||||
}
|
||||
) => Promise<T>
|
||||
|
||||
export default function findByIDResolver<T extends keyof BaseConfig['collections']>(collection: Collection): Resolver<BaseConfig['collections'][T]> {
|
||||
export default function findByIDResolver<T extends keyof SchemaConfig['collections']>(collection: Collection): Resolver<SchemaConfig['collections'][T]> {
|
||||
return async function resolver(_, args, context) {
|
||||
const { req } = context;
|
||||
if (args.locale) req.locale = args.locale;
|
||||
|
||||
@@ -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<Config extends BaseConfig, Slug extends keyof BaseConfig['collections']> = (_: unknown, args: {
|
||||
export type Resolver<TSlug extends keyof SchemaConfig['collections']> = (_: 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<Config extends BaseConfig, Slug extends keyof BaseConfig['c
|
||||
req: PayloadRequest,
|
||||
res: Response
|
||||
}
|
||||
) => Promise<Config['collections'][Slug]>
|
||||
) => Promise<SchemaConfig['collections'][TSlug]>
|
||||
|
||||
export default function updateResolver<Config extends BaseConfig, Slug extends keyof BaseConfig['collections']>(
|
||||
export default function updateResolver<TSlug extends keyof SchemaConfig['collections']>(
|
||||
collection: Collection,
|
||||
): Resolver<Config, Slug> {
|
||||
): Resolver<TSlug> {
|
||||
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<Config extends BaseConfig, Slug extends k
|
||||
autosave: args.autosave,
|
||||
};
|
||||
|
||||
const result = await update<Config, Slug>(options);
|
||||
const result = await update<TSlug>(options);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -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<T extends keyof BaseConfig['collections']> = {
|
||||
export type Options<T extends keyof GeneratedTypes['collections']> = {
|
||||
collection: T
|
||||
id: string
|
||||
depth?: number
|
||||
@@ -21,7 +21,7 @@ export type Options<T extends keyof BaseConfig['collections']> = {
|
||||
draft?: boolean
|
||||
}
|
||||
|
||||
export default async function findByIDLocal<T extends keyof BaseConfig['collections']>(payload: Payload<BaseConfig>, options: Options<T>): Promise<BaseConfig['collections'][T]> {
|
||||
export default async function findByIDLocal<T extends keyof GeneratedTypes['collections']>(payload: Payload, options: Options<T>): Promise<GeneratedTypes['collections'][T]> {
|
||||
const {
|
||||
collection: collectionSlug,
|
||||
depth,
|
||||
@@ -51,7 +51,7 @@ export default async function findByIDLocal<T extends keyof BaseConfig['collecti
|
||||
if (!req.t) req.t = req.i18n.t;
|
||||
if (!req.payloadDataLoader) req.payloadDataLoader = getDataLoader(req);
|
||||
|
||||
return findByID<BaseConfig['collections'][T]>({
|
||||
return findByID<GeneratedTypes['collections'][T]>({
|
||||
depth,
|
||||
currentDepth,
|
||||
id,
|
||||
|
||||
@@ -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<Config extends BaseConfig, Slug extends keyof BaseConfig['collections']> = {
|
||||
collection: Slug
|
||||
export type Options<TSlug extends keyof SchemaConfig['collections']> = {
|
||||
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<Config extends BaseConfig, Slug extends keyof BaseConfig['co
|
||||
autosave?: boolean
|
||||
}
|
||||
|
||||
export default async function updateLocal<Config extends BaseConfig, Slug extends keyof BaseConfig['collections']>(
|
||||
payload: Payload<BaseConfig>,
|
||||
options: Options<Config, Slug>,
|
||||
): Promise<Config['collections'][Slug]> {
|
||||
export default async function updateLocal<TSlug extends keyof SchemaConfig['collections']>(
|
||||
payload: Payload,
|
||||
options: Options<TSlug>,
|
||||
): Promise<SchemaConfig['collections'][TSlug]> {
|
||||
const {
|
||||
collection: collectionSlug,
|
||||
depth,
|
||||
@@ -79,5 +79,5 @@ export default async function updateLocal<Config extends BaseConfig, Slug extend
|
||||
req,
|
||||
};
|
||||
|
||||
return update<Config, Slug>(args);
|
||||
return update<TSlug>(args);
|
||||
}
|
||||
|
||||
@@ -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<T extends { [field: string]: unknown }> = {
|
||||
export type Arguments<T extends { [field: string | number | symbol]: unknown }> = {
|
||||
collection: Collection
|
||||
req: PayloadRequest
|
||||
id: string | number
|
||||
@@ -33,9 +33,9 @@ export type Arguments<T extends { [field: string]: unknown }> = {
|
||||
autosave?: boolean
|
||||
}
|
||||
|
||||
async function update<Config extends BaseConfig, Slug extends keyof BaseConfig['collections']>(
|
||||
incomingArgs: Arguments<Config['collections'][Slug]>,
|
||||
): Promise<Config['collections'][Slug]> {
|
||||
async function update<TSlug extends keyof SchemaConfig['collections']>(
|
||||
incomingArgs: Arguments<SchemaConfig['collections'][TSlug]>,
|
||||
): Promise<SchemaConfig['collections'][TSlug]> {
|
||||
let args = incomingArgs;
|
||||
|
||||
// /////////////////////////////////////
|
||||
@@ -150,7 +150,7 @@ async function update<Config extends BaseConfig, Slug extends keyof BaseConfig['
|
||||
// beforeValidate - Fields
|
||||
// /////////////////////////////////////
|
||||
|
||||
data = await beforeValidate<Config['collections'][Slug]>({
|
||||
data = await beforeValidate<SchemaConfig['collections'][TSlug]>({
|
||||
data,
|
||||
doc: originalDoc,
|
||||
entityConfig: collectionConfig,
|
||||
@@ -202,7 +202,7 @@ async function update<Config extends BaseConfig, Slug extends keyof BaseConfig['
|
||||
// beforeChange - Fields
|
||||
// /////////////////////////////////////
|
||||
|
||||
let result = await beforeChange<Config['collections'][Slug]>({
|
||||
let result = await beforeChange<SchemaConfig['collections'][TSlug]>({
|
||||
data,
|
||||
doc: originalDoc,
|
||||
docWithLocales,
|
||||
@@ -253,7 +253,7 @@ async function update<Config extends BaseConfig, Slug extends keyof BaseConfig['
|
||||
id,
|
||||
});
|
||||
|
||||
result = await saveCollectionDraft<Config['collections'][Slug]>({
|
||||
result = await saveCollectionDraft<SchemaConfig['collections'][TSlug]>({
|
||||
payload,
|
||||
config: collectionConfig,
|
||||
req,
|
||||
@@ -285,7 +285,7 @@ async function update<Config extends BaseConfig, Slug extends keyof BaseConfig['
|
||||
result = JSON.parse(resultString);
|
||||
}
|
||||
|
||||
result = sanitizeInternalFields<Config['collections'][Slug]>(result);
|
||||
result = sanitizeInternalFields<SchemaConfig['collections'][TSlug]>(result);
|
||||
|
||||
// /////////////////////////////////////
|
||||
// afterRead - Fields
|
||||
@@ -317,7 +317,7 @@ async function update<Config extends BaseConfig, Slug extends keyof BaseConfig['
|
||||
// afterChange - Fields
|
||||
// /////////////////////////////////////
|
||||
|
||||
result = await afterChange<Config['collections'][Slug]>({
|
||||
result = await afterChange<SchemaConfig['collections'][TSlug]>({
|
||||
data,
|
||||
doc: result,
|
||||
previousDoc: originalDoc,
|
||||
|
||||
@@ -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<string, unknown>
|
||||
}
|
||||
globals: {
|
||||
[slug: string | number | symbol]: Record<string, unknown>
|
||||
}
|
||||
}
|
||||
|
||||
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?: <C extends BaseConfig = any>(payload: Payload<C>) => Promise<void> | void;
|
||||
onInit?: (payload: Payload) => Promise<void> | 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?: <C extends BaseConfig = any>(payload: Payload<C>) => Promise<void> | void;
|
||||
onInit?: (payload: Payload) => Promise<void> | void;
|
||||
};
|
||||
|
||||
export type SanitizedConfig = Omit<
|
||||
|
||||
12
src/generated-types.ts
Normal file
12
src/generated-types.ts
Normal file
@@ -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<string, unknown>
|
||||
}
|
||||
globals: {
|
||||
[slug: string | number | symbol]: Record<string, unknown>
|
||||
}
|
||||
}
|
||||
10
src/index.ts
10
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<T extends BaseConfig = any>(options: InitOptions): Promise<Payload<T>> {
|
||||
const payload = await initHTTP<T>(options);
|
||||
export class PayloadHTTP extends BasePayload<GeneratedTypes> {
|
||||
async init(options: InitOptions): Promise<Payload> {
|
||||
const payload = await initHTTP(options);
|
||||
Object.assign(this, payload);
|
||||
return payload;
|
||||
}
|
||||
|
||||
@@ -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 <T extends BaseConfig>(options: InitOptions): Promise<Payload<T>> => {
|
||||
const payload = await getPayload<T>(options);
|
||||
export const initHTTP = async (options: InitOptions): Promise<Payload> => {
|
||||
const payload = await getPayload(options);
|
||||
|
||||
if (!options.local) {
|
||||
payload.router = express.Router();
|
||||
|
||||
@@ -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<Config extends BaseConfig = any> {
|
||||
export class BasePayload<TGeneratedTypes extends GeneratedTypes> {
|
||||
config: SanitizedConfig;
|
||||
|
||||
collections: {
|
||||
@@ -139,7 +139,7 @@ export class Payload<Config extends BaseConfig = any> {
|
||||
* @description Initializes Payload
|
||||
* @param options
|
||||
*/
|
||||
async init(options: InitOptions): Promise<Payload<Config>> {
|
||||
async init(options: InitOptions): Promise<Payload> {
|
||||
this.logger = Logger('payload', options.loggerOptions);
|
||||
this.mongoURL = options.mongoURL;
|
||||
|
||||
@@ -272,7 +272,7 @@ export class Payload<Config extends BaseConfig = any> {
|
||||
* @returns document with specified ID
|
||||
*/
|
||||
|
||||
findByID = async <T extends keyof Config['collections']>(options: FindByIDOptions<T>): Promise<Config['collections'][T]> => {
|
||||
findByID = async <T extends keyof TGeneratedTypes['collections']>(options: FindByIDOptions<T>): Promise<TGeneratedTypes['collections'][T]> => {
|
||||
const { findByID } = localOperations;
|
||||
return findByID<T>(this, options);
|
||||
}
|
||||
@@ -282,9 +282,9 @@ export class Payload<Config extends BaseConfig = any> {
|
||||
* @param options
|
||||
* @returns Updated document
|
||||
*/
|
||||
update = async <T extends keyof Config['collections']>(options: UpdateOptions<Config, T>): Promise<Config['collections'][T]> => {
|
||||
update = async <T extends keyof TGeneratedTypes['collections']>(options: UpdateOptions<T>): Promise<TGeneratedTypes['collections'][T]> => {
|
||||
const { update } = localOperations;
|
||||
return update<Config, T>(this, options);
|
||||
return update<T>(this, options);
|
||||
}
|
||||
|
||||
delete = async <T extends TypeWithID = any>(options: DeleteOptions): Promise<T> => {
|
||||
@@ -348,20 +348,22 @@ export class Payload<Config extends BaseConfig = any> {
|
||||
}
|
||||
}
|
||||
|
||||
let cached = global.payload;
|
||||
export type Payload = BasePayload<GeneratedTypes>
|
||||
|
||||
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 <T extends BaseConfig>(options: InitOptions): Promise<Payload<T>> => {
|
||||
export const getPayload = async (options: InitOptions): Promise<Payload> => {
|
||||
if (cached.payload) {
|
||||
return cached.payload;
|
||||
}
|
||||
|
||||
if (!cached.promise) {
|
||||
cached.promise = new Payload<T>().init(options);
|
||||
cached.promise = new BasePayload<GeneratedTypes>().init(options);
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
@@ -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<Config>) => {
|
||||
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',
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user