@zuplo/cli 6.65.7 → 6.65.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/integration/tunnel.integration.test.js +39 -30
- package/dist/__tests__/integration/tunnel.integration.test.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/cmds/compile.d.ts.map +1 -1
- package/dist/cmds/compile.js +2 -0
- package/dist/cmds/compile.js.map +1 -1
- package/dist/cmds/dev.d.ts.map +1 -1
- package/dist/cmds/dev.js +7 -0
- package/dist/cmds/dev.js.map +1 -1
- package/dist/cmds/docs.d.ts.map +1 -1
- package/dist/cmds/docs.js +2 -0
- package/dist/cmds/docs.js.map +1 -1
- package/dist/cmds/editor.d.ts.map +1 -1
- package/dist/cmds/editor.js +3 -1
- package/dist/cmds/editor.js.map +1 -1
- package/dist/cmds/init.d.ts +10 -0
- package/dist/cmds/init.d.ts.map +1 -0
- package/dist/cmds/init.js +54 -0
- package/dist/cmds/init.js.map +1 -0
- package/dist/cmds/mtls-certificates/create.d.ts.map +1 -1
- package/dist/cmds/mtls-certificates/create.js +8 -0
- package/dist/cmds/mtls-certificates/create.js.map +1 -1
- package/dist/cmds/open-api/merge.d.ts.map +1 -1
- package/dist/cmds/open-api/merge.js +11 -2
- package/dist/cmds/open-api/merge.js.map +1 -1
- package/dist/cmds/proxies/create.d.ts.map +1 -1
- package/dist/cmds/proxies/create.js +6 -0
- package/dist/cmds/proxies/create.js.map +1 -1
- package/dist/cmds/proxies/update.d.ts.map +1 -1
- package/dist/cmds/proxies/update.js +6 -0
- package/dist/cmds/proxies/update.js.map +1 -1
- package/dist/cmds/source/import-openapi.d.ts.map +1 -1
- package/dist/cmds/source/import-openapi.js +12 -0
- package/dist/cmds/source/import-openapi.js.map +1 -1
- package/dist/cmds/test.d.ts.map +1 -1
- package/dist/cmds/test.js +3 -0
- package/dist/cmds/test.js.map +1 -1
- package/dist/cmds/tunnel/services/update.d.ts.map +1 -1
- package/dist/cmds/tunnel/services/update.js +6 -0
- package/dist/cmds/tunnel/services/update.js.map +1 -1
- package/dist/common/validators/argument-validators.d.ts +30 -0
- package/dist/common/validators/argument-validators.d.ts.map +1 -0
- package/dist/common/validators/argument-validators.js +89 -0
- package/dist/common/validators/argument-validators.js.map +1 -0
- package/dist/common/validators/argument-validators.spec.d.ts +2 -0
- package/dist/common/validators/argument-validators.spec.d.ts.map +1 -0
- package/dist/common/validators/argument-validators.spec.js +181 -0
- package/dist/common/validators/argument-validators.spec.js.map +1 -0
- package/dist/init/handler.d.ts +8 -0
- package/dist/init/handler.d.ts.map +1 -0
- package/dist/init/handler.js +210 -0
- package/dist/init/handler.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argument-validators.js","sourceRoot":"","sources":["../../../src/common/validators/argument-validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Validates that a file exists and is readable\n * @param filePath - The path to the file to validate\n * @param optionName - The name of the option for error messages\n * @throws Error if the file does not exist or is not readable\n */\nexport function validateFileExists(\n filePath: string,\n optionName: string\n): string {\n const resolvedPath = path.resolve(filePath);\n\n if (!existsSync(resolvedPath)) {\n throw new Error(`${optionName}: File not found: ${filePath}`);\n }\n\n try {\n accessSync(resolvedPath, constants.R_OK);\n } catch {\n throw new Error(`${optionName}: File is not readable: ${filePath}`);\n }\n\n const stats = statSync(resolvedPath);\n if (!stats.isFile()) {\n throw new Error(`${optionName}: Path is not a file: ${filePath}`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Validates that a directory exists and is readable\n * @param dirPath - The path to the directory to validate\n * @param optionName - The name of the option for error messages\n * @throws Error if the directory does not exist or is not readable\n */\nexport function validateDirectoryExists(\n dirPath: string,\n optionName: string\n): string {\n const resolvedPath = path.resolve(dirPath);\n\n if (!existsSync(resolvedPath)) {\n throw new Error(`${optionName}: Directory not found: ${dirPath}`);\n }\n\n try {\n accessSync(resolvedPath, constants.R_OK);\n } catch {\n throw new Error(`${optionName}: Directory is not readable: ${dirPath}`);\n }\n\n const stats = statSync(resolvedPath);\n if (!stats.isDirectory()) {\n throw new Error(`${optionName}: Path is not a directory: ${dirPath}`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Validates that a port number is in the valid range (1-65535)\n * @param port - The port number to validate\n * @param optionName - The name of the option for error messages\n * @throws Error if the port is not in a valid range\n */\nexport function validatePort(port: number, optionName: string): number {\n if (!Number.isInteger(port)) {\n throw new Error(`${optionName}: Port must be an integer, got: ${port}`);\n }\n if (port < 1 || port > 65535) {\n throw new Error(\n `${optionName}: Port must be between 1 and 65535, got: ${port}`\n );\n }\n return port;\n}\n\n/**\n * Validates that a string is a valid URL\n * @param urlString - The URL string to validate\n * @param optionName - The name of the option for error messages\n * @throws Error if the URL is not valid\n */\nexport function validateUrl(urlString: string, optionName: string): string {\n try {\n const url = new URL(urlString);\n // Ensure it has a valid protocol\n if (![\"http:\", \"https:\"].includes(url.protocol)) {\n throw new Error(\n `${optionName}: URL must use http or https protocol, got: ${url.protocol}`\n );\n }\n return urlString;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"protocol\")) {\n throw error;\n }\n throw new Error(`${optionName}: Invalid URL format: ${urlString}`);\n }\n}\n\n/**\n * Validates that a file has a valid extension\n * @param filePath - The path to the file to validate\n * @param validExtensions - Array of valid extensions (with leading dot, e.g., ['.json', '.yaml'])\n * @param optionName - The name of the option for error messages\n * @throws Error if the file does not have a valid extension\n */\nexport function validateFileExtension(\n filePath: string,\n validExtensions: string[],\n optionName: string\n): string {\n const ext = path.extname(filePath).toLowerCase();\n if (!validExtensions.includes(ext)) {\n throw new Error(\n `${optionName}: File must have one of these extensions: ${validExtensions.join(\", \")}, got: ${ext || \"(none)\"}`\n );\n }\n return filePath;\n}\n\n/**\n * Validates that a string matches a pattern\n * @param value - The string to validate\n * @param pattern - The regex pattern to match\n * @param optionName - The name of the option for error messages\n * @param patternDescription - Human-readable description of the pattern\n * @throws Error if the string does not match the pattern\n */\nexport function validatePattern(\n value: string,\n pattern: RegExp,\n optionName: string,\n patternDescription: string\n): string {\n if (!pattern.test(value)) {\n throw new Error(`${optionName}: Value must ${patternDescription}`);\n }\n return value;\n}\n\n/**\n * Checks if a string is a URL (http or https)\n * @param value - The string to check\n * @returns true if the string is a valid URL, false otherwise\n */\nexport function isUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return [\"http:\", \"https:\"].includes(url.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * Validates that a source is either a valid file path or URL\n * For file paths, validates that the file exists and is readable\n * @param source - The source string (file path or URL)\n * @param optionName - The name of the option for error messages\n * @throws Error if the source is neither a valid file nor a valid URL\n */\nexport function validateFileOrUrl(source: string, optionName: string): string {\n if (isUrl(source)) {\n return validateUrl(source, optionName);\n }\n return validateFileExists(source, optionName);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argument-validators.spec.d.ts","sourceRoot":"","sources":["../../../src/common/validators/argument-validators.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, it } from "node:test";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { isUrl, validateDirectoryExists, validateFileExists, validateFileExtension, validateFileOrUrl, validatePattern, validatePort, validateUrl, } from "./argument-validators.js";
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
const testTmpPath = path.join(__dirname, "..", "..", "__tests__", "test-tmp", "argument-validators");
|
|
10
|
+
describe("argument-validators", () => {
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
await fs.mkdir(testTmpPath, { recursive: true });
|
|
13
|
+
});
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
try {
|
|
16
|
+
await fs.rm(testTmpPath, { recursive: true, force: true });
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
describe("validateFileExists", () => {
|
|
22
|
+
it("should return resolved path for existing readable file", async () => {
|
|
23
|
+
const filePath = path.join(testTmpPath, "test-file.txt");
|
|
24
|
+
await fs.writeFile(filePath, "test content");
|
|
25
|
+
const result = validateFileExists(filePath, "--source");
|
|
26
|
+
assert.strictEqual(result, path.resolve(filePath));
|
|
27
|
+
});
|
|
28
|
+
it("should throw error for non-existent file", () => {
|
|
29
|
+
const filePath = path.join(testTmpPath, "nonexistent.txt");
|
|
30
|
+
assert.throws(() => validateFileExists(filePath, "--source"), /--source: File not found:/);
|
|
31
|
+
});
|
|
32
|
+
it("should throw error when path is a directory", async () => {
|
|
33
|
+
const dirPath = path.join(testTmpPath, "some-dir");
|
|
34
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
35
|
+
assert.throws(() => validateFileExists(dirPath, "--file"), /--file: Path is not a file:/);
|
|
36
|
+
});
|
|
37
|
+
it("should include option name in error message", () => {
|
|
38
|
+
const filePath = path.join(testTmpPath, "missing.txt");
|
|
39
|
+
assert.throws(() => validateFileExists(filePath, "--my-option"), /--my-option: File not found:/);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe("validateDirectoryExists", () => {
|
|
43
|
+
it("should return resolved path for existing readable directory", async () => {
|
|
44
|
+
const dirPath = path.join(testTmpPath, "test-dir");
|
|
45
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
46
|
+
const result = validateDirectoryExists(dirPath, "--dir");
|
|
47
|
+
assert.strictEqual(result, path.resolve(dirPath));
|
|
48
|
+
});
|
|
49
|
+
it("should throw error for non-existent directory", () => {
|
|
50
|
+
const dirPath = path.join(testTmpPath, "nonexistent-dir");
|
|
51
|
+
assert.throws(() => validateDirectoryExists(dirPath, "--dir"), /--dir: Directory not found:/);
|
|
52
|
+
});
|
|
53
|
+
it("should throw error when path is a file", async () => {
|
|
54
|
+
const filePath = path.join(testTmpPath, "file.txt");
|
|
55
|
+
await fs.writeFile(filePath, "content");
|
|
56
|
+
assert.throws(() => validateDirectoryExists(filePath, "--directory"), /--directory: Path is not a directory:/);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("validatePort", () => {
|
|
60
|
+
it("should return port for valid port number", () => {
|
|
61
|
+
assert.strictEqual(validatePort(80, "--port"), 80);
|
|
62
|
+
assert.strictEqual(validatePort(443, "--port"), 443);
|
|
63
|
+
assert.strictEqual(validatePort(8080, "--port"), 8080);
|
|
64
|
+
assert.strictEqual(validatePort(1, "--port"), 1);
|
|
65
|
+
assert.strictEqual(validatePort(65535, "--port"), 65535);
|
|
66
|
+
});
|
|
67
|
+
it("should throw error for port less than 1", () => {
|
|
68
|
+
assert.throws(() => validatePort(0, "--port"), /--port: Port must be between 1 and 65535, got: 0/);
|
|
69
|
+
});
|
|
70
|
+
it("should throw error for port greater than 65535", () => {
|
|
71
|
+
assert.throws(() => validatePort(65536, "--port"), /--port: Port must be between 1 and 65535, got: 65536/);
|
|
72
|
+
});
|
|
73
|
+
it("should throw error for negative port", () => {
|
|
74
|
+
assert.throws(() => validatePort(-1, "--port"), /--port: Port must be between 1 and 65535, got: -1/);
|
|
75
|
+
});
|
|
76
|
+
it("should throw error for non-integer port", () => {
|
|
77
|
+
assert.throws(() => validatePort(80.5, "--port"), /--port: Port must be an integer, got: 80.5/);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe("validateUrl", () => {
|
|
81
|
+
it("should return URL for valid http URL", () => {
|
|
82
|
+
const url = "http://example.com/api";
|
|
83
|
+
assert.strictEqual(validateUrl(url, "--url"), url);
|
|
84
|
+
});
|
|
85
|
+
it("should return URL for valid https URL", () => {
|
|
86
|
+
const url = "https://api.example.com/v1/openapi.json";
|
|
87
|
+
assert.strictEqual(validateUrl(url, "--url"), url);
|
|
88
|
+
});
|
|
89
|
+
it("should throw error for invalid URL format", () => {
|
|
90
|
+
assert.throws(() => validateUrl("not-a-url", "--url"), /--url: Invalid URL format:/);
|
|
91
|
+
});
|
|
92
|
+
it("should throw error for non-http/https protocol", () => {
|
|
93
|
+
assert.throws(() => validateUrl("ftp://example.com/file", "--url"), /--url: URL must use http or https protocol, got: ftp:/);
|
|
94
|
+
});
|
|
95
|
+
it("should throw error for file protocol", () => {
|
|
96
|
+
assert.throws(() => validateUrl("file:///path/to/file", "--source"), /--source: URL must use http or https protocol, got: file:/);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe("validateFileExtension", () => {
|
|
100
|
+
it("should return file path for valid extension", () => {
|
|
101
|
+
const filePath = "test.json";
|
|
102
|
+
const result = validateFileExtension(filePath, [".json"], "--file");
|
|
103
|
+
assert.strictEqual(result, filePath);
|
|
104
|
+
});
|
|
105
|
+
it("should accept any of multiple valid extensions", () => {
|
|
106
|
+
const jsonPath = "test.json";
|
|
107
|
+
const yamlPath = "test.yaml";
|
|
108
|
+
const ymlPath = "test.yml";
|
|
109
|
+
assert.strictEqual(validateFileExtension(jsonPath, [".json", ".yaml", ".yml"], "--file"), jsonPath);
|
|
110
|
+
assert.strictEqual(validateFileExtension(yamlPath, [".json", ".yaml", ".yml"], "--file"), yamlPath);
|
|
111
|
+
assert.strictEqual(validateFileExtension(ymlPath, [".json", ".yaml", ".yml"], "--file"), ymlPath);
|
|
112
|
+
});
|
|
113
|
+
it("should throw error for invalid extension", () => {
|
|
114
|
+
assert.throws(() => validateFileExtension("test.txt", [".json"], "--file"), /--file: File must have one of these extensions: .json, got: .txt/);
|
|
115
|
+
});
|
|
116
|
+
it("should throw error when file has no extension", () => {
|
|
117
|
+
assert.throws(() => validateFileExtension("Makefile", [".json", ".yaml"], "--file"), /--file: File must have one of these extensions: .json, .yaml, got: \(none\)/);
|
|
118
|
+
});
|
|
119
|
+
it("should handle case-insensitive extension matching", () => {
|
|
120
|
+
const result = validateFileExtension("test.JSON", [".json"], "--file");
|
|
121
|
+
assert.strictEqual(result, "test.JSON");
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe("validatePattern", () => {
|
|
125
|
+
it("should return value when pattern matches", () => {
|
|
126
|
+
const result = validatePattern("abc123", /^[a-z0-9]+$/, "--name", "contain only lowercase letters and numbers");
|
|
127
|
+
assert.strictEqual(result, "abc123");
|
|
128
|
+
});
|
|
129
|
+
it("should throw error when pattern does not match", () => {
|
|
130
|
+
assert.throws(() => validatePattern("ABC-123", /^[a-z0-9]+$/, "--name", "contain only lowercase letters and numbers"), /--name: Value must contain only lowercase letters and numbers/);
|
|
131
|
+
});
|
|
132
|
+
it("should handle email pattern validation", () => {
|
|
133
|
+
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
134
|
+
const result = validatePattern("user@example.com", emailPattern, "--email", "be a valid email address");
|
|
135
|
+
assert.strictEqual(result, "user@example.com");
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe("isUrl", () => {
|
|
139
|
+
it("should return true for http URLs", () => {
|
|
140
|
+
assert.strictEqual(isUrl("http://example.com"), true);
|
|
141
|
+
assert.strictEqual(isUrl("http://localhost:8080/api"), true);
|
|
142
|
+
});
|
|
143
|
+
it("should return true for https URLs", () => {
|
|
144
|
+
assert.strictEqual(isUrl("https://api.example.com/v1"), true);
|
|
145
|
+
assert.strictEqual(isUrl("https://example.com:443/path"), true);
|
|
146
|
+
});
|
|
147
|
+
it("should return false for file paths", () => {
|
|
148
|
+
assert.strictEqual(isUrl("./path/to/file.json"), false);
|
|
149
|
+
assert.strictEqual(isUrl("/absolute/path/file.yaml"), false);
|
|
150
|
+
assert.strictEqual(isUrl("relative/path.json"), false);
|
|
151
|
+
});
|
|
152
|
+
it("should return false for non-http/https URLs", () => {
|
|
153
|
+
assert.strictEqual(isUrl("ftp://example.com/file"), false);
|
|
154
|
+
assert.strictEqual(isUrl("file:///path/to/file"), false);
|
|
155
|
+
});
|
|
156
|
+
it("should return false for invalid URLs", () => {
|
|
157
|
+
assert.strictEqual(isUrl("not a url"), false);
|
|
158
|
+
assert.strictEqual(isUrl(""), false);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe("validateFileOrUrl", () => {
|
|
162
|
+
it("should return URL for valid http URL", () => {
|
|
163
|
+
const url = "https://api.example.com/openapi.json";
|
|
164
|
+
assert.strictEqual(validateFileOrUrl(url, "--source"), url);
|
|
165
|
+
});
|
|
166
|
+
it("should return resolved path for existing file", async () => {
|
|
167
|
+
const filePath = path.join(testTmpPath, "api.json");
|
|
168
|
+
await fs.writeFile(filePath, "{}");
|
|
169
|
+
const result = validateFileOrUrl(filePath, "--source");
|
|
170
|
+
assert.strictEqual(result, path.resolve(filePath));
|
|
171
|
+
});
|
|
172
|
+
it("should throw error for non-existent file path", () => {
|
|
173
|
+
const filePath = path.join(testTmpPath, "missing.json");
|
|
174
|
+
assert.throws(() => validateFileOrUrl(filePath, "--source"), /--source: File not found:/);
|
|
175
|
+
});
|
|
176
|
+
it("should throw error for invalid URL format when not a file", () => {
|
|
177
|
+
assert.throws(() => validateFileOrUrl("ftp://example.com/file", "--source"), /--source: File not found:/);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
//# sourceMappingURL=argument-validators.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argument-validators.spec.js","sourceRoot":"","sources":["../../../src/common/validators/argument-validators.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n isUrl,\n validateDirectoryExists,\n validateFileExists,\n validateFileExtension,\n validateFileOrUrl,\n validatePattern,\n validatePort,\n validateUrl,\n} from \"./argument-validators.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst testTmpPath = path.join(\n __dirname,\n \"..\",\n \"..\",\n \"__tests__\",\n \"test-tmp\",\n \"argument-validators\"\n);\n\ndescribe(\"argument-validators\", () => {\n beforeEach(async () => {\n await fs.mkdir(testTmpPath, { recursive: true });\n });\n\n afterEach(async () => {\n try {\n await fs.rm(testTmpPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n });\n\n describe(\"validateFileExists\", () => {\n it(\"should return resolved path for existing readable file\", async () => {\n const filePath = path.join(testTmpPath, \"test-file.txt\");\n await fs.writeFile(filePath, \"test content\");\n\n const result = validateFileExists(filePath, \"--source\");\n assert.strictEqual(result, path.resolve(filePath));\n });\n\n it(\"should throw error for non-existent file\", () => {\n const filePath = path.join(testTmpPath, \"nonexistent.txt\");\n\n assert.throws(\n () => validateFileExists(filePath, \"--source\"),\n /--source: File not found:/\n );\n });\n\n it(\"should throw error when path is a directory\", async () => {\n const dirPath = path.join(testTmpPath, \"some-dir\");\n await fs.mkdir(dirPath, { recursive: true });\n\n assert.throws(\n () => validateFileExists(dirPath, \"--file\"),\n /--file: Path is not a file:/\n );\n });\n\n it(\"should include option name in error message\", () => {\n const filePath = path.join(testTmpPath, \"missing.txt\");\n\n assert.throws(\n () => validateFileExists(filePath, \"--my-option\"),\n /--my-option: File not found:/\n );\n });\n });\n\n describe(\"validateDirectoryExists\", () => {\n it(\"should return resolved path for existing readable directory\", async () => {\n const dirPath = path.join(testTmpPath, \"test-dir\");\n await fs.mkdir(dirPath, { recursive: true });\n\n const result = validateDirectoryExists(dirPath, \"--dir\");\n assert.strictEqual(result, path.resolve(dirPath));\n });\n\n it(\"should throw error for non-existent directory\", () => {\n const dirPath = path.join(testTmpPath, \"nonexistent-dir\");\n\n assert.throws(\n () => validateDirectoryExists(dirPath, \"--dir\"),\n /--dir: Directory not found:/\n );\n });\n\n it(\"should throw error when path is a file\", async () => {\n const filePath = path.join(testTmpPath, \"file.txt\");\n await fs.writeFile(filePath, \"content\");\n\n assert.throws(\n () => validateDirectoryExists(filePath, \"--directory\"),\n /--directory: Path is not a directory:/\n );\n });\n });\n\n describe(\"validatePort\", () => {\n it(\"should return port for valid port number\", () => {\n assert.strictEqual(validatePort(80, \"--port\"), 80);\n assert.strictEqual(validatePort(443, \"--port\"), 443);\n assert.strictEqual(validatePort(8080, \"--port\"), 8080);\n assert.strictEqual(validatePort(1, \"--port\"), 1);\n assert.strictEqual(validatePort(65535, \"--port\"), 65535);\n });\n\n it(\"should throw error for port less than 1\", () => {\n assert.throws(\n () => validatePort(0, \"--port\"),\n /--port: Port must be between 1 and 65535, got: 0/\n );\n });\n\n it(\"should throw error for port greater than 65535\", () => {\n assert.throws(\n () => validatePort(65536, \"--port\"),\n /--port: Port must be between 1 and 65535, got: 65536/\n );\n });\n\n it(\"should throw error for negative port\", () => {\n assert.throws(\n () => validatePort(-1, \"--port\"),\n /--port: Port must be between 1 and 65535, got: -1/\n );\n });\n\n it(\"should throw error for non-integer port\", () => {\n assert.throws(\n () => validatePort(80.5, \"--port\"),\n /--port: Port must be an integer, got: 80.5/\n );\n });\n });\n\n describe(\"validateUrl\", () => {\n it(\"should return URL for valid http URL\", () => {\n const url = \"http://example.com/api\";\n assert.strictEqual(validateUrl(url, \"--url\"), url);\n });\n\n it(\"should return URL for valid https URL\", () => {\n const url = \"https://api.example.com/v1/openapi.json\";\n assert.strictEqual(validateUrl(url, \"--url\"), url);\n });\n\n it(\"should throw error for invalid URL format\", () => {\n assert.throws(\n () => validateUrl(\"not-a-url\", \"--url\"),\n /--url: Invalid URL format:/\n );\n });\n\n it(\"should throw error for non-http/https protocol\", () => {\n assert.throws(\n () => validateUrl(\"ftp://example.com/file\", \"--url\"),\n /--url: URL must use http or https protocol, got: ftp:/\n );\n });\n\n it(\"should throw error for file protocol\", () => {\n assert.throws(\n () => validateUrl(\"file:///path/to/file\", \"--source\"),\n /--source: URL must use http or https protocol, got: file:/\n );\n });\n });\n\n describe(\"validateFileExtension\", () => {\n it(\"should return file path for valid extension\", () => {\n const filePath = \"test.json\";\n const result = validateFileExtension(filePath, [\".json\"], \"--file\");\n assert.strictEqual(result, filePath);\n });\n\n it(\"should accept any of multiple valid extensions\", () => {\n const jsonPath = \"test.json\";\n const yamlPath = \"test.yaml\";\n const ymlPath = \"test.yml\";\n\n assert.strictEqual(\n validateFileExtension(jsonPath, [\".json\", \".yaml\", \".yml\"], \"--file\"),\n jsonPath\n );\n assert.strictEqual(\n validateFileExtension(yamlPath, [\".json\", \".yaml\", \".yml\"], \"--file\"),\n yamlPath\n );\n assert.strictEqual(\n validateFileExtension(ymlPath, [\".json\", \".yaml\", \".yml\"], \"--file\"),\n ymlPath\n );\n });\n\n it(\"should throw error for invalid extension\", () => {\n assert.throws(\n () => validateFileExtension(\"test.txt\", [\".json\"], \"--file\"),\n /--file: File must have one of these extensions: .json, got: .txt/\n );\n });\n\n it(\"should throw error when file has no extension\", () => {\n assert.throws(\n () => validateFileExtension(\"Makefile\", [\".json\", \".yaml\"], \"--file\"),\n /--file: File must have one of these extensions: .json, .yaml, got: \\(none\\)/\n );\n });\n\n it(\"should handle case-insensitive extension matching\", () => {\n const result = validateFileExtension(\"test.JSON\", [\".json\"], \"--file\");\n assert.strictEqual(result, \"test.JSON\");\n });\n });\n\n describe(\"validatePattern\", () => {\n it(\"should return value when pattern matches\", () => {\n const result = validatePattern(\n \"abc123\",\n /^[a-z0-9]+$/,\n \"--name\",\n \"contain only lowercase letters and numbers\"\n );\n assert.strictEqual(result, \"abc123\");\n });\n\n it(\"should throw error when pattern does not match\", () => {\n assert.throws(\n () =>\n validatePattern(\n \"ABC-123\",\n /^[a-z0-9]+$/,\n \"--name\",\n \"contain only lowercase letters and numbers\"\n ),\n /--name: Value must contain only lowercase letters and numbers/\n );\n });\n\n it(\"should handle email pattern validation\", () => {\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const result = validatePattern(\n \"user@example.com\",\n emailPattern,\n \"--email\",\n \"be a valid email address\"\n );\n assert.strictEqual(result, \"user@example.com\");\n });\n });\n\n describe(\"isUrl\", () => {\n it(\"should return true for http URLs\", () => {\n assert.strictEqual(isUrl(\"http://example.com\"), true);\n assert.strictEqual(isUrl(\"http://localhost:8080/api\"), true);\n });\n\n it(\"should return true for https URLs\", () => {\n assert.strictEqual(isUrl(\"https://api.example.com/v1\"), true);\n assert.strictEqual(isUrl(\"https://example.com:443/path\"), true);\n });\n\n it(\"should return false for file paths\", () => {\n assert.strictEqual(isUrl(\"./path/to/file.json\"), false);\n assert.strictEqual(isUrl(\"/absolute/path/file.yaml\"), false);\n assert.strictEqual(isUrl(\"relative/path.json\"), false);\n });\n\n it(\"should return false for non-http/https URLs\", () => {\n assert.strictEqual(isUrl(\"ftp://example.com/file\"), false);\n assert.strictEqual(isUrl(\"file:///path/to/file\"), false);\n });\n\n it(\"should return false for invalid URLs\", () => {\n assert.strictEqual(isUrl(\"not a url\"), false);\n assert.strictEqual(isUrl(\"\"), false);\n });\n });\n\n describe(\"validateFileOrUrl\", () => {\n it(\"should return URL for valid http URL\", () => {\n const url = \"https://api.example.com/openapi.json\";\n assert.strictEqual(validateFileOrUrl(url, \"--source\"), url);\n });\n\n it(\"should return resolved path for existing file\", async () => {\n const filePath = path.join(testTmpPath, \"api.json\");\n await fs.writeFile(filePath, \"{}\");\n\n const result = validateFileOrUrl(filePath, \"--source\");\n assert.strictEqual(result, path.resolve(filePath));\n });\n\n it(\"should throw error for non-existent file path\", () => {\n const filePath = path.join(testTmpPath, \"missing.json\");\n\n assert.throws(\n () => validateFileOrUrl(filePath, \"--source\"),\n /--source: File not found:/\n );\n });\n\n it(\"should throw error for invalid URL format when not a file\", () => {\n assert.throws(\n () => validateFileOrUrl(\"ftp://example.com/file\", \"--source\"),\n /--source: File not found:/\n );\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/init/handler.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AA8GD,wBAAsB,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+K7D"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import { confirm, input, select } from "@inquirer/prompts";
|
|
4
|
+
import { logger } from "../common/logger.js";
|
|
5
|
+
import { printCriticalFailureToConsoleAndExit, printResultToConsoleAndExitGracefully, printSpinnerToConsole, printWarningToConsole, } from "../common/output.js";
|
|
6
|
+
import settings from "../common/settings.js";
|
|
7
|
+
import { deploy } from "../deploy/handler.js";
|
|
8
|
+
import { login } from "../login/login.js";
|
|
9
|
+
import { getAuthToken } from "../login/tokens.js";
|
|
10
|
+
import { createProject } from "../project/create/handler.js";
|
|
11
|
+
function isInteractive() {
|
|
12
|
+
return process.stdout.isTTY === true && !process.env.CI;
|
|
13
|
+
}
|
|
14
|
+
async function fetchAccounts(authToken) {
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts`, {
|
|
17
|
+
method: "GET",
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${authToken}`,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
if (response.ok) {
|
|
23
|
+
const data = await response.json();
|
|
24
|
+
return data.data;
|
|
25
|
+
}
|
|
26
|
+
logger.error(`Failed to fetch accounts: received ${response.status} ${response.statusText}`);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.error(`Failed to fetch accounts: ${String(error)}`);
|
|
30
|
+
}
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
async function fetchProjects(authToken, accountName) {
|
|
34
|
+
const url = new URL(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/projects`);
|
|
35
|
+
url.searchParams.set("accountName", accountName);
|
|
36
|
+
try {
|
|
37
|
+
const response = await fetch(url, {
|
|
38
|
+
method: "GET",
|
|
39
|
+
headers: {
|
|
40
|
+
Authorization: `Bearer ${authToken}`,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
let errorBody;
|
|
45
|
+
try {
|
|
46
|
+
errorBody = await response.text();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
}
|
|
50
|
+
logger.error(`Failed to fetch projects for account "${accountName}": ` +
|
|
51
|
+
`${response.status} ${response.statusText}` +
|
|
52
|
+
(errorBody ? ` - ${errorBody}` : ""));
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
const data = await response.json();
|
|
56
|
+
return data.data;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.error(`Error while fetching projects for account "${accountName}":`, error);
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function ensureAuthenticated() {
|
|
64
|
+
let token = await getAuthToken();
|
|
65
|
+
if (!token) {
|
|
66
|
+
if (!isInteractive()) {
|
|
67
|
+
logger.debug("Non-interactive mode, skipping login prompt");
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const shouldLogin = await confirm({
|
|
71
|
+
message: "You are not logged in. Would you like to log in now?",
|
|
72
|
+
default: true,
|
|
73
|
+
});
|
|
74
|
+
if (!shouldLogin) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
await login();
|
|
78
|
+
token = await getAuthToken();
|
|
79
|
+
}
|
|
80
|
+
return token;
|
|
81
|
+
}
|
|
82
|
+
export async function init(argv) {
|
|
83
|
+
const skipPrompts = argv.yes || !isInteractive();
|
|
84
|
+
let projectPath;
|
|
85
|
+
if (argv.dir) {
|
|
86
|
+
projectPath = resolve(argv.dir);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
projectPath = process.cwd();
|
|
90
|
+
}
|
|
91
|
+
if (!existsSync(projectPath)) {
|
|
92
|
+
await printCriticalFailureToConsoleAndExit(`Directory ${projectPath} does not exist. Please create your project first using 'npx create-zuplo-api'.`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const authToken = await ensureAuthenticated();
|
|
96
|
+
if (!authToken) {
|
|
97
|
+
await printResultToConsoleAndExitGracefully("\nSkipped platform initialization. You can run 'zuplo init' later to set up your project.");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
let accountName;
|
|
101
|
+
let projectName;
|
|
102
|
+
if (argv.withAccount) {
|
|
103
|
+
accountName = argv.withAccount;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const accounts = await fetchAccounts(authToken);
|
|
107
|
+
if (accounts.length === 0) {
|
|
108
|
+
console.log("\nNo accounts found. Please create an account at https://portal.zuplo.com first.");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
else if (accounts.length === 1) {
|
|
112
|
+
accountName = accounts[0].name;
|
|
113
|
+
}
|
|
114
|
+
else if (!skipPrompts) {
|
|
115
|
+
accountName = await select({
|
|
116
|
+
message: "Select the account",
|
|
117
|
+
choices: accounts.map((acc) => ({
|
|
118
|
+
name: acc.name,
|
|
119
|
+
value: acc.name,
|
|
120
|
+
})),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
accountName = accounts[0].name;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (!accountName) {
|
|
128
|
+
await printCriticalFailureToConsoleAndExit("No account selected.");
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const shouldCreateProject = argv.withProject !== undefined ||
|
|
132
|
+
(skipPrompts
|
|
133
|
+
? true
|
|
134
|
+
: await confirm({
|
|
135
|
+
message: "Would you like to create a new Zuplo project?",
|
|
136
|
+
default: true,
|
|
137
|
+
}));
|
|
138
|
+
if (shouldCreateProject) {
|
|
139
|
+
projectName = argv.withProject || basename(projectPath);
|
|
140
|
+
if (!argv.withProject && !skipPrompts) {
|
|
141
|
+
projectName = await input({
|
|
142
|
+
message: "Enter the project name",
|
|
143
|
+
default: basename(projectPath),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
const createSpinner = printSpinnerToConsole(`Creating project '${projectName}'...`);
|
|
147
|
+
const created = await createProject({
|
|
148
|
+
name: projectName,
|
|
149
|
+
account: accountName,
|
|
150
|
+
authToken,
|
|
151
|
+
});
|
|
152
|
+
if (!created) {
|
|
153
|
+
createSpinner.fail("Failed to create project");
|
|
154
|
+
console.log("\nFailed to create project. You can create one later at https://portal.zuplo.com");
|
|
155
|
+
projectName = undefined;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
createSpinner.succeed(`Project '${projectName}' created`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const projects = await fetchProjects(authToken, accountName);
|
|
163
|
+
if (projects.length === 0) {
|
|
164
|
+
console.log("\nNo projects found. Create a project first using 'zuplo project create'.");
|
|
165
|
+
}
|
|
166
|
+
else if (projects.length === 1) {
|
|
167
|
+
projectName = projects[0].name;
|
|
168
|
+
}
|
|
169
|
+
else if (!skipPrompts) {
|
|
170
|
+
projectName = await select({
|
|
171
|
+
message: "Select the project",
|
|
172
|
+
choices: projects.map((proj) => ({
|
|
173
|
+
name: proj.name,
|
|
174
|
+
value: proj.name,
|
|
175
|
+
})),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (!projectName) {
|
|
180
|
+
await printResultToConsoleAndExitGracefully("\nNo project selected. You can run 'zuplo init' later to set up your project.");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const shouldDeploy = skipPrompts ||
|
|
184
|
+
(await confirm({
|
|
185
|
+
message: "Would you like to deploy your project now? (This creates the initial environment)",
|
|
186
|
+
default: true,
|
|
187
|
+
}));
|
|
188
|
+
const defaultEnvironment = "main";
|
|
189
|
+
if (shouldDeploy) {
|
|
190
|
+
console.log();
|
|
191
|
+
console.log("Deploying your project...");
|
|
192
|
+
try {
|
|
193
|
+
await deploy({
|
|
194
|
+
account: accountName,
|
|
195
|
+
project: projectName,
|
|
196
|
+
dir: projectPath,
|
|
197
|
+
environment: defaultEnvironment,
|
|
198
|
+
authToken,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
logger.debug("Initial deployment failed", error);
|
|
203
|
+
printWarningToConsole("Initial deployment failed. You can deploy later using 'zuplo deploy'.");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const isCurrentDir = resolve(projectPath) === resolve(process.cwd());
|
|
207
|
+
const getStartedMessage = `\nProject initialized successfully!\n\nTo get started:\n${isCurrentDir ? "" : ` cd ${basename(projectPath)}\n`} npm run dev`;
|
|
208
|
+
await printResultToConsoleAndExitGracefully(getStartedMessage);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/init/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport { confirm, input, select } from \"@inquirer/prompts\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printResultToConsoleAndExitGracefully,\n printSpinnerToConsole,\n printWarningToConsole,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { deploy } from \"../deploy/handler.js\";\nimport { login } from \"../login/login.js\";\nimport { getAuthToken } from \"../login/tokens.js\";\nimport { createProject } from \"../project/create/handler.js\";\n\nexport interface InitArguments {\n dir?: string;\n withAccount?: string;\n withProject?: string;\n yes?: boolean;\n}\n\ninterface Account {\n name: string;\n}\n\ninterface Project {\n name: string;\n}\n\nfunction isInteractive(): boolean {\n // biome-ignore lint/style/noProcessEnv: Checking for CI environment\n return process.stdout.isTTY === true && !process.env.CI;\n}\n\nasync function fetchAccounts(authToken: string): Promise<Account[]> {\n try {\n const response = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${authToken}`,\n },\n }\n );\n\n if (response.ok) {\n const data: { data: Account[] } = await response.json();\n return data.data;\n }\n\n logger.error(\n `Failed to fetch accounts: received ${response.status} ${response.statusText}`\n );\n } catch (error) {\n logger.error(`Failed to fetch accounts: ${String(error)}`);\n }\n return [];\n}\n\nasync function fetchProjects(\n authToken: string,\n accountName: string\n): Promise<Project[]> {\n const url = new URL(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/projects`);\n url.searchParams.set(\"accountName\", accountName);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${authToken}`,\n },\n });\n\n if (!response.ok) {\n let errorBody: string | undefined;\n try {\n errorBody = await response.text();\n } catch {\n // ignore errors while reading the body\n }\n\n logger.error(\n `Failed to fetch projects for account \"${accountName}\": ` +\n `${response.status} ${response.statusText}` +\n (errorBody ? ` - ${errorBody}` : \"\")\n );\n return [];\n }\n\n const data: { data: Project[] } = await response.json();\n return data.data;\n } catch (error) {\n logger.error(\n `Error while fetching projects for account \"${accountName}\":`,\n error\n );\n return [];\n }\n}\n\nasync function ensureAuthenticated(): Promise<string | undefined> {\n let token = await getAuthToken();\n\n if (!token) {\n if (!isInteractive()) {\n logger.debug(\"Non-interactive mode, skipping login prompt\");\n return undefined;\n }\n\n const shouldLogin = await confirm({\n message: \"You are not logged in. Would you like to log in now?\",\n default: true,\n });\n\n if (!shouldLogin) {\n return undefined;\n }\n\n await login();\n token = await getAuthToken();\n }\n\n return token;\n}\n\nexport async function init(argv: InitArguments): Promise<void> {\n const skipPrompts = argv.yes || !isInteractive();\n\n // Determine the project directory (defaults to current working directory)\n let projectPath: string;\n if (argv.dir) {\n projectPath = resolve(argv.dir);\n } else {\n projectPath = process.cwd();\n }\n\n // Verify the directory exists\n if (!existsSync(projectPath)) {\n await printCriticalFailureToConsoleAndExit(\n `Directory ${projectPath} does not exist. Please create your project first using 'npx create-zuplo-api'.`\n );\n return;\n }\n\n // Step 1: Authenticate\n const authToken = await ensureAuthenticated();\n\n if (!authToken) {\n await printResultToConsoleAndExitGracefully(\n \"\\nSkipped platform initialization. You can run 'zuplo init' later to set up your project.\"\n );\n return;\n }\n\n let accountName: string | undefined;\n let projectName: string | undefined;\n\n // Step 2: Get or select account\n if (argv.withAccount) {\n accountName = argv.withAccount;\n } else {\n const accounts = await fetchAccounts(authToken);\n if (accounts.length === 0) {\n // biome-ignore lint/suspicious/noConsole: User output\n console.log(\n \"\\nNo accounts found. Please create an account at https://portal.zuplo.com first.\"\n );\n return;\n } else if (accounts.length === 1) {\n accountName = accounts[0].name;\n } else if (!skipPrompts) {\n accountName = await select({\n message: \"Select the account\",\n choices: accounts.map((acc) => ({\n name: acc.name,\n value: acc.name,\n })),\n });\n } else {\n accountName = accounts[0].name;\n }\n }\n\n if (!accountName) {\n await printCriticalFailureToConsoleAndExit(\"No account selected.\");\n return;\n }\n\n // Step 3: Create or select project\n const shouldCreateProject =\n argv.withProject !== undefined ||\n (skipPrompts\n ? true\n : await confirm({\n message: \"Would you like to create a new Zuplo project?\",\n default: true,\n }));\n\n if (shouldCreateProject) {\n // Get project name\n projectName = argv.withProject || basename(projectPath);\n\n if (!argv.withProject && !skipPrompts) {\n projectName = await input({\n message: \"Enter the project name\",\n default: basename(projectPath),\n });\n }\n\n // Create the project\n const createSpinner = printSpinnerToConsole(\n `Creating project '${projectName}'...`\n );\n const created = await createProject({\n name: projectName,\n account: accountName,\n authToken,\n });\n\n if (!created) {\n createSpinner.fail(\"Failed to create project\");\n // biome-ignore lint/suspicious/noConsole: User output\n console.log(\n \"\\nFailed to create project. You can create one later at https://portal.zuplo.com\"\n );\n projectName = undefined;\n } else {\n createSpinner.succeed(`Project '${projectName}' created`);\n }\n } else {\n // Select existing project\n const projects = await fetchProjects(authToken, accountName);\n if (projects.length === 0) {\n // biome-ignore lint/suspicious/noConsole: User output\n console.log(\n \"\\nNo projects found. Create a project first using 'zuplo project create'.\"\n );\n } else if (projects.length === 1) {\n projectName = projects[0].name;\n } else if (!skipPrompts) {\n projectName = await select({\n message: \"Select the project\",\n choices: projects.map((proj) => ({\n name: proj.name,\n value: proj.name,\n })),\n });\n }\n }\n\n if (!projectName) {\n await printResultToConsoleAndExitGracefully(\n \"\\nNo project selected. You can run 'zuplo init' later to set up your project.\"\n );\n return;\n }\n\n // Step 4: Deploy the project to create the initial environment\n // This ensures the environment is ready before we try to link\n const shouldDeploy =\n skipPrompts ||\n (await confirm({\n message:\n \"Would you like to deploy your project now? (This creates the initial environment)\",\n default: true,\n }));\n\n // Use \"main\" as the default environment/branch name for initial deployment\n const defaultEnvironment = \"main\";\n\n if (shouldDeploy) {\n // biome-ignore lint/suspicious/noConsole: User output\n console.log();\n // biome-ignore lint/suspicious/noConsole: User output\n console.log(\"Deploying your project...\");\n\n try {\n // The deploy function handles its own spinners and output\n // We pass the environment explicitly since this might not be a git repo yet\n await deploy({\n account: accountName,\n project: projectName,\n dir: projectPath,\n environment: defaultEnvironment,\n authToken,\n });\n } catch (error) {\n logger.debug(\"Initial deployment failed\", error);\n printWarningToConsole(\n \"Initial deployment failed. You can deploy later using 'zuplo deploy'.\"\n );\n }\n }\n\n const isCurrentDir = resolve(projectPath) === resolve(process.cwd());\n const getStartedMessage = `\\nProject initialized successfully!\\n\\nTo get started:\\n${\n isCurrentDir ? \"\" : ` cd ${basename(projectPath)}\\n`\n } npm run dev`;\n\n await printResultToConsoleAndExitGracefully(getStartedMessage);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/cli.ts","../src/internal.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/import-openapi-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/oas-test-data.ts","../src/__tests__/outdated.test.ts","../src/__tests__/populate.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/__tests__/integration/delete.integration.test.ts","../src/__tests__/integration/deploy.integration.test.ts","../src/__tests__/integration/jest-mocks-setup.ts","../src/__tests__/integration/jest-setup.ts","../src/__tests__/integration/link.integration.test.ts","../src/__tests__/integration/list.integration.test.ts","../src/__tests__/integration/test-utils.ts","../src/__tests__/integration/tunnel.integration.test.ts","../src/__tests__/integration/variable.integration.test.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/docs.ts","../src/cmds/editor.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/test.ts","../src/cmds/mtls-certificates/create.ts","../src/cmds/mtls-certificates/delete.ts","../src/cmds/mtls-certificates/describe.ts","../src/cmds/mtls-certificates/disable.ts","../src/cmds/mtls-certificates/index.ts","../src/cmds/mtls-certificates/list.ts","../src/cmds/mtls-certificates/update.ts","../src/cmds/open-api/convert.ts","../src/cmds/open-api/index.ts","../src/cmds/open-api/merge.ts","../src/cmds/open-api/overlay.ts","../src/cmds/project/create.ts","../src/cmds/project/index.ts","../src/cmds/proxies/create.ts","../src/cmds/proxies/delete.ts","../src/cmds/proxies/describe.ts","../src/cmds/proxies/index.ts","../src/cmds/proxies/update.ts","../src/cmds/source/import-openapi.ts","../src/cmds/source/index.ts","../src/cmds/source/migrate.ts","../src/cmds/source/upgrade.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/constants.ts","../src/common/file-format.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/populate.ts","../src/common/runner.ts","../src/common/settings.ts","../src/common/worker-output.ts","../src/common/analytics/lib.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/authentication.ts","../src/common/middleware/get-account-param.ts","../src/common/middleware/get-environment-param.ts","../src/common/middleware/get-project-param.ts","../src/common/middleware/logging.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/middleware/validate-fleet.ts","../src/common/open-api/constants.ts","../src/common/open-api/index.ts","../src/common/open-api/validation.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/branch.ts","../src/common/utils/ports.ts","../src/common/utils/prefixed-output.ts","../src/common/utils/pretty-print-environment-prompt.ts","../src/common/utils/stringify-config.test.ts","../src/common/utils/stringify-config.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.test.ts","../src/deploy/archive.ts","../src/deploy/environments.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/docs/handler.ts","../src/editor/handler.ts","../src/editor/e2e/editor.spec.ts","../src/link/handler.ts","../src/list/handler.ts","../src/login/login.ts","../src/login/tokens.ts","../src/mtls-certificates/models.ts","../src/mtls-certificates/create/handler.ts","../src/mtls-certificates/delete/handler.ts","../src/mtls-certificates/describe/handler.ts","../src/mtls-certificates/disable/handler.ts","../src/mtls-certificates/list/handler.ts","../src/mtls-certificates/update/handler.ts","../src/open-api/convert/convert-engine.spec.ts","../src/open-api/convert/convert-engine.ts","../src/open-api/convert/handler.spec.ts","../src/open-api/convert/handler.ts","../src/open-api/merge/ajv.ts","../src/open-api/merge/handler.spec.ts","../src/open-api/merge/handler.ts","../src/open-api/merge/interfaces.ts","../src/open-api/merge/merge-engine.spec.ts","../src/open-api/merge/merge-engine.ts","../src/open-api/merge/utils.ts","../src/open-api/overlay/handler.spec.ts","../src/open-api/overlay/handler.ts","../src/open-api/overlay/overlay-engine.spec.ts","../src/open-api/overlay/overlay-engine.ts","../src/project/create/handler.ts","../src/proxies/models.ts","../src/proxies/create/handler.ts","../src/proxies/delete/handler.ts","../src/proxies/describe/handler.ts","../src/proxies/update/handler.ts","../src/source/migrate/dev-portal/handler.ts","../src/source/migrate/dev-portal/types.ts","../src/source/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/test-files.test.ts","../src/test/test-files.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts"],"version":"5.8.2"}
|
|
1
|
+
{"root":["../src/cli.ts","../src/internal.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/import-openapi-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/oas-test-data.ts","../src/__tests__/outdated.test.ts","../src/__tests__/populate.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/__tests__/integration/delete.integration.test.ts","../src/__tests__/integration/deploy.integration.test.ts","../src/__tests__/integration/jest-mocks-setup.ts","../src/__tests__/integration/jest-setup.ts","../src/__tests__/integration/link.integration.test.ts","../src/__tests__/integration/list.integration.test.ts","../src/__tests__/integration/test-utils.ts","../src/__tests__/integration/tunnel.integration.test.ts","../src/__tests__/integration/variable.integration.test.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/docs.ts","../src/cmds/editor.ts","../src/cmds/init.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/test.ts","../src/cmds/mtls-certificates/create.ts","../src/cmds/mtls-certificates/delete.ts","../src/cmds/mtls-certificates/describe.ts","../src/cmds/mtls-certificates/disable.ts","../src/cmds/mtls-certificates/index.ts","../src/cmds/mtls-certificates/list.ts","../src/cmds/mtls-certificates/update.ts","../src/cmds/open-api/convert.ts","../src/cmds/open-api/index.ts","../src/cmds/open-api/merge.ts","../src/cmds/open-api/overlay.ts","../src/cmds/project/create.ts","../src/cmds/project/index.ts","../src/cmds/proxies/create.ts","../src/cmds/proxies/delete.ts","../src/cmds/proxies/describe.ts","../src/cmds/proxies/index.ts","../src/cmds/proxies/update.ts","../src/cmds/source/import-openapi.ts","../src/cmds/source/index.ts","../src/cmds/source/migrate.ts","../src/cmds/source/upgrade.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/constants.ts","../src/common/file-format.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/populate.ts","../src/common/runner.ts","../src/common/settings.ts","../src/common/worker-output.ts","../src/common/analytics/lib.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/authentication.ts","../src/common/middleware/get-account-param.ts","../src/common/middleware/get-environment-param.ts","../src/common/middleware/get-project-param.ts","../src/common/middleware/logging.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/middleware/validate-fleet.ts","../src/common/open-api/constants.ts","../src/common/open-api/index.ts","../src/common/open-api/validation.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/branch.ts","../src/common/utils/ports.ts","../src/common/utils/prefixed-output.ts","../src/common/utils/pretty-print-environment-prompt.ts","../src/common/utils/stringify-config.test.ts","../src/common/utils/stringify-config.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/argument-validators.spec.ts","../src/common/validators/argument-validators.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.test.ts","../src/deploy/archive.ts","../src/deploy/environments.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/docs/handler.ts","../src/editor/handler.ts","../src/editor/e2e/editor.spec.ts","../src/init/handler.ts","../src/link/handler.ts","../src/list/handler.ts","../src/login/login.ts","../src/login/tokens.ts","../src/mtls-certificates/models.ts","../src/mtls-certificates/create/handler.ts","../src/mtls-certificates/delete/handler.ts","../src/mtls-certificates/describe/handler.ts","../src/mtls-certificates/disable/handler.ts","../src/mtls-certificates/list/handler.ts","../src/mtls-certificates/update/handler.ts","../src/open-api/convert/convert-engine.spec.ts","../src/open-api/convert/convert-engine.ts","../src/open-api/convert/handler.spec.ts","../src/open-api/convert/handler.ts","../src/open-api/merge/ajv.ts","../src/open-api/merge/handler.spec.ts","../src/open-api/merge/handler.ts","../src/open-api/merge/interfaces.ts","../src/open-api/merge/merge-engine.spec.ts","../src/open-api/merge/merge-engine.ts","../src/open-api/merge/utils.ts","../src/open-api/overlay/handler.spec.ts","../src/open-api/overlay/handler.ts","../src/open-api/overlay/overlay-engine.spec.ts","../src/open-api/overlay/overlay-engine.ts","../src/project/create/handler.ts","../src/proxies/models.ts","../src/proxies/create/handler.ts","../src/proxies/delete/handler.ts","../src/proxies/describe/handler.ts","../src/proxies/update/handler.ts","../src/source/migrate/dev-portal/handler.ts","../src/source/migrate/dev-portal/types.ts","../src/source/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/test-files.test.ts","../src/test/test-files.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts"],"version":"5.8.2"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zuplo/cli",
|
|
3
|
-
"version": "6.65.
|
|
3
|
+
"version": "6.65.9",
|
|
4
4
|
"repository": "https://github.com/zuplo/zuplo",
|
|
5
5
|
"author": "Zuplo, Inc.",
|
|
6
6
|
"type": "module",
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
"@opentelemetry/api": "1.9.0",
|
|
30
30
|
"@sentry/node": "9.22.0",
|
|
31
31
|
"@swc/core": "1.10.18",
|
|
32
|
-
"@zuplo/core": "6.65.
|
|
33
|
-
"@zuplo/editor": "1.0.
|
|
34
|
-
"@zuplo/openapi-tools": "6.65.
|
|
35
|
-
"@zuplo/runtime": "6.65.
|
|
32
|
+
"@zuplo/core": "6.65.9",
|
|
33
|
+
"@zuplo/editor": "1.0.20821740935",
|
|
34
|
+
"@zuplo/openapi-tools": "6.65.9",
|
|
35
|
+
"@zuplo/runtime": "6.65.9",
|
|
36
36
|
"as-table": "1.0.55",
|
|
37
37
|
"chalk": "5.4.1",
|
|
38
38
|
"chokidar": "3.5.3",
|