@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.
Files changed (119) hide show
  1. package/bin/cli.js +6 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +52 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/add.d.ts +7 -0
  7. package/dist/commands/add.d.ts.map +1 -0
  8. package/dist/commands/add.js +141 -0
  9. package/dist/commands/add.js.map +1 -0
  10. package/dist/commands/build.d.ts +8 -0
  11. package/dist/commands/build.d.ts.map +1 -0
  12. package/dist/commands/build.js +84 -0
  13. package/dist/commands/build.js.map +1 -0
  14. package/dist/commands/deploy.d.ts +12 -0
  15. package/dist/commands/deploy.d.ts.map +1 -0
  16. package/dist/commands/deploy.js +158 -0
  17. package/dist/commands/deploy.js.map +1 -0
  18. package/dist/commands/dev.d.ts +7 -0
  19. package/dist/commands/dev.d.ts.map +1 -0
  20. package/dist/commands/dev.js +73 -0
  21. package/dist/commands/dev.js.map +1 -0
  22. package/dist/commands/login.d.ts +6 -0
  23. package/dist/commands/login.d.ts.map +1 -0
  24. package/dist/commands/login.js +77 -0
  25. package/dist/commands/login.js.map +1 -0
  26. package/dist/commands/logout.d.ts +6 -0
  27. package/dist/commands/logout.d.ts.map +1 -0
  28. package/dist/commands/logout.js +25 -0
  29. package/dist/commands/logout.js.map +1 -0
  30. package/dist/commands/test-url-match-rules.d.ts +7 -0
  31. package/dist/commands/test-url-match-rules.d.ts.map +1 -0
  32. package/dist/commands/test-url-match-rules.js +55 -0
  33. package/dist/commands/test-url-match-rules.js.map +1 -0
  34. package/dist/lib/auth/config.d.ts +3 -0
  35. package/dist/lib/auth/config.d.ts.map +1 -0
  36. package/dist/lib/auth/config.js +5 -0
  37. package/dist/lib/auth/config.js.map +1 -0
  38. package/dist/lib/auth/device-flow.d.ts +15 -0
  39. package/dist/lib/auth/device-flow.d.ts.map +1 -0
  40. package/dist/lib/auth/device-flow.js +28 -0
  41. package/dist/lib/auth/device-flow.js.map +1 -0
  42. package/dist/lib/auth/fetch-config.d.ts +3 -0
  43. package/dist/lib/auth/fetch-config.d.ts.map +1 -0
  44. package/dist/lib/auth/fetch-config.js +15 -0
  45. package/dist/lib/auth/fetch-config.js.map +1 -0
  46. package/dist/lib/auth/token-storage.d.ts +10 -0
  47. package/dist/lib/auth/token-storage.d.ts.map +1 -0
  48. package/dist/lib/auth/token-storage.js +79 -0
  49. package/dist/lib/auth/token-storage.js.map +1 -0
  50. package/dist/lib/build/detect-layouts.d.ts +22 -0
  51. package/dist/lib/build/detect-layouts.d.ts.map +1 -0
  52. package/dist/lib/build/detect-layouts.js +58 -0
  53. package/dist/lib/build/detect-layouts.js.map +1 -0
  54. package/dist/lib/deploy/generate-manifest-files.d.ts +2 -0
  55. package/dist/lib/deploy/generate-manifest-files.d.ts.map +1 -0
  56. package/dist/lib/deploy/generate-manifest-files.js +81 -0
  57. package/dist/lib/deploy/generate-manifest-files.js.map +1 -0
  58. package/dist/lib/deploy/pack-project.d.ts +7 -0
  59. package/dist/lib/deploy/pack-project.d.ts.map +1 -0
  60. package/dist/lib/deploy/pack-project.js +76 -0
  61. package/dist/lib/deploy/pack-project.js.map +1 -0
  62. package/dist/lib/deploy/test-url-match-rules.d.ts +6 -0
  63. package/dist/lib/deploy/test-url-match-rules.d.ts.map +1 -0
  64. package/dist/lib/deploy/test-url-match-rules.js +21 -0
  65. package/dist/lib/deploy/test-url-match-rules.js.map +1 -0
  66. package/dist/lib/deploy/upload.d.ts +12 -0
  67. package/dist/lib/deploy/upload.d.ts.map +1 -0
  68. package/dist/lib/deploy/upload.js +90 -0
  69. package/dist/lib/deploy/upload.js.map +1 -0
  70. package/dist/lib/deploy/validation.d.ts +9 -0
  71. package/dist/lib/deploy/validation.d.ts.map +1 -0
  72. package/dist/lib/deploy/validation.js +160 -0
  73. package/dist/lib/deploy/validation.js.map +1 -0
  74. package/dist/lib/utils/create-project.d.ts +8 -0
  75. package/dist/lib/utils/create-project.d.ts.map +1 -0
  76. package/dist/lib/utils/create-project.js +48 -0
  77. package/dist/lib/utils/create-project.js.map +1 -0
  78. package/dist/lib/utils/init-git.d.ts +2 -0
  79. package/dist/lib/utils/init-git.d.ts.map +1 -0
  80. package/dist/lib/utils/init-git.js +34 -0
  81. package/dist/lib/utils/init-git.js.map +1 -0
  82. package/dist/lib/utils/install-dependencies.d.ts +2 -0
  83. package/dist/lib/utils/install-dependencies.d.ts.map +1 -0
  84. package/dist/lib/utils/install-dependencies.js +20 -0
  85. package/dist/lib/utils/install-dependencies.js.map +1 -0
  86. package/dist/lib/utils/setup-runtime.d.ts +6 -0
  87. package/dist/lib/utils/setup-runtime.d.ts.map +1 -0
  88. package/dist/lib/utils/setup-runtime.js +103 -0
  89. package/dist/lib/utils/setup-runtime.js.map +1 -0
  90. package/dist/lib/vite/config-factory.d.ts +12 -0
  91. package/dist/lib/vite/config-factory.d.ts.map +1 -0
  92. package/dist/lib/vite/config-factory.js +55 -0
  93. package/dist/lib/vite/config-factory.js.map +1 -0
  94. package/dist/lib/vite/plugins/asset-versioning.d.ts +11 -0
  95. package/dist/lib/vite/plugins/asset-versioning.d.ts.map +1 -0
  96. package/dist/lib/vite/plugins/asset-versioning.js +50 -0
  97. package/dist/lib/vite/plugins/asset-versioning.js.map +1 -0
  98. package/dist/lib/vite/plugins/route-handler.d.ts +16 -0
  99. package/dist/lib/vite/plugins/route-handler.d.ts.map +1 -0
  100. package/dist/lib/vite/plugins/route-handler.js +108 -0
  101. package/dist/lib/vite/plugins/route-handler.js.map +1 -0
  102. package/dist/lib/vite/plugins/window-context.d.ts +7 -0
  103. package/dist/lib/vite/plugins/window-context.d.ts.map +1 -0
  104. package/dist/lib/vite/plugins/window-context.js +68 -0
  105. package/dist/lib/vite/plugins/window-context.js.map +1 -0
  106. package/dist/schema/config.schema.d.ts +229 -0
  107. package/dist/schema/config.schema.d.ts.map +1 -0
  108. package/dist/schema/config.schema.js +116 -0
  109. package/dist/schema/config.schema.js.map +1 -0
  110. package/dist/schema/index.d.ts +8 -0
  111. package/dist/schema/index.d.ts.map +1 -0
  112. package/dist/schema/index.js +8 -0
  113. package/dist/schema/index.js.map +1 -0
  114. package/dist/types.d.ts +140 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +2 -0
  117. package/dist/types.js.map +1 -0
  118. package/package.json +70 -0
  119. package/runtime/index.html +12 -0
@@ -0,0 +1,76 @@
1
+ import archiver from 'archiver';
2
+ import { createWriteStream, existsSync, statSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ export async function packProject(options = {}) {
5
+ const projectPath = options.projectPath || process.cwd();
6
+ const outputPath = options.outputPath || join(projectPath, 'package.tgz');
7
+ // Check for config file in both locations (root first, then .config for backward compatibility)
8
+ const rootConfigPath = join(projectPath, 'linkapp.config.ts');
9
+ const configPath = existsSync(rootConfigPath) ? 'linkapp.config.ts' : '.config/linkapp.config.ts';
10
+ const requiredFiles = [configPath];
11
+ const optionalFiles = ['package.json', 'package-lock.json', 'README.md'];
12
+ const requiredDirs = ['dist'];
13
+ const packedFiles = [];
14
+ // Validate required files exist
15
+ for (const file of requiredFiles) {
16
+ const filePath = join(projectPath, file);
17
+ if (!existsSync(filePath)) {
18
+ throw new Error(`Required file missing: ${file}`);
19
+ }
20
+ }
21
+ // Validate dist directory exists
22
+ for (const dir of requiredDirs) {
23
+ const dirPath = join(projectPath, dir);
24
+ if (!existsSync(dirPath) || !statSync(dirPath).isDirectory()) {
25
+ throw new Error(`Required directory missing: ${dir}. Run 'linkapp build' first.`);
26
+ }
27
+ }
28
+ return new Promise((resolve, reject) => {
29
+ const output = createWriteStream(outputPath);
30
+ const archive = archiver('tar', {
31
+ gzip: true,
32
+ gzipOptions: { level: 9 },
33
+ });
34
+ output.on('close', () => {
35
+ resolve(packedFiles);
36
+ });
37
+ archive.on('error', (err) => {
38
+ reject(err);
39
+ });
40
+ archive.on('warning', (err) => {
41
+ if (err.code === 'ENOENT') {
42
+ console.warn('Warning:', err.message);
43
+ }
44
+ else {
45
+ reject(err);
46
+ }
47
+ });
48
+ archive.pipe(output);
49
+ // Add required files
50
+ for (const file of requiredFiles) {
51
+ const filePath = join(projectPath, file);
52
+ if (existsSync(filePath)) {
53
+ archive.file(filePath, { name: file });
54
+ packedFiles.push(file);
55
+ }
56
+ }
57
+ // Add optional files
58
+ for (const file of optionalFiles) {
59
+ const filePath = join(projectPath, file);
60
+ if (existsSync(filePath)) {
61
+ archive.file(filePath, { name: file });
62
+ packedFiles.push(file);
63
+ }
64
+ }
65
+ // Add directories
66
+ for (const dir of requiredDirs) {
67
+ const dirPath = join(projectPath, dir);
68
+ if (existsSync(dirPath)) {
69
+ archive.directory(dirPath, dir);
70
+ packedFiles.push(`${dir}/`);
71
+ }
72
+ }
73
+ archive.finalize();
74
+ });
75
+ }
76
+ //# sourceMappingURL=pack-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-project.js","sourceRoot":"","sources":["../../../src/lib/deploy/pack-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface TestUrlMatchRulesResult {
2
+ success: boolean;
3
+ [key: string]: any;
4
+ }
5
+ export declare function testUrlMatchRules(endpoint: string, url: string, rules: any, accessToken: string): Promise<TestUrlMatchRulesResult>;
6
+ //# sourceMappingURL=test-url-match-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-url-match-rules.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/test-url-match-rules.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,EACV,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAsBlC"}
@@ -0,0 +1,21 @@
1
+ import axios from 'axios';
2
+ export async function testUrlMatchRules(endpoint, url, rules, accessToken) {
3
+ try {
4
+ const response = await axios.post(`${endpoint}/test-url-match-rules`, {
5
+ url,
6
+ rules,
7
+ }, {
8
+ headers: {
9
+ Authorization: `Bearer ${accessToken}`,
10
+ },
11
+ });
12
+ return response.data;
13
+ }
14
+ catch (err) {
15
+ if (axios.isAxiosError(err) && err.response) {
16
+ return err.response.data;
17
+ }
18
+ throw err;
19
+ }
20
+ }
21
+ //# sourceMappingURL=test-url-match-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-url-match-rules.js","sourceRoot":"","sources":["../../../src/lib/deploy/test-url-match-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,GAAW,EACX,KAAU,EACV,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,QAAQ,uBAAuB,EAClC;YACE,GAAG;YACH,KAAK;SACN,EACD;YACE,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;aACvC;SACF,CACF,CAAA;QAED,OAAO,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC5C,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAA;QAC1B,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DeployResponse } from '../../types.js';
2
+ interface UploadOptions {
3
+ projectPath?: string | undefined;
4
+ apiUrl: string;
5
+ accessToken: string;
6
+ isUpdate?: boolean | undefined;
7
+ forceUpdate?: boolean | undefined;
8
+ }
9
+ export declare function uploadAssets(options: UploadOptions): Promise<DeployResponse>;
10
+ export declare function checkLinkAppExists(apiUrl: string, linkAppId: string, accessToken: string): Promise<boolean>;
11
+ export {};
12
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/upload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,UAAU,aAAa;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC9B,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAClC;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CA6ElF;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcjH"}
@@ -0,0 +1,90 @@
1
+ import axios from 'axios';
2
+ import FormData from 'form-data';
3
+ import { createReadStream, existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ export async function uploadAssets(options) {
6
+ const projectPath = options.projectPath || process.cwd();
7
+ const linkappDir = join(projectPath, '.linkapp');
8
+ const packagePath = join(projectPath, 'package.tgz');
9
+ const manifestPath = join(linkappDir, 'manifest.json');
10
+ const settingsPath = join(linkappDir, 'settings.json');
11
+ const urlMatchRulesPath = join(linkappDir, 'url_match_rules.json');
12
+ const iconPath = join(projectPath, 'icon.svg');
13
+ // Required files
14
+ if (!existsSync(packagePath)) {
15
+ throw new Error('Package file not found. Run pack step first.');
16
+ }
17
+ if (!existsSync(manifestPath)) {
18
+ throw new Error('Manifest file not found. Generate manifest.json from config.');
19
+ }
20
+ const form = new FormData();
21
+ // Add required files with correct content types
22
+ form.append('package', createReadStream(packagePath), {
23
+ contentType: 'application/gzip',
24
+ filename: 'package.tgz'
25
+ });
26
+ form.append('manifest', createReadStream(manifestPath), {
27
+ contentType: 'application/json',
28
+ filename: 'manifest.json'
29
+ });
30
+ // Add optional files
31
+ if (existsSync(settingsPath)) {
32
+ form.append('settings', createReadStream(settingsPath), {
33
+ contentType: 'application/json',
34
+ filename: 'settings.json'
35
+ });
36
+ }
37
+ if (existsSync(urlMatchRulesPath)) {
38
+ form.append('url_match_rules', createReadStream(urlMatchRulesPath), {
39
+ contentType: 'application/json',
40
+ filename: 'url_match_rules.json'
41
+ });
42
+ }
43
+ if (existsSync(iconPath)) {
44
+ form.append('icon', createReadStream(iconPath), {
45
+ contentType: 'image/svg+xml',
46
+ filename: 'icon.svg'
47
+ });
48
+ }
49
+ const headers = {
50
+ ...form.getHeaders(),
51
+ Authorization: `Bearer ${options.accessToken}`,
52
+ };
53
+ if (options.isUpdate && options.forceUpdate) {
54
+ headers['force-update'] = 'true';
55
+ }
56
+ try {
57
+ const method = options.isUpdate ? 'put' : 'post';
58
+ const response = await axios[method](options.apiUrl, form, { headers });
59
+ return response.data;
60
+ }
61
+ catch (error) {
62
+ if (axios.isAxiosError(error) && error.response?.data) {
63
+ const errorData = error.response.data;
64
+ // Create a more detailed error message
65
+ const detailedError = new Error('API request failed');
66
+ detailedError.statusCode = error.response.status;
67
+ detailedError.responseData = errorData;
68
+ detailedError.messages = errorData.message || [];
69
+ throw detailedError;
70
+ }
71
+ throw error;
72
+ }
73
+ }
74
+ export async function checkLinkAppExists(apiUrl, linkAppId, accessToken) {
75
+ try {
76
+ await axios.get(`${apiUrl}/${linkAppId}`, {
77
+ headers: {
78
+ Authorization: `Bearer ${accessToken}`,
79
+ },
80
+ });
81
+ return true;
82
+ }
83
+ catch (error) {
84
+ if (axios.isAxiosError(error) && error.response?.status === 404) {
85
+ return false;
86
+ }
87
+ throw error;
88
+ }
89
+ }
90
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/lib/deploy/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface ValidationResult {
2
+ success: boolean;
3
+ errors: string[];
4
+ warnings: string[];
5
+ }
6
+ export declare function validateProject(projectPath?: string): Promise<ValidationResult>;
7
+ export declare function printValidationResults(result: ValidationResult): void;
8
+ export {};
9
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/lib/deploy/validation.ts"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAsB,eAAe,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2DpG;AAgGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAkBrE"}
@@ -0,0 +1,160 @@
1
+ import { existsSync, statSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { spawn } from 'node:child_process';
4
+ import pc from 'picocolors';
5
+ import { ZodError } from 'zod';
6
+ export async function validateProject(projectPath = process.cwd()) {
7
+ const result = {
8
+ success: true,
9
+ errors: [],
10
+ warnings: [],
11
+ };
12
+ // Check config file exists (check root first, then .config for backward compatibility)
13
+ const rootConfigPath = join(projectPath, 'linkapp.config.ts');
14
+ const nestedConfigPath = join(projectPath, '.config', 'linkapp.config.ts');
15
+ const configPath = existsSync(rootConfigPath) ? rootConfigPath : nestedConfigPath;
16
+ if (!existsSync(configPath)) {
17
+ result.errors.push('Config file missing: linkapp.config.ts');
18
+ result.success = false;
19
+ }
20
+ else {
21
+ // Validate config schema
22
+ const configValidation = await validateConfigSchema(projectPath);
23
+ if (!configValidation.success) {
24
+ result.errors.push(...configValidation.errors);
25
+ result.success = false;
26
+ }
27
+ if (configValidation.warnings.length > 0) {
28
+ result.warnings.push(...configValidation.warnings);
29
+ }
30
+ }
31
+ // Check dist directory exists
32
+ const distPath = join(projectPath, 'dist');
33
+ if (!existsSync(distPath)) {
34
+ result.errors.push('Build output missing. Run "linkapp build" first.');
35
+ result.success = false;
36
+ }
37
+ else {
38
+ // Check dist has files
39
+ const distSize = getDirSize(distPath);
40
+ if (distSize === 0) {
41
+ result.errors.push('Build output is empty. Run "linkapp build" first.');
42
+ result.success = false;
43
+ }
44
+ else if (distSize > 5 * 1024 * 1024) {
45
+ // Warn if over 5MB
46
+ const sizeMB = (distSize / (1024 * 1024)).toFixed(2);
47
+ result.warnings.push(`Bundle size is large: ${sizeMB}MB. Consider optimizing.`);
48
+ }
49
+ }
50
+ // Check package.json exists
51
+ const packageJsonPath = join(projectPath, 'package.json');
52
+ if (!existsSync(packageJsonPath)) {
53
+ result.warnings.push('package.json not found');
54
+ }
55
+ // Run TypeScript type check
56
+ const typeCheckResult = await runTypeCheck(projectPath);
57
+ if (!typeCheckResult.success) {
58
+ result.errors.push('TypeScript type check failed. Fix type errors before deploying.');
59
+ result.success = false;
60
+ }
61
+ return result;
62
+ }
63
+ /**
64
+ * Validates the linkapp.config.ts schema
65
+ * Similar to how Next.js validates next.config.js and Tailwind validates tailwind.config.js
66
+ */
67
+ async function validateConfigSchema(projectPath) {
68
+ const result = {
69
+ success: true,
70
+ errors: [],
71
+ warnings: [],
72
+ };
73
+ try {
74
+ // Use tsx or ts-node to load the TypeScript config
75
+ // For now, we'll import the schema and validate the built config
76
+ const { validateLinkAppConfig } = await import('../../schema/config.schema.js');
77
+ // Try to import the config from the built dist (check root first, then .config)
78
+ const rootDistConfigPath = join(projectPath, 'dist', 'linkapp.config.js');
79
+ const nestedDistConfigPath = join(projectPath, 'dist', '.config', 'linkapp.config.js');
80
+ const distConfigPath = existsSync(rootDistConfigPath) ? rootDistConfigPath : nestedDistConfigPath;
81
+ if (!existsSync(distConfigPath)) {
82
+ result.warnings.push('Config validation skipped: Build output not found. Schema validation will occur during build.');
83
+ return result;
84
+ }
85
+ const configModule = await import(distConfigPath);
86
+ const config = configModule.default;
87
+ // Validate using Zod schema
88
+ validateLinkAppConfig(config);
89
+ }
90
+ catch (error) {
91
+ if (error instanceof ZodError) {
92
+ result.success = false;
93
+ result.errors.push('Config schema validation failed:');
94
+ // Format Zod errors in a user-friendly way (like Next.js does)
95
+ for (const issue of error.issues) {
96
+ const path = issue.path.join('.');
97
+ result.errors.push(` • ${path}: ${issue.message}`);
98
+ }
99
+ }
100
+ else if (error instanceof Error) {
101
+ // Other errors (import errors, etc.)
102
+ result.warnings.push(`Config validation warning: ${error.message}`);
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ async function runTypeCheck(projectPath) {
108
+ return new Promise((resolve) => {
109
+ const child = spawn('npm', ['run', 'type-check'], {
110
+ cwd: projectPath,
111
+ stdio: 'pipe',
112
+ shell: true,
113
+ });
114
+ child.on('close', (code) => {
115
+ resolve({ success: code === 0 });
116
+ });
117
+ child.on('error', () => {
118
+ // If type-check script doesn't exist, pass validation
119
+ resolve({ success: true });
120
+ });
121
+ });
122
+ }
123
+ function getDirSize(dirPath) {
124
+ let totalSize = 0;
125
+ try {
126
+ const files = readdirSync(dirPath);
127
+ for (const file of files) {
128
+ const filePath = join(dirPath, file);
129
+ const stats = statSync(filePath);
130
+ if (stats.isDirectory()) {
131
+ totalSize += getDirSize(filePath);
132
+ }
133
+ else {
134
+ totalSize += stats.size;
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ // Ignore errors
140
+ }
141
+ return totalSize;
142
+ }
143
+ export function printValidationResults(result) {
144
+ if (result.errors.length > 0) {
145
+ console.log(pc.red('\n✗ Validation errors:'));
146
+ for (const error of result.errors) {
147
+ console.log(pc.red(` • ${error}`));
148
+ }
149
+ }
150
+ if (result.warnings.length > 0) {
151
+ console.log(pc.yellow('\n⚠ Warnings:'));
152
+ for (const warning of result.warnings) {
153
+ console.log(pc.yellow(` • ${warning}`));
154
+ }
155
+ }
156
+ if (result.success && result.errors.length === 0) {
157
+ console.log(pc.green('\n✓ Pre-deployment validation passed'));
158
+ }
159
+ }
160
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/lib/deploy/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface CreateProjectOptions {
2
+ projectName: string;
3
+ projectPath: string;
4
+ template: string;
5
+ }
6
+ export declare function createProject(options: CreateProjectOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/create-project.ts"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB;AASD,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChF"}
@@ -0,0 +1,48 @@
1
+ import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ function toTitleCase(str) {
7
+ return str
8
+ .split('-')
9
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
10
+ .join(' ');
11
+ }
12
+ export async function createProject(options) {
13
+ const { projectName, projectPath, template } = options;
14
+ const templatesDir = join(__dirname, '..', '..', '..', 'templates');
15
+ const templatePath = join(templatesDir, template);
16
+ const sharedPath = join(templatesDir, 'shared');
17
+ if (!existsSync(templatePath)) {
18
+ throw new Error(`Template ${template} not found`);
19
+ }
20
+ // Create project directory
21
+ mkdirSync(projectPath, { recursive: true });
22
+ // Copy template files
23
+ cpSync(templatePath, projectPath, { recursive: true });
24
+ // Copy shared files
25
+ if (existsSync(sharedPath)) {
26
+ cpSync(sharedPath, projectPath, { recursive: true });
27
+ }
28
+ // Replace placeholders
29
+ const projectTitle = toTitleCase(projectName);
30
+ const placeholders = {
31
+ '{{PROJECT_NAME}}': projectName,
32
+ '{{PROJECT_TITLE}}': projectTitle,
33
+ '{{AUTHOR_NAME}}': 'Your Name',
34
+ };
35
+ replaceInFile(join(projectPath, 'package.json'), placeholders);
36
+ replaceInFile(join(projectPath, 'linkapp.config.ts'), placeholders);
37
+ replaceInFile(join(projectPath, 'README.md'), placeholders);
38
+ }
39
+ function replaceInFile(filePath, placeholders) {
40
+ if (!existsSync(filePath))
41
+ return;
42
+ let content = readFileSync(filePath, 'utf-8');
43
+ for (const [placeholder, value] of Object.entries(placeholders)) {
44
+ content = content.replaceAll(placeholder, value);
45
+ }
46
+ writeFileSync(filePath, content, 'utf-8');
47
+ }
48
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../../src/lib/utils/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAQrC,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA6B;IAC/D,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAEtD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;IACnE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IAE/C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,YAAY,CAAC,CAAA;IACnD,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3C,sBAAsB;IACtB,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEtD,oBAAoB;IACpB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,uBAAuB;IACvB,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAC7C,MAAM,YAAY,GAAG;QACnB,kBAAkB,EAAE,WAAW;QAC/B,mBAAmB,EAAE,YAAY;QACjC,iBAAiB,EAAE,WAAW;KAC/B,CAAA;IAED,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,YAAY,CAAC,CAAA;IAC9D,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAE,YAAY,CAAC,CAAA;IACnE,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,YAAoC;IAC3E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAM;IAEjC,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE7C,KAAK,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAClD,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initGit(projectPath: string): Promise<void>;
2
+ //# sourceMappingURL=init-git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-git.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/init-git.ts"],"names":[],"mappings":"AAmBA,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhE"}
@@ -0,0 +1,34 @@
1
+ import { spawn } from 'node:child_process';
2
+ async function runGitCommand(args, cwd) {
3
+ return new Promise((resolve) => {
4
+ const child = spawn('git', args, {
5
+ cwd,
6
+ stdio: 'pipe',
7
+ });
8
+ child.on('close', (code) => {
9
+ resolve(code === 0);
10
+ });
11
+ child.on('error', () => {
12
+ resolve(false);
13
+ });
14
+ });
15
+ }
16
+ export async function initGit(projectPath) {
17
+ // Initialize git repository
18
+ const initSuccess = await runGitCommand(['init'], projectPath);
19
+ if (!initSuccess) {
20
+ throw new Error('Failed to initialize git repository');
21
+ }
22
+ // Stage all files
23
+ const addSuccess = await runGitCommand(['add', '-A'], projectPath);
24
+ if (!addSuccess) {
25
+ // Just skip commit if add fails
26
+ return;
27
+ }
28
+ // Try to create initial commit (optional - may fail if git user not configured)
29
+ const commitSuccess = await runGitCommand(['commit', '-m', 'Initial commit from Create LinkApp'], projectPath);
30
+ if (!commitSuccess) {
31
+ throw new Error('Failed to create initial commit');
32
+ }
33
+ }
34
+ //# sourceMappingURL=init-git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-git.js","sourceRoot":"","sources":["../../../src/lib/utils/init-git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,GAAW;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG;YACH,KAAK,EAAE,MAAM;SACd,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAA;QACrB,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,WAAmB;IAC/C,4BAA4B;IAC5B,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAA;IAC9D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IAED,kBAAkB;IAClB,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,CAAA;IAClE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,gCAAgC;QAChC,OAAM;IACR,CAAC;IAED,gFAAgF;IAChF,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,oCAAoC,CAAC,EAAE,WAAW,CAAC,CAAA;IAC9G,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function installDependencies(projectPath: string): Promise<void>;
2
+ //# sourceMappingURL=install-dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-dependencies.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/install-dependencies.ts"],"names":[],"mappings":"AAEA,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB5E"}
@@ -0,0 +1,20 @@
1
+ import { spawn } from 'node:child_process';
2
+ export async function installDependencies(projectPath) {
3
+ return new Promise((resolve, reject) => {
4
+ const child = spawn('npm', ['install'], {
5
+ cwd: projectPath,
6
+ stdio: 'ignore',
7
+ shell: true,
8
+ });
9
+ child.on('close', (code) => {
10
+ if (code === 0) {
11
+ resolve();
12
+ }
13
+ else {
14
+ reject(new Error(`npm install failed with code ${code}`));
15
+ }
16
+ });
17
+ child.on('error', reject);
18
+ });
19
+ }
20
+ //# sourceMappingURL=install-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-dependencies.js","sourceRoot":"","sources":["../../../src/lib/utils/install-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;YACtC,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAA;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Sets up runtime files (.linkapp directory) in the user's project
3
+ * These files are managed by the CLI and should not be edited by users
4
+ */
5
+ export declare function setupRuntime(projectPath: string): void;
6
+ //# sourceMappingURL=setup-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-runtime.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/setup-runtime.ts"],"names":[],"mappings":"AAgFA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAyBtD"}