@payloadcms/figma 0.0.1-alpha.29 → 0.0.1-alpha.3
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 -22
- package/dist/api/control-plane.d.ts.map +1 -1
- package/dist/api/control-plane.js +15 -54
- 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 +12 -38
- package/dist/api/figma-api.js.map +1 -1
- package/dist/auth/callback-server.d.ts.map +1 -1
- package/dist/auth/callback-server.js +1 -2
- package/dist/auth/callback-server.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.d.ts +1 -1
- package/dist/auth/oauth-flow.d.ts.map +1 -1
- package/dist/auth/oauth-flow.js +5 -5
- 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 +4 -9
- package/dist/auth/project-token.js.map +1 -1
- package/dist/auth/token-store.d.ts +0 -10
- package/dist/auth/token-store.d.ts.map +1 -1
- package/dist/auth/token-store.js +0 -20
- package/dist/auth/token-store.js.map +1 -1
- package/dist/cli.js +0 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/deploy.d.ts +0 -4
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +81 -41
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.d.ts +5 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +85 -90
- 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 +1 -8
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +6 -12
- 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 +0 -5
- package/dist/config/oauth.d.ts.map +1 -1
- package/dist/config/oauth.js +4 -9
- package/dist/config/oauth.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/oauth/components/LoginButton/index.d.ts.map +1 -1
- package/dist/oauth/components/LoginButton/index.js +6 -50
- package/dist/oauth/components/LoginButton/index.js.map +1 -1
- package/dist/oauth/components/LoginButton/index.scss +3 -50
- package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -1
- package/dist/oauth/components/LogoutButton/index.js +1 -0
- package/dist/oauth/components/LogoutButton/index.js.map +1 -1
- package/dist/oauth/defaults.d.ts.map +1 -1
- package/dist/oauth/defaults.js +5 -29
- package/dist/oauth/defaults.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 +6 -42
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/strategy/index.d.ts.map +1 -1
- package/dist/oauth/strategy/index.js +2 -6
- package/dist/oauth/strategy/index.js.map +1 -1
- package/dist/oauth/types.d.ts +6 -6
- 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 +4 -20
- package/dist/plugin/build-config.d.ts.map +1 -1
- package/dist/plugin/build-config.js +9 -51
- package/dist/plugin/build-config.js.map +1 -1
- package/dist/utils/env-management.d.ts +8 -9
- package/dist/utils/env-management.d.ts.map +1 -1
- package/dist/utils/env-management.js +74 -73
- package/dist/utils/env-management.js.map +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -1
- package/dist/utils/formatter.js.map +1 -1
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +7 -5
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/payload-config-ast.d.ts +3 -22
- package/dist/utils/payload-config-ast.d.ts.map +1 -1
- package/dist/utils/payload-config-ast.js +31 -89
- package/dist/utils/payload-config-ast.js.map +1 -1
- package/dist/utils/payload-config-finder.d.ts +2 -2
- package/dist/utils/payload-config-finder.d.ts.map +1 -1
- package/dist/utils/payload-config-finder.js +9 -48
- package/dist/utils/payload-config-finder.js.map +1 -1
- package/dist/utils/payload-config-modifier.d.ts.map +1 -1
- package/dist/utils/payload-config-modifier.js +4 -33
- package/dist/utils/payload-config-modifier.js.map +1 -1
- package/dist/utils/payload-package-check.d.ts +0 -5
- package/dist/utils/payload-package-check.d.ts.map +1 -1
- package/dist/utils/payload-package-check.js +4 -48
- package/dist/utils/payload-package-check.js.map +1 -1
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +6 -8
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/s3-upload.d.ts +1 -0
- package/dist/utils/s3-upload.d.ts.map +1 -1
- package/dist/utils/s3-upload.js +3 -10
- package/dist/utils/s3-upload.js.map +1 -1
- package/dist/utils/token-display.d.ts.map +1 -1
- package/dist/utils/token-display.js +5 -11
- package/dist/utils/token-display.js.map +1 -1
- package/dist/utils/typescript-validator.d.ts.map +1 -1
- package/dist/utils/typescript-validator.js +6 -1
- package/dist/utils/typescript-validator.js.map +1 -1
- package/package.json +6 -20
- package/dist/db-content-api/generated/content-api-types.d.ts +0 -3129
- package/dist/db-content-api/generated/content-api-types.d.ts.map +0 -1
- package/dist/db-content-api/generated/content-api-types.js +0 -7
- package/dist/db-content-api/generated/content-api-types.js.map +0 -1
- package/dist/db-content-api/index.d.ts +0 -31
- package/dist/db-content-api/index.d.ts.map +0 -1
- package/dist/db-content-api/index.js +0 -842
- package/dist/db-content-api/index.js.map +0 -1
- package/dist/db-content-api/types.d.ts +0 -31
- package/dist/db-content-api/types.d.ts.map +0 -1
- package/dist/db-content-api/types.js +0 -7
- package/dist/db-content-api/types.js.map +0 -1
- package/dist/endpoints/health.d.ts +0 -3
- package/dist/endpoints/health.d.ts.map +0 -1
- package/dist/endpoints/health.js +0 -11
- package/dist/endpoints/health.js.map +0 -1
- package/dist/exports/client.d.ts +0 -3
- package/dist/exports/client.d.ts.map +0 -1
- package/dist/exports/client.js +0 -4
- package/dist/exports/client.js.map +0 -1
- package/dist/oauth/utilities/isDuplicateKeyError.d.ts +0 -7
- package/dist/oauth/utilities/isDuplicateKeyError.d.ts.map +0 -1
- package/dist/oauth/utilities/isDuplicateKeyError.js +0 -14
- package/dist/oauth/utilities/isDuplicateKeyError.js.map +0 -1
- package/dist/templates/README.md +0 -19
|
@@ -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;AAQtD;;;;;;;;;;;;;;;;;;;;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,QAAQ,GAAG,QAAQ,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AAE7B;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAoC/E"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { lexicalEditor } from '@payloadcms/richtext-lexical';
|
|
2
2
|
import { buildConfig as payloadBuildConfig } from 'payload';
|
|
3
|
-
import { getTokenStore } from '../auth/token-store.js';
|
|
4
|
-
import { contentAPIAdapter } from '../db-content-api/index.js';
|
|
5
|
-
import { health } from '../endpoints/health.js';
|
|
6
3
|
import { oAuth2Plugin } from '../oauth/index.js';
|
|
4
|
+
import { figmaContentSystem } from './adapter.js';
|
|
7
5
|
/**
|
|
8
6
|
* Figma platform wrapper for Payload's buildConfig.
|
|
9
7
|
* Automatically injects:
|
|
@@ -13,57 +11,16 @@ import { oAuth2Plugin } from '../oauth/index.js';
|
|
|
13
11
|
*
|
|
14
12
|
* @param config - Payload configuration (db and secret omitted, editor optional)
|
|
15
13
|
* @returns Promise<SanitizedConfig> - Built Payload configuration
|
|
16
|
-
*/ export async function
|
|
17
|
-
// Validate required environment variable
|
|
18
|
-
if (!config.figma.contentSystemId) {
|
|
19
|
-
throw new Error('FIGMA_CONTENT_SYSTEM_ID is required. ' + 'Ensure your .env file contains: FIGMA_CONTENT_SYSTEM_ID=your-content-system-id');
|
|
20
|
-
}
|
|
21
|
-
const DEFAULT_CONTENT_API_URL = 'https://us-east-1.cms-tenants-001-staging.figmacontentstaging.com';
|
|
22
|
-
const url = process.env.FIGMA_CONTENT_API_URL || DEFAULT_CONTENT_API_URL;
|
|
23
|
-
const { contentSystemId } = config.figma;
|
|
24
|
-
// Determine database adapter based on environment
|
|
25
|
-
let db;
|
|
26
|
-
if (config.figma.useContentSystem === false) {
|
|
27
|
-
db = config.db;
|
|
28
|
-
} else if (process.env.FIGMA_CONTENT_API_ACCESS_KEY) {
|
|
29
|
-
db = contentAPIAdapter({
|
|
30
|
-
auth: {
|
|
31
|
-
apiKey: process.env.FIGMA_CONTENT_API_ACCESS_KEY,
|
|
32
|
-
mode: 'apiKey'
|
|
33
|
-
},
|
|
34
|
-
contentSystemId,
|
|
35
|
-
url
|
|
36
|
-
});
|
|
37
|
-
} else if (process.env.FIGMA_DEV_JWT === 'true') {
|
|
38
|
-
db = contentAPIAdapter({
|
|
39
|
-
auth: {
|
|
40
|
-
mode: 'devJwt'
|
|
41
|
-
},
|
|
42
|
-
contentSystemId,
|
|
43
|
-
url
|
|
44
|
-
});
|
|
45
|
-
} else {
|
|
46
|
-
db = contentAPIAdapter({
|
|
47
|
-
auth: {
|
|
48
|
-
mode: 'tokenStore',
|
|
49
|
-
tokenStore: getTokenStore()
|
|
50
|
-
},
|
|
51
|
-
contentSystemId,
|
|
52
|
-
url
|
|
53
|
-
});
|
|
54
|
-
}
|
|
14
|
+
*/ export async function buildConfig(config) {
|
|
55
15
|
// Build complete config with Figma platform defaults
|
|
56
16
|
const configWithFigmaDefaults = {
|
|
57
17
|
...config,
|
|
58
|
-
|
|
59
|
-
|
|
18
|
+
...config.figma.useContentSystem ? {
|
|
19
|
+
db: figmaContentSystem()
|
|
20
|
+
} : {
|
|
21
|
+
db: config.db
|
|
60
22
|
},
|
|
61
|
-
db,
|
|
62
23
|
editor: config.editor ?? lexicalEditor(),
|
|
63
|
-
endpoints: [
|
|
64
|
-
...config.endpoints ?? [],
|
|
65
|
-
health
|
|
66
|
-
],
|
|
67
24
|
secret: 'MY_SECRET',
|
|
68
25
|
// Add oauth to plugins if not already present
|
|
69
26
|
plugins: [
|
|
@@ -87,8 +44,9 @@ import { oAuth2Plugin } from '../oauth/index.js';
|
|
|
87
44
|
usernameField: 'email'
|
|
88
45
|
}
|
|
89
46
|
],
|
|
90
|
-
debug:
|
|
91
|
-
disabled: false
|
|
47
|
+
debug: true,
|
|
48
|
+
disabled: false,
|
|
49
|
+
redirectServerURL: 'http://localhost:3000'
|
|
92
50
|
})
|
|
93
51
|
]
|
|
94
52
|
};
|
|
@@ -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 { oAuth2Plugin } from '../oauth/index.js'\nimport { figmaContentSystem } from './adapter.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, '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 // Build complete config with Figma platform defaults\n const configWithFigmaDefaults: Config = {\n ...config,\n ...(config.figma.useContentSystem ? { db: figmaContentSystem() } : { db: config.db }),\n editor: config.editor ?? lexicalEditor(),\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: true,\n disabled: false,\n redirectServerURL: 'http://localhost:3000',\n }),\n ],\n }\n\n // Delegate to Payload's buildConfig\n return await payloadBuildConfig(configWithFigmaDefaults)\n}\n"],"names":["lexicalEditor","buildConfig","payloadBuildConfig","oAuth2Plugin","figmaContentSystem","config","configWithFigmaDefaults","figma","useContentSystem","db","editor","secret","plugins","collections","slug","authorizationURLParams","response_mode","response_type","clientID","process","env","FIGMA_OAUTH_CLIENT_ID","clientSecret","FIGMA_OAUTH_CLIENT_SECRET","identityMetadata","scope","token","usernameField","debug","disabled","redirectServerURL"],"mappings":"AAEA,SAASA,aAAa,QAAQ,+BAA8B;AAC5D,SAASC,eAAeC,kBAAkB,QAAQ,UAAS;AAE3D,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,kBAAkB,QAAQ,eAAc;AAkCjD;;;;;;;;;CASC,GACD,OAAO,eAAeH,YAAYI,MAAmB;IACnD,qDAAqD;IACrD,MAAMC,0BAAkC;QACtC,GAAGD,MAAM;QACT,GAAIA,OAAOE,KAAK,CAACC,gBAAgB,GAAG;YAAEC,IAAIL;QAAqB,IAAI;YAAEK,IAAIJ,OAAOI,EAAE;QAAC,CAAC;QACpFC,QAAQL,OAAOK,MAAM,IAAIV;QACzBW,QAAQ;QACR,8CAA8C;QAC9CC,SAAS;eACHP,OAAOO,OAAO,IAAI,EAAE;YACxBT,aAAa;gBACXU,aAAa;oBACX;wBACEC,MAAM;wBACN,4DAA4D;wBAC5DC,wBAAwB;4BACtBC,eAAe;4BACfC,eAAe;wBACjB;wBACAC,UAAUC,QAAQC,GAAG,CAACC,qBAAqB;wBAC3CC,cAAcH,QAAQC,GAAG,CAACG,yBAAyB;wBACnDC,kBAAkB;wBAClBC,OAAO;4BAAC;yBAAoB;wBAC5BC,OAAO;wBACPC,eAAe;oBACjB;iBACD;gBACDC,OAAO;gBACPC,UAAU;gBACVC,mBAAmB;YACrB;SACD;IACH;IAEA,oCAAoC;IACpC,OAAO,MAAM5B,mBAAmBI;AAClC"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Generate a cryptographically secure secret for PAYLOAD_SECRET
|
|
3
3
|
*
|
|
4
|
-
* @
|
|
5
|
-
* @param key - Environment variable name to retrieve
|
|
6
|
-
* @returns The value if found, null otherwise
|
|
4
|
+
* @returns 24-character hexadecimal string
|
|
7
5
|
*/
|
|
8
|
-
export declare function
|
|
6
|
+
export declare function generateSecret(): string;
|
|
9
7
|
/**
|
|
10
|
-
*
|
|
8
|
+
* Manage environment files for a new project
|
|
9
|
+
*
|
|
10
|
+
* Creates .env from .env.example (if exists) and populates PAYLOAD_SECRET
|
|
11
11
|
*
|
|
12
12
|
* @param projectPath - Path to project directory
|
|
13
|
-
* @
|
|
14
|
-
* @param value - Environment variable value
|
|
13
|
+
* @returns The generated payload secret
|
|
15
14
|
*/
|
|
16
|
-
export declare function
|
|
15
|
+
export declare function manageEnvFiles(projectPath: string): Promise<string>;
|
|
17
16
|
//# sourceMappingURL=env-management.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-management.d.ts","sourceRoot":"","sources":["../../src/utils/env-management.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env-management.d.ts","sourceRoot":"","sources":["../../src/utils/env-management.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAoDD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CzE"}
|
|
@@ -1,96 +1,97 @@
|
|
|
1
|
+
import { randomBytes } from 'crypto';
|
|
1
2
|
import fs from 'fs/promises';
|
|
2
3
|
import path from 'path';
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
+
* Generate a cryptographically secure secret for PAYLOAD_SECRET
|
|
5
6
|
*
|
|
6
|
-
* @
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
7
|
+
* @returns 24-character hexadecimal string
|
|
8
|
+
*/ export function generateSecret() {
|
|
9
|
+
return randomBytes(32).toString('hex').slice(0, 24);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Sanitize and process environment file contents
|
|
13
|
+
*
|
|
14
|
+
* @param contents - Raw .env file contents
|
|
15
|
+
* @param payloadSecret - Secret to use for PAYLOAD_SECRET
|
|
16
|
+
* @returns Processed .env contents
|
|
17
|
+
*/ function sanitizeEnv(contents, payloadSecret) {
|
|
18
|
+
const lines = contents.split('\n');
|
|
19
|
+
const seenKeys = new Set();
|
|
20
|
+
const processedLines = [];
|
|
21
|
+
for (const line of lines){
|
|
22
|
+
// Skip empty lines and comments
|
|
23
|
+
if (!line.trim() || line.trim().startsWith('#')) {
|
|
24
|
+
processedLines.push(line);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Skip lines without =
|
|
28
|
+
if (!line.includes('=')) {
|
|
29
|
+
processedLines.push(line);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const [key] = line.split('=');
|
|
33
|
+
const trimmedKey = key.trim();
|
|
34
|
+
// Skip duplicate keys
|
|
35
|
+
if (seenKeys.has(trimmedKey)) {
|
|
36
|
+
continue;
|
|
28
37
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
seenKeys.add(trimmedKey);
|
|
39
|
+
// Replace PAYLOAD_SECRET with actual value
|
|
40
|
+
if (trimmedKey === 'PAYLOAD_SECRET' || trimmedKey === 'PAYLOAD_SECRET_KEY') {
|
|
41
|
+
processedLines.push(`PAYLOAD_SECRET=${payloadSecret}`);
|
|
42
|
+
} else {
|
|
43
|
+
processedLines.push(line);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Add PAYLOAD_SECRET if not present
|
|
47
|
+
if (!seenKeys.has('PAYLOAD_SECRET') && !seenKeys.has('PAYLOAD_SECRET_KEY')) {
|
|
48
|
+
processedLines.push(`PAYLOAD_SECRET=${payloadSecret}`);
|
|
33
49
|
}
|
|
50
|
+
return processedLines.join('\n');
|
|
34
51
|
}
|
|
35
52
|
/**
|
|
36
|
-
*
|
|
53
|
+
* Manage environment files for a new project
|
|
54
|
+
*
|
|
55
|
+
* Creates .env from .env.example (if exists) and populates PAYLOAD_SECRET
|
|
37
56
|
*
|
|
38
57
|
* @param projectPath - Path to project directory
|
|
39
|
-
* @
|
|
40
|
-
|
|
41
|
-
|
|
58
|
+
* @returns The generated payload secret
|
|
59
|
+
*/ export async function manageEnvFiles(projectPath) {
|
|
60
|
+
const payloadSecret = generateSecret();
|
|
61
|
+
const envExamplePath = path.join(projectPath, '.env.example');
|
|
42
62
|
const envPath = path.join(projectPath, '.env');
|
|
43
63
|
try {
|
|
44
|
-
|
|
64
|
+
// Check if .env.example exists
|
|
65
|
+
let envExampleContents = '';
|
|
66
|
+
try {
|
|
67
|
+
envExampleContents = await fs.readFile(envExamplePath, 'utf-8');
|
|
68
|
+
} catch {
|
|
69
|
+
// No .env.example, create minimal .env
|
|
70
|
+
envExampleContents = '';
|
|
71
|
+
}
|
|
72
|
+
// Check if .env already exists
|
|
45
73
|
let envExists = false;
|
|
46
|
-
// Try to read existing .env file
|
|
47
74
|
try {
|
|
48
|
-
|
|
75
|
+
await fs.access(envPath);
|
|
49
76
|
envExists = true;
|
|
50
77
|
} catch {
|
|
51
|
-
// .env doesn't exist
|
|
78
|
+
// .env doesn't exist
|
|
52
79
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
|
|
80
|
+
if (!envExists) {
|
|
81
|
+
// Create .env from .env.example
|
|
82
|
+
const sanitized = sanitizeEnv(envExampleContents, payloadSecret);
|
|
83
|
+
await fs.writeFile(envPath, sanitized, 'utf-8');
|
|
84
|
+
} else {
|
|
85
|
+
// Update existing .env if it doesn't have PAYLOAD_SECRET
|
|
86
|
+
const existingContents = await fs.readFile(envPath, 'utf-8');
|
|
87
|
+
if (!existingContents.includes('PAYLOAD_SECRET=') && !existingContents.includes('PAYLOAD_SECRET_KEY=')) {
|
|
88
|
+
const sanitized = sanitizeEnv(existingContents, payloadSecret);
|
|
89
|
+
await fs.writeFile(envPath, sanitized, 'utf-8');
|
|
61
90
|
}
|
|
62
|
-
// Preserve empty lines and comments
|
|
63
|
-
if (!line.trim() || line.trim().startsWith('#')) {
|
|
64
|
-
processedLines.push(line);
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
// Skip lines without =
|
|
68
|
-
if (!line.includes('=')) {
|
|
69
|
-
processedLines.push(line);
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
const [lineKey] = line.split('=');
|
|
73
|
-
const trimmedKey = lineKey.trim();
|
|
74
|
-
// Skip duplicate keys (keep first occurrence)
|
|
75
|
-
if (seenKeys.has(trimmedKey)) {
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
seenKeys.add(trimmedKey);
|
|
79
|
-
// Update or keep the line
|
|
80
|
-
if (trimmedKey === key) {
|
|
81
|
-
processedLines.push(`${key}=${value}`);
|
|
82
|
-
keyUpdated = true;
|
|
83
|
-
} else {
|
|
84
|
-
processedLines.push(line);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Add key if not present
|
|
88
|
-
if (!keyUpdated) {
|
|
89
|
-
processedLines.push(`${key}=${value}`);
|
|
90
91
|
}
|
|
91
|
-
|
|
92
|
+
return payloadSecret;
|
|
92
93
|
} catch (error) {
|
|
93
|
-
throw new Error(`Failed to
|
|
94
|
+
throw new Error(`Failed to manage environment files: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/env-management.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\n\n/**\n *
|
|
1
|
+
{"version":3,"sources":["../../src/utils/env-management.ts"],"sourcesContent":["import { randomBytes } from 'crypto'\nimport fs from 'fs/promises'\nimport path from 'path'\n\n/**\n * Generate a cryptographically secure secret for PAYLOAD_SECRET\n *\n * @returns 24-character hexadecimal string\n */\nexport function generateSecret(): string {\n return randomBytes(32).toString('hex').slice(0, 24)\n}\n\n/**\n * Sanitize and process environment file contents\n *\n * @param contents - Raw .env file contents\n * @param payloadSecret - Secret to use for PAYLOAD_SECRET\n * @returns Processed .env contents\n */\nfunction sanitizeEnv(contents: string, payloadSecret: string): string {\n const lines = contents.split('\\n')\n const seenKeys = new Set<string>()\n const processedLines: string[] = []\n\n for (const line of lines) {\n // Skip empty lines and comments\n if (!line.trim() || line.trim().startsWith('#')) {\n processedLines.push(line)\n continue\n }\n\n // Skip lines without =\n if (!line.includes('=')) {\n processedLines.push(line)\n continue\n }\n\n const [key] = line.split('=')\n const trimmedKey = key.trim()\n\n // Skip duplicate keys\n if (seenKeys.has(trimmedKey)) {\n continue\n }\n seenKeys.add(trimmedKey)\n\n // Replace PAYLOAD_SECRET with actual value\n if (trimmedKey === 'PAYLOAD_SECRET' || trimmedKey === 'PAYLOAD_SECRET_KEY') {\n processedLines.push(`PAYLOAD_SECRET=${payloadSecret}`)\n } else {\n processedLines.push(line)\n }\n }\n\n // Add PAYLOAD_SECRET if not present\n if (!seenKeys.has('PAYLOAD_SECRET') && !seenKeys.has('PAYLOAD_SECRET_KEY')) {\n processedLines.push(`PAYLOAD_SECRET=${payloadSecret}`)\n }\n\n return processedLines.join('\\n')\n}\n\n/**\n * Manage environment files for a new project\n *\n * Creates .env from .env.example (if exists) and populates PAYLOAD_SECRET\n *\n * @param projectPath - Path to project directory\n * @returns The generated payload secret\n */\nexport async function manageEnvFiles(projectPath: string): Promise<string> {\n const payloadSecret = generateSecret()\n const envExamplePath = path.join(projectPath, '.env.example')\n const envPath = path.join(projectPath, '.env')\n\n try {\n // Check if .env.example exists\n let envExampleContents = ''\n try {\n envExampleContents = await fs.readFile(envExamplePath, 'utf-8')\n } catch {\n // No .env.example, create minimal .env\n envExampleContents = ''\n }\n\n // Check if .env already exists\n let envExists = false\n try {\n await fs.access(envPath)\n envExists = true\n } catch {\n // .env doesn't exist\n }\n\n if (!envExists) {\n // Create .env from .env.example\n const sanitized = sanitizeEnv(envExampleContents, payloadSecret)\n await fs.writeFile(envPath, sanitized, 'utf-8')\n } else {\n // Update existing .env if it doesn't have PAYLOAD_SECRET\n const existingContents = await fs.readFile(envPath, 'utf-8')\n if (\n !existingContents.includes('PAYLOAD_SECRET=') &&\n !existingContents.includes('PAYLOAD_SECRET_KEY=')\n ) {\n const sanitized = sanitizeEnv(existingContents, payloadSecret)\n await fs.writeFile(envPath, sanitized, 'utf-8')\n }\n }\n\n return payloadSecret\n } catch (error) {\n throw new Error(\n `Failed to manage environment files: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n}\n"],"names":["randomBytes","fs","path","generateSecret","toString","slice","sanitizeEnv","contents","payloadSecret","lines","split","seenKeys","Set","processedLines","line","trim","startsWith","push","includes","key","trimmedKey","has","add","join","manageEnvFiles","projectPath","envExamplePath","envPath","envExampleContents","readFile","envExists","access","sanitized","writeFile","existingContents","error","Error","message"],"mappings":"AAAA,SAASA,WAAW,QAAQ,SAAQ;AACpC,OAAOC,QAAQ,cAAa;AAC5B,OAAOC,UAAU,OAAM;AAEvB;;;;CAIC,GACD,OAAO,SAASC;IACd,OAAOH,YAAY,IAAII,QAAQ,CAAC,OAAOC,KAAK,CAAC,GAAG;AAClD;AAEA;;;;;;CAMC,GACD,SAASC,YAAYC,QAAgB,EAAEC,aAAqB;IAC1D,MAAMC,QAAQF,SAASG,KAAK,CAAC;IAC7B,MAAMC,WAAW,IAAIC;IACrB,MAAMC,iBAA2B,EAAE;IAEnC,KAAK,MAAMC,QAAQL,MAAO;QACxB,gCAAgC;QAChC,IAAI,CAACK,KAAKC,IAAI,MAAMD,KAAKC,IAAI,GAAGC,UAAU,CAAC,MAAM;YAC/CH,eAAeI,IAAI,CAACH;YACpB;QACF;QAEA,uBAAuB;QACvB,IAAI,CAACA,KAAKI,QAAQ,CAAC,MAAM;YACvBL,eAAeI,IAAI,CAACH;YACpB;QACF;QAEA,MAAM,CAACK,IAAI,GAAGL,KAAKJ,KAAK,CAAC;QACzB,MAAMU,aAAaD,IAAIJ,IAAI;QAE3B,sBAAsB;QACtB,IAAIJ,SAASU,GAAG,CAACD,aAAa;YAC5B;QACF;QACAT,SAASW,GAAG,CAACF;QAEb,2CAA2C;QAC3C,IAAIA,eAAe,oBAAoBA,eAAe,sBAAsB;YAC1EP,eAAeI,IAAI,CAAC,CAAC,eAAe,EAAET,eAAe;QACvD,OAAO;YACLK,eAAeI,IAAI,CAACH;QACtB;IACF;IAEA,oCAAoC;IACpC,IAAI,CAACH,SAASU,GAAG,CAAC,qBAAqB,CAACV,SAASU,GAAG,CAAC,uBAAuB;QAC1ER,eAAeI,IAAI,CAAC,CAAC,eAAe,EAAET,eAAe;IACvD;IAEA,OAAOK,eAAeU,IAAI,CAAC;AAC7B;AAEA;;;;;;;CAOC,GACD,OAAO,eAAeC,eAAeC,WAAmB;IACtD,MAAMjB,gBAAgBL;IACtB,MAAMuB,iBAAiBxB,KAAKqB,IAAI,CAACE,aAAa;IAC9C,MAAME,UAAUzB,KAAKqB,IAAI,CAACE,aAAa;IAEvC,IAAI;QACF,+BAA+B;QAC/B,IAAIG,qBAAqB;QACzB,IAAI;YACFA,qBAAqB,MAAM3B,GAAG4B,QAAQ,CAACH,gBAAgB;QACzD,EAAE,OAAM;YACN,uCAAuC;YACvCE,qBAAqB;QACvB;QAEA,+BAA+B;QAC/B,IAAIE,YAAY;QAChB,IAAI;YACF,MAAM7B,GAAG8B,MAAM,CAACJ;YAChBG,YAAY;QACd,EAAE,OAAM;QACN,qBAAqB;QACvB;QAEA,IAAI,CAACA,WAAW;YACd,gCAAgC;YAChC,MAAME,YAAY1B,YAAYsB,oBAAoBpB;YAClD,MAAMP,GAAGgC,SAAS,CAACN,SAASK,WAAW;QACzC,OAAO;YACL,yDAAyD;YACzD,MAAME,mBAAmB,MAAMjC,GAAG4B,QAAQ,CAACF,SAAS;YACpD,IACE,CAACO,iBAAiBhB,QAAQ,CAAC,sBAC3B,CAACgB,iBAAiBhB,QAAQ,CAAC,wBAC3B;gBACA,MAAMc,YAAY1B,YAAY4B,kBAAkB1B;gBAChD,MAAMP,GAAGgC,SAAS,CAACN,SAASK,WAAW;YACzC;QACF;QAEA,OAAOxB;IACT,EAAE,OAAO2B,OAAO;QACd,MAAM,IAAIC,MACR,CAAC,oCAAoC,EAAED,iBAAiBC,QAAQD,MAAME,OAAO,GAAG,iBAAiB;IAErG;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,YAAY,CAAC,CAmCvB"}
|
package/dist/utils/formatter.js
CHANGED
|
@@ -6,7 +6,13 @@ import path from 'path';
|
|
|
6
6
|
*/ export async function formatFile(filePath, packageManager) {
|
|
7
7
|
return new Promise((resolve)=>{
|
|
8
8
|
try {
|
|
9
|
-
const
|
|
9
|
+
const args = [
|
|
10
|
+
'exec',
|
|
11
|
+
'prettier',
|
|
12
|
+
'--write',
|
|
13
|
+
filePath
|
|
14
|
+
];
|
|
15
|
+
const child = spawn(packageManager, args, {
|
|
10
16
|
cwd: path.dirname(filePath),
|
|
11
17
|
shell: true,
|
|
12
18
|
stdio: 'pipe'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/formatter.ts"],"sourcesContent":["import { spawn } from 'child_process'\nimport path from 'path'\n\nimport type { PackageManager } from './package-manager.js'\n\nexport type FormatResult = {\n success: boolean\n warning?: string\n}\n\n/**\n * Format file with Prettier\n * Returns warning if formatting fails but does not throw\n */\nexport async function formatFile(\n filePath: string,\n packageManager: PackageManager,\n): Promise<FormatResult> {\n return new Promise((resolve) => {\n try {\n const
|
|
1
|
+
{"version":3,"sources":["../../src/utils/formatter.ts"],"sourcesContent":["import { spawn } from 'child_process'\nimport path from 'path'\n\nimport type { PackageManager } from './package-manager.js'\n\nexport type FormatResult = {\n success: boolean\n warning?: string\n}\n\n/**\n * Format file with Prettier\n * Returns warning if formatting fails but does not throw\n */\nexport async function formatFile(\n filePath: string,\n packageManager: PackageManager,\n): Promise<FormatResult> {\n return new Promise((resolve) => {\n try {\n const args = ['exec', 'prettier', '--write', filePath]\n\n const child = spawn(packageManager, args, {\n cwd: path.dirname(filePath),\n shell: true,\n stdio: 'pipe',\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve({ success: true })\n } else {\n resolve({\n success: false,\n warning: 'Could not format file with Prettier',\n })\n }\n })\n\n child.on('error', () => {\n resolve({\n success: false,\n warning: 'Could not format file with Prettier',\n })\n })\n } catch {\n resolve({\n success: false,\n warning: 'Could not format file with Prettier',\n })\n }\n })\n}\n"],"names":["spawn","path","formatFile","filePath","packageManager","Promise","resolve","args","child","cwd","dirname","shell","stdio","on","code","success","warning"],"mappings":"AAAA,SAASA,KAAK,QAAQ,gBAAe;AACrC,OAAOC,UAAU,OAAM;AASvB;;;CAGC,GACD,OAAO,eAAeC,WACpBC,QAAgB,EAChBC,cAA8B;IAE9B,OAAO,IAAIC,QAAQ,CAACC;QAClB,IAAI;YACF,MAAMC,OAAO;gBAAC;gBAAQ;gBAAY;gBAAWJ;aAAS;YAEtD,MAAMK,QAAQR,MAAMI,gBAAgBG,MAAM;gBACxCE,KAAKR,KAAKS,OAAO,CAACP;gBAClBQ,OAAO;gBACPC,OAAO;YACT;YAEAJ,MAAMK,EAAE,CAAC,SAAS,CAACC;gBACjB,IAAIA,SAAS,GAAG;oBACdR,QAAQ;wBAAES,SAAS;oBAAK;gBAC1B,OAAO;oBACLT,QAAQ;wBACNS,SAAS;wBACTC,SAAS;oBACX;gBACF;YACF;YAEAR,MAAMK,EAAE,CAAC,SAAS;gBAChBP,QAAQ;oBACNS,SAAS;oBACTC,SAAS;gBACX;YACF;QACF,EAAE,OAAM;YACNV,QAAQ;gBACNS,SAAS;gBACTC,SAAS;YACX;QACF;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/utils/messages.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjD,wBAAgB,WAAW,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/utils/messages.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjD,wBAAgB,WAAW,IAAI,IAAI,CA2ClC;AASD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,CAiBzF;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAO3C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAgBpF;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/utils/messages.js
CHANGED
|
@@ -29,14 +29,16 @@ export function helpMessage() {
|
|
|
29
29
|
|
|
30
30
|
${pc.bold('INIT COMMAND')}
|
|
31
31
|
|
|
32
|
-
${pc.cyan('@payloadcms/figma init --id <
|
|
33
|
-
${pc.cyan('@payloadcms/figma init
|
|
32
|
+
${pc.cyan('@payloadcms/figma init --id <cms-id>')} Initialize project with CMS ID
|
|
33
|
+
${pc.cyan('@payloadcms/figma init')} Initialize (prompts for CMS ID)
|
|
34
|
+
${pc.cyan('@payloadcms/figma init --name my-cms')} Specify project name for new projects
|
|
35
|
+
${pc.cyan('@payloadcms/figma init --force')} Force reconfiguration of existing project
|
|
36
|
+
${pc.cyan('@payloadcms/figma init --skip-auth')} Skip authentication (testing only)
|
|
34
37
|
|
|
35
38
|
${pc.bold('DEPLOY COMMAND')}
|
|
36
39
|
|
|
37
|
-
${pc.cyan('@payloadcms/figma deploy')}
|
|
38
|
-
${pc.dim('--yes, -y')}
|
|
39
|
-
${pc.dim('--skip-build')} Skip building and use existing build
|
|
40
|
+
${pc.cyan('@payloadcms/figma deploy')} Deploy your project to Figma
|
|
41
|
+
${pc.dim('--yes, -y')} Skip confirmation prompts
|
|
40
42
|
|
|
41
43
|
${pc.bold('DOCUMENTATION')}
|
|
42
44
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/messages.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport path from 'path'\nimport pc from 'picocolors'\nimport terminalLink from 'terminal-link'\n\nimport type { PackageManager } from '../types.js'\n\nconst header = (message: string): string => pc.bold(message)\n\nexport function helpMessage(): void {\n console.log(`\n ${pc.bold('USAGE')}\n\n ${pc.dim('@payloadcms/figma <command> [options]')}\n\n ${pc.bold('COMMANDS')}\n\n ${pc.cyan('login')} Authenticate with Figma OAuth2\n ${pc.cyan('logout')} Clear all stored tokens\n ${pc.cyan('list-tokens')} Show stored token information\n ${pc.cyan('init')} Initialize a Figma CMS project\n ${pc.cyan('deploy')} Deploy your project to Figma\n\n ${pc.bold('OPTIONS')}\n\n ${pc.dim('-h, --help Show help')}\n ${pc.dim('--debug Enable debug logging')}\n\n ${pc.bold('AUTHENTICATION')}\n\n ${pc.cyan('@payloadcms/figma login')} Authenticate with Figma\n ${pc.cyan('@payloadcms/figma logout')} Clear all tokens (with confirmation)\n ${pc.cyan('@payloadcms/figma list-tokens')} Display stored OAuth and project tokens\n\n ${pc.bold('INIT COMMAND')}\n\n ${pc.cyan('@payloadcms/figma init --id <
|
|
1
|
+
{"version":3,"sources":["../../src/utils/messages.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport path from 'path'\nimport pc from 'picocolors'\nimport terminalLink from 'terminal-link'\n\nimport type { PackageManager } from '../types.js'\n\nconst header = (message: string): string => pc.bold(message)\n\nexport function helpMessage(): void {\n console.log(`\n ${pc.bold('USAGE')}\n\n ${pc.dim('@payloadcms/figma <command> [options]')}\n\n ${pc.bold('COMMANDS')}\n\n ${pc.cyan('login')} Authenticate with Figma OAuth2\n ${pc.cyan('logout')} Clear all stored tokens\n ${pc.cyan('list-tokens')} Show stored token information\n ${pc.cyan('init')} Initialize a Figma CMS project\n ${pc.cyan('deploy')} Deploy your project to Figma\n\n ${pc.bold('OPTIONS')}\n\n ${pc.dim('-h, --help Show help')}\n ${pc.dim('--debug Enable debug logging')}\n\n ${pc.bold('AUTHENTICATION')}\n\n ${pc.cyan('@payloadcms/figma login')} Authenticate with Figma\n ${pc.cyan('@payloadcms/figma logout')} Clear all tokens (with confirmation)\n ${pc.cyan('@payloadcms/figma list-tokens')} Display stored OAuth and project tokens\n\n ${pc.bold('INIT COMMAND')}\n\n ${pc.cyan('@payloadcms/figma init --id <cms-id>')} Initialize project with CMS ID\n ${pc.cyan('@payloadcms/figma init')} Initialize (prompts for CMS ID)\n ${pc.cyan('@payloadcms/figma init --name my-cms')} Specify project name for new projects\n ${pc.cyan('@payloadcms/figma init --force')} Force reconfiguration of existing project\n ${pc.cyan('@payloadcms/figma init --skip-auth')} Skip authentication (testing only)\n\n ${pc.bold('DEPLOY COMMAND')}\n\n ${pc.cyan('@payloadcms/figma deploy')} Deploy your project to Figma\n ${pc.dim('--yes, -y')} Skip confirmation prompts\n\n ${pc.bold('DOCUMENTATION')}\n\n ${createTerminalLink('Getting Started', 'https://payloadcms.com/docs/getting-started/what-is-payload')}\n ${createTerminalLink('Figma CMS Docs', 'https://www.figma.com/developers/api')}\n`)\n}\n\n// Create terminalLink with fallback for unsupported terminals\nfunction createTerminalLink(text: string, url: string) {\n return terminalLink(text, url, {\n fallback: (text, url) => `${text}: ${url}`,\n })\n}\n\nexport function successMessage(projectDir: string, packageManager: PackageManager): string {\n const relativePath = path.relative(process.cwd(), projectDir)\n return `\n${header('Launch Application:')}\n\n - cd ./${relativePath}\n - ${packageManager === 'npm' ? 'npm run' : packageManager} dev or follow directions in README.md\n\n${header('Documentation:')}\n\n - ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n - ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n\n`\n}\n\nexport function successfulNextInit(): string {\n return `- ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n- ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n`\n}\n\nexport function moveMessage(args: { nextAppDir: string; projectDir: string }): string {\n const relativeAppDir = path.relative(process.cwd(), args.nextAppDir)\n return `\n${header('Next Steps:')}\n\nPayload does not support a top-level layout.tsx file in the app directory.\n\n${pc.bold('To continue:')}\n\n- Create a new directory in ./${relativeAppDir} such as ./${relativeAppDir}/${pc.bold('(app)')}\n- Move all files from ./${relativeAppDir} into that directory\n\nIt is recommended to do this from your IDE if your app has existing file references.\n\nOnce moved, rerun the @payloadcms/figma command again.\n`\n}\n\nexport function feedbackOutro(): string {\n return `${pc.bgCyan(pc.black(' Have feedback? '))} Visit us on ${createTerminalLink('GitHub', 'https://github.com/payloadcms/payload')}.`\n}\n"],"names":["path","pc","terminalLink","header","message","bold","helpMessage","console","log","dim","cyan","createTerminalLink","text","url","fallback","successMessage","projectDir","packageManager","relativePath","relative","process","cwd","successfulNextInit","moveMessage","args","relativeAppDir","nextAppDir","feedbackOutro","bgCyan","black"],"mappings":"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"}
|
|
@@ -1,39 +1,19 @@
|
|
|
1
1
|
import type { SourceFile } from 'ts-morph';
|
|
2
|
-
/**
|
|
3
|
-
* Result of detecting what changes are needed in a payload config file
|
|
4
|
-
*/
|
|
5
2
|
export type DetectionResult = {
|
|
6
|
-
/** Database adapter configuration if present */
|
|
7
3
|
dbProperty?: {
|
|
8
|
-
/** Name of the adapter function (e.g., 'mongooseAdapter', 'postgresAdapter') */
|
|
9
4
|
adapter: string;
|
|
10
|
-
/** NPM package the adapter is imported from (e.g., '@payloadcms/db-mongodb') */
|
|
11
5
|
importSource: string;
|
|
12
6
|
};
|
|
13
|
-
/** Editor configuration if present */
|
|
14
7
|
editorProperty?: {
|
|
15
|
-
/** NPM package the editor is imported from (e.g., '@payloadcms/richtext-lexical') */
|
|
16
8
|
importSource: string;
|
|
17
|
-
/** Whether this is a default editor with no custom configuration */
|
|
18
9
|
isDefault: boolean;
|
|
19
10
|
};
|
|
20
|
-
/** Whether the config already has a `figma` property */
|
|
21
11
|
figmaObjectExists: boolean;
|
|
22
|
-
/** Whether buildConfig/buildFigmaConfig uses an import alias (e.g., 'buildConfig as createConfig') */
|
|
23
12
|
hasAlias: boolean;
|
|
24
|
-
/** Whether a buildConfig or buildFigmaConfig call was found (undefined if not checked) */
|
|
25
13
|
hasBuildConfig?: boolean;
|
|
26
|
-
/** Whether there are other imports from 'payload' besides buildConfig (e.g., types) */
|
|
27
14
|
hasOtherPayloadImports: boolean;
|
|
28
|
-
/** Whether the import needs to be changed from 'payload' to '@payloadcms/figma' */
|
|
29
15
|
needsImportChange: boolean;
|
|
30
|
-
/** Whether a `secret` property exists in the config */
|
|
31
16
|
secretProperty?: boolean;
|
|
32
|
-
/** Sharp configuration if present */
|
|
33
|
-
sharpProperty?: {
|
|
34
|
-
/** NPM package sharp is imported from (always 'sharp') */
|
|
35
|
-
importSource: string;
|
|
36
|
-
};
|
|
37
17
|
};
|
|
38
18
|
/**
|
|
39
19
|
* Detect what changes are needed in the payload config file
|
|
@@ -49,8 +29,9 @@ export type ASTModificationResult = {
|
|
|
49
29
|
*/
|
|
50
30
|
export declare function applyModifications(sourceFile: SourceFile, detection: DetectionResult): ASTModificationResult;
|
|
51
31
|
export type FigmaPropertyConfig = {
|
|
52
|
-
|
|
53
|
-
|
|
32
|
+
region: string;
|
|
33
|
+
tenantId: string;
|
|
34
|
+
useContentSystem: boolean;
|
|
54
35
|
};
|
|
55
36
|
/**
|
|
56
37
|
* Add figma property to buildConfig if it doesn't exist
|
|
@@ -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
|
|
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,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,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,CA0ElF"}
|