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.
Files changed (114) hide show
  1. package/README.md +86 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +148 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/check.d.ts +15 -0
  7. package/dist/commands/check.d.ts.map +1 -0
  8. package/dist/commands/check.js +107 -0
  9. package/dist/commands/check.js.map +1 -0
  10. package/dist/commands/delete.d.ts +6 -0
  11. package/dist/commands/delete.d.ts.map +1 -0
  12. package/dist/commands/delete.js +107 -0
  13. package/dist/commands/delete.js.map +1 -0
  14. package/dist/commands/deploy.d.ts +9 -0
  15. package/dist/commands/deploy.d.ts.map +1 -0
  16. package/dist/commands/deploy.js +275 -0
  17. package/dist/commands/deploy.js.map +1 -0
  18. package/dist/commands/login.d.ts +4 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +34 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/logout.d.ts +2 -0
  23. package/dist/commands/logout.d.ts.map +1 -0
  24. package/dist/commands/logout.js +15 -0
  25. package/dist/commands/logout.js.map +1 -0
  26. package/dist/commands/logs.d.ts +6 -0
  27. package/dist/commands/logs.d.ts.map +1 -0
  28. package/dist/commands/logs.js +129 -0
  29. package/dist/commands/logs.js.map +1 -0
  30. package/dist/commands/poll.d.ts +10 -0
  31. package/dist/commands/poll.d.ts.map +1 -0
  32. package/dist/commands/poll.js +72 -0
  33. package/dist/commands/poll.js.map +1 -0
  34. package/dist/commands/projects.d.ts +5 -0
  35. package/dist/commands/projects.d.ts.map +1 -0
  36. package/dist/commands/projects.js +49 -0
  37. package/dist/commands/projects.js.map +1 -0
  38. package/dist/commands/register.d.ts +5 -0
  39. package/dist/commands/register.d.ts.map +1 -0
  40. package/dist/commands/register.js +46 -0
  41. package/dist/commands/register.js.map +1 -0
  42. package/dist/commands/trigger.d.ts +11 -0
  43. package/dist/commands/trigger.d.ts.map +1 -0
  44. package/dist/commands/trigger.js +52 -0
  45. package/dist/commands/trigger.js.map +1 -0
  46. package/dist/config/runtime.d.ts +18 -0
  47. package/dist/config/runtime.d.ts.map +1 -0
  48. package/dist/config/runtime.js +32 -0
  49. package/dist/config/runtime.js.map +1 -0
  50. package/dist/services/auth.d.ts +18 -0
  51. package/dist/services/auth.d.ts.map +1 -0
  52. package/dist/services/auth.js +122 -0
  53. package/dist/services/auth.js.map +1 -0
  54. package/dist/services/builder.d.ts +4 -0
  55. package/dist/services/builder.d.ts.map +1 -0
  56. package/dist/services/builder.js +89 -0
  57. package/dist/services/builder.js.map +1 -0
  58. package/dist/services/controlPlane.d.ts +16 -0
  59. package/dist/services/controlPlane.d.ts.map +1 -0
  60. package/dist/services/controlPlane.js +155 -0
  61. package/dist/services/controlPlane.js.map +1 -0
  62. package/dist/services/deployer.d.ts +2 -0
  63. package/dist/services/deployer.d.ts.map +1 -0
  64. package/dist/services/deployer.js +49 -0
  65. package/dist/services/deployer.js.map +1 -0
  66. package/dist/services/project.d.ts +9 -0
  67. package/dist/services/project.d.ts.map +1 -0
  68. package/dist/services/project.js +29 -0
  69. package/dist/services/project.js.map +1 -0
  70. package/dist/services/sourceUploader.d.ts +9 -0
  71. package/dist/services/sourceUploader.d.ts.map +1 -0
  72. package/dist/services/sourceUploader.js +250 -0
  73. package/dist/services/sourceUploader.js.map +1 -0
  74. package/dist/services/uploader.d.ts +2 -0
  75. package/dist/services/uploader.d.ts.map +1 -0
  76. package/dist/services/uploader.js +59 -0
  77. package/dist/services/uploader.js.map +1 -0
  78. package/dist/types/deployment.d.ts +43 -0
  79. package/dist/types/deployment.d.ts.map +1 -0
  80. package/dist/types/deployment.js +6 -0
  81. package/dist/types/deployment.js.map +1 -0
  82. package/dist/types.d.ts +53 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +7 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist/utils/config.d.ts +17 -0
  87. package/dist/utils/config.d.ts.map +1 -0
  88. package/dist/utils/config.js +85 -0
  89. package/dist/utils/config.js.map +1 -0
  90. package/dist/utils/credentials.d.ts +16 -0
  91. package/dist/utils/credentials.d.ts.map +1 -0
  92. package/dist/utils/credentials.js +72 -0
  93. package/dist/utils/credentials.js.map +1 -0
  94. package/dist/utils/debug.d.ts +7 -0
  95. package/dist/utils/debug.d.ts.map +1 -0
  96. package/dist/utils/debug.js +21 -0
  97. package/dist/utils/debug.js.map +1 -0
  98. package/dist/utils/input.d.ts +3 -0
  99. package/dist/utils/input.d.ts.map +1 -0
  100. package/dist/utils/input.js +94 -0
  101. package/dist/utils/input.js.map +1 -0
  102. package/dist/utils/loader.d.ts +22 -0
  103. package/dist/utils/loader.d.ts.map +1 -0
  104. package/dist/utils/loader.js +139 -0
  105. package/dist/utils/loader.js.map +1 -0
  106. package/dist/utils/normalizer.d.ts +10 -0
  107. package/dist/utils/normalizer.d.ts.map +1 -0
  108. package/dist/utils/normalizer.js +115 -0
  109. package/dist/utils/normalizer.js.map +1 -0
  110. package/dist/utils/safety.d.ts +18 -0
  111. package/dist/utils/safety.d.ts.map +1 -0
  112. package/dist/utils/safety.js +140 -0
  113. package/dist/utils/safety.js.map +1 -0
  114. 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,6 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for deployment-related entities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/types/deployment.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -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,7 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for the Dispatch safety engine.
4
+ * These mirror the Python implementation from dispatch-build-system.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=types.js.map
@@ -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,7 @@
1
+ /**
2
+ * Debug logging utility
3
+ */
4
+ export declare function setDebugEnabled(enabled: boolean): void;
5
+ export declare function isDebugEnabled(): boolean;
6
+ export declare function debugLog(...args: any[]): void;
7
+ //# sourceMappingURL=debug.d.ts.map
@@ -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,3 @@
1
+ export declare function askQuestion(query: string): Promise<string>;
2
+ export declare function askPassword(query: string): Promise<string>;
3
+ //# sourceMappingURL=input.d.ts.map
@@ -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