diff --git a/packages/graphql/.swcrc b/packages/graphql/.swcrc new file mode 100644 index 000000000..d46b555fe --- /dev/null +++ b/packages/graphql/.swcrc @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": "inline", + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true + } + }, + "module": { + "type": "commonjs" + } +} diff --git a/packages/graphql/package.json b/packages/graphql/package.json new file mode 100644 index 000000000..4c6e2309e --- /dev/null +++ b/packages/graphql/package.json @@ -0,0 +1,51 @@ +{ + "name": "@payloadcms/graphql", + "version": "0.0.1", + "private": true, + "main": "./src/index.ts", + "types": "./src/index.d.ts", + "scripts": { + "build": "pnpm build:swc && pnpm build:types", + "build:swc": "swc ./src -d ./dist --config-file .swcrc", + "build:types": "tsc --emitDeclarationOnly --outDir dist" + }, + "exports": { + ".": { + "import": "./src/index.ts", + "require": "./src/index.ts", + "types": "./src/index.ts" + } + }, + "devDependencies": { + "@payloadcms/eslint-config": "workspace:*", + "payload": "workspace:*", + "ts-essentials": "7.0.3" + }, + "dependencies": { + "graphql": "16.8.1", + "graphql-http": "^1.22.0", + "graphql-playground-html": "1.6.30", + "graphql-query-complexity": "0.12.0", + "graphql-scalars": "1.22.2", + "graphql-type-json": "0.3.2", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "payload": "^2.0.0" + }, + "publishConfig": { + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index/*.js", + "require": "./dist/index/*.js", + "types": "./dist/index/*.d.ts" + } + }, + "registry": "https://registry.npmjs.org/" + }, + "files": [ + "dist" + ] +} diff --git a/packages/next/src/graphql/schema/configToSchema.ts b/packages/graphql/src/index.ts similarity index 76% rename from packages/next/src/graphql/schema/configToSchema.ts rename to packages/graphql/src/index.ts index 04bebdb9f..4e44da6ed 100644 --- a/packages/next/src/graphql/schema/configToSchema.ts +++ b/packages/graphql/src/index.ts @@ -1,25 +1,25 @@ /* eslint-disable no-param-reassign */ import * as GraphQL from 'graphql' -import { GraphQLObjectType, GraphQLSchema } from 'graphql' import { OperationArgs } from 'graphql-http' -import queryComplexity, { +import { fieldExtensionsEstimator, simpleEstimator, + createComplexityRule, } from 'graphql-query-complexity' import type { GraphQLInfo } from 'payload/config' import type { SanitizedConfig } from 'payload/types' -import accessResolver from '../resolvers/auth/access' -import initCollections from '../initCollections' -import initGlobals from '../initGlobals' -import buildFallbackLocaleInputType from './buildFallbackLocaleInputType' -import buildLocaleInputType from './buildLocaleInputType' -import buildPoliciesType from './buildPoliciesType' -import { wrapCustomFields } from '../utilities/wrapCustomResolver' +import accessResolver from './resolvers/auth/access' +import initCollections from './schema/initCollections' +import initGlobals from './schema/initGlobals' +import buildFallbackLocaleInputType from './schema/buildFallbackLocaleInputType' +import buildLocaleInputType from './schema/buildLocaleInputType' +import buildPoliciesType from './schema/buildPoliciesType' +import { wrapCustomFields } from './utilities/wrapCustomResolver' export async function configToSchema(config: SanitizedConfig): Promise<{ - schema: GraphQLSchema + schema: GraphQL.GraphQLSchema validationRules: (args: OperationArgs) => GraphQL.ValidationRule[] }> { const collections = config.collections.reduce((acc, collection) => { @@ -97,24 +97,24 @@ export async function configToSchema(config: SanitizedConfig): Promise<{ } } - const query = new GraphQLObjectType(graphqlResult.Query) - const mutation = new GraphQLObjectType(graphqlResult.Mutation) + const query = new GraphQL.GraphQLObjectType(graphqlResult.Query) + const mutation = new GraphQL.GraphQLObjectType(graphqlResult.Mutation) const schemaToCreate = { mutation, query, } - const schema = new GraphQLSchema(schemaToCreate) + const schema = new GraphQL.GraphQLSchema(schemaToCreate) - const validationRules = ({ variableValues }) => [ - queryComplexity({ + const validationRules = (args) => [ + createComplexityRule({ estimators: [ fieldExtensionsEstimator(), simpleEstimator({ defaultComplexity: 1 }), // Fallback if complexity not set ], maximumComplexity: config.graphQL.maxComplexity, - variables: variableValues, + variables: args.variableValues, // onComplete: (complexity) => { console.log('Query Complexity:', complexity); }, }), ] diff --git a/packages/next/src/graphql/resolvers/auth/access.ts b/packages/graphql/src/resolvers/auth/access.ts similarity index 100% rename from packages/next/src/graphql/resolvers/auth/access.ts rename to packages/graphql/src/resolvers/auth/access.ts diff --git a/packages/next/src/graphql/resolvers/auth/forgotPassword.ts b/packages/graphql/src/resolvers/auth/forgotPassword.ts similarity index 100% rename from packages/next/src/graphql/resolvers/auth/forgotPassword.ts rename to packages/graphql/src/resolvers/auth/forgotPassword.ts diff --git a/packages/next/src/graphql/resolvers/auth/init.ts b/packages/graphql/src/resolvers/auth/init.ts similarity index 100% rename from packages/next/src/graphql/resolvers/auth/init.ts rename to packages/graphql/src/resolvers/auth/init.ts diff --git a/packages/next/src/graphql/resolvers/auth/login.ts b/packages/graphql/src/resolvers/auth/login.ts similarity index 92% rename from packages/next/src/graphql/resolvers/auth/login.ts rename to packages/graphql/src/resolvers/auth/login.ts index 12fb8088d..564475b05 100644 --- a/packages/next/src/graphql/resolvers/auth/login.ts +++ b/packages/graphql/src/resolvers/auth/login.ts @@ -1,8 +1,8 @@ import { loginOperation } from 'payload/operations' +import { generatePayloadCookie } from 'payload/auth' import type { Collection } from 'payload/types' import isolateTransactionID from '../../utilities/isolateTransactionID' -import { generatePayloadCookie } from '../../../utilities/cookies' import { Context } from '../types' function loginResolver(collection: Collection) { diff --git a/packages/next/src/graphql/resolvers/auth/logout.ts b/packages/graphql/src/resolvers/auth/logout.ts similarity index 90% rename from packages/next/src/graphql/resolvers/auth/logout.ts rename to packages/graphql/src/resolvers/auth/logout.ts index 04c358f5b..e3e958c4b 100644 --- a/packages/next/src/graphql/resolvers/auth/logout.ts +++ b/packages/graphql/src/resolvers/auth/logout.ts @@ -1,8 +1,8 @@ import { logoutOperation } from 'payload/operations' +import { generateExpiredPayloadCookie } from 'payload/auth' import type { Collection } from 'payload/types' import isolateTransactionID from '../../utilities/isolateTransactionID' -import { generateExpiredPayloadCookie } from '../../../utilities/cookies' import { Context } from '../types' function logoutResolver(collection: Collection): any { diff --git a/packages/next/src/graphql/resolvers/auth/me.ts b/packages/graphql/src/resolvers/auth/me.ts similarity index 100% rename from packages/next/src/graphql/resolvers/auth/me.ts rename to packages/graphql/src/resolvers/auth/me.ts diff --git a/packages/next/src/graphql/resolvers/auth/refresh.ts b/packages/graphql/src/resolvers/auth/refresh.ts similarity index 88% rename from packages/next/src/graphql/resolvers/auth/refresh.ts rename to packages/graphql/src/resolvers/auth/refresh.ts index 7d518ada3..3562a3850 100644 --- a/packages/next/src/graphql/resolvers/auth/refresh.ts +++ b/packages/graphql/src/resolvers/auth/refresh.ts @@ -1,9 +1,8 @@ import { refreshOperation } from 'payload/operations' +import { generatePayloadCookie, extractJWT } from 'payload/auth' import type { Collection } from 'payload/types' import isolateTransactionID from '../../utilities/isolateTransactionID' -import { extractJWT } from '../../../utilities/jwt' -import { generatePayloadCookie } from '../../../utilities/cookies' import { Context } from '../types' function refreshResolver(collection: Collection) { diff --git a/packages/next/src/graphql/resolvers/auth/resetPassword.ts b/packages/graphql/src/resolvers/auth/resetPassword.ts similarity index 93% rename from packages/next/src/graphql/resolvers/auth/resetPassword.ts rename to packages/graphql/src/resolvers/auth/resetPassword.ts index dfc0eb9e0..dcc4cb9a0 100644 --- a/packages/next/src/graphql/resolvers/auth/resetPassword.ts +++ b/packages/graphql/src/resolvers/auth/resetPassword.ts @@ -1,8 +1,8 @@ import { resetPasswordOperation } from 'payload/operations' +import { generatePayloadCookie } from 'payload/auth' import type { Collection } from 'payload/types' import isolateTransactionID from '../../utilities/isolateTransactionID' -import { generatePayloadCookie } from '../../../utilities/cookies' import { Context } from '../types' function resetPasswordResolver(collection: Collection) { diff --git a/packages/next/src/graphql/resolvers/auth/unlock.ts b/packages/graphql/src/resolvers/auth/unlock.ts similarity index 100% rename from packages/next/src/graphql/resolvers/auth/unlock.ts rename to packages/graphql/src/resolvers/auth/unlock.ts diff --git a/packages/next/src/graphql/resolvers/auth/verifyEmail.ts b/packages/graphql/src/resolvers/auth/verifyEmail.ts similarity index 100% rename from packages/next/src/graphql/resolvers/auth/verifyEmail.ts rename to packages/graphql/src/resolvers/auth/verifyEmail.ts diff --git a/packages/next/src/graphql/resolvers/collections/create.ts b/packages/graphql/src/resolvers/collections/create.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/create.ts rename to packages/graphql/src/resolvers/collections/create.ts diff --git a/packages/next/src/graphql/resolvers/collections/delete.ts b/packages/graphql/src/resolvers/collections/delete.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/delete.ts rename to packages/graphql/src/resolvers/collections/delete.ts diff --git a/packages/next/src/graphql/resolvers/collections/docAccess.ts b/packages/graphql/src/resolvers/collections/docAccess.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/docAccess.ts rename to packages/graphql/src/resolvers/collections/docAccess.ts diff --git a/packages/next/src/graphql/resolvers/collections/find.ts b/packages/graphql/src/resolvers/collections/find.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/find.ts rename to packages/graphql/src/resolvers/collections/find.ts diff --git a/packages/next/src/graphql/resolvers/collections/findByID.ts b/packages/graphql/src/resolvers/collections/findByID.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/findByID.ts rename to packages/graphql/src/resolvers/collections/findByID.ts diff --git a/packages/next/src/graphql/resolvers/collections/findVersionByID.ts b/packages/graphql/src/resolvers/collections/findVersionByID.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/findVersionByID.ts rename to packages/graphql/src/resolvers/collections/findVersionByID.ts diff --git a/packages/next/src/graphql/resolvers/collections/findVersions.ts b/packages/graphql/src/resolvers/collections/findVersions.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/findVersions.ts rename to packages/graphql/src/resolvers/collections/findVersions.ts diff --git a/packages/next/src/graphql/resolvers/collections/restoreVersion.ts b/packages/graphql/src/resolvers/collections/restoreVersion.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/restoreVersion.ts rename to packages/graphql/src/resolvers/collections/restoreVersion.ts diff --git a/packages/next/src/graphql/resolvers/collections/update.ts b/packages/graphql/src/resolvers/collections/update.ts similarity index 100% rename from packages/next/src/graphql/resolvers/collections/update.ts rename to packages/graphql/src/resolvers/collections/update.ts diff --git a/packages/next/src/graphql/resolvers/globals/docAccess.ts b/packages/graphql/src/resolvers/globals/docAccess.ts similarity index 100% rename from packages/next/src/graphql/resolvers/globals/docAccess.ts rename to packages/graphql/src/resolvers/globals/docAccess.ts diff --git a/packages/next/src/graphql/resolvers/globals/findOne.ts b/packages/graphql/src/resolvers/globals/findOne.ts similarity index 100% rename from packages/next/src/graphql/resolvers/globals/findOne.ts rename to packages/graphql/src/resolvers/globals/findOne.ts diff --git a/packages/next/src/graphql/resolvers/globals/findVersionByID.ts b/packages/graphql/src/resolvers/globals/findVersionByID.ts similarity index 100% rename from packages/next/src/graphql/resolvers/globals/findVersionByID.ts rename to packages/graphql/src/resolvers/globals/findVersionByID.ts diff --git a/packages/next/src/graphql/resolvers/globals/findVersions.ts b/packages/graphql/src/resolvers/globals/findVersions.ts similarity index 100% rename from packages/next/src/graphql/resolvers/globals/findVersions.ts rename to packages/graphql/src/resolvers/globals/findVersions.ts diff --git a/packages/next/src/graphql/resolvers/globals/index.ts b/packages/graphql/src/resolvers/globals/index.ts similarity index 100% rename from packages/next/src/graphql/resolvers/globals/index.ts rename to packages/graphql/src/resolvers/globals/index.ts diff --git a/packages/next/src/graphql/resolvers/globals/restoreVersion.ts b/packages/graphql/src/resolvers/globals/restoreVersion.ts similarity index 100% rename from packages/next/src/graphql/resolvers/globals/restoreVersion.ts rename to packages/graphql/src/resolvers/globals/restoreVersion.ts diff --git a/packages/next/src/graphql/resolvers/globals/update.ts b/packages/graphql/src/resolvers/globals/update.ts similarity index 100% rename from packages/next/src/graphql/resolvers/globals/update.ts rename to packages/graphql/src/resolvers/globals/update.ts index 4b3dd1d3e..18894581f 100644 --- a/packages/next/src/graphql/resolvers/globals/update.ts +++ b/packages/graphql/src/resolvers/globals/update.ts @@ -1,9 +1,9 @@ import { updateOperationGlobal } from 'payload/operations' import type { DeepPartial } from 'ts-essentials' +import type { GeneratedTypes } from 'payload' import type { PayloadRequest, SanitizedGlobalConfig } from 'payload/types' import isolateTransactionID from '../../utilities/isolateTransactionID' -import type { GeneratedTypes } from 'payload' import { Context } from '../types' type Resolver = ( diff --git a/packages/next/src/graphql/resolvers/types.ts b/packages/graphql/src/resolvers/types.ts similarity index 100% rename from packages/next/src/graphql/resolvers/types.ts rename to packages/graphql/src/resolvers/types.ts diff --git a/packages/next/src/graphql/schema/buildFallbackLocaleInputType.ts b/packages/graphql/src/schema/buildFallbackLocaleInputType.ts similarity index 100% rename from packages/next/src/graphql/schema/buildFallbackLocaleInputType.ts rename to packages/graphql/src/schema/buildFallbackLocaleInputType.ts diff --git a/packages/next/src/graphql/schema/buildLocaleInputType.ts b/packages/graphql/src/schema/buildLocaleInputType.ts similarity index 100% rename from packages/next/src/graphql/schema/buildLocaleInputType.ts rename to packages/graphql/src/schema/buildLocaleInputType.ts diff --git a/packages/next/src/graphql/schema/buildMutationInputType.ts b/packages/graphql/src/schema/buildMutationInputType.ts similarity index 100% rename from packages/next/src/graphql/schema/buildMutationInputType.ts rename to packages/graphql/src/schema/buildMutationInputType.ts diff --git a/packages/next/src/graphql/schema/buildObjectType.ts b/packages/graphql/src/schema/buildObjectType.ts similarity index 100% rename from packages/next/src/graphql/schema/buildObjectType.ts rename to packages/graphql/src/schema/buildObjectType.ts diff --git a/packages/next/src/graphql/schema/buildPaginatedListType.ts b/packages/graphql/src/schema/buildPaginatedListType.ts similarity index 100% rename from packages/next/src/graphql/schema/buildPaginatedListType.ts rename to packages/graphql/src/schema/buildPaginatedListType.ts diff --git a/packages/next/src/graphql/schema/buildPoliciesType.ts b/packages/graphql/src/schema/buildPoliciesType.ts similarity index 100% rename from packages/next/src/graphql/schema/buildPoliciesType.ts rename to packages/graphql/src/schema/buildPoliciesType.ts diff --git a/packages/next/src/graphql/schema/buildWhereInputType.ts b/packages/graphql/src/schema/buildWhereInputType.ts similarity index 100% rename from packages/next/src/graphql/schema/buildWhereInputType.ts rename to packages/graphql/src/schema/buildWhereInputType.ts diff --git a/packages/next/src/graphql/schema/fieldToWhereInputSchemaMap.ts b/packages/graphql/src/schema/fieldToWhereInputSchemaMap.ts similarity index 100% rename from packages/next/src/graphql/schema/fieldToWhereInputSchemaMap.ts rename to packages/graphql/src/schema/fieldToWhereInputSchemaMap.ts diff --git a/packages/next/src/graphql/initCollections.ts b/packages/graphql/src/schema/initCollections.ts similarity index 89% rename from packages/next/src/graphql/initCollections.ts rename to packages/graphql/src/schema/initCollections.ts index 356691fff..b95f8e839 100644 --- a/packages/next/src/graphql/initCollections.ts +++ b/packages/graphql/src/schema/initCollections.ts @@ -13,31 +13,31 @@ import { buildVersionCollectionFields } from 'payload/versions' import type { GraphQLInfo } from 'payload/config' import type { Field, Collection, SanitizedCollectionConfig, SanitizedConfig } from 'payload/types' -import type { ObjectTypeConfig } from './schema/buildObjectType' -import forgotPassword from './resolvers/auth/forgotPassword' -import init from './resolvers/auth/init' -import login from './resolvers/auth/login' -import logout from './resolvers/auth/logout' -import me from './resolvers/auth/me' -import refresh from './resolvers/auth/refresh' -import resetPassword from './resolvers/auth/resetPassword' -import unlock from './resolvers/auth/unlock' -import verifyEmail from './resolvers/auth/verifyEmail' -import { buildMutationInputType, getCollectionIDType } from './schema/buildMutationInputType' -import buildObjectType from './schema/buildObjectType' -import buildPaginatedListType from './schema/buildPaginatedListType' -import { buildPolicyType } from './schema/buildPoliciesType' -import buildWhereInputType from './schema/buildWhereInputType' -import formatName from './utilities/formatName' -import createResolver from './resolvers/collections/create' -import getDeleteResolver from './resolvers/collections/delete' -import { docAccessResolver } from './resolvers/collections/docAccess' -import findResolver from './resolvers/collections/find' -import findByIDResolver from './resolvers/collections/findByID' -import findVersionByIDResolver from './resolvers/collections/findVersionByID' -import findVersionsResolver from './resolvers/collections/findVersions' -import restoreVersionResolver from './resolvers/collections/restoreVersion' -import updateResolver from './resolvers/collections/update' +import type { ObjectTypeConfig } from './buildObjectType' +import forgotPassword from '../resolvers/auth/forgotPassword' +import init from '../resolvers/auth/init' +import login from '../resolvers/auth/login' +import logout from '../resolvers/auth/logout' +import me from '../resolvers/auth/me' +import refresh from '../resolvers/auth/refresh' +import resetPassword from '../resolvers/auth/resetPassword' +import unlock from '../resolvers/auth/unlock' +import verifyEmail from '../resolvers/auth/verifyEmail' +import { buildMutationInputType, getCollectionIDType } from './buildMutationInputType' +import buildObjectType from './buildObjectType' +import buildPaginatedListType from './buildPaginatedListType' +import { buildPolicyType } from './buildPoliciesType' +import buildWhereInputType from './buildWhereInputType' +import formatName from '../utilities/formatName' +import createResolver from '../resolvers/collections/create' +import getDeleteResolver from '../resolvers/collections/delete' +import { docAccessResolver } from '../resolvers/collections/docAccess' +import findResolver from '../resolvers/collections/find' +import findByIDResolver from '../resolvers/collections/findByID' +import findVersionByIDResolver from '../resolvers/collections/findVersionByID' +import findVersionsResolver from '../resolvers/collections/findVersions' +import restoreVersionResolver from '../resolvers/collections/restoreVersion' +import updateResolver from '../resolvers/collections/update' type InitCollectionsGraphQLArgs = { config: SanitizedConfig diff --git a/packages/next/src/graphql/initGlobals.ts b/packages/graphql/src/schema/initGlobals.ts similarity index 87% rename from packages/next/src/graphql/initGlobals.ts rename to packages/graphql/src/schema/initGlobals.ts index 51d31bf41..6b781d1b9 100644 --- a/packages/next/src/graphql/initGlobals.ts +++ b/packages/graphql/src/schema/initGlobals.ts @@ -7,18 +7,18 @@ import { buildVersionGlobalFields } from 'payload/versions' import type { GraphQLInfo } from 'payload/config' import type { Field, SanitizedConfig, SanitizedGlobalConfig } from 'payload/types' -import { buildMutationInputType } from './schema/buildMutationInputType' -import buildObjectType from './schema/buildObjectType' -import buildPaginatedListType from './schema/buildPaginatedListType' -import { buildPolicyType } from './schema/buildPoliciesType' -import buildWhereInputType from './schema/buildWhereInputType' -import formatName from './utilities/formatName' -import { docAccessResolver } from './resolvers/globals/docAccess' -import findOneResolver from './resolvers/globals/findOne' -import findVersionByIDResolver from './resolvers/globals/findVersionByID' -import findVersionsResolver from './resolvers/globals/findVersions' -import restoreVersionResolver from './resolvers/globals/restoreVersion' -import updateResolver from './resolvers/globals/update' +import { buildMutationInputType } from './buildMutationInputType' +import buildObjectType from './buildObjectType' +import buildPaginatedListType from './buildPaginatedListType' +import { buildPolicyType } from './buildPoliciesType' +import buildWhereInputType from './buildWhereInputType' +import formatName from '../utilities/formatName' +import { docAccessResolver } from '../resolvers/globals/docAccess' +import findOneResolver from '../resolvers/globals/findOne' +import findVersionByIDResolver from '../resolvers/globals/findVersionByID' +import findVersionsResolver from '../resolvers/globals/findVersions' +import restoreVersionResolver from '../resolvers/globals/restoreVersion' +import updateResolver from '../resolvers/globals/update' type InitGlobalsGraphQLArgs = { config: SanitizedConfig diff --git a/packages/next/src/graphql/schema/isFieldNullable.ts b/packages/graphql/src/schema/isFieldNullable.ts similarity index 100% rename from packages/next/src/graphql/schema/isFieldNullable.ts rename to packages/graphql/src/schema/isFieldNullable.ts diff --git a/packages/next/src/graphql/schema/operators.ts b/packages/graphql/src/schema/operators.ts similarity index 100% rename from packages/next/src/graphql/schema/operators.ts rename to packages/graphql/src/schema/operators.ts diff --git a/packages/next/src/graphql/schema/recursivelyBuildNestedPaths.ts b/packages/graphql/src/schema/recursivelyBuildNestedPaths.ts similarity index 100% rename from packages/next/src/graphql/schema/recursivelyBuildNestedPaths.ts rename to packages/graphql/src/schema/recursivelyBuildNestedPaths.ts diff --git a/packages/next/src/graphql/schema/withNullableType.ts b/packages/graphql/src/schema/withNullableType.ts similarity index 100% rename from packages/next/src/graphql/schema/withNullableType.ts rename to packages/graphql/src/schema/withNullableType.ts diff --git a/packages/next/src/graphql/schema/withOperators.ts b/packages/graphql/src/schema/withOperators.ts similarity index 100% rename from packages/next/src/graphql/schema/withOperators.ts rename to packages/graphql/src/schema/withOperators.ts diff --git a/packages/next/src/graphql/utilities/combineParentName.ts b/packages/graphql/src/utilities/combineParentName.ts similarity index 100% rename from packages/next/src/graphql/utilities/combineParentName.ts rename to packages/graphql/src/utilities/combineParentName.ts diff --git a/packages/next/src/graphql/utilities/formatName.spec.ts b/packages/graphql/src/utilities/formatName.spec.ts similarity index 100% rename from packages/next/src/graphql/utilities/formatName.spec.ts rename to packages/graphql/src/utilities/formatName.spec.ts diff --git a/packages/next/src/graphql/utilities/formatName.ts b/packages/graphql/src/utilities/formatName.ts similarity index 100% rename from packages/next/src/graphql/utilities/formatName.ts rename to packages/graphql/src/utilities/formatName.ts diff --git a/packages/next/src/graphql/utilities/formatOptions.ts b/packages/graphql/src/utilities/formatOptions.ts similarity index 100% rename from packages/next/src/graphql/utilities/formatOptions.ts rename to packages/graphql/src/utilities/formatOptions.ts diff --git a/packages/next/src/graphql/utilities/getCheckIfLocaleObject.ts b/packages/graphql/src/utilities/getCheckIfLocaleObject.ts similarity index 100% rename from packages/next/src/graphql/utilities/getCheckIfLocaleObject.ts rename to packages/graphql/src/utilities/getCheckIfLocaleObject.ts diff --git a/packages/next/src/graphql/utilities/groupOrTabHasRequiredSubfield.ts b/packages/graphql/src/utilities/groupOrTabHasRequiredSubfield.ts similarity index 100% rename from packages/next/src/graphql/utilities/groupOrTabHasRequiredSubfield.ts rename to packages/graphql/src/utilities/groupOrTabHasRequiredSubfield.ts diff --git a/packages/next/src/graphql/utilities/isolateTransactionID.ts b/packages/graphql/src/utilities/isolateTransactionID.ts similarity index 100% rename from packages/next/src/graphql/utilities/isolateTransactionID.ts rename to packages/graphql/src/utilities/isolateTransactionID.ts diff --git a/packages/next/src/graphql/utilities/uppercase.ts b/packages/graphql/src/utilities/uppercase.ts similarity index 100% rename from packages/next/src/graphql/utilities/uppercase.ts rename to packages/graphql/src/utilities/uppercase.ts diff --git a/packages/next/src/graphql/utilities/wrapCustomResolver.ts b/packages/graphql/src/utilities/wrapCustomResolver.ts similarity index 100% rename from packages/next/src/graphql/utilities/wrapCustomResolver.ts rename to packages/graphql/src/utilities/wrapCustomResolver.ts diff --git a/packages/graphql/tsconfig.json b/packages/graphql/tsconfig.json new file mode 100644 index 000000000..3b32189ae --- /dev/null +++ b/packages/graphql/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, // Make sure typescript knows that this module depends on their references + "noEmit": false /* Do not emit outputs. */, + "emitDeclarationOnly": true, + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + "rootDir": "./src" /* Specify the root folder within your source files. */, + "allowImportingTsExtensions": true + }, + "exclude": [ + "dist", + "build", + "tests", + "test", + "node_modules", + ".eslintrc.js", + "src/**/*.spec.js", + "src/**/*.spec.jsx", + "src/**/*.spec.ts", + "src/**/*.spec.tsx" + ], + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts", "src/**/*.json"], + "references": [{ "path": "../payload" }] +} diff --git a/packages/next/package.json b/packages/next/package.json index 12ba0b63e..ecab69080 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -51,6 +51,7 @@ "@faceless-ui/modal": "2.0.1", "@payloadcms/translations": "workspace:^", "@payloadcms/ui": "workspace:*", + "@payloadcms/graphql": "workspace:*", "@types/busboy": "^1.5.3", "busboy": "^1.6.0", "deep-equal": "2.2.2", diff --git a/packages/next/src/graphql/routes/handler.ts b/packages/next/src/graphql/routes/handler.ts index febfe5239..41b44b112 100644 --- a/packages/next/src/graphql/routes/handler.ts +++ b/packages/next/src/graphql/routes/handler.ts @@ -1,11 +1,11 @@ import config from 'payload-config' import { GraphQLError } from 'graphql' import httpStatus from 'http-status' +import { configToSchema } from '@payloadcms/graphql' import type { Payload, CollectionAfterErrorHook } from 'payload/types' import type { GraphQLFormattedError } from 'graphql' import { createPayloadRequest } from '../../utilities/createPayloadRequest' import { createHandler } from 'graphql-http/lib/use/fetch' -import { configToSchema } from '../schema/configToSchema' const handleError = async ( payload: Payload, diff --git a/packages/next/src/routes/auth/login.ts b/packages/next/src/routes/auth/login.ts index 9cd03814d..8b780ab8d 100644 --- a/packages/next/src/routes/auth/login.ts +++ b/packages/next/src/routes/auth/login.ts @@ -1,7 +1,7 @@ import httpStatus from 'http-status' import { loginOperation } from 'payload/operations' import { isNumber } from 'payload/utilities' -import { generatePayloadCookie } from '../../utilities/cookies' +import { generatePayloadCookie } from 'payload/auth' import { CollectionRouteHandler } from '../types' export const login: CollectionRouteHandler = async ({ req, collection }) => { diff --git a/packages/next/src/routes/auth/logout.ts b/packages/next/src/routes/auth/logout.ts index 1008ecca1..8edd757a9 100644 --- a/packages/next/src/routes/auth/logout.ts +++ b/packages/next/src/routes/auth/logout.ts @@ -1,6 +1,6 @@ import httpStatus from 'http-status' import { logoutOperation } from 'payload/operations' -import { generateExpiredPayloadCookie } from '../../utilities/cookies' +import { generateExpiredPayloadCookie } from 'payload/auth' import { CollectionRouteHandler } from '../types' export const logout: CollectionRouteHandler = async ({ req, collection }) => { diff --git a/packages/next/src/routes/auth/me.ts b/packages/next/src/routes/auth/me.ts index d9423bd55..82f07015c 100644 --- a/packages/next/src/routes/auth/me.ts +++ b/packages/next/src/routes/auth/me.ts @@ -1,6 +1,6 @@ import httpStatus from 'http-status' import { meOperation } from 'payload/operations' -import { extractJWT } from '../../utilities/jwt' +import { extractJWT } from 'payload/auth' import { CollectionRouteHandler } from '../types' export const me: CollectionRouteHandler = async ({ req, collection }) => { diff --git a/packages/next/src/routes/auth/refresh.ts b/packages/next/src/routes/auth/refresh.ts index 9e94a1d5f..9ec1e0814 100644 --- a/packages/next/src/routes/auth/refresh.ts +++ b/packages/next/src/routes/auth/refresh.ts @@ -1,7 +1,7 @@ -import { extractJWT } from '../../utilities/jwt' +import { extractJWT } from 'payload/auth' import { refreshOperation } from 'payload/operations' import httpStatus from 'http-status' -import { generatePayloadCookie } from '../../utilities/cookies' +import { generatePayloadCookie } from 'payload/auth' import { CollectionRouteHandler } from '../types' export const refresh: CollectionRouteHandler = async ({ req, collection }) => { diff --git a/packages/next/src/routes/auth/registerFirstUser.ts b/packages/next/src/routes/auth/registerFirstUser.ts index 0401ad28b..0886dbc32 100644 --- a/packages/next/src/routes/auth/registerFirstUser.ts +++ b/packages/next/src/routes/auth/registerFirstUser.ts @@ -1,6 +1,6 @@ import httpStatus from 'http-status' import { registerFirstUserOperation } from 'payload/operations' -import { generatePayloadCookie } from '../../utilities/cookies' +import { generatePayloadCookie } from 'payload/auth' import { CollectionRouteHandler } from '../types' export const registerFirstUser: CollectionRouteHandler = async ({ req, collection }) => { diff --git a/packages/next/src/routes/auth/resetPassword.ts b/packages/next/src/routes/auth/resetPassword.ts index 0b03b7246..343245a21 100644 --- a/packages/next/src/routes/auth/resetPassword.ts +++ b/packages/next/src/routes/auth/resetPassword.ts @@ -1,7 +1,7 @@ import httpStatus from 'http-status' import { resetPasswordOperation } from 'payload/operations' -import { generatePayloadCookie } from '../../utilities/cookies' +import { generatePayloadCookie } from 'payload/auth' import { CollectionRouteHandler } from '../types' export const resetPassword: CollectionRouteHandler = async ({ req, collection }) => { diff --git a/packages/next/src/utilities/createPayloadRequest.ts b/packages/next/src/utilities/createPayloadRequest.ts index 4e6849290..1af17245a 100644 --- a/packages/next/src/utilities/createPayloadRequest.ts +++ b/packages/next/src/utilities/createPayloadRequest.ts @@ -7,12 +7,11 @@ import type { import { getAuthenticatedUser } from 'payload/auth' import { getPayload } from 'payload' import { URL } from 'url' -import { parseCookies } from './cookies' +import { parseCookies } from 'payload/auth' import { getRequestLanguage } from './getRequestLanguage' import { getRequestLocales } from './getRequestLocales' import { getNextI18n } from './getNextI18n' import { getDataAndFile } from './getDataAndFile' -import { registerGraphQLSchema } from '../graphql/registerSchema' type Args = { request: Request diff --git a/packages/next/src/utilities/initPage.ts b/packages/next/src/utilities/initPage.ts index 62208d5b3..514d88810 100644 --- a/packages/next/src/utilities/initPage.ts +++ b/packages/next/src/utilities/initPage.ts @@ -9,7 +9,7 @@ import type { SanitizedGlobalConfig, } from 'payload/types' import { redirect } from 'next/navigation' -import { parseCookies } from './cookies' +import { parseCookies } from 'payload/auth' import { getNextI18n } from './getNextI18n' import { getRequestLanguage } from './getRequestLanguage' import { findLocaleFromCode } from '../../../ui/src/utilities/findLocaleFromCode' diff --git a/packages/next/src/utilities/jwt.ts b/packages/next/src/utilities/jwt.ts deleted file mode 100644 index dcf7a70a2..000000000 --- a/packages/next/src/utilities/jwt.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AuthStrategyFunctionArgs } from 'payload/auth' - -export const extractJWT = ( - args: Pick, -): null | string => { - const { headers, payload, cookies } = args - - const jwtFromHeader = headers.get('Authorization') - const origin = headers.get('Origin') - - if (jwtFromHeader?.startsWith('JWT ')) { - return jwtFromHeader.replace('JWT ', '') - } - // allow RFC6750 OAuth 2.0 compliant Bearer tokens - // in addition to the payload default JWT format - if (jwtFromHeader?.startsWith('Bearer ')) { - return jwtFromHeader.replace('Bearer ', '') - } - - const tokenCookieName = `${payload.config.cookiePrefix}-token` - const cookieToken = cookies?.get(tokenCookieName) - - if (!cookieToken) { - return null - } - - if (!origin || payload.config.csrf.length === 0 || payload.config.csrf.indexOf(origin) > -1) { - return cookieToken - } - - return null -} diff --git a/packages/next/tsconfig.json b/packages/next/tsconfig.json index cc709dc15..9208191c9 100644 --- a/packages/next/tsconfig.json +++ b/packages/next/tsconfig.json @@ -8,6 +8,7 @@ "rootDir": "./src" /* Specify the root folder within your source files. */, "paths": { "payload-config": ["./src/config.ts"], + "@payloadcms/graphql": ["../graphql/dist/index.ts"], "@payloadcms/ui": ["../ui/src/exports/index.ts"], "@payloadcms/translations/*": ["../translations/dist/*"] }, @@ -32,7 +33,13 @@ "src/**/*.d.ts", "src/**/*.json", "../ui/src/createClientConfig.ts", - "../dev/src/app/(payload)/admin/login/action.ts" + "../dev/src/app/(payload)/admin/login/action.ts", + "../payload/src/auth/cookies.ts" ], - "references": [{ "path": "../payload" }, { "path": "../ui" }, { "path": "../translations" }] + "references": [ + { "path": "../payload" }, + { "path": "../ui" }, + { "path": "../translations" }, + { "path": "../graphql" } + ] } diff --git a/packages/payload/package.json b/packages/payload/package.json index a7b432abe..29cea6669 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -54,6 +54,7 @@ "deepmerge": "4.3.1", "file-type": "16.5.4", "find-up": "4.1.0", + "get-tsconfig": "^4.7.2", "http-status": "1.6.2", "is-plain-object": "5.0.0", "json-schema-to-typescript": "11.0.3", diff --git a/packages/next/src/utilities/cookies.ts b/packages/payload/src/auth/cookies.ts similarity index 96% rename from packages/next/src/utilities/cookies.ts rename to packages/payload/src/auth/cookies.ts index 97f704373..cf70c6e0b 100644 --- a/packages/next/src/utilities/cookies.ts +++ b/packages/payload/src/auth/cookies.ts @@ -1,5 +1,5 @@ -import type { Payload, SanitizedCollectionConfig } from 'payload/types' - +import type { Payload } from '..' +import type { SanitizedCollectionConfig } from './../collections/config/types' type CookieOptions = { domain?: string expires?: Date diff --git a/packages/payload/src/auth/getExtractJWT.ts b/packages/payload/src/auth/extractJWT.ts similarity index 92% rename from packages/payload/src/auth/getExtractJWT.ts rename to packages/payload/src/auth/extractJWT.ts index 8671443de..4abe15472 100644 --- a/packages/payload/src/auth/getExtractJWT.ts +++ b/packages/payload/src/auth/extractJWT.ts @@ -3,7 +3,7 @@ import type { AuthStrategyFunctionArgs } from '.' import { parseCookies } from '../utilities/parseCookies' export const extractJWT = ( - args: Pick, + args: Pick, ): null | string => { const { headers, payload } = args diff --git a/packages/payload/src/auth/index.ts b/packages/payload/src/auth/index.ts index c9f6f047d..70a2024b2 100644 --- a/packages/payload/src/auth/index.ts +++ b/packages/payload/src/auth/index.ts @@ -1 +1,4 @@ export * from './types' + +export { extractJWT } from './extractJWT' +export * from './cookies' diff --git a/packages/payload/src/auth/strategies/jwt.ts b/packages/payload/src/auth/strategies/jwt.ts index ca8c7775b..cc0a4adc5 100644 --- a/packages/payload/src/auth/strategies/jwt.ts +++ b/packages/payload/src/auth/strategies/jwt.ts @@ -2,7 +2,7 @@ import jwt from 'jsonwebtoken' import type { AuthStrategyFunction, User } from '..' -import { extractJWT } from '../getExtractJWT' +import { extractJWT } from '../extractJWT' type JWTToken = { collection: string diff --git a/packages/payload/src/exports/auth.ts b/packages/payload/src/exports/auth.ts index 4161dac29..f3fc96403 100644 --- a/packages/payload/src/exports/auth.ts +++ b/packages/payload/src/exports/auth.ts @@ -1,5 +1,7 @@ +export * from '../auth' export { getAccessResults } from '../auth/getAccessResults' export { getAuthenticatedUser } from '../auth/getAuthenticatedUser' + export type { AuthStrategyFunction, AuthStrategyFunctionArgs, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a698720d2..c776ca71c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -449,6 +449,40 @@ importers: specifier: 1.15.0 version: 1.15.0(eslint@8.48.0) + packages/graphql: + dependencies: + graphql: + specifier: ^16.8.1 + version: 16.8.1 + graphql-http: + specifier: ^1.22.0 + version: 1.22.0(graphql@16.8.1) + graphql-playground-html: + specifier: 1.6.30 + version: 1.6.30 + graphql-query-complexity: + specifier: 0.12.0 + version: 0.12.0(graphql@16.8.1) + graphql-scalars: + specifier: 1.22.2 + version: 1.22.2(graphql@16.8.1) + graphql-type-json: + specifier: 0.3.2 + version: 0.3.2(graphql@16.8.1) + pluralize: + specifier: 8.0.0 + version: 8.0.0 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config-payload + payload: + specifier: workspace:* + version: link:../payload + ts-essentials: + specifier: 7.0.3 + version: 7.0.3(typescript@5.2.2) + packages/live-preview: devDependencies: '@payloadcms/eslint-config': @@ -482,6 +516,9 @@ importers: '@faceless-ui/modal': specifier: 2.0.1 version: 2.0.1(react-dom@18.2.0)(react@18.2.0) + '@payloadcms/graphql': + specifier: workspace:* + version: link:../graphql '@payloadcms/translations': specifier: workspace:^ version: link:../translations @@ -576,6 +613,9 @@ importers: find-up: specifier: 4.1.0 version: 4.1.0 + get-tsconfig: + specifier: ^4.7.2 + version: 4.7.2 http-status: specifier: 1.6.2 version: 1.6.2 diff --git a/tsconfig.json b/tsconfig.json index 1355c5436..27de8ad24 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -34,6 +34,7 @@ // if your tsconfig is something different { "path": "./packages/db-mongodb" }, { "path": "./packages/db-postgres" }, + { "path": "./packages/graphql" }, { "path": "./packages/live-preview" }, { "path": "./packages/live-preview-react" }, { "path": "./packages/next" },