chore: dynamically uses generated types via tsconfig paths

This commit is contained in:
James
2023-01-15 12:22:16 -05:00
parent 6903d7f52f
commit 0af29ff4db
14 changed files with 88 additions and 65 deletions

View File

@@ -57,6 +57,7 @@ module.exports = {
{
ignore: [
'payload-config',
'payload/generated-types',
],
},
],

View File

@@ -9,7 +9,7 @@ import { PayloadRequest } from '../../express/types';
export type Result = {
token: string
user: UserDocument
user: Record<string, unknown>
}
export type Arguments = {

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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
View 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>
}
}

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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 {

View File

@@ -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,7 +104,7 @@ export default buildConfig({
...uploadsDoc,
media: createdPNGDoc.id,
},
file: jpgFile
file: jpgFile,
});
const richTextDocWithRelId = JSON.parse(JSON.stringify(richTextDoc).replace('{{ARRAY_DOC_ID}}', createdArrayDoc.id));
@@ -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',
});
},
});

View File

@@ -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"
],