@memberjunction/testing-cli 0.0.1 → 2.119.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 +486 -29
- package/dist/commands/compare.d.ts +24 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +50 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/history.d.ts +23 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +47 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/list.d.ts +39 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +177 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/report.d.ts +22 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +46 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/run.d.ts +21 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +139 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/suite.d.ts +21 -0
- package/dist/commands/suite.d.ts.map +1 -0
- package/dist/commands/suite.js +105 -0
- package/dist/commands/suite.js.map +1 -0
- package/dist/commands/validate.d.ts +33 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +266 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/mj-provider.d.ts +10 -0
- package/dist/lib/mj-provider.d.ts.map +1 -0
- package/dist/lib/mj-provider.js +205 -0
- package/dist/lib/mj-provider.js.map +1 -0
- package/dist/types.d.ts +103 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config-loader.d.ts +42 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +70 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/output-formatter.d.ts +64 -0
- package/dist/utils/output-formatter.d.ts.map +1 -0
- package/dist/utils/output-formatter.js +280 -0
- package/dist/utils/output-formatter.js.map +1 -0
- package/dist/utils/spinner-manager.d.ts +43 -0
- package/dist/utils/spinner-manager.d.ts.map +1 -0
- package/dist/utils/spinner-manager.js +89 -0
- package/dist/utils/spinner-manager.js.map +1 -0
- package/package.json +38 -7
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CLI-specific types and interfaces
|
|
3
|
+
* @module @memberjunction/testing-cli
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Output format options for CLI commands
|
|
7
|
+
*/
|
|
8
|
+
export type OutputFormat = 'console' | 'json' | 'markdown';
|
|
9
|
+
/**
|
|
10
|
+
* CLI configuration loaded from mj.config.cjs
|
|
11
|
+
*/
|
|
12
|
+
export interface CLIConfig {
|
|
13
|
+
defaultEnvironment?: string;
|
|
14
|
+
defaultFormat?: OutputFormat;
|
|
15
|
+
failFast?: boolean;
|
|
16
|
+
parallel?: boolean;
|
|
17
|
+
maxParallelTests?: number;
|
|
18
|
+
timeout?: number;
|
|
19
|
+
database?: {
|
|
20
|
+
host?: string;
|
|
21
|
+
name?: string;
|
|
22
|
+
port?: number;
|
|
23
|
+
username?: string;
|
|
24
|
+
password?: string;
|
|
25
|
+
schema?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Common flags shared across commands
|
|
30
|
+
*/
|
|
31
|
+
export interface CommonFlags {
|
|
32
|
+
format?: OutputFormat;
|
|
33
|
+
output?: string;
|
|
34
|
+
verbose?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Flags for run command
|
|
38
|
+
*/
|
|
39
|
+
export interface RunFlags extends CommonFlags {
|
|
40
|
+
name?: string;
|
|
41
|
+
suite?: string;
|
|
42
|
+
tag?: string;
|
|
43
|
+
category?: string;
|
|
44
|
+
difficulty?: string;
|
|
45
|
+
all?: boolean;
|
|
46
|
+
dryRun?: boolean;
|
|
47
|
+
environment?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Flags for suite command
|
|
51
|
+
*/
|
|
52
|
+
export interface SuiteFlags extends CommonFlags {
|
|
53
|
+
name?: string;
|
|
54
|
+
parallel?: boolean;
|
|
55
|
+
failFast?: boolean;
|
|
56
|
+
sequence?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Flags for list command
|
|
60
|
+
*/
|
|
61
|
+
export interface ListFlags extends CommonFlags {
|
|
62
|
+
type?: string;
|
|
63
|
+
suites?: boolean;
|
|
64
|
+
types?: boolean;
|
|
65
|
+
tag?: string;
|
|
66
|
+
status?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Flags for validate command
|
|
70
|
+
*/
|
|
71
|
+
export interface ValidateFlags extends CommonFlags {
|
|
72
|
+
all?: boolean;
|
|
73
|
+
type?: string;
|
|
74
|
+
saveReport?: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Flags for report command
|
|
78
|
+
*/
|
|
79
|
+
export interface ReportFlags extends CommonFlags {
|
|
80
|
+
suite?: string;
|
|
81
|
+
test?: string;
|
|
82
|
+
from?: string;
|
|
83
|
+
to?: string;
|
|
84
|
+
includeCosts?: boolean;
|
|
85
|
+
includeTrends?: boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Flags for history command
|
|
89
|
+
*/
|
|
90
|
+
export interface HistoryFlags extends CommonFlags {
|
|
91
|
+
recent?: number;
|
|
92
|
+
from?: string;
|
|
93
|
+
status?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Flags for compare command
|
|
97
|
+
*/
|
|
98
|
+
export interface CompareFlags extends CommonFlags {
|
|
99
|
+
version?: string[];
|
|
100
|
+
commit?: string[];
|
|
101
|
+
diffOnly?: boolean;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,WAAW;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAC9C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Configuration loader for CLI
|
|
3
|
+
* @module @memberjunction/testing-cli
|
|
4
|
+
*/
|
|
5
|
+
import { CLIConfig } from '../types';
|
|
6
|
+
export interface MJConfig {
|
|
7
|
+
dbHost?: string;
|
|
8
|
+
dbDatabase?: string;
|
|
9
|
+
dbPort?: number | string;
|
|
10
|
+
dbUsername?: string;
|
|
11
|
+
dbPassword?: string;
|
|
12
|
+
coreSchema?: string;
|
|
13
|
+
testing?: {
|
|
14
|
+
defaultEnvironment?: string;
|
|
15
|
+
defaultFormat?: 'console' | 'json' | 'markdown';
|
|
16
|
+
failFast?: boolean;
|
|
17
|
+
parallel?: boolean;
|
|
18
|
+
maxParallelTests?: number;
|
|
19
|
+
timeout?: number;
|
|
20
|
+
};
|
|
21
|
+
database?: {
|
|
22
|
+
host?: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
port?: number;
|
|
25
|
+
username?: string;
|
|
26
|
+
password?: string;
|
|
27
|
+
schema?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load MJ configuration from mj.config.cjs
|
|
32
|
+
*
|
|
33
|
+
* @returns Full MJ configuration
|
|
34
|
+
*/
|
|
35
|
+
export declare function loadMJConfig(): Promise<MJConfig>;
|
|
36
|
+
/**
|
|
37
|
+
* Load testing CLI configuration with defaults
|
|
38
|
+
*
|
|
39
|
+
* @returns CLI configuration
|
|
40
|
+
*/
|
|
41
|
+
export declare function loadCLIConfig(): CLIConfig;
|
|
42
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAMrC,MAAM,WAAW,QAAQ;IAErB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,OAAO,CAAC,EAAE;QACN,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;QAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAGF,QAAQ,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACL;AAID;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAsBtD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAqBzC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Configuration loader for CLI
|
|
4
|
+
* @module @memberjunction/testing-cli
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.loadCLIConfig = exports.loadMJConfig = void 0;
|
|
11
|
+
const cosmiconfig_1 = require("cosmiconfig");
|
|
12
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
// Load environment variables BEFORE loading config
|
|
15
|
+
// This ensures process.env is populated when mj.config.cjs is evaluated
|
|
16
|
+
dotenv_1.default.config({ path: path_1.default.resolve(process.cwd(), '.env'), override: true });
|
|
17
|
+
let cachedConfig = null;
|
|
18
|
+
/**
|
|
19
|
+
* Load MJ configuration from mj.config.cjs
|
|
20
|
+
*
|
|
21
|
+
* @returns Full MJ configuration
|
|
22
|
+
*/
|
|
23
|
+
async function loadMJConfig() {
|
|
24
|
+
if (cachedConfig) {
|
|
25
|
+
return cachedConfig;
|
|
26
|
+
}
|
|
27
|
+
// Clear any existing require cache for mj.config.cjs to ensure env vars are re-evaluated
|
|
28
|
+
// This is necessary because mj.config.cjs uses process.env.DB_DATABASE directly
|
|
29
|
+
const configPath = path_1.default.resolve(process.cwd(), 'mj.config.cjs');
|
|
30
|
+
delete require.cache[configPath];
|
|
31
|
+
// Create a new explorer instance to ensure fresh config load with current env vars
|
|
32
|
+
const explorer = (0, cosmiconfig_1.cosmiconfig)('mj', {
|
|
33
|
+
cache: false // Disable caching to ensure fresh load
|
|
34
|
+
});
|
|
35
|
+
const result = await explorer.search();
|
|
36
|
+
if (!result) {
|
|
37
|
+
throw new Error(`No mj.config.cjs configuration found. Ensure you're running from the MJ repository root.`);
|
|
38
|
+
}
|
|
39
|
+
cachedConfig = result.config;
|
|
40
|
+
return cachedConfig;
|
|
41
|
+
}
|
|
42
|
+
exports.loadMJConfig = loadMJConfig;
|
|
43
|
+
/**
|
|
44
|
+
* Load testing CLI configuration with defaults
|
|
45
|
+
*
|
|
46
|
+
* @returns CLI configuration
|
|
47
|
+
*/
|
|
48
|
+
function loadCLIConfig() {
|
|
49
|
+
// Synchronous version for backward compatibility
|
|
50
|
+
// Uses cached config if available, otherwise returns defaults
|
|
51
|
+
const testingConfig = cachedConfig?.testing || {};
|
|
52
|
+
return {
|
|
53
|
+
defaultEnvironment: testingConfig.defaultEnvironment || process.env.MJ_TEST_ENV || 'dev',
|
|
54
|
+
defaultFormat: testingConfig.defaultFormat || 'console',
|
|
55
|
+
failFast: testingConfig.failFast ?? false,
|
|
56
|
+
parallel: testingConfig.parallel ?? false,
|
|
57
|
+
maxParallelTests: testingConfig.maxParallelTests || 5,
|
|
58
|
+
timeout: testingConfig.timeout || 300000, // 5 minutes
|
|
59
|
+
database: cachedConfig?.database || {
|
|
60
|
+
host: cachedConfig?.dbHost || 'localhost',
|
|
61
|
+
name: cachedConfig?.dbDatabase,
|
|
62
|
+
port: typeof cachedConfig?.dbPort === 'string' ? parseInt(cachedConfig.dbPort) : cachedConfig?.dbPort,
|
|
63
|
+
username: cachedConfig?.dbUsername,
|
|
64
|
+
password: cachedConfig?.dbPassword,
|
|
65
|
+
schema: cachedConfig?.coreSchema || '__mj'
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
exports.loadCLIConfig = loadCLIConfig;
|
|
70
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,6CAA0C;AAC1C,oDAA4B;AAC5B,gDAAwB;AAGxB,mDAAmD;AACnD,wEAAwE;AACxE,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAgC7E,IAAI,YAAY,GAAoB,IAAI,CAAC;AAEzC;;;;GAIG;AACI,KAAK,UAAU,YAAY;IAC9B,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,yFAAyF;IACzF,gFAAgF;IAChF,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjC,mFAAmF;IACnF,MAAM,QAAQ,GAAG,IAAA,yBAAW,EAAC,IAAI,EAAE;QAC/B,KAAK,EAAE,KAAK,CAAE,uCAAuC;KACxD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;IAEvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;IAChH,CAAC;IAED,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,OAAO,YAAY,CAAC;AACxB,CAAC;AAtBD,oCAsBC;AAED;;;;GAIG;AACH,SAAgB,aAAa;IACzB,iDAAiD;IACjD,8DAA8D;IAC9D,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,IAAI,EAAE,CAAC;IAElD,OAAO;QACH,kBAAkB,EAAE,aAAa,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,KAAK;QACxF,aAAa,EAAE,aAAa,CAAC,aAAa,IAAI,SAAS;QACvD,QAAQ,EAAE,aAAa,CAAC,QAAQ,IAAI,KAAK;QACzC,QAAQ,EAAE,aAAa,CAAC,QAAQ,IAAI,KAAK;QACzC,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,IAAI,CAAC;QACrD,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,MAAM,EAAG,YAAY;QACvD,QAAQ,EAAE,YAAY,EAAE,QAAQ,IAAI;YAChC,IAAI,EAAE,YAAY,EAAE,MAAM,IAAI,WAAW;YACzC,IAAI,EAAE,YAAY,EAAE,UAAU;YAC9B,IAAI,EAAE,OAAO,YAAY,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM;YACrG,QAAQ,EAAE,YAAY,EAAE,UAAU;YAClC,QAAQ,EAAE,YAAY,EAAE,UAAU;YAClC,MAAM,EAAE,YAAY,EAAE,UAAU,IAAI,MAAM;SAC7C;KACJ,CAAC;AACN,CAAC;AArBD,sCAqBC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Output formatting utilities for CLI
|
|
3
|
+
* @module @memberjunction/testing-cli
|
|
4
|
+
*/
|
|
5
|
+
import { TestRunResult, TestSuiteRunResult } from '@memberjunction/testing-engine';
|
|
6
|
+
import { OutputFormat } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Format test result for display
|
|
9
|
+
*/
|
|
10
|
+
export declare class OutputFormatter {
|
|
11
|
+
/**
|
|
12
|
+
* Format test run result based on output format
|
|
13
|
+
*/
|
|
14
|
+
static formatTestResult(result: TestRunResult, format: OutputFormat): string;
|
|
15
|
+
/**
|
|
16
|
+
* Format suite result based on output format
|
|
17
|
+
*/
|
|
18
|
+
static formatSuiteResult(result: TestSuiteRunResult, format: OutputFormat): string;
|
|
19
|
+
/**
|
|
20
|
+
* Format test result as JSON
|
|
21
|
+
*/
|
|
22
|
+
private static formatJSON;
|
|
23
|
+
/**
|
|
24
|
+
* Format test result as Markdown
|
|
25
|
+
*/
|
|
26
|
+
private static formatMarkdown;
|
|
27
|
+
/**
|
|
28
|
+
* Format test result for console output
|
|
29
|
+
*/
|
|
30
|
+
private static formatConsole;
|
|
31
|
+
/**
|
|
32
|
+
* Format suite result as JSON
|
|
33
|
+
*/
|
|
34
|
+
private static formatSuiteJSON;
|
|
35
|
+
/**
|
|
36
|
+
* Format suite result as Markdown
|
|
37
|
+
*/
|
|
38
|
+
private static formatSuiteMarkdown;
|
|
39
|
+
/**
|
|
40
|
+
* Format suite result for console output
|
|
41
|
+
*/
|
|
42
|
+
private static formatSuiteConsole;
|
|
43
|
+
/**
|
|
44
|
+
* Write output to file if specified
|
|
45
|
+
*/
|
|
46
|
+
static writeToFile(content: string, filePath?: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Format error message
|
|
49
|
+
*/
|
|
50
|
+
static formatError(message: string, error?: Error): string;
|
|
51
|
+
/**
|
|
52
|
+
* Format success message
|
|
53
|
+
*/
|
|
54
|
+
static formatSuccess(message: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Format warning message
|
|
57
|
+
*/
|
|
58
|
+
static formatWarning(message: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Format info message
|
|
61
|
+
*/
|
|
62
|
+
static formatInfo(message: string): string;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=output-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/output-formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC;;GAEG;AACH,qBAAa,eAAe;IACxB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IAY5E;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IAYlF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAyB7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAkD5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAI9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA4ClC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAgDjC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAa5D;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM;IAiB1D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAG7C"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Output formatting utilities for CLI
|
|
4
|
+
* @module @memberjunction/testing-cli
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
|
+
if (mod && mod.__esModule) return mod;
|
|
24
|
+
var result = {};
|
|
25
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
26
|
+
__setModuleDefault(result, mod);
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
30
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.OutputFormatter = void 0;
|
|
34
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
35
|
+
const fs = __importStar(require("fs"));
|
|
36
|
+
/**
|
|
37
|
+
* Format test result for display
|
|
38
|
+
*/
|
|
39
|
+
class OutputFormatter {
|
|
40
|
+
/**
|
|
41
|
+
* Format test run result based on output format
|
|
42
|
+
*/
|
|
43
|
+
static formatTestResult(result, format) {
|
|
44
|
+
switch (format) {
|
|
45
|
+
case 'json':
|
|
46
|
+
return this.formatJSON(result);
|
|
47
|
+
case 'markdown':
|
|
48
|
+
return this.formatMarkdown(result);
|
|
49
|
+
case 'console':
|
|
50
|
+
default:
|
|
51
|
+
return this.formatConsole(result);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Format suite result based on output format
|
|
56
|
+
*/
|
|
57
|
+
static formatSuiteResult(result, format) {
|
|
58
|
+
switch (format) {
|
|
59
|
+
case 'json':
|
|
60
|
+
return this.formatSuiteJSON(result);
|
|
61
|
+
case 'markdown':
|
|
62
|
+
return this.formatSuiteMarkdown(result);
|
|
63
|
+
case 'console':
|
|
64
|
+
default:
|
|
65
|
+
return this.formatSuiteConsole(result);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Format test result as JSON
|
|
70
|
+
*/
|
|
71
|
+
static formatJSON(result) {
|
|
72
|
+
return JSON.stringify(result, null, 2);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Format test result as Markdown
|
|
76
|
+
*/
|
|
77
|
+
static formatMarkdown(result) {
|
|
78
|
+
const passed = result.status === 'Passed';
|
|
79
|
+
const status = passed ? 'PASSED ✓' : 'FAILED ✗';
|
|
80
|
+
const scorePercent = (result.score * 100).toFixed(1);
|
|
81
|
+
let md = `# Test Run: ${result.testName}\n`;
|
|
82
|
+
md += `**Status:** ${status}\n`;
|
|
83
|
+
md += `**Score:** ${result.score.toFixed(4)} (${scorePercent}%)\n`;
|
|
84
|
+
md += `**Duration:** ${(result.durationMs / 1000).toFixed(1)}s\n`;
|
|
85
|
+
md += `**Cost:** $${result.totalCost.toFixed(4)}\n`;
|
|
86
|
+
md += '\n## Oracle Results\n';
|
|
87
|
+
for (const oracle of result.oracleResults) {
|
|
88
|
+
const symbol = oracle.passed ? '✓' : '✗';
|
|
89
|
+
md += `- ${symbol} ${oracle.oracleType}: ${oracle.message}\n`;
|
|
90
|
+
}
|
|
91
|
+
if (result.errorMessage) {
|
|
92
|
+
md += '\n## Error\n';
|
|
93
|
+
md += `\`\`\`\n${result.errorMessage}\n\`\`\`\n`;
|
|
94
|
+
}
|
|
95
|
+
return md;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Format test result for console output
|
|
99
|
+
*/
|
|
100
|
+
static formatConsole(result) {
|
|
101
|
+
const lines = [];
|
|
102
|
+
// Header
|
|
103
|
+
lines.push(chalk_1.default.bold(`\n[TEST_START] ${result.testName}`));
|
|
104
|
+
lines.push(chalk_1.default.gray(`[TARGET] ${result.targetType}`));
|
|
105
|
+
if (result.targetLogId) {
|
|
106
|
+
lines.push(chalk_1.default.cyan(`[TARGET_ID] ${result.targetLogId}`));
|
|
107
|
+
}
|
|
108
|
+
lines.push('');
|
|
109
|
+
// Oracle results
|
|
110
|
+
if (result.oracleResults.length > 0) {
|
|
111
|
+
lines.push(chalk_1.default.bold(`[ORACLES] Running ${result.oracleResults.length} validation(s)`));
|
|
112
|
+
for (const oracle of result.oracleResults) {
|
|
113
|
+
const symbol = oracle.passed ? chalk_1.default.green('✓') : chalk_1.default.red('✗');
|
|
114
|
+
const scoreStr = oracle.score != null ? ` (score: ${oracle.score.toFixed(4)})` : '';
|
|
115
|
+
lines.push(`${symbol} ${oracle.oracleType}${scoreStr}: ${oracle.message}`);
|
|
116
|
+
}
|
|
117
|
+
lines.push('');
|
|
118
|
+
}
|
|
119
|
+
// Score
|
|
120
|
+
const scorePercent = (result.score * 100).toFixed(1);
|
|
121
|
+
lines.push(chalk_1.default.bold('[SCORE]'));
|
|
122
|
+
lines.push(` Overall: ${result.score.toFixed(4)} (${scorePercent}%)`);
|
|
123
|
+
lines.push(` Checks: ${result.passedChecks}/${result.totalChecks} passed`);
|
|
124
|
+
lines.push(` Duration: ${(result.durationMs / 1000).toFixed(1)}s`);
|
|
125
|
+
lines.push(` Cost: $${result.totalCost.toFixed(4)}`);
|
|
126
|
+
// Final status
|
|
127
|
+
lines.push('');
|
|
128
|
+
const passed = result.status === 'Passed';
|
|
129
|
+
if (passed) {
|
|
130
|
+
lines.push(chalk_1.default.green.bold(`[TEST_PASS] ${result.testName}`));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
lines.push(chalk_1.default.red.bold(`[TEST_FAIL] ${result.testName}`));
|
|
134
|
+
}
|
|
135
|
+
if (result.errorMessage) {
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push(chalk_1.default.red.bold('[ERROR]'));
|
|
138
|
+
lines.push(chalk_1.default.red(result.errorMessage));
|
|
139
|
+
}
|
|
140
|
+
return lines.join('\n');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Format suite result as JSON
|
|
144
|
+
*/
|
|
145
|
+
static formatSuiteJSON(result) {
|
|
146
|
+
return JSON.stringify(result, null, 2);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Format suite result as Markdown
|
|
150
|
+
*/
|
|
151
|
+
static formatSuiteMarkdown(result) {
|
|
152
|
+
const passRate = result.totalTests > 0 ? (result.passedTests / result.totalTests * 100).toFixed(1) : '0.0';
|
|
153
|
+
let md = `# Test Suite: ${result.suiteName}\n`;
|
|
154
|
+
md += `**Total Tests:** ${result.totalTests}\n`;
|
|
155
|
+
md += `**Passed:** ${result.passedTests}\n`;
|
|
156
|
+
md += `**Failed:** ${result.failedTests}\n`;
|
|
157
|
+
md += `**Pass Rate:** ${passRate}%\n`;
|
|
158
|
+
md += `**Duration:** ${(result.durationMs / 1000).toFixed(1)}s\n`;
|
|
159
|
+
md += `**Total Cost:** $${result.totalCost.toFixed(4)}\n`;
|
|
160
|
+
md += '\n## Test Results\n';
|
|
161
|
+
md += '| Test | Status | Score | Duration | Cost |\n';
|
|
162
|
+
md += '|------|--------|-------|----------|------|\n';
|
|
163
|
+
for (const testResult of result.testResults) {
|
|
164
|
+
const passed = testResult.status === 'Passed';
|
|
165
|
+
const status = passed ? '✓ PASS' : '✗ FAIL';
|
|
166
|
+
const cost = `$${testResult.totalCost.toFixed(4)}`;
|
|
167
|
+
md += `| ${testResult.testName} | ${status} | ${testResult.score.toFixed(4)} | ${(testResult.durationMs / 1000).toFixed(1)}s | ${cost} |\n`;
|
|
168
|
+
}
|
|
169
|
+
const failedTests = result.testResults.filter(t => t.status !== 'Passed');
|
|
170
|
+
if (failedTests.length > 0) {
|
|
171
|
+
md += '\n## Failures\n';
|
|
172
|
+
for (const testResult of failedTests) {
|
|
173
|
+
md += `\n### ${testResult.testName}\n`;
|
|
174
|
+
md += `- **Score:** ${testResult.score.toFixed(4)}\n`;
|
|
175
|
+
for (const oracle of testResult.oracleResults) {
|
|
176
|
+
if (!oracle.passed) {
|
|
177
|
+
md += `- **Failed Oracle:** ${oracle.oracleType} - ${oracle.message}\n`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (testResult.errorMessage) {
|
|
181
|
+
md += `- **Error:** ${testResult.errorMessage}\n`;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return md;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Format suite result for console output
|
|
189
|
+
*/
|
|
190
|
+
static formatSuiteConsole(result) {
|
|
191
|
+
const lines = [];
|
|
192
|
+
// Header
|
|
193
|
+
lines.push(chalk_1.default.bold(`\n[SUITE_START] ${result.suiteName}`));
|
|
194
|
+
lines.push(chalk_1.default.gray(`[TESTS] ${result.totalTests} tests queued`));
|
|
195
|
+
lines.push('');
|
|
196
|
+
// Individual test results
|
|
197
|
+
for (let i = 0; i < result.testResults.length; i++) {
|
|
198
|
+
const testResult = result.testResults[i];
|
|
199
|
+
const number = chalk_1.default.gray(`[${i + 1}/${result.totalTests}]`);
|
|
200
|
+
const passed = testResult.status === 'Passed';
|
|
201
|
+
const symbol = passed ? chalk_1.default.green('✓') : chalk_1.default.red('✗');
|
|
202
|
+
const status = passed ? chalk_1.default.green('PASSED') : chalk_1.default.red('FAILED');
|
|
203
|
+
const cost = `$${testResult.totalCost.toFixed(4)}`;
|
|
204
|
+
lines.push(`${number} ${testResult.testName}`);
|
|
205
|
+
lines.push(`${symbol} ${status} (${(testResult.durationMs / 1000).toFixed(1)}s, score: ${testResult.score.toFixed(4)}, cost: ${cost})`);
|
|
206
|
+
if (!passed) {
|
|
207
|
+
for (const oracle of testResult.oracleResults) {
|
|
208
|
+
if (!oracle.passed) {
|
|
209
|
+
lines.push(chalk_1.default.red(` - Oracle '${oracle.oracleType}' failed: ${oracle.message}`));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (testResult.errorMessage) {
|
|
213
|
+
lines.push(chalk_1.default.red(` - Error: ${testResult.errorMessage}`));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
lines.push('');
|
|
217
|
+
}
|
|
218
|
+
// Summary
|
|
219
|
+
const passRate = result.totalTests > 0 ? (result.passedTests / result.totalTests * 100).toFixed(1) : '0.0';
|
|
220
|
+
lines.push(chalk_1.default.bold('[SUITE_COMPLETE] ' + result.suiteName));
|
|
221
|
+
lines.push(chalk_1.default.bold(`[SUMMARY] ${result.passedTests}/${result.totalTests} passed (${passRate}%)`));
|
|
222
|
+
lines.push(chalk_1.default.bold(`[DURATION] ${(result.durationMs / 1000).toFixed(1)}s`));
|
|
223
|
+
lines.push(chalk_1.default.bold(`[COST] $${result.totalCost.toFixed(4)}`));
|
|
224
|
+
if (result.failedTests > 0) {
|
|
225
|
+
lines.push(chalk_1.default.red.bold(`[FAILURES] ${result.failedTests} test(s) failed - see details above`));
|
|
226
|
+
}
|
|
227
|
+
return lines.join('\n');
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Write output to file if specified
|
|
231
|
+
*/
|
|
232
|
+
static writeToFile(content, filePath) {
|
|
233
|
+
if (!filePath) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
238
|
+
console.log(chalk_1.default.green(`✓ Output saved to ${filePath}`));
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
console.error(chalk_1.default.red(`✗ Failed to write to ${filePath}: ${error.message}`));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Format error message
|
|
246
|
+
*/
|
|
247
|
+
static formatError(message, error) {
|
|
248
|
+
const lines = [];
|
|
249
|
+
lines.push(chalk_1.default.red.bold('✗ Error: ' + message));
|
|
250
|
+
if (error) {
|
|
251
|
+
lines.push('');
|
|
252
|
+
lines.push(chalk_1.default.red(error.message));
|
|
253
|
+
if (error.stack) {
|
|
254
|
+
lines.push('');
|
|
255
|
+
lines.push(chalk_1.default.gray(error.stack));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return lines.join('\n');
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Format success message
|
|
262
|
+
*/
|
|
263
|
+
static formatSuccess(message) {
|
|
264
|
+
return chalk_1.default.green.bold('✓ ' + message);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Format warning message
|
|
268
|
+
*/
|
|
269
|
+
static formatWarning(message) {
|
|
270
|
+
return chalk_1.default.yellow.bold('⚠ ' + message);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Format info message
|
|
274
|
+
*/
|
|
275
|
+
static formatInfo(message) {
|
|
276
|
+
return chalk_1.default.blue.bold('ℹ ' + message);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
exports.OutputFormatter = OutputFormatter;
|
|
280
|
+
//# sourceMappingURL=output-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-formatter.js","sourceRoot":"","sources":["../../src/utils/output-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Spinner management for CLI progress indication
|
|
3
|
+
* @module @memberjunction/testing-cli
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Spinner manager for CLI operations
|
|
7
|
+
*/
|
|
8
|
+
export declare class SpinnerManager {
|
|
9
|
+
private spinner;
|
|
10
|
+
/**
|
|
11
|
+
* Start a spinner with the given message
|
|
12
|
+
*/
|
|
13
|
+
start(message: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Update spinner message
|
|
16
|
+
*/
|
|
17
|
+
update(message: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Stop spinner with success message
|
|
20
|
+
*/
|
|
21
|
+
succeed(message?: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Stop spinner with failure message
|
|
24
|
+
*/
|
|
25
|
+
fail(message?: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Stop spinner with warning message
|
|
28
|
+
*/
|
|
29
|
+
warn(message?: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Stop spinner with info message
|
|
32
|
+
*/
|
|
33
|
+
info(message?: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Stop spinner without any message
|
|
36
|
+
*/
|
|
37
|
+
stop(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Check if spinner is currently running
|
|
40
|
+
*/
|
|
41
|
+
get isSpinning(): boolean;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=spinner-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner-manager.d.ts","sourceRoot":"","sources":["../../src/utils/spinner-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAoB;IAEnC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO5B;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM7B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO/B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;CACJ"}
|