@memberjunction/cli 5.37.0 → 5.39.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.
- package/README.md +74 -0
- package/dist/baseline/cli-helpers.d.ts +12 -0
- package/dist/baseline/cli-helpers.d.ts.map +1 -0
- package/dist/baseline/cli-helpers.js +40 -0
- package/dist/baseline/cli-helpers.js.map +1 -0
- package/dist/baseline/comparator.d.ts +26 -0
- package/dist/baseline/comparator.d.ts.map +1 -0
- package/dist/baseline/comparator.js +527 -0
- package/dist/baseline/comparator.js.map +1 -0
- package/dist/baseline/connection.d.ts +39 -0
- package/dist/baseline/connection.d.ts.map +1 -0
- package/dist/baseline/connection.js +104 -0
- package/dist/baseline/connection.js.map +1 -0
- package/dist/baseline/data-dumper.d.ts +23 -0
- package/dist/baseline/data-dumper.d.ts.map +1 -0
- package/dist/baseline/data-dumper.js +94 -0
- package/dist/baseline/data-dumper.js.map +1 -0
- package/dist/baseline/emitter.d.ts +36 -0
- package/dist/baseline/emitter.d.ts.map +1 -0
- package/dist/baseline/emitter.js +519 -0
- package/dist/baseline/emitter.js.map +1 -0
- package/dist/baseline/index.d.ts +18 -0
- package/dist/baseline/index.d.ts.map +1 -0
- package/dist/baseline/index.js +14 -0
- package/dist/baseline/index.js.map +1 -0
- package/dist/baseline/introspector-mssql.d.ts +15 -0
- package/dist/baseline/introspector-mssql.d.ts.map +1 -0
- package/dist/baseline/introspector-mssql.js +673 -0
- package/dist/baseline/introspector-mssql.js.map +1 -0
- package/dist/baseline/introspector-postgres.d.ts +14 -0
- package/dist/baseline/introspector-postgres.d.ts.map +1 -0
- package/dist/baseline/introspector-postgres.js +277 -0
- package/dist/baseline/introspector-postgres.js.map +1 -0
- package/dist/baseline/report.d.ts +7 -0
- package/dist/baseline/report.d.ts.map +1 -0
- package/dist/baseline/report.js +105 -0
- package/dist/baseline/report.js.map +1 -0
- package/dist/baseline/types.d.ts +286 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +10 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/baseline/util.d.ts +112 -0
- package/dist/baseline/util.d.ts.map +1 -0
- package/dist/baseline/util.js +325 -0
- package/dist/baseline/util.js.map +1 -0
- package/dist/commands/baseline/build.d.ts +29 -0
- package/dist/commands/baseline/build.d.ts.map +1 -0
- package/dist/commands/baseline/build.js +188 -0
- package/dist/commands/baseline/build.js.map +1 -0
- package/dist/commands/baseline/compare.d.ts +19 -0
- package/dist/commands/baseline/compare.d.ts.map +1 -0
- package/dist/commands/baseline/compare.js +133 -0
- package/dist/commands/baseline/compare.js.map +1 -0
- package/dist/commands/baseline/roundtrip.d.ts +23 -0
- package/dist/commands/baseline/roundtrip.d.ts.map +1 -0
- package/dist/commands/baseline/roundtrip.js +245 -0
- package/dist/commands/baseline/roundtrip.js.map +1 -0
- package/dist/commands/bundle/index.d.ts +21 -0
- package/dist/commands/bundle/index.d.ts.map +1 -0
- package/dist/commands/bundle/index.js +62 -0
- package/dist/commands/bundle/index.js.map +1 -0
- package/dist/commands/migrate/index.d.ts +29 -0
- package/dist/commands/migrate/index.d.ts.map +1 -1
- package/dist/commands/migrate/index.js +111 -5
- package/dist/commands/migrate/index.js.map +1 -1
- package/dist/commands/test/compare.d.ts +3 -0
- package/dist/commands/test/compare.d.ts.map +1 -1
- package/dist/commands/test/compare.js +23 -3
- package/dist/commands/test/compare.js.map +1 -1
- package/dist/commands/test/regression/build.d.ts +14 -0
- package/dist/commands/test/regression/build.d.ts.map +1 -0
- package/dist/commands/test/regression/build.js +48 -0
- package/dist/commands/test/regression/build.js.map +1 -0
- package/dist/commands/test/regression/compare.d.ts +15 -0
- package/dist/commands/test/regression/compare.d.ts.map +1 -0
- package/dist/commands/test/regression/compare.js +66 -0
- package/dist/commands/test/regression/compare.js.map +1 -0
- package/dist/commands/test/regression/down.d.ts +10 -0
- package/dist/commands/test/regression/down.d.ts.map +1 -0
- package/dist/commands/test/regression/down.js +29 -0
- package/dist/commands/test/regression/down.js.map +1 -0
- package/dist/commands/test/regression/export.d.ts +11 -0
- package/dist/commands/test/regression/export.d.ts.map +1 -0
- package/dist/commands/test/regression/export.js +56 -0
- package/dist/commands/test/regression/export.js.map +1 -0
- package/dist/commands/test/regression/gen-forms.d.ts +7 -0
- package/dist/commands/test/regression/gen-forms.d.ts.map +1 -0
- package/dist/commands/test/regression/gen-forms.js +18 -0
- package/dist/commands/test/regression/gen-forms.js.map +1 -0
- package/dist/commands/test/regression/index.d.ts +7 -0
- package/dist/commands/test/regression/index.d.ts.map +1 -0
- package/dist/commands/test/regression/index.js +33 -0
- package/dist/commands/test/regression/index.js.map +1 -0
- package/dist/commands/test/regression/init.d.ts +21 -0
- package/dist/commands/test/regression/init.d.ts.map +1 -0
- package/dist/commands/test/regression/init.js +111 -0
- package/dist/commands/test/regression/init.js.map +1 -0
- package/dist/commands/test/regression/remote.d.ts +23 -0
- package/dist/commands/test/regression/remote.d.ts.map +1 -0
- package/dist/commands/test/regression/remote.js +140 -0
- package/dist/commands/test/regression/remote.js.map +1 -0
- package/dist/commands/test/regression/up.d.ts +21 -0
- package/dist/commands/test/regression/up.d.ts.map +1 -0
- package/dist/commands/test/regression/up.js +111 -0
- package/dist/commands/test/regression/up.js.map +1 -0
- package/dist/commands/test/run.d.ts +1 -0
- package/dist/commands/test/run.d.ts.map +1 -1
- package/dist/commands/test/run.js +6 -0
- package/dist/commands/test/run.js.map +1 -1
- package/dist/commands/test/suite.d.ts +5 -0
- package/dist/commands/test/suite.d.ts.map +1 -1
- package/dist/commands/test/suite.js +27 -0
- package/dist/commands/test/suite.js.map +1 -1
- package/dist/commands/translate-sql/index.d.ts.map +1 -1
- package/dist/commands/translate-sql/index.js +3 -2
- package/dist/commands/translate-sql/index.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/init-templates/bring-your-own-app/README.md +74 -0
- package/dist/init-templates/bring-your-own-app/byo-metadata/.mj-sync.json +10 -0
- package/dist/init-templates/bring-your-own-app/byo-metadata/test-suites/.byo-suite.json +51 -0
- package/dist/init-templates/bring-your-own-app/byo-metadata/test-suites/.mj-sync.json +12 -0
- package/dist/init-templates/bring-your-own-app/byo-metadata/tests/.T01-counter-increment.json +63 -0
- package/dist/init-templates/bring-your-own-app/byo-metadata/tests/.T02-contact-form-submit.json +63 -0
- package/dist/init-templates/bring-your-own-app/byo-metadata/tests/.mj-sync.json +12 -0
- package/dist/init-templates/bring-your-own-app/docker-compose.app.yml +76 -0
- package/dist/init-templates/bring-your-own-app/target.json +23 -0
- package/dist/init-templates/generic-web/README.md +115 -0
- package/dist/init-templates/generic-web/metadata/.mj-sync.json +10 -0
- package/dist/init-templates/generic-web/metadata/test-suites/.generic-web-suite.json +48 -0
- package/dist/init-templates/generic-web/metadata/test-suites/.mj-sync.json +12 -0
- package/dist/init-templates/generic-web/metadata/tests/.GW01-home-loads.json +74 -0
- package/dist/init-templates/generic-web/metadata/tests/.GW02-search-array-map.json +82 -0
- package/dist/init-templates/generic-web/metadata/tests/.mj-sync.json +12 -0
- package/dist/init-templates/generic-web/oracles/mdn-oracles.cjs +121 -0
- package/dist/init-templates/generic-web/target.json +25 -0
- package/dist/init-templates/github-actions/README.md +26 -0
- package/dist/init-templates/github-actions/regression.yml +52 -0
- package/dist/init-templates/remote-mj/README.md +95 -0
- package/dist/init-templates/remote-mj/target.json +22 -0
- package/dist/init-templates/static-file-server/Dockerfile +23 -0
- package/dist/init-templates/static-file-server/README.md +88 -0
- package/dist/init-templates/static-file-server/docker-compose.app.yml +44 -0
- package/dist/init-templates/static-file-server/metadata/.mj-sync.json +10 -0
- package/dist/init-templates/static-file-server/metadata/test-suites/.mj-sync.json +12 -0
- package/dist/init-templates/static-file-server/metadata/test-suites/.static-server-suite.json +27 -0
- package/dist/init-templates/static-file-server/metadata/tests/.SS01-home-loads.json +45 -0
- package/dist/init-templates/static-file-server/metadata/tests/.SS02-navigate-about.json +45 -0
- package/dist/init-templates/static-file-server/metadata/tests/.mj-sync.json +12 -0
- package/dist/init-templates/static-file-server/public/about.html +12 -0
- package/dist/init-templates/static-file-server/public/index.html +27 -0
- package/dist/init-templates/static-file-server/target.json +16 -0
- package/dist/lib/db-preflight.d.ts +42 -0
- package/dist/lib/db-preflight.d.ts.map +1 -0
- package/dist/lib/db-preflight.js +113 -0
- package/dist/lib/db-preflight.js.map +1 -0
- package/dist/lib/db-version.d.ts +36 -0
- package/dist/lib/db-version.d.ts.map +1 -0
- package/dist/lib/db-version.js +45 -0
- package/dist/lib/db-version.js.map +1 -0
- package/dist/lib/migration-fetch.d.ts +49 -0
- package/dist/lib/migration-fetch.d.ts.map +1 -0
- package/dist/lib/migration-fetch.js +152 -0
- package/dist/lib/migration-fetch.js.map +1 -0
- package/dist/lib/regression/docker-helpers.d.ts +98 -0
- package/dist/lib/regression/docker-helpers.d.ts.map +1 -0
- package/dist/lib/regression/docker-helpers.js +184 -0
- package/dist/lib/regression/docker-helpers.js.map +1 -0
- package/dist/light-commands.d.ts.map +1 -1
- package/dist/light-commands.js +2 -0
- package/dist/light-commands.js.map +1 -1
- package/oclif.manifest.json +1635 -702
- package/package.json +22 -17
- package/regression-compose/docker-compose.bacpac-standalone.yml +109 -0
- package/regression-compose/docker-compose.standalone.yml +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/test/regression/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,MAAM,CAAC,WAAW,SAC4D;IAE9E,MAAM,CAAC,QAAQ,WASb;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB3B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class TestRegression extends Command {
|
|
3
|
+
static { this.description = 'MJ Explorer regression test suite — Docker-based LLM-driven browser tests'; }
|
|
4
|
+
static { this.examples = [
|
|
5
|
+
'<%= config.bin %> <%= command.id %> build # Build images (incl. gen-forms on first run)',
|
|
6
|
+
'<%= config.bin %> <%= command.id %> up # Run the full self-contained MJ stack (Mode A)',
|
|
7
|
+
'<%= config.bin %> <%= command.id %> down # Tear down + wipe DB volumes',
|
|
8
|
+
'<%= config.bin %> <%= command.id %> gen-forms # Regenerate Angular entity forms',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> compare # Diff the two most recent runs',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> export # Export a run as a portable standalone HTML',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> remote --target=staging-mj # Mode B/C/D against a remote URL',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> init generic-web # Scaffold one of the example dirs',
|
|
13
|
+
]; }
|
|
14
|
+
async run() {
|
|
15
|
+
this.log('MJ Explorer Regression Test Suite\n');
|
|
16
|
+
this.log('Available subcommands:');
|
|
17
|
+
this.log(' mj test regression build Build Docker images for the regression stack');
|
|
18
|
+
this.log(' mj test regression up Run the self-contained MJ stack (Mode A)');
|
|
19
|
+
this.log(' mj test regression down Stop the stack and wipe DB volumes');
|
|
20
|
+
this.log(' mj test regression gen-forms One-shot: regenerate Angular entity forms');
|
|
21
|
+
this.log(' mj test regression compare Compare the two most recent run-*/results.json');
|
|
22
|
+
this.log(' mj test regression export Export a run as a portable standalone HTML report');
|
|
23
|
+
this.log(' mj test regression remote --target=X Run against a remote URL (Mode B/C/D)');
|
|
24
|
+
this.log(' mj test regression init <name> Scaffold a starter example into the cwd');
|
|
25
|
+
this.log('');
|
|
26
|
+
this.log('Most subcommands shell out to docker compose using the regression stack at');
|
|
27
|
+
this.log('docker/regression/. `init` works both inside the monorepo (copies locally) and');
|
|
28
|
+
this.log('outside (shells out to the published memberjunction/agentic-test-runner image).');
|
|
29
|
+
this.log('');
|
|
30
|
+
this.log('Run "mj test regression COMMAND --help" for details on each subcommand.');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/test/regression/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;aAC1C,gBAAW,GAChB,2EAA2E,CAAC;aAEvE,aAAQ,GAAG;QAChB,8FAA8F;QAC9F,gGAAgG;QAChG,8EAA8E;QAC9E,kFAAkF;QAClF,gFAAgF;QAChF,6FAA6F;QAC7F,mGAAmG;QACnG,oGAAoG;KACrG,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;QACjG,IAAI,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;QAC7F,IAAI,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;QAC9F,IAAI,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;QACnG,IAAI,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAC;QACtG,IAAI,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;QAC1F,IAAI,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC3F,IAAI,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;IACtF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class TestRegressionInit extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
list: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
private listTemplates;
|
|
13
|
+
/**
|
|
14
|
+
* Pluck the first non-heading line from a README.md to use as a one-line
|
|
15
|
+
* description in the inventory. Returns undefined when the README is
|
|
16
|
+
* missing or only contains headings.
|
|
17
|
+
*/
|
|
18
|
+
private firstNonHeadingLine;
|
|
19
|
+
private scaffold;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/commands/test/regression/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAcnD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,OAAO;IACrD,MAAM,CAAC,WAAW,SAG+E;IAEjG,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;MAKV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAe1B,OAAO,CAAC,aAAa;IAqBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,QAAQ;CA+BjB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
2
|
+
import { existsSync, readdirSync, readFileSync, statSync, mkdirSync, cpSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
// Templates live at the package root (not under src/commands/, which oclif
|
|
6
|
+
// recursively scans as commands).
|
|
7
|
+
// dev: packages/MJCLI/src/init-templates/<name>/
|
|
8
|
+
// dist: packages/MJCLI/dist/init-templates/<name>/ (copy-regression-assets.mjs)
|
|
9
|
+
// From this command file at <pkg>/{src,dist}/commands/test/regression/init.{ts,js},
|
|
10
|
+
// the package's {src,dist}/ root is three directories up.
|
|
11
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const TEMPLATES_DIR = path.join(__dirname, '..', '..', '..', 'init-templates');
|
|
13
|
+
export default class TestRegressionInit extends Command {
|
|
14
|
+
static { this.description = 'Scaffold one of the bundled regression-suite mode templates into the current directory. ' +
|
|
15
|
+
'Adapt the generated files (target profile + optional compose overlay + tests) to point at ' +
|
|
16
|
+
'your app, then run `mj test regression remote --target=...` to execute the suite against it.'; }
|
|
17
|
+
static { this.examples = [
|
|
18
|
+
'<%= config.bin %> <%= command.id %> generic-web',
|
|
19
|
+
'<%= config.bin %> <%= command.id %> static-file-server',
|
|
20
|
+
'<%= config.bin %> <%= command.id %> remote-mj',
|
|
21
|
+
'<%= config.bin %> <%= command.id %> bring-your-own-app',
|
|
22
|
+
'<%= config.bin %> <%= command.id %> --list',
|
|
23
|
+
]; }
|
|
24
|
+
static { this.args = {
|
|
25
|
+
name: Args.string({
|
|
26
|
+
description: 'Template name to scaffold (run with --list to see available).',
|
|
27
|
+
required: false,
|
|
28
|
+
}),
|
|
29
|
+
}; }
|
|
30
|
+
static { this.flags = {
|
|
31
|
+
list: Flags.boolean({
|
|
32
|
+
description: 'List available templates and exit.',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
}; }
|
|
36
|
+
async run() {
|
|
37
|
+
const { args, flags } = await this.parse(TestRegressionInit);
|
|
38
|
+
if (flags.list) {
|
|
39
|
+
this.listTemplates();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!args.name) {
|
|
43
|
+
this.error('✗ Missing template name. Run with --list to see available templates.');
|
|
44
|
+
}
|
|
45
|
+
this.scaffold(args.name);
|
|
46
|
+
}
|
|
47
|
+
listTemplates() {
|
|
48
|
+
if (!existsSync(TEMPLATES_DIR)) {
|
|
49
|
+
this.error(`✗ Templates directory missing at ${TEMPLATES_DIR}. ` +
|
|
50
|
+
`Reinstall @memberjunction/cli — published bundles include init-templates/.`);
|
|
51
|
+
}
|
|
52
|
+
const entries = readdirSync(TEMPLATES_DIR, { withFileTypes: true })
|
|
53
|
+
.filter((d) => d.isDirectory())
|
|
54
|
+
.map((d) => d.name)
|
|
55
|
+
.sort();
|
|
56
|
+
this.log(`Available templates (${entries.length}):`);
|
|
57
|
+
for (const name of entries) {
|
|
58
|
+
const readme = path.join(TEMPLATES_DIR, name, 'README.md');
|
|
59
|
+
const oneLiner = this.firstNonHeadingLine(readme);
|
|
60
|
+
this.log(` ${name.padEnd(24)} ${oneLiner ?? ''}`);
|
|
61
|
+
}
|
|
62
|
+
this.log('');
|
|
63
|
+
this.log(`Scaffold one with: mj test regression init <name>`);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Pluck the first non-heading line from a README.md to use as a one-line
|
|
67
|
+
* description in the inventory. Returns undefined when the README is
|
|
68
|
+
* missing or only contains headings.
|
|
69
|
+
*/
|
|
70
|
+
firstNonHeadingLine(readmePath) {
|
|
71
|
+
if (!existsSync(readmePath))
|
|
72
|
+
return undefined;
|
|
73
|
+
try {
|
|
74
|
+
const content = readFileSync(readmePath, 'utf8');
|
|
75
|
+
for (const raw of content.split('\n')) {
|
|
76
|
+
const line = raw.trim();
|
|
77
|
+
if (!line || line.startsWith('#') || line.startsWith('```'))
|
|
78
|
+
continue;
|
|
79
|
+
return line.replace(/[*_`]/g, '').slice(0, 80);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// ignore
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
scaffold(name) {
|
|
88
|
+
const src = path.join(TEMPLATES_DIR, name);
|
|
89
|
+
if (!existsSync(src) || !statSync(src).isDirectory()) {
|
|
90
|
+
this.error(`✗ Template '${name}' not found at ${src}. Run with --list to see available templates.`);
|
|
91
|
+
}
|
|
92
|
+
const dest = path.resolve(name);
|
|
93
|
+
if (existsSync(dest)) {
|
|
94
|
+
this.error(`✗ Destination already exists: ${dest}\n Remove or rename it first.`);
|
|
95
|
+
}
|
|
96
|
+
mkdirSync(path.dirname(dest), { recursive: true });
|
|
97
|
+
cpSync(src, dest, { recursive: true });
|
|
98
|
+
this.log(`✓ Scaffolded ./${name}/ from bundled '${name}' template`);
|
|
99
|
+
this.log('');
|
|
100
|
+
this.log('Next steps:');
|
|
101
|
+
this.log(` 1. Edit ${name}/target.json — point baseUrl + auth at your app.`);
|
|
102
|
+
const hasMeta = existsSync(path.join(src, 'byo-metadata')) || existsSync(path.join(src, 'metadata'));
|
|
103
|
+
if (hasMeta) {
|
|
104
|
+
this.log(` 2. Adjust the tests + suite under ${name}/ to match your app's workflows.`);
|
|
105
|
+
}
|
|
106
|
+
const hasOverlay = existsSync(path.join(src, 'docker-compose.app.yml'));
|
|
107
|
+
this.log(` 3. Run: mj test regression remote --target=./${name}/target.json` +
|
|
108
|
+
(hasOverlay ? ` --overlay=./${name}/docker-compose.app.yml` : ''));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/commands/test/regression/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class TestRegressionRemote extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
target: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
'no-local-stack': import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
8
|
+
overlay: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[], import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
+
image: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
'env-file': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
11
|
+
detach: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
/** Inside the monorepo: load the target host-side, drive the compose stack. */
|
|
15
|
+
private runInMonorepo;
|
|
16
|
+
/**
|
|
17
|
+
* Outside the monorepo: run the published image. Mode B/C → `docker run`
|
|
18
|
+
* (the image loads --target itself). Mode D (--overlay) → `docker compose`
|
|
19
|
+
* with the bundled standalone compose + the user's app overlay.
|
|
20
|
+
*/
|
|
21
|
+
private runExternal;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../../../src/commands/test/regression/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAgB7C,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,OAAO;IACvD,MAAM,CAAC,WAAW,SAGkC;IAEpD,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;MA8BV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAS1B,+EAA+E;YACjE,aAAa;IAoC3B;;;;OAIG;YACW,WAAW;CAgD1B"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { AGENTIC_TEST_RUNNER_IMAGE, dockerComposeArgs, dockerRunArgs, isInsideMonorepo, LOAD_TARGET_SCRIPT, resolveStandaloneCompose, resolveTargetPath, spawnCapture, spawnInherit, STANDALONE_COMPOSE, } from '../../../lib/regression/docker-helpers.js';
|
|
5
|
+
export default class TestRegressionRemote extends Command {
|
|
6
|
+
static { this.description = 'Run the regression suite against a remote URL (Mode B/C/D). Inside the MJ ' +
|
|
7
|
+
'monorepo it drives the local compose stack; outside it runs the published ' +
|
|
8
|
+
'agentic-test-runner image (no monorepo needed).'; }
|
|
9
|
+
static { this.examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --target=staging-mj',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --target=./my/custom.target.json',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --target=./app/target.json --overlay=./app/docker-compose.app.yml',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --target=./t.json --image=memberjunction/agentic-test-runner:v5.30.0 --env-file=./.env',
|
|
14
|
+
]; }
|
|
15
|
+
static { this.flags = {
|
|
16
|
+
target: Flags.string({
|
|
17
|
+
char: 't',
|
|
18
|
+
description: 'Target profile. Bare name (monorepo: docker/regression/targets/<name>.target.json) or a path.',
|
|
19
|
+
required: true,
|
|
20
|
+
}),
|
|
21
|
+
'no-local-stack': Flags.boolean({
|
|
22
|
+
description: '(monorepo only) Use the lean `remote-target` profile (test-runner only) instead of the full local stack.',
|
|
23
|
+
default: false,
|
|
24
|
+
}),
|
|
25
|
+
overlay: Flags.string({
|
|
26
|
+
description: 'docker-compose overlay (Mode D) that boots your app alongside the runner on the same network. May repeat.',
|
|
27
|
+
multiple: true,
|
|
28
|
+
}),
|
|
29
|
+
image: Flags.string({
|
|
30
|
+
description: '(external) Published image tag to run. Default: ' + AGENTIC_TEST_RUNNER_IMAGE + '. Pin for reproducibility.',
|
|
31
|
+
}),
|
|
32
|
+
'env-file': Flags.string({
|
|
33
|
+
description: '(external) Path to a .env injected into the runner (DB_*, AI_VENDOR_API_KEY__GeminiLLM, auth env: refs).',
|
|
34
|
+
}),
|
|
35
|
+
detach: Flags.boolean({
|
|
36
|
+
char: 'd',
|
|
37
|
+
description: '(monorepo) Run in the background (docker compose up -d).',
|
|
38
|
+
default: false,
|
|
39
|
+
}),
|
|
40
|
+
}; }
|
|
41
|
+
async run() {
|
|
42
|
+
const { flags } = await this.parse(TestRegressionRemote);
|
|
43
|
+
if (isInsideMonorepo()) {
|
|
44
|
+
await this.runInMonorepo(flags);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
await this.runExternal(flags);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Inside the monorepo: load the target host-side, drive the compose stack. */
|
|
51
|
+
async runInMonorepo(flags) {
|
|
52
|
+
if (!existsSync(LOAD_TARGET_SCRIPT))
|
|
53
|
+
this.error(`✗ Loader missing: ${LOAD_TARGET_SCRIPT}`);
|
|
54
|
+
const targetPath = resolveTargetPath(flags.target);
|
|
55
|
+
if (!existsSync(targetPath))
|
|
56
|
+
this.error(`✗ Target profile not found: ${targetPath}`);
|
|
57
|
+
this.log(`▶ Loading target profile: ${targetPath}`);
|
|
58
|
+
const loaded = await spawnCapture(process.execPath, [LOAD_TARGET_SCRIPT, '--format=json', targetPath]);
|
|
59
|
+
if (loaded.code !== 0)
|
|
60
|
+
this.error(`✗ Target profile loader failed (exit ${loaded.code})`);
|
|
61
|
+
let envFromProfile;
|
|
62
|
+
try {
|
|
63
|
+
envFromProfile = JSON.parse(loaded.stdout);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
this.error(`✗ Target loader returned malformed JSON: ${err.message}`);
|
|
67
|
+
}
|
|
68
|
+
this.log(` Profile: ${envFromProfile.TARGET_PROFILE_NAME ?? '(unnamed)'} (${envFromProfile.TARGET_PROFILE_KIND ?? 'unknown'})`);
|
|
69
|
+
this.log(` Base URL: ${envFromProfile.MJ_TEST_VAR_baseUrl ?? '(not set)'}`);
|
|
70
|
+
const childEnv = { ...process.env, ...envFromProfile };
|
|
71
|
+
const composeProfile = flags['no-local-stack'] ? 'remote-target' : 'full';
|
|
72
|
+
const overlays = (flags.overlay ?? []).map((p) => {
|
|
73
|
+
if (!existsSync(p))
|
|
74
|
+
this.error(`✗ Overlay file not found: ${p}`);
|
|
75
|
+
return p;
|
|
76
|
+
});
|
|
77
|
+
if (overlays.length > 0)
|
|
78
|
+
this.log(` Overlays: ${overlays.join(', ')}`);
|
|
79
|
+
const composeArgs = dockerComposeArgs(composeProfile, ['up'], overlays);
|
|
80
|
+
if (flags.detach)
|
|
81
|
+
composeArgs.push('-d');
|
|
82
|
+
this.log(`▶ docker compose --profile ${composeProfile} up`);
|
|
83
|
+
const code = await spawnInherit('docker', composeArgs, { env: childEnv });
|
|
84
|
+
if (code !== 0)
|
|
85
|
+
this.exit(code);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Outside the monorepo: run the published image. Mode B/C → `docker run`
|
|
89
|
+
* (the image loads --target itself). Mode D (--overlay) → `docker compose`
|
|
90
|
+
* with the bundled standalone compose + the user's app overlay.
|
|
91
|
+
*/
|
|
92
|
+
async runExternal(flags) {
|
|
93
|
+
const targetPath = resolveTargetPath(flags.target);
|
|
94
|
+
if (!existsSync(targetPath)) {
|
|
95
|
+
this.error(`✗ Target profile not found: ${targetPath}\n Outside the monorepo, pass a path (e.g. --target=./my-suite/target.json).`);
|
|
96
|
+
}
|
|
97
|
+
const image = flags.image ?? AGENTIC_TEST_RUNNER_IMAGE;
|
|
98
|
+
const envFile = flags['env-file'] ? path.resolve(flags['env-file']) : undefined;
|
|
99
|
+
const targetDir = path.dirname(targetPath);
|
|
100
|
+
const targetFile = path.basename(targetPath);
|
|
101
|
+
const resultsDir = path.resolve('test-results');
|
|
102
|
+
const overlays = (flags.overlay ?? []).map((p) => {
|
|
103
|
+
if (!existsSync(p))
|
|
104
|
+
this.error(`✗ Overlay file not found: ${p}`);
|
|
105
|
+
return path.resolve(p);
|
|
106
|
+
});
|
|
107
|
+
if (overlays.length > 0) {
|
|
108
|
+
// Mode D — boot the app overlay alongside the runner via the standalone compose.
|
|
109
|
+
const standalone = resolveStandaloneCompose(STANDALONE_COMPOSE);
|
|
110
|
+
if (!existsSync(standalone)) {
|
|
111
|
+
this.error(`✗ Standalone compose not found (${standalone}). Reinstall @memberjunction/cli or run from the monorepo.`);
|
|
112
|
+
}
|
|
113
|
+
const childEnv = {
|
|
114
|
+
...process.env,
|
|
115
|
+
MJ_IMAGE: image,
|
|
116
|
+
TARGET_DIR: targetDir,
|
|
117
|
+
TARGET_FILE: targetFile,
|
|
118
|
+
USER_ENV_FILE: envFile ?? '/dev/null',
|
|
119
|
+
};
|
|
120
|
+
const args = ['compose', '-f', standalone];
|
|
121
|
+
for (const o of overlays)
|
|
122
|
+
args.push('-f', o);
|
|
123
|
+
args.push('up', '--abort-on-container-exit', '--exit-code-from', 'test-runner');
|
|
124
|
+
this.log(`▶ docker compose (standalone + ${overlays.length} overlay) — image ${image}`);
|
|
125
|
+
const code = await spawnInherit('docker', args, { env: childEnv });
|
|
126
|
+
if (code !== 0)
|
|
127
|
+
this.exit(code);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Mode B/C — single `docker run` against the published image.
|
|
131
|
+
this.log(`▶ docker run ${image} run --target=/work/${targetFile}`);
|
|
132
|
+
const code = await spawnInherit('docker', dockerRunArgs(image, ['run', `--target=/work/${targetFile}`], {
|
|
133
|
+
mounts: [[targetDir, '/work'], [resultsDir, '/app/test-results']],
|
|
134
|
+
envFile,
|
|
135
|
+
}));
|
|
136
|
+
if (code !== 0)
|
|
137
|
+
this.exit(code);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../../src/commands/test/regression/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class TestRegressionUp extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
detach: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
7
|
+
bacpac: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
|
+
'bacpac-no-upgrade': import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
9
|
+
suite: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
metadata: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
11
|
+
image: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
12
|
+
'explorer-image': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
13
|
+
'env-file': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
/** Inside the monorepo: build-from-source compose (+ bacpac overlay). */
|
|
17
|
+
private runInMonorepo;
|
|
18
|
+
/** Outside the monorepo: only --bacpac is supported (published-image full stack). */
|
|
19
|
+
private runExternal;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=up.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../../../src/commands/test/regression/up.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAa7C,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,WAAW,SAGuC;IAEzD,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;MAYV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAY1B,yEAAyE;YAC3D,aAAa;IA4B3B,qFAAqF;YACvE,WAAW;CA0C1B"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { existsSync, statSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { AGENTIC_TEST_RUNNER_IMAGE, BACPAC_OVERLAY, BACPAC_STANDALONE_COMPOSE, dockerComposeArgs, isInsideMonorepo, resolveStandaloneCompose, spawnInherit, } from '../../../lib/regression/docker-helpers.js';
|
|
5
|
+
export default class TestRegressionUp extends Command {
|
|
6
|
+
static { this.description = 'Run the self-contained MJ regression stack (Mode A). With --bacpac, the DB is imported ' +
|
|
7
|
+
'from a .bacpac. Inside the monorepo this builds from source; outside, --bacpac runs the ' +
|
|
8
|
+
'published-image stack (plain `up` is monorepo-only).'; }
|
|
9
|
+
static { this.examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %>',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --detach',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --bacpac=./db.bacpac --suite="My Suite" --metadata=./my-suite-metadata',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --bacpac=./db.bacpac --bacpac-no-upgrade',
|
|
14
|
+
]; }
|
|
15
|
+
static { this.flags = {
|
|
16
|
+
detach: Flags.boolean({ char: 'd', description: 'Run containers in the background (docker compose up -d).', default: false }),
|
|
17
|
+
bacpac: Flags.string({ description: 'Path to a .bacpac of a real MJ database to import and test against.' }),
|
|
18
|
+
'bacpac-no-upgrade': Flags.boolean({
|
|
19
|
+
description: 'Import the bacpac as-is — skip migrate/codegen. Only safe at the current MJ version. Requires --bacpac.',
|
|
20
|
+
default: false,
|
|
21
|
+
}),
|
|
22
|
+
suite: Flags.string({ description: 'Test suite to run (TEST_SUITE_NAME). Use with --bacpac + --metadata.' }),
|
|
23
|
+
metadata: Flags.string({ description: 'Directory of your test + test-suite metadata (pushed before the run). Requires --bacpac.' }),
|
|
24
|
+
image: Flags.string({ description: '(external) Published agentic-test-runner image. Default: ' + AGENTIC_TEST_RUNNER_IMAGE + '.' }),
|
|
25
|
+
'explorer-image': Flags.string({ description: '(external bacpac) Published Explorer image (prerequisite). Default: memberjunction/explorer:latest.' }),
|
|
26
|
+
'env-file': Flags.string({ description: '(external) .env injected into the runner (auth env: refs).' }),
|
|
27
|
+
}; }
|
|
28
|
+
async run() {
|
|
29
|
+
const { flags } = await this.parse(TestRegressionUp);
|
|
30
|
+
if ((flags['bacpac-no-upgrade'] || flags.metadata) && !flags.bacpac) {
|
|
31
|
+
this.error('--bacpac-no-upgrade and --metadata require --bacpac.');
|
|
32
|
+
}
|
|
33
|
+
if (isInsideMonorepo()) {
|
|
34
|
+
await this.runInMonorepo(flags);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
await this.runExternal(flags);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Inside the monorepo: build-from-source compose (+ bacpac overlay). */
|
|
41
|
+
async runInMonorepo(flags) {
|
|
42
|
+
const childEnv = { ...process.env };
|
|
43
|
+
const overlays = [];
|
|
44
|
+
if (flags.bacpac) {
|
|
45
|
+
const abs = path.resolve(flags.bacpac);
|
|
46
|
+
if (!existsSync(abs) || !statSync(abs).isFile())
|
|
47
|
+
this.error(`✗ Bacpac file not found: ${abs}`);
|
|
48
|
+
overlays.push(BACPAC_OVERLAY);
|
|
49
|
+
childEnv.BACPAC_DIR = path.dirname(abs);
|
|
50
|
+
childEnv.BACPAC_FILE = `/app/bacpac/${path.basename(abs)}`;
|
|
51
|
+
childEnv.BACPAC_UPGRADE = flags['bacpac-no-upgrade'] ? 'false' : 'true';
|
|
52
|
+
this.log(`▶ Bacpac: ${abs} (upgrade=${childEnv.BACPAC_UPGRADE})`);
|
|
53
|
+
if (flags.metadata) {
|
|
54
|
+
const metaAbs = path.resolve(flags.metadata);
|
|
55
|
+
if (!existsSync(metaAbs) || !statSync(metaAbs).isDirectory())
|
|
56
|
+
this.error(`✗ --metadata directory not found: ${metaAbs}`);
|
|
57
|
+
childEnv.USER_METADATA_DIR = metaAbs;
|
|
58
|
+
childEnv.EXTRA_METADATA_DIRS = '/app/user-metadata';
|
|
59
|
+
this.log(` Suite metadata: ${metaAbs}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (flags.suite) {
|
|
63
|
+
childEnv.TEST_SUITE_NAME = flags.suite;
|
|
64
|
+
this.log(` Suite: ${flags.suite}`);
|
|
65
|
+
}
|
|
66
|
+
const composeArgs = dockerComposeArgs('full', ['up'], overlays);
|
|
67
|
+
if (flags.detach)
|
|
68
|
+
composeArgs.push('-d');
|
|
69
|
+
const code = await spawnInherit('docker', composeArgs, { env: childEnv });
|
|
70
|
+
if (code !== 0)
|
|
71
|
+
this.exit(code);
|
|
72
|
+
}
|
|
73
|
+
/** Outside the monorepo: only --bacpac is supported (published-image full stack). */
|
|
74
|
+
async runExternal(flags) {
|
|
75
|
+
if (!flags.bacpac) {
|
|
76
|
+
this.error('Plain `up` boots the full self-contained MJ stack built from source — monorepo-only.\n' +
|
|
77
|
+
' Outside the monorepo, use `up --bacpac=<file>` (published-image stack) or ' +
|
|
78
|
+
'`mj test regression remote --target=<file>` for a URL.');
|
|
79
|
+
}
|
|
80
|
+
const abs = path.resolve(flags.bacpac);
|
|
81
|
+
if (!existsSync(abs) || !statSync(abs).isFile())
|
|
82
|
+
this.error(`✗ Bacpac file not found: ${abs}`);
|
|
83
|
+
if (!flags.metadata)
|
|
84
|
+
this.error('External --bacpac requires --metadata (a dir with target.json + metadata/ for your suite).');
|
|
85
|
+
const metaAbs = path.resolve(flags.metadata);
|
|
86
|
+
if (!existsSync(metaAbs) || !statSync(metaAbs).isDirectory())
|
|
87
|
+
this.error(`✗ --metadata directory not found: ${metaAbs}`);
|
|
88
|
+
const compose = resolveStandaloneCompose(BACPAC_STANDALONE_COMPOSE);
|
|
89
|
+
if (!existsSync(compose))
|
|
90
|
+
this.error(`✗ Standalone bacpac compose not found (${compose}). Reinstall @memberjunction/cli.`);
|
|
91
|
+
const childEnv = {
|
|
92
|
+
...process.env,
|
|
93
|
+
MJ_IMAGE: flags.image ?? AGENTIC_TEST_RUNNER_IMAGE,
|
|
94
|
+
MJ_EXPLORER_IMAGE: flags['explorer-image'] ?? 'memberjunction/explorer:latest',
|
|
95
|
+
BACPAC_DIR: path.dirname(abs),
|
|
96
|
+
BACPAC_FILE: path.basename(abs),
|
|
97
|
+
BACPAC_UPGRADE: flags['bacpac-no-upgrade'] ? 'false' : 'true',
|
|
98
|
+
TARGET_DIR: metaAbs,
|
|
99
|
+
TARGET_FILE: 'target.json',
|
|
100
|
+
USER_ENV_FILE: flags['env-file'] ? path.resolve(flags['env-file']) : '/dev/null',
|
|
101
|
+
TEST_SUITE_NAME: flags.suite ?? '',
|
|
102
|
+
};
|
|
103
|
+
this.warn('External bacpac requires the `memberjunction/explorer` image (a published-Explorer prerequisite ' +
|
|
104
|
+
'that is a separate workstream). If it cannot be pulled, the explorer service will fail to start.');
|
|
105
|
+
this.log(`▶ docker compose (bacpac-standalone) — bacpac=${abs} upgrade=${childEnv.BACPAC_UPGRADE}`);
|
|
106
|
+
const code = await spawnInherit('docker', ['compose', '-f', compose, 'up', '--abort-on-container-exit', '--exit-code-from', 'test-runner'], { env: childEnv });
|
|
107
|
+
if (code !== 0)
|
|
108
|
+
this.exit(code);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"up.js","sourceRoot":"","sources":["../../../../src/commands/test/regression/up.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ export default class TestRun extends Command {
|
|
|
12
12
|
output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
13
|
'dry-run': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
14
14
|
verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
'oracles-module': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
15
16
|
};
|
|
16
17
|
run(): Promise<void>;
|
|
17
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAyC;IAE3D,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAyC;IAE3D,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAkCV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB3B"}
|
|
@@ -42,6 +42,11 @@ export default class TestRun extends Command {
|
|
|
42
42
|
description: 'Show detailed execution information',
|
|
43
43
|
default: false,
|
|
44
44
|
}),
|
|
45
|
+
'oracles-module': Flags.string({
|
|
46
|
+
description: 'Path to a JS/TS module that exports custom IOracle classes or instances. ' +
|
|
47
|
+
'Each export is registered on the engine before the test runs — used by non-MJ ' +
|
|
48
|
+
'adopters to plug app-specific oracle types without modifying TestingFramework.',
|
|
49
|
+
}),
|
|
45
50
|
}; }
|
|
46
51
|
async run() {
|
|
47
52
|
const { RunCommand } = await import('@memberjunction/testing-cli');
|
|
@@ -57,6 +62,7 @@ export default class TestRun extends Command {
|
|
|
57
62
|
output: flags.output,
|
|
58
63
|
dryRun: flags['dry-run'],
|
|
59
64
|
verbose: flags.verbose,
|
|
65
|
+
oraclesModule: flags['oracles-module'],
|
|
60
66
|
});
|
|
61
67
|
}
|
|
62
68
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;aACnC,gBAAW,GAAG,qCAAqC,CAAC;aAEpD,aAAQ,GAAG;QAChB,+CAA+C;QAC/C,mEAAmE;QACnE,qEAAqE;QACrE,mFAAmF;QACnF,yDAAyD;KAC1D,CAAC;aAEK,SAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,oBAAoB;YACjC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;aAEK,UAAK,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,sBAAsB;SACpC,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,0CAA0C;SACxD,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC;YACxC,OAAO,EAAE,SAAS;SACnB,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,kBAAkB;SAChC,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,WAAW,EAAE,4BAA4B;YACzC,OAAO,EAAE,KAAK;SACf,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,qCAAqC;YAClD,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAEnE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,yCAAyC;YACzC,2EAA2E;YAC3E,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAyC;gBACvD,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;aACnC,gBAAW,GAAG,qCAAqC,CAAC;aAEpD,aAAQ,GAAG;QAChB,+CAA+C;QAC/C,mEAAmE;QACnE,qEAAqE;QACrE,mFAAmF;QACnF,yDAAyD;KAC1D,CAAC;aAEK,SAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,oBAAoB;YACjC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;aAEK,UAAK,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,sBAAsB;SACpC,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,0CAA0C;SACxD,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC;YACxC,OAAO,EAAE,SAAS;SACnB,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,kBAAkB;SAChC,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,WAAW,EAAE,4BAA4B;YACzC,OAAO,EAAE,KAAK;SACf,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,qCAAqC;YAClD,OAAO,EAAE,KAAK;SACf,CAAC;QACF,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC;YAC7B,WAAW,EACT,2EAA2E;gBAC3E,gFAAgF;gBAChF,gFAAgF;SACnF,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAEnE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,yCAAyC;YACzC,2EAA2E;YAC3E,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAyC;gBACvD,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC;aACvC,CAAC,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC"}
|
|
@@ -10,6 +10,11 @@ export default class TestSuite extends Command {
|
|
|
10
10
|
format: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
11
|
output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
12
|
verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
delay: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
14
|
+
parallel: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
'max-parallel': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
16
|
+
'flaky-check': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
17
|
+
'oracles-module': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
18
|
};
|
|
14
19
|
run(): Promise<void>;
|
|
15
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../../../src/commands/test/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA0B;IAE5C,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK
|
|
1
|
+
{"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../../../src/commands/test/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA0B;IAE5C,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;MA2CV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyB3B"}
|