@payloadcms/figma 0.0.1-alpha.1 → 0.0.1-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/control-plane.d.ts.map +1 -1
- package/dist/api/control-plane.js +2 -7
- package/dist/api/control-plane.js.map +1 -1
- package/dist/api/figma-api.js +3 -3
- package/dist/api/figma-api.js.map +1 -1
- package/dist/auth/jwt-validator.js.map +1 -1
- package/dist/auth/oauth-flow.d.ts.map +1 -1
- package/dist/auth/oauth-flow.js +3 -6
- 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 +1 -4
- package/dist/auth/project-token.js.map +1 -1
- package/dist/auth/refresh.d.ts.map +1 -1
- package/dist/auth/refresh.js +19 -28
- package/dist/auth/refresh.js.map +1 -1
- package/dist/auth/types.d.ts +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli.js +1 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +17 -10
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -85
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list-tokens.d.ts +1 -1
- package/dist/commands/list-tokens.d.ts.map +1 -1
- package/dist/commands/list-tokens.js +6 -5
- package/dist/commands/list-tokens.js.map +1 -1
- package/dist/commands/login.d.ts +2 -11
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +4 -7
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- 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 +9 -0
- package/dist/oauth/components/LoginButton/index.d.ts.map +1 -0
- package/dist/oauth/components/LoginButton/index.js +52 -0
- package/dist/oauth/components/LoginButton/index.js.map +1 -0
- package/dist/oauth/components/LoginButton/index.scss +10 -0
- package/dist/oauth/components/LogoutButton/index.d.ts +7 -0
- package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -0
- package/dist/oauth/components/LogoutButton/index.js +67 -0
- package/dist/oauth/components/LogoutButton/index.js.map +1 -0
- package/dist/oauth/components/LogoutButton/index.scss +10 -0
- package/dist/oauth/defaults.d.ts +10 -0
- package/dist/oauth/defaults.d.ts.map +1 -0
- package/dist/oauth/defaults.js +91 -0
- package/dist/oauth/defaults.js.map +1 -0
- package/dist/oauth/endpoints/getLoginEndpoint.d.ts +13 -0
- package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -0
- package/dist/oauth/endpoints/getLoginEndpoint.js +237 -0
- package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -0
- package/dist/oauth/endpoints/getLogoutEndpoint.d.ts +12 -0
- package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +1 -0
- package/dist/oauth/endpoints/getLogoutEndpoint.js +99 -0
- package/dist/oauth/endpoints/getLogoutEndpoint.js.map +1 -0
- package/dist/oauth/endpoints/getMetaEndpoint.d.ts +13 -0
- package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +1 -0
- package/dist/oauth/endpoints/getMetaEndpoint.js +25 -0
- package/dist/oauth/endpoints/getMetaEndpoint.js.map +1 -0
- package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts +13 -0
- package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +1 -0
- package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js +21 -0
- package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +1 -0
- package/dist/oauth/exports/client.d.ts +3 -0
- package/dist/oauth/exports/client.d.ts.map +1 -0
- package/dist/oauth/exports/client.js +4 -0
- package/dist/oauth/exports/client.js.map +1 -0
- package/dist/oauth/hooks/afterLogout.d.ts +8 -0
- package/dist/oauth/hooks/afterLogout.d.ts.map +1 -0
- package/dist/oauth/hooks/afterLogout.js +27 -0
- package/dist/oauth/hooks/afterLogout.js.map +1 -0
- package/dist/oauth/hooks/me.d.ts +5 -0
- package/dist/oauth/hooks/me.d.ts.map +1 -0
- package/dist/oauth/hooks/me.js +55 -0
- package/dist/oauth/hooks/me.js.map +1 -0
- package/dist/oauth/hooks/refresh.d.ts +8 -0
- package/dist/oauth/hooks/refresh.d.ts.map +1 -0
- package/dist/oauth/hooks/refresh.js +91 -0
- package/dist/oauth/hooks/refresh.js.map +1 -0
- package/dist/oauth/index.d.ts +4 -0
- package/dist/oauth/index.d.ts.map +1 -0
- package/dist/oauth/index.js +222 -0
- package/dist/oauth/index.js.map +1 -0
- package/dist/oauth/strategy/index.d.ts +54 -0
- package/dist/oauth/strategy/index.d.ts.map +1 -0
- package/dist/oauth/strategy/index.js +280 -0
- package/dist/oauth/strategy/index.js.map +1 -0
- package/dist/oauth/types.d.ts +192 -0
- package/dist/oauth/types.d.ts.map +1 -0
- package/dist/oauth/types.js +3 -0
- package/dist/oauth/types.js.map +1 -0
- package/dist/oauth/utilities/clearCookie.d.ts +9 -0
- package/dist/oauth/utilities/clearCookie.d.ts.map +1 -0
- package/dist/oauth/utilities/clearCookie.js +21 -0
- package/dist/oauth/utilities/clearCookie.js.map +1 -0
- package/dist/oauth/utilities/createCookieOptions.d.ts +10 -0
- package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -0
- package/dist/oauth/utilities/createCookieOptions.js +42 -0
- package/dist/oauth/utilities/createCookieOptions.js.map +1 -0
- package/dist/oauth/utilities/createDebugLogger.d.ts +4 -0
- package/dist/oauth/utilities/createDebugLogger.d.ts.map +1 -0
- package/dist/oauth/utilities/createDebugLogger.js +16 -0
- package/dist/oauth/utilities/createDebugLogger.js.map +1 -0
- package/dist/oauth/utilities/extractOrigin.d.ts +2 -0
- package/dist/oauth/utilities/extractOrigin.d.ts.map +1 -0
- package/dist/oauth/utilities/extractOrigin.js +12 -0
- package/dist/oauth/utilities/extractOrigin.js.map +1 -0
- package/dist/oauth/utilities/getAdminCollectionSlug.d.ts +3 -0
- package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +1 -0
- package/dist/oauth/utilities/getAdminCollectionSlug.js +18 -0
- package/dist/oauth/utilities/getAdminCollectionSlug.js.map +1 -0
- package/dist/oauth/utilities/getAdminPath.d.ts +8 -0
- package/dist/oauth/utilities/getAdminPath.d.ts.map +1 -0
- package/dist/oauth/utilities/getAdminPath.js +9 -0
- package/dist/oauth/utilities/getAdminPath.js.map +1 -0
- package/dist/oauth/utilities/getAuthorizeURL.d.ts +17 -0
- package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +1 -0
- package/dist/oauth/utilities/getAuthorizeURL.js +45 -0
- package/dist/oauth/utilities/getAuthorizeURL.js.map +1 -0
- package/dist/oauth/utilities/getCookieExpiration.d.ts +4 -0
- package/dist/oauth/utilities/getCookieExpiration.d.ts.map +1 -0
- package/dist/oauth/utilities/getCookieExpiration.js +11 -0
- package/dist/oauth/utilities/getCookieExpiration.js.map +1 -0
- package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts +2 -0
- package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +1 -0
- package/dist/oauth/utilities/getSecondsFromTokenExp.js +7 -0
- package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +1 -0
- package/dist/oauth/utilities/getTokenExp.d.ts +6 -0
- package/dist/oauth/utilities/getTokenExp.d.ts.map +1 -0
- package/dist/oauth/utilities/getTokenExp.js +20 -0
- package/dist/oauth/utilities/getTokenExp.js.map +1 -0
- package/dist/oauth/utilities/getUsernameField.d.ts +9 -0
- package/dist/oauth/utilities/getUsernameField.d.ts.map +1 -0
- package/dist/oauth/utilities/getUsernameField.js +20 -0
- package/dist/oauth/utilities/getUsernameField.js.map +1 -0
- package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts +8 -0
- package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +1 -0
- package/dist/oauth/utilities/hasUserTokenPropsChanged.js +25 -0
- package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +1 -0
- package/dist/oauth/utilities/mergeHeaders.d.ts +2 -0
- package/dist/oauth/utilities/mergeHeaders.d.ts.map +1 -0
- package/dist/oauth/utilities/mergeHeaders.js +37 -0
- package/dist/oauth/utilities/mergeHeaders.js.map +1 -0
- package/dist/oauth/utilities/refreshTokens.d.ts +16 -0
- package/dist/oauth/utilities/refreshTokens.d.ts.map +1 -0
- package/dist/oauth/utilities/refreshTokens.js +67 -0
- package/dist/oauth/utilities/refreshTokens.js.map +1 -0
- package/dist/plugin/build-config.d.ts +7 -1
- package/dist/plugin/build-config.d.ts.map +1 -1
- package/dist/plugin/build-config.js +29 -2
- package/dist/plugin/build-config.js.map +1 -1
- package/dist/types/config.d.ts +0 -11
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/utils/config.d.ts +0 -22
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +0 -46
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/messages.js +11 -11
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/payload-config-ast.d.ts +17 -1
- package/dist/utils/payload-config-ast.d.ts.map +1 -1
- package/dist/utils/payload-config-ast.js +166 -14
- package/dist/utils/payload-config-ast.js.map +1 -1
- package/dist/utils/payload-config-modifier.d.ts +2 -1
- package/dist/utils/payload-config-modifier.d.ts.map +1 -1
- package/dist/utils/payload-config-modifier.js +50 -79
- package/dist/utils/payload-config-modifier.js.map +1 -1
- package/dist/utils/payload-package-check.d.ts.map +1 -1
- package/dist/utils/payload-package-check.js +14 -33
- package/dist/utils/payload-package-check.js.map +1 -1
- package/dist/utils/project.d.ts +1 -1
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +3 -5
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/s3-upload.d.ts.map +1 -1
- package/dist/utils/s3-upload.js +3 -8
- 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 +3 -2
- package/dist/utils/token-display.js.map +1 -1
- package/package.json +9 -3
- package/dist/api/control-plane.spec.d.ts +0 -2
- package/dist/api/control-plane.spec.d.ts.map +0 -1
- package/dist/api/control-plane.spec.js +0 -296
- package/dist/api/control-plane.spec.js.map +0 -1
- package/dist/api/figma-api.spec.d.ts +0 -14
- package/dist/api/figma-api.spec.d.ts.map +0 -1
- package/dist/api/figma-api.spec.js +0 -201
- package/dist/api/figma-api.spec.js.map +0 -1
- package/dist/auth/__tests__/fixtures.d.ts +0 -26
- package/dist/auth/__tests__/fixtures.d.ts.map +0 -1
- package/dist/auth/__tests__/fixtures.js +0 -67
- package/dist/auth/__tests__/fixtures.js.map +0 -1
- package/dist/auth/__tests__/mocks.d.ts +0 -33
- package/dist/auth/__tests__/mocks.d.ts.map +0 -1
- package/dist/auth/__tests__/mocks.js +0 -63
- package/dist/auth/__tests__/mocks.js.map +0 -1
- package/dist/auth/callback-server.spec.d.ts +0 -2
- package/dist/auth/callback-server.spec.d.ts.map +0 -1
- package/dist/auth/callback-server.spec.js +0 -85
- package/dist/auth/callback-server.spec.js.map +0 -1
- package/dist/auth/crypto-utils.spec.d.ts +0 -2
- package/dist/auth/crypto-utils.spec.d.ts.map +0 -1
- package/dist/auth/crypto-utils.spec.js +0 -36
- package/dist/auth/crypto-utils.spec.js.map +0 -1
- package/dist/auth/jwt-validator.spec.d.ts +0 -10
- package/dist/auth/jwt-validator.spec.d.ts.map +0 -1
- package/dist/auth/jwt-validator.spec.js +0 -236
- package/dist/auth/jwt-validator.spec.js.map +0 -1
- package/dist/auth/oauth-flow.spec.d.ts +0 -2
- package/dist/auth/oauth-flow.spec.d.ts.map +0 -1
- package/dist/auth/oauth-flow.spec.js +0 -134
- package/dist/auth/oauth-flow.spec.js.map +0 -1
- package/dist/auth/pkce.spec.d.ts +0 -2
- package/dist/auth/pkce.spec.d.ts.map +0 -1
- package/dist/auth/pkce.spec.js +0 -32
- package/dist/auth/pkce.spec.js.map +0 -1
- package/dist/auth/project-token.spec.d.ts +0 -2
- package/dist/auth/project-token.spec.d.ts.map +0 -1
- package/dist/auth/project-token.spec.js +0 -332
- package/dist/auth/project-token.spec.js.map +0 -1
- package/dist/auth/refresh.spec.d.ts +0 -2
- package/dist/auth/refresh.spec.d.ts.map +0 -1
- package/dist/auth/refresh.spec.js +0 -105
- package/dist/auth/refresh.spec.js.map +0 -1
- package/dist/auth/token-store.spec.d.ts +0 -2
- package/dist/auth/token-store.spec.d.ts.map +0 -1
- package/dist/auth/token-store.spec.js +0 -276
- package/dist/auth/token-store.spec.js.map +0 -1
- package/dist/commands/__tests__/test-utils.d.ts +0 -28
- package/dist/commands/__tests__/test-utils.d.ts.map +0 -1
- package/dist/commands/__tests__/test-utils.js +0 -34
- package/dist/commands/__tests__/test-utils.js.map +0 -1
- package/dist/commands/deploy.spec.d.ts +0 -2
- package/dist/commands/deploy.spec.d.ts.map +0 -1
- package/dist/commands/deploy.spec.js +0 -18
- package/dist/commands/deploy.spec.js.map +0 -1
- package/dist/commands/init.spec.d.ts +0 -2
- package/dist/commands/init.spec.d.ts.map +0 -1
- package/dist/commands/init.spec.js +0 -283
- package/dist/commands/init.spec.js.map +0 -1
- package/dist/plugin/build-config.spec.d.ts +0 -2
- package/dist/plugin/build-config.spec.d.ts.map +0 -1
- package/dist/plugin/build-config.spec.js +0 -72
- package/dist/plugin/build-config.spec.js.map +0 -1
- package/dist/utils/asset-collection.spec.d.ts +0 -2
- package/dist/utils/asset-collection.spec.d.ts.map +0 -1
- package/dist/utils/asset-collection.spec.js +0 -155
- package/dist/utils/asset-collection.spec.js.map +0 -1
- package/dist/utils/build-detection.spec.d.ts +0 -2
- package/dist/utils/build-detection.spec.d.ts.map +0 -1
- package/dist/utils/build-detection.spec.js +0 -110
- package/dist/utils/build-detection.spec.js.map +0 -1
- package/dist/utils/config.spec.d.ts +0 -2
- package/dist/utils/config.spec.d.ts.map +0 -1
- package/dist/utils/config.spec.js +0 -167
- package/dist/utils/config.spec.js.map +0 -1
- package/dist/utils/download-template.spec.d.ts +0 -2
- package/dist/utils/download-template.spec.d.ts.map +0 -1
- package/dist/utils/download-template.spec.js +0 -76
- package/dist/utils/download-template.spec.js.map +0 -1
- package/dist/utils/env-management.spec.d.ts +0 -2
- package/dist/utils/env-management.spec.d.ts.map +0 -1
- package/dist/utils/env-management.spec.js +0 -123
- package/dist/utils/env-management.spec.js.map +0 -1
- package/dist/utils/git.spec.d.ts +0 -2
- package/dist/utils/git.spec.d.ts.map +0 -1
- package/dist/utils/git.spec.js +0 -99
- package/dist/utils/git.spec.js.map +0 -1
- package/dist/utils/lambda-config.spec.d.ts +0 -2
- package/dist/utils/lambda-config.spec.d.ts.map +0 -1
- package/dist/utils/lambda-config.spec.js +0 -141
- package/dist/utils/lambda-config.spec.js.map +0 -1
- package/dist/utils/payload-config-ast.spec.d.ts +0 -2
- package/dist/utils/payload-config-ast.spec.d.ts.map +0 -1
- package/dist/utils/payload-config-ast.spec.js +0 -303
- package/dist/utils/payload-config-ast.spec.js.map +0 -1
- package/dist/utils/payload-config-modifier.int.spec.d.ts +0 -2
- package/dist/utils/payload-config-modifier.int.spec.d.ts.map +0 -1
- package/dist/utils/payload-config-modifier.int.spec.js +0 -116
- package/dist/utils/payload-config-modifier.int.spec.js.map +0 -1
- package/dist/utils/payload-config-modifier.spec.d.ts +0 -2
- package/dist/utils/payload-config-modifier.spec.d.ts.map +0 -1
- package/dist/utils/payload-config-modifier.spec.js +0 -162
- package/dist/utils/payload-config-modifier.spec.js.map +0 -1
- package/dist/utils/payload-package-check.spec.d.ts +0 -2
- package/dist/utils/payload-package-check.spec.d.ts.map +0 -1
- package/dist/utils/payload-package-check.spec.js +0 -148
- package/dist/utils/payload-package-check.spec.js.map +0 -1
- package/dist/utils/project.spec.d.ts +0 -2
- package/dist/utils/project.spec.d.ts.map +0 -1
- package/dist/utils/project.spec.js +0 -222
- package/dist/utils/project.spec.js.map +0 -1
- package/dist/utils/s3-upload.spec.d.ts +0 -2
- package/dist/utils/s3-upload.spec.d.ts.map +0 -1
- package/dist/utils/s3-upload.spec.js +0 -140
- package/dist/utils/s3-upload.spec.js.map +0 -1
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { detectPayloadProject, validatePayloadVersion } from './project.js';
|
|
5
|
-
describe('project utilities', ()=>{
|
|
6
|
-
let testDir;
|
|
7
|
-
beforeEach(async ()=>{
|
|
8
|
-
// Create unique temp directory for each test
|
|
9
|
-
testDir = path.join(process.cwd(), '.test-tmp', `project-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`);
|
|
10
|
-
await fs.mkdir(testDir, {
|
|
11
|
-
recursive: true
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
afterEach(async ()=>{
|
|
15
|
-
// Clean up test directory
|
|
16
|
-
try {
|
|
17
|
-
await fs.rm(testDir, {
|
|
18
|
-
force: true,
|
|
19
|
-
recursive: true
|
|
20
|
-
});
|
|
21
|
-
} catch {
|
|
22
|
-
// Ignore cleanup errors
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
describe('detectPayloadProject', ()=>{
|
|
26
|
-
it('should detect project with payload in dependencies', async ()=>{
|
|
27
|
-
const packageJson = {
|
|
28
|
-
name: 'test-project',
|
|
29
|
-
dependencies: {
|
|
30
|
-
next: '^15.0.0',
|
|
31
|
-
payload: '^3.54.0'
|
|
32
|
-
},
|
|
33
|
-
version: '1.0.0'
|
|
34
|
-
};
|
|
35
|
-
await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
|
|
36
|
-
const result = await detectPayloadProject(testDir);
|
|
37
|
-
expect(result.hasPayload).toBe(true);
|
|
38
|
-
expect(result.payloadVersion).toBe('^3.54.0');
|
|
39
|
-
expect(result.path).toBe(testDir);
|
|
40
|
-
});
|
|
41
|
-
it('should detect project with payload in devDependencies', async ()=>{
|
|
42
|
-
const packageJson = {
|
|
43
|
-
name: 'test-project',
|
|
44
|
-
devDependencies: {
|
|
45
|
-
payload: '3.50.0'
|
|
46
|
-
},
|
|
47
|
-
version: '1.0.0'
|
|
48
|
-
};
|
|
49
|
-
await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
|
|
50
|
-
const result = await detectPayloadProject(testDir);
|
|
51
|
-
expect(result.hasPayload).toBe(true);
|
|
52
|
-
expect(result.payloadVersion).toBe('3.50.0');
|
|
53
|
-
});
|
|
54
|
-
it('should return false if no payload dependency', async ()=>{
|
|
55
|
-
const packageJson = {
|
|
56
|
-
name: 'test-project',
|
|
57
|
-
dependencies: {
|
|
58
|
-
next: '^15.0.0',
|
|
59
|
-
react: '^19.0.0'
|
|
60
|
-
},
|
|
61
|
-
version: '1.0.0'
|
|
62
|
-
};
|
|
63
|
-
await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
|
|
64
|
-
const result = await detectPayloadProject(testDir);
|
|
65
|
-
expect(result.hasPayload).toBe(false);
|
|
66
|
-
expect(result.payloadVersion).toBeUndefined();
|
|
67
|
-
});
|
|
68
|
-
it('should return false if no package.json exists', async ()=>{
|
|
69
|
-
const result = await detectPayloadProject(testDir);
|
|
70
|
-
expect(result.hasPayload).toBe(false);
|
|
71
|
-
expect(result.payloadVersion).toBeUndefined();
|
|
72
|
-
});
|
|
73
|
-
it('should detect pnpm as package manager', async ()=>{
|
|
74
|
-
const packageJson = {
|
|
75
|
-
name: 'test-project',
|
|
76
|
-
dependencies: {
|
|
77
|
-
payload: '^3.0.0'
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
|
|
81
|
-
await fs.writeFile(path.join(testDir, 'pnpm-lock.yaml'), '', 'utf-8');
|
|
82
|
-
const result = await detectPayloadProject(testDir);
|
|
83
|
-
expect(result.packageManager).toBe('pnpm');
|
|
84
|
-
});
|
|
85
|
-
it('should detect yarn as package manager', async ()=>{
|
|
86
|
-
const packageJson = {
|
|
87
|
-
name: 'test-project',
|
|
88
|
-
dependencies: {
|
|
89
|
-
payload: '^3.0.0'
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
|
|
93
|
-
await fs.writeFile(path.join(testDir, 'yarn.lock'), '', 'utf-8');
|
|
94
|
-
const result = await detectPayloadProject(testDir);
|
|
95
|
-
expect(result.packageManager).toBe('yarn');
|
|
96
|
-
});
|
|
97
|
-
it('should default to npm as package manager', async ()=>{
|
|
98
|
-
const packageJson = {
|
|
99
|
-
name: 'test-project',
|
|
100
|
-
dependencies: {
|
|
101
|
-
payload: '^3.0.0'
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
|
|
105
|
-
const result = await detectPayloadProject(testDir);
|
|
106
|
-
expect(result.packageManager).toBe('npm');
|
|
107
|
-
});
|
|
108
|
-
it('should handle invalid package.json', async ()=>{
|
|
109
|
-
await fs.writeFile(path.join(testDir, 'package.json'), 'invalid json{', 'utf-8');
|
|
110
|
-
await expect(detectPayloadProject(testDir)).rejects.toThrow('Failed to read package.json');
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
describe('validatePayloadVersion', ()=>{
|
|
114
|
-
it('should accept version 3.x.x', ()=>{
|
|
115
|
-
expect(validatePayloadVersion('3.54.0')).toBe(true);
|
|
116
|
-
expect(validatePayloadVersion('3.0.0')).toBe(true);
|
|
117
|
-
expect(validatePayloadVersion('3.100.999')).toBe(true);
|
|
118
|
-
});
|
|
119
|
-
it('should accept version with caret', ()=>{
|
|
120
|
-
expect(validatePayloadVersion('^3.54.0')).toBe(true);
|
|
121
|
-
expect(validatePayloadVersion('^3.0.0')).toBe(true);
|
|
122
|
-
});
|
|
123
|
-
it('should accept version with tilde', ()=>{
|
|
124
|
-
expect(validatePayloadVersion('~3.54.0')).toBe(true);
|
|
125
|
-
expect(validatePayloadVersion('~3.0.0')).toBe(true);
|
|
126
|
-
});
|
|
127
|
-
it('should reject version 2.x.x', ()=>{
|
|
128
|
-
expect(validatePayloadVersion('2.54.0')).toBe(false);
|
|
129
|
-
expect(validatePayloadVersion('^2.0.0')).toBe(false);
|
|
130
|
-
});
|
|
131
|
-
it('should reject version 4.x.x', ()=>{
|
|
132
|
-
expect(validatePayloadVersion('4.0.0')).toBe(false);
|
|
133
|
-
expect(validatePayloadVersion('^4.0.0')).toBe(false);
|
|
134
|
-
});
|
|
135
|
-
it('should reject invalid version strings', ()=>{
|
|
136
|
-
expect(validatePayloadVersion('invalid')).toBe(false);
|
|
137
|
-
expect(validatePayloadVersion('x.y.z')).toBe(false);
|
|
138
|
-
expect(validatePayloadVersion('')).toBe(false);
|
|
139
|
-
});
|
|
140
|
-
it('should handle version ranges', ()=>{
|
|
141
|
-
expect(validatePayloadVersion('>=3.0.0')).toBe(true);
|
|
142
|
-
expect(validatePayloadVersion('>=3.0.0 <4.0.0')).toBe(true);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
describe('scaffoldProject', ()=>{
|
|
146
|
-
it('should create project directory if it does not exist', async ()=>{
|
|
147
|
-
const { scaffoldProject } = await import('./project.js');
|
|
148
|
-
const newDir = path.join(testDir, 'new-project');
|
|
149
|
-
// Note: This will fail in test because template files don't exist in dist during test
|
|
150
|
-
// We're testing the directory creation part
|
|
151
|
-
try {
|
|
152
|
-
await scaffoldProject(newDir, 'test-project');
|
|
153
|
-
} catch {
|
|
154
|
-
// Expected to fail when trying to read templates
|
|
155
|
-
// But directory should still be created
|
|
156
|
-
}
|
|
157
|
-
const exists = await fs.access(newDir).then(()=>true).catch(()=>false);
|
|
158
|
-
expect(exists).toBe(true);
|
|
159
|
-
});
|
|
160
|
-
it('should replace workspace versions with actual npm versions', async ()=>{
|
|
161
|
-
const projectDir = path.join(testDir, 'workspace-test');
|
|
162
|
-
await fs.mkdir(projectDir, {
|
|
163
|
-
recursive: true
|
|
164
|
-
});
|
|
165
|
-
// Create a mock package.json with workspace versions
|
|
166
|
-
const mockPackageJson = {
|
|
167
|
-
name: 'template-name',
|
|
168
|
-
dependencies: {
|
|
169
|
-
'@payloadcms/db-mongodb': 'workspace:^',
|
|
170
|
-
'@payloadcms/richtext-lexical': 'workspace:*',
|
|
171
|
-
next: '^15.0.0',
|
|
172
|
-
payload: 'workspace:*'
|
|
173
|
-
},
|
|
174
|
-
devDependencies: {
|
|
175
|
-
'@payloadcms/graphql': 'workspace:*',
|
|
176
|
-
typescript: '^5.0.0'
|
|
177
|
-
},
|
|
178
|
-
version: '1.0.0'
|
|
179
|
-
};
|
|
180
|
-
await fs.writeFile(path.join(projectDir, 'package.json'), JSON.stringify(mockPackageJson, null, 2));
|
|
181
|
-
// Mock fetch to return a version
|
|
182
|
-
const mockFetch = vi.fn().mockResolvedValue({
|
|
183
|
-
json: ()=>Promise.resolve({
|
|
184
|
-
latest: '3.0.0'
|
|
185
|
-
}),
|
|
186
|
-
ok: true
|
|
187
|
-
});
|
|
188
|
-
global.fetch = mockFetch;
|
|
189
|
-
// Mock downloadTemplateFromGitHub to do nothing (already have package.json)
|
|
190
|
-
const downloadMock = vi.fn().mockResolvedValue(undefined);
|
|
191
|
-
vi.doMock('./download-template.js', ()=>({
|
|
192
|
-
downloadTemplateFromGitHub: downloadMock
|
|
193
|
-
}));
|
|
194
|
-
// Mock applyLambdaModifications to do nothing
|
|
195
|
-
const lambdaMock = vi.fn().mockResolvedValue(undefined);
|
|
196
|
-
vi.doMock('./lambda-config.js', ()=>({
|
|
197
|
-
applyLambdaModifications: lambdaMock
|
|
198
|
-
}));
|
|
199
|
-
// Re-import to get mocked version
|
|
200
|
-
vi.resetModules();
|
|
201
|
-
const { scaffoldProject } = await import('./project.js');
|
|
202
|
-
await scaffoldProject(projectDir, 'my-project');
|
|
203
|
-
// Read the updated package.json
|
|
204
|
-
const updatedPackageJson = JSON.parse(await fs.readFile(path.join(projectDir, 'package.json'), 'utf-8'));
|
|
205
|
-
// Verify name was updated
|
|
206
|
-
expect(updatedPackageJson.name).toBe('my-project');
|
|
207
|
-
// Verify workspace versions were replaced
|
|
208
|
-
expect(updatedPackageJson.dependencies.payload).toBe('3.0.0');
|
|
209
|
-
expect(updatedPackageJson.dependencies['@payloadcms/db-mongodb']).toBe('3.0.0');
|
|
210
|
-
expect(updatedPackageJson.dependencies['@payloadcms/richtext-lexical']).toBe('3.0.0');
|
|
211
|
-
// Verify non-payload packages unchanged
|
|
212
|
-
expect(updatedPackageJson.dependencies.next).toBe('^15.0.0');
|
|
213
|
-
// Verify devDependencies
|
|
214
|
-
expect(updatedPackageJson.devDependencies['@payloadcms/graphql']).toBe('3.0.0');
|
|
215
|
-
expect(updatedPackageJson.devDependencies.typescript).toBe('^5.0.0');
|
|
216
|
-
// Verify npm registry was called
|
|
217
|
-
expect(mockFetch).toHaveBeenCalledWith('https://registry.npmjs.org/-/package/payload/dist-tags');
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
//# sourceMappingURL=project.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/project.spec.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { detectPayloadProject, validatePayloadVersion } from './project.js'\n\ndescribe('project utilities', () => {\n let testDir: string\n\n beforeEach(async () => {\n // Create unique temp directory for each test\n testDir = path.join(\n process.cwd(),\n '.test-tmp',\n `project-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n )\n await fs.mkdir(testDir, { recursive: true })\n })\n\n afterEach(async () => {\n // Clean up test directory\n try {\n await fs.rm(testDir, { force: true, recursive: true })\n } catch {\n // Ignore cleanup errors\n }\n })\n\n describe('detectPayloadProject', () => {\n it('should detect project with payload in dependencies', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: {\n next: '^15.0.0',\n payload: '^3.54.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(true)\n expect(result.payloadVersion).toBe('^3.54.0')\n expect(result.path).toBe(testDir)\n })\n\n it('should detect project with payload in devDependencies', async () => {\n const packageJson = {\n name: 'test-project',\n devDependencies: {\n payload: '3.50.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(true)\n expect(result.payloadVersion).toBe('3.50.0')\n })\n\n it('should return false if no payload dependency', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: {\n next: '^15.0.0',\n react: '^19.0.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(false)\n expect(result.payloadVersion).toBeUndefined()\n })\n\n it('should return false if no package.json exists', async () => {\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(false)\n expect(result.payloadVersion).toBeUndefined()\n })\n\n it('should detect pnpm as package manager', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: { payload: '^3.0.0' },\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n await fs.writeFile(path.join(testDir, 'pnpm-lock.yaml'), '', 'utf-8')\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.packageManager).toBe('pnpm')\n })\n\n it('should detect yarn as package manager', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: { payload: '^3.0.0' },\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n await fs.writeFile(path.join(testDir, 'yarn.lock'), '', 'utf-8')\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.packageManager).toBe('yarn')\n })\n\n it('should default to npm as package manager', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: { payload: '^3.0.0' },\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.packageManager).toBe('npm')\n })\n\n it('should handle invalid package.json', async () => {\n await fs.writeFile(path.join(testDir, 'package.json'), 'invalid json{', 'utf-8')\n\n await expect(detectPayloadProject(testDir)).rejects.toThrow('Failed to read package.json')\n })\n })\n\n describe('validatePayloadVersion', () => {\n it('should accept version 3.x.x', () => {\n expect(validatePayloadVersion('3.54.0')).toBe(true)\n expect(validatePayloadVersion('3.0.0')).toBe(true)\n expect(validatePayloadVersion('3.100.999')).toBe(true)\n })\n\n it('should accept version with caret', () => {\n expect(validatePayloadVersion('^3.54.0')).toBe(true)\n expect(validatePayloadVersion('^3.0.0')).toBe(true)\n })\n\n it('should accept version with tilde', () => {\n expect(validatePayloadVersion('~3.54.0')).toBe(true)\n expect(validatePayloadVersion('~3.0.0')).toBe(true)\n })\n\n it('should reject version 2.x.x', () => {\n expect(validatePayloadVersion('2.54.0')).toBe(false)\n expect(validatePayloadVersion('^2.0.0')).toBe(false)\n })\n\n it('should reject version 4.x.x', () => {\n expect(validatePayloadVersion('4.0.0')).toBe(false)\n expect(validatePayloadVersion('^4.0.0')).toBe(false)\n })\n\n it('should reject invalid version strings', () => {\n expect(validatePayloadVersion('invalid')).toBe(false)\n expect(validatePayloadVersion('x.y.z')).toBe(false)\n expect(validatePayloadVersion('')).toBe(false)\n })\n\n it('should handle version ranges', () => {\n expect(validatePayloadVersion('>=3.0.0')).toBe(true)\n expect(validatePayloadVersion('>=3.0.0 <4.0.0')).toBe(true)\n })\n })\n\n describe('scaffoldProject', () => {\n it('should create project directory if it does not exist', async () => {\n const { scaffoldProject } = await import('./project.js')\n const newDir = path.join(testDir, 'new-project')\n\n // Note: This will fail in test because template files don't exist in dist during test\n // We're testing the directory creation part\n try {\n await scaffoldProject(newDir, 'test-project')\n } catch {\n // Expected to fail when trying to read templates\n // But directory should still be created\n }\n\n const exists = await fs\n .access(newDir)\n .then(() => true)\n .catch(() => false)\n expect(exists).toBe(true)\n })\n\n it('should replace workspace versions with actual npm versions', async () => {\n const projectDir = path.join(testDir, 'workspace-test')\n await fs.mkdir(projectDir, { recursive: true })\n\n // Create a mock package.json with workspace versions\n const mockPackageJson = {\n name: 'template-name',\n dependencies: {\n '@payloadcms/db-mongodb': 'workspace:^',\n '@payloadcms/richtext-lexical': 'workspace:*',\n next: '^15.0.0',\n payload: 'workspace:*',\n },\n devDependencies: {\n '@payloadcms/graphql': 'workspace:*',\n typescript: '^5.0.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(projectDir, 'package.json'),\n JSON.stringify(mockPackageJson, null, 2),\n )\n\n // Mock fetch to return a version\n const mockFetch = vi.fn().mockResolvedValue({\n json: () => Promise.resolve({ latest: '3.0.0' }),\n ok: true,\n })\n global.fetch = mockFetch as never\n\n // Mock downloadTemplateFromGitHub to do nothing (already have package.json)\n const downloadMock = vi.fn().mockResolvedValue(undefined)\n vi.doMock('./download-template.js', () => ({\n downloadTemplateFromGitHub: downloadMock,\n }))\n\n // Mock applyLambdaModifications to do nothing\n const lambdaMock = vi.fn().mockResolvedValue(undefined)\n vi.doMock('./lambda-config.js', () => ({\n applyLambdaModifications: lambdaMock,\n }))\n\n // Re-import to get mocked version\n vi.resetModules()\n const { scaffoldProject } = await import('./project.js')\n\n await scaffoldProject(projectDir, 'my-project')\n\n // Read the updated package.json\n const updatedPackageJson = JSON.parse(\n await fs.readFile(path.join(projectDir, 'package.json'), 'utf-8'),\n )\n\n // Verify name was updated\n expect(updatedPackageJson.name).toBe('my-project')\n\n // Verify workspace versions were replaced\n expect(updatedPackageJson.dependencies.payload).toBe('3.0.0')\n expect(updatedPackageJson.dependencies['@payloadcms/db-mongodb']).toBe('3.0.0')\n expect(updatedPackageJson.dependencies['@payloadcms/richtext-lexical']).toBe('3.0.0')\n\n // Verify non-payload packages unchanged\n expect(updatedPackageJson.dependencies.next).toBe('^15.0.0')\n\n // Verify devDependencies\n expect(updatedPackageJson.devDependencies['@payloadcms/graphql']).toBe('3.0.0')\n expect(updatedPackageJson.devDependencies.typescript).toBe('^5.0.0')\n\n // Verify npm registry was called\n expect(mockFetch).toHaveBeenCalledWith(\n 'https://registry.npmjs.org/-/package/payload/dist-tags',\n )\n })\n })\n})\n"],"names":["fs","path","afterEach","beforeEach","describe","expect","it","vi","detectPayloadProject","validatePayloadVersion","testDir","join","process","cwd","Date","now","Math","random","toString","substring","mkdir","recursive","rm","force","packageJson","name","dependencies","next","payload","version","writeFile","JSON","stringify","result","hasPayload","toBe","payloadVersion","devDependencies","react","toBeUndefined","packageManager","rejects","toThrow","scaffoldProject","newDir","exists","access","then","catch","projectDir","mockPackageJson","typescript","mockFetch","fn","mockResolvedValue","json","Promise","resolve","latest","ok","global","fetch","downloadMock","undefined","doMock","downloadTemplateFromGitHub","lambdaMock","applyLambdaModifications","resetModules","updatedPackageJson","parse","readFile","toHaveBeenCalledWith"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3-upload.spec.d.ts","sourceRoot":"","sources":["../../src/utils/s3-upload.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { uploadFile, uploadLambdaZip, uploadStaticAssets } from './s3-upload.js';
|
|
5
|
-
describe('s3-upload', ()=>{
|
|
6
|
-
const testDir = path.join(process.cwd(), 'test-fixtures', 's3-upload');
|
|
7
|
-
beforeEach(async ()=>{
|
|
8
|
-
await fs.mkdir(testDir, {
|
|
9
|
-
recursive: true
|
|
10
|
-
});
|
|
11
|
-
vi.clearAllMocks();
|
|
12
|
-
});
|
|
13
|
-
afterEach(async ()=>{
|
|
14
|
-
await fs.rm(testDir, {
|
|
15
|
-
force: true,
|
|
16
|
-
recursive: true
|
|
17
|
-
});
|
|
18
|
-
vi.restoreAllMocks();
|
|
19
|
-
});
|
|
20
|
-
describe('uploadFile', ()=>{
|
|
21
|
-
it('should upload file to signed URL', async ()=>{
|
|
22
|
-
const testFile = path.join(testDir, 'test.txt');
|
|
23
|
-
await fs.writeFile(testFile, 'test content');
|
|
24
|
-
const mockFetch = vi.fn().mockResolvedValue({
|
|
25
|
-
ok: true,
|
|
26
|
-
status: 200
|
|
27
|
-
});
|
|
28
|
-
global.fetch = mockFetch;
|
|
29
|
-
await uploadFile(testFile, 'https://s3.example.com/upload?signature=abc');
|
|
30
|
-
expect(mockFetch).toHaveBeenCalledWith('https://s3.example.com/upload?signature=abc', expect.objectContaining({
|
|
31
|
-
body: expect.any(Buffer),
|
|
32
|
-
method: 'PUT'
|
|
33
|
-
}));
|
|
34
|
-
});
|
|
35
|
-
it('should retry on failure', async ()=>{
|
|
36
|
-
const testFile = path.join(testDir, 'test.txt');
|
|
37
|
-
await fs.writeFile(testFile, 'test');
|
|
38
|
-
const mockFetch = vi.fn().mockResolvedValueOnce({
|
|
39
|
-
ok: false,
|
|
40
|
-
status: 500
|
|
41
|
-
}).mockResolvedValueOnce({
|
|
42
|
-
ok: false,
|
|
43
|
-
status: 500
|
|
44
|
-
}).mockResolvedValueOnce({
|
|
45
|
-
ok: true,
|
|
46
|
-
status: 200
|
|
47
|
-
});
|
|
48
|
-
global.fetch = mockFetch;
|
|
49
|
-
await uploadFile(testFile, 'https://s3.example.com/upload');
|
|
50
|
-
expect(mockFetch).toHaveBeenCalledTimes(3);
|
|
51
|
-
});
|
|
52
|
-
it('should throw after max retries', async ()=>{
|
|
53
|
-
const testFile = path.join(testDir, 'test.txt');
|
|
54
|
-
await fs.writeFile(testFile, 'test');
|
|
55
|
-
const mockFetch = vi.fn().mockResolvedValue({
|
|
56
|
-
ok: false,
|
|
57
|
-
status: 500
|
|
58
|
-
});
|
|
59
|
-
global.fetch = mockFetch;
|
|
60
|
-
await expect(uploadFile(testFile, 'https://s3.example.com/upload')).rejects.toThrow();
|
|
61
|
-
});
|
|
62
|
-
it('should throw error for non-existent file', async ()=>{
|
|
63
|
-
global.fetch = vi.fn().mockResolvedValue({
|
|
64
|
-
ok: true
|
|
65
|
-
});
|
|
66
|
-
await expect(uploadFile(path.join(testDir, 'missing.txt'), 'https://s3.example.com')).rejects.toThrow();
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('uploadLambdaZip', ()=>{
|
|
70
|
-
it('should upload zip file', async ()=>{
|
|
71
|
-
const zipPath = path.join(testDir, 'lambda.zip');
|
|
72
|
-
await fs.writeFile(zipPath, 'mock zip content');
|
|
73
|
-
const mockFetch = vi.fn().mockResolvedValue({
|
|
74
|
-
ok: true,
|
|
75
|
-
status: 200
|
|
76
|
-
});
|
|
77
|
-
global.fetch = mockFetch;
|
|
78
|
-
await uploadLambdaZip(zipPath, 'https://s3.example.com/lambda.zip');
|
|
79
|
-
expect(mockFetch).toHaveBeenCalledWith('https://s3.example.com/lambda.zip', expect.objectContaining({
|
|
80
|
-
headers: expect.objectContaining({
|
|
81
|
-
'Content-Type': 'application/zip'
|
|
82
|
-
}),
|
|
83
|
-
method: 'PUT'
|
|
84
|
-
}));
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe('uploadStaticAssets', ()=>{
|
|
88
|
-
it('should upload multiple assets', async ()=>{
|
|
89
|
-
// Files are on disk at .next/static (filesystem structure)
|
|
90
|
-
const staticDir = path.join(testDir, '.next', 'static');
|
|
91
|
-
await fs.mkdir(staticDir, {
|
|
92
|
-
recursive: true
|
|
93
|
-
});
|
|
94
|
-
await fs.writeFile(path.join(staticDir, 'file1.js'), 'code1');
|
|
95
|
-
await fs.writeFile(path.join(staticDir, 'file2.css'), 'styles');
|
|
96
|
-
// Asset paths use _next prefix (S3 convention)
|
|
97
|
-
const assetUrls = {
|
|
98
|
-
'_next/static/file1.js': 'https://s3.example.com/file1.js',
|
|
99
|
-
'_next/static/file2.css': 'https://s3.example.com/file2.css'
|
|
100
|
-
};
|
|
101
|
-
const mockFetch = vi.fn().mockResolvedValue({
|
|
102
|
-
ok: true,
|
|
103
|
-
status: 200
|
|
104
|
-
});
|
|
105
|
-
global.fetch = mockFetch;
|
|
106
|
-
const result = await uploadStaticAssets(testDir, assetUrls);
|
|
107
|
-
expect(result.lambdaUploaded).toBe(false);
|
|
108
|
-
expect(result.assetsUploaded).toBe(2);
|
|
109
|
-
expect(result.assetsFailed).toBe(0);
|
|
110
|
-
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
111
|
-
});
|
|
112
|
-
it('should track failed uploads', async ()=>{
|
|
113
|
-
// Files on disk at .next/static
|
|
114
|
-
const staticDir = path.join(testDir, '.next', 'static');
|
|
115
|
-
await fs.mkdir(staticDir, {
|
|
116
|
-
recursive: true
|
|
117
|
-
});
|
|
118
|
-
await fs.writeFile(path.join(staticDir, 'file1.js'), 'code');
|
|
119
|
-
// Asset paths use _next prefix
|
|
120
|
-
const assetUrls = {
|
|
121
|
-
'_next/static/file1.js': 'https://s3.example.com/file1.js'
|
|
122
|
-
};
|
|
123
|
-
const mockFetch = vi.fn().mockResolvedValue({
|
|
124
|
-
ok: false,
|
|
125
|
-
status: 500
|
|
126
|
-
});
|
|
127
|
-
global.fetch = mockFetch;
|
|
128
|
-
const result = await uploadStaticAssets(testDir, assetUrls);
|
|
129
|
-
expect(result.assetsUploaded).toBe(0);
|
|
130
|
-
expect(result.assetsFailed).toBe(1);
|
|
131
|
-
});
|
|
132
|
-
it('should handle empty asset list', async ()=>{
|
|
133
|
-
const result = await uploadStaticAssets(testDir, {});
|
|
134
|
-
expect(result.assetsUploaded).toBe(0);
|
|
135
|
-
expect(result.assetsFailed).toBe(0);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
//# sourceMappingURL=s3-upload.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/s3-upload.spec.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { uploadFile, uploadLambdaZip, uploadStaticAssets } from './s3-upload.js'\n\ndescribe('s3-upload', () => {\n const testDir = path.join(process.cwd(), 'test-fixtures', 's3-upload')\n\n beforeEach(async () => {\n await fs.mkdir(testDir, { recursive: true })\n vi.clearAllMocks()\n })\n\n afterEach(async () => {\n await fs.rm(testDir, { force: true, recursive: true })\n vi.restoreAllMocks()\n })\n\n describe('uploadFile', () => {\n it('should upload file to signed URL', async () => {\n const testFile = path.join(testDir, 'test.txt')\n await fs.writeFile(testFile, 'test content')\n\n const mockFetch = vi.fn().mockResolvedValue({\n ok: true,\n status: 200,\n })\n global.fetch = mockFetch\n\n await uploadFile(testFile, 'https://s3.example.com/upload?signature=abc')\n\n expect(mockFetch).toHaveBeenCalledWith(\n 'https://s3.example.com/upload?signature=abc',\n expect.objectContaining({\n body: expect.any(Buffer),\n method: 'PUT',\n }),\n )\n })\n\n it('should retry on failure', async () => {\n const testFile = path.join(testDir, 'test.txt')\n await fs.writeFile(testFile, 'test')\n\n const mockFetch = vi\n .fn()\n .mockResolvedValueOnce({ ok: false, status: 500 })\n .mockResolvedValueOnce({ ok: false, status: 500 })\n .mockResolvedValueOnce({ ok: true, status: 200 })\n\n global.fetch = mockFetch\n\n await uploadFile(testFile, 'https://s3.example.com/upload')\n\n expect(mockFetch).toHaveBeenCalledTimes(3)\n })\n\n it('should throw after max retries', async () => {\n const testFile = path.join(testDir, 'test.txt')\n await fs.writeFile(testFile, 'test')\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: false, status: 500 })\n global.fetch = mockFetch\n\n await expect(uploadFile(testFile, 'https://s3.example.com/upload')).rejects.toThrow()\n })\n\n it('should throw error for non-existent file', async () => {\n global.fetch = vi.fn().mockResolvedValue({ ok: true })\n\n await expect(\n uploadFile(path.join(testDir, 'missing.txt'), 'https://s3.example.com'),\n ).rejects.toThrow()\n })\n })\n\n describe('uploadLambdaZip', () => {\n it('should upload zip file', async () => {\n const zipPath = path.join(testDir, 'lambda.zip')\n await fs.writeFile(zipPath, 'mock zip content')\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200 })\n global.fetch = mockFetch\n\n await uploadLambdaZip(zipPath, 'https://s3.example.com/lambda.zip')\n\n expect(mockFetch).toHaveBeenCalledWith(\n 'https://s3.example.com/lambda.zip',\n expect.objectContaining({\n headers: expect.objectContaining({\n 'Content-Type': 'application/zip',\n }),\n method: 'PUT',\n }),\n )\n })\n })\n\n describe('uploadStaticAssets', () => {\n it('should upload multiple assets', async () => {\n // Files are on disk at .next/static (filesystem structure)\n const staticDir = path.join(testDir, '.next', 'static')\n await fs.mkdir(staticDir, { recursive: true })\n await fs.writeFile(path.join(staticDir, 'file1.js'), 'code1')\n await fs.writeFile(path.join(staticDir, 'file2.css'), 'styles')\n\n // Asset paths use _next prefix (S3 convention)\n const assetUrls = {\n '_next/static/file1.js': 'https://s3.example.com/file1.js',\n '_next/static/file2.css': 'https://s3.example.com/file2.css',\n }\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200 })\n global.fetch = mockFetch\n\n const result = await uploadStaticAssets(testDir, assetUrls)\n\n expect(result.lambdaUploaded).toBe(false)\n expect(result.assetsUploaded).toBe(2)\n expect(result.assetsFailed).toBe(0)\n expect(mockFetch).toHaveBeenCalledTimes(2)\n })\n\n it('should track failed uploads', async () => {\n // Files on disk at .next/static\n const staticDir = path.join(testDir, '.next', 'static')\n await fs.mkdir(staticDir, { recursive: true })\n await fs.writeFile(path.join(staticDir, 'file1.js'), 'code')\n\n // Asset paths use _next prefix\n const assetUrls = {\n '_next/static/file1.js': 'https://s3.example.com/file1.js',\n }\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: false, status: 500 })\n global.fetch = mockFetch\n\n const result = await uploadStaticAssets(testDir, assetUrls)\n\n expect(result.assetsUploaded).toBe(0)\n expect(result.assetsFailed).toBe(1)\n })\n\n it('should handle empty asset list', async () => {\n const result = await uploadStaticAssets(testDir, {})\n\n expect(result.assetsUploaded).toBe(0)\n expect(result.assetsFailed).toBe(0)\n })\n })\n})\n"],"names":["fs","path","afterEach","beforeEach","describe","expect","it","vi","uploadFile","uploadLambdaZip","uploadStaticAssets","testDir","join","process","cwd","mkdir","recursive","clearAllMocks","rm","force","restoreAllMocks","testFile","writeFile","mockFetch","fn","mockResolvedValue","ok","status","global","fetch","toHaveBeenCalledWith","objectContaining","body","any","Buffer","method","mockResolvedValueOnce","toHaveBeenCalledTimes","rejects","toThrow","zipPath","headers","staticDir","assetUrls","result","lambdaUploaded","toBe","assetsUploaded","assetsFailed"],"mappings":"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"}
|