dispatch-deploy 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/README.md +86 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +148 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +15 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +107 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +107 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/deploy.d.ts +9 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +275 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +34 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +15 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +6 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +129 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/poll.d.ts +10 -0
- package/dist/commands/poll.d.ts.map +1 -0
- package/dist/commands/poll.js +72 -0
- package/dist/commands/poll.js.map +1 -0
- package/dist/commands/projects.d.ts +5 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +49 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/register.d.ts +5 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +46 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/trigger.d.ts +11 -0
- package/dist/commands/trigger.d.ts.map +1 -0
- package/dist/commands/trigger.js +52 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/config/runtime.d.ts +18 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/runtime.js +32 -0
- package/dist/config/runtime.js.map +1 -0
- package/dist/services/auth.d.ts +18 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +122 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/builder.d.ts +4 -0
- package/dist/services/builder.d.ts.map +1 -0
- package/dist/services/builder.js +89 -0
- package/dist/services/builder.js.map +1 -0
- package/dist/services/controlPlane.d.ts +16 -0
- package/dist/services/controlPlane.d.ts.map +1 -0
- package/dist/services/controlPlane.js +155 -0
- package/dist/services/controlPlane.js.map +1 -0
- package/dist/services/deployer.d.ts +2 -0
- package/dist/services/deployer.d.ts.map +1 -0
- package/dist/services/deployer.js +49 -0
- package/dist/services/deployer.js.map +1 -0
- package/dist/services/project.d.ts +9 -0
- package/dist/services/project.d.ts.map +1 -0
- package/dist/services/project.js +29 -0
- package/dist/services/project.js.map +1 -0
- package/dist/services/sourceUploader.d.ts +9 -0
- package/dist/services/sourceUploader.d.ts.map +1 -0
- package/dist/services/sourceUploader.js +250 -0
- package/dist/services/sourceUploader.js.map +1 -0
- package/dist/services/uploader.d.ts +2 -0
- package/dist/services/uploader.d.ts.map +1 -0
- package/dist/services/uploader.js +59 -0
- package/dist/services/uploader.js.map +1 -0
- package/dist/types/deployment.d.ts +43 -0
- package/dist/types/deployment.d.ts.map +1 -0
- package/dist/types/deployment.js +6 -0
- package/dist/types/deployment.js.map +1 -0
- package/dist/types.d.ts +53 -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.d.ts +17 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +85 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/credentials.d.ts +16 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +72 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/debug.d.ts +7 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +21 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/input.d.ts +3 -0
- package/dist/utils/input.d.ts.map +1 -0
- package/dist/utils/input.js +94 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/loader.d.ts +22 -0
- package/dist/utils/loader.d.ts.map +1 -0
- package/dist/utils/loader.js +139 -0
- package/dist/utils/loader.js.map +1 -0
- package/dist/utils/normalizer.d.ts +10 -0
- package/dist/utils/normalizer.d.ts.map +1 -0
- package/dist/utils/normalizer.js +115 -0
- package/dist/utils/normalizer.js.map +1 -0
- package/dist/utils/safety.d.ts +18 -0
- package/dist/utils/safety.d.ts.map +1 -0
- package/dist/utils/safety.js +140 -0
- package/dist/utils/safety.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for deployment-related entities
|
|
3
|
+
*/
|
|
4
|
+
export interface DeploymentConfig {
|
|
5
|
+
projectName: string;
|
|
6
|
+
runtime: string;
|
|
7
|
+
region?: string;
|
|
8
|
+
handler?: string;
|
|
9
|
+
architecture?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DeploymentRequest {
|
|
12
|
+
projectId: string;
|
|
13
|
+
projectName: string;
|
|
14
|
+
runtime: string;
|
|
15
|
+
openApiSpec: any;
|
|
16
|
+
safetyFindings: any[];
|
|
17
|
+
handler?: string;
|
|
18
|
+
architecture?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface DeploymentResponse {
|
|
21
|
+
deploymentId: string;
|
|
22
|
+
uploadUrl?: string;
|
|
23
|
+
status: 'pending' | 'building' | 'iam-setup' | 'lambda-deploying' | 'lambda-verifying' | 'api-setup' | 'api-verifying' | 'finalizing' | 'deploying' | 'live' | 'blocked' | 'failed';
|
|
24
|
+
}
|
|
25
|
+
export interface DeploymentStatus {
|
|
26
|
+
deploymentId: string;
|
|
27
|
+
status: 'pending' | 'building' | 'iam-setup' | 'lambda-deploying' | 'lambda-verifying' | 'api-setup' | 'api-verifying' | 'finalizing' | 'deploying' | 'live' | 'blocked' | 'failed';
|
|
28
|
+
url?: string;
|
|
29
|
+
error?: string;
|
|
30
|
+
findings?: any[];
|
|
31
|
+
build_logs?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface BuildArtifact {
|
|
34
|
+
zipPath: string;
|
|
35
|
+
size: number;
|
|
36
|
+
hash: string;
|
|
37
|
+
}
|
|
38
|
+
export interface User {
|
|
39
|
+
id: string;
|
|
40
|
+
email: string;
|
|
41
|
+
token: string;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=deployment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../src/types/deployment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC;IACjB,cAAc,EAAE,GAAG,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,WAAW,GAAG,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;CACrL;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,WAAW,GAAG,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/types/deployment.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the Dispatch safety engine.
|
|
3
|
+
* These mirror the Python implementation from dispatch-build-system.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Normalized operation from OpenAPI spec
|
|
7
|
+
*/
|
|
8
|
+
export interface NormalizedOperation {
|
|
9
|
+
method: string;
|
|
10
|
+
path: string;
|
|
11
|
+
has_request_body: boolean;
|
|
12
|
+
has_path_params: boolean;
|
|
13
|
+
security: string[];
|
|
14
|
+
is_public_override: boolean;
|
|
15
|
+
public_reason: string | null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Safety finding from evaluation
|
|
19
|
+
*/
|
|
20
|
+
export interface SafetyFinding {
|
|
21
|
+
route: string;
|
|
22
|
+
method: string;
|
|
23
|
+
severity: 'block' | 'warn';
|
|
24
|
+
message: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Summary of safety findings
|
|
28
|
+
*/
|
|
29
|
+
export interface FindingSummary {
|
|
30
|
+
block: number;
|
|
31
|
+
warn: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* OpenAPI specification (simplified)
|
|
35
|
+
*/
|
|
36
|
+
export interface OpenAPISpec {
|
|
37
|
+
openapi: string;
|
|
38
|
+
info: {
|
|
39
|
+
title: string;
|
|
40
|
+
version: string;
|
|
41
|
+
description?: string;
|
|
42
|
+
};
|
|
43
|
+
paths: {
|
|
44
|
+
[path: string]: {
|
|
45
|
+
[method: string]: any;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
security?: Array<{
|
|
49
|
+
[key: string]: string[];
|
|
50
|
+
}>;
|
|
51
|
+
components?: any;
|
|
52
|
+
}
|
|
53
|
+
//# 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,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;SACvB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC9C,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB"}
|
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,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project configuration loader
|
|
3
|
+
*
|
|
4
|
+
* Loads dispatch.yaml configuration file
|
|
5
|
+
*/
|
|
6
|
+
import { DeploymentConfig } from '../types/deployment';
|
|
7
|
+
/**
|
|
8
|
+
* Load project configuration from dispatch.yaml
|
|
9
|
+
*
|
|
10
|
+
* Requires dispatch.yaml to exist - no defaults
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadConfig(projectRoot?: string): DeploymentConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Validate project configuration
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateConfig(config: DeploymentConfig): void;
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,GAAE,MAAY,GAAG,gBAAgB,CA2BtE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAQ7D"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Project configuration loader
|
|
4
|
+
*
|
|
5
|
+
* Loads dispatch.yaml configuration file
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.loadConfig = loadConfig;
|
|
42
|
+
exports.validateConfig = validateConfig;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const yaml = __importStar(require("js-yaml"));
|
|
46
|
+
/**
|
|
47
|
+
* Load project configuration from dispatch.yaml
|
|
48
|
+
*
|
|
49
|
+
* Requires dispatch.yaml to exist - no defaults
|
|
50
|
+
*/
|
|
51
|
+
function loadConfig(projectRoot = '.') {
|
|
52
|
+
const configPath = path.join(projectRoot, 'dispatch.yaml');
|
|
53
|
+
// Check if dispatch.yaml exists
|
|
54
|
+
if (!fs.existsSync(configPath)) {
|
|
55
|
+
throw new Error(`dispatch.yaml not found in ${path.resolve(projectRoot)}\n` +
|
|
56
|
+
'Please create a dispatch.yaml file with your project configuration.\n' +
|
|
57
|
+
'Example:\n' +
|
|
58
|
+
' projectName: my-api\n' +
|
|
59
|
+
' runtime: python3.11\n' +
|
|
60
|
+
' handler: app.handler\n' +
|
|
61
|
+
' architecture: x86_64 # arm64 coming soon');
|
|
62
|
+
}
|
|
63
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
64
|
+
const config = yaml.load(content);
|
|
65
|
+
console.log('Loaded config:', JSON.stringify(config, null, 2));
|
|
66
|
+
return {
|
|
67
|
+
projectName: config.projectName || config.project || config.name || path.basename(path.resolve(projectRoot)),
|
|
68
|
+
runtime: config.runtime,
|
|
69
|
+
region: config.region || 'eu-west-2',
|
|
70
|
+
handler: config.handler || 'lambda_adapter.handler',
|
|
71
|
+
architecture: config.architecture || 'x86_64',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validate project configuration
|
|
76
|
+
*/
|
|
77
|
+
function validateConfig(config) {
|
|
78
|
+
if (!config.projectName || config.projectName.length === 0) {
|
|
79
|
+
throw new Error('Project name is required');
|
|
80
|
+
}
|
|
81
|
+
if (!config.runtime || config.runtime.length === 0) {
|
|
82
|
+
throw new Error('Runtime is required');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,gCA2BC;AAKD,wCAQC;AAlDD,uCAAyB;AACzB,2CAA6B;AAC7B,8CAAgC;AAGhC;;;;GAIG;AACH,SAAgB,UAAU,CAAC,cAAsB,GAAG;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAE3D,gCAAgC;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;YAC3D,uEAAuE;YACvE,YAAY;YACZ,yBAAyB;YACzB,yBAAyB;YACzB,0BAA0B;YAC1B,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAQ,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5G,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,WAAW;QACpC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;QACnD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,QAAQ;KAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAwB;IACrD,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface Credentials {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
user?: {
|
|
6
|
+
id: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
tier?: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function saveCredentials(credentials: Credentials): void;
|
|
12
|
+
export declare function getCredentials(): Credentials | null;
|
|
13
|
+
export declare function clearCredentials(): void;
|
|
14
|
+
export declare function getToken(): string | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAOA,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,QAKvD;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAUnD;AAED,wBAAgB,gBAAgB,SAI/B;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAGxC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.saveCredentials = saveCredentials;
|
|
37
|
+
exports.getCredentials = getCredentials;
|
|
38
|
+
exports.clearCredentials = clearCredentials;
|
|
39
|
+
exports.getToken = getToken;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const CONFIG_DIR = path.join(os.homedir(), '.dispatch');
|
|
44
|
+
const CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');
|
|
45
|
+
function saveCredentials(credentials) {
|
|
46
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
47
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2));
|
|
50
|
+
}
|
|
51
|
+
function getCredentials() {
|
|
52
|
+
if (!fs.existsSync(CREDENTIALS_FILE)) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');
|
|
57
|
+
return JSON.parse(content);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function clearCredentials() {
|
|
64
|
+
if (fs.existsSync(CREDENTIALS_FILE)) {
|
|
65
|
+
fs.unlinkSync(CREDENTIALS_FILE);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function getToken() {
|
|
69
|
+
const creds = getCredentials();
|
|
70
|
+
return creds?.accessToken || null;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,0CAKC;AAED,wCAUC;AAED,4CAIC;AAED,4BAGC;AA9CD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAanE,SAAgB,eAAe,CAAC,WAAwB;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAgB,cAAc;IAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB;IAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAgB,QAAQ;IACtB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,OAAO,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,QAE/C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,QAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,QAItC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Debug logging utility
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setDebugEnabled = setDebugEnabled;
|
|
7
|
+
exports.isDebugEnabled = isDebugEnabled;
|
|
8
|
+
exports.debugLog = debugLog;
|
|
9
|
+
let debugEnabled = false;
|
|
10
|
+
function setDebugEnabled(enabled) {
|
|
11
|
+
debugEnabled = enabled;
|
|
12
|
+
}
|
|
13
|
+
function isDebugEnabled() {
|
|
14
|
+
return debugEnabled;
|
|
15
|
+
}
|
|
16
|
+
function debugLog(...args) {
|
|
17
|
+
if (debugEnabled) {
|
|
18
|
+
console.log('[DEBUG]', ...args);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAIH,0CAEC;AAED,wCAEC;AAED,4BAIC;AAdD,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,SAAgB,eAAe,CAAC,OAAgB;IAC9C,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAG,IAAW;IACrC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/utils/input.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkD1D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.askQuestion = askQuestion;
|
|
37
|
+
exports.askPassword = askPassword;
|
|
38
|
+
const readline = __importStar(require("readline"));
|
|
39
|
+
function askQuestion(query) {
|
|
40
|
+
const rl = readline.createInterface({
|
|
41
|
+
input: process.stdin,
|
|
42
|
+
output: process.stdout,
|
|
43
|
+
});
|
|
44
|
+
return new Promise(resolve => rl.question(query, ans => {
|
|
45
|
+
rl.close();
|
|
46
|
+
resolve(ans);
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
function askPassword(query) {
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
const rl = readline.createInterface({
|
|
52
|
+
input: process.stdin,
|
|
53
|
+
output: process.stdout,
|
|
54
|
+
});
|
|
55
|
+
// Mute output for password
|
|
56
|
+
const stdin = process.stdin;
|
|
57
|
+
let password = '';
|
|
58
|
+
process.stdout.write(query);
|
|
59
|
+
// Listen to keypress events
|
|
60
|
+
stdin.setRawMode(true);
|
|
61
|
+
stdin.resume();
|
|
62
|
+
stdin.setEncoding('utf8');
|
|
63
|
+
const onData = (char) => {
|
|
64
|
+
const charCode = char.charCodeAt(0);
|
|
65
|
+
// Handle Enter (newline)
|
|
66
|
+
if (char === '\n' || char === '\r' || char === '\r\n') {
|
|
67
|
+
stdin.setRawMode(false);
|
|
68
|
+
stdin.pause();
|
|
69
|
+
stdin.removeListener('data', onData);
|
|
70
|
+
process.stdout.write('\n');
|
|
71
|
+
rl.close();
|
|
72
|
+
resolve(password);
|
|
73
|
+
}
|
|
74
|
+
// Handle Ctrl+C
|
|
75
|
+
else if (charCode === 3) {
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
// Handle Backspace
|
|
79
|
+
else if (charCode === 127 || charCode === 8) {
|
|
80
|
+
if (password.length > 0) {
|
|
81
|
+
password = password.slice(0, -1);
|
|
82
|
+
// Don't show anything - completely hidden
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Handle normal characters
|
|
86
|
+
else if (charCode >= 32 && charCode <= 126) {
|
|
87
|
+
password += char;
|
|
88
|
+
// Don't show anything - completely hidden
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
stdin.on('data', onData);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/utils/input.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,kCAUC;AAED,kCAkDC;AAhED,mDAAqC;AAErC,SAAgB,WAAW,CAAC,KAAa;IACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;QACnD,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE5B,4BAA4B;QAC5B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAEpC,yBAAyB;YACzB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpD,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtB,CAAC;YACD,gBAAgB;iBACX,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;YACD,mBAAmB;iBACd,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACjC,0CAA0C;gBAC9C,CAAC;YACL,CAAC;YACD,2BAA2B;iBACtB,IAAI,QAAQ,IAAI,EAAE,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;gBACzC,QAAQ,IAAI,IAAI,CAAC;gBACjB,0CAA0C;YAC9C,CAAC;QACL,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI specification loader.
|
|
3
|
+
* Mirrors the Python implementation from dispatch-build-system.
|
|
4
|
+
*/
|
|
5
|
+
import { OpenAPISpec } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Discover OpenAPI specification file in project root directory.
|
|
8
|
+
*/
|
|
9
|
+
export declare function discoverOpenAPIFile(projectRoot: string): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Parse OpenAPI specification file (JSON or YAML).
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseOpenAPIFile(filePath: string): OpenAPISpec;
|
|
14
|
+
/**
|
|
15
|
+
* Validate that the spec is OpenAPI v3.x
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateOpenAPISpec(spec: OpenAPISpec): void;
|
|
18
|
+
/**
|
|
19
|
+
* Load and validate OpenAPI specification from a project directory.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadOpenAPISpec(projectRoot?: string): OpenAPISpec;
|
|
22
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/utils/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAcvC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAoB9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CA+B3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,GAAE,MAAY,GAAG,WAAW,CAmBtE"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenAPI specification loader.
|
|
4
|
+
* Mirrors the Python implementation from dispatch-build-system.
|
|
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 () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.discoverOpenAPIFile = discoverOpenAPIFile;
|
|
41
|
+
exports.parseOpenAPIFile = parseOpenAPIFile;
|
|
42
|
+
exports.validateOpenAPISpec = validateOpenAPISpec;
|
|
43
|
+
exports.loadOpenAPISpec = loadOpenAPISpec;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const yaml = __importStar(require("js-yaml"));
|
|
47
|
+
/**
|
|
48
|
+
* Ordered list of file names to search for OpenAPI specification
|
|
49
|
+
*/
|
|
50
|
+
const OPENAPI_FILE_CANDIDATES = [
|
|
51
|
+
'openapi.json',
|
|
52
|
+
'openapi.yaml',
|
|
53
|
+
'openapi.yml',
|
|
54
|
+
'swagger.json',
|
|
55
|
+
'swagger.yaml',
|
|
56
|
+
'swagger.yml',
|
|
57
|
+
];
|
|
58
|
+
/**
|
|
59
|
+
* Discover OpenAPI specification file in project root directory.
|
|
60
|
+
*/
|
|
61
|
+
function discoverOpenAPIFile(projectRoot) {
|
|
62
|
+
const rootPath = path.resolve(projectRoot);
|
|
63
|
+
if (!fs.existsSync(rootPath)) {
|
|
64
|
+
throw new Error(`Project root directory does not exist: ${projectRoot}`);
|
|
65
|
+
}
|
|
66
|
+
if (!fs.statSync(rootPath).isDirectory()) {
|
|
67
|
+
throw new Error(`Project root is not a directory: ${projectRoot}`);
|
|
68
|
+
}
|
|
69
|
+
for (const candidate of OPENAPI_FILE_CANDIDATES) {
|
|
70
|
+
const filePath = path.join(rootPath, candidate);
|
|
71
|
+
if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {
|
|
72
|
+
return filePath;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parse OpenAPI specification file (JSON or YAML).
|
|
79
|
+
*/
|
|
80
|
+
function parseOpenAPIFile(filePath) {
|
|
81
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
82
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
83
|
+
try {
|
|
84
|
+
if (extension === '.json') {
|
|
85
|
+
return JSON.parse(content);
|
|
86
|
+
}
|
|
87
|
+
else if (extension === '.yaml' || extension === '.yml') {
|
|
88
|
+
return yaml.load(content);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
throw new Error(`Unsupported file extension '${extension}'. Expected .json, .yaml, or .yml`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error instanceof Error) {
|
|
96
|
+
throw new Error(`Failed to parse OpenAPI file '${filePath}': ${error.message}`);
|
|
97
|
+
}
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate that the spec is OpenAPI v3.x
|
|
103
|
+
*/
|
|
104
|
+
function validateOpenAPISpec(spec) {
|
|
105
|
+
if (!spec.openapi) {
|
|
106
|
+
throw new Error("Invalid OpenAPI specification: missing required top-level field 'openapi'.");
|
|
107
|
+
}
|
|
108
|
+
if (typeof spec.openapi !== 'string') {
|
|
109
|
+
throw new Error(`Invalid OpenAPI specification: 'openapi' field must be a string, got ${typeof spec.openapi}.`);
|
|
110
|
+
}
|
|
111
|
+
if (!spec.openapi.startsWith('3.')) {
|
|
112
|
+
throw new Error(`Invalid OpenAPI specification: OpenAPI v2 / Swagger 2.0 is not supported. ` +
|
|
113
|
+
`Found version '${spec.openapi}', but Dispatch requires OpenAPI v3.x.`);
|
|
114
|
+
}
|
|
115
|
+
if (!spec.info) {
|
|
116
|
+
throw new Error("Invalid OpenAPI specification: missing required top-level field 'info'.");
|
|
117
|
+
}
|
|
118
|
+
if (!spec.paths) {
|
|
119
|
+
throw new Error("Invalid OpenAPI specification: missing required top-level field 'paths'.");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Load and validate OpenAPI specification from a project directory.
|
|
124
|
+
*/
|
|
125
|
+
function loadOpenAPISpec(projectRoot = '.') {
|
|
126
|
+
// Step 1: Discover the OpenAPI file
|
|
127
|
+
const filePath = discoverOpenAPIFile(projectRoot);
|
|
128
|
+
if (!filePath) {
|
|
129
|
+
throw new Error('No OpenAPI specification found. ' +
|
|
130
|
+
'Dispatch requires an OpenAPI v3 contract to verify API safety.');
|
|
131
|
+
}
|
|
132
|
+
// Step 2: Parse the file
|
|
133
|
+
const spec = parseOpenAPIFile(filePath);
|
|
134
|
+
// Step 3: Validate the specification
|
|
135
|
+
validateOpenAPISpec(spec);
|
|
136
|
+
// Step 4: Return the validated specification
|
|
137
|
+
return spec;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=loader.js.map
|