@payloadcms/figma 0.0.1-alpha.10 → 0.0.1-alpha.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/control-plane.d.ts.map +1 -1
- package/dist/api/control-plane.js +2 -2
- package/dist/api/control-plane.js.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/deploy.d.ts +2 -0
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +11 -6
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.js +2 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/db-adapter.d.ts +17 -0
- package/dist/db-adapter.d.ts.map +1 -0
- package/dist/db-adapter.js +757 -0
- package/dist/db-adapter.js.map +1 -0
- package/dist/endpoints/health.d.ts +3 -0
- package/dist/endpoints/health.d.ts.map +1 -0
- package/dist/endpoints/health.js +11 -0
- package/dist/endpoints/health.js.map +1 -0
- package/dist/oauth/components/LoginButton/index.js +1 -1
- package/dist/oauth/components/LoginButton/index.js.map +1 -1
- package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
- package/dist/oauth/endpoints/getLoginEndpoint.js +1 -1
- package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
- package/dist/oauth/utilities/refreshTokens.d.ts.map +1 -1
- package/dist/oauth/utilities/refreshTokens.js +1 -1
- package/dist/oauth/utilities/refreshTokens.js.map +1 -1
- package/dist/plugin/build-config.d.ts.map +1 -1
- package/dist/plugin/build-config.js +25 -2
- package/dist/plugin/build-config.js.map +1 -1
- package/dist/utils/payload-config-ast.d.ts +1 -1
- package/dist/utils/payload-config-ast.d.ts.map +1 -1
- package/dist/utils/payload-config-ast.js +7 -7
- package/dist/utils/payload-config-ast.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db-adapter.ts"],"sourcesContent":["import type {\n BaseDatabaseAdapter,\n BeginTransaction,\n Collection,\n CollectionSlug,\n CommitTransaction,\n Config,\n Count,\n CountGlobalVersions,\n CountVersions,\n Create,\n CreateGlobal,\n CreateGlobalVersion,\n CreateVersion,\n DatabaseAdapterObj,\n DeleteMany,\n DeleteOne,\n DeleteVersions,\n Find,\n FindDistinct,\n FindGlobal,\n FindGlobalVersions,\n FindOne,\n FindVersions,\n FlattenedField,\n QueryDrafts,\n SanitizedConfig,\n SanitizedGlobalConfig,\n UpdateGlobal,\n UpdateGlobalVersion,\n UpdateMany,\n UpdateOne,\n UpdateVersion,\n Upsert,\n Where,\n} from 'payload'\n\nimport { randomUUID } from 'crypto'\nimport {\n buildVersionCollectionFields,\n buildVersionGlobalFields,\n combineQueries,\n createArrayFromCommaDelineated,\n createDatabaseAdapter,\n getFieldByPath,\n} from 'payload'\n// import { fieldShouldBeLocalized } from 'payload/shared'\n// import { db, uuid } from './db'\n\ninterface ContentAPIDatabaseAdapterOptions {\n contentApiKey: string\n contentApiUrl: string\n contentSystemId: string\n projectToken: string\n}\n\nexport type ContentAPIAdapter = {\n contentApiKey: string\n contentApiUrl: string\n contentSystemId: string\n projectToken: string\n request<T = any>(path: string, body?: any): Promise<T>\n} & BaseDatabaseAdapter\n\nconst slugIsGlobal = (slug: string) => slug.startsWith('_global-')\n\nconst getGlobalSlug = (slug: string) => `_global-${slug}`\n\n// Transform Payload Where format to Content API WhereClause format\nfunction transformWhereClause(where: undefined | Where): any {\n if (!where) {\n return undefined\n }\n\n // Handle and/or logical operators\n if (where.and) {\n return {\n and: where.and.map(transformWhereClause).filter(Boolean),\n }\n }\n\n if (where.or) {\n return {\n or: where.or.map(transformWhereClause).filter(Boolean),\n }\n }\n\n // Transform field conditions\n const transformedClauses: any[] = []\n\n for (const [field, condition] of Object.entries(where)) {\n if (field === 'and' || field === 'or') {\n continue\n }\n\n if (Array.isArray(condition)) {\n // Handle nested and/or arrays\n transformedClauses.push({\n [field]: condition.map(transformWhereClause).filter(Boolean),\n })\n } else if (typeof condition === 'object' && condition !== null) {\n // Handle field operators like { equals: 'value' }, { greater_than: 10 }\n for (const [operator, value] of Object.entries(condition)) {\n transformedClauses.push({\n operator: operator as any, // Map Payload operators to Content API operators\n path: field,\n value,\n })\n }\n } else {\n // Handle direct field values like { status: 'published' }\n transformedClauses.push({\n operator: 'equals',\n path: field,\n value: condition,\n })\n }\n }\n\n if (transformedClauses.length === 1) {\n return transformedClauses[0]\n } else if (transformedClauses.length > 1) {\n return {\n and: transformedClauses,\n }\n }\n\n return undefined\n}\n\nconst formatDocument = (doc: any) => {\n if (!doc) {\n return null\n }\n\n const { id, data, ...meta } = doc\n\n return {\n id,\n _meta: meta,\n ...data,\n }\n}\n\nasync function init(this: ContentAPIAdapter) {\n console.log('🔍 [DB_CONTENT_API] init() called')\n console.log('🔍 [DB_CONTENT_API] this:', this)\n console.log(\n '🔍 [DB_CONTENT_API] payload collections:',\n this.payload.config.collections.map((c) => c.slug),\n )\n\n // Create collections in content API\n for (const collection of this.payload.config.collections) {\n try {\n console.log(`🔧 [DB_CONTENT_API] Creating collection: ${collection.slug}`)\n const response = await this.request('/api/v0/collections', {\n contentSystemId: this.contentSystemId,\n key: collection.slug,\n })\n\n if (response.error) {\n console.error(\n `[DB_CONTENT_API] create collection ${collection.slug} failure`,\n response.error,\n )\n } else {\n console.log(`✅ [DB_CONTENT_API] Created collection: ${collection.slug}`)\n }\n } catch (error) {\n console.warn(`⚠️ [DB_CONTENT_API] Failed to create collection ${collection.slug}:`, error)\n }\n }\n\n // Create globals as collections (with _global- prefix)\n for (const global of this.payload.config.globals) {\n try {\n const globalKey = getGlobalSlug(global.slug)\n console.log(`🔧 [DB_CONTENT_API] Creating global collection: ${globalKey}`)\n const response = await this.request('/api/v0/collections', {\n contentSystemId: this.contentSystemId,\n key: globalKey,\n })\n\n if (response.error) {\n console.error(\n `[DB_CONTENT_API] create global collection ${globalKey} failure`,\n response.error,\n )\n } else {\n console.log(`✅ [DB_CONTENT_API] Created global collection: ${globalKey}`)\n }\n } catch (error) {\n console.warn(`⚠️ [DB_CONTENT_API] Failed to create global collection ${global.slug}:`, error)\n }\n }\n\n console.log(\n '🔍 [DB_CONTENT_API] payload globals:',\n this.payload.config.globals.map((g) => g.slug),\n )\n}\n\nconst find: Find = async function find(\n this: ContentAPIAdapter,\n { collection, limit, page = 1, req, sort, where, ...args },\n) {\n console.log(\n '🔍 [DB_CONTENT_API] find() called with:',\n collection,\n JSON.stringify(transformWhereClause(where), null, 2),\n { limit, page, sort, ...args },\n )\n\n try {\n const response = await this.request<any>('/api/v0/documents:find', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n limit,\n offset: (page - 1) * (limit || 10),\n sort: sort\n ? [sort].flat().map((s: any) => ({\n direction: Object.values(s)[0] === -1 ? 'dsc' : 'asc',\n path: Object.keys(s)[0],\n }))\n : undefined,\n where: transformWhereClause(where),\n })\n\n if (response.error) {\n console.error('[DB_CONTENT_API] find() failure', response.error?.message || response.error)\n }\n\n const docs = response.result?.data || []\n const pagination = response.result?.pagination\n const totalDocs = pagination?.total || docs.length\n const actualLimit = limit || 10\n const totalPages = Math.ceil(totalDocs / actualLimit)\n const hasNextPage = page < totalPages\n\n const result = {\n docs: docs.map(formatDocument),\n hasNextPage,\n hasPrevPage: page > 1,\n limit: actualLimit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter: 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs,\n totalPages,\n }\n console.log('[DB_CONTENT_API] find() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in find():`, error)\n const docs: any[] = []\n const hasNextPage = false\n const totalPages = 1\n\n return {\n docs,\n hasNextPage,\n hasPrevPage: page > 1,\n limit: limit || docs.length,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter: 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs: docs.length,\n totalPages,\n }\n }\n}\n\nconst findVersions: FindVersions = async function findVersions(\n this: ContentAPIAdapter,\n { collection, limit, page = 1, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] findVersions() called with:', {\n collection,\n limit,\n page,\n where,\n ...args,\n })\n\n const docs: any[] = []\n const hasNextPage = false\n const result = {\n docs,\n hasNextPage,\n hasPrevPage: page > 1,\n limit: limit || docs.length,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter: 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs: docs.length,\n totalPages: limit && docs.length ? Math.ceil(docs.length / limit) : 1,\n }\n console.log('[DB_CONTENT_API] findVersions() result:', result)\n return result\n}\n\nconst queryDrafts: QueryDrafts = async function queryDrafts(\n this: ContentAPIAdapter,\n { collection, limit, page = 1, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] queryDrafts() called with:', {\n collection,\n limit,\n page,\n where,\n ...args,\n })\n\n const docs: any[] = []\n const hasNextPage = false\n const result = {\n docs,\n hasNextPage,\n hasPrevPage: page > 1,\n limit: limit || docs.length,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter: 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs: docs.length,\n totalPages: limit && docs.length ? Math.ceil(docs.length / limit) : 1,\n }\n console.log('[DB_CONTENT_API] queryDrafts() result:', result)\n return result\n}\n\nconst createVersion: CreateVersion = async function createVersion(\n this: ContentAPIAdapter,\n { collectionSlug, req, versionData, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] createVersion() called with:', {\n collectionSlug,\n versionData,\n ...args,\n })\n\n const result = {} as any\n console.log('[DB_CONTENT_API] createVersion() result:', result)\n return result\n}\n\nconst updateVersion: UpdateVersion = async function updateVersion(\n this: ContentAPIAdapter,\n { id, collection, req, versionData, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] updateVersion() called with:', {\n id,\n collection,\n versionData,\n ...args,\n })\n\n const result = {} as any\n console.log('[DB_CONTENT_API] updateVersion() result:', result)\n return result\n}\n\nconst deleteVersions: DeleteVersions = async function deleteVersions(\n this: ContentAPIAdapter,\n { collection, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] deleteVersions() called with:', { collection, where, ...args })\n\n const versionsToDelete: any[] = []\n const versionCollection = 'versions'\n\n console.log(\n `🗑️ [DB_CONTENT_API] Deleted ${versionsToDelete.length} versions from ${versionCollection}`,\n )\n\n // return versionsToDelete.length\n}\n\nconst findOne: FindOne = async function findOne(\n this: ContentAPIAdapter,\n { collection, req, where, ...args },\n) {\n console.log(\n '🔍 [DB_CONTENT_API] findOne() called with:',\n collection,\n JSON.stringify(transformWhereClause(where), null, 2),\n args,\n req?.body,\n )\n\n try {\n const response = await this.request<any>('/api/v0/documents:find', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n limit: 1,\n offset: 0,\n where: transformWhereClause(where),\n })\n\n if (response.error) {\n console.error('[DB_CONTENT_API] findOne() failure', response.error?.message || response.error)\n }\n\n const docs = response.result?.data || []\n const result = docs.length > 0 ? docs[0] : null\n console.log('[DB_CONTENT_API] findOne() result:', result)\n return formatDocument(result)\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in findOne():`, error)\n return null\n }\n}\n\nconst updateMany: UpdateMany = async function updateMany(\n this: ContentAPIAdapter,\n { collection, data, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] updateMany() called with:', { collection, data, where, ...args })\n try {\n const response = await this.request<any>('/api/v0/documents:update', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n data,\n where: transformWhereClause(where),\n })\n\n if (response.error) {\n console.error(\n '[DB_CONTENT_API] updateMany() failure',\n response.error?.message || response.error,\n )\n }\n\n // Return array of updated documents if available, otherwise return placeholder\n const result = response.result?.data || []\n console.log('[DB_CONTENT_API] updateMany() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in updateMany():`, error)\n return []\n }\n}\n\nconst updateOne: UpdateOne = async function updateOne(\n this: ContentAPIAdapter,\n { id, collection, data, req, where = {}, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] updateOne() called with:', {\n id,\n collection,\n data,\n where,\n ...args,\n })\n try {\n const whereClause = id\n ? { operator: 'equals', path: 'id', value: id }\n : transformWhereClause(where)\n const response = await this.request<any>('/api/v0/documents:update', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n data,\n returning: { exclude: [] },\n where: whereClause,\n })\n\n if (response.error) {\n console.error(\n '[DB_CONTENT_API] updateOne() failure',\n response.error?.message || response.error,\n )\n }\n\n const result = response.result?.data || { id, ...data }\n console.log('[DB_CONTENT_API] updateOne() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in updateOne():`, error)\n return { id, ...data }\n }\n}\n\nconst deleteMany: DeleteMany = async function deleteMany(\n this: ContentAPIAdapter,\n { collection, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] deleteMany() called with:', { collection, where, ...args })\n try {\n const response = await this.request<any>('/api/v0/documents:delete', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n returning: false,\n where: transformWhereClause(where),\n })\n\n if (response.error) {\n console.error(\n '[DB_CONTENT_API] deleteMany() failure',\n response.error?.message || response.error,\n )\n }\n\n const deletedCount = response.result?.count || 0\n console.log(`🗑️ [DB_CONTENT_API] Deleted ${deletedCount} documents from ${collection}`)\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in deleteMany():`, error)\n }\n}\n\nconst deleteOne: DeleteOne = async function deleteOne(\n this: ContentAPIAdapter,\n { collection, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] deleteOne() called with:', { collection, where, ...args })\n try {\n const response = await this.request<any>('/api/v0/documents:delete', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n returning: { exclude: [] },\n where: transformWhereClause(where),\n })\n\n if (response.error) {\n console.error(\n '[DB_CONTENT_API] deleteOne() failure',\n response.error?.message || response.error,\n )\n }\n\n const deletedDocs = response.result?.data || []\n const docId = deletedDocs.length > 0 ? deletedDocs[0].id : 'unknown'\n const result = deletedDocs.length > 0 ? deletedDocs[0] : {}\n\n console.log(`🗑️ [DB_CONTENT_API] Deleted document ${docId} from ${collection}`)\n console.log('[DB_CONTENT_API] deleteOne() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in deleteOne():`, error)\n return {}\n }\n}\n\nconst create: Create = async function create(\n this: ContentAPIAdapter,\n { collection, data, req, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] create() called with:', { collection, data, ...args })\n try {\n const randomKey = randomUUID()\n const response = await this.request<any>('/api/v0/documents:create', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n data,\n key: data.key || data.id || `doc-${randomKey}`,\n })\n\n if (response.error) {\n console.error('[DB_CONTENT_API] create() failure', response.error?.message || response.error)\n }\n\n const result = response.result?.data || response.result || { id: `doc-${randomKey}`, ...data }\n console.log('[DB_CONTENT_API] create() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in create():`, error)\n return { id: `doc-${randomUUID()}`, ...data }\n }\n}\n\nconst count: Count = async function count(\n this: ContentAPIAdapter,\n { collection, req, where = {}, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] count() called with:', { collection, where, ...args })\n try {\n const response = await this.request<any>('/api/v0/documents:count', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n where: transformWhereClause(where),\n })\n\n if (response.error) {\n console.error('[DB_CONTENT_API] count() failure', response.error?.message || response.error)\n }\n\n const result = { totalDocs: response.result?.count || 0 }\n console.log('[DB_CONTENT_API] count() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in count():`, error)\n return { totalDocs: 0 }\n }\n}\n\nconst countVersions: CountVersions = async function countVersions(\n this: ContentAPIAdapter,\n { collection, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] countVersions() called with:', { collection, where, ...args })\n\n const result = { totalDocs: 0 }\n console.log('[DB_CONTENT_API] countVersions() result:', result)\n return result\n}\n\nconst upsert: Upsert = async function upsert(\n this: ContentAPIAdapter,\n { collection, data, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] upsert() called with:', { collection, data, where, ...args })\n try {\n // Try to update first\n const updateResponse = await this.request<any>('/api/v0/documents:update', {\n collectionKey: collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: { documentKey: `upsert-${Date.now()}` },\n data,\n returning: { exclude: [] },\n where: transformWhereClause(where),\n })\n\n if (!updateResponse.success) {\n console.log('[DB_CONTENT_API] upsert() failure', updateResponse.error)\n }\n\n const result = updateResponse.result?.data || { ...data }\n console.log('[DB_CONTENT_API] upsert() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in upsert():`, error)\n return { ...data }\n }\n}\n\nconst createGlobal: CreateGlobal = async function createGlobal(\n this: ContentAPIAdapter,\n { slug, data, req, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] createGlobal() called with:', { slug, data, ...args })\n\n try {\n const globalKey = getGlobalSlug(slug)\n const response = await this.request<any>('/api/v0/documents:create', {\n collectionKey: globalKey,\n contentSystemId: this.contentSystemId,\n data,\n key: `global-${slug}`,\n })\n\n if (response.error) {\n console.error(\n '[DB_CONTENT_API] createGlobal() failure',\n response.error?.message || response.error,\n )\n }\n\n const result = response.result?.data || response.result || { id: `global-${slug}`, ...data }\n console.log('[DB_CONTENT_API] createGlobal() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in createGlobal():`, error)\n return { id: `global-${slug}`, ...data }\n }\n}\n\nconst findGlobal: FindGlobal = async function findGlobal(\n this: ContentAPIAdapter,\n { slug, req, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] findGlobal() called with:', { slug, ...args })\n\n try {\n const globalKey = getGlobalSlug(slug)\n const response = await this.request<any>('/api/v0/documents:find', {\n collectionKey: globalKey,\n contentSystemId: this.contentSystemId,\n limit: 1,\n offset: 0,\n })\n\n if (response.error) {\n console.error(\n '[DB_CONTENT_API] findGlobal() failure',\n response.error?.message || response.error,\n )\n }\n\n const docs = response.result?.data || []\n const result = docs.length > 0 ? docs[0] : null\n console.log('[DB_CONTENT_API] findGlobal() result:', result)\n return formatDocument(result)\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in findGlobal():`, error)\n return null\n }\n}\n\nconst findDistinct: FindDistinct = async function findDistinct(\n this: ContentAPIAdapter,\n { collection, field, limit, page = 1, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] findDistinct() called with:', {\n collection,\n field,\n limit,\n page,\n where,\n ...args,\n })\n\n const distinctValues: any[] = []\n const paginatedValues: any[] = []\n const endIndex = 0\n const totalDocs = 0\n\n console.log(\n `📊 [DB_CONTENT_API] findDistinct result: ${distinctValues.length} distinct values for ${field}`,\n )\n\n return {\n hasNextPage: limit ? endIndex < totalDocs : false,\n hasPrevPage: page > 1,\n limit: limit || totalDocs,\n nextPage: limit && endIndex < totalDocs ? page + 1 : null,\n page,\n pagingCounter: 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs,\n totalPages: limit ? Math.ceil(totalDocs / limit) : 1,\n values: paginatedValues,\n }\n}\n\nconst updateGlobal: UpdateGlobal = async function updateGlobal(\n this: ContentAPIAdapter,\n { slug, data, req, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] updateGlobal() called with:', { slug, data, ...args })\n\n try {\n const globalKey = getGlobalSlug(slug)\n const response = await this.request<any>('/api/v0/documents:update', {\n collectionKey: globalKey,\n contentSystemId: this.contentSystemId,\n createOnMissing: { documentKey: `global-${slug}` },\n data,\n returning: { exclude: [] },\n where: { operator: 'equals', path: 'key', value: `global-${slug}` },\n })\n\n if (response.error) {\n console.error(\n '[DB_CONTENT_API] updateGlobal() failure',\n response.error?.message || response.error,\n )\n }\n\n const result = response.result?.data || { id: `global-${slug}`, ...data }\n console.log('[DB_CONTENT_API] updateGlobal() result:', result)\n return result\n } catch (error) {\n console.error(`❌ [DB_CONTENT_API] Error in updateGlobal():`, error)\n return { id: `global-${slug}`, ...data }\n }\n}\n\nconst findGlobalVersions: FindGlobalVersions = async function findGlobalVersions(\n this: ContentAPIAdapter,\n { limit, page = 1, req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] findGlobalVersions() called with:', {\n limit,\n page,\n where,\n ...args,\n })\n\n const docs: any[] = []\n const hasNextPage = false\n const result = {\n docs,\n hasNextPage,\n hasPrevPage: page > 1,\n limit: limit || docs.length,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter: 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs: docs.length,\n totalPages: limit && docs.length ? Math.ceil(docs.length / limit) : 1,\n }\n console.log('[DB_CONTENT_API] findGlobalVersions() result:', result)\n return result\n}\n\nconst createGlobalVersion: CreateGlobalVersion = async function createGlobalVersion(\n this: ContentAPIAdapter,\n { req, versionData, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] createGlobalVersion() called with:', { versionData, ...args })\n\n const result = {} as any\n console.log('[DB_CONTENT_API] createGlobalVersion() result:', result)\n return result\n}\n\nconst updateGlobalVersion: UpdateGlobalVersion = async function updateGlobalVersion(\n this: ContentAPIAdapter,\n { id, req, versionData, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] updateGlobalVersion() called with:', {\n id,\n versionData,\n ...args,\n })\n\n const result = {} as any\n console.log('[DB_CONTENT_API] updateGlobalVersion() result:', result)\n return result\n}\n\nconst countGlobalVersions: CountGlobalVersions = async function countGlobalVersions(\n this: ContentAPIAdapter,\n { req, where, ...args },\n) {\n console.log('🔍 [DB_CONTENT_API] countGlobalVersions() called with:', { where, ...args })\n\n const totalDocs = 0\n const globalVersionsSlug = 'global-versions'\n\n console.log(\n `📊 [DB_CONTENT_API] countGlobalVersions result: ${totalDocs} versions in ${globalVersionsSlug}`,\n )\n\n const result = { totalDocs }\n console.log('[DB_CONTENT_API] countGlobalVersions() result:', result)\n return result\n}\n\nconst request = async function <T = any>(\n this: ContentAPIAdapter,\n path: string,\n body = {},\n): Promise<T> {\n console.log('🔍 [DB_CONTENT_API] request() called with:', { body, path })\n const res = await fetch(`${this.contentApiUrl}${path}`, {\n body: JSON.stringify({\n contentSystemId: this.contentSystemId,\n ...body,\n }),\n headers: {\n Authorization: `Bearer ${this.projectToken}`,\n 'Content-Type': 'application/json',\n 'X-Api-Key': this.contentApiKey,\n },\n method: 'POST',\n })\n\n return res.json() as T\n}\n\nconst beginTransaction: BeginTransaction = async function (options?: Record<string, any>) {\n console.log('🔍 [DB_CONTENT_API] beginTransaction() called', options)\n return null\n}\n\nconst commitTransaction: CommitTransaction = async function (\n id: number | Promise<number | string> | string,\n) {\n console.log('🔍 [DB_CONTENT_API] commitTransaction() called', id)\n}\n\nexport const contentAPIAdapter = (opts: ContentAPIDatabaseAdapterOptions): DatabaseAdapterObj => {\n return {\n name: 'content_api',\n defaultIDType: 'text',\n init: ({ payload }) => {\n return createDatabaseAdapter<ContentAPIAdapter>({\n name: 'content_api',\n beginTransaction,\n commitTransaction,\n contentApiKey: opts.contentApiKey,\n contentApiUrl: opts.contentApiUrl,\n contentSystemId: opts.contentSystemId,\n count,\n countGlobalVersions,\n countVersions,\n create,\n createGlobal,\n createGlobalVersion,\n createVersion,\n defaultIDType: 'text',\n deleteMany,\n deleteOne,\n deleteVersions,\n find,\n findDistinct,\n findGlobal,\n findGlobalVersions,\n findOne,\n findVersions,\n init,\n packageName: '@payloadcms/db-content-api',\n payload,\n projectToken: opts.projectToken,\n queryDrafts,\n request,\n rollbackTransaction: async () => {},\n updateGlobal,\n updateGlobalVersion,\n updateMany,\n updateOne,\n updateVersion,\n upsert,\n })\n },\n }\n}\n"],"names":["randomUUID","createDatabaseAdapter","slugIsGlobal","slug","startsWith","getGlobalSlug","transformWhereClause","where","undefined","and","map","filter","Boolean","or","transformedClauses","field","condition","Object","entries","Array","isArray","push","operator","value","path","length","formatDocument","doc","id","data","meta","_meta","init","console","log","payload","config","collections","c","collection","response","request","contentSystemId","key","error","warn","global","globals","globalKey","g","find","limit","page","req","sort","args","JSON","stringify","collectionKey","offset","flat","s","direction","values","keys","message","docs","result","pagination","totalDocs","total","actualLimit","totalPages","Math","ceil","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","findVersions","queryDrafts","createVersion","collectionSlug","versionData","updateVersion","deleteVersions","versionsToDelete","versionCollection","findOne","body","updateMany","createOnMissing","updateOne","whereClause","returning","exclude","deleteMany","deletedCount","count","deleteOne","deletedDocs","docId","create","randomKey","countVersions","upsert","updateResponse","documentKey","Date","now","success","createGlobal","findGlobal","findDistinct","distinctValues","paginatedValues","endIndex","updateGlobal","findGlobalVersions","createGlobalVersion","updateGlobalVersion","countGlobalVersions","globalVersionsSlug","res","fetch","contentApiUrl","headers","Authorization","projectToken","contentApiKey","method","json","beginTransaction","options","commitTransaction","contentAPIAdapter","opts","name","defaultIDType","packageName","rollbackTransaction"],"mappings":"AAqCA,SAASA,UAAU,QAAQ,SAAQ;AACnC,SAKEC,qBAAqB,QAEhB,UAAS;AAmBhB,MAAMC,eAAe,CAACC,OAAiBA,KAAKC,UAAU,CAAC;AAEvD,MAAMC,gBAAgB,CAACF,OAAiB,CAAC,QAAQ,EAAEA,MAAM;AAEzD,mEAAmE;AACnE,SAASG,qBAAqBC,KAAwB;IACpD,IAAI,CAACA,OAAO;QACV,OAAOC;IACT;IAEA,kCAAkC;IAClC,IAAID,MAAME,GAAG,EAAE;QACb,OAAO;YACLA,KAAKF,MAAME,GAAG,CAACC,GAAG,CAACJ,sBAAsBK,MAAM,CAACC;QAClD;IACF;IAEA,IAAIL,MAAMM,EAAE,EAAE;QACZ,OAAO;YACLA,IAAIN,MAAMM,EAAE,CAACH,GAAG,CAACJ,sBAAsBK,MAAM,CAACC;QAChD;IACF;IAEA,6BAA6B;IAC7B,MAAME,qBAA4B,EAAE;IAEpC,KAAK,MAAM,CAACC,OAAOC,UAAU,IAAIC,OAAOC,OAAO,CAACX,OAAQ;QACtD,IAAIQ,UAAU,SAASA,UAAU,MAAM;YACrC;QACF;QAEA,IAAII,MAAMC,OAAO,CAACJ,YAAY;YAC5B,8BAA8B;YAC9BF,mBAAmBO,IAAI,CAAC;gBACtB,CAACN,MAAM,EAAEC,UAAUN,GAAG,CAACJ,sBAAsBK,MAAM,CAACC;YACtD;QACF,OAAO,IAAI,OAAOI,cAAc,YAAYA,cAAc,MAAM;YAC9D,wEAAwE;YACxE,KAAK,MAAM,CAACM,UAAUC,MAAM,IAAIN,OAAOC,OAAO,CAACF,WAAY;gBACzDF,mBAAmBO,IAAI,CAAC;oBACtBC,UAAUA;oBACVE,MAAMT;oBACNQ;gBACF;YACF;QACF,OAAO;YACL,0DAA0D;YAC1DT,mBAAmBO,IAAI,CAAC;gBACtBC,UAAU;gBACVE,MAAMT;gBACNQ,OAAOP;YACT;QACF;IACF;IAEA,IAAIF,mBAAmBW,MAAM,KAAK,GAAG;QACnC,OAAOX,kBAAkB,CAAC,EAAE;IAC9B,OAAO,IAAIA,mBAAmBW,MAAM,GAAG,GAAG;QACxC,OAAO;YACLhB,KAAKK;QACP;IACF;IAEA,OAAON;AACT;AAEA,MAAMkB,iBAAiB,CAACC;IACtB,IAAI,CAACA,KAAK;QACR,OAAO;IACT;IAEA,MAAM,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGC,MAAM,GAAGH;IAE9B,OAAO;QACLC;QACAG,OAAOD;QACP,GAAGD,IAAI;IACT;AACF;AAEA,eAAeG;IACbC,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC,6BAA6B,IAAI;IAC7CD,QAAQC,GAAG,CACT,4CACA,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,WAAW,CAAC3B,GAAG,CAAC,CAAC4B,IAAMA,EAAEnC,IAAI;IAGnD,oCAAoC;IACpC,KAAK,MAAMoC,cAAc,IAAI,CAACJ,OAAO,CAACC,MAAM,CAACC,WAAW,CAAE;QACxD,IAAI;YACFJ,QAAQC,GAAG,CAAC,CAAC,yCAAyC,EAAEK,WAAWpC,IAAI,EAAE;YACzE,MAAMqC,WAAW,MAAM,IAAI,CAACC,OAAO,CAAC,uBAAuB;gBACzDC,iBAAiB,IAAI,CAACA,eAAe;gBACrCC,KAAKJ,WAAWpC,IAAI;YACtB;YAEA,IAAIqC,SAASI,KAAK,EAAE;gBAClBX,QAAQW,KAAK,CACX,CAAC,mCAAmC,EAAEL,WAAWpC,IAAI,CAAC,QAAQ,CAAC,EAC/DqC,SAASI,KAAK;YAElB,OAAO;gBACLX,QAAQC,GAAG,CAAC,CAAC,uCAAuC,EAAEK,WAAWpC,IAAI,EAAE;YACzE;QACF,EAAE,OAAOyC,OAAO;YACdX,QAAQY,IAAI,CAAC,CAAC,gDAAgD,EAAEN,WAAWpC,IAAI,CAAC,CAAC,CAAC,EAAEyC;QACtF;IACF;IAEA,uDAAuD;IACvD,KAAK,MAAME,UAAU,IAAI,CAACX,OAAO,CAACC,MAAM,CAACW,OAAO,CAAE;QAChD,IAAI;YACF,MAAMC,YAAY3C,cAAcyC,OAAO3C,IAAI;YAC3C8B,QAAQC,GAAG,CAAC,CAAC,gDAAgD,EAAEc,WAAW;YAC1E,MAAMR,WAAW,MAAM,IAAI,CAACC,OAAO,CAAC,uBAAuB;gBACzDC,iBAAiB,IAAI,CAACA,eAAe;gBACrCC,KAAKK;YACP;YAEA,IAAIR,SAASI,KAAK,EAAE;gBAClBX,QAAQW,KAAK,CACX,CAAC,0CAA0C,EAAEI,UAAU,QAAQ,CAAC,EAChER,SAASI,KAAK;YAElB,OAAO;gBACLX,QAAQC,GAAG,CAAC,CAAC,8CAA8C,EAAEc,WAAW;YAC1E;QACF,EAAE,OAAOJ,OAAO;YACdX,QAAQY,IAAI,CAAC,CAAC,uDAAuD,EAAEC,OAAO3C,IAAI,CAAC,CAAC,CAAC,EAAEyC;QACzF;IACF;IAEAX,QAAQC,GAAG,CACT,wCACA,IAAI,CAACC,OAAO,CAACC,MAAM,CAACW,OAAO,CAACrC,GAAG,CAAC,CAACuC,IAAMA,EAAE9C,IAAI;AAEjD;AAEA,MAAM+C,OAAa,eAAeA,KAEhC,EAAEX,UAAU,EAAEY,KAAK,EAAEC,OAAO,CAAC,EAAEC,GAAG,EAAEC,IAAI,EAAE/C,KAAK,EAAE,GAAGgD,MAAM;IAE1DtB,QAAQC,GAAG,CACT,2CACAK,YACAiB,KAAKC,SAAS,CAACnD,qBAAqBC,QAAQ,MAAM,IAClD;QAAE4C;QAAOC;QAAME;QAAM,GAAGC,IAAI;IAAC;IAG/B,IAAI;QACF,MAAMf,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,0BAA0B;YACjEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCS;YACAQ,QAAQ,AAACP,CAAAA,OAAO,CAAA,IAAMD,CAAAA,SAAS,EAAC;YAChCG,MAAMA,OACF;gBAACA;aAAK,CAACM,IAAI,GAAGlD,GAAG,CAAC,CAACmD,IAAY,CAAA;oBAC7BC,WAAW7C,OAAO8C,MAAM,CAACF,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,QAAQ;oBAChDrC,MAAMP,OAAO+C,IAAI,CAACH,EAAE,CAAC,EAAE;gBACzB,CAAA,KACArD;YACJD,OAAOD,qBAAqBC;QAC9B;QAEA,IAAIiC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CAAC,mCAAmCJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAC5F;QAEA,MAAMsB,OAAO1B,SAAS2B,MAAM,EAAEtC,QAAQ,EAAE;QACxC,MAAMuC,aAAa5B,SAAS2B,MAAM,EAAEC;QACpC,MAAMC,YAAYD,YAAYE,SAASJ,KAAKzC,MAAM;QAClD,MAAM8C,cAAcpB,SAAS;QAC7B,MAAMqB,aAAaC,KAAKC,IAAI,CAACL,YAAYE;QACzC,MAAMI,cAAcvB,OAAOoB;QAE3B,MAAML,SAAS;YACbD,MAAMA,KAAKxD,GAAG,CAACgB;YACfiD;YACAC,aAAaxB,OAAO;YACpBD,OAAOoB;YACPM,UAAUF,cAAcvB,OAAO,IAAI;YACnCA;YACA0B,eAAe;YACfC,UAAU3B,OAAO,IAAIA,OAAO,IAAI;YAChCiB;YACAG;QACF;QACAvC,QAAQC,GAAG,CAAC,mCAAmCiC;QAC/C,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,mCAAmC,CAAC,EAAEA;QACrD,MAAMsB,OAAc,EAAE;QACtB,MAAMS,cAAc;QACpB,MAAMH,aAAa;QAEnB,OAAO;YACLN;YACAS;YACAC,aAAaxB,OAAO;YACpBD,OAAOA,SAASe,KAAKzC,MAAM;YAC3BoD,UAAUF,cAAcvB,OAAO,IAAI;YACnCA;YACA0B,eAAe;YACfC,UAAU3B,OAAO,IAAIA,OAAO,IAAI;YAChCiB,WAAWH,KAAKzC,MAAM;YACtB+C;QACF;IACF;AACF;AAEA,MAAMQ,eAA6B,eAAeA,aAEhD,EAAEzC,UAAU,EAAEY,KAAK,EAAEC,OAAO,CAAC,EAAEC,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEpDtB,QAAQC,GAAG,CAAC,mDAAmD;QAC7DK;QACAY;QACAC;QACA7C;QACA,GAAGgD,IAAI;IACT;IAEA,MAAMW,OAAc,EAAE;IACtB,MAAMS,cAAc;IACpB,MAAMR,SAAS;QACbD;QACAS;QACAC,aAAaxB,OAAO;QACpBD,OAAOA,SAASe,KAAKzC,MAAM;QAC3BoD,UAAUF,cAAcvB,OAAO,IAAI;QACnCA;QACA0B,eAAe;QACfC,UAAU3B,OAAO,IAAIA,OAAO,IAAI;QAChCiB,WAAWH,KAAKzC,MAAM;QACtB+C,YAAYrB,SAASe,KAAKzC,MAAM,GAAGgD,KAAKC,IAAI,CAACR,KAAKzC,MAAM,GAAG0B,SAAS;IACtE;IACAlB,QAAQC,GAAG,CAAC,2CAA2CiC;IACvD,OAAOA;AACT;AAEA,MAAMc,cAA2B,eAAeA,YAE9C,EAAE1C,UAAU,EAAEY,KAAK,EAAEC,OAAO,CAAC,EAAEC,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEpDtB,QAAQC,GAAG,CAAC,kDAAkD;QAC5DK;QACAY;QACAC;QACA7C;QACA,GAAGgD,IAAI;IACT;IAEA,MAAMW,OAAc,EAAE;IACtB,MAAMS,cAAc;IACpB,MAAMR,SAAS;QACbD;QACAS;QACAC,aAAaxB,OAAO;QACpBD,OAAOA,SAASe,KAAKzC,MAAM;QAC3BoD,UAAUF,cAAcvB,OAAO,IAAI;QACnCA;QACA0B,eAAe;QACfC,UAAU3B,OAAO,IAAIA,OAAO,IAAI;QAChCiB,WAAWH,KAAKzC,MAAM;QACtB+C,YAAYrB,SAASe,KAAKzC,MAAM,GAAGgD,KAAKC,IAAI,CAACR,KAAKzC,MAAM,GAAG0B,SAAS;IACtE;IACAlB,QAAQC,GAAG,CAAC,0CAA0CiC;IACtD,OAAOA;AACT;AAEA,MAAMe,gBAA+B,eAAeA,cAElD,EAAEC,cAAc,EAAE9B,GAAG,EAAE+B,WAAW,EAAE,GAAG7B,MAAM;IAE7CtB,QAAQC,GAAG,CAAC,oDAAoD;QAC9DiD;QACAC;QACA,GAAG7B,IAAI;IACT;IAEA,MAAMY,SAAS,CAAC;IAChBlC,QAAQC,GAAG,CAAC,4CAA4CiC;IACxD,OAAOA;AACT;AAEA,MAAMkB,gBAA+B,eAAeA,cAElD,EAAEzD,EAAE,EAAEW,UAAU,EAAEc,GAAG,EAAE+B,WAAW,EAAE7E,KAAK,EAAE,GAAGgD,MAAM;IAEpDtB,QAAQC,GAAG,CAAC,oDAAoD;QAC9DN;QACAW;QACA6C;QACA,GAAG7B,IAAI;IACT;IAEA,MAAMY,SAAS,CAAC;IAChBlC,QAAQC,GAAG,CAAC,4CAA4CiC;IACxD,OAAOA;AACT;AAEA,MAAMmB,iBAAiC,eAAeA,eAEpD,EAAE/C,UAAU,EAAEc,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEnCtB,QAAQC,GAAG,CAAC,qDAAqD;QAAEK;QAAYhC;QAAO,GAAGgD,IAAI;IAAC;IAE9F,MAAMgC,mBAA0B,EAAE;IAClC,MAAMC,oBAAoB;IAE1BvD,QAAQC,GAAG,CACT,CAAC,6BAA6B,EAAEqD,iBAAiB9D,MAAM,CAAC,eAAe,EAAE+D,mBAAmB;AAG9F,iCAAiC;AACnC;AAEA,MAAMC,UAAmB,eAAeA,QAEtC,EAAElD,UAAU,EAAEc,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEnCtB,QAAQC,GAAG,CACT,8CACAK,YACAiB,KAAKC,SAAS,CAACnD,qBAAqBC,QAAQ,MAAM,IAClDgD,MACAF,KAAKqC;IAGP,IAAI;QACF,MAAMlD,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,0BAA0B;YACjEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCS,OAAO;YACPQ,QAAQ;YACRpD,OAAOD,qBAAqBC;QAC9B;QAEA,IAAIiC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CAAC,sCAAsCJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAC/F;QAEA,MAAMsB,OAAO1B,SAAS2B,MAAM,EAAEtC,QAAQ,EAAE;QACxC,MAAMsC,SAASD,KAAKzC,MAAM,GAAG,IAAIyC,IAAI,CAAC,EAAE,GAAG;QAC3CjC,QAAQC,GAAG,CAAC,sCAAsCiC;QAClD,OAAOzC,eAAeyC;IACxB,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,sCAAsC,CAAC,EAAEA;QACxD,OAAO;IACT;AACF;AAEA,MAAM+C,aAAyB,eAAeA,WAE5C,EAAEpD,UAAU,EAAEV,IAAI,EAAEwB,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEzCtB,QAAQC,GAAG,CAAC,iDAAiD;QAAEK;QAAYV;QAAMtB;QAAO,GAAGgD,IAAI;IAAC;IAChG,IAAI;QACF,MAAMf,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,4BAA4B;YACnEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCkD,iBAAiB;YACjB/D;YACAtB,OAAOD,qBAAqBC;QAC9B;QAEA,IAAIiC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CACX,yCACAJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAE7C;QAEA,+EAA+E;QAC/E,MAAMuB,SAAS3B,SAAS2B,MAAM,EAAEtC,QAAQ,EAAE;QAC1CI,QAAQC,GAAG,CAAC,yCAAyCiC;QACrD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,yCAAyC,CAAC,EAAEA;QAC3D,OAAO,EAAE;IACX;AACF;AAEA,MAAMiD,YAAuB,eAAeA,UAE1C,EAAEjE,EAAE,EAAEW,UAAU,EAAEV,IAAI,EAAEwB,GAAG,EAAE9C,QAAQ,CAAC,CAAC,EAAE,GAAGgD,MAAM;IAElDtB,QAAQC,GAAG,CAAC,gDAAgD;QAC1DN;QACAW;QACAV;QACAtB;QACA,GAAGgD,IAAI;IACT;IACA,IAAI;QACF,MAAMuC,cAAclE,KAChB;YAAEN,UAAU;YAAUE,MAAM;YAAMD,OAAOK;QAAG,IAC5CtB,qBAAqBC;QACzB,MAAMiC,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,4BAA4B;YACnEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCkD,iBAAiB;YACjB/D;YACAkE,WAAW;gBAAEC,SAAS,EAAE;YAAC;YACzBzF,OAAOuF;QACT;QAEA,IAAItD,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CACX,wCACAJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAE7C;QAEA,MAAMuB,SAAS3B,SAAS2B,MAAM,EAAEtC,QAAQ;YAAED;YAAI,GAAGC,IAAI;QAAC;QACtDI,QAAQC,GAAG,CAAC,wCAAwCiC;QACpD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,wCAAwC,CAAC,EAAEA;QAC1D,OAAO;YAAEhB;YAAI,GAAGC,IAAI;QAAC;IACvB;AACF;AAEA,MAAMoE,aAAyB,eAAeA,WAE5C,EAAE1D,UAAU,EAAEc,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEnCtB,QAAQC,GAAG,CAAC,iDAAiD;QAAEK;QAAYhC;QAAO,GAAGgD,IAAI;IAAC;IAC1F,IAAI;QACF,MAAMf,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,4BAA4B;YACnEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCqD,WAAW;YACXxF,OAAOD,qBAAqBC;QAC9B;QAEA,IAAIiC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CACX,yCACAJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAE7C;QAEA,MAAMsD,eAAe1D,SAAS2B,MAAM,EAAEgC,SAAS;QAC/ClE,QAAQC,GAAG,CAAC,CAAC,6BAA6B,EAAEgE,aAAa,gBAAgB,EAAE3D,YAAY;IACzF,EAAE,OAAOK,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,yCAAyC,CAAC,EAAEA;IAC7D;AACF;AAEA,MAAMwD,YAAuB,eAAeA,UAE1C,EAAE7D,UAAU,EAAEc,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEnCtB,QAAQC,GAAG,CAAC,gDAAgD;QAAEK;QAAYhC;QAAO,GAAGgD,IAAI;IAAC;IACzF,IAAI;QACF,MAAMf,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,4BAA4B;YACnEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCqD,WAAW;gBAAEC,SAAS,EAAE;YAAC;YACzBzF,OAAOD,qBAAqBC;QAC9B;QAEA,IAAIiC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CACX,wCACAJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAE7C;QAEA,MAAMyD,cAAc7D,SAAS2B,MAAM,EAAEtC,QAAQ,EAAE;QAC/C,MAAMyE,QAAQD,YAAY5E,MAAM,GAAG,IAAI4E,WAAW,CAAC,EAAE,CAACzE,EAAE,GAAG;QAC3D,MAAMuC,SAASkC,YAAY5E,MAAM,GAAG,IAAI4E,WAAW,CAAC,EAAE,GAAG,CAAC;QAE1DpE,QAAQC,GAAG,CAAC,CAAC,sCAAsC,EAAEoE,MAAM,MAAM,EAAE/D,YAAY;QAC/EN,QAAQC,GAAG,CAAC,wCAAwCiC;QACpD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,wCAAwC,CAAC,EAAEA;QAC1D,OAAO,CAAC;IACV;AACF;AAEA,MAAM2D,SAAiB,eAAeA,OAEpC,EAAEhE,UAAU,EAAEV,IAAI,EAAEwB,GAAG,EAAE,GAAGE,MAAM;IAElCtB,QAAQC,GAAG,CAAC,6CAA6C;QAAEK;QAAYV;QAAM,GAAG0B,IAAI;IAAC;IACrF,IAAI;QACF,MAAMiD,YAAYxG;QAClB,MAAMwC,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,4BAA4B;YACnEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCb;YACAc,KAAKd,KAAKc,GAAG,IAAId,KAAKD,EAAE,IAAI,CAAC,IAAI,EAAE4E,WAAW;QAChD;QAEA,IAAIhE,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CAAC,qCAAqCJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAC9F;QAEA,MAAMuB,SAAS3B,SAAS2B,MAAM,EAAEtC,QAAQW,SAAS2B,MAAM,IAAI;YAAEvC,IAAI,CAAC,IAAI,EAAE4E,WAAW;YAAE,GAAG3E,IAAI;QAAC;QAC7FI,QAAQC,GAAG,CAAC,qCAAqCiC;QACjD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,qCAAqC,CAAC,EAAEA;QACvD,OAAO;YAAEhB,IAAI,CAAC,IAAI,EAAE5B,cAAc;YAAE,GAAG6B,IAAI;QAAC;IAC9C;AACF;AAEA,MAAMsE,QAAe,eAAeA,MAElC,EAAE5D,UAAU,EAAEc,GAAG,EAAE9C,QAAQ,CAAC,CAAC,EAAE,GAAGgD,MAAM;IAExCtB,QAAQC,GAAG,CAAC,4CAA4C;QAAEK;QAAYhC;QAAO,GAAGgD,IAAI;IAAC;IACrF,IAAI;QACF,MAAMf,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,2BAA2B;YAClEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCnC,OAAOD,qBAAqBC;QAC9B;QAEA,IAAIiC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CAAC,oCAAoCJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAC7F;QAEA,MAAMuB,SAAS;YAAEE,WAAW7B,SAAS2B,MAAM,EAAEgC,SAAS;QAAE;QACxDlE,QAAQC,GAAG,CAAC,oCAAoCiC;QAChD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,oCAAoC,CAAC,EAAEA;QACtD,OAAO;YAAEyB,WAAW;QAAE;IACxB;AACF;AAEA,MAAMoC,gBAA+B,eAAeA,cAElD,EAAElE,UAAU,EAAEc,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEnCtB,QAAQC,GAAG,CAAC,oDAAoD;QAAEK;QAAYhC;QAAO,GAAGgD,IAAI;IAAC;IAE7F,MAAMY,SAAS;QAAEE,WAAW;IAAE;IAC9BpC,QAAQC,GAAG,CAAC,4CAA4CiC;IACxD,OAAOA;AACT;AAEA,MAAMuC,SAAiB,eAAeA,OAEpC,EAAEnE,UAAU,EAAEV,IAAI,EAAEwB,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEzCtB,QAAQC,GAAG,CAAC,6CAA6C;QAAEK;QAAYV;QAAMtB;QAAO,GAAGgD,IAAI;IAAC;IAC5F,IAAI;QACF,sBAAsB;QACtB,MAAMoD,iBAAiB,MAAM,IAAI,CAAClE,OAAO,CAAM,4BAA4B;YACzEiB,eAAenB;YACfG,iBAAiB,IAAI,CAACA,eAAe;YACrCkD,iBAAiB;gBAAEgB,aAAa,CAAC,OAAO,EAAEC,KAAKC,GAAG,IAAI;YAAC;YACvDjF;YACAkE,WAAW;gBAAEC,SAAS,EAAE;YAAC;YACzBzF,OAAOD,qBAAqBC;QAC9B;QAEA,IAAI,CAACoG,eAAeI,OAAO,EAAE;YAC3B9E,QAAQC,GAAG,CAAC,qCAAqCyE,eAAe/D,KAAK;QACvE;QAEA,MAAMuB,SAASwC,eAAexC,MAAM,EAAEtC,QAAQ;YAAE,GAAGA,IAAI;QAAC;QACxDI,QAAQC,GAAG,CAAC,qCAAqCiC;QACjD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,qCAAqC,CAAC,EAAEA;QACvD,OAAO;YAAE,GAAGf,IAAI;QAAC;IACnB;AACF;AAEA,MAAMmF,eAA6B,eAAeA,aAEhD,EAAE7G,IAAI,EAAE0B,IAAI,EAAEwB,GAAG,EAAE,GAAGE,MAAM;IAE5BtB,QAAQC,GAAG,CAAC,mDAAmD;QAAE/B;QAAM0B;QAAM,GAAG0B,IAAI;IAAC;IAErF,IAAI;QACF,MAAMP,YAAY3C,cAAcF;QAChC,MAAMqC,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,4BAA4B;YACnEiB,eAAeV;YACfN,iBAAiB,IAAI,CAACA,eAAe;YACrCb;YACAc,KAAK,CAAC,OAAO,EAAExC,MAAM;QACvB;QAEA,IAAIqC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CACX,2CACAJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAE7C;QAEA,MAAMuB,SAAS3B,SAAS2B,MAAM,EAAEtC,QAAQW,SAAS2B,MAAM,IAAI;YAAEvC,IAAI,CAAC,OAAO,EAAEzB,MAAM;YAAE,GAAG0B,IAAI;QAAC;QAC3FI,QAAQC,GAAG,CAAC,2CAA2CiC;QACvD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,2CAA2C,CAAC,EAAEA;QAC7D,OAAO;YAAEhB,IAAI,CAAC,OAAO,EAAEzB,MAAM;YAAE,GAAG0B,IAAI;QAAC;IACzC;AACF;AAEA,MAAMoF,aAAyB,eAAeA,WAE5C,EAAE9G,IAAI,EAAEkD,GAAG,EAAE,GAAGE,MAAM;IAEtBtB,QAAQC,GAAG,CAAC,iDAAiD;QAAE/B;QAAM,GAAGoD,IAAI;IAAC;IAE7E,IAAI;QACF,MAAMP,YAAY3C,cAAcF;QAChC,MAAMqC,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,0BAA0B;YACjEiB,eAAeV;YACfN,iBAAiB,IAAI,CAACA,eAAe;YACrCS,OAAO;YACPQ,QAAQ;QACV;QAEA,IAAInB,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CACX,yCACAJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAE7C;QAEA,MAAMsB,OAAO1B,SAAS2B,MAAM,EAAEtC,QAAQ,EAAE;QACxC,MAAMsC,SAASD,KAAKzC,MAAM,GAAG,IAAIyC,IAAI,CAAC,EAAE,GAAG;QAC3CjC,QAAQC,GAAG,CAAC,yCAAyCiC;QACrD,OAAOzC,eAAeyC;IACxB,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,yCAAyC,CAAC,EAAEA;QAC3D,OAAO;IACT;AACF;AAEA,MAAMsE,eAA6B,eAAeA,aAEhD,EAAE3E,UAAU,EAAExB,KAAK,EAAEoC,KAAK,EAAEC,OAAO,CAAC,EAAEC,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAE3DtB,QAAQC,GAAG,CAAC,mDAAmD;QAC7DK;QACAxB;QACAoC;QACAC;QACA7C;QACA,GAAGgD,IAAI;IACT;IAEA,MAAM4D,iBAAwB,EAAE;IAChC,MAAMC,kBAAyB,EAAE;IACjC,MAAMC,WAAW;IACjB,MAAMhD,YAAY;IAElBpC,QAAQC,GAAG,CACT,CAAC,yCAAyC,EAAEiF,eAAe1F,MAAM,CAAC,qBAAqB,EAAEV,OAAO;IAGlG,OAAO;QACL4D,aAAaxB,QAAQkE,WAAWhD,YAAY;QAC5CO,aAAaxB,OAAO;QACpBD,OAAOA,SAASkB;QAChBQ,UAAU1B,SAASkE,WAAWhD,YAAYjB,OAAO,IAAI;QACrDA;QACA0B,eAAe;QACfC,UAAU3B,OAAO,IAAIA,OAAO,IAAI;QAChCiB;QACAG,YAAYrB,QAAQsB,KAAKC,IAAI,CAACL,YAAYlB,SAAS;QACnDY,QAAQqD;IACV;AACF;AAEA,MAAME,eAA6B,eAAeA,aAEhD,EAAEnH,IAAI,EAAE0B,IAAI,EAAEwB,GAAG,EAAE,GAAGE,MAAM;IAE5BtB,QAAQC,GAAG,CAAC,mDAAmD;QAAE/B;QAAM0B;QAAM,GAAG0B,IAAI;IAAC;IAErF,IAAI;QACF,MAAMP,YAAY3C,cAAcF;QAChC,MAAMqC,WAAW,MAAM,IAAI,CAACC,OAAO,CAAM,4BAA4B;YACnEiB,eAAeV;YACfN,iBAAiB,IAAI,CAACA,eAAe;YACrCkD,iBAAiB;gBAAEgB,aAAa,CAAC,OAAO,EAAEzG,MAAM;YAAC;YACjD0B;YACAkE,WAAW;gBAAEC,SAAS,EAAE;YAAC;YACzBzF,OAAO;gBAAEe,UAAU;gBAAUE,MAAM;gBAAOD,OAAO,CAAC,OAAO,EAAEpB,MAAM;YAAC;QACpE;QAEA,IAAIqC,SAASI,KAAK,EAAE;YAClBX,QAAQW,KAAK,CACX,2CACAJ,SAASI,KAAK,EAAEqB,WAAWzB,SAASI,KAAK;QAE7C;QAEA,MAAMuB,SAAS3B,SAAS2B,MAAM,EAAEtC,QAAQ;YAAED,IAAI,CAAC,OAAO,EAAEzB,MAAM;YAAE,GAAG0B,IAAI;QAAC;QACxEI,QAAQC,GAAG,CAAC,2CAA2CiC;QACvD,OAAOA;IACT,EAAE,OAAOvB,OAAO;QACdX,QAAQW,KAAK,CAAC,CAAC,2CAA2C,CAAC,EAAEA;QAC7D,OAAO;YAAEhB,IAAI,CAAC,OAAO,EAAEzB,MAAM;YAAE,GAAG0B,IAAI;QAAC;IACzC;AACF;AAEA,MAAM0F,qBAAyC,eAAeA,mBAE5D,EAAEpE,KAAK,EAAEC,OAAO,CAAC,EAAEC,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAExCtB,QAAQC,GAAG,CAAC,yDAAyD;QACnEiB;QACAC;QACA7C;QACA,GAAGgD,IAAI;IACT;IAEA,MAAMW,OAAc,EAAE;IACtB,MAAMS,cAAc;IACpB,MAAMR,SAAS;QACbD;QACAS;QACAC,aAAaxB,OAAO;QACpBD,OAAOA,SAASe,KAAKzC,MAAM;QAC3BoD,UAAUF,cAAcvB,OAAO,IAAI;QACnCA;QACA0B,eAAe;QACfC,UAAU3B,OAAO,IAAIA,OAAO,IAAI;QAChCiB,WAAWH,KAAKzC,MAAM;QACtB+C,YAAYrB,SAASe,KAAKzC,MAAM,GAAGgD,KAAKC,IAAI,CAACR,KAAKzC,MAAM,GAAG0B,SAAS;IACtE;IACAlB,QAAQC,GAAG,CAAC,iDAAiDiC;IAC7D,OAAOA;AACT;AAEA,MAAMqD,sBAA2C,eAAeA,oBAE9D,EAAEnE,GAAG,EAAE+B,WAAW,EAAE,GAAG7B,MAAM;IAE7BtB,QAAQC,GAAG,CAAC,0DAA0D;QAAEkD;QAAa,GAAG7B,IAAI;IAAC;IAE7F,MAAMY,SAAS,CAAC;IAChBlC,QAAQC,GAAG,CAAC,kDAAkDiC;IAC9D,OAAOA;AACT;AAEA,MAAMsD,sBAA2C,eAAeA,oBAE9D,EAAE7F,EAAE,EAAEyB,GAAG,EAAE+B,WAAW,EAAE,GAAG7B,MAAM;IAEjCtB,QAAQC,GAAG,CAAC,0DAA0D;QACpEN;QACAwD;QACA,GAAG7B,IAAI;IACT;IAEA,MAAMY,SAAS,CAAC;IAChBlC,QAAQC,GAAG,CAAC,kDAAkDiC;IAC9D,OAAOA;AACT;AAEA,MAAMuD,sBAA2C,eAAeA,oBAE9D,EAAErE,GAAG,EAAE9C,KAAK,EAAE,GAAGgD,MAAM;IAEvBtB,QAAQC,GAAG,CAAC,0DAA0D;QAAE3B;QAAO,GAAGgD,IAAI;IAAC;IAEvF,MAAMc,YAAY;IAClB,MAAMsD,qBAAqB;IAE3B1F,QAAQC,GAAG,CACT,CAAC,gDAAgD,EAAEmC,UAAU,aAAa,EAAEsD,oBAAoB;IAGlG,MAAMxD,SAAS;QAAEE;IAAU;IAC3BpC,QAAQC,GAAG,CAAC,kDAAkDiC;IAC9D,OAAOA;AACT;AAEA,MAAM1B,UAAU,eAEdjB,IAAY,EACZkE,OAAO,CAAC,CAAC;IAETzD,QAAQC,GAAG,CAAC,8CAA8C;QAAEwD;QAAMlE;IAAK;IACvE,MAAMoG,MAAM,MAAMC,MAAM,GAAG,IAAI,CAACC,aAAa,GAAGtG,MAAM,EAAE;QACtDkE,MAAMlC,KAAKC,SAAS,CAAC;YACnBf,iBAAiB,IAAI,CAACA,eAAe;YACrC,GAAGgD,IAAI;QACT;QACAqC,SAAS;YACPC,eAAe,CAAC,OAAO,EAAE,IAAI,CAACC,YAAY,EAAE;YAC5C,gBAAgB;YAChB,aAAa,IAAI,CAACC,aAAa;QACjC;QACAC,QAAQ;IACV;IAEA,OAAOP,IAAIQ,IAAI;AACjB;AAEA,MAAMC,mBAAqC,eAAgBC,OAA6B;IACtFrG,QAAQC,GAAG,CAAC,iDAAiDoG;IAC7D,OAAO;AACT;AAEA,MAAMC,oBAAuC,eAC3C3G,EAA8C;IAE9CK,QAAQC,GAAG,CAAC,kDAAkDN;AAChE;AAEA,OAAO,MAAM4G,oBAAoB,CAACC;IAChC,OAAO;QACLC,MAAM;QACNC,eAAe;QACf3G,MAAM,CAAC,EAAEG,OAAO,EAAE;YAChB,OAAOlC,sBAAyC;gBAC9CyI,MAAM;gBACNL;gBACAE;gBACAL,eAAeO,KAAKP,aAAa;gBACjCJ,eAAeW,KAAKX,aAAa;gBACjCpF,iBAAiB+F,KAAK/F,eAAe;gBACrCyD;gBACAuB;gBACAjB;gBACAF;gBACAS;gBACAQ;gBACAtC;gBACAyD,eAAe;gBACf1C;gBACAG;gBACAd;gBACApC;gBACAgE;gBACAD;gBACAM;gBACA9B;gBACAT;gBACAhD;gBACA4G,aAAa;gBACbzG;gBACA8F,cAAcQ,KAAKR,YAAY;gBAC/BhD;gBACAxC;gBACAoG,qBAAqB,WAAa;gBAClCvB;gBACAG;gBACA9B;gBACAE;gBACAR;gBACAqB;YACF;QACF;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/endpoints/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,MAAM,EAAE,QAMpB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/health.ts"],"sourcesContent":["import type { Endpoint } from 'payload'\n\nexport const health: Endpoint = {\n handler: () => {\n return Response.json({ status: 200 })\n },\n method: 'get',\n path: '/health',\n}\n"],"names":["health","handler","Response","json","status","method","path"],"mappings":"AAEA,OAAO,MAAMA,SAAmB;IAC9BC,SAAS;QACP,OAAOC,SAASC,IAAI,CAAC;YAAEC,QAAQ;QAAI;IACrC;IACAC,QAAQ;IACRC,MAAM;AACR,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/oauth/components/LoginButton/index.tsx"],"sourcesContent":["'use client'\n\nimport { Button, useConfig } from '@payloadcms/ui'\nimport { useSearchParams } from 'next/navigation.js'\nimport React, { useEffect, useState } from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'oauth-login'\n\ntype DefaultLoginButtonProps = {\n disabled?: boolean\n endpointSlug: string\n}\n\nexport const DefaultLoginButton: React.FC<DefaultLoginButtonProps> = ({\n disabled,\n endpointSlug,\n}: {\n disabled?: boolean\n endpointSlug: string\n}) => {\n const {\n config: {\n admin: { user: userSlug },\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const [authorizeURL, setAuthorizeURL] = useState('')\n\n const searchParams = useSearchParams()\n const payloadRedirect = searchParams.get('redirect')\n\n useEffect(() => {\n if (payloadRedirect && !disabled) {\n // set cookie to redirect to the original page\n document.cookie = `payloadRedirect=${payloadRedirect}; path=/`\n }\n }, [payloadRedirect, disabled])\n\n useEffect(() => {\n const getAuthorizeURL = async () => {\n const serverURLFromWindow = window.location.origin\n const data = await fetch(\n `${serverURL}${api}/${userSlug}/${endpointSlug}/meta?serverURL=${serverURLFromWindow}`,\n ).then((res) => res.json())\n\n if (!disabled) {\n setAuthorizeURL(data.authorizeURL)\n }\n }\n\n void getAuthorizeURL()\n }, [api, serverURL, userSlug, disabled, endpointSlug])\n\n if (disabled) {\n return null\n }\n\n return (\n <div className={baseClass}>\n <Button className={`${baseClass}__btn`} el=\"anchor\" url={authorizeURL}>\n Log in\n </Button>\n </div>\n )\n}\n"],"names":["Button","useConfig","useSearchParams","React","useEffect","useState","baseClass","DefaultLoginButton","disabled","endpointSlug","config","admin","user","userSlug","routes","api","serverURL","authorizeURL","setAuthorizeURL","searchParams","payloadRedirect","get","document","cookie","getAuthorizeURL","serverURLFromWindow","window","location","origin","data","fetch","then","res","json","div","className","el","url"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,SAAS,QAAQ,iBAAgB;AAClD,SAASC,eAAe,QAAQ,qBAAoB;AACpD,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,OAAO,eAAc;AAErB,MAAMC,YAAY;AAOlB,OAAO,MAAMC,qBAAwD,CAAC,EACpEC,QAAQ,EACRC,YAAY,EAIb;IACC,MAAM,EACJC,QAAQ,EACNC,OAAO,EAAEC,MAAMC,QAAQ,EAAE,EACzBC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACF,GAAGf;IACJ,MAAM,CAACgB,cAAcC,gBAAgB,GAAGb,SAAS;IAEjD,MAAMc,eAAejB;IACrB,MAAMkB,kBAAkBD,aAAaE,GAAG,CAAC;IAEzCjB,UAAU;QACR,IAAIgB,mBAAmB,CAACZ,UAAU;YAChC,8CAA8C;YAC9Cc,SAASC,MAAM,GAAG,CAAC,gBAAgB,EAAEH,gBAAgB,QAAQ,CAAC;QAChE;IACF,GAAG;QAACA;QAAiBZ;KAAS;IAE9BJ,UAAU;QACR,MAAMoB,kBAAkB;YACtB,MAAMC,sBAAsBC,OAAOC,QAAQ,CAACC,MAAM;YAClD,MAAMC,OAAO,MAAMC,MACjB,GAAGd,YAAYD,IAAI,CAAC,EAAEF,SAAS,CAAC,EAAEJ,aAAa,gBAAgB,EAAEgB,qBAAqB,EACtFM,IAAI,CAAC,CAACC,MAAQA,IAAIC,IAAI;YAExB,IAAI,CAACzB,UAAU;gBACbU,gBAAgBW,KAAKZ,YAAY;YACnC;QACF;QAEA,KAAKO;IACP,GAAG;QAACT;QAAKC;QAAWH;QAAUL;QAAUC;KAAa;IAErD,IAAID,UAAU;QACZ,OAAO;IACT;IAEA,qBACE,KAAC0B;QAAIC,WAAW7B;kBACd,cAAA,KAACN;YAAOmC,WAAW,GAAG7B,UAAU,KAAK,CAAC;YAAE8B,IAAG;YAASC,KAAKpB;sBAAc;;;AAK7E,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/oauth/components/LoginButton/index.tsx"],"sourcesContent":["'use client'\n\nimport { Button, useConfig } from '@payloadcms/ui'\nimport { useSearchParams } from 'next/navigation.js'\nimport React, { useEffect, useState } from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'oauth-login'\n\ntype DefaultLoginButtonProps = {\n disabled?: boolean\n endpointSlug: string\n}\n\nexport const DefaultLoginButton: React.FC<DefaultLoginButtonProps> = ({\n disabled,\n endpointSlug,\n}: {\n disabled?: boolean\n endpointSlug: string\n}) => {\n const {\n config: {\n admin: { user: userSlug },\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const [authorizeURL, setAuthorizeURL] = useState('')\n\n const searchParams = useSearchParams()\n const payloadRedirect = searchParams.get('redirect')\n\n useEffect(() => {\n if (payloadRedirect && !disabled) {\n // set cookie to redirect to the original page\n document.cookie = `payloadRedirect=${payloadRedirect}; path=/`\n }\n }, [payloadRedirect, disabled])\n\n useEffect(() => {\n const getAuthorizeURL = async () => {\n const serverURLFromWindow = window.location.origin\n const data = await fetch(\n `${serverURL}${api}/${userSlug}/${endpointSlug}/meta?serverURL=${serverURLFromWindow}`,\n ).then((res) => res.json())\n\n if (!disabled) {\n setAuthorizeURL(data.authorizeURL)\n }\n }\n\n void getAuthorizeURL()\n }, [api, serverURL, userSlug, disabled, endpointSlug])\n\n if (disabled) {\n return null\n }\n\n return (\n <div className={baseClass}>\n <Button className={`${baseClass}__btn`} el=\"anchor\" url={authorizeURL}>\n Log in with Figma\n </Button>\n </div>\n )\n}\n"],"names":["Button","useConfig","useSearchParams","React","useEffect","useState","baseClass","DefaultLoginButton","disabled","endpointSlug","config","admin","user","userSlug","routes","api","serverURL","authorizeURL","setAuthorizeURL","searchParams","payloadRedirect","get","document","cookie","getAuthorizeURL","serverURLFromWindow","window","location","origin","data","fetch","then","res","json","div","className","el","url"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,SAAS,QAAQ,iBAAgB;AAClD,SAASC,eAAe,QAAQ,qBAAoB;AACpD,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,OAAO,eAAc;AAErB,MAAMC,YAAY;AAOlB,OAAO,MAAMC,qBAAwD,CAAC,EACpEC,QAAQ,EACRC,YAAY,EAIb;IACC,MAAM,EACJC,QAAQ,EACNC,OAAO,EAAEC,MAAMC,QAAQ,EAAE,EACzBC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACF,GAAGf;IACJ,MAAM,CAACgB,cAAcC,gBAAgB,GAAGb,SAAS;IAEjD,MAAMc,eAAejB;IACrB,MAAMkB,kBAAkBD,aAAaE,GAAG,CAAC;IAEzCjB,UAAU;QACR,IAAIgB,mBAAmB,CAACZ,UAAU;YAChC,8CAA8C;YAC9Cc,SAASC,MAAM,GAAG,CAAC,gBAAgB,EAAEH,gBAAgB,QAAQ,CAAC;QAChE;IACF,GAAG;QAACA;QAAiBZ;KAAS;IAE9BJ,UAAU;QACR,MAAMoB,kBAAkB;YACtB,MAAMC,sBAAsBC,OAAOC,QAAQ,CAACC,MAAM;YAClD,MAAMC,OAAO,MAAMC,MACjB,GAAGd,YAAYD,IAAI,CAAC,EAAEF,SAAS,CAAC,EAAEJ,aAAa,gBAAgB,EAAEgB,qBAAqB,EACtFM,IAAI,CAAC,CAACC,MAAQA,IAAIC,IAAI;YAExB,IAAI,CAACzB,UAAU;gBACbU,gBAAgBW,KAAKZ,YAAY;YACnC;QACF;QAEA,KAAKO;IACP,GAAG;QAACT;QAAKC;QAAWH;QAAUL;QAAUC;KAAa;IAErD,IAAID,UAAU;QACZ,OAAO;IACT;IAEA,qBACE,KAAC0B;QAAIC,WAAW7B;kBACd,cAAA,KAACN;YAAOmC,WAAW,GAAG7B,UAAU,KAAK,CAAC;YAAE8B,IAAG;YAASC,KAAKpB;sBAAc;;;AAK7E,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLoginEndpoint.d.ts","sourceRoot":"","sources":["../../../src/oauth/endpoints/getLoginEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAEV,iBAAiB,EACjB,aAAa,EAEd,MAAM,aAAa,CAAA;AAcpB,UAAU,IAAI;IACZ,UAAU,EAAE,gBAAgB,CAAA;IAC5B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAID,eAAO,MAAM,gBAAgB,8EAM1B,IAAI,KAAG,
|
|
1
|
+
{"version":3,"file":"getLoginEndpoint.d.ts","sourceRoot":"","sources":["../../../src/oauth/endpoints/getLoginEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAEV,iBAAiB,EACjB,aAAa,EAEd,MAAM,aAAa,CAAA;AAcpB,UAAU,IAAI;IACZ,UAAU,EAAE,gBAAgB,CAAA;IAC5B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAID,eAAO,MAAM,gBAAgB,8EAM1B,IAAI,KAAG,QAkPR,CAAA"}
|
|
@@ -154,7 +154,7 @@ export const getLoginEndpoint = ({ collection, collectionOptions, endpointSlug,
|
|
|
154
154
|
tokenRes
|
|
155
155
|
});
|
|
156
156
|
// Swap for project token
|
|
157
|
-
const project_token = await getProjectToken(tokenRes.access_token,
|
|
157
|
+
const project_token = await getProjectToken(tokenRes.access_token, config.custom.figma.tenantId);
|
|
158
158
|
const refresh_token = access_token;
|
|
159
159
|
// Store project token as access_token
|
|
160
160
|
const token = project_token.token;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/oauth/endpoints/getLoginEndpoint.ts"],"sourcesContent":["import type { CollectionConfig, Endpoint } from 'payload'\n\nimport jwt from 'jsonwebtoken'\nimport { APIError, generateCookie, parseCookies } from 'payload'\nimport { getSafeRedirect } from 'payload/shared'\n\nimport type { Strategy } from '../strategy/index.js'\nimport type {\n AfterOAuthLoginHookResult,\n CollectionOptions,\n PluginOptions,\n StateObj,\n} from '../types.js'\n\nimport { getProjectToken } from '../../api/figma-api.js'\nimport { JWTValidationError, validateProjectToken } from '../../auth/jwt-validator.js'\nimport { ProjectTokenError } from '../../auth/project-token.js'\nimport { getEnvironment } from '../../constants.js'\nimport { createCookieOptions } from '../utilities/createCookieOptions.js'\nimport { createDebugLogger } from '../utilities/createDebugLogger.js'\nimport { extractOrigin } from '../utilities/extractOrigin.js'\nimport { getAdminPath } from '../utilities/getAdminPath.js'\nimport { getCookieExpiration } from '../utilities/getCookieExpiration.js'\nimport { getSecondsFromTokenExp } from '../utilities/getSecondsFromTokenExp.js'\nimport { getTokenExp } from '../utilities/getTokenExp.js'\n\ninterface Args {\n collection: CollectionConfig\n collectionOptions: CollectionOptions\n endpointSlug: string\n pluginOptions: PluginOptions\n strategy: Strategy\n}\n\nconst isAbsoluteURL = (url: string) => /^[a-z][a-z\\d+.-]*:/.test(url)\n\nexport const getLoginEndpoint = ({\n collection,\n collectionOptions,\n endpointSlug,\n pluginOptions,\n strategy,\n}: Args): Endpoint => ({\n handler: async (req) => {\n const { config } = req.payload\n const adminPath = getAdminPath(config)\n try {\n await strategy.ensureMeta()\n\n const path = req.pathname\n const debugLogger = createDebugLogger(req.payload, pluginOptions.debug)\n\n let jsonBody: Record<string, unknown> = {}\n\n const contentType = req.headers.get('content-type')\n\n // Type narrow PayloadRequst's Partial<Request>\n if (typeof req.json !== 'function' || typeof req.formData !== 'function') {\n debugLogger.info({\n msg: 'Request does not have json or formData methods',\n path,\n })\n\n return Response.redirect(`${pluginOptions.redirectServerURL || config.serverURL}/login`)\n }\n\n if (collectionOptions.authorizationURLParams?.response_mode === 'query') {\n if (Object.keys(req.query).length > 0) {\n jsonBody = req.query\n }\n } else if (contentType === 'application/json') {\n jsonBody = await req.json()\n } else if (contentType === 'application/x-www-form-urlencoded') {\n const formData = await req.formData()\n jsonBody = Object.fromEntries(formData.entries())\n }\n\n const stateRaw = jsonBody.state as string\n const state: StateObj = JSON.parse(Buffer.from(stateRaw, 'base64').toString('utf-8'))\n\n const redirectDestination =\n state.serverURL || pluginOptions.redirectServerURL || config.serverURL\n let failedRedirect = `${redirectDestination}${adminPath}/login`\n let redirectToUse = `${redirectDestination}${adminPath}`\n\n if (state.redirect) {\n redirectToUse = state.redirect\n }\n\n if (state.failedRedirect) {\n failedRedirect = state.failedRedirect\n }\n\n failedRedirect = getSafeRedirect({ allowAbsoluteUrls: true, redirectTo: failedRedirect })\n redirectToUse = getSafeRedirect({ allowAbsoluteUrls: true, redirectTo: redirectToUse })\n\n if (!isAbsoluteURL(failedRedirect)) {\n return Response.json({ error: 'Invalid failed redirect provided' }, { status: 403 })\n }\n if (!isAbsoluteURL(redirectToUse)) {\n return Response.json({ error: 'Invalid redirect provided' }, { status: 403 })\n }\n\n if (Array.isArray(req.payload.config.csrf) && req.payload.config.csrf.length > 0) {\n const failedRedirectOrigin = extractOrigin(failedRedirect)\n const redirectToUseOrigin = extractOrigin(redirectToUse)\n\n if (failedRedirectOrigin && !req.payload.config.csrf.includes(failedRedirectOrigin)) {\n req.payload.logger.error(\n `Failed redirect origin ${failedRedirectOrigin} is not allowed by CSRF configuration.`,\n )\n return Response.json(\n { error: 'Failed redirect origin is not allowed by CSRF configuration.' },\n { status: 403 },\n )\n }\n\n if (redirectToUseOrigin && !req.payload.config.csrf.includes(redirectToUseOrigin)) {\n req.payload.logger.error(\n `Redirect origin ${redirectToUseOrigin} is not allowed by CSRF configuration.`,\n )\n return Response.json(\n { error: 'Redirect origin is not allowed by CSRF configuration.' },\n { status: 403 },\n )\n }\n }\n\n // Verify signature\n if (strategy.name !== req.payload.decrypt(state.sig)) {\n req.payload.logger.error('Signature mismatch. Failing login and redirecting.')\n return Response.redirect(failedRedirect)\n }\n\n if (!strategy.meta?.token_endpoint) {\n debugLogger.error({\n msg: `No metadata was obtained from the identity provider. Failing login and redirecting.`,\n path,\n })\n return Response.redirect(failedRedirect)\n }\n\n debugLogger.info({ body: jsonBody, msg: 'Received login response body', path })\n\n if (!jsonBody?.code) {\n debugLogger.error({\n msg: `No authorization code present in body. Failing login and redirecting.`,\n path,\n })\n return Response.redirect(failedRedirect)\n }\n\n // Exchange `code` from body for refresh token\n const { code } = jsonBody\n\n if (typeof code !== 'string') {\n debugLogger.error({\n msg: `Authorization code present in body is not a string. Failing login and redirecting.`,\n path,\n })\n return Response.redirect(failedRedirect)\n }\n\n const body: Record<string, string> = {\n client_id: strategy.clientID,\n code,\n code_verifier: req.payload.decrypt(state.verifier),\n grant_type: 'authorization_code',\n redirect_uri: `${redirectDestination}${config?.routes?.api || '/api'}/${\n collection.slug\n }/${endpointSlug}/login`,\n }\n\n debugLogger.info({\n msg: 'Exchanging code for access token',\n path,\n requestBody: body,\n })\n\n if (strategy.clientSecret) {\n body.client_secret = strategy.clientSecret\n }\n\n const tokenRes = await fetch(strategy.meta?.token_endpoint, {\n body: new URLSearchParams(body),\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n }).then((r) => r.json())\n\n debugLogger.info({ msg: 'Token Response', path, tokenRes })\n\n const { access_token, error, error_description, expires_in: refreshTokenExpires } = tokenRes\n\n debugLogger.info({ msg: 'tokenResss', tokenRes })\n\n // Swap for project token\n const project_token = await getProjectToken(tokenRes.access_token, 'someproject')\n const refresh_token = access_token\n\n // Store project token as access_token\n\n const token = project_token.token\n const expiresIn = project_token.expiresAt\n\n if (!token) {\n const errMsg = `No ${\n collectionOptions.token || 'access_token'\n } was returned from the identity provider.`\n req.payload.logger.error({ msg: errMsg, path })\n throw new APIError(errMsg)\n }\n\n const cookieOptions = createCookieOptions({ collection, headers: req.headers, pluginOptions })\n\n if (error) {\n req.payload.logger.error('Error swapping access code with access token:')\n req.payload.logger.error({ err: error, error_description })\n return Response.redirect(failedRedirect)\n }\n\n // get the payloadRedirect cookie value\n const cookies = parseCookies(req.headers)\n\n const payloadRedirect =\n 'payloadRedirect' in cookies ? (cookies.payloadRedirect as string) : ''\n\n if (!req.responseHeaders) {\n req.responseHeaders = new Headers()\n }\n\n if (payloadRedirect) {\n if (isAbsoluteURL(payloadRedirect)) {\n redirectToUse = payloadRedirect\n } else {\n redirectToUse += payloadRedirect\n }\n\n req.responseHeaders.append(\n 'Set-Cookie',\n `payloadRedirect=${redirectToUse}; Max-Age=0; Path=/;`,\n )\n }\n\n if (refresh_token && !collectionOptions.usePayloadJWT) {\n debugLogger.info('Setting refresh token cookie')\n const refreshCookie = generateCookie({\n returnCookieAsObject: false,\n ...cookieOptions,\n name: `${strategy.cookieName}-refresh`,\n value: refresh_token,\n // Default to 1 year if no expiration\n expires: getCookieExpiration(cookieOptions?.expires ?? refreshTokenExpires ?? 31_556_952),\n }) as string\n\n req.responseHeaders.append('Set-Cookie', refreshCookie)\n }\n\n const tokenExpires = cookieOptions?.expires\n ? getCookieExpiration(cookieOptions.expires)\n : new Date(expiresIn) // Project token uses epoch time\n const tokenCookie = generateCookie({\n ...cookieOptions,\n name: strategy.cookieName,\n expires: tokenExpires,\n returnCookieAsObject: false,\n value: token,\n }) as string\n\n req.responseHeaders.append('Set-Cookie', tokenCookie)\n\n return Response.redirect(redirectToUse)\n } catch (err: unknown) {\n req.payload.logger.error({ err, msg: 'Error while attempting to login', path: req.pathname })\n\n return Response.json({ error: 'Error while attempting to login' }, { status: 500 })\n }\n },\n method: collectionOptions.authorizationURLParams?.response_mode === 'query' ? 'get' : 'post',\n path: `/${endpointSlug}/login`,\n})\n"],"names":["APIError","generateCookie","parseCookies","getSafeRedirect","getProjectToken","createCookieOptions","createDebugLogger","extractOrigin","getAdminPath","getCookieExpiration","isAbsoluteURL","url","test","getLoginEndpoint","collection","collectionOptions","endpointSlug","pluginOptions","strategy","handler","req","config","payload","adminPath","ensureMeta","path","pathname","debugLogger","debug","jsonBody","contentType","headers","get","json","formData","info","msg","Response","redirect","redirectServerURL","serverURL","authorizationURLParams","response_mode","Object","keys","query","length","fromEntries","entries","stateRaw","state","JSON","parse","Buffer","from","toString","redirectDestination","failedRedirect","redirectToUse","allowAbsoluteUrls","redirectTo","error","status","Array","isArray","csrf","failedRedirectOrigin","redirectToUseOrigin","includes","logger","name","decrypt","sig","meta","token_endpoint","body","code","client_id","clientID","code_verifier","verifier","grant_type","redirect_uri","routes","api","slug","requestBody","clientSecret","client_secret","tokenRes","fetch","URLSearchParams","method","then","r","access_token","error_description","expires_in","refreshTokenExpires","project_token","refresh_token","token","expiresIn","expiresAt","errMsg","cookieOptions","err","cookies","payloadRedirect","responseHeaders","Headers","append","usePayloadJWT","refreshCookie","returnCookieAsObject","cookieName","value","expires","tokenExpires","Date","tokenCookie"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/oauth/endpoints/getLoginEndpoint.ts"],"sourcesContent":["import type { CollectionConfig, Endpoint } from 'payload'\n\nimport jwt from 'jsonwebtoken'\nimport { APIError, generateCookie, parseCookies } from 'payload'\nimport { getSafeRedirect } from 'payload/shared'\n\nimport type { Strategy } from '../strategy/index.js'\nimport type {\n AfterOAuthLoginHookResult,\n CollectionOptions,\n PluginOptions,\n StateObj,\n} from '../types.js'\n\nimport { getProjectToken } from '../../api/figma-api.js'\nimport { JWTValidationError, validateProjectToken } from '../../auth/jwt-validator.js'\nimport { ProjectTokenError } from '../../auth/project-token.js'\nimport { getEnvironment } from '../../constants.js'\nimport { createCookieOptions } from '../utilities/createCookieOptions.js'\nimport { createDebugLogger } from '../utilities/createDebugLogger.js'\nimport { extractOrigin } from '../utilities/extractOrigin.js'\nimport { getAdminPath } from '../utilities/getAdminPath.js'\nimport { getCookieExpiration } from '../utilities/getCookieExpiration.js'\nimport { getSecondsFromTokenExp } from '../utilities/getSecondsFromTokenExp.js'\nimport { getTokenExp } from '../utilities/getTokenExp.js'\n\ninterface Args {\n collection: CollectionConfig\n collectionOptions: CollectionOptions\n endpointSlug: string\n pluginOptions: PluginOptions\n strategy: Strategy\n}\n\nconst isAbsoluteURL = (url: string) => /^[a-z][a-z\\d+.-]*:/.test(url)\n\nexport const getLoginEndpoint = ({\n collection,\n collectionOptions,\n endpointSlug,\n pluginOptions,\n strategy,\n}: Args): Endpoint => ({\n handler: async (req) => {\n const { config } = req.payload\n const adminPath = getAdminPath(config)\n try {\n await strategy.ensureMeta()\n\n const path = req.pathname\n const debugLogger = createDebugLogger(req.payload, pluginOptions.debug)\n\n let jsonBody: Record<string, unknown> = {}\n\n const contentType = req.headers.get('content-type')\n\n // Type narrow PayloadRequst's Partial<Request>\n if (typeof req.json !== 'function' || typeof req.formData !== 'function') {\n debugLogger.info({\n msg: 'Request does not have json or formData methods',\n path,\n })\n\n return Response.redirect(`${pluginOptions.redirectServerURL || config.serverURL}/login`)\n }\n\n if (collectionOptions.authorizationURLParams?.response_mode === 'query') {\n if (Object.keys(req.query).length > 0) {\n jsonBody = req.query\n }\n } else if (contentType === 'application/json') {\n jsonBody = await req.json()\n } else if (contentType === 'application/x-www-form-urlencoded') {\n const formData = await req.formData()\n jsonBody = Object.fromEntries(formData.entries())\n }\n\n const stateRaw = jsonBody.state as string\n const state: StateObj = JSON.parse(Buffer.from(stateRaw, 'base64').toString('utf-8'))\n\n const redirectDestination =\n state.serverURL || pluginOptions.redirectServerURL || config.serverURL\n let failedRedirect = `${redirectDestination}${adminPath}/login`\n let redirectToUse = `${redirectDestination}${adminPath}`\n\n if (state.redirect) {\n redirectToUse = state.redirect\n }\n\n if (state.failedRedirect) {\n failedRedirect = state.failedRedirect\n }\n\n failedRedirect = getSafeRedirect({ allowAbsoluteUrls: true, redirectTo: failedRedirect })\n redirectToUse = getSafeRedirect({ allowAbsoluteUrls: true, redirectTo: redirectToUse })\n\n if (!isAbsoluteURL(failedRedirect)) {\n return Response.json({ error: 'Invalid failed redirect provided' }, { status: 403 })\n }\n if (!isAbsoluteURL(redirectToUse)) {\n return Response.json({ error: 'Invalid redirect provided' }, { status: 403 })\n }\n\n if (Array.isArray(req.payload.config.csrf) && req.payload.config.csrf.length > 0) {\n const failedRedirectOrigin = extractOrigin(failedRedirect)\n const redirectToUseOrigin = extractOrigin(redirectToUse)\n\n if (failedRedirectOrigin && !req.payload.config.csrf.includes(failedRedirectOrigin)) {\n req.payload.logger.error(\n `Failed redirect origin ${failedRedirectOrigin} is not allowed by CSRF configuration.`,\n )\n return Response.json(\n { error: 'Failed redirect origin is not allowed by CSRF configuration.' },\n { status: 403 },\n )\n }\n\n if (redirectToUseOrigin && !req.payload.config.csrf.includes(redirectToUseOrigin)) {\n req.payload.logger.error(\n `Redirect origin ${redirectToUseOrigin} is not allowed by CSRF configuration.`,\n )\n return Response.json(\n { error: 'Redirect origin is not allowed by CSRF configuration.' },\n { status: 403 },\n )\n }\n }\n\n // Verify signature\n if (strategy.name !== req.payload.decrypt(state.sig)) {\n req.payload.logger.error('Signature mismatch. Failing login and redirecting.')\n return Response.redirect(failedRedirect)\n }\n\n if (!strategy.meta?.token_endpoint) {\n debugLogger.error({\n msg: `No metadata was obtained from the identity provider. Failing login and redirecting.`,\n path,\n })\n return Response.redirect(failedRedirect)\n }\n\n debugLogger.info({ body: jsonBody, msg: 'Received login response body', path })\n\n if (!jsonBody?.code) {\n debugLogger.error({\n msg: `No authorization code present in body. Failing login and redirecting.`,\n path,\n })\n return Response.redirect(failedRedirect)\n }\n\n // Exchange `code` from body for refresh token\n const { code } = jsonBody\n\n if (typeof code !== 'string') {\n debugLogger.error({\n msg: `Authorization code present in body is not a string. Failing login and redirecting.`,\n path,\n })\n return Response.redirect(failedRedirect)\n }\n\n const body: Record<string, string> = {\n client_id: strategy.clientID,\n code,\n code_verifier: req.payload.decrypt(state.verifier),\n grant_type: 'authorization_code',\n redirect_uri: `${redirectDestination}${config?.routes?.api || '/api'}/${\n collection.slug\n }/${endpointSlug}/login`,\n }\n\n debugLogger.info({\n msg: 'Exchanging code for access token',\n path,\n requestBody: body,\n })\n\n if (strategy.clientSecret) {\n body.client_secret = strategy.clientSecret\n }\n\n const tokenRes = await fetch(strategy.meta?.token_endpoint, {\n body: new URLSearchParams(body),\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n }).then((r) => r.json())\n\n debugLogger.info({ msg: 'Token Response', path, tokenRes })\n\n const { access_token, error, error_description, expires_in: refreshTokenExpires } = tokenRes\n\n debugLogger.info({ msg: 'tokenResss', tokenRes })\n\n // Swap for project token\n const project_token = await getProjectToken(\n tokenRes.access_token,\n config.custom.figma.tenantId,\n )\n const refresh_token = access_token\n\n // Store project token as access_token\n\n const token = project_token.token\n const expiresIn = project_token.expiresAt\n\n if (!token) {\n const errMsg = `No ${\n collectionOptions.token || 'access_token'\n } was returned from the identity provider.`\n req.payload.logger.error({ msg: errMsg, path })\n throw new APIError(errMsg)\n }\n\n const cookieOptions = createCookieOptions({ collection, headers: req.headers, pluginOptions })\n\n if (error) {\n req.payload.logger.error('Error swapping access code with access token:')\n req.payload.logger.error({ err: error, error_description })\n return Response.redirect(failedRedirect)\n }\n\n // get the payloadRedirect cookie value\n const cookies = parseCookies(req.headers)\n\n const payloadRedirect =\n 'payloadRedirect' in cookies ? (cookies.payloadRedirect as string) : ''\n\n if (!req.responseHeaders) {\n req.responseHeaders = new Headers()\n }\n\n if (payloadRedirect) {\n if (isAbsoluteURL(payloadRedirect)) {\n redirectToUse = payloadRedirect\n } else {\n redirectToUse += payloadRedirect\n }\n\n req.responseHeaders.append(\n 'Set-Cookie',\n `payloadRedirect=${redirectToUse}; Max-Age=0; Path=/;`,\n )\n }\n\n if (refresh_token && !collectionOptions.usePayloadJWT) {\n debugLogger.info('Setting refresh token cookie')\n const refreshCookie = generateCookie({\n returnCookieAsObject: false,\n ...cookieOptions,\n name: `${strategy.cookieName}-refresh`,\n value: refresh_token,\n // Default to 1 year if no expiration\n expires: getCookieExpiration(cookieOptions?.expires ?? refreshTokenExpires ?? 31_556_952),\n }) as string\n\n req.responseHeaders.append('Set-Cookie', refreshCookie)\n }\n\n const tokenExpires = cookieOptions?.expires\n ? getCookieExpiration(cookieOptions.expires)\n : new Date(expiresIn) // Project token uses epoch time\n const tokenCookie = generateCookie({\n ...cookieOptions,\n name: strategy.cookieName,\n expires: tokenExpires,\n returnCookieAsObject: false,\n value: token,\n }) as string\n\n req.responseHeaders.append('Set-Cookie', tokenCookie)\n\n return Response.redirect(redirectToUse)\n } catch (err: unknown) {\n req.payload.logger.error({ err, msg: 'Error while attempting to login', path: req.pathname })\n\n return Response.json({ error: 'Error while attempting to login' }, { status: 500 })\n }\n },\n method: collectionOptions.authorizationURLParams?.response_mode === 'query' ? 'get' : 'post',\n path: `/${endpointSlug}/login`,\n})\n"],"names":["APIError","generateCookie","parseCookies","getSafeRedirect","getProjectToken","createCookieOptions","createDebugLogger","extractOrigin","getAdminPath","getCookieExpiration","isAbsoluteURL","url","test","getLoginEndpoint","collection","collectionOptions","endpointSlug","pluginOptions","strategy","handler","req","config","payload","adminPath","ensureMeta","path","pathname","debugLogger","debug","jsonBody","contentType","headers","get","json","formData","info","msg","Response","redirect","redirectServerURL","serverURL","authorizationURLParams","response_mode","Object","keys","query","length","fromEntries","entries","stateRaw","state","JSON","parse","Buffer","from","toString","redirectDestination","failedRedirect","redirectToUse","allowAbsoluteUrls","redirectTo","error","status","Array","isArray","csrf","failedRedirectOrigin","redirectToUseOrigin","includes","logger","name","decrypt","sig","meta","token_endpoint","body","code","client_id","clientID","code_verifier","verifier","grant_type","redirect_uri","routes","api","slug","requestBody","clientSecret","client_secret","tokenRes","fetch","URLSearchParams","method","then","r","access_token","error_description","expires_in","refreshTokenExpires","project_token","custom","figma","tenantId","refresh_token","token","expiresIn","expiresAt","errMsg","cookieOptions","err","cookies","payloadRedirect","responseHeaders","Headers","append","usePayloadJWT","refreshCookie","returnCookieAsObject","cookieName","value","expires","tokenExpires","Date","tokenCookie"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refreshTokens.d.ts","sourceRoot":"","sources":["../../../src/oauth/utilities/refreshTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AASpD,UAAU,IAAI;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,KAAK,MAAM,GACP;IACE,iBAAiB,EAAE,GAAG,CAAC,UAAU,CAAA;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd,GACD,KAAK,CAAA;AAET,eAAO,MAAM,aAAa,wCAA+C,IAAI,KAAG,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"refreshTokens.d.ts","sourceRoot":"","sources":["../../../src/oauth/utilities/refreshTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AASpD,UAAU,IAAI;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,KAAK,MAAM,GACP;IACE,iBAAiB,EAAE,GAAG,CAAC,UAAU,CAAA;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd,GACD,KAAK,CAAA;AAET,eAAO,MAAM,aAAa,wCAA+C,IAAI,KAAG,OAAO,CAAC,MAAM,CAsE7F,CAAA"}
|
|
@@ -16,7 +16,7 @@ export const refreshTokens = async ({ payload, refreshToken, strategy })=>{
|
|
|
16
16
|
// so we will refresh both tokens
|
|
17
17
|
try {
|
|
18
18
|
// Get another project token
|
|
19
|
-
const { expiresAt, token } = await getProjectToken(refreshToken,
|
|
19
|
+
const { expiresAt, token } = await getProjectToken(refreshToken, payload.config.custom.figma.tenantId);
|
|
20
20
|
debugLogger.info({
|
|
21
21
|
expiresAt,
|
|
22
22
|
msg: 'Received new tokens from Figma API',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/oauth/utilities/refreshTokens.ts"],"sourcesContent":["import type jwt from 'jsonwebtoken'\nimport type { Payload } from 'payload'\n\nimport { generateCookie } from 'payload'\n\nimport type { Strategy } from '../strategy/index.js'\n\nimport { getProjectToken } from '../../api/figma-api.js'\nimport { validateProjectToken } from '../../auth/jwt-validator.js'\nimport { getEnvironment } from '../../constants.js'\nimport { createCookieOptions } from './createCookieOptions.js'\nimport { createDebugLogger } from './createDebugLogger.js'\nimport { getCookieExpiration } from './getCookieExpiration.js'\n\ninterface Args {\n payload: Payload\n refreshToken: string\n strategy: Strategy\n}\n\ntype Result =\n | {\n decodedOauthToken: jwt.JwtPayload\n headers: Headers\n token: string\n }\n | false\n\nexport const refreshTokens = async ({ payload, refreshToken, strategy }: Args): Promise<Result> => {\n const debugLogger = createDebugLogger(payload, strategy.debug)\n\n debugLogger.info({\n msg: 'Refreshing tokens',\n })\n\n const headers = new Headers()\n\n // At this point, access token is expired\n // but refresh token is still valid\n // so we will refresh both tokens\n\n try {\n // Get another project token\n const { expiresAt, token } = await getProjectToken(refreshToken
|
|
1
|
+
{"version":3,"sources":["../../../src/oauth/utilities/refreshTokens.ts"],"sourcesContent":["import type jwt from 'jsonwebtoken'\nimport type { Payload } from 'payload'\n\nimport { generateCookie } from 'payload'\n\nimport type { Strategy } from '../strategy/index.js'\n\nimport { getProjectToken } from '../../api/figma-api.js'\nimport { validateProjectToken } from '../../auth/jwt-validator.js'\nimport { getEnvironment } from '../../constants.js'\nimport { createCookieOptions } from './createCookieOptions.js'\nimport { createDebugLogger } from './createDebugLogger.js'\nimport { getCookieExpiration } from './getCookieExpiration.js'\n\ninterface Args {\n payload: Payload\n refreshToken: string\n strategy: Strategy\n}\n\ntype Result =\n | {\n decodedOauthToken: jwt.JwtPayload\n headers: Headers\n token: string\n }\n | false\n\nexport const refreshTokens = async ({ payload, refreshToken, strategy }: Args): Promise<Result> => {\n const debugLogger = createDebugLogger(payload, strategy.debug)\n\n debugLogger.info({\n msg: 'Refreshing tokens',\n })\n\n const headers = new Headers()\n\n // At this point, access token is expired\n // but refresh token is still valid\n // so we will refresh both tokens\n\n try {\n // Get another project token\n const { expiresAt, token } = await getProjectToken(\n refreshToken,\n payload.config.custom.figma.tenantId,\n )\n\n debugLogger.info({\n expiresAt,\n msg: 'Received new tokens from Figma API',\n token,\n })\n\n // On error, no user\n if (!token) {\n debugLogger.error({\n msg: 'Error refreshing tokens',\n })\n return false\n }\n\n if (token) {\n debugLogger.info({\n msg: 'Successfully refreshed project token',\n token,\n })\n\n const expires_in = new Date(expiresAt)\n\n const cookieOptions = createCookieOptions({\n collection: strategy.collection,\n headers,\n pluginOptions: strategy.pluginOptions,\n })\n\n const tokenCookie = generateCookie({\n ...cookieOptions,\n name: strategy.cookieName,\n expires: getCookieExpiration(expires_in),\n returnCookieAsObject: false,\n value: token,\n }) as string\n\n headers.append('Set-Cookie', tokenCookie)\n\n const decodedOauthToken = await validateProjectToken(token, getEnvironment())\n\n return { decodedOauthToken, headers, token }\n }\n } catch (error) {\n debugLogger.error({\n err: error,\n msg: 'Error refreshing tokens',\n })\n }\n\n return false\n}\n"],"names":["generateCookie","getProjectToken","validateProjectToken","getEnvironment","createCookieOptions","createDebugLogger","getCookieExpiration","refreshTokens","payload","refreshToken","strategy","debugLogger","debug","info","msg","headers","Headers","expiresAt","token","config","custom","figma","tenantId","error","expires_in","Date","cookieOptions","collection","pluginOptions","tokenCookie","name","cookieName","expires","returnCookieAsObject","value","append","decodedOauthToken","err"],"mappings":"AAGA,SAASA,cAAc,QAAQ,UAAS;AAIxC,SAASC,eAAe,QAAQ,yBAAwB;AACxD,SAASC,oBAAoB,QAAQ,8BAA6B;AAClE,SAASC,cAAc,QAAQ,qBAAoB;AACnD,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,mBAAmB,QAAQ,2BAA0B;AAgB9D,OAAO,MAAMC,gBAAgB,OAAO,EAAEC,OAAO,EAAEC,YAAY,EAAEC,QAAQ,EAAQ;IAC3E,MAAMC,cAAcN,kBAAkBG,SAASE,SAASE,KAAK;IAE7DD,YAAYE,IAAI,CAAC;QACfC,KAAK;IACP;IAEA,MAAMC,UAAU,IAAIC;IAEpB,yCAAyC;IACzC,mCAAmC;IACnC,iCAAiC;IAEjC,IAAI;QACF,4BAA4B;QAC5B,MAAM,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAG,MAAMjB,gBACjCQ,cACAD,QAAQW,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,QAAQ;QAGtCX,YAAYE,IAAI,CAAC;YACfI;YACAH,KAAK;YACLI;QACF;QAEA,oBAAoB;QACpB,IAAI,CAACA,OAAO;YACVP,YAAYY,KAAK,CAAC;gBAChBT,KAAK;YACP;YACA,OAAO;QACT;QAEA,IAAII,OAAO;YACTP,YAAYE,IAAI,CAAC;gBACfC,KAAK;gBACLI;YACF;YAEA,MAAMM,aAAa,IAAIC,KAAKR;YAE5B,MAAMS,gBAAgBtB,oBAAoB;gBACxCuB,YAAYjB,SAASiB,UAAU;gBAC/BZ;gBACAa,eAAelB,SAASkB,aAAa;YACvC;YAEA,MAAMC,cAAc7B,eAAe;gBACjC,GAAG0B,aAAa;gBAChBI,MAAMpB,SAASqB,UAAU;gBACzBC,SAAS1B,oBAAoBkB;gBAC7BS,sBAAsB;gBACtBC,OAAOhB;YACT;YAEAH,QAAQoB,MAAM,CAAC,cAAcN;YAE7B,MAAMO,oBAAoB,MAAMlC,qBAAqBgB,OAAOf;YAE5D,OAAO;gBAAEiC;gBAAmBrB;gBAASG;YAAM;QAC7C;IACF,EAAE,OAAOK,OAAO;QACdZ,YAAYY,KAAK,CAAC;YAChBc,KAAKd;YACLT,KAAK;QACP;IACF;IAEA,OAAO;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/plugin/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/plugin/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAWtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;CAC1B,GAAG;IACF,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAC3B,CAAA;CACF,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AAE7B;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CA2D/E"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { lexicalEditor } from '@payloadcms/richtext-lexical';
|
|
2
2
|
import { buildConfig as payloadBuildConfig } from 'payload';
|
|
3
|
+
import { getValidProjectToken } from '../auth/project-token.js';
|
|
4
|
+
import { TokenStore } from '../auth/token-store.js';
|
|
5
|
+
import { contentAPIAdapter } from '../db-adapter.js';
|
|
6
|
+
import { health } from '../endpoints/health.js';
|
|
3
7
|
import { oAuth2Plugin } from '../oauth/index.js';
|
|
4
|
-
import { figmaContentSystem } from './adapter.js';
|
|
5
8
|
/**
|
|
6
9
|
* Figma platform wrapper for Payload's buildConfig.
|
|
7
10
|
* Automatically injects:
|
|
@@ -12,11 +15,31 @@ import { figmaContentSystem } from './adapter.js';
|
|
|
12
15
|
* @param config - Payload configuration (db and secret omitted, editor optional)
|
|
13
16
|
* @returns Promise<SanitizedConfig> - Built Payload configuration
|
|
14
17
|
*/ export async function buildConfig(config) {
|
|
18
|
+
let projectToken = '';
|
|
19
|
+
if (!process.env.FIGMA_CONTENT_API_ACCESS_KEY) {
|
|
20
|
+
const retrievedToken = await getValidProjectToken(new TokenStore(), config.figma.tenantId);
|
|
21
|
+
if (retrievedToken) {
|
|
22
|
+
projectToken = retrievedToken;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
15
25
|
// Build complete config with Figma platform defaults
|
|
16
26
|
const configWithFigmaDefaults = {
|
|
17
27
|
...config,
|
|
18
|
-
|
|
28
|
+
custom: {
|
|
29
|
+
figma: config.figma || {}
|
|
30
|
+
},
|
|
31
|
+
// TODO: - cms-tenants-001-staging needs to be dynamic in the future
|
|
32
|
+
db: config.figma.useContentSystem !== false ? contentAPIAdapter({
|
|
33
|
+
contentApiKey: process.env.FIGMA_CONTENT_API_ACCESS_KEY,
|
|
34
|
+
contentApiUrl: process.env.FIGMA_CONTENT_API_URL || `https://${config.figma.region}.cms-tenants-001-staging.figmacontentstaging.com`,
|
|
35
|
+
contentSystemId: config.figma.tenantId,
|
|
36
|
+
projectToken
|
|
37
|
+
}) : config.db,
|
|
19
38
|
editor: config.editor ?? lexicalEditor(),
|
|
39
|
+
endpoints: [
|
|
40
|
+
...config.endpoints ?? [],
|
|
41
|
+
health
|
|
42
|
+
],
|
|
20
43
|
secret: 'MY_SECRET',
|
|
21
44
|
// Add oauth to plugins if not already present
|
|
22
45
|
plugins: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/build-config.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from 'payload'\n\nimport { lexicalEditor } from '@payloadcms/richtext-lexical'\nimport { buildConfig as payloadBuildConfig } from 'payload'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/plugin/build-config.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from 'payload'\n\nimport { lexicalEditor } from '@payloadcms/richtext-lexical'\nimport { buildConfig as payloadBuildConfig } from 'payload'\n\nimport { getValidProjectToken } from '../auth/project-token.js'\nimport { TokenStore } from '../auth/token-store.js'\nimport { contentAPIAdapter } from '../db-adapter.js'\nimport { health } from '../endpoints/health.js'\nimport { oAuth2Plugin } from '../oauth/index.js'\n\n/**\n * Configuration type for Payload projects on the Figma platform.\n *\n * Differences from standard Payload Config:\n * - `db`: Omitted (auto-injected by Figma platform)\n * - `secret`: Omitted (auto-injected by Figma platform)\n * - `editor`: Optional (defaults to lexicalEditor() if not provided)\n *\n * @example\n * // Minimal config\n * const config: FigmaConfig = {\n * collections: [...]\n * }\n *\n * @example\n * // With custom editor\n * const config: FigmaConfig = {\n * collections: [...],\n * editor: lexicalEditor({ features: [...] })\n * }\n */\nexport type FigmaConfig = {\n editor?: Config['editor']\n} & {\n figma: {\n region: string\n tenantId: string\n useContentSystem?: boolean\n }\n} & Omit<Config, 'db' | 'editor' | 'secret'> &\n Partial<Pick<Config, 'db'>>\n\n/**\n * Figma platform wrapper for Payload's buildConfig.\n * Automatically injects:\n * - Figma database adapter\n * - Secret (platform-provided)\n * - Default lexicalEditor (if no custom editor specified)\n *\n * @param config - Payload configuration (db and secret omitted, editor optional)\n * @returns Promise<SanitizedConfig> - Built Payload configuration\n */\nexport async function buildConfig(config: FigmaConfig): Promise<SanitizedConfig> {\n let projectToken = ''\n\n if (!process.env.FIGMA_CONTENT_API_ACCESS_KEY) {\n const retrievedToken = await getValidProjectToken(new TokenStore(), config.figma.tenantId)\n if (retrievedToken) {\n projectToken = retrievedToken\n }\n }\n\n // Build complete config with Figma platform defaults\n const configWithFigmaDefaults: Config = {\n ...config,\n custom: {\n figma: config.figma || {},\n },\n // TODO: - cms-tenants-001-staging needs to be dynamic in the future\n db:\n config.figma.useContentSystem !== false\n ? contentAPIAdapter({\n contentApiKey: process.env.FIGMA_CONTENT_API_ACCESS_KEY!,\n contentApiUrl:\n process.env.FIGMA_CONTENT_API_URL ||\n `https://${config.figma.region}.cms-tenants-001-staging.figmacontentstaging.com`,\n contentSystemId: config.figma.tenantId,\n projectToken,\n })\n : config.db!,\n editor: config.editor ?? lexicalEditor(),\n endpoints: [...(config.endpoints ?? []), health],\n secret: 'MY_SECRET',\n // Add oauth to plugins if not already present\n plugins: [\n ...(config.plugins ?? []),\n oAuth2Plugin({\n collections: [\n {\n slug: 'users',\n // Use adapter because Figma app doesn't support OIDC scopes\n authorizationURLParams: {\n response_mode: 'query',\n response_type: 'code',\n },\n clientID: process.env.FIGMA_OAUTH_CLIENT_ID!,\n clientSecret: process.env.FIGMA_OAUTH_CLIENT_SECRET,\n identityMetadata: 'https://staging.figma.com/.well-known/openid-configuration',\n scope: ['current_user:read'],\n token: 'id_token', // Adapter creates JWT id_token from Figma user info\n usernameField: 'email',\n },\n ],\n debug: !!process.env.DEBUG,\n disabled: false,\n }),\n ],\n }\n\n // Delegate to Payload's buildConfig\n return await payloadBuildConfig(configWithFigmaDefaults)\n}\n"],"names":["lexicalEditor","buildConfig","payloadBuildConfig","getValidProjectToken","TokenStore","contentAPIAdapter","health","oAuth2Plugin","config","projectToken","process","env","FIGMA_CONTENT_API_ACCESS_KEY","retrievedToken","figma","tenantId","configWithFigmaDefaults","custom","db","useContentSystem","contentApiKey","contentApiUrl","FIGMA_CONTENT_API_URL","region","contentSystemId","editor","endpoints","secret","plugins","collections","slug","authorizationURLParams","response_mode","response_type","clientID","FIGMA_OAUTH_CLIENT_ID","clientSecret","FIGMA_OAUTH_CLIENT_SECRET","identityMetadata","scope","token","usernameField","debug","DEBUG","disabled"],"mappings":"AAEA,SAASA,aAAa,QAAQ,+BAA8B;AAC5D,SAASC,eAAeC,kBAAkB,QAAQ,UAAS;AAE3D,SAASC,oBAAoB,QAAQ,2BAA0B;AAC/D,SAASC,UAAU,QAAQ,yBAAwB;AACnD,SAASC,iBAAiB,QAAQ,mBAAkB;AACpD,SAASC,MAAM,QAAQ,yBAAwB;AAC/C,SAASC,YAAY,QAAQ,oBAAmB;AAkChD;;;;;;;;;CASC,GACD,OAAO,eAAeN,YAAYO,MAAmB;IACnD,IAAIC,eAAe;IAEnB,IAAI,CAACC,QAAQC,GAAG,CAACC,4BAA4B,EAAE;QAC7C,MAAMC,iBAAiB,MAAMV,qBAAqB,IAAIC,cAAcI,OAAOM,KAAK,CAACC,QAAQ;QACzF,IAAIF,gBAAgB;YAClBJ,eAAeI;QACjB;IACF;IAEA,qDAAqD;IACrD,MAAMG,0BAAkC;QACtC,GAAGR,MAAM;QACTS,QAAQ;YACNH,OAAON,OAAOM,KAAK,IAAI,CAAC;QAC1B;QACA,oEAAoE;QACpEI,IACEV,OAAOM,KAAK,CAACK,gBAAgB,KAAK,QAC9Bd,kBAAkB;YAChBe,eAAeV,QAAQC,GAAG,CAACC,4BAA4B;YACvDS,eACEX,QAAQC,GAAG,CAACW,qBAAqB,IACjC,CAAC,QAAQ,EAAEd,OAAOM,KAAK,CAACS,MAAM,CAAC,gDAAgD,CAAC;YAClFC,iBAAiBhB,OAAOM,KAAK,CAACC,QAAQ;YACtCN;QACF,KACAD,OAAOU,EAAE;QACfO,QAAQjB,OAAOiB,MAAM,IAAIzB;QACzB0B,WAAW;eAAKlB,OAAOkB,SAAS,IAAI,EAAE;YAAGpB;SAAO;QAChDqB,QAAQ;QACR,8CAA8C;QAC9CC,SAAS;eACHpB,OAAOoB,OAAO,IAAI,EAAE;YACxBrB,aAAa;gBACXsB,aAAa;oBACX;wBACEC,MAAM;wBACN,4DAA4D;wBAC5DC,wBAAwB;4BACtBC,eAAe;4BACfC,eAAe;wBACjB;wBACAC,UAAUxB,QAAQC,GAAG,CAACwB,qBAAqB;wBAC3CC,cAAc1B,QAAQC,GAAG,CAAC0B,yBAAyB;wBACnDC,kBAAkB;wBAClBC,OAAO;4BAAC;yBAAoB;wBAC5BC,OAAO;wBACPC,eAAe;oBACjB;iBACD;gBACDC,OAAO,CAAC,CAAChC,QAAQC,GAAG,CAACgC,KAAK;gBAC1BC,UAAU;YACZ;SACD;IACH;IAEA,oCAAoC;IACpC,OAAO,MAAM1C,mBAAmBc;AAClC"}
|
|
@@ -29,8 +29,8 @@ export type ASTModificationResult = {
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function applyModifications(sourceFile: SourceFile, detection: DetectionResult): ASTModificationResult;
|
|
31
31
|
export type FigmaPropertyConfig = {
|
|
32
|
+
contentSystemId: string;
|
|
32
33
|
region: string;
|
|
33
|
-
tenantId: string;
|
|
34
34
|
useContentSystem: boolean;
|
|
35
35
|
};
|
|
36
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-config-ast.d.ts","sourceRoot":"","sources":["../../src/utils/payload-config-ast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAM1C,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,cAAc,CAAC,EAAE;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,SAAS,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,sBAAsB,EAAE,OAAO,CAAA;IAC/B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,UAAU,GAAG,eAAe,CAiJ7E;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AA0CD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,eAAe,GACzB,qBAAqB,CAyJvB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,
|
|
1
|
+
{"version":3,"file":"payload-config-ast.d.ts","sourceRoot":"","sources":["../../src/utils/payload-config-ast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAM1C,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,cAAc,CAAC,EAAE;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,SAAS,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,sBAAsB,EAAE,OAAO,CAAA;IAC/B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,UAAU,GAAG,eAAe,CAiJ7E;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AA0CD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,eAAe,GACzB,qBAAqB,CAyJvB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,mBAAmB,GAC1B,qBAAqB,CA+CvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,mBAAmB,GAAG,IAAI,CAoElF"}
|
|
@@ -340,11 +340,11 @@ import * as log from './log.js';
|
|
|
340
340
|
name: 'figma',
|
|
341
341
|
initializer: `{
|
|
342
342
|
region: '${config.region}',
|
|
343
|
-
|
|
343
|
+
contentSystemId: '${config.contentSystemId}',
|
|
344
344
|
useContentSystem: ${config.useContentSystem},
|
|
345
345
|
}`
|
|
346
346
|
});
|
|
347
|
-
changes.push(`Added figma property (region: ${config.region}, tenantId: ${config.
|
|
347
|
+
changes.push(`Added figma property (region: ${config.region}, tenantId: ${config.contentSystemId}, useContentSystem: ${config.useContentSystem})`);
|
|
348
348
|
modified = true;
|
|
349
349
|
return {
|
|
350
350
|
changes,
|
|
@@ -386,24 +386,24 @@ import * as log from './log.js';
|
|
|
386
386
|
}
|
|
387
387
|
// Extract values
|
|
388
388
|
const regionProp = initializer.getProperty('region');
|
|
389
|
-
const
|
|
389
|
+
const contentSystemIdProp = initializer.getProperty('contentSystemId');
|
|
390
390
|
const useContentSystemProp = initializer.getProperty('useContentSystem');
|
|
391
|
-
if (!regionProp || !
|
|
391
|
+
if (!regionProp || !contentSystemIdProp) {
|
|
392
392
|
log.debug('Missing required figma properties (region or tenantId)');
|
|
393
393
|
return null;
|
|
394
394
|
}
|
|
395
395
|
// Extract string values (remove quotes)
|
|
396
396
|
const region = Node.isPropertyAssignment(regionProp) ? regionProp.getInitializer()?.getText().replace(/['"]/g, '') : undefined;
|
|
397
|
-
const
|
|
397
|
+
const contentSystemId = Node.isPropertyAssignment(contentSystemIdProp) ? contentSystemIdProp.getInitializer()?.getText().replace(/['"]/g, '') : undefined;
|
|
398
398
|
const useContentSystem = Node.isPropertyAssignment(useContentSystemProp) ? useContentSystemProp.getInitializer()?.getText() === 'true' : true // Default to true if not specified
|
|
399
399
|
;
|
|
400
|
-
if (!region || !
|
|
400
|
+
if (!region || !contentSystemId) {
|
|
401
401
|
log.debug('Could not extract region or tenantId values');
|
|
402
402
|
return null;
|
|
403
403
|
}
|
|
404
404
|
return {
|
|
405
|
+
contentSystemId,
|
|
405
406
|
region,
|
|
406
|
-
tenantId,
|
|
407
407
|
useContentSystem
|
|
408
408
|
};
|
|
409
409
|
}
|