@linktr.ee/linkapp 0.0.48 → 0.0.49
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/README.md +1 -1
- package/dev-server/components/form/array-field.tsx +115 -0
- package/dev-server/components/form/file-field.tsx +48 -0
- package/dev-server/components/form/form-element.tsx +304 -0
- package/dev-server/components/form/link-behavior-field.tsx +68 -0
- package/dev-server/components/form/location-field.tsx +60 -0
- package/dev-server/components/settings-preview.tsx +138 -302
- package/dev-server/components/ui/checkbox.tsx +29 -0
- package/dev-server/components/ui/dialog.tsx +2 -10
- package/dev-server/components/ui/field.tsx +24 -49
- package/dev-server/components/ui/input.tsx +20 -21
- package/dev-server/components/ui/label.tsx +4 -4
- package/dev-server/components/ui/radio-group.tsx +37 -0
- package/dev-server/components/ui/select.tsx +153 -0
- package/dev-server/components/ui/switch.tsx +31 -0
- package/dev-server/components/ui/tabs.tsx +1 -1
- package/dev-server/components/ui/textarea.tsx +18 -19
- package/dev-server/env.d.ts +4 -1
- package/dev-server/expanded/main.tsx +20 -22
- package/dev-server/expanded.html +0 -1
- package/dev-server/featured/main.tsx +29 -36
- package/dev-server/featured-carousel.html +0 -1
- package/dev-server/featured.html +0 -1
- package/dev-server/index.html +1 -7
- package/dev-server/lib/utils.ts +3 -3
- package/dev-server/package.json +3 -3
- package/dev-server/postcss/tailwind-source-fallback.js +2 -7
- package/dev-server/postcss.config.mjs +2 -2
- package/dev-server/preview/Preview.tsx +310 -350
- package/dev-server/preview/main.tsx +8 -8
- package/dev-server/preview/preview.css +0 -1
- package/dev-server/public/site.webmanifest +1 -1
- package/dev-server/rsbuild.config.ts +1 -1
- package/dev-server/shared/dev-parent-simulator.ts +219 -0
- package/dev-server/shared/theme-presets.ts +71 -75
- package/dev-server/shared/theme-utils.ts +11 -11
- package/dist/cli.js +18 -12
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +27 -42
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +26 -16
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/deploy.d.ts +1 -11
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +3 -13
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +132 -388
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +17 -29
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +6 -11
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/rollback.d.ts +10 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +148 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +96 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test-url-match-rules.d.ts.map +1 -1
- package/dist/commands/test-url-match-rules.js +20 -26
- package/dist/commands/test-url-match-rules.js.map +1 -1
- package/dist/lib/auth/device-flow.d.ts +1 -1
- package/dist/lib/auth/device-flow.d.ts.map +1 -1
- package/dist/lib/auth/device-flow.js +3 -3
- package/dist/lib/auth/device-flow.js.map +1 -1
- package/dist/lib/auth/token-storage.d.ts.map +1 -1
- package/dist/lib/auth/token-storage.js +14 -37
- package/dist/lib/auth/token-storage.js.map +1 -1
- package/dist/lib/build/detect-layouts.d.ts.map +1 -1
- package/dist/lib/build/detect-layouts.js +27 -13
- package/dist/lib/build/detect-layouts.js.map +1 -1
- package/dist/lib/config/load-config.d.ts.map +1 -1
- package/dist/lib/config/load-config.js +0 -2
- package/dist/lib/config/load-config.js.map +1 -1
- package/dist/lib/deploy/deploy-output.d.ts +2 -1
- package/dist/lib/deploy/deploy-output.d.ts.map +1 -1
- package/dist/lib/deploy/deploy-output.js +9 -1
- package/dist/lib/deploy/deploy-output.js.map +1 -1
- package/dist/lib/deploy/deploy-phases.d.ts +2 -0
- package/dist/lib/deploy/deploy-phases.d.ts.map +1 -1
- package/dist/lib/deploy/deploy-phases.js +9 -23
- package/dist/lib/deploy/deploy-phases.js.map +1 -1
- package/dist/lib/deploy/deploy-utils.d.ts +15 -7
- package/dist/lib/deploy/deploy-utils.d.ts.map +1 -1
- package/dist/lib/deploy/deploy-utils.js +49 -36
- package/dist/lib/deploy/deploy-utils.js.map +1 -1
- package/dist/lib/deploy/generate-manifest-files.d.ts.map +1 -1
- package/dist/lib/deploy/generate-manifest-files.js +13 -39
- package/dist/lib/deploy/generate-manifest-files.js.map +1 -1
- package/dist/lib/deploy/pack-project.d.ts.map +1 -1
- package/dist/lib/deploy/pack-project.js +34 -20
- package/dist/lib/deploy/pack-project.js.map +1 -1
- package/dist/lib/deploy/slot-manager.d.ts +54 -0
- package/dist/lib/deploy/slot-manager.d.ts.map +1 -0
- package/dist/lib/deploy/slot-manager.js +72 -0
- package/dist/lib/deploy/slot-manager.js.map +1 -0
- package/dist/lib/deploy/test-url-match-rules.d.ts +10 -2
- package/dist/lib/deploy/test-url-match-rules.d.ts.map +1 -1
- package/dist/lib/deploy/test-url-match-rules.js +1 -1
- package/dist/lib/deploy/test-url-match-rules.js.map +1 -1
- package/dist/lib/deploy/upload.d.ts +1 -0
- package/dist/lib/deploy/upload.d.ts.map +1 -1
- package/dist/lib/deploy/upload.js +15 -24
- package/dist/lib/deploy/upload.js.map +1 -1
- package/dist/lib/deploy/validation.d.ts.map +1 -1
- package/dist/lib/deploy/validation.js +43 -48
- package/dist/lib/deploy/validation.js.map +1 -1
- package/dist/lib/rsbuild/config-factory.d.ts.map +1 -1
- package/dist/lib/rsbuild/config-factory.js +10 -17
- package/dist/lib/rsbuild/config-factory.js.map +1 -1
- package/dist/lib/rsbuild/plugins/asset-versioning.d.ts.map +1 -1
- package/dist/lib/rsbuild/plugins/asset-versioning.js +4 -14
- package/dist/lib/rsbuild/plugins/asset-versioning.js.map +1 -1
- package/dist/lib/rsbuild/plugins/brotli-compression.d.ts.map +1 -1
- package/dist/lib/rsbuild/plugins/brotli-compression.js +4 -4
- package/dist/lib/rsbuild/plugins/brotli-compression.js.map +1 -1
- package/dist/lib/rsbuild/plugins/copy-public.d.ts.map +1 -1
- package/dist/lib/rsbuild/plugins/copy-public.js.map +1 -1
- package/dist/lib/rsbuild/postcss/tailwind-source-fallback.d.ts.map +1 -1
- package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js +1 -3
- package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js.map +1 -1
- package/dist/lib/utils/console.d.ts +8 -0
- package/dist/lib/utils/console.d.ts.map +1 -0
- package/dist/lib/utils/console.js +10 -0
- package/dist/lib/utils/console.js.map +1 -0
- package/dist/lib/utils/filesystem.d.ts +9 -0
- package/dist/lib/utils/filesystem.d.ts.map +1 -0
- package/dist/lib/utils/filesystem.js +30 -0
- package/dist/lib/utils/filesystem.js.map +1 -0
- package/dist/lib/utils/formatters.d.ts +8 -0
- package/dist/lib/utils/formatters.d.ts.map +1 -0
- package/dist/lib/utils/formatters.js +22 -0
- package/dist/lib/utils/formatters.js.map +1 -0
- package/dist/lib/utils/index.d.ts +7 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +7 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/setup-runtime.d.ts.map +1 -1
- package/dist/lib/utils/setup-runtime.js +22 -63
- package/dist/lib/utils/setup-runtime.js.map +1 -1
- package/dist/schema/config.schema.d.ts +9 -48
- package/dist/schema/config.schema.d.ts.map +1 -1
- package/dist/schema/config.schema.js +119 -120
- package/dist/schema/config.schema.js.map +1 -1
- package/dist/sdk/hooks/mocks.d.ts +9 -0
- package/dist/sdk/hooks/mocks.d.ts.map +1 -0
- package/dist/sdk/hooks/mocks.js +17 -0
- package/dist/sdk/hooks/mocks.js.map +1 -0
- package/dist/sdk/hooks/use-audience-manager.d.ts +44 -0
- package/dist/sdk/hooks/use-audience-manager.d.ts.map +1 -0
- package/dist/sdk/hooks/use-audience-manager.js +109 -0
- package/dist/sdk/hooks/use-audience-manager.js.map +1 -0
- package/dist/sdk/hooks/use-ip.d.ts +45 -0
- package/dist/sdk/hooks/use-ip.d.ts.map +1 -0
- package/dist/sdk/hooks/use-ip.js +46 -0
- package/dist/sdk/hooks/use-ip.js.map +1 -0
- package/dist/sdk/hooks/use-sdk-request.d.ts +46 -0
- package/dist/sdk/hooks/use-sdk-request.d.ts.map +1 -0
- package/dist/sdk/hooks/use-sdk-request.js +65 -0
- package/dist/sdk/hooks/use-sdk-request.js.map +1 -0
- package/dist/sdk/hooks/use-theme.d.ts +45 -0
- package/dist/sdk/hooks/use-theme.d.ts.map +1 -0
- package/dist/sdk/hooks/use-theme.js +97 -0
- package/dist/sdk/hooks/use-theme.js.map +1 -0
- package/dist/sdk/hooks/use-visitor.d.ts +41 -0
- package/dist/sdk/hooks/use-visitor.d.ts.map +1 -0
- package/dist/sdk/hooks/use-visitor.js +42 -0
- package/dist/sdk/hooks/use-visitor.js.map +1 -0
- package/dist/sdk/hooks/validation.d.ts +8 -0
- package/dist/sdk/hooks/validation.d.ts.map +1 -0
- package/dist/sdk/hooks/validation.js +13 -0
- package/dist/sdk/hooks/validation.js.map +1 -0
- package/dist/sdk/index.d.ts +17 -5
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +16 -5
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/message-bus.d.ts +59 -0
- package/dist/sdk/message-bus.d.ts.map +1 -0
- package/dist/sdk/message-bus.js +152 -0
- package/dist/sdk/message-bus.js.map +1 -0
- package/dist/sdk/messages.d.ts +121 -0
- package/dist/sdk/messages.d.ts.map +1 -0
- package/dist/sdk/messages.js +9 -0
- package/dist/sdk/messages.js.map +1 -0
- package/dist/sdk/send-message.d.ts +1 -1
- package/dist/sdk/send-message.js +18 -18
- package/dist/sdk/send-message.js.map +1 -1
- package/dist/sdk/use-expand-link-app.d.ts +3 -3
- package/dist/sdk/use-expand-link-app.d.ts.map +1 -1
- package/dist/sdk/use-expand-link-app.js +9 -5
- package/dist/sdk/use-expand-link-app.js.map +1 -1
- package/dist/types.d.ts +235 -55
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -3
- package/dist/types.js.map +1 -1
- package/package.json +3 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-url-match-rules.js","sourceRoot":"","sources":["../../src/commands/test-url-match-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"test-url-match-rules.js","sourceRoot":"","sources":["../../src/commands/test-url-match-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/device-flow.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/device-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAU,KAAK,QAAQ,EAAU,MAAM,eAAe,CAAA;AAErG,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAUlG;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAS7F"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Issuer, errors } from 'openid-client';
|
|
2
2
|
export async function initiateDeviceFlow(config) {
|
|
3
3
|
const { domain, client_id, audience } = config;
|
|
4
4
|
const auth0Issuer = await Issuer.discover(domain);
|
|
5
5
|
const client = new auth0Issuer.Client({
|
|
6
6
|
client_id,
|
|
7
|
-
token_endpoint_auth_method:
|
|
7
|
+
token_endpoint_auth_method: 'none',
|
|
8
8
|
});
|
|
9
|
-
return await client.deviceAuthorization({ scope:
|
|
9
|
+
return await client.deviceAuthorization({ scope: '', audience });
|
|
10
10
|
}
|
|
11
11
|
export async function pollAccessToken(handle) {
|
|
12
12
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../../src/lib/auth/device-flow.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../../src/lib/auth/device-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,MAAM,EAAiB,MAAM,EAAE,MAAM,eAAe,CAAA;AAQrG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAkB;IACzD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IAE9C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC;QACpC,SAAS;QACT,0BAA0B,EAAE,MAAM;KACnC,CAAC,CAAA;IAEF,OAAO,MAAM,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAoC;IACxE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QACvD,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-storage.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-storage.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"AAqGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAWnF;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcxD;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAkBnD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import jwt from
|
|
5
|
-
const CONFIG_DIR = join(homedir(),
|
|
6
|
-
const TOKEN_FILE = join(CONFIG_DIR,
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import jwt from 'jsonwebtoken';
|
|
5
|
+
const CONFIG_DIR = join(homedir(), '.config', 'linkapp');
|
|
6
|
+
const TOKEN_FILE = join(CONFIG_DIR, 'auth-token.json');
|
|
7
7
|
const TOKEN_EXPIRY_THRESHOLD_SECONDS = 60; // Consider tokens as expired within the last 60s of actual expiry
|
|
8
8
|
/**
|
|
9
9
|
* Validates that a JWT token has the correct structure and permissions
|
|
@@ -12,22 +12,18 @@ const TOKEN_EXPIRY_THRESHOLD_SECONDS = 60; // Consider tokens as expired within
|
|
|
12
12
|
function validateTokenStructure(tokenString) {
|
|
13
13
|
const payload = jwt.decode(tokenString, { json: true });
|
|
14
14
|
if (!payload) {
|
|
15
|
-
throw new Error(
|
|
15
|
+
throw new Error('There was an error parsing the access token, please try logging in again');
|
|
16
16
|
}
|
|
17
17
|
const permissions = payload.permissions ?? [];
|
|
18
18
|
if (permissions.length === 0) {
|
|
19
|
-
throw new Error(
|
|
19
|
+
throw new Error('Login request was successful, but the authenticated user does not have appropriate permissions to view or modify LinkApps');
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Type guard to check if stored data is in legacy format
|
|
24
24
|
*/
|
|
25
25
|
function isLegacyFormat(data) {
|
|
26
|
-
return
|
|
27
|
-
data !== null &&
|
|
28
|
-
"accessToken" in data &&
|
|
29
|
-
"audience" in data &&
|
|
30
|
-
!("tokens" in data));
|
|
26
|
+
return typeof data === 'object' && data !== null && 'accessToken' in data && 'audience' in data && !('tokens' in data);
|
|
31
27
|
}
|
|
32
28
|
/**
|
|
33
29
|
* Reads the token storage, migrating from legacy format if needed
|
|
@@ -37,7 +33,7 @@ function readTokenStorage() {
|
|
|
37
33
|
return { tokens: {} };
|
|
38
34
|
}
|
|
39
35
|
try {
|
|
40
|
-
const rawData = JSON.parse(readFileSync(TOKEN_FILE,
|
|
36
|
+
const rawData = JSON.parse(readFileSync(TOKEN_FILE, 'utf-8'));
|
|
41
37
|
// Check if it's legacy format and migrate
|
|
42
38
|
if (isLegacyFormat(rawData)) {
|
|
43
39
|
const migrated = {
|
|
@@ -49,67 +45,49 @@ function readTokenStorage() {
|
|
|
49
45
|
},
|
|
50
46
|
};
|
|
51
47
|
// Write migrated format back to disk
|
|
52
|
-
writeFileSync(TOKEN_FILE, JSON.stringify(migrated, null, 2),
|
|
48
|
+
writeFileSync(TOKEN_FILE, JSON.stringify(migrated, null, 2), 'utf-8');
|
|
53
49
|
return migrated;
|
|
54
50
|
}
|
|
55
51
|
// Already in new format
|
|
56
52
|
return rawData;
|
|
57
53
|
}
|
|
58
54
|
catch (error) {
|
|
59
|
-
console.error(
|
|
55
|
+
console.error('Failed to read token storage:', error);
|
|
60
56
|
return { tokens: {} };
|
|
61
57
|
}
|
|
62
58
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Writes the token storage to disk
|
|
65
|
-
*/
|
|
66
59
|
function writeTokenStorage(storage) {
|
|
67
|
-
// Ensure config directory exists
|
|
68
60
|
if (!existsSync(CONFIG_DIR)) {
|
|
69
61
|
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
70
62
|
}
|
|
71
|
-
writeFileSync(TOKEN_FILE, JSON.stringify(storage, null, 2),
|
|
63
|
+
writeFileSync(TOKEN_FILE, JSON.stringify(storage, null, 2), 'utf-8');
|
|
72
64
|
}
|
|
73
65
|
export function saveToken(token, audience, expiresAt) {
|
|
74
|
-
// Validate token structure and permissions before saving
|
|
75
66
|
validateTokenStructure(token);
|
|
76
|
-
// Read existing storage (handles migration if needed)
|
|
77
67
|
const storage = readTokenStorage();
|
|
78
|
-
// Add or update token for this audience
|
|
79
68
|
storage.tokens[audience] = {
|
|
80
69
|
accessToken: token,
|
|
81
70
|
expiresAt,
|
|
82
71
|
};
|
|
83
|
-
// Write updated storage
|
|
84
72
|
writeTokenStorage(storage);
|
|
85
73
|
}
|
|
86
74
|
export function getToken(audience) {
|
|
87
|
-
// Read storage (handles migration if needed)
|
|
88
75
|
const storage = readTokenStorage();
|
|
89
|
-
// Get token for this audience
|
|
90
76
|
const tokenEntry = storage.tokens[audience];
|
|
91
77
|
if (!tokenEntry) {
|
|
92
78
|
return null;
|
|
93
79
|
}
|
|
94
|
-
|
|
95
|
-
if (tokenEntry.expiresAt &&
|
|
96
|
-
tokenEntry.expiresAt - TOKEN_EXPIRY_THRESHOLD_SECONDS <
|
|
97
|
-
Math.floor(Date.now() / 1000)) {
|
|
98
|
-
// Remove expired token
|
|
80
|
+
if (tokenEntry.expiresAt && tokenEntry.expiresAt - TOKEN_EXPIRY_THRESHOLD_SECONDS < Math.floor(Date.now() / 1000)) {
|
|
99
81
|
removeToken(audience);
|
|
100
82
|
return null;
|
|
101
83
|
}
|
|
102
84
|
return tokenEntry.accessToken;
|
|
103
85
|
}
|
|
104
86
|
export function removeToken(audience) {
|
|
105
|
-
// Read storage (handles migration if needed)
|
|
106
87
|
const storage = readTokenStorage();
|
|
107
|
-
// If audience is specified, only remove that token
|
|
108
88
|
if (audience) {
|
|
109
89
|
if (storage.tokens[audience]) {
|
|
110
90
|
delete storage.tokens[audience];
|
|
111
|
-
// If there are remaining tokens, write updated storage
|
|
112
|
-
// Otherwise, delete the file
|
|
113
91
|
if (Object.keys(storage.tokens).length > 0) {
|
|
114
92
|
writeTokenStorage(storage);
|
|
115
93
|
}
|
|
@@ -119,7 +97,6 @@ export function removeToken(audience) {
|
|
|
119
97
|
}
|
|
120
98
|
}
|
|
121
99
|
else {
|
|
122
|
-
// No audience specified - remove all tokens
|
|
123
100
|
if (existsSync(TOKEN_FILE)) {
|
|
124
101
|
unlinkSync(TOKEN_FILE);
|
|
125
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-storage.js","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"token-storage.js","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,GAAG,MAAM,cAAc,CAAA;AAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;AACxD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;AACtD,MAAM,8BAA8B,GAAG,EAAE,CAAA,CAAC,kEAAkE;AA2B5G;;;GAGG;AACH,SAAS,sBAAsB,CAAC,WAAmB;IACjD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAsB,CAAA;IAE5E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;IAC7F,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAA;IAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,2HAA2H,CAC5H,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAa;IACnC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,aAAa,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAA;AACxH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB;IACvB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;QAE7D,0CAA0C;QAC1C,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAiB;gBAC7B,MAAM,EAAE;oBACN,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;wBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;qBAC7B;iBACF;aACF,CAAA;YACD,qCAAqC;YACrC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YACrE,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,wBAAwB;QACxB,OAAO,OAAuB,CAAA;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAA;QACrD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACvB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAqB;IAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IACD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,QAAgB,EAAE,SAAkB;IAC3E,sBAAsB,CAAC,KAAK,CAAC,CAAA;IAE7B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAA;IAElC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;QACzB,WAAW,EAAE,KAAK;QAClB,SAAS;KACV,CAAA;IAED,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAA;IAElC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,GAAG,8BAA8B,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClH,WAAW,CAAC,QAAQ,CAAC,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,UAAU,CAAC,WAAW,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAiB;IAC3C,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAA;IAElC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAE/B,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,iBAAiB,CAAC,OAAO,CAAC,CAAA;YAC5B,CAAC;iBAAM,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,UAAU,CAAC,UAAU,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,UAAU,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-layouts.d.ts","sourceRoot":"","sources":["../../../src/lib/build/detect-layouts.ts"],"names":[],"mappings":"AAGA,UAAU,MAAM;
|
|
1
|
+
{"version":3,"file":"detect-layouts.d.ts","sourceRoot":"","sources":["../../../src/lib/build/detect-layouts.ts"],"names":[],"mappings":"AAGA,UAAU,MAAM;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAsDlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB,CAkBA"}
|
|
@@ -1,26 +1,39 @@
|
|
|
1
|
-
import { existsSync } from
|
|
2
|
-
import { join } from
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
3
|
/**
|
|
4
4
|
* Detects layout files in the project's /app directory
|
|
5
5
|
* Only expanded.tsx (or legacy sheet.tsx), featured.tsx, and featured-carousel.tsx are supported as layout entry points
|
|
6
6
|
*/
|
|
7
7
|
export function detectLayouts(projectPath) {
|
|
8
|
-
const appDir = join(projectPath,
|
|
8
|
+
const appDir = join(projectPath, "app");
|
|
9
9
|
if (!existsSync(appDir)) {
|
|
10
|
-
return {
|
|
10
|
+
return {
|
|
11
|
+
layouts: [],
|
|
12
|
+
hasLayout: false,
|
|
13
|
+
hasExpanded: false,
|
|
14
|
+
hasLegacySheet: false,
|
|
15
|
+
};
|
|
11
16
|
}
|
|
12
17
|
const layouts = [];
|
|
13
|
-
const hasExpanded = existsSync(join(appDir,
|
|
14
|
-
const hasLegacySheet = existsSync(join(appDir,
|
|
18
|
+
const hasExpanded = existsSync(join(appDir, "expanded.tsx"));
|
|
19
|
+
const hasLegacySheet = existsSync(join(appDir, "sheet.tsx"));
|
|
15
20
|
// Prefer expanded.tsx, but fall back to sheet.tsx for backwards compatibility
|
|
16
21
|
if (hasExpanded || hasLegacySheet) {
|
|
17
|
-
const expandedFileName = hasExpanded ?
|
|
18
|
-
layouts.push({
|
|
22
|
+
const expandedFileName = hasExpanded ? "expanded.tsx" : "sheet.tsx";
|
|
23
|
+
layouts.push({
|
|
24
|
+
name: "expanded",
|
|
25
|
+
fileName: expandedFileName,
|
|
26
|
+
displayName: "Expanded",
|
|
27
|
+
});
|
|
19
28
|
}
|
|
20
29
|
// Supported featured layouts
|
|
21
30
|
const supportedLayouts = [
|
|
22
|
-
{ name:
|
|
23
|
-
{
|
|
31
|
+
{ name: "featured", fileName: "featured.tsx", displayName: "Featured" },
|
|
32
|
+
{
|
|
33
|
+
name: "featured-carousel",
|
|
34
|
+
fileName: "featured-carousel.tsx",
|
|
35
|
+
displayName: "FeaturedCarousel",
|
|
36
|
+
},
|
|
24
37
|
];
|
|
25
38
|
for (const layout of supportedLayouts) {
|
|
26
39
|
const layoutPath = join(appDir, layout.fileName);
|
|
@@ -28,7 +41,8 @@ export function detectLayouts(projectPath) {
|
|
|
28
41
|
layouts.push(layout);
|
|
29
42
|
}
|
|
30
43
|
}
|
|
31
|
-
const hasLayout = existsSync(join(appDir,
|
|
44
|
+
const hasLayout = existsSync(join(appDir, "layout.tsx")) ||
|
|
45
|
+
existsSync(join(appDir, "layout.ts"));
|
|
32
46
|
return {
|
|
33
47
|
layouts,
|
|
34
48
|
hasLayout,
|
|
@@ -43,9 +57,9 @@ export function validateLayouts(projectPath) {
|
|
|
43
57
|
const detection = detectLayouts(projectPath);
|
|
44
58
|
const errors = [];
|
|
45
59
|
// expanded.tsx is always required (sheet.tsx supported for backwards compatibility)
|
|
46
|
-
const hasExpanded = detection.layouts.some(l => l.name ===
|
|
60
|
+
const hasExpanded = detection.layouts.some((l) => l.name === "expanded");
|
|
47
61
|
if (!hasExpanded) {
|
|
48
|
-
errors.push(
|
|
62
|
+
errors.push("app/expanded.tsx (or legacy app/sheet.tsx) is required. This is the default layout for your Link App.");
|
|
49
63
|
}
|
|
50
64
|
// Layout wrapper is optional - will be used if present
|
|
51
65
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-layouts.js","sourceRoot":"","sources":["../../../src/lib/build/detect-layouts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"detect-layouts.js","sourceRoot":"","sources":["../../../src/lib/build/detect-layouts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAejC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO;YACN,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,KAAK;SACrB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAE7D,8EAA8E;IAC9E,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,UAAU;SACvB,CAAC,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG;QACxB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE;QACvE;YACC,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,uBAAuB;YACjC,WAAW,EAAE,kBAAkB;SAC/B;KACD,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAED,MAAM,SAAS,GACd,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAEvC,OAAO;QACN,OAAO;QACP,SAAS;QACT,WAAW;QACX,cAAc;KACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IAIlD,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,oFAAoF;IACpF,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CACV,uGAAuG,CACvG,CAAC;IACH,CAAC;IAED,uDAAuD;IAEvD,OAAO;QACN,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACN,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/lib/config/load-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,WAAW,GAAE,MAAsB,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/lib/config/load-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,WAAW,GAAE,MAAsB,GAAG,aAAa,CAmB7E"}
|
|
@@ -8,7 +8,6 @@ import { createJiti } from 'jiti';
|
|
|
8
8
|
* @throws Error if config file is not found or cannot be loaded
|
|
9
9
|
*/
|
|
10
10
|
export function loadConfig(projectPath = process.cwd()) {
|
|
11
|
-
// Check for config in root first, then .config directory
|
|
12
11
|
const rootConfigPath = join(projectPath, 'linkapp.config.ts');
|
|
13
12
|
const nestedConfigPath = join(projectPath, '.config', 'linkapp.config.ts');
|
|
14
13
|
const configPath = existsSync(rootConfigPath) ? rootConfigPath : nestedConfigPath;
|
|
@@ -16,7 +15,6 @@ export function loadConfig(projectPath = process.cwd()) {
|
|
|
16
15
|
throw new Error('Config file not found: linkapp.config.ts');
|
|
17
16
|
}
|
|
18
17
|
try {
|
|
19
|
-
// Load the TypeScript config using jiti
|
|
20
18
|
const jiti = createJiti(import.meta.url, {
|
|
21
19
|
interopDefault: true,
|
|
22
20
|
moduleCache: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../../src/lib/config/load-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAGjC;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,
|
|
1
|
+
{"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../../src/lib/config/load-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAGjC;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAA;IAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAA;IAC1E,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAA;IAEjF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACvC,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,KAAK;SACnB,CAAC,CAAA;QACF,MAAM,MAAM,GAAkB,IAAI,CAAC,UAAU,CAAC,CAAA;QAC9C,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IAC7F,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { DeployResponse } from '../../types.js';
|
|
1
2
|
import type { DeploymentContext, UploadResult } from './deploy-phases.js';
|
|
2
3
|
/**
|
|
3
4
|
* Displays successful deployment results.
|
|
4
5
|
*/
|
|
5
|
-
export declare function displayDeploymentSuccess(context: DeploymentContext, result: UploadResult): void;
|
|
6
|
+
export declare function displayDeploymentSuccess(context: DeploymentContext, result: UploadResult & Pick<DeployResponse, 'activeVersion'>): void;
|
|
6
7
|
/**
|
|
7
8
|
* Displays deployment error information.
|
|
8
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-output.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deploy-output.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAYzE;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,GAC3D,IAAI,CA6CN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CA+C3D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import pc from 'picocolors';
|
|
2
|
-
import {
|
|
2
|
+
import { AuthenticationError, DeploymentCancelledError, URLS, formatElapsedTime, formatTimestamp, isAPIError, writeLine, writeSeparator, } from './deploy-utils.js';
|
|
3
3
|
/**
|
|
4
4
|
* Displays successful deployment results.
|
|
5
5
|
*/
|
|
@@ -12,7 +12,11 @@ export function displayDeploymentSuccess(context, result) {
|
|
|
12
12
|
writeLine();
|
|
13
13
|
writeLine(pc.bold('Details:'));
|
|
14
14
|
writeLine(pc.dim(` ID: ${result.linkType.linkTypeId}`));
|
|
15
|
+
writeLine(pc.dim(` Target: ${context.deployTarget}`));
|
|
15
16
|
writeLine(pc.dim(` Status: ${result.linkType.status}`));
|
|
17
|
+
if (result.activeVersion) {
|
|
18
|
+
writeLine(pc.dim(` Version: ${result.activeVersion}`));
|
|
19
|
+
}
|
|
16
20
|
const timestamp = formatTimestamp(result.linkType.updatedTimestamp);
|
|
17
21
|
if (timestamp) {
|
|
18
22
|
writeLine(pc.dim(` Updated: ${timestamp}`));
|
|
@@ -31,6 +35,10 @@ export function displayDeploymentSuccess(context, result) {
|
|
|
31
35
|
writeLine(pc.cyan(' 2. Once the build completes, add it to your page:'));
|
|
32
36
|
writeLine(pc.dim(` ${createUrl}`));
|
|
33
37
|
writeLine();
|
|
38
|
+
// Show rollback hint
|
|
39
|
+
const qaFlag = context.env === 'qa' ? ' --qa' : '';
|
|
40
|
+
writeLine(pc.dim(` Rollback to previous version: linkapp rollback${qaFlag}`));
|
|
41
|
+
writeLine();
|
|
34
42
|
}
|
|
35
43
|
/**
|
|
36
44
|
* Displays deployment error information.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-output.js","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"deploy-output.js","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export interface DeployOptions {
|
|
|
4
4
|
path?: string;
|
|
5
5
|
endpoint?: string;
|
|
6
6
|
qa?: boolean;
|
|
7
|
+
canary?: boolean;
|
|
7
8
|
skipBuild?: boolean;
|
|
8
9
|
skipChecks?: boolean;
|
|
9
10
|
force?: boolean;
|
|
@@ -17,6 +18,7 @@ export interface DeploymentContext {
|
|
|
17
18
|
accessToken: string;
|
|
18
19
|
startTime: number;
|
|
19
20
|
options: DeployOptions;
|
|
21
|
+
deployTarget: 'canary' | 'stable';
|
|
20
22
|
}
|
|
21
23
|
export interface ArtifactPreparationResult {
|
|
22
24
|
packedFiles: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-phases.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-phases.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"deploy-phases.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-phases.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAqB/C,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,IAAI,CAAA;AAE7C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,WAAW,CAAA;IAChB,MAAM,EAAE,SAAS,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,aAAa,CAAA;IACtB,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAC1B,CAAA;IACD,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0B7F;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlF;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAiB/G;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,yBAAyB,GACnC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,yBAAyB,GACnC,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import pc from 'picocolors';
|
|
4
3
|
import * as p from '@clack/prompts';
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
import { buildCommand } from '../../commands/build.js';
|
|
5
6
|
import { getAppConfig } from '../auth/config.js';
|
|
6
7
|
import { getToken } from '../auth/token-storage.js';
|
|
7
|
-
import {
|
|
8
|
-
import { validateProject, printValidationResults } from './validation.js';
|
|
8
|
+
import { AuthenticationError, DeploymentCancelledError, ValidationError, displayFileList, formatElapsedTime, getDeployTarget, getLinkAppIdFromConfig, pluralize, resolveConfigPath, writeLine, writeSection, } from './deploy-utils.js';
|
|
9
9
|
import { generateManifestFiles } from './generate-manifest-files.js';
|
|
10
10
|
import { packProject } from './pack-project.js';
|
|
11
11
|
import { checkLinkAppExists, uploadAssets } from './upload.js';
|
|
12
|
-
import {
|
|
13
|
-
// ============================================================================
|
|
14
|
-
// PHASE 1: INITIALIZATION
|
|
15
|
-
// ============================================================================
|
|
12
|
+
import { printValidationResults, validateProject } from './validation.js';
|
|
16
13
|
export async function initializeDeployment(options) {
|
|
17
14
|
const env = options.qa ? 'qa' : 'production';
|
|
15
|
+
const deployTarget = getDeployTarget(options);
|
|
18
16
|
const config = await getAppConfig(env);
|
|
19
17
|
const projectPath = options.path ?? process.cwd();
|
|
20
18
|
const configPath = resolveConfigPath(projectPath);
|
|
21
19
|
const linkAppId = await getLinkAppIdFromConfig(configPath);
|
|
22
|
-
writeSection(`Deploying ${linkAppId} to ${env}`);
|
|
20
|
+
writeSection(`Deploying ${linkAppId} to ${env} (${deployTarget})`);
|
|
23
21
|
const accessToken = getToken(config.auth.audience);
|
|
24
22
|
if (!accessToken) {
|
|
25
23
|
throw new AuthenticationError(env);
|
|
@@ -32,13 +30,10 @@ export async function initializeDeployment(options) {
|
|
|
32
30
|
accessToken,
|
|
33
31
|
startTime: Date.now(),
|
|
34
32
|
options,
|
|
33
|
+
deployTarget,
|
|
35
34
|
};
|
|
36
35
|
}
|
|
37
|
-
// ============================================================================
|
|
38
|
-
// PHASE 2: PREFLIGHT CHECKS
|
|
39
|
-
// ============================================================================
|
|
40
36
|
export async function runPreflightChecks(context) {
|
|
41
|
-
// Ensure project is built
|
|
42
37
|
if (!context.options.skipBuild) {
|
|
43
38
|
const distPath = join(context.projectPath, 'dist');
|
|
44
39
|
if (!existsSync(distPath)) {
|
|
@@ -49,7 +44,6 @@ export async function runPreflightChecks(context) {
|
|
|
49
44
|
writeLine();
|
|
50
45
|
}
|
|
51
46
|
}
|
|
52
|
-
// Run validation checks
|
|
53
47
|
if (!context.options.skipChecks) {
|
|
54
48
|
writeLine(pc.bold('Pre-deployment checks'));
|
|
55
49
|
const validationResult = await validateProject();
|
|
@@ -61,9 +55,6 @@ export async function runPreflightChecks(context) {
|
|
|
61
55
|
writeLine();
|
|
62
56
|
}
|
|
63
57
|
}
|
|
64
|
-
// ============================================================================
|
|
65
|
-
// PHASE 3: PREPARE ARTIFACTS
|
|
66
|
-
// ============================================================================
|
|
67
58
|
export async function prepareDeploymentArtifacts(context) {
|
|
68
59
|
const s = p.spinner();
|
|
69
60
|
s.start('Generating manifest files');
|
|
@@ -78,25 +69,19 @@ export async function prepareDeploymentArtifacts(context) {
|
|
|
78
69
|
s.stop(`Packed ${pluralize(packedFiles.length, 'item')}`);
|
|
79
70
|
return { packedFiles, exists, apiUrl };
|
|
80
71
|
}
|
|
81
|
-
// ============================================================================
|
|
82
|
-
// PHASE 4: CONFIRM DEPLOYMENT
|
|
83
|
-
// ============================================================================
|
|
84
72
|
export async function confirmDeployment(context, artifacts) {
|
|
85
73
|
if (context.options.skipConfirm)
|
|
86
74
|
return;
|
|
87
75
|
displayFileList(artifacts.packedFiles, 'Files to upload:');
|
|
88
76
|
writeLine();
|
|
89
77
|
const shouldDeploy = await p.confirm({
|
|
90
|
-
message: `Deploy to ${context.env}?`,
|
|
78
|
+
message: `Deploy to ${context.env} (${context.deployTarget})?`,
|
|
91
79
|
initialValue: true,
|
|
92
80
|
});
|
|
93
81
|
if (p.isCancel(shouldDeploy) || !shouldDeploy) {
|
|
94
82
|
throw new DeploymentCancelledError();
|
|
95
83
|
}
|
|
96
84
|
}
|
|
97
|
-
// ============================================================================
|
|
98
|
-
// PHASE 5: EXECUTE DEPLOYMENT
|
|
99
|
-
// ============================================================================
|
|
100
85
|
export async function executeDeployment(context, artifacts) {
|
|
101
86
|
writeLine();
|
|
102
87
|
const uploadStart = Date.now();
|
|
@@ -109,6 +94,7 @@ export async function executeDeployment(context, artifacts) {
|
|
|
109
94
|
accessToken: context.accessToken,
|
|
110
95
|
isUpdate: artifacts.exists,
|
|
111
96
|
forceUpdate: context.options.force,
|
|
97
|
+
deployTarget: context.deployTarget,
|
|
112
98
|
});
|
|
113
99
|
s.stop(`Assets uploaded (${formatElapsedTime(Date.now() - uploadStart)})`);
|
|
114
100
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-phases.js","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-phases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"deploy-phases.js","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-phases.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
export declare function getDeployTarget(options: {
|
|
2
|
+
canary?: boolean;
|
|
3
|
+
}): 'canary' | 'stable';
|
|
4
|
+
export declare const KEBAB_CASE_ID_REGEX: RegExp;
|
|
5
|
+
export declare const KEBAB_CASE_ID_ERROR_MESSAGE = "ID must be kebab-case (lowercase letters, numbers, and hyphens, must start with a letter)";
|
|
6
|
+
export declare function isValidKebabCaseId(id: string): boolean;
|
|
4
7
|
export declare function resolveConfigPath(projectPath: string): string;
|
|
5
|
-
/**
|
|
6
|
-
* Extracts the LinkApp ID from a configuration file.
|
|
7
|
-
*/
|
|
8
8
|
export declare function getLinkAppIdFromConfig(configPath: string): Promise<string>;
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function deriveIdFromName(name: string): string;
|
|
10
|
+
import { writeLine } from '../utils/console.js';
|
|
11
|
+
export { writeLine };
|
|
10
12
|
export declare function writeSection(title: string, length?: number): void;
|
|
11
13
|
export declare function writeSeparator(length?: number): void;
|
|
12
14
|
export declare const DISPLAY: {
|
|
@@ -50,4 +52,10 @@ export interface APIError {
|
|
|
50
52
|
};
|
|
51
53
|
}
|
|
52
54
|
export declare function isAPIError(error: unknown): error is APIError;
|
|
55
|
+
export declare class APIUploadError extends DeploymentError {
|
|
56
|
+
readonly statusCode: number;
|
|
57
|
+
readonly responseData: unknown;
|
|
58
|
+
readonly messages: string[];
|
|
59
|
+
constructor(message: string, statusCode: number, responseData: unknown, messages?: string[]);
|
|
60
|
+
}
|
|
53
61
|
//# sourceMappingURL=deploy-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deploy-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/deploy-utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,GAAG,QAAQ,CAElF;AAED,eAAO,MAAM,mBAAmB,QAAkC,CAAA;AAElE,eAAO,MAAM,2BAA2B,8FACqD,CAAA;AAE7F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAED,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiChF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,CAAA;AAEpB,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,IAAI,CAI7D;AAED,wBAAgB,cAAc,CAAC,MAAM,SAAK,GAAG,IAAI,CAEhD;AAED,eAAO,MAAM,OAAO;;;CAGV,CAAA;AAEV,eAAO,MAAM,SAAS;;CAEZ,CAAA;AAEV,eAAO,MAAM,IAAI;uCACW,MAAM,WAAW,MAAM;;0CAGtB,MAAM;kCACd,MAAM;;CAEjB,CAAA;AAEV,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAM5E;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAYpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;gBAEf,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAI,EAAE,WAAW,CAAC,EAAE,MAAM;CAQhE;AAED,qBAAa,mBAAoB,SAAQ,eAAe;aAC1B,WAAW,EAAE,YAAY,GAAG,IAAI;gBAAhC,WAAW,EAAE,YAAY,GAAG,IAAI;CAK7D;AAED,qBAAa,eAAgB,SAAQ,eAAe;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE;CAOhD;AAED,qBAAa,wBAAyB,SAAQ,eAAe;;CAK5D;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,YAAY,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAa5D;AAED,qBAAa,cAAe,SAAQ,eAAe;aAG/B,UAAU,EAAE,MAAM;aAClB,YAAY,EAAE,OAAO;aACrB,QAAQ,EAAE,MAAM,EAAE;gBAHlC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,OAAO,EACrB,QAAQ,GAAE,MAAM,EAAO;CAK1C"}
|