@linktr.ee/linkapp 0.0.1
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/bin/cli.js +6 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +141 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/build.d.ts +8 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +84 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/deploy.d.ts +12 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +158 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +73 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +77 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +6 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +25 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/test-url-match-rules.d.ts +7 -0
- package/dist/commands/test-url-match-rules.d.ts.map +1 -0
- package/dist/commands/test-url-match-rules.js +55 -0
- package/dist/commands/test-url-match-rules.js.map +1 -0
- package/dist/lib/auth/config.d.ts +3 -0
- package/dist/lib/auth/config.d.ts.map +1 -0
- package/dist/lib/auth/config.js +5 -0
- package/dist/lib/auth/config.js.map +1 -0
- package/dist/lib/auth/device-flow.d.ts +15 -0
- package/dist/lib/auth/device-flow.d.ts.map +1 -0
- package/dist/lib/auth/device-flow.js +28 -0
- package/dist/lib/auth/device-flow.js.map +1 -0
- package/dist/lib/auth/fetch-config.d.ts +3 -0
- package/dist/lib/auth/fetch-config.d.ts.map +1 -0
- package/dist/lib/auth/fetch-config.js +15 -0
- package/dist/lib/auth/fetch-config.js.map +1 -0
- package/dist/lib/auth/token-storage.d.ts +10 -0
- package/dist/lib/auth/token-storage.d.ts.map +1 -0
- package/dist/lib/auth/token-storage.js +79 -0
- package/dist/lib/auth/token-storage.js.map +1 -0
- package/dist/lib/build/detect-layouts.d.ts +22 -0
- package/dist/lib/build/detect-layouts.d.ts.map +1 -0
- package/dist/lib/build/detect-layouts.js +58 -0
- package/dist/lib/build/detect-layouts.js.map +1 -0
- package/dist/lib/deploy/generate-manifest-files.d.ts +2 -0
- package/dist/lib/deploy/generate-manifest-files.d.ts.map +1 -0
- package/dist/lib/deploy/generate-manifest-files.js +81 -0
- package/dist/lib/deploy/generate-manifest-files.js.map +1 -0
- package/dist/lib/deploy/pack-project.d.ts +7 -0
- package/dist/lib/deploy/pack-project.d.ts.map +1 -0
- package/dist/lib/deploy/pack-project.js +76 -0
- package/dist/lib/deploy/pack-project.js.map +1 -0
- package/dist/lib/deploy/test-url-match-rules.d.ts +6 -0
- package/dist/lib/deploy/test-url-match-rules.d.ts.map +1 -0
- package/dist/lib/deploy/test-url-match-rules.js +21 -0
- package/dist/lib/deploy/test-url-match-rules.js.map +1 -0
- package/dist/lib/deploy/upload.d.ts +12 -0
- package/dist/lib/deploy/upload.d.ts.map +1 -0
- package/dist/lib/deploy/upload.js +90 -0
- package/dist/lib/deploy/upload.js.map +1 -0
- package/dist/lib/deploy/validation.d.ts +9 -0
- package/dist/lib/deploy/validation.d.ts.map +1 -0
- package/dist/lib/deploy/validation.js +160 -0
- package/dist/lib/deploy/validation.js.map +1 -0
- package/dist/lib/utils/create-project.d.ts +8 -0
- package/dist/lib/utils/create-project.d.ts.map +1 -0
- package/dist/lib/utils/create-project.js +48 -0
- package/dist/lib/utils/create-project.js.map +1 -0
- package/dist/lib/utils/init-git.d.ts +2 -0
- package/dist/lib/utils/init-git.d.ts.map +1 -0
- package/dist/lib/utils/init-git.js +34 -0
- package/dist/lib/utils/init-git.js.map +1 -0
- package/dist/lib/utils/install-dependencies.d.ts +2 -0
- package/dist/lib/utils/install-dependencies.d.ts.map +1 -0
- package/dist/lib/utils/install-dependencies.js +20 -0
- package/dist/lib/utils/install-dependencies.js.map +1 -0
- package/dist/lib/utils/setup-runtime.d.ts +6 -0
- package/dist/lib/utils/setup-runtime.d.ts.map +1 -0
- package/dist/lib/utils/setup-runtime.js +103 -0
- package/dist/lib/utils/setup-runtime.js.map +1 -0
- package/dist/lib/vite/config-factory.d.ts +12 -0
- package/dist/lib/vite/config-factory.d.ts.map +1 -0
- package/dist/lib/vite/config-factory.js +55 -0
- package/dist/lib/vite/config-factory.js.map +1 -0
- package/dist/lib/vite/plugins/asset-versioning.d.ts +11 -0
- package/dist/lib/vite/plugins/asset-versioning.d.ts.map +1 -0
- package/dist/lib/vite/plugins/asset-versioning.js +50 -0
- package/dist/lib/vite/plugins/asset-versioning.js.map +1 -0
- package/dist/lib/vite/plugins/route-handler.d.ts +16 -0
- package/dist/lib/vite/plugins/route-handler.d.ts.map +1 -0
- package/dist/lib/vite/plugins/route-handler.js +108 -0
- package/dist/lib/vite/plugins/route-handler.js.map +1 -0
- package/dist/lib/vite/plugins/window-context.d.ts +7 -0
- package/dist/lib/vite/plugins/window-context.d.ts.map +1 -0
- package/dist/lib/vite/plugins/window-context.js +68 -0
- package/dist/lib/vite/plugins/window-context.js.map +1 -0
- package/dist/schema/config.schema.d.ts +229 -0
- package/dist/schema/config.schema.d.ts.map +1 -0
- package/dist/schema/config.schema.js +116 -0
- package/dist/schema/config.schema.js.map +1 -0
- package/dist/schema/index.d.ts +8 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +8 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/types.d.ts +140 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +70 -0
- package/runtime/index.html +12 -0
package/bin/cli.js
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { cac } from 'cac';
|
|
3
|
+
import { devCommand } from './commands/dev.js';
|
|
4
|
+
import { buildCommand } from './commands/build.js';
|
|
5
|
+
import { deployCommand } from './commands/deploy.js';
|
|
6
|
+
import { addCommand } from './commands/add.js';
|
|
7
|
+
import { loginCommand } from './commands/login.js';
|
|
8
|
+
import { logoutCommand } from './commands/logout.js';
|
|
9
|
+
import { testUrlMatchRulesCommand } from './commands/test-url-match-rules.js';
|
|
10
|
+
const cli = cac('linkapp');
|
|
11
|
+
// Package info
|
|
12
|
+
const version = '0.0.1';
|
|
13
|
+
cli
|
|
14
|
+
.version(version)
|
|
15
|
+
.help();
|
|
16
|
+
// Dev command
|
|
17
|
+
cli
|
|
18
|
+
.command('dev', 'Start development server with preview')
|
|
19
|
+
.option('--port <port>', 'Preview server port (default: 3000)', { default: 3000 })
|
|
20
|
+
.option('--no-open', 'Do not open browser automatically')
|
|
21
|
+
.action(devCommand);
|
|
22
|
+
// Build command
|
|
23
|
+
cli
|
|
24
|
+
.command('build', 'Build LinkApp for production')
|
|
25
|
+
.option('--analyze', 'Generate bundle analysis report (deprecated, use --profile)')
|
|
26
|
+
.option('--profile', 'Enable build profiling and bundle analysis')
|
|
27
|
+
.option('--sourcemap', 'Generate sourcemaps for production build')
|
|
28
|
+
.action(buildCommand);
|
|
29
|
+
// Deploy command
|
|
30
|
+
cli
|
|
31
|
+
.command('deploy', 'Deploy LinkApp to Linktree')
|
|
32
|
+
.option('--env <environment>', 'Deployment environment (production or qa)', { default: 'production' })
|
|
33
|
+
.action(deployCommand);
|
|
34
|
+
// Add command
|
|
35
|
+
cli
|
|
36
|
+
.command('add [component]', 'Add a component from the registry')
|
|
37
|
+
.action(addCommand);
|
|
38
|
+
// Login command
|
|
39
|
+
cli
|
|
40
|
+
.command('login', 'Authenticate with Linktree')
|
|
41
|
+
.action(loginCommand);
|
|
42
|
+
// Logout command
|
|
43
|
+
cli
|
|
44
|
+
.command('logout', 'Sign out of Linktree')
|
|
45
|
+
.action(logoutCommand);
|
|
46
|
+
// Test URL match rules
|
|
47
|
+
cli
|
|
48
|
+
.command('test-url-match-rules <url>', 'Test URL match rules against a URL')
|
|
49
|
+
.action(testUrlMatchRulesCommand);
|
|
50
|
+
// Parse and run
|
|
51
|
+
cli.parse();
|
|
52
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE7E,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAA;AAE1B,eAAe;AACf,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB,GAAG;KACA,OAAO,CAAC,OAAO,CAAC;KAChB,IAAI,EAAE,CAAA;AAET,cAAc;AACd,GAAG;KACA,OAAO,CAAC,KAAK,EAAE,uCAAuC,CAAC;KACvD,MAAM,CAAC,eAAe,EAAE,qCAAqC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KACjF,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,gBAAgB;AAChB,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,8BAA8B,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,6DAA6D,CAAC;KAClF,MAAM,CAAC,WAAW,EAAE,4CAA4C,CAAC;KACjE,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,iBAAiB;AACjB,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;KACrG,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,cAAc;AACd,GAAG;KACA,OAAO,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC/D,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,gBAAgB;AAChB,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,4BAA4B,CAAC;KAC9C,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,iBAAiB;AACjB,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC;KACzC,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,uBAAuB;AACvB,GAAG;KACA,OAAO,CAAC,4BAA4B,EAAE,oCAAoC,CAAC;KAC3E,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAEnC,gBAAgB;AAChB,GAAG,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAMA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAkBD,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,iBA6IzE"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import * as p from '@clack/prompts';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { join, dirname } from 'node:path';
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
export async function addCommand(components, options) {
|
|
7
|
+
console.log(pc.cyan('📦 Adding components...\n'));
|
|
8
|
+
try {
|
|
9
|
+
// Load registry
|
|
10
|
+
const registryPath = join(__dirname, '../../registry/registry.json');
|
|
11
|
+
if (!existsSync(registryPath)) {
|
|
12
|
+
console.log(pc.red('✗ Component registry not found'));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const registry = JSON.parse(readFileSync(registryPath, 'utf-8'));
|
|
16
|
+
// If no components specified, show selection
|
|
17
|
+
let selectedComponents = components;
|
|
18
|
+
if (selectedComponents.length === 0) {
|
|
19
|
+
const choices = registry.components.map((c) => ({
|
|
20
|
+
value: c.name,
|
|
21
|
+
label: c.name,
|
|
22
|
+
hint: c.description,
|
|
23
|
+
}));
|
|
24
|
+
const selected = await p.multiselect({
|
|
25
|
+
message: 'Which components would you like to add?',
|
|
26
|
+
options: choices,
|
|
27
|
+
required: true,
|
|
28
|
+
});
|
|
29
|
+
if (p.isCancel(selected)) {
|
|
30
|
+
console.log(pc.dim('\\nCancelled'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
selectedComponents = selected;
|
|
34
|
+
}
|
|
35
|
+
// Validate all components exist
|
|
36
|
+
const invalidComponents = selectedComponents.filter((name) => !registry.components.find((c) => c.name === name));
|
|
37
|
+
if (invalidComponents.length > 0) {
|
|
38
|
+
console.log(pc.red(`\\n✗ Unknown components: ${invalidComponents.join(', ')}`));
|
|
39
|
+
console.log(pc.dim('\\nAvailable components:'));
|
|
40
|
+
for (const component of registry.components) {
|
|
41
|
+
console.log(pc.dim(` • ${component.name} - ${component.description}`));
|
|
42
|
+
}
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
// Ensure components directory exists
|
|
46
|
+
const projectPath = process.cwd();
|
|
47
|
+
const componentsDir = join(projectPath, 'src', 'components', 'ui');
|
|
48
|
+
if (!existsSync(componentsDir)) {
|
|
49
|
+
mkdirSync(componentsDir, { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
// Track dependencies to install
|
|
52
|
+
const allDependencies = new Set();
|
|
53
|
+
// Install each component
|
|
54
|
+
const s = p.spinner();
|
|
55
|
+
for (const componentName of selectedComponents) {
|
|
56
|
+
const component = registry.components.find((c) => c.name === componentName);
|
|
57
|
+
s.start(`Installing ${componentName}`);
|
|
58
|
+
// Copy component files
|
|
59
|
+
for (const file of component.files) {
|
|
60
|
+
const sourcePath = join(__dirname, '../../registry', file.path);
|
|
61
|
+
const targetPath = join(projectPath, 'src', file.path);
|
|
62
|
+
// Check if file exists
|
|
63
|
+
if (existsSync(targetPath) && !options.overwrite) {
|
|
64
|
+
const shouldOverwrite = options.yes ||
|
|
65
|
+
(await p.confirm({
|
|
66
|
+
message: `${file.path} already exists. Overwrite?`,
|
|
67
|
+
initialValue: false,
|
|
68
|
+
}));
|
|
69
|
+
if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {
|
|
70
|
+
s.stop(`Skipped ${componentName}`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Ensure target directory exists
|
|
75
|
+
const targetDir = dirname(targetPath);
|
|
76
|
+
if (!existsSync(targetDir)) {
|
|
77
|
+
mkdirSync(targetDir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
// Copy file
|
|
80
|
+
const content = readFileSync(sourcePath, 'utf-8');
|
|
81
|
+
writeFileSync(targetPath, content, 'utf-8');
|
|
82
|
+
}
|
|
83
|
+
// Collect dependencies
|
|
84
|
+
for (const dep of component.dependencies) {
|
|
85
|
+
allDependencies.add(dep);
|
|
86
|
+
}
|
|
87
|
+
s.stop(`Installed ${componentName}`);
|
|
88
|
+
}
|
|
89
|
+
// Install dependencies
|
|
90
|
+
if (allDependencies.size > 0) {
|
|
91
|
+
const shouldInstall = options.yes ||
|
|
92
|
+
(await p.confirm({
|
|
93
|
+
message: `Install dependencies (${Array.from(allDependencies).join(', ')})?`,
|
|
94
|
+
initialValue: true,
|
|
95
|
+
}));
|
|
96
|
+
if (!p.isCancel(shouldInstall) && shouldInstall) {
|
|
97
|
+
s.start('Installing dependencies with npm');
|
|
98
|
+
await installDependencies(Array.from(allDependencies));
|
|
99
|
+
s.stop('Dependencies installed');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Success message
|
|
103
|
+
console.log(pc.green('\\n✓ Components added successfully!\\n'));
|
|
104
|
+
console.log(pc.dim('Components installed:'));
|
|
105
|
+
for (const name of selectedComponents) {
|
|
106
|
+
console.log(pc.dim(` • ${name} - src/components/ui/${name}.tsx`));
|
|
107
|
+
}
|
|
108
|
+
if (allDependencies.size > 0) {
|
|
109
|
+
console.log(pc.dim('\\nDependencies:'));
|
|
110
|
+
for (const dep of allDependencies) {
|
|
111
|
+
console.log(pc.dim(` • ${dep}`));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
console.log();
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error(pc.red('\\n✗ Failed to add components:'), error);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function installDependencies(dependencies) {
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
const child = spawn('npm', ['install', ...dependencies], {
|
|
124
|
+
cwd: process.cwd(),
|
|
125
|
+
stdio: 'pipe',
|
|
126
|
+
shell: true,
|
|
127
|
+
});
|
|
128
|
+
child.on('close', (code) => {
|
|
129
|
+
if (code === 0) {
|
|
130
|
+
resolve();
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
reject(new Error(`npm install failed with code ${code}`));
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
child.on('error', (error) => {
|
|
137
|
+
reject(error);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,iBAqDvD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { build as viteBuild } from 'vite';
|
|
3
|
+
import { createViteConfig } from '../lib/vite/config-factory.js';
|
|
4
|
+
import { existsSync, statSync, readdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
export async function buildCommand(options) {
|
|
7
|
+
console.log(pc.cyan('🏗️ Building for production...\n'));
|
|
8
|
+
const startTime = Date.now();
|
|
9
|
+
try {
|
|
10
|
+
// Use profile flag, fall back to analyze for backward compatibility
|
|
11
|
+
const enableProfiling = options.profile || options.analyze || false;
|
|
12
|
+
const config = createViteConfig({
|
|
13
|
+
mode: 'production',
|
|
14
|
+
sourcemap: options.sourcemap || false,
|
|
15
|
+
profile: enableProfiling,
|
|
16
|
+
});
|
|
17
|
+
// Run Vite build
|
|
18
|
+
const result = await viteBuild(config);
|
|
19
|
+
const endTime = Date.now();
|
|
20
|
+
const duration = ((endTime - startTime) / 1000).toFixed(2);
|
|
21
|
+
console.log(pc.green(`\n✓ Build completed in ${duration}s\n`));
|
|
22
|
+
// Show bundle info
|
|
23
|
+
if (Array.isArray(result)) {
|
|
24
|
+
// Multiple builds
|
|
25
|
+
for (const output of result) {
|
|
26
|
+
if ('output' in output) {
|
|
27
|
+
showBundleInfo(output.output);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (result && 'output' in result) {
|
|
32
|
+
showBundleInfo(result.output);
|
|
33
|
+
}
|
|
34
|
+
// Show dist directory size
|
|
35
|
+
const distPath = join(process.cwd(), 'dist');
|
|
36
|
+
if (existsSync(distPath)) {
|
|
37
|
+
const totalSize = getDirSize(distPath);
|
|
38
|
+
const sizeKB = (totalSize / 1024).toFixed(1);
|
|
39
|
+
console.log(pc.dim(`Total dist size: ${sizeKB} KB\n`));
|
|
40
|
+
}
|
|
41
|
+
if (enableProfiling) {
|
|
42
|
+
console.log(pc.cyan('\n📊 Bundle analysis files generated:'));
|
|
43
|
+
console.log(pc.cyan(' 📄 Bundle report: dist/stats.html'));
|
|
44
|
+
console.log(pc.cyan(' 💡 Open stats.html in your browser to analyze bundle size'));
|
|
45
|
+
console.log(pc.cyan('\n🔍 Detailed profiling enabled - check build output above for timing breakdown\n'));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error(pc.red('Build failed:'), error);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function showBundleInfo(output) {
|
|
54
|
+
if (!Array.isArray(output))
|
|
55
|
+
return;
|
|
56
|
+
console.log(pc.bold('Build output:'));
|
|
57
|
+
for (const chunk of output) {
|
|
58
|
+
if (chunk.type === 'chunk') {
|
|
59
|
+
const sizeKB = (chunk.code.length / 1024).toFixed(1);
|
|
60
|
+
console.log(pc.dim(` ${chunk.fileName} ${sizeKB} KB`));
|
|
61
|
+
}
|
|
62
|
+
else if (chunk.type === 'asset') {
|
|
63
|
+
const size = typeof chunk.source === 'string' ? chunk.source.length : chunk.source.byteLength;
|
|
64
|
+
const sizeKB = (size / 1024).toFixed(1);
|
|
65
|
+
console.log(pc.dim(` ${chunk.fileName} ${sizeKB} KB`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function getDirSize(dirPath) {
|
|
70
|
+
let totalSize = 0;
|
|
71
|
+
const files = readdirSync(dirPath);
|
|
72
|
+
for (const file of files) {
|
|
73
|
+
const filePath = join(dirPath, file);
|
|
74
|
+
const stats = statSync(filePath);
|
|
75
|
+
if (stats.isDirectory()) {
|
|
76
|
+
totalSize += getDirSize(filePath);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
totalSize += stats.size;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return totalSize;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface DeployOptions {
|
|
2
|
+
path?: string;
|
|
3
|
+
endpoint?: string;
|
|
4
|
+
qa?: boolean;
|
|
5
|
+
skipBuild?: boolean;
|
|
6
|
+
skipChecks?: boolean;
|
|
7
|
+
force?: boolean;
|
|
8
|
+
skipConfirm?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function deployCommand(options: DeployOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAYA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,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,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,iBAgJzD"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import * as p from '@clack/prompts';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { getAppConfig } from '../lib/auth/config.js';
|
|
6
|
+
import { getToken } from '../lib/auth/token-storage.js';
|
|
7
|
+
import { validateProject, printValidationResults } from '../lib/deploy/validation.js';
|
|
8
|
+
import { packProject } from '../lib/deploy/pack-project.js';
|
|
9
|
+
import { uploadAssets, checkLinkAppExists } from '../lib/deploy/upload.js';
|
|
10
|
+
import { generateManifestFiles } from '../lib/deploy/generate-manifest-files.js';
|
|
11
|
+
import { buildCommand } from './build.js';
|
|
12
|
+
export async function deployCommand(options) {
|
|
13
|
+
const env = options.qa ? 'QA' : 'Production';
|
|
14
|
+
console.log(pc.cyan(`🚀 Deploying to ${env}...\n`));
|
|
15
|
+
try {
|
|
16
|
+
const config = await getAppConfig(options.qa ? 'qa' : 'production');
|
|
17
|
+
const projectPath = options.path ?? process.cwd();
|
|
18
|
+
// Check authentication
|
|
19
|
+
const accessToken = getToken(config.auth.audience);
|
|
20
|
+
if (!accessToken) {
|
|
21
|
+
console.log(pc.red('✗ Not authenticated'));
|
|
22
|
+
console.log(pc.dim(` Run: linkapp login${options.qa ? ' --qa' : ''}\n`));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
// Run build if needed
|
|
26
|
+
if (!options.skipBuild) {
|
|
27
|
+
const distPath = join(projectPath, 'dist');
|
|
28
|
+
if (!existsSync(distPath)) {
|
|
29
|
+
console.log(pc.cyan('📦 Building project...\n'));
|
|
30
|
+
await buildCommand({ sourcemap: false });
|
|
31
|
+
console.log();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Pre-deployment validation
|
|
35
|
+
if (!options.skipChecks) {
|
|
36
|
+
console.log(pc.cyan('🔍 Running pre-deployment checks...\n'));
|
|
37
|
+
const validationResult = await validateProject();
|
|
38
|
+
printValidationResults(validationResult);
|
|
39
|
+
if (!validationResult.success) {
|
|
40
|
+
console.log(pc.red('\n✗ Pre-deployment validation failed\n'));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
console.log();
|
|
44
|
+
}
|
|
45
|
+
const s = p.spinner();
|
|
46
|
+
// Generate manifest files from config
|
|
47
|
+
s.start('Generating manifest files');
|
|
48
|
+
await generateManifestFiles(projectPath);
|
|
49
|
+
s.stop('Manifest files generated');
|
|
50
|
+
// Get LinkApp ID from config (check root first, then .config for backward compatibility)
|
|
51
|
+
const rootConfigPath = join(projectPath, 'linkapp.config.ts');
|
|
52
|
+
const nestedConfigPath = join(projectPath, '.config', 'linkapp.config.ts');
|
|
53
|
+
const configPath = existsSync(rootConfigPath) ? rootConfigPath : nestedConfigPath;
|
|
54
|
+
const linkAppId = await getLinkAppId(configPath);
|
|
55
|
+
// Check if LinkApp exists
|
|
56
|
+
s.start('Checking LinkApp status');
|
|
57
|
+
const apiUrl = options.endpoint ?? `${config.link_types_url}/link-types`;
|
|
58
|
+
const exists = await checkLinkAppExists(apiUrl, linkAppId, accessToken);
|
|
59
|
+
s.stop(exists ? 'LinkApp exists, updating' : 'Creating new LinkApp');
|
|
60
|
+
// Pack project
|
|
61
|
+
s.start('Packing project files');
|
|
62
|
+
const packedFiles = await packProject({ projectPath });
|
|
63
|
+
s.stop(`Packed ${packedFiles.length} items`);
|
|
64
|
+
// Show files to upload
|
|
65
|
+
console.log(pc.dim('\nFiles to upload:'));
|
|
66
|
+
for (const file of packedFiles.slice(0, 10)) {
|
|
67
|
+
console.log(pc.dim(` • ${file}`));
|
|
68
|
+
}
|
|
69
|
+
if (packedFiles.length > 10) {
|
|
70
|
+
console.log(pc.dim(` ... and ${packedFiles.length - 10} more`));
|
|
71
|
+
}
|
|
72
|
+
// Confirm deployment
|
|
73
|
+
if (!options.skipConfirm) {
|
|
74
|
+
const shouldDeploy = await p.confirm({
|
|
75
|
+
message: `Deploy to ${env}?`,
|
|
76
|
+
initialValue: true,
|
|
77
|
+
});
|
|
78
|
+
if (p.isCancel(shouldDeploy) || !shouldDeploy) {
|
|
79
|
+
console.log(pc.dim('\nDeployment cancelled'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Upload
|
|
84
|
+
s.start('Uploading assets');
|
|
85
|
+
const result = await uploadAssets({
|
|
86
|
+
projectPath,
|
|
87
|
+
apiUrl,
|
|
88
|
+
accessToken,
|
|
89
|
+
isUpdate: exists,
|
|
90
|
+
forceUpdate: options.force,
|
|
91
|
+
});
|
|
92
|
+
s.stop('Assets uploaded');
|
|
93
|
+
// Show success
|
|
94
|
+
console.log(pc.green('\n✓ Deployment successful!\n'));
|
|
95
|
+
console.log(pc.bold('LinkApp Details:'));
|
|
96
|
+
console.log(pc.dim(` ID: ${result.linkType.linkTypeId}`));
|
|
97
|
+
console.log(pc.dim(` Status: ${result.linkType.status}`));
|
|
98
|
+
console.log(pc.dim(` Updated: ${new Date(result.linkType.updatedTimestamp * 1000).toLocaleString()}`));
|
|
99
|
+
if (result.build?.id) {
|
|
100
|
+
const buildUrl = options.qa
|
|
101
|
+
? `https://buildkite.com/linktree/link-types-ci-service/builds/${result.build.id}`
|
|
102
|
+
: `https://linkapp-ci.replit.app/?linkTypeId=${result.linkType.linkTypeId}&buildId=${result.build.id}`;
|
|
103
|
+
console.log(pc.dim(` Build: ${buildUrl}`));
|
|
104
|
+
}
|
|
105
|
+
const createUrl = options.qa
|
|
106
|
+
? `https://qa.linktr.ee/admin?action=create-link&linkType=${result.linkType.linkTypeId}`
|
|
107
|
+
: `https://linktr.ee/admin?action=create-link&linkType=${result.linkType.linkTypeId}`;
|
|
108
|
+
console.log(pc.cyan(`\n🔗 Test LinkApp: ${createUrl}\n`));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.log(pc.red('\n✗ Deployment failed\n'));
|
|
112
|
+
// Check if this is our structured error with API details
|
|
113
|
+
if (error && typeof error === 'object' && 'statusCode' in error && 'messages' in error) {
|
|
114
|
+
const structuredError = error;
|
|
115
|
+
console.log(pc.bold('Error Details:'));
|
|
116
|
+
console.log(pc.dim(` Status Code: ${structuredError.statusCode}`));
|
|
117
|
+
if (Array.isArray(structuredError.messages) && structuredError.messages.length > 0) {
|
|
118
|
+
console.log(pc.dim('\n Validation Errors:'));
|
|
119
|
+
for (const msg of structuredError.messages) {
|
|
120
|
+
console.log(pc.dim(` • ${msg}`));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (structuredError.responseData?.error) {
|
|
124
|
+
console.log(pc.dim(`\n Error Type: ${structuredError.responseData.error}`));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else if (error instanceof Error) {
|
|
128
|
+
console.log(pc.dim(` ${error.message}`));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.log(pc.dim(` ${String(error)}`));
|
|
132
|
+
}
|
|
133
|
+
console.log(); // Empty line
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function getLinkAppId(configPath) {
|
|
138
|
+
// Load the TypeScript config using jiti to get the explicit linkAppId
|
|
139
|
+
const { createJiti } = await import('jiti');
|
|
140
|
+
const jiti = createJiti(import.meta.url, {
|
|
141
|
+
interopDefault: true,
|
|
142
|
+
moduleCache: false,
|
|
143
|
+
});
|
|
144
|
+
try {
|
|
145
|
+
const config = jiti(configPath);
|
|
146
|
+
if (!config?.id) {
|
|
147
|
+
throw new Error('id is required in configuration');
|
|
148
|
+
}
|
|
149
|
+
return config.id;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (error instanceof Error && error.message.includes('id is required')) {
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
throw new Error(`Failed to load id from config: ${error instanceof Error ? error.message : error}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAWA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,iBAyEnD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import * as p from '@clack/prompts';
|
|
3
|
+
import { createServer as createViteServer } from 'vite';
|
|
4
|
+
import open from 'open';
|
|
5
|
+
import { dirname, resolve } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { validateLayouts } from '../lib/build/detect-layouts.js';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
export async function devCommand(options) {
|
|
11
|
+
const userProjectPath = process.cwd();
|
|
12
|
+
const s = p.spinner();
|
|
13
|
+
try {
|
|
14
|
+
const startTime = Date.now();
|
|
15
|
+
// Validate layouts exist
|
|
16
|
+
s.start('Validating project structure');
|
|
17
|
+
const validation = validateLayouts(userProjectPath);
|
|
18
|
+
if (!validation.valid) {
|
|
19
|
+
s.stop(pc.red('✗ Invalid project structure'));
|
|
20
|
+
for (const error of validation.errors) {
|
|
21
|
+
console.log(pc.red(` ${error}`));
|
|
22
|
+
}
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
s.stop();
|
|
26
|
+
const port = options.port || 3000;
|
|
27
|
+
const devServerPath = resolve(__dirname, '../../dev-server');
|
|
28
|
+
// Create Vite server - just like server.ts, but override @ alias to user's project root
|
|
29
|
+
const viteServer = await createViteServer({
|
|
30
|
+
configFile: resolve(devServerPath, 'vite.config.ts'),
|
|
31
|
+
root: devServerPath,
|
|
32
|
+
resolve: {
|
|
33
|
+
alias: {
|
|
34
|
+
'@': userProjectPath,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
server: {
|
|
38
|
+
port,
|
|
39
|
+
host: 'localhost',
|
|
40
|
+
open: false,
|
|
41
|
+
strictPort: false,
|
|
42
|
+
},
|
|
43
|
+
logLevel: 'error',
|
|
44
|
+
});
|
|
45
|
+
await viteServer.listen();
|
|
46
|
+
s.stop();
|
|
47
|
+
const readyTime = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
48
|
+
console.log();
|
|
49
|
+
console.log(pc.bold(pc.cyan(' LinkApp')) + pc.dim(' ready'));
|
|
50
|
+
console.log();
|
|
51
|
+
console.log(pc.green(' ➜') + pc.bold(' Local: ') + pc.cyan(`http://localhost:${port}`));
|
|
52
|
+
console.log();
|
|
53
|
+
if (!options.noOpen) {
|
|
54
|
+
open(`http://localhost:${port}`);
|
|
55
|
+
}
|
|
56
|
+
viteServer.bindCLIShortcuts({ print: true });
|
|
57
|
+
console.log(pc.dim(` ✓ Ready in ${readyTime}s`));
|
|
58
|
+
// Handle Ctrl+C
|
|
59
|
+
process.on('SIGINT', async () => {
|
|
60
|
+
console.log('\n');
|
|
61
|
+
await viteServer.close();
|
|
62
|
+
process.exit(0);
|
|
63
|
+
});
|
|
64
|
+
// Keep alive
|
|
65
|
+
await new Promise(() => { });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
s.stop(pc.red('✗ Failed to start server'));
|
|
69
|
+
console.error(pc.red('\n✗ Error:'), error);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,MAAM,CAAA;AACvD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEhE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAOrC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAmB;IAClD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACrC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IAErB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,yBAAyB;QACzB,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QACvC,MAAM,UAAU,GAAG,eAAe,CAAC,eAAe,CAAC,CAAA;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;YAC7C,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAA;YACnC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,CAAC,CAAC,IAAI,EAAE,CAAA;QAER,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAA;QACjC,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;QAE5D,wFAAwF;QACxF,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC;YACxC,UAAU,EAAE,OAAO,CAAC,aAAa,EAAE,gBAAgB,CAAC;YACpD,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL,GAAG,EAAE,eAAe;iBACrB;aACF;YACD,MAAM,EAAE;gBACN,IAAI;gBACJ,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,KAAK;gBACX,UAAU,EAAE,KAAK;aAClB;YACD,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;QAEF,MAAM,UAAU,CAAC,MAAM,EAAE,CAAA;QACzB,CAAC,CAAC,IAAI,EAAE,CAAA;QAER,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAE9D,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAA;QAC3F,OAAO,CAAC,GAAG,EAAE,CAAA;QAEb,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;QAClC,CAAC;QAED,UAAU,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAE5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,SAAS,GAAG,CAAC,CAAC,CAAA;QAEjD,gBAAgB;QAChB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;QAEF,aAAa;QACb,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAA;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAOA,UAAU,YAAY;IACpB,EAAE,CAAC,EAAE,OAAO,CAAA;CACb;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,iBA8EvD"}
|