@catapultjs/deploy 0.11.0 → 0.13.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 (41) hide show
  1. package/README.md +34 -13
  2. package/build/bin/run.js +31 -55
  3. package/build/bin/run.js.map +1 -1
  4. package/build/commands/config_validate.d.ts +7 -0
  5. package/build/commands/config_validate.js +45 -0
  6. package/build/commands/config_validate.js.map +1 -0
  7. package/build/commands/init.js +20 -4
  8. package/build/commands/init.js.map +1 -1
  9. package/build/index.d.ts +1 -0
  10. package/build/index.js +1 -0
  11. package/build/index.js.map +1 -1
  12. package/build/recipes/caddy.d.ts +10 -0
  13. package/build/recipes/caddy.js +64 -0
  14. package/build/recipes/caddy.js.map +1 -0
  15. package/build/recipes/systemd.d.ts +9 -0
  16. package/build/recipes/systemd.js +37 -0
  17. package/build/recipes/systemd.js.map +1 -0
  18. package/build/src/config/json/loader.d.ts +4 -0
  19. package/build/src/config/json/loader.js +206 -0
  20. package/build/src/config/json/loader.js.map +1 -0
  21. package/build/src/config/json/recipe_registry.d.ts +3 -0
  22. package/build/src/config/json/recipe_registry.js +44 -0
  23. package/build/src/config/json/recipe_registry.js.map +1 -0
  24. package/build/src/config/json/schema.d.ts +45 -0
  25. package/build/src/config/json/schema.js +198 -0
  26. package/build/src/config/json/schema.js.map +1 -0
  27. package/build/src/config/loader.d.ts +2 -0
  28. package/build/src/config/loader.js +21 -0
  29. package/build/src/config/loader.js.map +1 -0
  30. package/build/src/config/resolve.d.ts +2 -0
  31. package/build/src/config/resolve.js +30 -0
  32. package/build/src/config/resolve.js.map +1 -0
  33. package/build/src/utils.js +8 -1
  34. package/build/src/utils.js.map +1 -1
  35. package/package.json +11 -6
  36. package/schema/deploy.schema.json +287 -0
  37. package/skills/catapultjs/SKILL.md +14 -11
  38. package/skills/catapultjs/references/cli.md +11 -2
  39. package/skills/catapultjs/references/config.md +133 -34
  40. package/skills/catapultjs/references/recipe.md +1 -1
  41. package/skills/catapultjs/references/recipes.md +68 -0
package/README.md CHANGED
@@ -19,13 +19,13 @@ Full documentation at **https://catapultjs.com/**
19
19
 
20
20
  ## Quick start
21
21
 
22
- Run `init` at the root of your project it creates a `deploy.ts` config file and installs `@catapultjs/deploy` as a dev dependency:
22
+ Run `init` at the root of your project. It lets you choose TypeScript, JavaScript or JSON, creates the matching `deploy.config.*` file, and installs `@catapultjs/deploy` as a dev dependency:
23
23
 
24
24
  ```bash
25
25
  npx @catapultjs/deploy init
26
26
  ```
27
27
 
28
- Edit `deploy.ts` to describe your hosts and pick your recipes:
28
+ Edit the generated config to describe your hosts and pick your recipes. With TypeScript:
29
29
 
30
30
  ```typescript
31
31
  import { defineConfig } from '@catapultjs/deploy'
@@ -43,6 +43,27 @@ export default defineConfig({
43
43
  })
44
44
  ```
45
45
 
46
+ For a fully declarative config, choose JSON. Catapult validates it against the schema shipped with the package and supports built-in recipes, store values, custom task steps and declarative pipeline controls:
47
+
48
+ ```json
49
+ {
50
+ "$schema": "https://catapultjs.com/schema/deploy.schema.json",
51
+ "version": 1,
52
+ "recipes": ["git", "pm2"],
53
+ "config": {
54
+ "hosts": [
55
+ {
56
+ "name": "production",
57
+ "ssh": "deploy@example.com",
58
+ "deployPath": "/home/deploy/myapp"
59
+ }
60
+ ]
61
+ }
62
+ }
63
+ ```
64
+
65
+ See the [JSON configuration guide](https://catapultjs.com/guide/json-configuration) for tasks, pipeline customization, supported recipes and the cases that still require TypeScript or JavaScript.
66
+
46
67
  Prepare the server (once per host), then deploy:
47
68
 
48
69
  ```bash
@@ -69,18 +90,18 @@ npx cata deploy
69
90
 
70
91
  ## Recipes
71
92
 
72
- | Recipe | Description |
73
- | ---------------- | --------------------------------------------------------------------------- |
93
+ | Recipe | Description |
94
+ | ---------------- | -------------------------------------------------------------------------- |
74
95
  | `git` | Clones the repository into each release, keeps a bare mirror on the server |
75
- | `rsync` | Pushes a local directory into the release with rsync |
76
- | `pm2` | Start, reload and manage PM2 processes |
77
- | `adonisjs` | Install, build and migration tasks for AdonisJS apps |
78
- | `adonisjs_local` | Builds the AdonisJS app locally, uploads the artifact |
79
- | `astro` | Builds locally with `astro build`, uploads the output |
80
- | `nuxt` | Build tasks for Nuxt apps |
81
- | `vitepress` | Builds locally with `vitepress build`, uploads the static files |
82
- | `directus` | Directus database migration and schema snapshot tasks |
83
- | `redis` | Flush one, many or all Redis databases |
96
+ | `rsync` | Pushes a local directory into the release with rsync |
97
+ | `pm2` | Start, reload and manage PM2 processes |
98
+ | `adonisjs` | Install, build and migration tasks for AdonisJS apps |
99
+ | `adonisjs_local` | Builds the AdonisJS app locally, uploads the artifact |
100
+ | `astro` | Builds locally with `astro build`, uploads the output |
101
+ | `nuxt` | Build tasks for Nuxt apps |
102
+ | `vitepress` | Builds locally with `vitepress build`, uploads the static files |
103
+ | `directus` | Directus database migration and schema snapshot tasks |
104
+ | `redis` | Flush one, many or all Redis databases |
84
105
 
85
106
  ## Requirements
86
107
 
package/build/bin/run.js CHANGED
@@ -1,33 +1,25 @@
1
1
  #!/usr/bin/env node
2
- var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
3
- if (typeof path === "string" && /^\.\.?\//.test(path)) {
4
- return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
5
- return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
6
- });
7
- }
8
- return path;
9
- };
10
- import { pathToFileURL } from 'node:url';
11
- import { resolve } from 'node:path';
12
- import { access } from 'node:fs/promises';
13
- import { findDeployFile } from "../src/utils.js";
2
+ import { loadDeployConfig } from "../src/config/loader.js";
14
3
  import { Context } from "../src/context.js";
15
4
  import { logger } from "../src/logger.js";
16
5
  import { Verbose } from "../src/enums.js";
17
6
  import { Kernel, ListLoader, HelpCommand } from '@adonisjs/ace';
18
- import Version from '../commands/version.js';
19
- import Init from '../commands/init.js';
20
- import Setup from '../commands/setup.js';
21
- import Deploy from '../commands/deploy.js';
22
- import Rollback from '../commands/rollback.js';
23
- import Status from '../commands/status.js';
24
- import ListReleases from '../commands/list_releases.js';
25
- import ListRevisions from '../commands/list_revisions.js';
26
- import ListTasks from '../commands/list_tasks.js';
27
- import Pipeline from '../commands/pipeline.js';
28
- import RunTask from '../commands/run_task.js';
29
- import Ssh from '../commands/ssh.js';
30
- import Run from '../commands/run.js';
7
+ import Version from "../commands/version.js";
8
+ import Init from "../commands/init.js";
9
+ import Setup from "../commands/setup.js";
10
+ import Deploy from "../commands/deploy.js";
11
+ import Rollback from "../commands/rollback.js";
12
+ import Status from "../commands/status.js";
13
+ import ListReleases from "../commands/list_releases.js";
14
+ import ListRevisions from "../commands/list_revisions.js";
15
+ import ListTasks from "../commands/list_tasks.js";
16
+ import Pipeline from "../commands/pipeline.js";
17
+ import RunTask from "../commands/run_task.js";
18
+ import Ssh from "../commands/ssh.js";
19
+ import Run from "../commands/run.js";
20
+ import ConfigValidate from "../commands/config_validate.js";
21
+ import { resolveDeployConfigFile } from "../src/config/resolve.js";
22
+ const cliArgs = process.argv.slice(2);
31
23
  function parseVerboseLevel(argv) {
32
24
  let count = 0;
33
25
  for (const arg of argv) {
@@ -38,39 +30,18 @@ function parseVerboseLevel(argv) {
38
30
  }
39
31
  return Math.min(count, Verbose.DEBUG);
40
32
  }
41
- function parseConfigFlag(argv) {
42
- for (let i = 0; i < argv.length; i++) {
43
- if ((argv[i] === '--config' || argv[i] === '-c') && argv[i + 1]) {
44
- return argv[i + 1];
45
- }
46
- }
47
- return null;
48
- }
49
- const skipDeployFile = ['init', 'version'].includes(process.argv[2]);
33
+ const skipDeployFile = ['init', 'version', 'config:validate'].includes(cliArgs[0]);
50
34
  if (!skipDeployFile) {
51
- const configFlag = parseConfigFlag(process.argv.slice(2));
52
- let deployFile = null;
53
- if (configFlag) {
54
- const resolved = resolve(process.cwd(), configFlag);
55
- try {
56
- await access(resolved);
57
- deployFile = resolved;
58
- }
59
- catch {
60
- logger.error(`Config file not found: ${configFlag}`);
61
- process.exit(1);
62
- }
35
+ try {
36
+ const deployFile = await resolveDeployConfigFile(cliArgs);
37
+ const initialize = await loadDeployConfig(deployFile);
38
+ await initialize();
63
39
  }
64
- else {
65
- deployFile = await findDeployFile();
66
- }
67
- if (!deployFile) {
68
- logger.error('No supported deploy config file found in current directory. Run `npx cata init` to create one.');
40
+ catch (error) {
41
+ logger.error(error instanceof Error ? error.message : String(error));
69
42
  process.exit(1);
70
43
  }
71
- const mod = await import(__rewriteRelativeImportExtension(pathToFileURL(deployFile).href));
72
- await mod.default();
73
- const verboseLevel = parseVerboseLevel(process.argv.slice(2));
44
+ const verboseLevel = parseVerboseLevel(cliArgs);
74
45
  if (verboseLevel > Verbose.SILENT)
75
46
  Context.get().config.verbose = verboseLevel;
76
47
  }
@@ -84,6 +55,10 @@ kernel.defineFlag('config', {
84
55
  alias: 'c',
85
56
  description: 'Path to the deploy config file (default: auto-detected)',
86
57
  });
58
+ kernel.defineFlag('json', {
59
+ type: 'boolean',
60
+ description: 'Output result as JSON when supported by the command',
61
+ });
87
62
  kernel.on('help', async (command, $kernel, parsed) => {
88
63
  parsed.args.unshift(command.commandName);
89
64
  const help = new HelpCommand($kernel, parsed, kernel.ui, kernel.prompt);
@@ -101,10 +76,11 @@ kernel.addLoader(new ListLoader([
101
76
  ListRevisions,
102
77
  ListTasks,
103
78
  Pipeline,
79
+ ConfigValidate,
104
80
  RunTask,
105
81
  Ssh,
106
82
  Run,
107
83
  ]));
108
- await kernel.handle(process.argv.splice(2));
84
+ await kernel.handle(cliArgs);
109
85
  process.exitCode = kernel.exitCode ?? 0;
110
86
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../bin/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../bin/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BaseCommand } from '@adonisjs/ace';
2
+ export default class ConfigValidate extends BaseCommand {
3
+ static commandName: string;
4
+ static description: string;
5
+ json: boolean;
6
+ run(): Promise<void>;
7
+ }
@@ -0,0 +1,45 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseCommand, flags } from '@adonisjs/ace';
11
+ import { loadDeployConfig } from "../src/config/loader.js";
12
+ import { resolveDeployConfigFile } from "../src/config/resolve.js";
13
+ export default class ConfigValidate extends BaseCommand {
14
+ static commandName = 'config:validate';
15
+ static description = 'Validate the deploy configuration file';
16
+ async run() {
17
+ let file = null;
18
+ try {
19
+ file = await resolveDeployConfigFile(process.argv.slice(2));
20
+ const initialize = await loadDeployConfig(file);
21
+ await initialize();
22
+ }
23
+ catch (error) {
24
+ const message = error instanceof Error ? error.message : String(error);
25
+ if (this.json || process.argv.includes('--json')) {
26
+ console.log(JSON.stringify({ valid: false, file, error: message }, null, 2));
27
+ }
28
+ else {
29
+ this.logger.error(message);
30
+ }
31
+ this.exitCode = 1;
32
+ return;
33
+ }
34
+ if (this.json || process.argv.includes('--json')) {
35
+ console.log(JSON.stringify({ valid: true, file }, null, 2));
36
+ return;
37
+ }
38
+ this.logger.info(`Deploy config is valid: ${file}`);
39
+ }
40
+ }
41
+ __decorate([
42
+ flags.boolean({ description: 'Output result as JSON' }),
43
+ __metadata("design:type", Boolean)
44
+ ], ConfigValidate.prototype, "json", void 0);
45
+ //# sourceMappingURL=config_validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_validate.js","sourceRoot":"","sources":["../../commands/config_validate.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAC,WAAW,GAAG,iBAAiB,CAAA;IACtC,MAAM,CAAC,WAAW,GAAG,wCAAwC,CAAA;IAK7D,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,GAAkB,IAAI,CAAA;QAE9B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3D,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;YAC/C,MAAM,UAAU,EAAE,CAAA;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC9E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC5B,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC3D,OAAM;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;;AA1BO;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;;4CACnC"}
@@ -25,6 +25,21 @@ export default defineConfig({
25
25
  ],
26
26
  })
27
27
  `;
28
+ const JSON_TEMPLATE = `{
29
+ "$schema": "https://catapultjs.com/schema/deploy.schema.json",
30
+ "version": 1,
31
+ "config": {
32
+ "hosts": [
33
+ {
34
+ "name": "production",
35
+ "ssh": "deploy@example.com",
36
+ "deployPath": "/home/deploy/myapp",
37
+ "branch": "main"
38
+ }
39
+ ]
40
+ }
41
+ }
42
+ `;
28
43
  export default class Init extends BaseCommand {
29
44
  static commandName = 'init';
30
45
  static description = 'Create a deploy configuration file';
@@ -35,12 +50,13 @@ export default class Init extends BaseCommand {
35
50
  return;
36
51
  }
37
52
  const lang = await this.prompt.choice('Which language do you want to use?', [
38
- { name: 'ts', message: 'TypeScript (deploy.ts)' },
39
- { name: 'js', message: 'JavaScript (deploy.js)' },
53
+ { name: 'ts', message: 'TypeScript (deploy.config.ts)' },
54
+ { name: 'js', message: 'JavaScript (deploy.config.js)' },
55
+ { name: 'json', message: 'JSON (deploy.config.json)' },
40
56
  ]);
41
- const filename = lang === 'ts' ? 'deploy.ts' : 'deploy.js';
57
+ const filename = `deploy.config.${lang}`;
42
58
  const dest = resolve(process.cwd(), filename);
43
- await writeFile(dest, TEMPLATE);
59
+ await writeFile(dest, lang === 'json' ? JSON_TEMPLATE : TEMPLATE);
44
60
  this.logger.action(`create ${filename}`).succeeded();
45
61
  if (this.skipInstall) {
46
62
  this.logger.info('Skipping @catapultjs/deploy installation');
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../commands/init.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtE,MAAM,QAAQ,GAAG;;;;;;;;;;;;CAYhB,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAA;IAC3B,MAAM,CAAC,WAAW,GAAG,oCAAoC,CAAA;IAKzD,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,iBAAiB,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oCAAoC,EAAE;YAC1E,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,wBAAwB,EAAE;YACjD,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,wBAAwB,EAAE;SAClD,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAA;QAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;QAE7C,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QAEpD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;YAC5D,OAAM;QACR,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;QACpD,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;YACvD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,SAAS,EAAE,CAAA;IAC9D,CAAC;;AAhCO;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;yCACnE"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../commands/init.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtE,MAAM,QAAQ,GAAG;;;;;;;;;;;;CAYhB,CAAA;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;CAcrB,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAA;IAC3B,MAAM,CAAC,WAAW,GAAG,oCAAoC,CAAA;IAKzD,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,iBAAiB,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oCAAoC,EAAE;YAC1E,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE;YACxD,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE;YACxD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,EAAE;SACvD,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,iBAAiB,IAAI,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;QAE7C,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QAEpD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;YAC5D,OAAM;QACR,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;QACpD,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;YACvD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,SAAS,EAAE,CAAA;IAC9D,CAAC;;AAjCO;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;yCACnE"}
package/build/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './src/task.ts';
5
5
  export * from './src/pipeline.ts';
6
6
  export * from './src/package_manager.ts';
7
7
  export * from './src/define_config.ts';
8
+ export * from './src/config/json/schema.ts';
8
9
  export * from './src/deployer.ts';
9
10
  export * from './src/status.ts';
10
11
  export { Catapult } from './src/api.ts';
package/build/index.js CHANGED
@@ -5,6 +5,7 @@ export * from "./src/task.js";
5
5
  export * from "./src/pipeline.js";
6
6
  export * from "./src/package_manager.js";
7
7
  export * from "./src/define_config.js";
8
+ export * from "./src/config/json/schema.js";
8
9
  export * from "./src/deployer.js";
9
10
  export * from "./src/status.js";
10
11
  export { Catapult } from "./src/api.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,wBAAwB,CAAA;AACtC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,10 @@
1
+ declare module '../src/types.ts' {
2
+ interface TaskRegistry {
3
+ 'caddy:validate': true;
4
+ 'caddy:fmt': true;
5
+ 'caddy:reload': true;
6
+ 'caddy:config:show': true;
7
+ 'caddy:config:upload': true;
8
+ }
9
+ }
10
+ export {};
@@ -0,0 +1,64 @@
1
+ import { task, desc, after, get, bin, upload, onStatus } from "../index.js";
2
+ import { ssh, q } from "../src/utils.js";
3
+ function sudo() {
4
+ return get('caddy_use_sudo', true) ? 'sudo ' : '';
5
+ }
6
+ function configPath() {
7
+ return get('caddy_config_path', '/etc/caddy/Caddyfile');
8
+ }
9
+ function localConfigPath() {
10
+ return get('caddy_local_config_path', './Caddyfile');
11
+ }
12
+ function validateCommand() {
13
+ return `${sudo()}${bin('caddy')} validate --config ${q(configPath())}`;
14
+ }
15
+ function reloadCommand() {
16
+ return `${sudo()}${bin('caddy')} reload --config ${q(configPath())}`;
17
+ }
18
+ onStatus(async (_ctx, host) => {
19
+ const { stdout } = await ssh(host, `set +e\n${bin('caddy')} version || true`);
20
+ const version = stdout.trim().split(/\s+/)[0];
21
+ return { caddy: version || 'unavailable' };
22
+ });
23
+ desc('Validates the Caddy configuration');
24
+ task('caddy:validate', async ({ host, logger }) => {
25
+ const { stdout } = await ssh(host, `set -e\n${validateCommand()}`, { color: true });
26
+ logger.log(stdout.trim());
27
+ });
28
+ desc('Formats the configured Caddyfile');
29
+ task('caddy:fmt', async ({ host, logger }) => {
30
+ const { stdout } = await ssh(host, `set -e\n${sudo()}${bin('caddy')} fmt --overwrite ${q(configPath())}`, { color: true });
31
+ logger.log(stdout.trim());
32
+ });
33
+ desc('Reloads Caddy with the configured Caddyfile');
34
+ task('caddy:reload', async ({ host, logger }) => {
35
+ const validateBeforeReload = get('caddy_validate_before_reload', true);
36
+ const commands = [
37
+ 'set -e',
38
+ validateBeforeReload ? validateCommand() : '',
39
+ reloadCommand(),
40
+ ].filter(Boolean);
41
+ const { stdout } = await ssh(host, commands.join('\n'), { color: true });
42
+ logger.log(stdout.trim());
43
+ });
44
+ desc('Displays the configured Caddyfile');
45
+ task('caddy:config:show', async ({ host, logger }) => {
46
+ const { stdout } = await ssh(host, `set -e\n${sudo()}cat ${q(configPath())}`, { color: true });
47
+ logger.log(stdout.trim());
48
+ });
49
+ desc('Uploads and validates a local Caddyfile');
50
+ task('caddy:config:upload', async ({ host, paths, logger }) => {
51
+ const remoteTmp = `${paths.cataConfig}/Caddyfile.upload`;
52
+ await ssh(host, `set -e\nmkdir -p ${q(paths.cataConfig)}`);
53
+ await upload(localConfigPath(), remoteTmp);
54
+ const { stdout } = await ssh(host, [
55
+ 'set -e',
56
+ `${sudo()}install -m 0644 ${q(remoteTmp)} ${q(configPath())}`,
57
+ validateCommand(),
58
+ ].join('\n'), { color: true });
59
+ logger.log(stdout.trim());
60
+ });
61
+ if (get('caddy_reload_after_publish', false)) {
62
+ after('deploy:publish', 'caddy:reload');
63
+ }
64
+ //# sourceMappingURL=caddy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caddy.js","sourceRoot":"","sources":["../../recipes/caddy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ declare module '../src/types.ts' {
2
+ interface TaskRegistry {
3
+ 'systemd:restart': true;
4
+ 'systemd:reload': true;
5
+ 'systemd:status': true;
6
+ 'systemd:logs': true;
7
+ }
8
+ }
9
+ export {};
@@ -0,0 +1,37 @@
1
+ import { task, desc, get } from "../index.js";
2
+ import { ssh, q } from "../src/utils.js";
3
+ function sudo() {
4
+ return get('systemd_use_sudo', true) ? 'sudo ' : '';
5
+ }
6
+ function service() {
7
+ return get('systemd_service', 'app');
8
+ }
9
+ function logLines() {
10
+ const lines = Number(get('systemd_logs_lines', 100));
11
+ return Number.isFinite(lines) && lines > 0 ? Math.floor(lines) : 100;
12
+ }
13
+ desc('Restarts the configured systemd service');
14
+ task('systemd:restart', async ({ host, logger }) => {
15
+ const { stdout } = await ssh(host, `set -e\n${sudo()}systemctl restart ${q(service())}`, {
16
+ color: true,
17
+ });
18
+ logger.log(stdout.trim());
19
+ });
20
+ desc('Reloads the configured systemd service');
21
+ task('systemd:reload', async ({ host, logger }) => {
22
+ const { stdout } = await ssh(host, `set -e\n${sudo()}systemctl reload ${q(service())}`, {
23
+ color: true,
24
+ });
25
+ logger.log(stdout.trim());
26
+ });
27
+ desc('Displays the configured systemd service status');
28
+ task('systemd:status', async ({ host, logger }) => {
29
+ const { stdout } = await ssh(host, `set +e\n${sudo()}systemctl status ${q(service())} --no-pager`, { color: true });
30
+ logger.log(stdout.trim());
31
+ });
32
+ desc('Displays journal logs for the configured systemd service');
33
+ task('systemd:logs', async ({ host, logger }) => {
34
+ const { stdout } = await ssh(host, `set +e\n${sudo()}journalctl -u ${q(service())} -n ${q(String(logLines()))} --no-pager`, { color: true });
35
+ logger.log(stdout.trim());
36
+ });
37
+ //# sourceMappingURL=systemd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../recipes/systemd.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AAWxC,SAAS,IAAI;IACX,OAAO,GAAG,CAAU,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9D,CAAC;AAED,SAAS,OAAO;IACd,OAAO,GAAG,CAAS,iBAAiB,EAAE,KAAK,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAS,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AACtE,CAAC;AAED,IAAI,CAAC,yCAAyC,CAAC,CAAA;AAC/C,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,qBAAqB,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QACvF,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;IACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,wCAAwC,CAAC,CAAA;AAC9C,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QACtF,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;IACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gDAAgD,CAAC,CAAA;AACtD,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,IAAI,EACJ,WAAW,IAAI,EAAE,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAC9D,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0DAA0D,CAAC,CAAA;AAChE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,IAAI,EACJ,WAAW,IAAI,EAAE,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,EACvF,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type JsonDeployConfig } from './schema.ts';
2
+ export declare function validateJsonConfig(value: unknown): JsonDeployConfig;
3
+ export declare function parseJsonConfig(contents: string, source: string): JsonDeployConfig;
4
+ export declare function loadJsonConfig(filePath: string): Promise<() => Promise<void>>;