@payloadcms/figma 0.0.1-alpha.2 → 0.0.1-alpha.21
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 +1 -1
- package/dist/api/control-plane.d.ts.map +1 -1
- package/dist/api/control-plane.js +9 -5
- package/dist/api/control-plane.js.map +1 -1
- package/dist/api/figma-api.d.ts.map +1 -1
- package/dist/api/figma-api.js +33 -10
- package/dist/api/figma-api.js.map +1 -1
- package/dist/auth/crypto-utils.d.ts.map +1 -1
- package/dist/auth/crypto-utils.js +5 -5
- package/dist/auth/crypto-utils.js.map +1 -1
- package/dist/auth/oauth-flow.js +3 -3
- package/dist/auth/oauth-flow.js.map +1 -1
- package/dist/auth/project-token.d.ts.map +1 -1
- package/dist/auth/project-token.js +9 -4
- package/dist/auth/project-token.js.map +1 -1
- package/dist/auth/token-store.d.ts +10 -0
- package/dist/auth/token-store.d.ts.map +1 -1
- package/dist/auth/token-store.js +20 -0
- package/dist/auth/token-store.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 +16 -34
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.d.ts +1 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +35 -86
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list-tokens.js +2 -2
- package/dist/commands/list-tokens.js.map +1 -1
- package/dist/commands/login.d.ts +8 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +12 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +2 -2
- package/dist/commands/logout.js.map +1 -1
- package/dist/config/oauth.d.ts.map +1 -1
- package/dist/config/oauth.js +3 -3
- package/dist/config/oauth.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 +760 -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/exports/client.d.ts +3 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +4 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/oauth/components/LoginButton/index.d.ts.map +1 -1
- package/dist/oauth/components/LoginButton/index.js +50 -6
- package/dist/oauth/components/LoginButton/index.js.map +1 -1
- package/dist/oauth/components/LoginButton/index.scss +50 -3
- package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -1
- package/dist/oauth/components/LogoutButton/index.js +0 -1
- package/dist/oauth/components/LogoutButton/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/index.d.ts.map +1 -1
- package/dist/oauth/index.js +30 -6
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/strategy/index.d.ts.map +1 -1
- package/dist/oauth/strategy/index.js.map +1 -1
- package/dist/oauth/types.d.ts +1 -1
- package/dist/oauth/types.d.ts.map +1 -1
- package/dist/oauth/types.js.map +1 -1
- package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -1
- package/dist/oauth/utilities/createCookieOptions.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 +20 -6
- package/dist/plugin/build-config.d.ts.map +1 -1
- package/dist/plugin/build-config.js +33 -14
- package/dist/plugin/build-config.js.map +1 -1
- package/dist/utils/env-management.d.ts +4 -11
- package/dist/utils/env-management.d.ts.map +1 -1
- package/dist/utils/env-management.js +46 -79
- package/dist/utils/env-management.js.map +1 -1
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +5 -7
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/payload-config-ast.d.ts +2 -3
- package/dist/utils/payload-config-ast.d.ts.map +1 -1
- package/dist/utils/payload-config-ast.js +34 -18
- package/dist/utils/payload-config-ast.js.map +1 -1
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +1 -3
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/s3-upload.d.ts +0 -1
- package/dist/utils/s3-upload.d.ts.map +1 -1
- package/dist/utils/s3-upload.js +10 -3
- package/dist/utils/s3-upload.js.map +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db-adapter.ts"],"sourcesContent":["/* eslint-disable */\nimport 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 'Content-Type': 'application/json',\n ...(this.contentApiKey\n ? {\n 'X-Api-Key': this.contentApiKey,\n }\n : {\n Authorization: `Bearer ${this.projectToken}`,\n }),\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","contentApiKey","Authorization","projectToken","method","json","beginTransaction","options","commitTransaction","contentAPIAdapter","opts","name","defaultIDType","packageName","rollbackTransaction"],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { DefaultLoginButton } from '../oauth/components/LoginButton/index.js'\nexport { LogoutButton } from '../oauth/components/LogoutButton/index.js'\n"],"names":["DefaultLoginButton","LogoutButton"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,2CAA0C;AAC7E,SAASC,YAAY,QAAQ,4CAA2C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/oauth/components/LoginButton/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/oauth/components/LoginButton/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,cAAc,CAAA;AAgDrB,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAqDhE,CAAA"}
|
|
@@ -1,10 +1,49 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useConfig } from '@payloadcms/ui';
|
|
4
4
|
import { useSearchParams } from 'next/navigation.js';
|
|
5
5
|
import React, { useEffect, useState } from 'react';
|
|
6
6
|
import './index.scss';
|
|
7
7
|
const baseClass = 'oauth-login';
|
|
8
|
+
// Figma logo SVG colored version
|
|
9
|
+
// const FigmaIcon: React.FC = () => (
|
|
10
|
+
// <svg fill="none" height="27" viewBox="0 0 400 600" width="18">
|
|
11
|
+
// <path
|
|
12
|
+
// d="M0 500C0 444.772 44.772 400 100 400H200V500C200 555.228 155.228 600 100 600C44.772 600 0 555.228 0 500Z"
|
|
13
|
+
// fill="#24CB71"
|
|
14
|
+
// />
|
|
15
|
+
// <path
|
|
16
|
+
// d="M200 0V200H300C355.228 200 400 155.228 400 100C400 44.772 355.228 0 300 0H200Z"
|
|
17
|
+
// fill="#FF7237"
|
|
18
|
+
// />
|
|
19
|
+
// <path
|
|
20
|
+
// d="M299.167 400C354.395 400 399.167 355.228 399.167 300C399.167 244.772 354.395 200 299.167 200C243.939 200 199.167 244.772 199.167 300C199.167 355.228 243.939 400 299.167 400Z"
|
|
21
|
+
// fill="#00B6FF"
|
|
22
|
+
// />
|
|
23
|
+
// <path
|
|
24
|
+
// d="M0 100C0 155.228 44.772 200 100 200H200V0H100C44.772 0 0 44.772 0 100Z"
|
|
25
|
+
// fill="#FF3737"
|
|
26
|
+
// />
|
|
27
|
+
// <path
|
|
28
|
+
// d="M0 300C0 355.228 44.772 400 100 400H200V200H100C44.772 200 0 244.772 0 300Z"
|
|
29
|
+
// fill="#874FFF"
|
|
30
|
+
// />
|
|
31
|
+
// </svg>
|
|
32
|
+
// )
|
|
33
|
+
// Figma logo SVG monochrome version
|
|
34
|
+
const FigmaIcon = ()=>/*#__PURE__*/ _jsx("svg", {
|
|
35
|
+
fill: "none",
|
|
36
|
+
height: "20px",
|
|
37
|
+
viewBox: "0 0 15 15",
|
|
38
|
+
width: "20px",
|
|
39
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
40
|
+
children: /*#__PURE__*/ _jsx("path", {
|
|
41
|
+
clipRule: "evenodd",
|
|
42
|
+
d: "M7.00005 2.04999H5.52505C4.71043 2.04999 4.05005 2.71037 4.05005 3.52499C4.05005 4.33961 4.71043 4.99999 5.52505 4.99999H7.00005V2.04999ZM7.00005 1.04999H8.00005H9.47505C10.842 1.04999 11.95 2.15808 11.95 3.52499C11.95 4.33163 11.5642 5.04815 10.9669 5.49999C11.5642 5.95184 11.95 6.66836 11.95 7.475C11.95 8.8419 10.842 9.95 9.47505 9.95C8.92236 9.95 8.41198 9.76884 8.00005 9.46266V9.95L8.00005 11.425C8.00005 12.7919 6.89195 13.9 5.52505 13.9C4.15814 13.9 3.05005 12.7919 3.05005 11.425C3.05005 10.6183 3.43593 9.90184 4.03317 9.44999C3.43593 8.99814 3.05005 8.28163 3.05005 7.475C3.05005 6.66836 3.43594 5.95184 4.03319 5.5C3.43594 5.04815 3.05005 4.33163 3.05005 3.52499C3.05005 2.15808 4.15814 1.04999 5.52505 1.04999H7.00005ZM8.00005 2.04999V4.99999H9.47505C10.2897 4.99999 10.95 4.33961 10.95 3.52499C10.95 2.71037 10.2897 2.04999 9.47505 2.04999H8.00005ZM5.52505 8.94998H7.00005L7.00005 7.4788L7.00005 7.475L7.00005 7.4712V6H5.52505C4.71043 6 4.05005 6.66038 4.05005 7.475C4.05005 8.28767 4.70727 8.94684 5.5192 8.94999L5.52505 8.94998ZM4.05005 11.425C4.05005 10.6123 4.70727 9.95315 5.5192 9.94999L5.52505 9.95H7.00005L7.00005 11.425C7.00005 12.2396 6.33967 12.9 5.52505 12.9C4.71043 12.9 4.05005 12.2396 4.05005 11.425ZM8.00005 7.47206C8.00164 6.65879 8.66141 6 9.47505 6C10.2897 6 10.95 6.66038 10.95 7.475C10.95 8.28962 10.2897 8.95 9.47505 8.95C8.66141 8.95 8.00164 8.29121 8.00005 7.47794V7.47206Z",
|
|
43
|
+
fill: "#FFFFFF",
|
|
44
|
+
fillRule: "evenodd"
|
|
45
|
+
})
|
|
46
|
+
});
|
|
8
47
|
export const DefaultLoginButton = ({ disabled, endpointSlug })=>{
|
|
9
48
|
const { config: { admin: { user: userSlug }, routes: { api }, serverURL } } = useConfig();
|
|
10
49
|
const [authorizeURL, setAuthorizeURL] = useState('');
|
|
@@ -40,11 +79,16 @@ export const DefaultLoginButton = ({ disabled, endpointSlug })=>{
|
|
|
40
79
|
}
|
|
41
80
|
return /*#__PURE__*/ _jsx("div", {
|
|
42
81
|
className: baseClass,
|
|
43
|
-
children: /*#__PURE__*/
|
|
82
|
+
children: /*#__PURE__*/ _jsxs("a", {
|
|
44
83
|
className: `${baseClass}__btn`,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
84
|
+
href: authorizeURL,
|
|
85
|
+
children: [
|
|
86
|
+
/*#__PURE__*/ _jsx(FigmaIcon, {}),
|
|
87
|
+
/*#__PURE__*/ _jsx("span", {
|
|
88
|
+
className: `${baseClass}__text`,
|
|
89
|
+
children: "Log in with Figma"
|
|
90
|
+
})
|
|
91
|
+
]
|
|
48
92
|
})
|
|
49
93
|
});
|
|
50
94
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/oauth/components/LoginButton/index.tsx"],"sourcesContent":["'use client'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/oauth/components/LoginButton/index.tsx"],"sourcesContent":["'use client'\n\nimport { 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\n// Figma logo SVG colored version\n// const FigmaIcon: React.FC = () => (\n// <svg fill=\"none\" height=\"27\" viewBox=\"0 0 400 600\" width=\"18\">\n// <path\n// d=\"M0 500C0 444.772 44.772 400 100 400H200V500C200 555.228 155.228 600 100 600C44.772 600 0 555.228 0 500Z\"\n// fill=\"#24CB71\"\n// />\n// <path\n// d=\"M200 0V200H300C355.228 200 400 155.228 400 100C400 44.772 355.228 0 300 0H200Z\"\n// fill=\"#FF7237\"\n// />\n// <path\n// d=\"M299.167 400C354.395 400 399.167 355.228 399.167 300C399.167 244.772 354.395 200 299.167 200C243.939 200 199.167 244.772 199.167 300C199.167 355.228 243.939 400 299.167 400Z\"\n// fill=\"#00B6FF\"\n// />\n// <path\n// d=\"M0 100C0 155.228 44.772 200 100 200H200V0H100C44.772 0 0 44.772 0 100Z\"\n// fill=\"#FF3737\"\n// />\n// <path\n// d=\"M0 300C0 355.228 44.772 400 100 400H200V200H100C44.772 200 0 244.772 0 300Z\"\n// fill=\"#874FFF\"\n// />\n// </svg>\n// )\n\n// Figma logo SVG monochrome version\nconst FigmaIcon: React.FC = () => (\n <svg\n fill=\"none\"\n height=\"20px\"\n viewBox=\"0 0 15 15\"\n width=\"20px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M7.00005 2.04999H5.52505C4.71043 2.04999 4.05005 2.71037 4.05005 3.52499C4.05005 4.33961 4.71043 4.99999 5.52505 4.99999H7.00005V2.04999ZM7.00005 1.04999H8.00005H9.47505C10.842 1.04999 11.95 2.15808 11.95 3.52499C11.95 4.33163 11.5642 5.04815 10.9669 5.49999C11.5642 5.95184 11.95 6.66836 11.95 7.475C11.95 8.8419 10.842 9.95 9.47505 9.95C8.92236 9.95 8.41198 9.76884 8.00005 9.46266V9.95L8.00005 11.425C8.00005 12.7919 6.89195 13.9 5.52505 13.9C4.15814 13.9 3.05005 12.7919 3.05005 11.425C3.05005 10.6183 3.43593 9.90184 4.03317 9.44999C3.43593 8.99814 3.05005 8.28163 3.05005 7.475C3.05005 6.66836 3.43594 5.95184 4.03319 5.5C3.43594 5.04815 3.05005 4.33163 3.05005 3.52499C3.05005 2.15808 4.15814 1.04999 5.52505 1.04999H7.00005ZM8.00005 2.04999V4.99999H9.47505C10.2897 4.99999 10.95 4.33961 10.95 3.52499C10.95 2.71037 10.2897 2.04999 9.47505 2.04999H8.00005ZM5.52505 8.94998H7.00005L7.00005 7.4788L7.00005 7.475L7.00005 7.4712V6H5.52505C4.71043 6 4.05005 6.66038 4.05005 7.475C4.05005 8.28767 4.70727 8.94684 5.5192 8.94999L5.52505 8.94998ZM4.05005 11.425C4.05005 10.6123 4.70727 9.95315 5.5192 9.94999L5.52505 9.95H7.00005L7.00005 11.425C7.00005 12.2396 6.33967 12.9 5.52505 12.9C4.71043 12.9 4.05005 12.2396 4.05005 11.425ZM8.00005 7.47206C8.00164 6.65879 8.66141 6 9.47505 6C10.2897 6 10.95 6.66038 10.95 7.475C10.95 8.28962 10.2897 8.95 9.47505 8.95C8.66141 8.95 8.00164 8.29121 8.00005 7.47794V7.47206Z\"\n fill=\"#FFFFFF\"\n fillRule=\"evenodd\"\n />\n </svg>\n)\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 <a className={`${baseClass}__btn`} href={authorizeURL}>\n <FigmaIcon />\n <span className={`${baseClass}__text`}>Log in with Figma</span>\n </a>\n </div>\n )\n}\n"],"names":["useConfig","useSearchParams","React","useEffect","useState","baseClass","FigmaIcon","svg","fill","height","viewBox","width","xmlns","path","clipRule","d","fillRule","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","a","href","span"],"mappings":"AAAA;;AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,eAAe,QAAQ,qBAAoB;AACpD,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,OAAO,eAAc;AAErB,MAAMC,YAAY;AAElB,iCAAiC;AACjC,sCAAsC;AACtC,mEAAmE;AACnE,YAAY;AACZ,oHAAoH;AACpH,uBAAuB;AACvB,SAAS;AACT,YAAY;AACZ,2FAA2F;AAC3F,uBAAuB;AACvB,SAAS;AACT,YAAY;AACZ,0LAA0L;AAC1L,uBAAuB;AACvB,SAAS;AACT,YAAY;AACZ,mFAAmF;AACnF,uBAAuB;AACvB,SAAS;AACT,YAAY;AACZ,wFAAwF;AACxF,uBAAuB;AACvB,SAAS;AACT,WAAW;AACX,IAAI;AAEJ,oCAAoC;AACpC,MAAMC,YAAsB,kBAC1B,KAACC;QACCC,MAAK;QACLC,QAAO;QACPC,SAAQ;QACRC,OAAM;QACNC,OAAM;kBAEN,cAAA,KAACC;YACCC,UAAS;YACTC,GAAE;YACFP,MAAK;YACLQ,UAAS;;;AAUf,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,GAAG1B;IACJ,MAAM,CAAC2B,cAAcC,gBAAgB,GAAGxB,SAAS;IAEjD,MAAMyB,eAAe5B;IACrB,MAAM6B,kBAAkBD,aAAaE,GAAG,CAAC;IAEzC5B,UAAU;QACR,IAAI2B,mBAAmB,CAACZ,UAAU;YAChC,8CAA8C;YAC9Cc,SAASC,MAAM,GAAG,CAAC,gBAAgB,EAAEH,gBAAgB,QAAQ,CAAC;QAChE;IACF,GAAG;QAACA;QAAiBZ;KAAS;IAE9Bf,UAAU;QACR,MAAM+B,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,WAAWxC;kBACd,cAAA,MAACyC;YAAED,WAAW,GAAGxC,UAAU,KAAK,CAAC;YAAE0C,MAAMpB;;8BACvC,KAACrB;8BACD,KAAC0C;oBAAKH,WAAW,GAAGxC,UAAU,MAAM,CAAC;8BAAE;;;;;AAI/C,EAAC"}
|
|
@@ -1,10 +1,57 @@
|
|
|
1
1
|
.oauth-login {
|
|
2
2
|
display: flex;
|
|
3
3
|
justify-content: center;
|
|
4
|
+
padding: 1rem 0;
|
|
4
5
|
|
|
5
|
-
&__btn
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
&__btn {
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
justify-content: center;
|
|
10
|
+
gap: 0.75rem;
|
|
11
|
+
padding: 0.75rem 1.5rem;
|
|
12
|
+
min-height: 3rem;
|
|
13
|
+
background-color: #4d49fc;
|
|
14
|
+
color: #ffffff;
|
|
15
|
+
border: none;
|
|
16
|
+
border-radius: 0.5rem;
|
|
17
|
+
font-size: 1rem;
|
|
18
|
+
font-weight: 450;
|
|
19
|
+
letter-spacing: 0.05px;
|
|
20
|
+
text-decoration: none;
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
transition: background-color 0.2s ease, transform 0.1s ease;
|
|
23
|
+
box-shadow: none;
|
|
24
|
+
|
|
25
|
+
&:hover {
|
|
26
|
+
background-color: #4440e8;
|
|
27
|
+
transform: translateY(-1px);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
&:active {
|
|
31
|
+
background-color: #3c38d4;
|
|
32
|
+
transform: translateY(0);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
&:focus {
|
|
36
|
+
outline: none;
|
|
37
|
+
box-shadow: 0 0 0 2px rgba(77, 73, 252, 0.4);
|
|
8
38
|
}
|
|
9
39
|
}
|
|
40
|
+
|
|
41
|
+
&__icon {
|
|
42
|
+
flex-shrink: 0;
|
|
43
|
+
width: 20px;
|
|
44
|
+
height: 20px;
|
|
45
|
+
display: flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: center;
|
|
48
|
+
color: #ffffff;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
&__text {
|
|
52
|
+
white-space: nowrap;
|
|
53
|
+
line-height: 1rem;
|
|
54
|
+
font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
|
|
55
|
+
Oxygen, Ubuntu, Cantarell, sans-serif;
|
|
56
|
+
}
|
|
10
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/oauth/components/LogoutButton/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/oauth/components/LogoutButton/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CA0D/E,CAAA"}
|
|
@@ -17,7 +17,6 @@ export const LogoutButton = ({ disabled, endpointSlug })=>{
|
|
|
17
17
|
redirectToSet += `:${port}`;
|
|
18
18
|
}
|
|
19
19
|
redirectToSet += getAdminPath(config);
|
|
20
|
-
// eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect
|
|
21
20
|
setRedirect(redirectToSet);
|
|
22
21
|
}, [
|
|
23
22
|
config
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/oauth/components/LogoutButton/index.tsx"],"sourcesContent":["'use client'\n\nimport { Logout, useConfig } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { getAdminPath } from '../../utilities/getAdminPath.js'\nimport './index.scss'\n\nconst baseClass = 'oauth-logout'\n\nexport const LogoutButton: React.FC<{ disabled?: boolean; endpointSlug: string }> = ({\n disabled,\n endpointSlug,\n}) => {\n const {\n config,\n config: {\n admin: { user: userSlug },\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const [redirect, setRedirect] = React.useState('')\n React.useEffect(() => {\n const protocol = window.location.protocol\n const domain = window.location.hostname\n const port = window.location.port\n\n let redirectToSet = `${protocol}//${domain}`\n if (port) {\n redirectToSet += `:${port}`\n }\n\n redirectToSet += getAdminPath(config)\n\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/oauth/components/LogoutButton/index.tsx"],"sourcesContent":["'use client'\n\nimport { Logout, useConfig } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { getAdminPath } from '../../utilities/getAdminPath.js'\nimport './index.scss'\n\nconst baseClass = 'oauth-logout'\n\nexport const LogoutButton: React.FC<{ disabled?: boolean; endpointSlug: string }> = ({\n disabled,\n endpointSlug,\n}) => {\n const {\n config,\n config: {\n admin: { user: userSlug },\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const [redirect, setRedirect] = React.useState('')\n React.useEffect(() => {\n const protocol = window.location.protocol\n const domain = window.location.hostname\n const port = window.location.port\n\n let redirectToSet = `${protocol}//${domain}`\n if (port) {\n redirectToSet += `:${port}`\n }\n\n redirectToSet += getAdminPath(config)\n\n setRedirect(redirectToSet)\n }, [config])\n\n if (!redirect) {\n return null\n }\n\n if (disabled) {\n return <Logout />\n }\n\n return (\n <div className={baseClass}>\n <a\n aria-label=\"Logout\"\n href={`${serverURL}${api}/${userSlug}/${endpointSlug}/logout?redirect=${redirect}`}\n >\n <svg\n className=\"icon icon--logout\"\n fill=\"none\"\n viewBox=\"0 0 25 25\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path className=\"stroke\" d=\"M10 5H18V19H10\" />\n <g>\n <path className=\"stroke\" d=\"M8 8.5L4.46447 12.0355L8 15.5711\" />\n <line className=\"stroke\" x1=\"5\" x2=\"13\" y1=\"12\" y2=\"12\" />\n </g>\n </svg>\n </a>\n </div>\n )\n}\n"],"names":["Logout","useConfig","React","getAdminPath","baseClass","LogoutButton","disabled","endpointSlug","config","admin","user","userSlug","routes","api","serverURL","redirect","setRedirect","useState","useEffect","protocol","window","location","domain","hostname","port","redirectToSet","div","className","a","aria-label","href","svg","fill","viewBox","xmlns","path","d","g","line","x1","x2","y1","y2"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,SAAS,QAAQ,iBAAgB;AAClD,OAAOC,WAAW,QAAO;AAEzB,SAASC,YAAY,QAAQ,kCAAiC;AAC9D,OAAO,eAAc;AAErB,MAAMC,YAAY;AAElB,OAAO,MAAMC,eAAuE,CAAC,EACnFC,QAAQ,EACRC,YAAY,EACb;IACC,MAAM,EACJC,MAAM,EACNA,QAAQ,EACNC,OAAO,EAAEC,MAAMC,QAAQ,EAAE,EACzBC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACF,GAAGb;IAEJ,MAAM,CAACc,UAAUC,YAAY,GAAGd,MAAMe,QAAQ,CAAC;IAC/Cf,MAAMgB,SAAS,CAAC;QACd,MAAMC,WAAWC,OAAOC,QAAQ,CAACF,QAAQ;QACzC,MAAMG,SAASF,OAAOC,QAAQ,CAACE,QAAQ;QACvC,MAAMC,OAAOJ,OAAOC,QAAQ,CAACG,IAAI;QAEjC,IAAIC,gBAAgB,GAAGN,SAAS,EAAE,EAAEG,QAAQ;QAC5C,IAAIE,MAAM;YACRC,iBAAiB,CAAC,CAAC,EAAED,MAAM;QAC7B;QAEAC,iBAAiBtB,aAAaK;QAE9BQ,YAAYS;IACd,GAAG;QAACjB;KAAO;IAEX,IAAI,CAACO,UAAU;QACb,OAAO;IACT;IAEA,IAAIT,UAAU;QACZ,qBAAO,KAACN;IACV;IAEA,qBACE,KAAC0B;QAAIC,WAAWvB;kBACd,cAAA,KAACwB;YACCC,cAAW;YACXC,MAAM,GAAGhB,YAAYD,IAAI,CAAC,EAAEF,SAAS,CAAC,EAAEJ,aAAa,iBAAiB,EAAEQ,UAAU;sBAElF,cAAA,MAACgB;gBACCJ,WAAU;gBACVK,MAAK;gBACLC,SAAQ;gBACRC,OAAM;;kCAEN,KAACC;wBAAKR,WAAU;wBAASS,GAAE;;kCAC3B,MAACC;;0CACC,KAACF;gCAAKR,WAAU;gCAASS,GAAE;;0CAC3B,KAACE;gCAAKX,WAAU;gCAASY,IAAG;gCAAIC,IAAG;gCAAKC,IAAG;gCAAKC,IAAG;;;;;;;;AAM/D,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;
|
|
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;AAKzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAY,MAAM,aAAa,CAAA;AAS7E,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 { APIError, generateCookie, parseCookies } from 'payload'\nimport { getSafeRedirect } from 'payload/shared'\n\nimport type { Strategy } from '../strategy/index.js'\nimport type { CollectionOptions, PluginOptions, StateObj } from '../types.js'\n\nimport { getProjectToken } from '../../api/figma-api.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'\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":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoD,MAAM,EAAE,MAAM,SAAS,CAAA;AAIvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAc/C,eAAO,MAAM,YAAY,kBACP,aAAa,KAAG,MAuQ/B,CAAA"}
|
package/dist/oauth/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fieldAffectsData } from 'payload/shared';
|
|
1
2
|
import { defaultVerify } from './defaults.js';
|
|
2
3
|
import { getLoginEndpoint } from './endpoints/getLoginEndpoint.js';
|
|
3
4
|
import { getLogoutEndpoint } from './endpoints/getLogoutEndpoint.js';
|
|
@@ -46,7 +47,7 @@ export const oAuth2Plugin = (pluginOptions)=>(config)=>{
|
|
|
46
47
|
disabled,
|
|
47
48
|
endpointSlug
|
|
48
49
|
},
|
|
49
|
-
path: '@payloadcms/
|
|
50
|
+
path: '@payloadcms/figma/client#DefaultLoginButton'
|
|
50
51
|
};
|
|
51
52
|
}
|
|
52
53
|
return {
|
|
@@ -62,7 +63,7 @@ export const oAuth2Plugin = (pluginOptions)=>(config)=>{
|
|
|
62
63
|
disabled,
|
|
63
64
|
endpointSlug
|
|
64
65
|
},
|
|
65
|
-
path: '@payloadcms/
|
|
66
|
+
path: '@payloadcms/figma/client#LogoutButton'
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
} : {},
|
|
@@ -84,14 +85,37 @@ export const oAuth2Plugin = (pluginOptions)=>(config)=>{
|
|
|
84
85
|
if (collectionOptions.usePayloadJWT) {
|
|
85
86
|
cookieName = `${config.cookiePrefix || 'payload'}-token`;
|
|
86
87
|
}
|
|
88
|
+
// Check if email field exists, if not add it
|
|
89
|
+
const hasEmailField = existingCollection.fields.some((field)=>'name' in field && field.name === 'email');
|
|
90
|
+
// Add email field to collection before getting username field
|
|
91
|
+
// This ensures getUsernameField can find the email field if it's configured as the username
|
|
92
|
+
const collectionWithEmail = hasEmailField ? existingCollection : {
|
|
93
|
+
...existingCollection,
|
|
94
|
+
fields: [
|
|
95
|
+
...existingCollection.fields,
|
|
96
|
+
{
|
|
97
|
+
name: 'email',
|
|
98
|
+
type: 'email'
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
};
|
|
87
102
|
const usernameField = getUsernameField({
|
|
88
|
-
collection:
|
|
103
|
+
collection: collectionWithEmail,
|
|
89
104
|
collectionOptions
|
|
90
105
|
});
|
|
106
|
+
// Make username field readOnly
|
|
107
|
+
const readOnlyUsernameField = {
|
|
108
|
+
...usernameField,
|
|
109
|
+
admin: {
|
|
110
|
+
...usernameField.admin || {},
|
|
111
|
+
readOnly: true
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const isUsernameFieldString = typeof adminCollectionOptions.usernameField === 'string';
|
|
91
115
|
const fields = [
|
|
92
|
-
...
|
|
93
|
-
...
|
|
94
|
-
|
|
116
|
+
...collectionWithEmail.fields.map((field)=>fieldAffectsData(field) && field.name === usernameField.name ? readOnlyUsernameField : field),
|
|
117
|
+
...isUsernameFieldString ? [] : [
|
|
118
|
+
readOnlyUsernameField
|
|
95
119
|
]
|
|
96
120
|
];
|
|
97
121
|
if (disabled) {
|