alpic 0.0.0-dev.fdfada2 → 0.0.0-dev.fe18813

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 (138) hide show
  1. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/auth.e2e.test.js +142 -0
  3. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  4. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  5. package/dist/__tests__/deploy-flags.e2e.test.js +111 -0
  6. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  7. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  8. package/dist/__tests__/deploy.e2e.test.js +168 -0
  9. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  10. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +250 -0
  12. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  13. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +121 -0
  15. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  16. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  17. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +139 -0
  18. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  19. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  20. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +294 -0
  21. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  22. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  23. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +19 -0
  24. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  25. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  26. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  27. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  28. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  29. package/dist/__tests__/git-flags.e2e.test.js +124 -0
  30. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  31. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  32. package/dist/__tests__/git.e2e.test.js +221 -0
  33. package/dist/__tests__/git.e2e.test.js.map +1 -0
  34. package/dist/__tests__/mock-server.d.ts +23 -0
  35. package/dist/__tests__/mock-server.js +573 -0
  36. package/dist/__tests__/mock-server.js.map +1 -0
  37. package/dist/__tests__/utils.d.ts +67 -0
  38. package/dist/__tests__/utils.js +255 -0
  39. package/dist/__tests__/utils.js.map +1 -0
  40. package/dist/api.d.ts +0 -1
  41. package/dist/api.js +5 -9
  42. package/dist/api.js.map +1 -1
  43. package/dist/commands/deploy.d.ts +7 -4
  44. package/dist/commands/deploy.js +39 -25
  45. package/dist/commands/deploy.js.map +1 -1
  46. package/dist/commands/environment-variable/add.d.ts +14 -0
  47. package/dist/commands/environment-variable/add.js +46 -0
  48. package/dist/commands/environment-variable/add.js.map +1 -0
  49. package/dist/commands/environment-variable/list.d.ts +9 -0
  50. package/dist/commands/environment-variable/list.js +48 -0
  51. package/dist/commands/environment-variable/list.js.map +1 -0
  52. package/dist/commands/environment-variable/remove.d.ts +11 -0
  53. package/dist/commands/environment-variable/remove.js +32 -0
  54. package/dist/commands/environment-variable/remove.js.map +1 -0
  55. package/dist/commands/environment-variable/update.d.ts +13 -0
  56. package/dist/commands/environment-variable/update.js +40 -0
  57. package/dist/commands/environment-variable/update.js.map +1 -0
  58. package/dist/commands/git/connect.d.ts +10 -0
  59. package/dist/commands/git/connect.js +58 -0
  60. package/dist/commands/git/connect.js.map +1 -0
  61. package/dist/commands/git/disconnect.d.ts +9 -0
  62. package/dist/commands/git/disconnect.js +41 -0
  63. package/dist/commands/git/disconnect.js.map +1 -0
  64. package/dist/commands/git.d.ts +6 -0
  65. package/dist/commands/git.js +17 -0
  66. package/dist/commands/git.js.map +1 -0
  67. package/dist/commands/login.d.ts +6 -0
  68. package/dist/commands/login.js +32 -0
  69. package/dist/commands/login.js.map +1 -0
  70. package/dist/commands/logout.d.ts +6 -0
  71. package/dist/commands/logout.js +20 -0
  72. package/dist/commands/logout.js.map +1 -0
  73. package/dist/commands/whoami.d.ts +6 -0
  74. package/dist/commands/whoami.js +13 -0
  75. package/dist/commands/whoami.js.map +1 -0
  76. package/dist/env.d.ts +4 -0
  77. package/dist/env.js +10 -0
  78. package/dist/env.js.map +1 -0
  79. package/dist/lib/alpic-command.d.ts +6 -0
  80. package/dist/lib/alpic-command.js +27 -0
  81. package/dist/lib/alpic-command.js.map +1 -0
  82. package/dist/lib/archive.d.ts +3 -3
  83. package/dist/lib/archive.js +11 -15
  84. package/dist/lib/archive.js.map +1 -1
  85. package/dist/lib/auth/auth.d.ts +2 -0
  86. package/dist/lib/auth/auth.js +21 -0
  87. package/dist/lib/auth/auth.js.map +1 -0
  88. package/dist/lib/auth/oauth/client.d.ts +28 -0
  89. package/dist/lib/auth/oauth/client.js +110 -0
  90. package/dist/lib/auth/oauth/client.js.map +1 -0
  91. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  92. package/dist/lib/auth/oauth/constants.js +3 -0
  93. package/dist/lib/auth/oauth/constants.js.map +1 -0
  94. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  95. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  96. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  97. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  98. package/dist/lib/auth/oauth/server/index.js +102 -0
  99. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  100. package/dist/lib/auth/whoami.d.ts +1 -0
  101. package/dist/lib/auth/whoami.js +41 -0
  102. package/dist/lib/auth/whoami.js.map +1 -0
  103. package/dist/lib/base-workflow.d.ts +10 -0
  104. package/dist/lib/base-workflow.js +22 -0
  105. package/dist/lib/base-workflow.js.map +1 -0
  106. package/dist/lib/config.d.ts +2 -2
  107. package/dist/lib/config.js +7 -7
  108. package/dist/lib/config.js.map +1 -1
  109. package/dist/lib/deployment.d.ts +2 -3
  110. package/dist/lib/deployment.js +12 -8
  111. package/dist/lib/deployment.js.map +1 -1
  112. package/dist/lib/environment-variable.d.ts +35 -0
  113. package/dist/lib/environment-variable.js +277 -0
  114. package/dist/lib/environment-variable.js.map +1 -0
  115. package/dist/lib/git.d.ts +22 -0
  116. package/dist/lib/git.js +131 -0
  117. package/dist/lib/git.js.map +1 -0
  118. package/dist/lib/global-store.d.ts +28 -0
  119. package/dist/lib/global-store.js +76 -0
  120. package/dist/lib/global-store.js.map +1 -0
  121. package/dist/lib/project.d.ts +65 -61
  122. package/dist/lib/project.js +264 -250
  123. package/dist/lib/project.js.map +1 -1
  124. package/dist/lib/table.d.ts +8 -0
  125. package/dist/lib/table.js +27 -0
  126. package/dist/lib/table.js.map +1 -0
  127. package/dist/lib/telemetry.js +6 -6
  128. package/dist/lib/telemetry.js.map +1 -1
  129. package/dist/lib/utils.d.ts +1 -0
  130. package/dist/lib/utils.js +17 -0
  131. package/dist/lib/utils.js.map +1 -0
  132. package/dist/lib/utils.test.d.ts +1 -0
  133. package/dist/lib/utils.test.js +14 -0
  134. package/dist/lib/utils.test.js.map +1 -0
  135. package/package.json +29 -28
  136. package/dist/lib/global-config.d.ts +0 -9
  137. package/dist/lib/global-config.js +0 -48
  138. package/dist/lib/global-config.js.map +0 -1
@@ -3,279 +3,293 @@ import chalk from "chalk";
3
3
  import { existsSync, readFileSync, statSync } from "node:fs";
4
4
  import { resolve } from "node:path";
5
5
  import { api } from "../api.js";
6
+ import { BaseWorkflow } from "./base-workflow.js";
6
7
  import { config } from "./config.js";
7
- export function resolveDeployDir(raw) {
8
- const dir = resolve((raw ?? "").trim() || process.cwd());
9
- if (!existsSync(dir)) {
10
- throw new Error(`Path does not exist: ${dir}`);
11
- }
12
- if (!statSync(dir).isDirectory()) {
13
- throw new Error(`Path is not a directory: ${dir}`);
14
- }
15
- return dir;
16
- }
17
- export async function confirmDeployWithExistingConfig(existingConfig) {
18
- const envLabel = existingConfig.environmentName ? ` to environment "${existingConfig.environmentName}"` : "";
19
- const confirm = await p.confirm({
20
- message: chalk.bold(`Deploy project "${existingConfig.projectName}"${envLabel}?`),
21
- initialValue: true,
22
- });
23
- if (p.isCancel(confirm))
24
- return null;
25
- return confirm === true;
26
- }
27
- export async function selectEnvironmentFromList(environments) {
28
- if (environments.length === 0) {
29
- return null;
30
- }
31
- const choice = await p.select({
32
- message: chalk.bold("Choose an environment to deploy to"),
33
- options: environments.map((env) => ({
34
- value: env.id,
35
- label: env.sourceBranch ? `${env.name} (${env.sourceBranch})` : env.name,
36
- })),
37
- });
38
- if (p.isCancel(choice))
39
- return null;
40
- const environment = environments.find((e) => e.id === choice);
41
- return environment ?? null;
42
- }
43
- export async function confirmDeployDirectory(deployDir) {
44
- const confirm = await p.confirm({
45
- message: chalk.bold(`Deploy the directory? `) + chalk.cyan(deployDir),
46
- initialValue: true,
47
- });
48
- if (p.isCancel(confirm))
49
- return false;
50
- return confirm === true;
51
- }
52
- export async function confirmLinkExisting() {
53
- const link = await p.confirm({
54
- message: chalk.bold("Link to existing project?"),
55
- initialValue: true,
56
- });
57
- if (p.isCancel(link))
58
- return false;
59
- return link === true;
60
- }
61
- export async function confirmLinkToAnotherProject() {
62
- const link = await p.confirm({
63
- message: chalk.bold("Link to another project?"),
64
- initialValue: true,
65
- });
66
- if (p.isCancel(link))
67
- return false;
68
- return link === true;
69
- }
70
- export async function selectProjectFromList(projects) {
71
- if (projects.length === 0) {
72
- return null;
73
- }
74
- const choice = await p.select({
75
- message: chalk.bold("Choose a project"),
76
- options: projects.map((proj) => ({ value: proj.id, label: proj.name })),
77
- });
78
- if (p.isCancel(choice))
79
- return null;
80
- const project = projects.find((proj) => proj.id === choice);
81
- return project ?? null;
82
- }
83
- export async function promptRootDirectory(deployDir) {
84
- while (true) {
85
- const rootDir = await p.text({
86
- message: chalk.bold("Root directory"),
87
- placeholder: ".",
88
- initialValue: ".",
89
- validate: (value) => {
90
- if (value != null && value.length > 512)
91
- return "Path must be at most 512 characters.";
92
- return undefined;
93
- },
94
- });
95
- if (p.isCancel(rootDir))
8
+ export class ProjectWorkflow extends BaseWorkflow {
9
+ async selectEnvironmentFromList(environments) {
10
+ if (environments.length === 0) {
96
11
  return null;
97
- const trimmed = rootDir.trim();
98
- if (trimmed === "" || trimmed === ".")
99
- return undefined;
100
- const resolved = resolve(deployDir, trimmed);
101
- if (!existsSync(resolved)) {
102
- p.log.error(`Path does not exist: ${resolved}`);
103
- continue;
104
- }
105
- if (!statSync(resolved).isDirectory()) {
106
- p.log.error(`Path is not a directory: ${resolved}`);
107
- continue;
108
12
  }
109
- return trimmed;
13
+ const choice = await p.select({
14
+ message: chalk.bold("Choose an environment to deploy to"),
15
+ options: environments.map((env) => ({
16
+ value: env.id,
17
+ label: env.sourceBranch ? `${env.name} (${env.sourceBranch})` : env.name,
18
+ })),
19
+ });
20
+ if (p.isCancel(choice))
21
+ return null;
22
+ const environment = environments.find((e) => e.id === choice);
23
+ return environment ?? null;
110
24
  }
111
- }
112
- async function resolveEnvironmentForProject(projectId) {
113
- const project = await api.projects.get.v1({ projectId });
114
- const environments = project.environments ?? [];
115
- if (environments.length === 0) {
116
- throw new Error("No environments found for this project.");
25
+ async selectProjectFromList(projects) {
26
+ if (projects.length === 0) {
27
+ return null;
28
+ }
29
+ const choice = await p.select({
30
+ message: chalk.bold("Choose a project"),
31
+ options: projects.map((proj) => ({ value: proj.id, label: proj.name })),
32
+ });
33
+ if (p.isCancel(choice))
34
+ return null;
35
+ const project = projects.find((proj) => proj.id === choice);
36
+ return project ?? null;
117
37
  }
118
- const environment = await selectEnvironmentFromList(environments);
119
- if (!environment)
120
- return null;
121
- return { environmentId: environment.id, environmentName: environment.name };
122
- }
123
- export async function resolveProjectForDeploy(deployDir) {
124
- const ok = await confirmDeployDirectory(deployDir);
125
- if (!ok)
126
- return null;
127
- const existingConfig = config.load(deployDir);
128
- if (existingConfig) {
129
- let confirm;
38
+ async promptRootDirectory() {
39
+ if (this.isNonInteractive()) {
40
+ if (this.flags.rootDir) {
41
+ const trimmed = this.flags.rootDir.trim();
42
+ if (trimmed === "" || trimmed === ".")
43
+ return null;
44
+ if (!this.directoryExists(trimmed)) {
45
+ throw new Error(`Directory does not exist: ${resolve(trimmed)}`);
46
+ }
47
+ return trimmed;
48
+ }
49
+ return null;
50
+ }
130
51
  while (true) {
131
- confirm = await confirmDeployWithExistingConfig(existingConfig);
132
- if (confirm === null)
52
+ const rootDir = await p.text({
53
+ message: chalk.bold("Root directory"),
54
+ placeholder: ".",
55
+ initialValue: ".",
56
+ validate: (value) => {
57
+ if (value != null && value.length > 512)
58
+ return "Path must be at most 512 characters.";
59
+ return undefined;
60
+ },
61
+ });
62
+ if (p.isCancel(rootDir))
133
63
  return null;
134
- if (confirm)
135
- break;
136
- const linkAnother = await confirmLinkToAnotherProject();
137
- if (p.isCancel(linkAnother))
64
+ const trimmed = rootDir.trim();
65
+ if (trimmed === "" || trimmed === ".")
138
66
  return null;
139
- if (linkAnother) {
140
- const linkExisting = await confirmLinkExisting();
141
- if (!linkExisting) {
142
- return runCreateProjectFlow(deployDir);
143
- }
144
- return runLinkingFlow(deployDir);
67
+ if (!this.directoryExists(trimmed)) {
68
+ p.log.error(`Directory does not exist: ${trimmed}`);
69
+ continue;
145
70
  }
71
+ return trimmed;
146
72
  }
147
- if (existingConfig.environmentId) {
148
- return {
149
- projectId: existingConfig.projectId,
150
- teamId: existingConfig.teamId,
151
- projectName: existingConfig.projectName,
152
- environmentId: existingConfig.environmentId,
153
- environmentName: existingConfig.environmentName,
154
- };
155
- }
156
- const env = await resolveEnvironmentForProject(existingConfig.projectId);
157
- if (!env)
158
- return null;
159
- const updatedConfig = {
160
- ...existingConfig,
161
- environmentId: env.environmentId,
162
- environmentName: env.environmentName,
163
- };
164
- config.save(updatedConfig, deployDir);
165
- p.note(`Environment "${env.environmentName}" will be used for future deploys.`);
166
- return updatedConfig;
167
73
  }
168
- const linkExisting = await confirmLinkExisting();
169
- if (!linkExisting) {
170
- return runCreateProjectFlow(deployDir);
74
+ directoryExists(dir) {
75
+ return existsSync(dir) && statSync(dir).isDirectory();
171
76
  }
172
- return runLinkingFlow(deployDir);
173
- }
174
- async function runCreateProjectFlow(deployDir) {
175
- const name = await p.text({
176
- message: chalk.bold("Project name"),
177
- placeholder: "my-app",
178
- validate: (value) => {
179
- if (!value?.trim())
180
- return "Project name is required.";
181
- if (value.length > 100)
182
- return "Project name must be at most 100 characters.";
183
- return undefined;
184
- },
185
- });
186
- if (p.isCancel(name))
187
- return null;
188
- const detectedRuntime = detectRuntime(deployDir);
189
- const runtime = await p.select({
190
- message: chalk.bold("Runtime"),
191
- options: [
192
- { value: "node24", label: "Node.js 24" },
193
- { value: "node22", label: "Node.js 22" },
194
- { value: "python3.14", label: "Python 3.14" },
195
- { value: "python3.13", label: "Python 3.13" },
196
- ],
197
- initialValue: detectedRuntime ?? "node24",
198
- });
199
- if (p.isCancel(runtime))
200
- return null;
201
- const rootDirectory = await promptRootDirectory(deployDir);
202
- const spin = p.spinner();
203
- spin.start("Creating project...");
204
- try {
205
- const projectInput = {
206
- name: name.trim(),
207
- runtime,
77
+ detectRuntime() {
78
+ const has = (file) => existsSync(file);
79
+ const read = (file) => {
80
+ try {
81
+ return readFileSync(file, "utf8");
82
+ }
83
+ catch {
84
+ return "";
85
+ }
208
86
  };
209
- if (rootDirectory) {
210
- projectInput.rootDirectory = rootDirectory;
87
+ if (has("pyproject.toml") || has("requirements.txt") || has("setup.py") || has(".python-version")) {
88
+ return "python3.13";
211
89
  }
212
- const created = await api.projects.create.v1(projectInput);
213
- spin.stop("Project created.");
214
- const productionEnv = created.productionEnvironment;
215
- if (!productionEnv) {
216
- throw new Error("Project was created but has no Production environment.");
90
+ if (has("package.json")) {
91
+ const nvmrc = has(".nvmrc") ? (read(".nvmrc").trim().split(/\s/)[0] ?? "") : "";
92
+ const major = nvmrc.replace(/^v/i, "").match(/^(\d+)/)?.[1];
93
+ if (major === "22")
94
+ return "node22";
95
+ return "node24";
217
96
  }
218
- const newConfig = {
219
- projectId: created.id,
220
- teamId: created.teamId,
221
- projectName: created.name,
222
- environmentId: productionEnv.id,
223
- environmentName: productionEnv.name,
224
- };
225
- config.save(newConfig, deployDir);
226
- return newConfig;
97
+ return null;
227
98
  }
228
- catch (error) {
229
- spin.stop();
230
- throw error;
99
+ async confirmDeployWithExistingConfig(existingConfig) {
100
+ const envLabel = existingConfig.environmentName ? ` to environment "${existingConfig.environmentName}"` : "";
101
+ const confirmed = await this.confirm({
102
+ message: chalk.bold(`Deploy project "${existingConfig.projectName}"${envLabel}?`),
103
+ initialValue: true,
104
+ });
105
+ if (p.isCancel(confirmed))
106
+ return null;
107
+ return confirmed === true;
231
108
  }
232
- }
233
- async function runLinkingFlow(deployDir) {
234
- const projects = await api.projects.list.v1();
235
- if (projects.length === 0) {
236
- throw new Error("No projects found. Create a project in the Alpic dashboard first.");
109
+ async confirmDeployDirectory() {
110
+ const confirmed = await this.confirm({
111
+ message: chalk.bold(`Deploy the directory? `) + chalk.cyan(process.cwd()),
112
+ initialValue: true,
113
+ });
114
+ if (p.isCancel(confirmed))
115
+ return false;
116
+ return confirmed === true;
237
117
  }
238
- const project = await selectProjectFromList(projects);
239
- if (!project)
240
- return null;
241
- const environments = project.environments ?? [];
242
- if (environments.length === 0) {
243
- throw new Error("No environments found for this project.");
118
+ async confirmLinkExisting() {
119
+ const link = await this.confirm({
120
+ message: chalk.bold("Link to existing project?"),
121
+ initialValue: true,
122
+ }, false);
123
+ if (p.isCancel(link))
124
+ return false;
125
+ return link === true;
244
126
  }
245
- const environment = await selectEnvironmentFromList(environments);
246
- if (!environment)
247
- return null;
248
- const newConfig = {
249
- projectId: project.id,
250
- teamId: project.teamId,
251
- projectName: project.name,
252
- environmentId: environment.id,
253
- environmentName: environment.name,
254
- };
255
- config.save(newConfig, deployDir);
256
- p.note(`Linked to project "${project.name}", environment "${environment.name}".`);
257
- return newConfig;
258
- }
259
- function detectRuntime(dir) {
260
- const has = (file) => existsSync(resolve(dir, file));
261
- const read = (file) => {
127
+ async confirmLinkToAnotherProject() {
128
+ const link = await this.confirm({
129
+ message: chalk.bold("Link to another project?"),
130
+ initialValue: true,
131
+ }, false);
132
+ if (p.isCancel(link))
133
+ return false;
134
+ return link === true;
135
+ }
136
+ async resolveProjectForDeploy() {
137
+ const ok = await this.confirmDeployDirectory();
138
+ if (!ok)
139
+ return null;
140
+ const existingConfig = config.load();
141
+ if (existingConfig) {
142
+ let confirmed;
143
+ while (true) {
144
+ confirmed = await this.confirmDeployWithExistingConfig(existingConfig);
145
+ if (confirmed === null)
146
+ return null;
147
+ if (confirmed)
148
+ break;
149
+ const linkAnother = await this.confirmLinkToAnotherProject();
150
+ if (p.isCancel(linkAnother))
151
+ return null;
152
+ if (linkAnother) {
153
+ const linkExisting = await this.confirmLinkExisting();
154
+ if (!linkExisting) {
155
+ return this.runCreateProjectFlow();
156
+ }
157
+ return this.runLinkingFlow();
158
+ }
159
+ }
160
+ if (existingConfig.environmentId) {
161
+ return {
162
+ projectId: existingConfig.projectId,
163
+ teamId: existingConfig.teamId,
164
+ projectName: existingConfig.projectName,
165
+ environmentId: existingConfig.environmentId,
166
+ environmentName: existingConfig.environmentName,
167
+ };
168
+ }
169
+ const env = await this.resolveEnvironmentForProject(existingConfig.projectId);
170
+ if (!env)
171
+ return null;
172
+ const updatedConfig = {
173
+ ...existingConfig,
174
+ environmentId: env.environmentId,
175
+ environmentName: env.environmentName,
176
+ };
177
+ config.save(updatedConfig);
178
+ p.note(`Environment "${env.environmentName}" will be used for future deploys.`, undefined, {
179
+ format: (line) => line,
180
+ });
181
+ return updatedConfig;
182
+ }
183
+ const linkExisting = await this.confirmLinkExisting();
184
+ if (!linkExisting) {
185
+ return this.runCreateProjectFlow();
186
+ }
187
+ return this.runLinkingFlow();
188
+ }
189
+ async resolveEnvironmentForProject(projectId) {
190
+ const project = await api.projects.get.v1({ projectId });
191
+ const environments = project.environments ?? [];
192
+ if (environments.length === 0) {
193
+ throw new Error("No environments found for this project.");
194
+ }
195
+ const environment = await this.selectEnvironmentFromList(environments);
196
+ if (!environment)
197
+ return null;
198
+ return { environmentId: environment.id, environmentName: environment.name };
199
+ }
200
+ async runCreateProjectFlow() {
201
+ if (this.isNonInteractive() && !this.flags.projectName) {
202
+ throw new Error("--project-name is required when using --non-interactive");
203
+ }
204
+ const name = this.flags.projectName ??
205
+ (await p.text({
206
+ message: chalk.bold("Project name"),
207
+ placeholder: "my-app",
208
+ validate: (value) => {
209
+ if (!value?.trim())
210
+ return "Project name is required.";
211
+ if (value.length > 100)
212
+ return "Project name must be at most 100 characters.";
213
+ return undefined;
214
+ },
215
+ }));
216
+ if (p.isCancel(name)) {
217
+ throw new Error("Project name is required.");
218
+ }
219
+ const detectedRuntime = this.detectRuntime();
220
+ const defaultRuntime = detectedRuntime ?? "node24";
221
+ const runtime = this.isNonInteractive()
222
+ ? (this.flags.runtime ?? defaultRuntime)
223
+ : await p.select({
224
+ message: chalk.bold("Runtime"),
225
+ options: [
226
+ { value: "node24", label: "Node.js 24" },
227
+ { value: "node22", label: "Node.js 22" },
228
+ { value: "python3.14", label: "Python 3.14" },
229
+ { value: "python3.13", label: "Python 3.13" },
230
+ ],
231
+ initialValue: defaultRuntime,
232
+ });
233
+ if (p.isCancel(runtime)) {
234
+ throw new Error("Runtime is required.");
235
+ }
236
+ const rootDirectory = await this.promptRootDirectory();
237
+ const spin = p.spinner();
238
+ spin.start("Creating project...");
262
239
  try {
263
- return readFileSync(resolve(dir, file), "utf8");
240
+ const projectInput = {
241
+ name,
242
+ runtime,
243
+ };
244
+ projectInput.rootDirectory = rootDirectory ?? undefined;
245
+ const created = await api.projects.create.v1(projectInput);
246
+ spin.stop("Project created.");
247
+ const productionEnv = created.productionEnvironment;
248
+ if (!productionEnv) {
249
+ throw new Error("Project was created but has no Production environment.");
250
+ }
251
+ const newConfig = {
252
+ projectId: created.id,
253
+ teamId: created.teamId,
254
+ projectName: created.name,
255
+ environmentId: productionEnv.id,
256
+ environmentName: productionEnv.name,
257
+ };
258
+ config.save(newConfig);
259
+ return newConfig;
264
260
  }
265
- catch {
266
- return "";
261
+ catch (error) {
262
+ spin.stop();
263
+ throw error;
267
264
  }
268
- };
269
- if (has("pyproject.toml") || has("requirements.txt") || has("setup.py") || has(".python-version")) {
270
- return "python3.13";
271
265
  }
272
- if (has("package.json")) {
273
- const nvmrc = has(".nvmrc") ? (read(".nvmrc").trim().split(/\s/)[0] ?? "") : "";
274
- const major = nvmrc.replace(/^v/i, "").match(/^(\d+)/)?.[1];
275
- if (major === "22")
276
- return "node22";
277
- return "node24";
266
+ async runLinkingFlow() {
267
+ const projects = await api.projects.list.v1();
268
+ if (projects.length === 0) {
269
+ throw new Error("No projects found. Create a project in the Alpic dashboard first.");
270
+ }
271
+ const project = await this.selectProjectFromList(projects);
272
+ if (!project)
273
+ return null;
274
+ const environments = project.environments ?? [];
275
+ if (environments.length === 0) {
276
+ throw new Error("No environments found for this project.");
277
+ }
278
+ const environment = await this.selectEnvironmentFromList(environments);
279
+ if (!environment)
280
+ return null;
281
+ const newConfig = {
282
+ projectId: project.id,
283
+ teamId: project.teamId,
284
+ projectName: project.name,
285
+ environmentId: environment.id,
286
+ environmentName: environment.name,
287
+ };
288
+ config.save(newConfig);
289
+ p.note(`Linked to project "${project.name}", environment "${environment.name}".`, undefined, {
290
+ format: (line) => line,
291
+ });
292
+ return newConfig;
278
293
  }
279
- return null;
280
294
  }
281
295
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ type TableColumn<Row extends Record<string, unknown>> = {
2
+ key: keyof Row;
3
+ header: string;
4
+ minWidth?: number;
5
+ format?: (value: string, row: Row) => string;
6
+ };
7
+ export declare const formatTable: <Row extends Record<string, unknown>>(rows: Row[], columns: TableColumn<Row>[]) => string;
8
+ export {};
@@ -0,0 +1,27 @@
1
+ import chalk from "chalk";
2
+ import { stripVTControlCharacters } from "node:util";
3
+ const visibleLength = (value) => stripVTControlCharacters(value).length;
4
+ const COLUMN_GAP = 4;
5
+ export const formatTable = (rows, columns) => {
6
+ const gap = " ".repeat(COLUMN_GAP);
7
+ const widths = columns.map((column) => {
8
+ const formattedLengths = rows.map((row) => {
9
+ const rawValue = String(row[column.key] ?? "");
10
+ const formattedValue = column.format ? column.format(rawValue, row) : rawValue;
11
+ return visibleLength(formattedValue);
12
+ });
13
+ return Math.max(column.minWidth ?? 0, column.header.length, ...formattedLengths);
14
+ });
15
+ const header = columns.map((column, index) => chalk.gray(column.header.padEnd(widths[index] ?? 0))).join(gap);
16
+ const body = rows.map((row) => columns
17
+ .map((column, index) => {
18
+ const rawValue = String(row[column.key] ?? "");
19
+ const formattedValue = column.format ? column.format(rawValue, row) : rawValue;
20
+ const padSize = Math.max(0, (widths[index] ?? 0) - visibleLength(formattedValue));
21
+ return `${formattedValue}${" ".repeat(padSize)}`;
22
+ })
23
+ .join(gap));
24
+ const content = [header, ...body].join("\n");
25
+ return `\n${content}\n`;
26
+ };
27
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/lib/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AASrD,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AAExF,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAsC,IAAW,EAAE,OAA2B,EAAE,EAAE;IAC3G,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACpC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC/E,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9G,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,OAAO;SACJ,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;QAClF,OAAO,GAAG,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,KAAK,OAAO,IAAI,CAAC;AAC1B,CAAC,CAAC"}