@memberjunction/cli 6.1.4 → 6.2.0-edge.1
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/README.md +18 -7
- package/dist/baseline/cli-helpers.d.ts +4 -0
- package/dist/baseline/cli-helpers.d.ts.map +1 -1
- package/dist/baseline/cli-helpers.js +18 -10
- package/dist/baseline/cli-helpers.js.map +1 -1
- package/dist/baseline/comparator.d.ts +5 -3
- package/dist/baseline/comparator.d.ts.map +1 -1
- package/dist/baseline/comparator.js +142 -138
- package/dist/baseline/comparator.js.map +1 -1
- package/dist/baseline/connection.d.ts +8 -6
- package/dist/baseline/connection.d.ts.map +1 -1
- package/dist/baseline/connection.js +16 -12
- package/dist/baseline/connection.js.map +1 -1
- package/dist/baseline/data-dumper.d.ts +7 -3
- package/dist/baseline/data-dumper.d.ts.map +1 -1
- package/dist/baseline/data-dumper.js +33 -25
- package/dist/baseline/data-dumper.js.map +1 -1
- package/dist/baseline/emitter.d.ts +5 -3
- package/dist/baseline/emitter.d.ts.map +1 -1
- package/dist/baseline/emitter.js +114 -110
- package/dist/baseline/emitter.js.map +1 -1
- package/dist/baseline/index.d.ts +7 -7
- package/dist/baseline/index.d.ts.map +1 -1
- package/dist/baseline/index.js +7 -7
- package/dist/baseline/index.js.map +1 -1
- package/dist/baseline/introspector-mssql.d.ts +2 -0
- package/dist/baseline/introspector-mssql.d.ts.map +1 -1
- package/dist/baseline/introspector-mssql.js +68 -64
- package/dist/baseline/introspector-mssql.js.map +1 -1
- package/dist/baseline/introspector-postgres.d.ts +2 -0
- package/dist/baseline/introspector-postgres.d.ts.map +1 -1
- package/dist/baseline/introspector-postgres.js +34 -30
- package/dist/baseline/introspector-postgres.js.map +1 -1
- package/dist/baseline/report.d.ts +4 -0
- package/dist/baseline/report.d.ts.map +1 -1
- package/dist/baseline/report.js +25 -17
- package/dist/baseline/report.js.map +1 -1
- package/dist/baseline/types.d.ts +71 -71
- package/dist/baseline/util.d.ts +54 -6
- package/dist/baseline/util.d.ts.map +1 -1
- package/dist/baseline/util.js +112 -36
- package/dist/baseline/util.js.map +1 -1
- package/dist/commands/agent/init.d.ts +23 -0
- package/dist/commands/agent/init.d.ts.map +1 -0
- package/dist/commands/agent/init.js +222 -0
- package/dist/commands/agent/init.js.map +1 -0
- package/dist/commands/ai/actions/list.js +7 -7
- package/dist/commands/ai/actions/run.js +7 -7
- package/dist/commands/ai/agents/list.js +7 -7
- package/dist/commands/ai/agents/run.js +9 -9
- package/dist/commands/ai/audit/agent-run.js +7 -7
- package/dist/commands/ai/prompts/run.js +7 -7
- package/dist/commands/app/check-updates.js +5 -5
- package/dist/commands/app/disable.js +2 -2
- package/dist/commands/app/enable.js +2 -2
- package/dist/commands/app/info.js +2 -2
- package/dist/commands/app/install.js +2 -2
- package/dist/commands/app/list.js +2 -2
- package/dist/commands/app/remove.js +4 -4
- package/dist/commands/app/upgrade.js +2 -2
- package/dist/commands/artifacts/reclassify.js +2 -2
- package/dist/commands/baseline/build.js +31 -31
- package/dist/commands/baseline/build.js.map +1 -1
- package/dist/commands/baseline/compare.js +36 -36
- package/dist/commands/baseline/roundtrip.js +56 -54
- package/dist/commands/baseline/roundtrip.js.map +1 -1
- package/dist/commands/bundle/index.js +4 -4
- package/dist/commands/clean/index.js +3 -3
- package/dist/commands/codegen/manifest.d.ts +2 -0
- package/dist/commands/codegen/manifest.d.ts.map +1 -1
- package/dist/commands/codegen/manifest.js +8 -4
- package/dist/commands/codegen/manifest.js.map +1 -1
- package/dist/commands/dev/workspace/index.d.ts +2 -0
- package/dist/commands/dev/workspace/index.d.ts.map +1 -1
- package/dist/commands/dev/workspace/index.js +8 -4
- package/dist/commands/dev/workspace/index.js.map +1 -1
- package/dist/commands/doctor/index.d.ts +6 -4
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +43 -18
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/install/claude.d.ts +2 -0
- package/dist/commands/install/claude.d.ts.map +1 -1
- package/dist/commands/install/claude.js +11 -7
- package/dist/commands/install/claude.js.map +1 -1
- package/dist/commands/install/index.js +3 -3
- package/dist/commands/migrate/convert.d.ts +21 -0
- package/dist/commands/migrate/convert.d.ts.map +1 -1
- package/dist/commands/migrate/convert.js +22 -6
- package/dist/commands/migrate/convert.js.map +1 -1
- package/dist/commands/migrate/create.js +2 -2
- package/dist/commands/migrate/index.js +16 -16
- package/dist/commands/sync/file-reset.js +2 -2
- package/dist/commands/sync/init.js +3 -3
- package/dist/commands/test/compare.js +6 -6
- package/dist/commands/test/history.js +6 -6
- package/dist/commands/test/list.js +6 -6
- package/dist/commands/test/regression/build.js +5 -5
- package/dist/commands/test/regression/compare.js +3 -3
- package/dist/commands/test/regression/down.js +4 -4
- package/dist/commands/test/regression/export.js +4 -4
- package/dist/commands/test/regression/gen-forms.js +3 -3
- package/dist/commands/test/regression/remote.js +10 -10
- package/dist/commands/test/regression/up.js +6 -6
- package/dist/commands/test/run.js +6 -6
- package/dist/commands/test/scripts.d.ts +13 -0
- package/dist/commands/test/scripts.d.ts.map +1 -0
- package/dist/commands/test/scripts.js +50 -0
- package/dist/commands/test/scripts.js.map +1 -0
- package/dist/commands/test/suite.js +6 -6
- package/dist/commands/test/validate.js +6 -6
- package/dist/commands/translate-sql/index.js +25 -25
- package/dist/commands/update/claude.js +7 -7
- package/dist/commands/usage.js +4 -4
- package/dist/config.d.ts +175 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -9
- package/dist/config.js.map +1 -1
- package/dist/hooks/postrun.js +2 -2
- package/dist/hooks/prerun.js +2 -2
- package/dist/hooks/prerun.js.map +1 -1
- package/dist/init-templates/citizen-builder/.agents/skills/new-agent/SKILL.md +66 -0
- package/dist/init-templates/citizen-builder/.agents/skills/package-agent/SKILL.md +69 -0
- package/dist/init-templates/citizen-builder/.agents/skills/test-agent/SKILL.md +61 -0
- package/dist/init-templates/citizen-builder/.claude/skills/new-agent/SKILL.md +66 -0
- package/dist/init-templates/citizen-builder/.claude/skills/package-agent/SKILL.md +69 -0
- package/dist/init-templates/citizen-builder/.claude/skills/test-agent/SKILL.md +61 -0
- package/dist/init-templates/citizen-builder/.env.example +30 -0
- package/dist/init-templates/citizen-builder/AGENTS.md +331 -0
- package/dist/init-templates/citizen-builder/README.md +259 -0
- package/dist/init-templates/citizen-builder/docker/Dockerfile +16 -0
- package/dist/init-templates/citizen-builder/docker-compose.yml +59 -0
- package/dist/init-templates/citizen-builder/docs/ENTERPRISE_ORG_SETUP.md +73 -0
- package/dist/init-templates/citizen-builder/docs/PROMOTION_GUIDE.md +70 -0
- package/dist/init-templates/citizen-builder/metadata/.mj-sync.json +7 -0
- package/dist/init-templates/citizen-builder/metadata/agents/.customer-insight-agent.json +55 -0
- package/dist/init-templates/citizen-builder/metadata/agents/.mj-sync.json +45 -0
- package/dist/init-templates/citizen-builder/metadata/prompts/.customer-insight-prompt.json +15 -0
- package/dist/init-templates/citizen-builder/metadata/prompts/.mj-sync.json +45 -0
- package/dist/init-templates/citizen-builder/metadata/prompts/templates/customer-insight.template.md +18 -0
- package/dist/init-templates/citizen-builder/scripts/bootstrap.sh +47 -0
- package/dist/init-templates/citizen-builder/scripts/docker-entrypoint.sh +184 -0
- package/dist/init-templates/citizen-builder/scripts/generate-capabilities.sh +74 -0
- package/dist/init-templates/citizen-builder/scripts/query-run-history.sh +34 -0
- package/dist/init-templates/citizen-builder/scripts/sync-metadata.sh +14 -0
- package/dist/init-templates/remote-mj/README.md +4 -4
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts +6 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts.map +1 -1
- package/dist/lib/claude-pack/ManagedBlockEditor.js +18 -6
- package/dist/lib/claude-pack/ManagedBlockEditor.js.map +1 -1
- package/dist/lib/claude-pack/PackFetcher.d.ts +8 -3
- package/dist/lib/claude-pack/PackFetcher.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackFetcher.js +26 -18
- package/dist/lib/claude-pack/PackFetcher.js.map +1 -1
- package/dist/lib/claude-pack/PackInstaller.d.ts +6 -2
- package/dist/lib/claude-pack/PackInstaller.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackInstaller.js +19 -13
- package/dist/lib/claude-pack/PackInstaller.js.map +1 -1
- package/dist/lib/claude-pack/PackMerger.d.ts +8 -0
- package/dist/lib/claude-pack/PackMerger.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackMerger.js +63 -57
- package/dist/lib/claude-pack/PackMerger.js.map +1 -1
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts +4 -0
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackOutputFormatter.js +10 -2
- package/dist/lib/claude-pack/PackOutputFormatter.js.map +1 -1
- package/dist/lib/claude-pack/PackPaths.d.ts +12 -0
- package/dist/lib/claude-pack/PackPaths.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackPaths.js +31 -7
- package/dist/lib/claude-pack/PackPaths.js.map +1 -1
- package/dist/lib/claude-pack/PackTypes.d.ts +18 -14
- package/dist/lib/claude-pack/PackTypes.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackTypes.js +11 -3
- package/dist/lib/claude-pack/PackTypes.js.map +1 -1
- package/dist/lib/claude-pack/SettingsMerger.d.ts +10 -0
- package/dist/lib/claude-pack/SettingsMerger.d.ts.map +1 -1
- package/dist/lib/claude-pack/SettingsMerger.js +36 -16
- package/dist/lib/claude-pack/SettingsMerger.js.map +1 -1
- package/dist/lib/cli-plugins.d.ts +2 -0
- package/dist/lib/cli-plugins.d.ts.map +1 -1
- package/dist/lib/cli-plugins.js +8 -4
- package/dist/lib/cli-plugins.js.map +1 -1
- package/dist/lib/db-preflight.d.ts +2 -0
- package/dist/lib/db-preflight.d.ts.map +1 -1
- package/dist/lib/db-preflight.js +12 -8
- package/dist/lib/db-preflight.js.map +1 -1
- package/dist/lib/db-version.d.ts +2 -0
- package/dist/lib/db-version.d.ts.map +1 -1
- package/dist/lib/db-version.js +5 -1
- package/dist/lib/db-version.js.map +1 -1
- package/dist/lib/derived-usage.d.ts +14 -8
- package/dist/lib/derived-usage.d.ts.map +1 -1
- package/dist/lib/derived-usage.js +30 -18
- package/dist/lib/derived-usage.js.map +1 -1
- package/dist/lib/domain-profiles.d.ts +4 -2
- package/dist/lib/domain-profiles.d.ts.map +1 -1
- package/dist/lib/domain-profiles.js +53 -49
- package/dist/lib/domain-profiles.js.map +1 -1
- package/dist/lib/domain-usage-command.js +4 -4
- package/dist/lib/dynamic-packages.d.ts +4 -2
- package/dist/lib/dynamic-packages.d.ts.map +1 -1
- package/dist/lib/dynamic-packages.js +9 -5
- package/dist/lib/dynamic-packages.js.map +1 -1
- package/dist/lib/format-compat.d.ts +9 -7
- package/dist/lib/format-compat.d.ts.map +1 -1
- package/dist/lib/format-compat.js +12 -8
- package/dist/lib/format-compat.js.map +1 -1
- package/dist/lib/interactive-guard.d.ts +16 -0
- package/dist/lib/interactive-guard.d.ts.map +1 -1
- package/dist/lib/interactive-guard.js +18 -6
- package/dist/lib/interactive-guard.js.map +1 -1
- package/dist/lib/migration-fetch.d.ts +16 -4
- package/dist/lib/migration-fetch.d.ts.map +1 -1
- package/dist/lib/migration-fetch.js +30 -18
- package/dist/lib/migration-fetch.js.map +1 -1
- package/dist/lib/regression/docker-helpers.d.ts +24 -0
- package/dist/lib/regression/docker-helpers.d.ts.map +1 -1
- package/dist/lib/regression/docker-helpers.js +46 -10
- package/dist/lib/regression/docker-helpers.js.map +1 -1
- package/dist/lib/usage-render.d.ts +6 -0
- package/dist/lib/usage-render.d.ts.map +1 -1
- package/dist/lib/usage-render.js +15 -3
- package/dist/lib/usage-render.js.map +1 -1
- package/dist/translate-sql/groundTruth.d.ts +3 -3
- package/dist/translate-sql/groundTruth.js +40 -40
- package/dist/translate-sql/reportGenerator.d.ts +7 -7
- package/dist/translate-sql/reportGenerator.js +18 -18
- package/dist/translate-sql/ruleTranslator.d.ts +3 -3
- package/dist/translate-sql/ruleTranslator.js +8 -8
- package/dist/translate-sql/ruleTranslator.js.map +1 -1
- package/dist/utils/open-app-context.d.ts +21 -0
- package/dist/utils/open-app-context.d.ts.map +1 -1
- package/dist/utils/open-app-context.js +26 -10
- package/dist/utils/open-app-context.js.map +1 -1
- package/oclif.manifest.json +1216 -1058
- package/package.json +22 -22
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
2
|
import ora from 'ora-classic';
|
|
3
|
-
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG,
|
|
3
|
+
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG, ResolveLegacyFormat } from '../../../lib/format-compat.js';
|
|
4
4
|
export default class ActionsRun extends Command {
|
|
5
5
|
static { this.description = 'Execute an AI action with parameters'; }
|
|
6
6
|
static { this.examples = [
|
|
@@ -44,12 +44,12 @@ export default class ActionsRun extends Command {
|
|
|
44
44
|
const { ActionService, OutputFormatter } = await import('@memberjunction/ai-cli');
|
|
45
45
|
const { flags, metadata } = await this.parse(ActionsRun);
|
|
46
46
|
const service = new ActionService();
|
|
47
|
-
const formatter = new OutputFormatter(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
const formatter = new OutputFormatter(ResolveLegacyFormat({
|
|
48
|
+
Format: flags.format,
|
|
49
|
+
Legacy: flags.output,
|
|
50
|
+
LegacyDefault: 'compact',
|
|
51
|
+
LegacyWasExplicit: metadata.flags.output?.setFromDefault === false,
|
|
52
|
+
Map: AI_FORMAT_MAP,
|
|
53
53
|
}));
|
|
54
54
|
// Parse parameters
|
|
55
55
|
const params = {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
2
|
import ora from 'ora-classic';
|
|
3
|
-
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG,
|
|
3
|
+
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG, ResolveLegacyFormat } from '../../../lib/format-compat.js';
|
|
4
4
|
export default class AgentsList extends Command {
|
|
5
5
|
static { this.description = 'List available AI agents'; }
|
|
6
6
|
static { this.examples = [
|
|
@@ -27,12 +27,12 @@ export default class AgentsList extends Command {
|
|
|
27
27
|
const service = new AgentService();
|
|
28
28
|
const agents = await service.listAgents();
|
|
29
29
|
spinner.stop();
|
|
30
|
-
const formatter = new OutputFormatter(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
const formatter = new OutputFormatter(ResolveLegacyFormat({
|
|
31
|
+
Format: flags.format,
|
|
32
|
+
Legacy: flags.output,
|
|
33
|
+
LegacyDefault: 'compact',
|
|
34
|
+
LegacyWasExplicit: metadata.flags.output?.setFromDefault === false,
|
|
35
|
+
Map: AI_FORMAT_MAP,
|
|
36
36
|
}));
|
|
37
37
|
this.log(formatter.formatAgentList(agents));
|
|
38
38
|
// Force exit after completion
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
2
|
import ora from 'ora-classic';
|
|
3
|
-
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG,
|
|
4
|
-
import {
|
|
3
|
+
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG, ResolveLegacyFormat } from '../../../lib/format-compat.js';
|
|
4
|
+
import { FailOnNonInteractive, requireInteractive } from '../../../lib/interactive-guard.js';
|
|
5
5
|
export default class AgentsRun extends Command {
|
|
6
6
|
static { this.description = 'Execute an AI agent with a prompt or start interactive chat'; }
|
|
7
7
|
static { this.examples = [
|
|
@@ -57,17 +57,17 @@ export default class AgentsRun extends Command {
|
|
|
57
57
|
requireInteractive('Interactive chat mode', 'Use --prompt "<your prompt>" for a single non-interactive execution, or re-run --chat at an interactive terminal.');
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
|
-
|
|
60
|
+
FailOnNonInteractive(this, error);
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
const { AgentService, OutputFormatter, ConversationService } = await import('@memberjunction/ai-cli');
|
|
64
64
|
const service = new AgentService();
|
|
65
|
-
const formatter = new OutputFormatter(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
const formatter = new OutputFormatter(ResolveLegacyFormat({
|
|
66
|
+
Format: flags.format,
|
|
67
|
+
Legacy: flags.output,
|
|
68
|
+
LegacyDefault: 'compact',
|
|
69
|
+
LegacyWasExplicit: metadata.flags.output?.setFromDefault === false,
|
|
70
|
+
Map: AI_FORMAT_MAP,
|
|
71
71
|
}));
|
|
72
72
|
try {
|
|
73
73
|
if (flags.chat) {
|
|
@@ -2,7 +2,7 @@ import { Command, Flags, Args } from '@oclif/core';
|
|
|
2
2
|
import ora from 'ora-classic';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import * as fs from 'fs/promises';
|
|
5
|
-
import { CANONICAL_FORMAT_FLAG,
|
|
5
|
+
import { CANONICAL_FORMAT_FLAG, ResolveLegacyFormat } from '../../../lib/format-compat.js';
|
|
6
6
|
export default class AgentRun extends Command {
|
|
7
7
|
static { this.description = 'Audit and analyze AI agent execution runs for debugging and performance analysis'; }
|
|
8
8
|
static { this.examples = [
|
|
@@ -111,12 +111,12 @@ export default class AgentRun extends Command {
|
|
|
111
111
|
const spinner = ora();
|
|
112
112
|
// One typed resolution for all four render sites below — replaces the `as any`
|
|
113
113
|
// casts and applies the same --format/pipe rules as the rest of the CLI.
|
|
114
|
-
const outputFormat =
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
114
|
+
const outputFormat = ResolveLegacyFormat({
|
|
115
|
+
Format: flags.format,
|
|
116
|
+
Legacy: flags.output,
|
|
117
|
+
LegacyDefault: 'compact',
|
|
118
|
+
LegacyWasExplicit: metadata.flags.output?.setFromDefault === false,
|
|
119
|
+
Map: { text: 'compact', json: 'json', md: 'markdown' },
|
|
120
120
|
});
|
|
121
121
|
try {
|
|
122
122
|
const service = new AgentAuditService();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
2
|
import ora from 'ora-classic';
|
|
3
|
-
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG,
|
|
3
|
+
import { AI_FORMAT_MAP, CANONICAL_FORMAT_FLAG, ResolveLegacyFormat } from '../../../lib/format-compat.js';
|
|
4
4
|
export default class PromptsRun extends Command {
|
|
5
5
|
static { this.description = 'Execute a direct prompt with an AI model'; }
|
|
6
6
|
static { this.examples = [
|
|
@@ -55,12 +55,12 @@ export default class PromptsRun extends Command {
|
|
|
55
55
|
const { PromptService, OutputFormatter } = await import('@memberjunction/ai-cli');
|
|
56
56
|
const { flags, metadata } = await this.parse(PromptsRun);
|
|
57
57
|
const service = new PromptService();
|
|
58
|
-
const formatter = new OutputFormatter(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
const formatter = new OutputFormatter(ResolveLegacyFormat({
|
|
59
|
+
Format: flags.format,
|
|
60
|
+
Legacy: flags.output,
|
|
61
|
+
LegacyDefault: 'compact',
|
|
62
|
+
LegacyWasExplicit: metadata.flags.output?.setFromDefault === false,
|
|
63
|
+
Map: AI_FORMAT_MAP,
|
|
64
64
|
}));
|
|
65
65
|
try {
|
|
66
66
|
const spinner = ora();
|
|
@@ -2,9 +2,9 @@ import { Command } from '@oclif/core';
|
|
|
2
2
|
import { ListInstalledApps, GetLatestVersion } from '@memberjunction/open-app-engine';
|
|
3
3
|
import ora from 'ora-classic';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import {
|
|
5
|
+
import { BuildContextUser, BuildGitHubOptions } from '../../utils/open-app-context.js';
|
|
6
6
|
import { CheckAppsForUpdates, FormatUpdateCheckReport } from '../../utils/update-check.js';
|
|
7
|
-
import {
|
|
7
|
+
import { GetValidatedConfig } from '../../config.js';
|
|
8
8
|
/**
|
|
9
9
|
* CLI command: `mj app check-updates`.
|
|
10
10
|
*
|
|
@@ -19,8 +19,8 @@ export default class AppCheckUpdates extends Command {
|
|
|
19
19
|
async run() {
|
|
20
20
|
const spinner = ora('Checking for updates...').start();
|
|
21
21
|
try {
|
|
22
|
-
const config =
|
|
23
|
-
const contextUser = await
|
|
22
|
+
const config = GetValidatedConfig();
|
|
23
|
+
const contextUser = await BuildContextUser();
|
|
24
24
|
const apps = await ListInstalledApps(contextUser);
|
|
25
25
|
if (apps.length === 0) {
|
|
26
26
|
spinner.info('No Open Apps installed.');
|
|
@@ -29,7 +29,7 @@ export default class AppCheckUpdates extends Command {
|
|
|
29
29
|
// Same options `mj app install` / `upgrade` use, so a repo reachable there is reachable here.
|
|
30
30
|
// A bare `{ Token }` dropped the per-repo TokenMap, and every private repo whose token lives
|
|
31
31
|
// there reported "up to date" forever.
|
|
32
|
-
const githubOptions =
|
|
32
|
+
const githubOptions = BuildGitHubOptions(config);
|
|
33
33
|
const report = await CheckAppsForUpdates(apps, (repoUrl, subpath) => GetLatestVersion(repoUrl, githubOptions, subpath));
|
|
34
34
|
spinner.stop();
|
|
35
35
|
// WHICH lines get printed is decided by FormatUpdateCheckReport — in particular the rule
|
|
@@ -2,7 +2,7 @@ import { Args, Command } from '@oclif/core';
|
|
|
2
2
|
import { DisableApp } from '@memberjunction/open-app-engine';
|
|
3
3
|
import ora from 'ora-classic';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import {
|
|
5
|
+
import { BuildOrchestratorContext } from '../../utils/open-app-context.js';
|
|
6
6
|
/**
|
|
7
7
|
* CLI command: `mj app disable <name>`.
|
|
8
8
|
*
|
|
@@ -24,7 +24,7 @@ export default class AppDisable extends Command {
|
|
|
24
24
|
const { args } = await this.parse(AppDisable);
|
|
25
25
|
const spinner = ora(`Disabling ${args.name}...`).start();
|
|
26
26
|
try {
|
|
27
|
-
const context = await
|
|
27
|
+
const context = await BuildOrchestratorContext(this);
|
|
28
28
|
const result = await DisableApp(args.name, context);
|
|
29
29
|
if (result.Success) {
|
|
30
30
|
spinner.succeed(chalk.green(`Disabled ${args.name}`));
|
|
@@ -2,7 +2,7 @@ import { Args, Command } from '@oclif/core';
|
|
|
2
2
|
import { EnableApp } from '@memberjunction/open-app-engine';
|
|
3
3
|
import ora from 'ora-classic';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import {
|
|
5
|
+
import { BuildOrchestratorContext } from '../../utils/open-app-context.js';
|
|
6
6
|
/**
|
|
7
7
|
* CLI command: `mj app enable <name>`.
|
|
8
8
|
*
|
|
@@ -24,7 +24,7 @@ export default class AppEnable extends Command {
|
|
|
24
24
|
const { args } = await this.parse(AppEnable);
|
|
25
25
|
const spinner = ora(`Enabling ${args.name}...`).start();
|
|
26
26
|
try {
|
|
27
|
-
const context = await
|
|
27
|
+
const context = await BuildOrchestratorContext(this);
|
|
28
28
|
const result = await EnableApp(args.name, context);
|
|
29
29
|
if (result.Success) {
|
|
30
30
|
spinner.succeed(chalk.green(`Enabled ${args.name}`));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Args, Command } from '@oclif/core';
|
|
2
2
|
import { FindInstalledApp } from '@memberjunction/open-app-engine';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
|
-
import {
|
|
4
|
+
import { BuildContextUser } from '../../utils/open-app-context.js';
|
|
5
5
|
/**
|
|
6
6
|
* CLI command: `mj app info <name>`.
|
|
7
7
|
*
|
|
@@ -22,7 +22,7 @@ export default class AppInfo extends Command {
|
|
|
22
22
|
async run() {
|
|
23
23
|
const { args } = await this.parse(AppInfo);
|
|
24
24
|
try {
|
|
25
|
-
const contextUser = await
|
|
25
|
+
const contextUser = await BuildContextUser();
|
|
26
26
|
const app = await FindInstalledApp(contextUser, args.name);
|
|
27
27
|
if (!app) {
|
|
28
28
|
this.error(`App '${args.name}' is not installed.`);
|
|
@@ -2,7 +2,7 @@ import { Args, Command, Flags } from '@oclif/core';
|
|
|
2
2
|
import { InstallApp } from '@memberjunction/open-app-engine';
|
|
3
3
|
import ora from 'ora-classic';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import {
|
|
5
|
+
import { BuildOrchestratorContext } from '../../utils/open-app-context.js';
|
|
6
6
|
/**
|
|
7
7
|
* CLI command: `mj app install <source>`.
|
|
8
8
|
*
|
|
@@ -41,7 +41,7 @@ export default class AppInstall extends Command {
|
|
|
41
41
|
const { args, flags } = await this.parse(AppInstall);
|
|
42
42
|
const spinner = ora();
|
|
43
43
|
try {
|
|
44
|
-
const context = await
|
|
44
|
+
const context = await BuildOrchestratorContext(this, flags.verbose, !flags['non-interactive']);
|
|
45
45
|
const result = await InstallApp({
|
|
46
46
|
Source: args.source,
|
|
47
47
|
Version: flags.version,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
2
|
import { ListInstalledApps } from '@memberjunction/open-app-engine';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
|
-
import {
|
|
4
|
+
import { BuildContextUser } from '../../utils/open-app-context.js';
|
|
5
5
|
/**
|
|
6
6
|
* CLI command: `mj app list`.
|
|
7
7
|
*
|
|
@@ -19,7 +19,7 @@ export default class AppList extends Command {
|
|
|
19
19
|
async run() {
|
|
20
20
|
const { flags } = await this.parse(AppList);
|
|
21
21
|
try {
|
|
22
|
-
const contextUser = await
|
|
22
|
+
const contextUser = await BuildContextUser();
|
|
23
23
|
const apps = await ListInstalledApps(contextUser);
|
|
24
24
|
if (apps.length === 0) {
|
|
25
25
|
this.log('No Open Apps installed.');
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Args, Command, Flags } from '@oclif/core';
|
|
2
2
|
import { RemoveApp } from '@memberjunction/open-app-engine';
|
|
3
3
|
import { confirm } from '@inquirer/prompts';
|
|
4
|
-
import { resolveOrPrompt,
|
|
4
|
+
import { resolveOrPrompt, WithNonInteractiveHandling } from '../../lib/interactive-guard.js';
|
|
5
5
|
import ora from 'ora-classic';
|
|
6
6
|
import chalk from 'chalk';
|
|
7
|
-
import {
|
|
7
|
+
import { BuildOrchestratorContext } from '../../utils/open-app-context.js';
|
|
8
8
|
/**
|
|
9
9
|
* CLI command: `mj app remove <name>`.
|
|
10
10
|
*
|
|
@@ -40,7 +40,7 @@ export default class AppRemove extends Command {
|
|
|
40
40
|
if (!flags.yes) {
|
|
41
41
|
// Destructive: this drops a schema. A headless run must say --yes explicitly
|
|
42
42
|
// rather than have consent inferred for it.
|
|
43
|
-
const confirmed = await
|
|
43
|
+
const confirmed = await WithNonInteractiveHandling(this, () => resolveOrPrompt({
|
|
44
44
|
flagValue: undefined,
|
|
45
45
|
what: `Confirmation to remove '${args.name}'`,
|
|
46
46
|
suggestion: 'Pass --yes to confirm removal.',
|
|
@@ -55,7 +55,7 @@ export default class AppRemove extends Command {
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
try {
|
|
58
|
-
const context = await
|
|
58
|
+
const context = await BuildOrchestratorContext(this, flags.verbose);
|
|
59
59
|
const result = await RemoveApp({
|
|
60
60
|
AppName: args.name,
|
|
61
61
|
KeepData: flags['keep-data'],
|
|
@@ -2,7 +2,7 @@ import { Args, Command, Flags } from '@oclif/core';
|
|
|
2
2
|
import { UpgradeApp } from '@memberjunction/open-app-engine';
|
|
3
3
|
import ora from 'ora-classic';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import {
|
|
5
|
+
import { BuildOrchestratorContext } from '../../utils/open-app-context.js';
|
|
6
6
|
/**
|
|
7
7
|
* CLI command: `mj app upgrade <name>`.
|
|
8
8
|
*
|
|
@@ -37,7 +37,7 @@ export default class AppUpgrade extends Command {
|
|
|
37
37
|
const { args, flags } = await this.parse(AppUpgrade);
|
|
38
38
|
const spinner = ora();
|
|
39
39
|
try {
|
|
40
|
-
const context = await
|
|
40
|
+
const context = await BuildOrchestratorContext(this, flags.verbose, !flags['non-interactive']);
|
|
41
41
|
const result = await UpgradeApp({
|
|
42
42
|
AppName: args.name,
|
|
43
43
|
Version: flags.version,
|
|
@@ -6,7 +6,7 @@ import { ResolveStartupMode, RunView, LogStatus, SetProductionStatus } from '@me
|
|
|
6
6
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
7
7
|
import { setupSQLServerClient, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
|
|
8
8
|
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
9
|
-
import {
|
|
9
|
+
import { GetValidatedConfig } from '../../config.js';
|
|
10
10
|
const JSON_FALLBACK_ID = 'AE674C7E-EA0D-49EA-89E4-0649F5EB20D4';
|
|
11
11
|
export default class ArtifactsReclassify extends Command {
|
|
12
12
|
static { this.description = 'Upgrade-recovery utility for v5.35 artifact unification. Re-evaluates rows whose TypeID is the deleted JSON fallback but whose actual content does not parse as JSON. ' +
|
|
@@ -28,7 +28,7 @@ export default class ArtifactsReclassify extends Command {
|
|
|
28
28
|
const { flags } = await this.parse(ArtifactsReclassify);
|
|
29
29
|
SetProductionStatus(false);
|
|
30
30
|
const spinner = ora('Connecting to database...').start();
|
|
31
|
-
const config =
|
|
31
|
+
const config = GetValidatedConfig();
|
|
32
32
|
const pool = new sql.ConnectionPool({
|
|
33
33
|
server: config.dbHost,
|
|
34
34
|
port: config.dbPort,
|
|
@@ -3,12 +3,12 @@ import * as fs from 'node:fs';
|
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import ora from 'ora-classic';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
6
|
+
import { ResolveConnection, IsTty } from '../../baseline/cli-helpers.js';
|
|
7
|
+
import { OpenConnection } from '../../baseline/connection.js';
|
|
8
|
+
import { IntrospectMssql } from '../../baseline/introspector-mssql.js';
|
|
9
|
+
import { DumpTables } from '../../baseline/data-dumper.js';
|
|
10
|
+
import { EmitBaselineTsql } from '../../baseline/emitter.js';
|
|
11
|
+
import { BaselineFilename, ComputeAutoBaselineStamp, DiscoverMigrationsSourceDir, FindLatestVersionedMigration, } from '../../baseline/util.js';
|
|
12
12
|
export default class BaselineBuild extends Command {
|
|
13
13
|
static { this.description = 'Generate a deterministic baseline SQL script from the END-STATE of a migrated MSSQL database.'; }
|
|
14
14
|
static { this.examples = [
|
|
@@ -62,7 +62,7 @@ export default class BaselineBuild extends Command {
|
|
|
62
62
|
async run() {
|
|
63
63
|
const { flags } = await this.parse(BaselineBuild);
|
|
64
64
|
const { baselineVersion, generatedAtUtc, autoSource } = this.resolveVersionAndStamp(flags);
|
|
65
|
-
const connectionParams =
|
|
65
|
+
const connectionParams = ResolveConnection({ database: flags.database }, 'mssql');
|
|
66
66
|
const excludedDataTables = new Set(flags['exclude-data']
|
|
67
67
|
.split(',')
|
|
68
68
|
.map((s) => s.trim().toLowerCase())
|
|
@@ -70,7 +70,7 @@ export default class BaselineBuild extends Command {
|
|
|
70
70
|
.map((s) => (s.includes('.') ? s : `dbo.${s}`)));
|
|
71
71
|
excludedDataTables.add('flyway_schema_history');
|
|
72
72
|
excludedDataTables.add('dbo.flyway_schema_history');
|
|
73
|
-
const useSpinner =
|
|
73
|
+
const useSpinner = IsTty();
|
|
74
74
|
const spinner = useSpinner ? ora() : null;
|
|
75
75
|
const phase = (text) => {
|
|
76
76
|
if (spinner) {
|
|
@@ -89,38 +89,38 @@ export default class BaselineBuild extends Command {
|
|
|
89
89
|
this.log(chalk.dim(` Auto-detected baseline: v${baselineVersion}.x (from ${autoSource.filename})`));
|
|
90
90
|
this.log(chalk.dim(` Auto timestamp : ${autoSource.timestamp} + 1m`));
|
|
91
91
|
}
|
|
92
|
-
phase(`Connecting to ${connectionParams.
|
|
93
|
-
const db = await
|
|
92
|
+
phase(`Connecting to ${connectionParams.Database}@${connectionParams.Host}`);
|
|
93
|
+
const db = await OpenConnection(connectionParams);
|
|
94
94
|
try {
|
|
95
|
-
succeed(`Connected to ${connectionParams.
|
|
95
|
+
succeed(`Connected to ${connectionParams.Database}`);
|
|
96
96
|
phase(`Introspecting schema`);
|
|
97
|
-
const snapshot = await
|
|
97
|
+
const snapshot = await IntrospectMssql(db, {
|
|
98
98
|
onPhase: (p) => { if (flags.verbose)
|
|
99
99
|
this.log(` - ${p}`); },
|
|
100
100
|
});
|
|
101
|
-
succeed(`Introspected ${snapshot.
|
|
102
|
-
`${snapshot.
|
|
103
|
-
`${snapshot.
|
|
104
|
-
`${snapshot.
|
|
101
|
+
succeed(`Introspected ${snapshot.Tables.length} tables, ` +
|
|
102
|
+
`${snapshot.Views.length} views, ` +
|
|
103
|
+
`${snapshot.Procedures.length} procs, ` +
|
|
104
|
+
`${snapshot.Functions.length} functions`);
|
|
105
105
|
const dumps = flags['no-data'] ? [] : await (async () => {
|
|
106
106
|
phase(`Dumping table data (every row, every column)`);
|
|
107
|
-
const result = await
|
|
108
|
-
|
|
107
|
+
const result = await DumpTables(db, snapshot.Tables, { ExcludedTables: excludedDataTables }, {
|
|
108
|
+
OnTable: (table, count) => {
|
|
109
109
|
if (flags.verbose)
|
|
110
|
-
this.log(` ${table.
|
|
110
|
+
this.log(` ${table.Schema}.${table.Name}: ${count} rows`);
|
|
111
111
|
else if (spinner)
|
|
112
|
-
spinner.text = `Dumping ${table.
|
|
112
|
+
spinner.text = `Dumping ${table.Schema}.${table.Name} (${count} rows)`;
|
|
113
113
|
},
|
|
114
114
|
});
|
|
115
|
-
const totalRows = result.reduce((sum, d) => sum + d.
|
|
115
|
+
const totalRows = result.reduce((sum, d) => sum + d.RowCount, 0);
|
|
116
116
|
succeed(`Dumped ${totalRows.toLocaleString()} rows across ${result.length} tables`);
|
|
117
117
|
return result;
|
|
118
118
|
})();
|
|
119
119
|
phase('Emitting baseline SQL');
|
|
120
|
-
const sql =
|
|
121
|
-
snapshot,
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
const sql = EmitBaselineTsql({
|
|
121
|
+
Snapshot: snapshot,
|
|
122
|
+
DataDumps: dumps,
|
|
123
|
+
Options: {
|
|
124
124
|
baselineVersion,
|
|
125
125
|
description: flags.description,
|
|
126
126
|
generatedAtUtc,
|
|
@@ -134,7 +134,7 @@ export default class BaselineBuild extends Command {
|
|
|
134
134
|
process.stdout.write(sql);
|
|
135
135
|
return;
|
|
136
136
|
}
|
|
137
|
-
const filename =
|
|
137
|
+
const filename = BaselineFilename({ generatedAtUtc, baselineVersion });
|
|
138
138
|
fs.mkdirSync(flags.out, { recursive: true });
|
|
139
139
|
const fullPath = path.resolve(flags.out, filename);
|
|
140
140
|
fs.writeFileSync(fullPath, sql, 'utf8');
|
|
@@ -168,20 +168,20 @@ export default class BaselineBuild extends Command {
|
|
|
168
168
|
}
|
|
169
169
|
return { baselineVersion: explicit, generatedAtUtc: new Date(), autoSource: null };
|
|
170
170
|
}
|
|
171
|
-
const sourceDir = flags['source-dir'] ??
|
|
171
|
+
const sourceDir = flags['source-dir'] ?? DiscoverMigrationsSourceDir(process.cwd());
|
|
172
172
|
if (!sourceDir) {
|
|
173
173
|
this.error('No --baseline-version provided and could not auto-discover a migrations directory. ' +
|
|
174
174
|
'Pass --source-dir or --baseline-version.');
|
|
175
175
|
}
|
|
176
|
-
const latest =
|
|
176
|
+
const latest = FindLatestVersionedMigration(sourceDir);
|
|
177
177
|
if (!latest) {
|
|
178
178
|
this.error(`No V-files found in ${sourceDir}. Pass --baseline-version explicitly or point --source-dir at a folder with V<ts>__v<Major>.<Minor>...sql migrations.`);
|
|
179
179
|
}
|
|
180
|
-
const { generatedAtUtc } =
|
|
180
|
+
const { generatedAtUtc } = ComputeAutoBaselineStamp(latest.Timestamp);
|
|
181
181
|
return {
|
|
182
|
-
baselineVersion: latest.
|
|
182
|
+
baselineVersion: latest.MajorMinor,
|
|
183
183
|
generatedAtUtc,
|
|
184
|
-
autoSource: { filename: latest.
|
|
184
|
+
autoSource: { filename: latest.Filename, timestamp: latest.Timestamp },
|
|
185
185
|
};
|
|
186
186
|
}
|
|
187
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/baseline/build.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/baseline/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,13 @@ import * as fs from 'node:fs';
|
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import ora from 'ora-classic';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
6
|
+
import { ResolveConnection, IsTty } from '../../baseline/cli-helpers.js';
|
|
7
|
+
import { OpenConnection } from '../../baseline/connection.js';
|
|
8
|
+
import { IntrospectMssql } from '../../baseline/introspector-mssql.js';
|
|
9
|
+
import { IntrospectPostgres } from '../../baseline/introspector-postgres.js';
|
|
10
|
+
import { DumpTables } from '../../baseline/data-dumper.js';
|
|
11
|
+
import { CompareSnapshots } from '../../baseline/comparator.js';
|
|
12
|
+
import { RenderJson, RenderMarkdown } from '../../baseline/report.js';
|
|
13
13
|
export default class BaselineCompare extends Command {
|
|
14
14
|
static { this.description = 'Deterministically compare two databases object-by-object and row-by-row.'; }
|
|
15
15
|
static { this.examples = [
|
|
@@ -50,7 +50,7 @@ export default class BaselineCompare extends Command {
|
|
|
50
50
|
async run() {
|
|
51
51
|
const { flags } = await this.parse(BaselineCompare);
|
|
52
52
|
const dialect = flags.dialect;
|
|
53
|
-
const useSpinner =
|
|
53
|
+
const useSpinner = IsTty();
|
|
54
54
|
const spinner = useSpinner ? ora() : null;
|
|
55
55
|
const phase = (text) => {
|
|
56
56
|
if (spinner) {
|
|
@@ -63,23 +63,23 @@ export default class BaselineCompare extends Command {
|
|
|
63
63
|
};
|
|
64
64
|
const succeed = (text) => spinner ? spinner.succeed(text) : this.log(`✓ ${text}`);
|
|
65
65
|
const fail = (text) => spinner ? spinner.fail(text) : this.logToStderr(`✗ ${text}`);
|
|
66
|
-
const leftParams =
|
|
67
|
-
const rightParams =
|
|
68
|
-
phase(`Connecting (${leftParams.
|
|
69
|
-
const left = await
|
|
70
|
-
const right = await
|
|
66
|
+
const leftParams = ResolveConnection({ database: flags.left }, dialect);
|
|
67
|
+
const rightParams = ResolveConnection({ database: flags.right }, dialect);
|
|
68
|
+
phase(`Connecting (${leftParams.Database} & ${rightParams.Database})`);
|
|
69
|
+
const left = await OpenConnection(leftParams);
|
|
70
|
+
const right = await OpenConnection(rightParams);
|
|
71
71
|
succeed(`Connected to both databases`);
|
|
72
72
|
try {
|
|
73
|
-
phase(`Introspecting ${leftParams.
|
|
73
|
+
phase(`Introspecting ${leftParams.Database}`);
|
|
74
74
|
const leftSnapshot = dialect === 'mssql'
|
|
75
|
-
? await
|
|
76
|
-
: await
|
|
77
|
-
succeed(`${leftParams.
|
|
78
|
-
phase(`Introspecting ${rightParams.
|
|
75
|
+
? await IntrospectMssql(left)
|
|
76
|
+
: await IntrospectPostgres(left);
|
|
77
|
+
succeed(`${leftParams.Database}: ${leftSnapshot.Tables.length} tables, ${leftSnapshot.Views.length} views`);
|
|
78
|
+
phase(`Introspecting ${rightParams.Database}`);
|
|
79
79
|
const rightSnapshot = dialect === 'mssql'
|
|
80
|
-
? await
|
|
81
|
-
: await
|
|
82
|
-
succeed(`${rightParams.
|
|
80
|
+
? await IntrospectMssql(right)
|
|
81
|
+
: await IntrospectPostgres(right);
|
|
82
|
+
succeed(`${rightParams.Database}: ${rightSnapshot.Tables.length} tables, ${rightSnapshot.Views.length} views`);
|
|
83
83
|
const rowMode = flags['row-compare'];
|
|
84
84
|
let leftDumps = [];
|
|
85
85
|
let rightDumps = [];
|
|
@@ -88,21 +88,21 @@ export default class BaselineCompare extends Command {
|
|
|
88
88
|
this.warn('row data dump streaming optimised for MSSQL; PG path uses cursor fallback.');
|
|
89
89
|
}
|
|
90
90
|
phase(`Dumping rows (left)`);
|
|
91
|
-
leftDumps = await
|
|
92
|
-
succeed(`Dumped ${leftDumps.reduce((s, d) => s + d.
|
|
91
|
+
leftDumps = await DumpTables(left, leftSnapshot.Tables, { ExcludedTables: new Set() });
|
|
92
|
+
succeed(`Dumped ${leftDumps.reduce((s, d) => s + d.RowCount, 0).toLocaleString()} rows from ${leftParams.Database}`);
|
|
93
93
|
phase(`Dumping rows (right)`);
|
|
94
|
-
rightDumps = await
|
|
95
|
-
succeed(`Dumped ${rightDumps.reduce((s, d) => s + d.
|
|
94
|
+
rightDumps = await DumpTables(right, rightSnapshot.Tables, { ExcludedTables: new Set() });
|
|
95
|
+
succeed(`Dumped ${rightDumps.reduce((s, d) => s + d.RowCount, 0).toLocaleString()} rows from ${rightParams.Database}`);
|
|
96
96
|
}
|
|
97
97
|
phase('Comparing');
|
|
98
|
-
const report =
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
98
|
+
const report = CompareSnapshots({
|
|
99
|
+
Left: { snapshot: leftSnapshot, data: leftDumps, label: leftParams.Database },
|
|
100
|
+
Right: { snapshot: rightSnapshot, data: rightDumps, label: rightParams.Database },
|
|
101
|
+
Options: {
|
|
102
|
+
RowCompareMode: rowMode,
|
|
103
|
+
RowHashAlgo: flags['row-hash-algo'],
|
|
104
|
+
IgnorePattern: flags.ignore ? new RegExp(flags.ignore, 'i') : undefined,
|
|
105
|
+
RowDiffSampleLimit: flags['sample-limit'],
|
|
106
106
|
},
|
|
107
107
|
});
|
|
108
108
|
report.isClean ? succeed('Comparison complete: CLEAN') : fail(`Comparison complete: ${report.summary.objectsWithDiffs} object diff(s), ${report.summary.totalRowDiffs} row diff(s)`);
|
|
@@ -111,14 +111,14 @@ export default class BaselineCompare extends Command {
|
|
|
111
111
|
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
112
112
|
const jsonPath = path.resolve(flags.out, `baseline-compare-${stamp}.json`);
|
|
113
113
|
const mdPath = path.resolve(flags.out, `baseline-compare-${stamp}.md`);
|
|
114
|
-
fs.writeFileSync(jsonPath,
|
|
115
|
-
fs.writeFileSync(mdPath,
|
|
114
|
+
fs.writeFileSync(jsonPath, RenderJson(report), 'utf8');
|
|
115
|
+
fs.writeFileSync(mdPath, RenderMarkdown(report), 'utf8');
|
|
116
116
|
this.log('');
|
|
117
117
|
this.log(chalk.dim(` Reports: ${jsonPath}`));
|
|
118
118
|
this.log(chalk.dim(` ${mdPath}`));
|
|
119
119
|
}
|
|
120
120
|
else {
|
|
121
|
-
process.stdout.write(
|
|
121
|
+
process.stdout.write(RenderMarkdown(report));
|
|
122
122
|
}
|
|
123
123
|
if (flags['fail-on-diff'] && !report.isClean) {
|
|
124
124
|
this.exit(2);
|