@mockmaster/cli 1.0.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/dist/fs.d.ts +33 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +87 -0
- package/dist/fs.js.map +1 -0
- package/dist/generate.d.ts +10 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +68 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
package/dist/fs.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Scenario } from '@mockmaster/msw-adapter';
|
|
2
|
+
import type { ScenarioMetadata } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Ensures the scenarios directory exists
|
|
5
|
+
* @param scenariosDir - Path to scenarios directory
|
|
6
|
+
*/
|
|
7
|
+
export declare const ensureScenarioDir: (scenariosDir: string) => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Writes a scenario to the file system
|
|
10
|
+
* @param scenariosDir - Path to scenarios directory
|
|
11
|
+
* @param scenario - Scenario to write
|
|
12
|
+
*/
|
|
13
|
+
export declare const writeScenario: (scenariosDir: string, scenario: Scenario) => Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Reads a scenario from the file system
|
|
16
|
+
* @param scenariosDir - Path to scenarios directory
|
|
17
|
+
* @param scenarioName - Name of the scenario to read
|
|
18
|
+
* @returns The scenario or undefined if not found
|
|
19
|
+
*/
|
|
20
|
+
export declare const readScenario: (scenariosDir: string, scenarioName: string) => Promise<Scenario | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* Lists all scenarios in the scenarios directory
|
|
23
|
+
* @param scenariosDir - Path to scenarios directory
|
|
24
|
+
* @returns Array of scenario metadata
|
|
25
|
+
*/
|
|
26
|
+
export declare const listScenarios: (scenariosDir: string) => Promise<ScenarioMetadata[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Deletes a scenario from the file system
|
|
29
|
+
* @param scenariosDir - Path to scenarios directory
|
|
30
|
+
* @param scenarioName - Name of the scenario to delete
|
|
31
|
+
*/
|
|
32
|
+
export declare const deleteScenario: (scenariosDir: string, scenarioName: string) => Promise<void>;
|
|
33
|
+
//# sourceMappingURL=fs.d.ts.map
|
package/dist/fs.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,cAAc,MAAM,KAAG,OAAO,CAAC,IAAI,CAE1E,CAAA;AAYD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAU,cAAc,MAAM,EAAE,UAAU,QAAQ,KAAG,OAAO,CAAC,IAAI,CAK1F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,cAAc,MAAM,EACpB,cAAc,MAAM,KACnB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAU9B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAU,cAAc,MAAM,KAAG,OAAO,CAAC,gBAAgB,EAAE,CAgCpF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAU,cAAc,MAAM,EAAE,cAAc,MAAM,KAAG,OAAO,CAAC,IAAI,CAG7F,CAAA"}
|
package/dist/fs.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Pure functions for file system operations with scenarios
|
|
2
|
+
import * as fs from 'fs-extra';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { serializeScenario, deserializeScenario } from '@mockmaster/msw-adapter';
|
|
5
|
+
/**
|
|
6
|
+
* Ensures the scenarios directory exists
|
|
7
|
+
* @param scenariosDir - Path to scenarios directory
|
|
8
|
+
*/
|
|
9
|
+
export const ensureScenarioDir = async (scenariosDir) => {
|
|
10
|
+
await fs.ensureDir(scenariosDir);
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Gets the file path for a scenario
|
|
14
|
+
* @param scenariosDir - Path to scenarios directory
|
|
15
|
+
* @param scenarioName - Name of the scenario
|
|
16
|
+
* @returns Full path to scenario file
|
|
17
|
+
*/
|
|
18
|
+
const getScenarioPath = (scenariosDir, scenarioName) => {
|
|
19
|
+
return path.join(scenariosDir, `${scenarioName}.json`);
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Writes a scenario to the file system
|
|
23
|
+
* @param scenariosDir - Path to scenarios directory
|
|
24
|
+
* @param scenario - Scenario to write
|
|
25
|
+
*/
|
|
26
|
+
export const writeScenario = async (scenariosDir, scenario) => {
|
|
27
|
+
await ensureScenarioDir(scenariosDir);
|
|
28
|
+
const filePath = getScenarioPath(scenariosDir, scenario.name);
|
|
29
|
+
const serialized = serializeScenario(scenario);
|
|
30
|
+
await fs.writeFile(filePath, serialized, 'utf-8');
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Reads a scenario from the file system
|
|
34
|
+
* @param scenariosDir - Path to scenarios directory
|
|
35
|
+
* @param scenarioName - Name of the scenario to read
|
|
36
|
+
* @returns The scenario or undefined if not found
|
|
37
|
+
*/
|
|
38
|
+
export const readScenario = async (scenariosDir, scenarioName) => {
|
|
39
|
+
const filePath = getScenarioPath(scenariosDir, scenarioName);
|
|
40
|
+
const exists = await fs.pathExists(filePath);
|
|
41
|
+
if (!exists) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
45
|
+
return deserializeScenario(content);
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Lists all scenarios in the scenarios directory
|
|
49
|
+
* @param scenariosDir - Path to scenarios directory
|
|
50
|
+
* @returns Array of scenario metadata
|
|
51
|
+
*/
|
|
52
|
+
export const listScenarios = async (scenariosDir) => {
|
|
53
|
+
const exists = await fs.pathExists(scenariosDir);
|
|
54
|
+
if (!exists) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
const files = await fs.readdir(scenariosDir);
|
|
58
|
+
const jsonFiles = files.filter((file) => file.endsWith('.json'));
|
|
59
|
+
const metadata = [];
|
|
60
|
+
for (const file of jsonFiles) {
|
|
61
|
+
const filePath = path.join(scenariosDir, file);
|
|
62
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
63
|
+
const scenario = deserializeScenario(content);
|
|
64
|
+
const meta = {
|
|
65
|
+
name: scenario.name,
|
|
66
|
+
recordingsCount: scenario.recordings.length,
|
|
67
|
+
createdAt: scenario.createdAt,
|
|
68
|
+
updatedAt: scenario.updatedAt,
|
|
69
|
+
filePath,
|
|
70
|
+
};
|
|
71
|
+
if (scenario.description !== undefined) {
|
|
72
|
+
meta.description = scenario.description;
|
|
73
|
+
}
|
|
74
|
+
metadata.push(meta);
|
|
75
|
+
}
|
|
76
|
+
return metadata;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Deletes a scenario from the file system
|
|
80
|
+
* @param scenariosDir - Path to scenarios directory
|
|
81
|
+
* @param scenarioName - Name of the scenario to delete
|
|
82
|
+
*/
|
|
83
|
+
export const deleteScenario = async (scenariosDir, scenarioName) => {
|
|
84
|
+
const filePath = getScenarioPath(scenariosDir, scenarioName);
|
|
85
|
+
await fs.remove(filePath);
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=fs.js.map
|
package/dist/fs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,KAAK,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAGhF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,YAAoB,EAAiB,EAAE;IAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;AAClC,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,YAAoB,EAAE,YAAoB,EAAU,EAAE;IAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,YAAY,OAAO,CAAC,CAAA;AACxD,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,YAAoB,EAAE,QAAkB,EAAiB,EAAE;IAC7F,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7D,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;AACnD,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,YAAoB,EACpB,YAAoB,EACW,EAAE;IACjC,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IAE5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACpD,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,YAAoB,EAA+B,EAAE;IACvF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;IAChD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAEhE,MAAM,QAAQ,GAAuB,EAAE,CAAA;IAEvC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACpD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAE7C,MAAM,IAAI,GAAqB;YAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM;YAC3C,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,QAAQ;SACT,CAAA;QAED,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAA;QACzC,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,YAAoB,EAAE,YAAoB,EAAiB,EAAE;IAChG,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IAC5D,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC3B,CAAC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OpenAPISpec } from '@mockmaster/openapi';
|
|
2
|
+
import type { Scenario } from '@mockmaster/msw-adapter';
|
|
3
|
+
/**
|
|
4
|
+
* Generates scenarios from an OpenAPI specification
|
|
5
|
+
* @param spec - The OpenAPI specification
|
|
6
|
+
* @param scenarioName - Name for the generated scenario
|
|
7
|
+
* @returns Array of generated scenarios (currently returns one scenario with all operations)
|
|
8
|
+
*/
|
|
9
|
+
export declare const generateScenariosFromSpec: (spec: OpenAPISpec, scenarioName: string) => Scenario[];
|
|
10
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAqC,MAAM,yBAAyB,CAAA;AAE1F;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GAAI,MAAM,WAAW,EAAE,cAAc,MAAM,KAAG,QAAQ,EA0E3F,CAAA"}
|
package/dist/generate.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Pure functions for generating scenarios from OpenAPI specs
|
|
2
|
+
import { getAllOperations, generateFromSchema, resolveAllRefs } from '@mockmaster/openapi';
|
|
3
|
+
import { createScenario, createRecording, addRecordingToScenario } from '@mockmaster/msw-adapter';
|
|
4
|
+
/**
|
|
5
|
+
* Generates scenarios from an OpenAPI specification
|
|
6
|
+
* @param spec - The OpenAPI specification
|
|
7
|
+
* @param scenarioName - Name for the generated scenario
|
|
8
|
+
* @returns Array of generated scenarios (currently returns one scenario with all operations)
|
|
9
|
+
*/
|
|
10
|
+
export const generateScenariosFromSpec = (spec, scenarioName) => {
|
|
11
|
+
// Extract all operations from the spec
|
|
12
|
+
const operations = getAllOperations(spec);
|
|
13
|
+
// Get base URL from servers
|
|
14
|
+
const baseUrl = spec.servers && spec.servers.length > 0 && spec.servers[0]
|
|
15
|
+
? spec.servers[0].url
|
|
16
|
+
: 'https://api.example.com';
|
|
17
|
+
// Create description from spec info
|
|
18
|
+
let description = `Generated from ${spec.info.title} (${spec.info.version})`;
|
|
19
|
+
if (spec.info.description) {
|
|
20
|
+
description += `: ${spec.info.description}`;
|
|
21
|
+
}
|
|
22
|
+
// Create scenario
|
|
23
|
+
let scenario = createScenario(scenarioName, description);
|
|
24
|
+
// Generate recordings for each operation
|
|
25
|
+
for (const op of operations) {
|
|
26
|
+
// Check if operation has responses
|
|
27
|
+
if (!op.operation.responses) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// Get the first successful response (200-299)
|
|
31
|
+
const successResponse = Object.entries(op.operation.responses).find(([status]) => parseInt(status) >= 200 && parseInt(status) < 300);
|
|
32
|
+
if (!successResponse) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const [statusCode, responseObj] = successResponse;
|
|
36
|
+
const status = parseInt(statusCode);
|
|
37
|
+
// Get the response schema
|
|
38
|
+
const content = responseObj.content?.['application/json'];
|
|
39
|
+
if (!content || !content.schema) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Resolve any $refs in the schema
|
|
43
|
+
const resolvedSchema = resolveAllRefs(spec, content.schema);
|
|
44
|
+
// Generate mock data from the schema
|
|
45
|
+
const mockData = generateFromSchema(resolvedSchema);
|
|
46
|
+
// Create recorded request
|
|
47
|
+
const request = {
|
|
48
|
+
method: op.method.toUpperCase(),
|
|
49
|
+
url: `${baseUrl}${op.path}`,
|
|
50
|
+
path: op.path,
|
|
51
|
+
timestamp: Date.now(),
|
|
52
|
+
};
|
|
53
|
+
// Create recorded response
|
|
54
|
+
const response = {
|
|
55
|
+
status,
|
|
56
|
+
body: mockData,
|
|
57
|
+
headers: {
|
|
58
|
+
'Content-Type': 'application/json',
|
|
59
|
+
},
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
};
|
|
62
|
+
// Create recording and add to scenario
|
|
63
|
+
const recording = createRecording(request, response);
|
|
64
|
+
scenario = addRecordingToScenario(scenario, recording);
|
|
65
|
+
}
|
|
66
|
+
return [scenario];
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,cAAc,SAAS,CAAA;AACvB,cAAc,MAAM,CAAA;AACpB,cAAc,YAAY,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
// CLI exports for programmatic use
|
|
4
|
+
export * from './types';
|
|
5
|
+
export * from './fs';
|
|
6
|
+
export * from './generate';
|
|
7
|
+
// CLI entry point - will be fully implemented in Phase 7
|
|
8
|
+
if (require.main === module) {
|
|
9
|
+
console.log('mock-master CLI v0.0.0');
|
|
10
|
+
console.log('');
|
|
11
|
+
console.log('Commands:');
|
|
12
|
+
console.log(' generate <spec> Generate mocks from OpenAPI spec');
|
|
13
|
+
console.log(' list List all scenarios');
|
|
14
|
+
console.log(' delete <name> Delete a scenario');
|
|
15
|
+
console.log('');
|
|
16
|
+
console.log('Full interactive CLI coming in Phase 7!');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,+BAA+B;AAE/B,mCAAmC;AACnC,cAAc,SAAS,CAAA;AACvB,cAAc,MAAM,CAAA;AACpB,cAAc,YAAY,CAAA;AAE1B,yDAAyD;AACzD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACxB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;IAClE,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;IACpD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;AACxD,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Master configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface MockMasterConfig {
|
|
5
|
+
/**
|
|
6
|
+
* Directory where scenarios are stored
|
|
7
|
+
*/
|
|
8
|
+
scenariosDir: string;
|
|
9
|
+
/**
|
|
10
|
+
* Default base URL for recording
|
|
11
|
+
*/
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
/**
|
|
14
|
+
* OpenAPI spec paths to generate from
|
|
15
|
+
*/
|
|
16
|
+
specs?: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Options for generating mocks from OpenAPI spec
|
|
20
|
+
*/
|
|
21
|
+
export interface GenerateOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Path to OpenAPI spec file
|
|
24
|
+
*/
|
|
25
|
+
specPath: string;
|
|
26
|
+
/**
|
|
27
|
+
* Output directory for generated mocks
|
|
28
|
+
*/
|
|
29
|
+
outputDir: string;
|
|
30
|
+
/**
|
|
31
|
+
* Scenario name
|
|
32
|
+
*/
|
|
33
|
+
scenarioName: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Options for listing scenarios
|
|
37
|
+
*/
|
|
38
|
+
export interface ListOptions {
|
|
39
|
+
/**
|
|
40
|
+
* Scenarios directory
|
|
41
|
+
*/
|
|
42
|
+
scenariosDir: string;
|
|
43
|
+
/**
|
|
44
|
+
* Show detailed information
|
|
45
|
+
*/
|
|
46
|
+
verbose?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Scenario metadata for listing
|
|
50
|
+
*/
|
|
51
|
+
export interface ScenarioMetadata {
|
|
52
|
+
name: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
recordingsCount: number;
|
|
55
|
+
createdAt: number;
|
|
56
|
+
updatedAt: number;
|
|
57
|
+
filePath: string;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8BAA8B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mockmaster/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool for mock-master",
|
|
5
|
+
"bin": {
|
|
6
|
+
"mock-master": "./dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"cli",
|
|
15
|
+
"mock",
|
|
16
|
+
"tool"
|
|
17
|
+
],
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"commander": "^11.1.0",
|
|
21
|
+
"chalk": "^5.3.0",
|
|
22
|
+
"inquirer": "^9.2.12",
|
|
23
|
+
"ora": "^8.0.1",
|
|
24
|
+
"fs-extra": "^11.2.0",
|
|
25
|
+
"@mockmaster/core": "1.0.0",
|
|
26
|
+
"@mockmaster/openapi": "1.0.0",
|
|
27
|
+
"@mockmaster/msw-adapter": "1.0.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^20.11.0",
|
|
31
|
+
"@types/inquirer": "^9.0.7",
|
|
32
|
+
"@types/fs-extra": "^11.0.4",
|
|
33
|
+
"@vitest/coverage-v8": "^1.2.0",
|
|
34
|
+
"typescript": "^5.3.3",
|
|
35
|
+
"vitest": "^1.2.0"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc",
|
|
39
|
+
"dev": "tsc --watch",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"test:watch": "vitest",
|
|
42
|
+
"test:coverage": "vitest run --coverage",
|
|
43
|
+
"lint": "eslint src --ext .ts",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"clean": "rm -rf dist"
|
|
46
|
+
}
|
|
47
|
+
}
|