@actuate-media/cli 0.4.0 → 0.4.2

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 (79) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +21 -10
  3. package/CHANGELOG.md +34 -0
  4. package/dist/__tests__/deployment-diagnostics.test.js +40 -0
  5. package/dist/__tests__/deployment-diagnostics.test.js.map +1 -1
  6. package/dist/__tests__/init.test.js.map +1 -1
  7. package/dist/__tests__/schema-fragment.test.js +1 -1
  8. package/dist/__tests__/schema-fragment.test.js.map +1 -1
  9. package/dist/__tests__/seed.test.js.map +1 -1
  10. package/dist/commands/db-init.d.ts +2 -2
  11. package/dist/commands/db-init.d.ts.map +1 -1
  12. package/dist/commands/db-init.js +32 -32
  13. package/dist/commands/db-init.js.map +1 -1
  14. package/dist/commands/db-status.d.ts +1 -1
  15. package/dist/commands/db-status.d.ts.map +1 -1
  16. package/dist/commands/db-status.js +33 -33
  17. package/dist/commands/db-status.js.map +1 -1
  18. package/dist/commands/doctor.d.ts +1 -1
  19. package/dist/commands/doctor.d.ts.map +1 -1
  20. package/dist/commands/doctor.js +55 -38
  21. package/dist/commands/doctor.js.map +1 -1
  22. package/dist/commands/export.d.ts +1 -1
  23. package/dist/commands/export.d.ts.map +1 -1
  24. package/dist/commands/export.js +32 -32
  25. package/dist/commands/export.js.map +1 -1
  26. package/dist/commands/generate.d.ts +1 -1
  27. package/dist/commands/generate.d.ts.map +1 -1
  28. package/dist/commands/generate.js +8 -8
  29. package/dist/commands/generate.js.map +1 -1
  30. package/dist/commands/import.d.ts +1 -1
  31. package/dist/commands/import.d.ts.map +1 -1
  32. package/dist/commands/import.js +55 -58
  33. package/dist/commands/import.js.map +1 -1
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/migrate.d.ts +1 -1
  37. package/dist/commands/migrate.d.ts.map +1 -1
  38. package/dist/commands/migrate.js +18 -24
  39. package/dist/commands/migrate.js.map +1 -1
  40. package/dist/commands/seed.d.ts +1 -1
  41. package/dist/commands/seed.d.ts.map +1 -1
  42. package/dist/commands/seed.js +156 -157
  43. package/dist/commands/seed.js.map +1 -1
  44. package/dist/commands/update-check.d.ts +1 -1
  45. package/dist/commands/update-check.d.ts.map +1 -1
  46. package/dist/commands/update-check.js +34 -27
  47. package/dist/commands/update-check.js.map +1 -1
  48. package/dist/commands/upgrade.d.ts +1 -1
  49. package/dist/commands/upgrade.d.ts.map +1 -1
  50. package/dist/commands/upgrade.js +41 -34
  51. package/dist/commands/upgrade.js.map +1 -1
  52. package/dist/deployment/diagnostics.d.ts +2 -0
  53. package/dist/deployment/diagnostics.d.ts.map +1 -1
  54. package/dist/deployment/diagnostics.js +50 -1
  55. package/dist/deployment/diagnostics.js.map +1 -1
  56. package/dist/index.js +15 -15
  57. package/dist/index.js.map +1 -1
  58. package/dist/utils/logger.d.ts.map +1 -1
  59. package/dist/utils/logger.js +5 -5
  60. package/dist/utils/logger.js.map +1 -1
  61. package/package.json +3 -3
  62. package/src/__tests__/deployment-diagnostics.test.ts +100 -50
  63. package/src/__tests__/init.test.ts +17 -17
  64. package/src/__tests__/schema-fragment.test.ts +29 -25
  65. package/src/__tests__/seed.test.ts +25 -25
  66. package/src/commands/db-init.ts +59 -59
  67. package/src/commands/db-status.ts +70 -68
  68. package/src/commands/doctor.ts +110 -86
  69. package/src/commands/export.ts +65 -75
  70. package/src/commands/generate.ts +14 -16
  71. package/src/commands/import.ts +125 -140
  72. package/src/commands/init.ts +14 -14
  73. package/src/commands/migrate.ts +29 -35
  74. package/src/commands/seed.ts +294 -300
  75. package/src/commands/update-check.ts +77 -72
  76. package/src/commands/upgrade.ts +92 -85
  77. package/src/deployment/diagnostics.ts +124 -61
  78. package/src/index.ts +30 -30
  79. package/src/utils/logger.ts +10 -10
@@ -1,120 +1,122 @@
1
- import { Command } from "commander";
2
- import { execSync } from "node:child_process";
3
- import { readFile, access } from "node:fs/promises";
4
- import { resolve } from "node:path";
5
- import ora from "ora";
6
- import chalk from "chalk";
7
- import { logger } from "../utils/logger.js";
8
- import { REQUIRED_CMS_MODELS } from "../deployment/diagnostics.js";
1
+ import { Command } from 'commander'
2
+ import { execSync } from 'node:child_process'
3
+ import { readFile, access } from 'node:fs/promises'
4
+ import { resolve } from 'node:path'
5
+ import ora from 'ora'
6
+ import chalk from 'chalk'
7
+ import { logger } from '../utils/logger.js'
8
+ import { REQUIRED_CMS_MODELS } from '../deployment/diagnostics.js'
9
9
 
10
- const CMS_SCHEMA_MARKER = "// ── Actuate CMS models";
10
+ const CMS_SCHEMA_MARKER = '// ── Actuate CMS models'
11
11
 
12
12
  async function fileExists(filePath: string): Promise<boolean> {
13
13
  try {
14
- await access(filePath);
15
- return true;
14
+ await access(filePath)
15
+ return true
16
16
  } catch {
17
- return false;
17
+ return false
18
18
  }
19
19
  }
20
20
 
21
21
  export function registerDbStatusCommand(program: Command): void {
22
22
  program
23
- .command("db:status")
24
- .description("Check which Actuate CMS models are present in your Prisma schema")
25
- .option("--schema <path>", "Path to schema.prisma", "prisma/schema.prisma")
23
+ .command('db:status')
24
+ .description('Check which Actuate CMS models are present in your Prisma schema')
25
+ .option('--schema <path>', 'Path to schema.prisma', 'prisma/schema.prisma')
26
26
  .action(async (opts: { schema: string }) => {
27
- const schemaPath = resolve(process.cwd(), opts.schema);
27
+ const schemaPath = resolve(process.cwd(), opts.schema)
28
28
 
29
29
  if (!(await fileExists(schemaPath))) {
30
- logger.error(`Schema file not found at ${schemaPath}`);
31
- logger.info("Run `npx prisma init` first, or specify --schema <path>.");
32
- process.exitCode = 1;
33
- return;
30
+ logger.error(`Schema file not found at ${schemaPath}`)
31
+ logger.info('Run `npx prisma init` first, or specify --schema <path>.')
32
+ process.exitCode = 1
33
+ return
34
34
  }
35
35
 
36
- const spinner = ora("Checking schema...").start();
36
+ const spinner = ora('Checking schema...').start()
37
37
 
38
- let content: string;
38
+ let content: string
39
39
  try {
40
- content = await readFile(schemaPath, "utf-8");
40
+ content = await readFile(schemaPath, 'utf-8')
41
41
  } catch (err) {
42
- spinner.fail("Failed to read schema file.");
43
- logger.error(err instanceof Error ? err.message : String(err));
44
- process.exitCode = 1;
45
- return;
42
+ spinner.fail('Failed to read schema file.')
43
+ logger.error(err instanceof Error ? err.message : String(err))
44
+ process.exitCode = 1
45
+ return
46
46
  }
47
47
 
48
- spinner.stop();
48
+ spinner.stop()
49
49
 
50
- const hasMarker = content.includes(CMS_SCHEMA_MARKER);
51
- const modelRegex = /^model\s+(\w+)\s*\{/gm;
52
- const schemaModels = new Set<string>();
53
- let match;
50
+ const hasMarker = content.includes(CMS_SCHEMA_MARKER)
51
+ const modelRegex = /^model\s+(\w+)\s*\{/gm
52
+ const schemaModels = new Set<string>()
53
+ let match
54
54
  while ((match = modelRegex.exec(content)) !== null) {
55
- schemaModels.add(match[1]!);
55
+ schemaModels.add(match[1]!)
56
56
  }
57
57
 
58
- console.log();
59
- console.log(chalk.bold(" Actuate CMS Model Status"));
60
- console.log(chalk.dim(" ─────────────────────────────────"));
61
- console.log();
58
+ console.log()
59
+ console.log(chalk.bold(' Actuate CMS Model Status'))
60
+ console.log(chalk.dim(' ─────────────────────────────────'))
61
+ console.log()
62
62
 
63
- let present = 0;
64
- let missing = 0;
63
+ let present = 0
64
+ let missing = 0
65
65
 
66
66
  for (const model of REQUIRED_CMS_MODELS) {
67
67
  if (schemaModels.has(model)) {
68
- console.log(` ${chalk.green("")} ${model}`);
69
- present++;
68
+ console.log(` ${chalk.green('')} ${model}`)
69
+ present++
70
70
  } else {
71
- console.log(` ${chalk.red("")} ${model} ${chalk.dim("— missing")}`);
72
- missing++;
71
+ console.log(` ${chalk.red('')} ${model} ${chalk.dim('— missing')}`)
72
+ missing++
73
73
  }
74
74
  }
75
75
 
76
- console.log();
77
- console.log(chalk.dim(" ─────────────────────────────────"));
78
- console.log(` ${chalk.green(present)} present, ${missing > 0 ? chalk.red(missing) : chalk.green(missing)} missing`);
76
+ console.log()
77
+ console.log(chalk.dim(' ─────────────────────────────────'))
78
+ console.log(
79
+ ` ${chalk.green(present)} present, ${missing > 0 ? chalk.red(missing) : chalk.green(missing)} missing`,
80
+ )
79
81
 
80
82
  if (!hasMarker) {
81
- console.log();
82
- logger.warn("CMS schema marker not found. Models may have been added manually.");
83
- logger.info("Run `actuate db:init` to add CMS models with proper markers.");
83
+ console.log()
84
+ logger.warn('CMS schema marker not found. Models may have been added manually.')
85
+ logger.info('Run `actuate db:init` to add CMS models with proper markers.')
84
86
  }
85
87
 
86
88
  if (missing > 0) {
87
- console.log();
88
- logger.info("Run `actuate db:init` to add missing models.");
89
+ console.log()
90
+ logger.info('Run `actuate db:init` to add missing models.')
89
91
  }
90
92
 
91
- let dbConnected = false;
93
+ let dbConnected = false
92
94
  try {
93
- spinner.start("Checking database connection...");
94
- execSync("npx prisma db execute --stdin --schema " + JSON.stringify(schemaPath), {
95
- input: "SELECT 1;",
96
- stdio: ["pipe", "pipe", "pipe"],
95
+ spinner.start('Checking database connection...')
96
+ execSync('npx prisma db execute --stdin --schema ' + JSON.stringify(schemaPath), {
97
+ input: 'SELECT 1;',
98
+ stdio: ['pipe', 'pipe', 'pipe'],
97
99
  cwd: process.cwd(),
98
- });
99
- spinner.succeed("Database connection OK.");
100
- dbConnected = true;
100
+ })
101
+ spinner.succeed('Database connection OK.')
102
+ dbConnected = true
101
103
  } catch {
102
- spinner.warn("Could not connect to database. Check DATABASE_URL.");
104
+ spinner.warn('Could not connect to database. Check DATABASE_URL.')
103
105
  }
104
106
 
105
107
  if (dbConnected && missing === 0) {
106
108
  try {
107
- spinner.start("Checking migration status...");
108
- spinner.stop();
109
- execSync("npx prisma migrate status", {
110
- stdio: "inherit",
109
+ spinner.start('Checking migration status...')
110
+ spinner.stop()
111
+ execSync('npx prisma migrate status', {
112
+ stdio: 'inherit',
111
113
  cwd: process.cwd(),
112
- });
114
+ })
113
115
  } catch {
114
- logger.warn("Could not check migration status.");
116
+ logger.warn('Could not check migration status.')
115
117
  }
116
118
  }
117
119
 
118
- console.log();
119
- });
120
+ console.log()
121
+ })
120
122
  }
@@ -1,159 +1,183 @@
1
- import { Command } from "commander";
2
- import { access, readdir, readFile } from "node:fs/promises";
3
- import { resolve } from "node:path";
4
- import chalk from "chalk";
1
+ import { Command } from 'commander'
2
+ import { access, readdir, readFile } from 'node:fs/promises'
3
+ import { resolve } from 'node:path'
4
+ import chalk from 'chalk'
5
5
  import {
6
6
  buildDeploymentManifest,
7
7
  createDiagnosticReport,
8
8
  detectPackageManager,
9
9
  type DiagnosticReport,
10
- } from "../deployment/diagnostics.js";
10
+ } from '../deployment/diagnostics.js'
11
11
 
12
12
  async function fileExists(path: string): Promise<boolean> {
13
13
  try {
14
- await access(path);
15
- return true;
14
+ await access(path)
15
+ return true
16
16
  } catch {
17
- return false;
17
+ return false
18
18
  }
19
19
  }
20
20
 
21
21
  async function readSchemaModels(schemaPath: string): Promise<Set<string>> {
22
- if (!(await fileExists(schemaPath))) return new Set();
23
- const schema = await readFile(schemaPath, "utf-8");
24
- const models = new Set<string>();
25
- const modelRegex = /^model\s+(\w+)\s*\{/gm;
26
- let match;
22
+ if (!(await fileExists(schemaPath))) return new Set()
23
+ const schema = await readFile(schemaPath, 'utf-8')
24
+ const models = new Set<string>()
25
+ const modelRegex = /^model\s+(\w+)\s*\{/gm
26
+ let match
27
27
  while ((match = modelRegex.exec(schema)) !== null) {
28
- models.add(match[1]!);
28
+ models.add(match[1]!)
29
29
  }
30
- return models;
30
+ return models
31
31
  }
32
32
 
33
33
  async function readSchemaContent(schemaPath: string): Promise<string> {
34
- if (!(await fileExists(schemaPath))) return "";
35
- return readFile(schemaPath, "utf-8");
34
+ if (!(await fileExists(schemaPath))) return ''
35
+ return readFile(schemaPath, 'utf-8')
36
+ }
37
+
38
+ async function readOptionalFile(path: string): Promise<string> {
39
+ if (!(await fileExists(path))) return ''
40
+ return readFile(path, 'utf-8')
36
41
  }
37
42
 
38
43
  async function detectProjectPackageManager(): Promise<string> {
39
- const entries = new Set(await readdir(process.cwd()));
40
- return detectPackageManager(entries);
44
+ const entries = new Set(await readdir(process.cwd()))
45
+ return detectPackageManager(entries)
41
46
  }
42
47
 
43
48
  function printReport(title: string, report: DiagnosticReport): void {
44
- console.log();
45
- console.log(chalk.bold(title));
46
- console.log(chalk.dim("─────────────────────────────────"));
49
+ console.log()
50
+ console.log(chalk.bold(title))
51
+ console.log(chalk.dim('─────────────────────────────────'))
47
52
  for (const check of report.checks) {
48
- const icon = check.status === "pass" ? chalk.green("PASS") : check.status === "warn" ? chalk.yellow("WARN") : chalk.red("FAIL");
49
- console.log(`${icon} ${check.label}: ${check.message}`);
50
- if (check.fix) console.log(chalk.dim(` Fix: ${check.fix}`));
51
- if (check.docs) console.log(chalk.dim(` Docs: ${check.docs}`));
53
+ const icon =
54
+ check.status === 'pass'
55
+ ? chalk.green('PASS')
56
+ : check.status === 'warn'
57
+ ? chalk.yellow('WARN')
58
+ : chalk.red('FAIL')
59
+ console.log(`${icon} ${check.label}: ${check.message}`)
60
+ if (check.fix) console.log(chalk.dim(` Fix: ${check.fix}`))
61
+ if (check.docs) console.log(chalk.dim(` Docs: ${check.docs}`))
52
62
  }
53
- console.log(chalk.dim("─────────────────────────────────"));
54
- console.log(`Status: ${report.status.toUpperCase()}`);
55
- console.log();
63
+ console.log(chalk.dim('─────────────────────────────────'))
64
+ console.log(`Status: ${report.status.toUpperCase()}`)
65
+ console.log()
56
66
  }
57
67
 
58
- async function buildReport(schemaPath: string, mode: "doctor" | "deploy" = "doctor") {
59
- const resolvedSchema = resolve(process.cwd(), schemaPath);
60
- const [schemaModels, schemaContent, packageManager] = await Promise.all([
68
+ async function buildReport(
69
+ schemaPath: string,
70
+ configPath: string,
71
+ mode: 'doctor' | 'deploy' = 'doctor',
72
+ ) {
73
+ const resolvedSchema = resolve(process.cwd(), schemaPath)
74
+ const resolvedConfig = resolve(process.cwd(), configPath)
75
+ const [schemaModels, schemaContent, configContent, packageManager] = await Promise.all([
61
76
  readSchemaModels(resolvedSchema),
62
77
  readSchemaContent(resolvedSchema),
78
+ readOptionalFile(resolvedConfig),
63
79
  detectProjectPackageManager(),
64
- ]);
80
+ ])
65
81
 
66
82
  return createDiagnosticReport({
67
83
  schemaModels,
68
84
  schemaContent,
85
+ configContent,
69
86
  env: process.env,
70
87
  packageManager,
71
88
  schemaPath,
72
89
  mode,
73
- });
90
+ })
74
91
  }
75
92
 
76
93
  export function registerDoctorCommand(program: Command): void {
77
94
  program
78
- .command("doctor")
79
- .description("Run AI-friendly preflight checks for an Actuate CMS project")
80
- .option("--schema <path>", "Path to schema.prisma", "prisma/schema.prisma")
81
- .option("--json", "Print machine-readable JSON")
82
- .action(async (opts: { schema: string; json?: boolean }) => {
83
- const report = await buildReport(opts.schema, "doctor");
95
+ .command('doctor')
96
+ .description('Run AI-friendly preflight checks for an Actuate CMS project')
97
+ .option('--schema <path>', 'Path to schema.prisma', 'prisma/schema.prisma')
98
+ .option('--config <path>', 'Path to actuate.config.ts', 'actuate.config.ts')
99
+ .option('--json', 'Print machine-readable JSON')
100
+ .action(async (opts: { schema: string; config: string; json?: boolean }) => {
101
+ const report = await buildReport(opts.schema, opts.config, 'doctor')
84
102
  if (opts.json) {
85
- console.log(JSON.stringify(report, null, 2));
103
+ console.log(JSON.stringify(report, null, 2))
86
104
  } else {
87
- printReport("Actuate Doctor", report);
105
+ printReport('Actuate Doctor', report)
88
106
  }
89
- if (report.status === "fail") process.exitCode = 1;
90
- });
107
+ if (report.status === 'fail') process.exitCode = 1
108
+ })
91
109
  }
92
110
 
93
111
  export function registerDeployCheckCommand(program: Command): void {
94
112
  program
95
- .command("deploy:check")
96
- .description("Check production deployment readiness for Actuate CMS")
97
- .option("--schema <path>", "Path to schema.prisma", "prisma/schema.prisma")
98
- .option("--json", "Print machine-readable JSON")
99
- .action(async (opts: { schema: string; json?: boolean }) => {
100
- const report = await buildReport(opts.schema, "deploy");
113
+ .command('deploy:check')
114
+ .description('Check production deployment readiness for Actuate CMS')
115
+ .option('--schema <path>', 'Path to schema.prisma', 'prisma/schema.prisma')
116
+ .option('--config <path>', 'Path to actuate.config.ts', 'actuate.config.ts')
117
+ .option('--json', 'Print machine-readable JSON')
118
+ .action(async (opts: { schema: string; config: string; json?: boolean }) => {
119
+ const report = await buildReport(opts.schema, opts.config, 'deploy')
101
120
  if (opts.json) {
102
- console.log(JSON.stringify({ ...report, manifest: buildDeploymentManifest() }, null, 2));
121
+ console.log(JSON.stringify({ ...report, manifest: buildDeploymentManifest() }, null, 2))
103
122
  } else {
104
- printReport("Actuate Deploy Check", report);
105
- console.log(chalk.dim("Run `actuate verify --full` after deployment succeeds."));
123
+ printReport('Actuate Deploy Check', report)
124
+ console.log(chalk.dim('Run `actuate verify --full` after deployment succeeds.'))
106
125
  }
107
- if (report.status === "fail") process.exitCode = 1;
108
- });
126
+ if (report.status === 'fail') process.exitCode = 1
127
+ })
109
128
  }
110
129
 
111
130
  export function registerVerifyCommand(program: Command): void {
112
131
  program
113
- .command("verify")
114
- .description("Verify an installed or deployed Actuate CMS project")
115
- .option("--full", "Run the full verification checklist")
116
- .option("--url <origin>", "Deployed site origin to verify, for example https://example.com")
117
- .option("--json", "Print the deployment manifest as JSON")
132
+ .command('verify')
133
+ .description('Verify an installed or deployed Actuate CMS project')
134
+ .option('--full', 'Run the full verification checklist')
135
+ .option('--url <origin>', 'Deployed site origin to verify, for example https://example.com')
136
+ .option('--json', 'Print the deployment manifest as JSON')
118
137
  .action(async (opts: { full?: boolean; url?: string; json?: boolean }) => {
119
- const manifest = buildDeploymentManifest();
138
+ const manifest = buildDeploymentManifest()
120
139
  if (opts.json) {
121
- console.log(JSON.stringify(manifest, null, 2));
122
- return;
140
+ console.log(JSON.stringify(manifest, null, 2))
141
+ return
123
142
  }
124
143
 
125
- console.log();
126
- console.log(chalk.bold(opts.full ? "Actuate Full Verification" : "Actuate Verification"));
127
- console.log(chalk.dim("─────────────────────────────────"));
128
- console.log(`PASS Manifest generated for ${manifest.packageScope} packages.`);
144
+ console.log()
145
+ console.log(chalk.bold(opts.full ? 'Actuate Full Verification' : 'Actuate Verification'))
146
+ console.log(chalk.dim('─────────────────────────────────'))
147
+ console.log(`PASS Manifest generated for ${manifest.packageScope} packages.`)
129
148
  if (!opts.url) {
130
- console.log("WARN No --url provided, so remote health/admin endpoints were not checked.");
131
- console.log(chalk.dim("Run `actuate verify --full --url https://your-site.com` after deployment."));
132
- console.log();
133
- return;
149
+ console.log('WARN No --url provided, so remote health/admin endpoints were not checked.')
150
+ console.log(
151
+ chalk.dim('Run `actuate verify --full --url https://your-site.com` after deployment.'),
152
+ )
153
+ console.log()
154
+ return
134
155
  }
135
156
 
136
- const origin = opts.url.replace(/\/$/, "");
137
- const healthUrl = `${origin}${manifest.routes.apiHealth}`;
138
- const adminUrl = `${origin}${manifest.routes.adminDefault}`;
139
- let failed = false;
157
+ const origin = opts.url.replace(/\/$/, '')
158
+ const healthUrl = `${origin}${manifest.routes.apiHealth}`
159
+ const adminUrl = `${origin}${manifest.routes.adminDefault}`
160
+ let failed = false
140
161
 
141
- for (const [label, url] of [['Health', healthUrl], ['Admin', adminUrl]] as const) {
162
+ for (const [label, url] of [
163
+ ['Health', healthUrl],
164
+ ['Admin', adminUrl],
165
+ ] as const) {
142
166
  try {
143
- const response = await fetch(url, { method: 'GET' });
167
+ const response = await fetch(url, { method: 'GET' })
144
168
  if (response.ok || response.status === 302 || response.status === 401) {
145
- console.log(`PASS ${label} route responded at ${url}.`);
169
+ console.log(`PASS ${label} route responded at ${url}.`)
146
170
  } else {
147
- failed = true;
148
- console.log(`FAIL ${label} route returned HTTP ${response.status} at ${url}.`);
171
+ failed = true
172
+ console.log(`FAIL ${label} route returned HTTP ${response.status} at ${url}.`)
149
173
  }
150
174
  } catch (error) {
151
- failed = true;
152
- const message = error instanceof Error ? error.message : String(error);
153
- console.log(`FAIL ${label} route could not be reached at ${url}: ${message}`);
175
+ failed = true
176
+ const message = error instanceof Error ? error.message : String(error)
177
+ console.log(`FAIL ${label} route could not be reached at ${url}: ${message}`)
154
178
  }
155
179
  }
156
- console.log();
157
- if (failed) process.exitCode = 1;
158
- });
180
+ console.log()
181
+ if (failed) process.exitCode = 1
182
+ })
159
183
  }