heicat-cli 0.1.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/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const init_1 = require("./commands/init");
6
+ const validate_1 = require("./commands/validate");
7
+ const status_1 = require("./commands/status");
8
+ const watch_1 = require("./commands/watch");
9
+ const test_1 = require("./commands/test");
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('heicat')
13
+ .description('Runtime-enforced API contract system for Node.js')
14
+ .version('0.1.0');
15
+ program
16
+ .command('init')
17
+ .description('Initialize contract studio in your project')
18
+ .option('--contracts-path <path>', 'Path to contracts directory', './contracts')
19
+ .action(init_1.initCommand);
20
+ program
21
+ .command('validate')
22
+ .description('Validate contracts in your project')
23
+ .option('--contracts-path <path>', 'Path to contracts directory', './contracts')
24
+ .action(validate_1.validateCommand);
25
+ program
26
+ .command('status')
27
+ .description('Show contract validation status')
28
+ .option('--contracts-path <path>', 'Path to contracts directory', './contracts')
29
+ .action(status_1.statusCommand);
30
+ program
31
+ .command('watch')
32
+ .description('Watch contracts and start local GUI server')
33
+ .option('--contracts-path <path>', 'Path to contracts directory', './contracts')
34
+ .option('--port <port>', 'Port for GUI server', '3333')
35
+ .action(watch_1.watchCommand);
36
+ program
37
+ .command('test')
38
+ .description('Test contracts against a running server')
39
+ .argument('<url>', 'Server URL to test against')
40
+ .option('--contracts-path <path>', 'Path to contracts directory', './contracts')
41
+ .action(test_1.testCommand);
42
+ program.parse();
43
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,kDAAsD;AACtD,8CAAkD;AAClD,4CAAgD;AAChD,0CAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,yBAAyB,EAAE,6BAA6B,EAAE,aAAa,CAAC;KAC/E,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,yBAAyB,EAAE,6BAA6B,EAAE,aAAa,CAAC;KAC/E,MAAM,CAAC,0BAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,yBAAyB,EAAE,6BAA6B,EAAE,aAAa,CAAC;KAC/E,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,yBAAyB,EAAE,6BAA6B,EAAE,aAAa,CAAC;KAC/E,MAAM,CAAC,eAAe,EAAE,qBAAqB,EAAE,MAAM,CAAC;KACtD,MAAM,CAAC,oBAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yCAAyC,CAAC;KACtD,QAAQ,CAAC,OAAO,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,yBAAyB,EAAE,6BAA6B,EAAE,aAAa,CAAC;KAC/E,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function initCommand(options: {
2
+ contractsPath: string;
3
+ }): void;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,QAiG7D"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initCommand = initCommand;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ function initCommand(options) {
11
+ const contractsPath = (0, path_1.resolve)(process.cwd(), options.contractsPath);
12
+ try {
13
+ // Create contracts directory
14
+ (0, fs_1.mkdirSync)(contractsPath, { recursive: true });
15
+ console.log(chalk_1.default.green(`✅ Created contracts directory: ${contractsPath}`));
16
+ // Create example contracts
17
+ const usersContract = {
18
+ method: 'POST',
19
+ path: '/users',
20
+ auth: 'jwt',
21
+ request: {
22
+ body: {
23
+ email: { type: 'string', required: true },
24
+ password: { type: 'string', minLength: 8, required: true },
25
+ name: { type: 'string' }
26
+ }
27
+ },
28
+ response: {
29
+ 201: {
30
+ id: { type: 'string' },
31
+ email: { type: 'string' },
32
+ name: { type: 'string' },
33
+ createdAt: { type: 'string' }
34
+ }
35
+ },
36
+ errors: {
37
+ 400: {
38
+ message: { type: 'string' }
39
+ },
40
+ 409: {
41
+ message: { type: 'string' }
42
+ }
43
+ }
44
+ };
45
+ const authContract = {
46
+ method: 'POST',
47
+ path: '/auth/login',
48
+ request: {
49
+ body: {
50
+ email: { type: 'string', required: true },
51
+ password: { type: 'string', required: true }
52
+ }
53
+ },
54
+ response: {
55
+ 200: {
56
+ token: { type: 'string' },
57
+ user: {
58
+ id: { type: 'string' },
59
+ email: { type: 'string' }
60
+ }
61
+ }
62
+ },
63
+ errors: {
64
+ 401: {
65
+ message: { type: 'string' }
66
+ }
67
+ }
68
+ };
69
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(contractsPath, 'users.contract.json'), JSON.stringify(usersContract, null, 2));
70
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(contractsPath, 'auth.contract.json'), JSON.stringify(authContract, null, 2));
71
+ console.log(chalk_1.default.green('✅ Created example contracts:'));
72
+ console.log(chalk_1.default.gray(' - users.contract.json'));
73
+ console.log(chalk_1.default.gray(' - auth.contract.json'));
74
+ // Check if package.json exists and suggest middleware setup
75
+ const packageJsonPath = (0, path_1.resolve)(process.cwd(), 'package.json');
76
+ let hasPackageJson = false;
77
+ try {
78
+ require(packageJsonPath);
79
+ hasPackageJson = true;
80
+ }
81
+ catch { }
82
+ if (hasPackageJson) {
83
+ console.log('\n' + chalk_1.default.blue('📝 Next steps:'));
84
+ console.log(chalk_1.default.gray('1. Install the core package: npm install @heicat/core'));
85
+ console.log(chalk_1.default.gray('2. Add middleware to your Express app:'));
86
+ console.log(chalk_1.default.gray(' const { contractMiddleware } = require("@heicat/core");'));
87
+ console.log(chalk_1.default.gray(' app.use(contractMiddleware({ contractsPath: "./contracts", mode: "dev" }));'));
88
+ }
89
+ }
90
+ catch (error) {
91
+ console.error(chalk_1.default.red('❌ Failed to initialize contract studio:'), error);
92
+ process.exit(1);
93
+ }
94
+ }
95
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function statusCommand(options: {
2
+ contractsPath: string;
3
+ }): void;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,QAoE/D"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.statusCommand = statusCommand;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ function statusCommand(options) {
11
+ const contractsPath = (0, path_1.resolve)(process.cwd(), options.contractsPath);
12
+ try {
13
+ const files = (0, fs_1.readdirSync)(contractsPath)
14
+ .filter(file => (0, path_1.extname)(file) === '.json' && file.endsWith('.contract.json'));
15
+ if (files.length === 0) {
16
+ console.log(chalk_1.default.yellow('⚠️ No contract files found in'), contractsPath);
17
+ return;
18
+ }
19
+ const contracts = [];
20
+ const methods = new Set();
21
+ const paths = new Set();
22
+ for (const file of files) {
23
+ const filePath = (0, path_1.resolve)(contractsPath, file);
24
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
25
+ try {
26
+ const contract = JSON.parse(content);
27
+ contracts.push(contract);
28
+ if (contract.method)
29
+ methods.add(contract.method.toUpperCase());
30
+ if (contract.path)
31
+ paths.add(contract.path);
32
+ }
33
+ catch (error) {
34
+ // Skip invalid contracts
35
+ }
36
+ }
37
+ console.log(chalk_1.default.blue('📊 Heicat Status'));
38
+ console.log(chalk_1.default.gray('─'.repeat(40)));
39
+ console.log(chalk_1.default.green(`📁 Contracts: ${contracts.length}`));
40
+ console.log(chalk_1.default.green(`🔗 Endpoints: ${contracts.length}`));
41
+ console.log(chalk_1.default.green(`📋 Methods: ${Array.from(methods).join(', ')}`));
42
+ // Group by method
43
+ const byMethod = contracts.reduce((acc, contract) => {
44
+ const method = contract.method.toUpperCase();
45
+ if (!acc[method])
46
+ acc[method] = [];
47
+ acc[method].push(contract.path);
48
+ return acc;
49
+ }, {});
50
+ console.log('\n' + chalk_1.default.blue('📋 Endpoints by Method:'));
51
+ for (const [method, paths] of Object.entries(byMethod)) {
52
+ console.log(chalk_1.default.gray(` ${method}: ${paths.length} endpoint${paths.length !== 1 ? 's' : ''}`));
53
+ paths.forEach(path => console.log(chalk_1.default.gray(` ${path}`)));
54
+ }
55
+ // Check for potential issues
56
+ const duplicatePaths = contracts
57
+ .map(c => `${c.method.toUpperCase()} ${c.path}`)
58
+ .filter((item, index, arr) => arr.indexOf(item) !== index);
59
+ if (duplicatePaths.length > 0) {
60
+ console.log('\n' + chalk_1.default.yellow('⚠️ Potential Issues:'));
61
+ console.log(chalk_1.default.yellow(' Duplicate endpoints found:'));
62
+ duplicatePaths.forEach(path => console.log(chalk_1.default.yellow(` ${path}`)));
63
+ }
64
+ }
65
+ catch (error) {
66
+ console.error(chalk_1.default.red('❌ Failed to read contract status:'), error);
67
+ process.exit(1);
68
+ }
69
+ }
70
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function testCommand(url: string, options: {
2
+ contractsPath: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAcA,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,iBAmFhF"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.testCommand = testCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ async function testCommand(url, options) {
11
+ const contractsPath = (0, path_1.resolve)(process.cwd(), options.contractsPath);
12
+ const baseUrl = url.replace(/\/$/, ''); // Remove trailing slash
13
+ console.log(chalk_1.default.blue('🧪 Testing Contracts Against Server'));
14
+ console.log(chalk_1.default.gray(`📍 Server: ${baseUrl}`));
15
+ console.log(chalk_1.default.gray(`📁 Contracts: ${contractsPath}`));
16
+ console.log('');
17
+ try {
18
+ // Load contracts
19
+ const files = (0, fs_1.readdirSync)(contractsPath)
20
+ .filter(file => (0, path_1.extname)(file) === '.json' && file.endsWith('.contract.json'));
21
+ if (files.length === 0) {
22
+ console.log(chalk_1.default.yellow('⚠️ No contract files found'));
23
+ return;
24
+ }
25
+ const contracts = [];
26
+ for (const file of files) {
27
+ const filePath = (0, path_1.resolve)(contractsPath, file);
28
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
29
+ contracts.push(JSON.parse(content));
30
+ }
31
+ console.log(chalk_1.default.blue(`📋 Testing ${contracts.length} contract${contracts.length !== 1 ? 's' : ''}`));
32
+ console.log('');
33
+ const results = [];
34
+ for (const contract of contracts) {
35
+ const endpoint = `${contract.method} ${contract.path}`;
36
+ console.log(chalk_1.default.gray(`Testing: ${endpoint}`));
37
+ try {
38
+ const result = await testContract(baseUrl, contract);
39
+ results.push(result);
40
+ if (result.success) {
41
+ console.log(chalk_1.default.green(` ✅ ${endpoint} (${result.responseTime}ms)`));
42
+ }
43
+ else {
44
+ console.log(chalk_1.default.red(` ❌ ${endpoint}: ${result.error}`));
45
+ }
46
+ }
47
+ catch (error) {
48
+ const errorMsg = error instanceof Error ? error.message : 'Unknown error';
49
+ results.push({
50
+ contract: contract.path,
51
+ endpoint,
52
+ success: false,
53
+ error: errorMsg
54
+ });
55
+ console.log(chalk_1.default.red(` ❌ ${endpoint}: ${errorMsg}`));
56
+ }
57
+ }
58
+ // Summary
59
+ console.log('');
60
+ console.log(chalk_1.default.blue('📊 Test Results'));
61
+ console.log(chalk_1.default.gray('─'.repeat(40)));
62
+ const passed = results.filter(r => r.success).length;
63
+ const failed = results.filter(r => !r.success).length;
64
+ console.log(chalk_1.default.green(`✅ Passed: ${passed}`));
65
+ console.log(chalk_1.default.red(`❌ Failed: ${failed}`));
66
+ if (failed > 0) {
67
+ console.log('');
68
+ console.log(chalk_1.default.red('❌ Failed Tests:'));
69
+ results.filter(r => !r.success).forEach(result => {
70
+ console.log(chalk_1.default.red(` • ${result.endpoint}: ${result.error}`));
71
+ });
72
+ process.exit(1);
73
+ }
74
+ else {
75
+ console.log('');
76
+ console.log(chalk_1.default.green('🎉 All contract tests passed!'));
77
+ }
78
+ }
79
+ catch (error) {
80
+ console.error(chalk_1.default.red('❌ Test failed:'), error);
81
+ process.exit(1);
82
+ }
83
+ }
84
+ async function testContract(baseUrl, contract) {
85
+ const startTime = Date.now();
86
+ const endpoint = `${contract.method} ${contract.path}`;
87
+ try {
88
+ // For now, just test that the endpoint exists and returns valid JSON
89
+ // In a real implementation, this would test the full contract validation
90
+ const url = `${baseUrl}${contract.path}`;
91
+ const response = await fetch(url, {
92
+ method: contract.method,
93
+ headers: {
94
+ 'Content-Type': 'application/json',
95
+ },
96
+ // For POST requests, send minimal valid body if defined
97
+ body: contract.method === 'POST' && contract.request?.body
98
+ ? JSON.stringify(createMinimalBody(contract.request.body))
99
+ : undefined
100
+ });
101
+ const responseTime = Date.now() - startTime;
102
+ if (!response.ok) {
103
+ return {
104
+ contract: contract.path,
105
+ endpoint,
106
+ success: false,
107
+ error: `HTTP ${response.status}: ${response.statusText}`,
108
+ responseTime
109
+ };
110
+ }
111
+ // Try to parse JSON response
112
+ try {
113
+ const data = await response.json();
114
+ return {
115
+ contract: contract.path,
116
+ endpoint,
117
+ success: true,
118
+ responseTime
119
+ };
120
+ }
121
+ catch {
122
+ return {
123
+ contract: contract.path,
124
+ endpoint,
125
+ success: false,
126
+ error: 'Response is not valid JSON',
127
+ responseTime
128
+ };
129
+ }
130
+ }
131
+ catch (error) {
132
+ const responseTime = Date.now() - startTime;
133
+ const errorMsg = error instanceof Error ? error.message : 'Network error';
134
+ return {
135
+ contract: contract.path,
136
+ endpoint,
137
+ success: false,
138
+ error: errorMsg,
139
+ responseTime
140
+ };
141
+ }
142
+ }
143
+ function createMinimalBody(schema) {
144
+ const body = {};
145
+ for (const [key, fieldSchema] of Object.entries(schema)) {
146
+ if (typeof fieldSchema === 'object' && fieldSchema.type) {
147
+ if (fieldSchema.required === false)
148
+ continue;
149
+ switch (fieldSchema.type) {
150
+ case 'string':
151
+ body[key] = fieldSchema.minLength ? 'a'.repeat(fieldSchema.minLength) : 'test';
152
+ break;
153
+ case 'number':
154
+ body[key] = fieldSchema.minimum || 1;
155
+ break;
156
+ case 'boolean':
157
+ body[key] = true;
158
+ break;
159
+ default:
160
+ body[key] = 'test';
161
+ }
162
+ }
163
+ }
164
+ return body;
165
+ }
166
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function validateCommand(options: {
2
+ contractsPath: string;
3
+ }): void;
4
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,QAkEjE"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateCommand = validateCommand;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ function validateCommand(options) {
11
+ const contractsPath = (0, path_1.resolve)(process.cwd(), options.contractsPath);
12
+ try {
13
+ const files = (0, fs_1.readdirSync)(contractsPath)
14
+ .filter(file => (0, path_1.extname)(file) === '.json' && file.endsWith('.contract.json'));
15
+ if (files.length === 0) {
16
+ console.log(chalk_1.default.yellow('⚠️ No contract files found in'), contractsPath);
17
+ return;
18
+ }
19
+ let validCount = 0;
20
+ let invalidCount = 0;
21
+ for (const file of files) {
22
+ const filePath = (0, path_1.resolve)(contractsPath, file);
23
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
24
+ try {
25
+ const contract = JSON.parse(content);
26
+ // Basic validation
27
+ const errors = [];
28
+ if (!contract.method) {
29
+ errors.push('Missing required field: method');
30
+ }
31
+ if (!contract.path) {
32
+ errors.push('Missing required field: path');
33
+ }
34
+ if (contract.method && typeof contract.method !== 'string') {
35
+ errors.push('Method must be a string');
36
+ }
37
+ if (contract.path && typeof contract.path !== 'string') {
38
+ errors.push('Path must be a string');
39
+ }
40
+ if (errors.length > 0) {
41
+ console.log(chalk_1.default.red(`❌ ${file}:`));
42
+ errors.forEach(error => console.log(chalk_1.default.red(` ${error}`)));
43
+ invalidCount++;
44
+ }
45
+ else {
46
+ console.log(chalk_1.default.green(`✅ ${file}`));
47
+ validCount++;
48
+ }
49
+ }
50
+ catch (error) {
51
+ console.log(chalk_1.default.red(`❌ ${file}: Invalid JSON`));
52
+ invalidCount++;
53
+ }
54
+ }
55
+ console.log('\n' + chalk_1.default.blue(`📊 Summary: ${validCount} valid, ${invalidCount} invalid`));
56
+ if (invalidCount > 0) {
57
+ process.exit(1);
58
+ }
59
+ }
60
+ catch (error) {
61
+ console.error(chalk_1.default.red('❌ Failed to validate contracts:'), error);
62
+ process.exit(1);
63
+ }
64
+ }
65
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function watchCommand(options: {
2
+ contractsPath: string;
3
+ port: string;
4
+ }): void;
5
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,QAsE5E"}