quicklify 0.7.2 → 0.9.0

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 (62) hide show
  1. package/README.md +131 -26
  2. package/dist/commands/backup.d.ts +15 -0
  3. package/dist/commands/backup.d.ts.map +1 -0
  4. package/dist/commands/backup.js +160 -0
  5. package/dist/commands/backup.js.map +1 -0
  6. package/dist/commands/config.d.ts.map +1 -1
  7. package/dist/commands/config.js +1 -1
  8. package/dist/commands/config.js.map +1 -1
  9. package/dist/commands/doctor.d.ts.map +1 -1
  10. package/dist/commands/doctor.js +5 -1
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/firewall.d.ts +1 -0
  13. package/dist/commands/firewall.d.ts.map +1 -1
  14. package/dist/commands/firewall.js +1 -1
  15. package/dist/commands/firewall.js.map +1 -1
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +109 -10
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/monitor.d.ts.map +1 -1
  20. package/dist/commands/monitor.js +2 -1
  21. package/dist/commands/monitor.js.map +1 -1
  22. package/dist/commands/restore.d.ts +17 -0
  23. package/dist/commands/restore.d.ts.map +1 -0
  24. package/dist/commands/restore.js +257 -0
  25. package/dist/commands/restore.js.map +1 -0
  26. package/dist/commands/secure.d.ts +3 -0
  27. package/dist/commands/secure.d.ts.map +1 -1
  28. package/dist/commands/secure.js +28 -26
  29. package/dist/commands/secure.js.map +1 -1
  30. package/dist/commands/transfer.d.ts +7 -0
  31. package/dist/commands/transfer.d.ts.map +1 -0
  32. package/dist/commands/transfer.js +94 -0
  33. package/dist/commands/transfer.js.map +1 -0
  34. package/dist/index.js +29 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/providers/digitalocean.d.ts.map +1 -1
  37. package/dist/providers/digitalocean.js +4 -1
  38. package/dist/providers/digitalocean.js.map +1 -1
  39. package/dist/providers/hetzner.d.ts.map +1 -1
  40. package/dist/providers/hetzner.js.map +1 -1
  41. package/dist/types/index.d.ts +31 -0
  42. package/dist/types/index.d.ts.map +1 -1
  43. package/dist/utils/config.d.ts +2 -1
  44. package/dist/utils/config.d.ts.map +1 -1
  45. package/dist/utils/config.js +2 -1
  46. package/dist/utils/config.js.map +1 -1
  47. package/dist/utils/configMerge.d.ts +16 -0
  48. package/dist/utils/configMerge.d.ts.map +1 -0
  49. package/dist/utils/configMerge.js +34 -0
  50. package/dist/utils/configMerge.js.map +1 -0
  51. package/dist/utils/ssh.d.ts.map +1 -1
  52. package/dist/utils/ssh.js +3 -1
  53. package/dist/utils/ssh.js.map +1 -1
  54. package/dist/utils/templates.d.ts +6 -0
  55. package/dist/utils/templates.d.ts.map +1 -0
  56. package/dist/utils/templates.js +43 -0
  57. package/dist/utils/templates.js.map +1 -0
  58. package/dist/utils/yamlConfig.d.ts +8 -0
  59. package/dist/utils/yamlConfig.d.ts.map +1 -0
  60. package/dist/utils/yamlConfig.js +136 -0
  61. package/dist/utils/yamlConfig.js.map +1 -0
  62. package/package.json +3 -1
package/dist/utils/ssh.js CHANGED
@@ -19,7 +19,9 @@ export function sshConnect(ip) {
19
19
  }
20
20
  export function sshStream(ip, command) {
21
21
  return new Promise((resolve) => {
22
- const child = spawn("ssh", ["-o", "StrictHostKeyChecking=accept-new", `root@${ip}`, command], { stdio: "inherit" });
22
+ const child = spawn("ssh", ["-o", "StrictHostKeyChecking=accept-new", `root@${ip}`, command], {
23
+ stdio: "inherit",
24
+ });
23
25
  child.on("close", (code) => resolve(code ?? 0));
24
26
  child.on("error", () => resolve(1));
25
27
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/utils/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YACzC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAU,EAAE,OAAe;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CACjB,KAAK,EACL,CAAC,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EACjE,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,EAAU,EACV,OAAe;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE;YAC5F,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;SACnC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/utils/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YACzC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAU,EAAE,OAAe;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE;YAC5F,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,EAAU,EACV,OAAe;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE;YAC5F,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;SACnC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { TemplateName, TemplateDefinition, TemplateProviderDefaults } from "../types/index.js";
2
+ export declare const TEMPLATES: Record<TemplateName, TemplateDefinition>;
3
+ export declare const VALID_TEMPLATE_NAMES: TemplateName[];
4
+ export declare function getTemplate(name: string): TemplateDefinition | undefined;
5
+ export declare function getTemplateDefaults(name: string, provider: string): TemplateProviderDefaults | undefined;
6
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAEpG,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,kBAAkB,CA4B9D,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAA6C,CAAC;AAE7F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAKxE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,wBAAwB,GAAG,SAAS,CAItC"}
@@ -0,0 +1,43 @@
1
+ export const TEMPLATES = {
2
+ starter: {
3
+ name: "starter",
4
+ description: "Minimal setup for trying out Coolify (cheapest option)",
5
+ defaults: {
6
+ hetzner: { region: "nbg1", size: "cax11" },
7
+ digitalocean: { region: "fra1", size: "s-2vcpu-2gb" },
8
+ },
9
+ fullSetup: false,
10
+ },
11
+ production: {
12
+ name: "production",
13
+ description: "Production-ready setup with firewall and SSH hardening",
14
+ defaults: {
15
+ hetzner: { region: "nbg1", size: "cx33" },
16
+ digitalocean: { region: "fra1", size: "s-2vcpu-4gb" },
17
+ },
18
+ fullSetup: true,
19
+ },
20
+ dev: {
21
+ name: "dev",
22
+ description: "Development/testing environment (cheap, no hardening)",
23
+ defaults: {
24
+ hetzner: { region: "nbg1", size: "cax11" },
25
+ digitalocean: { region: "fra1", size: "s-2vcpu-2gb" },
26
+ },
27
+ fullSetup: false,
28
+ },
29
+ };
30
+ export const VALID_TEMPLATE_NAMES = Object.keys(TEMPLATES);
31
+ export function getTemplate(name) {
32
+ if (VALID_TEMPLATE_NAMES.includes(name)) {
33
+ return TEMPLATES[name];
34
+ }
35
+ return undefined;
36
+ }
37
+ export function getTemplateDefaults(name, provider) {
38
+ const template = getTemplate(name);
39
+ if (!template)
40
+ return undefined;
41
+ return template.defaults[provider];
42
+ }
43
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAA6C;IACjE,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE;YACR,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;YAC1C,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;SACtD;QACD,SAAS,EAAE,KAAK;KACjB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE;YACR,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;YACzC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;SACtD;QACD,SAAS,EAAE,IAAI;KAChB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,uDAAuD;QACpE,QAAQ,EAAE;YACR,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;YAC1C,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;SACtD;QACD,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAmB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAmB,CAAC;AAE7F,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAoB,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC,IAAoB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,QAAgB;IAEhB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { QuicklifyYamlConfig } from "../types/index.js";
2
+ export interface YamlLoadResult {
3
+ config: QuicklifyYamlConfig;
4
+ warnings: string[];
5
+ }
6
+ export declare function validateYamlConfig(raw: unknown): YamlLoadResult;
7
+ export declare function loadYamlConfig(filePath: string): YamlLoadResult;
8
+ //# sourceMappingURL=yamlConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yamlConfig.d.ts","sourceRoot":"","sources":["../../src/utils/yamlConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAgB7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CA4G/D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAkB/D"}
@@ -0,0 +1,136 @@
1
+ import { readFileSync } from "fs";
2
+ import yaml from "js-yaml";
3
+ import { VALID_TEMPLATE_NAMES } from "./templates.js";
4
+ const KNOWN_KEYS = new Set([
5
+ "template",
6
+ "provider",
7
+ "region",
8
+ "size",
9
+ "name",
10
+ "fullSetup",
11
+ "domain",
12
+ ]);
13
+ const SECURITY_KEYS = new Set(["token", "apiToken", "api_token", "apiKey", "api_key", "secret"]);
14
+ export function validateYamlConfig(raw) {
15
+ const warnings = [];
16
+ const config = {};
17
+ if (raw === null || raw === undefined) {
18
+ return { config, warnings };
19
+ }
20
+ if (typeof raw !== "object" || Array.isArray(raw)) {
21
+ warnings.push("Config file must be a YAML object (key: value pairs)");
22
+ return { config, warnings };
23
+ }
24
+ const obj = raw;
25
+ // Security check: token fields
26
+ for (const key of Object.keys(obj)) {
27
+ if (SECURITY_KEYS.has(key)) {
28
+ warnings.push(`Security warning: "${key}" found in config file. Tokens should NEVER be stored in config files. Use --token flag or environment variables instead.`);
29
+ }
30
+ }
31
+ // Unknown keys
32
+ for (const key of Object.keys(obj)) {
33
+ if (!KNOWN_KEYS.has(key) && !SECURITY_KEYS.has(key)) {
34
+ warnings.push(`Unknown config key: "${key}"`);
35
+ }
36
+ }
37
+ // provider
38
+ if (obj.provider !== undefined) {
39
+ if (typeof obj.provider !== "string") {
40
+ warnings.push('Invalid provider: must be a string ("hetzner" or "digitalocean")');
41
+ }
42
+ else if (!["hetzner", "digitalocean"].includes(obj.provider)) {
43
+ warnings.push(`Invalid provider: "${obj.provider}". Use "hetzner" or "digitalocean".`);
44
+ }
45
+ else {
46
+ config.provider = obj.provider;
47
+ }
48
+ }
49
+ // template
50
+ if (obj.template !== undefined) {
51
+ if (typeof obj.template !== "string") {
52
+ warnings.push('Invalid template: must be a string ("starter", "production", or "dev")');
53
+ }
54
+ else if (!VALID_TEMPLATE_NAMES.includes(obj.template)) {
55
+ warnings.push(`Invalid template: "${obj.template}". Use "starter", "production", or "dev".`);
56
+ }
57
+ else {
58
+ config.template = obj.template;
59
+ }
60
+ }
61
+ // name validation: 3-63 chars, lowercase, hyphens, starts with letter
62
+ if (obj.name !== undefined) {
63
+ if (typeof obj.name !== "string") {
64
+ warnings.push("Invalid name: must be a string");
65
+ }
66
+ else {
67
+ const name = obj.name;
68
+ if (name.length < 3 || name.length > 63) {
69
+ warnings.push("Invalid name: must be between 3 and 63 characters");
70
+ }
71
+ else if (!/^[a-z][a-z0-9-]*[a-z0-9]$/.test(name)) {
72
+ warnings.push("Invalid name: must start with a lowercase letter, end with a letter or number, and contain only lowercase letters, numbers, and hyphens");
73
+ }
74
+ else {
75
+ config.name = name;
76
+ }
77
+ }
78
+ }
79
+ // region (string)
80
+ if (obj.region !== undefined) {
81
+ if (typeof obj.region !== "string") {
82
+ warnings.push("Invalid region: must be a string");
83
+ }
84
+ else {
85
+ config.region = obj.region;
86
+ }
87
+ }
88
+ // size (string)
89
+ if (obj.size !== undefined) {
90
+ if (typeof obj.size !== "string") {
91
+ warnings.push("Invalid size: must be a string");
92
+ }
93
+ else {
94
+ config.size = obj.size;
95
+ }
96
+ }
97
+ // fullSetup (boolean)
98
+ if (obj.fullSetup !== undefined) {
99
+ if (typeof obj.fullSetup !== "boolean") {
100
+ warnings.push("Invalid fullSetup: must be true or false");
101
+ }
102
+ else {
103
+ config.fullSetup = obj.fullSetup;
104
+ }
105
+ }
106
+ // domain (string)
107
+ if (obj.domain !== undefined) {
108
+ if (typeof obj.domain !== "string") {
109
+ warnings.push("Invalid domain: must be a string");
110
+ }
111
+ else {
112
+ config.domain = obj.domain;
113
+ }
114
+ }
115
+ return { config, warnings };
116
+ }
117
+ export function loadYamlConfig(filePath) {
118
+ let content;
119
+ try {
120
+ content = readFileSync(filePath, "utf-8");
121
+ }
122
+ catch (error) {
123
+ const msg = error instanceof Error ? error.message : String(error);
124
+ return { config: {}, warnings: [`Could not read config file: ${msg}`] };
125
+ }
126
+ let parsed;
127
+ try {
128
+ parsed = yaml.load(content, { schema: yaml.JSON_SCHEMA });
129
+ }
130
+ catch (error) {
131
+ const msg = error instanceof Error ? error.message : String(error);
132
+ return { config: {}, warnings: [`Invalid YAML syntax: ${msg}`] };
133
+ }
134
+ return validateYamlConfig(parsed);
135
+ }
136
+ //# sourceMappingURL=yamlConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yamlConfig.js","sourceRoot":"","sources":["../../src/utils/yamlConfig.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quicklify",
3
- "version": "0.7.2",
3
+ "version": "0.9.0",
4
4
  "description": "Automate Coolify deployment on cloud providers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -63,12 +63,14 @@
63
63
  "chalk": "^5.6.2",
64
64
  "commander": "^14.0.3",
65
65
  "inquirer": "^12.3.2",
66
+ "js-yaml": "^4.1.1",
66
67
  "ora": "^9.3.0"
67
68
  },
68
69
  "devDependencies": {
69
70
  "@eslint/js": "^10.0.1",
70
71
  "@types/inquirer": "^9.0.7",
71
72
  "@types/jest": "^30.0.0",
73
+ "@types/js-yaml": "^4.0.9",
72
74
  "@types/node": "^22.12.0",
73
75
  "eslint": "^10.0.0",
74
76
  "eslint-config-prettier": "^10.1.8",