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 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/utils/loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBH,kDAmBC;AAKD,4CAoBC;AAKD,kDA+BC;AAKD,0CAmBC;AA5HD,uCAAyB;AACzB,2CAA6B;AAC7B,8CAAgC;AAGhC;;GAEG;AACH,MAAM,uBAAuB,GAAG;IAC9B,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,aAAa;CACd,CAAC;AAEF;;GAEG;AACH,SAAgB,mBAAmB,CAAC,WAAmB;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0CAA0C,WAAW,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,uBAAuB,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9D,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;QAC5C,CAAC;aAAM,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAgB,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,+BAA+B,SAAS,mCAAmC,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,IAAiB;IACnD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,wEAAwE,OAAO,IAAI,CAAC,OAAO,GAAG,CAC/F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,4EAA4E;YAC1E,kBAAkB,IAAI,CAAC,OAAO,wCAAwC,CACzE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,cAAsB,GAAG;IACvD,oCAAoC;IACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAElD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,kCAAkC;YAChC,gEAAgE,CACnE,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAExC,qCAAqC;IACrC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE1B,6CAA6C;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * OpenAPI specification normalizer.
3
+ * Mirrors the Python implementation from dispatch-build-system.
4
+ */
5
+ import { OpenAPISpec, NormalizedOperation } from '../types';
6
+ /**
7
+ * Normalize an OpenAPI v3.x specification into a list of operations.
8
+ */
9
+ export declare function normalizeOpenAPISpec(spec: OpenAPISpec): NormalizedOperation[];
10
+ //# sourceMappingURL=normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../src/utils/normalizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA0F5D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,EAAE,CAuC7E"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAPI specification normalizer.
4
+ * Mirrors the Python implementation from dispatch-build-system.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.normalizeOpenAPISpec = normalizeOpenAPISpec;
8
+ const SUPPORTED_HTTP_METHODS = new Set(['get', 'post', 'put', 'patch', 'delete', 'options', 'head']);
9
+ /**
10
+ * Extract security scheme names from a security object
11
+ */
12
+ function extractSecuritySchemes(securityObj) {
13
+ if (!securityObj || securityObj.length === 0) {
14
+ return [];
15
+ }
16
+ const schemeNames = [];
17
+ for (const securityRequirement of securityObj) {
18
+ if (typeof securityRequirement === 'object') {
19
+ schemeNames.push(...Object.keys(securityRequirement));
20
+ }
21
+ }
22
+ return schemeNames;
23
+ }
24
+ /**
25
+ * Check if a path or operation has path parameters
26
+ */
27
+ function hasPathParameters(pathStr, operation) {
28
+ // Check if path contains parameter syntax
29
+ if (pathStr.includes('{') && pathStr.includes('}')) {
30
+ return true;
31
+ }
32
+ // Check operation-level parameters
33
+ const parameters = operation.parameters || [];
34
+ for (const param of parameters) {
35
+ if (typeof param === 'object' && param.in === 'path') {
36
+ return true;
37
+ }
38
+ }
39
+ return false;
40
+ }
41
+ /**
42
+ * Check if an operation has a request body
43
+ */
44
+ function hasRequestBody(operation) {
45
+ return 'requestBody' in operation;
46
+ }
47
+ /**
48
+ * Extract public override information from vendor extensions
49
+ */
50
+ function extractPublicOverride(operation) {
51
+ const isPublic = operation['x-public'] === true;
52
+ const reason = isPublic ? (operation['x-reason'] || null) : null;
53
+ return { isPublic, reason };
54
+ }
55
+ /**
56
+ * Normalize a single OpenAPI operation into the canonical format
57
+ */
58
+ function normalizeOperation(pathStr, method, operation, globalSecurity) {
59
+ // Extract security (operation-level overrides global)
60
+ let securitySchemes;
61
+ if ('security' in operation) {
62
+ securitySchemes = extractSecuritySchemes(operation.security);
63
+ }
64
+ else {
65
+ securitySchemes = extractSecuritySchemes(globalSecurity);
66
+ }
67
+ // Extract public override information
68
+ const { isPublic, reason } = extractPublicOverride(operation);
69
+ return {
70
+ method: method.toUpperCase(),
71
+ path: pathStr,
72
+ has_request_body: hasRequestBody(operation),
73
+ has_path_params: hasPathParameters(pathStr, operation),
74
+ security: securitySchemes,
75
+ is_public_override: isPublic,
76
+ public_reason: reason,
77
+ };
78
+ }
79
+ /**
80
+ * Normalize an OpenAPI v3.x specification into a list of operations.
81
+ */
82
+ function normalizeOpenAPISpec(spec) {
83
+ // Extract global security (used as default)
84
+ const globalSecurity = spec.security || [];
85
+ // Extract all operations from paths
86
+ const operations = [];
87
+ const paths = spec.paths || {};
88
+ for (const [pathStr, pathItem] of Object.entries(paths)) {
89
+ if (typeof pathItem !== 'object' || pathItem === null) {
90
+ continue;
91
+ }
92
+ // Iterate through all HTTP methods in this path
93
+ for (const [method, operation] of Object.entries(pathItem)) {
94
+ // Only process supported HTTP methods
95
+ if (!SUPPORTED_HTTP_METHODS.has(method.toLowerCase())) {
96
+ continue;
97
+ }
98
+ if (typeof operation !== 'object' || operation === null) {
99
+ continue;
100
+ }
101
+ // Normalize this operation
102
+ const normalizedOp = normalizeOperation(pathStr, method, operation, globalSecurity);
103
+ operations.push(normalizedOp);
104
+ }
105
+ }
106
+ // Sort deterministically by path then method
107
+ operations.sort((a, b) => {
108
+ if (a.path !== b.path) {
109
+ return a.path.localeCompare(b.path);
110
+ }
111
+ return a.method.localeCompare(b.method);
112
+ });
113
+ return operations;
114
+ }
115
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../../src/utils/normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Safety rules evaluator.
3
+ * Mirrors the Python implementation from dispatch-build-system.
4
+ */
5
+ import { NormalizedOperation, SafetyFinding, FindingSummary } from '../types';
6
+ /**
7
+ * Evaluate all operations against safety rules
8
+ */
9
+ export declare function evaluateOperations(operations: NormalizedOperation[]): SafetyFinding[];
10
+ /**
11
+ * Determine if deployment should proceed based on findings
12
+ */
13
+ export declare function isDeploymentSafe(findings: SafetyFinding[]): boolean;
14
+ /**
15
+ * Get a summary of findings by severity
16
+ */
17
+ export declare function getFindingSummary(findings: SafetyFinding[]): FindingSummary;
18
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/utils/safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AA+G9E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,aAAa,EAAE,CAkBrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,cAAc,CAY3E"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * Safety rules evaluator.
4
+ * Mirrors the Python implementation from dispatch-build-system.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.evaluateOperations = evaluateOperations;
8
+ exports.isDeploymentSafe = isDeploymentSafe;
9
+ exports.getFindingSummary = getFindingSummary;
10
+ const WRITE_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
11
+ const READ_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
12
+ /**
13
+ * Determine if an operation is state-mutating
14
+ */
15
+ function isWriteOperation(operation) {
16
+ return WRITE_METHODS.has(operation.method);
17
+ }
18
+ /**
19
+ * Determine if an operation is read-only
20
+ */
21
+ function isReadOperation(operation) {
22
+ return READ_METHODS.has(operation.method);
23
+ }
24
+ /**
25
+ * Determine if an operation has authentication
26
+ */
27
+ function hasAuthentication(operation) {
28
+ // Has declared security schemes
29
+ if (operation.security.length > 0) {
30
+ return true;
31
+ }
32
+ // Has explicit public override
33
+ if (operation.is_public_override) {
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ /**
39
+ * Determine if an operation has a request surface
40
+ */
41
+ function hasRequestSurface(operation) {
42
+ return operation.has_request_body || operation.has_path_params;
43
+ }
44
+ /**
45
+ * Determine if an operation is public but lacks a documented reason
46
+ */
47
+ function isPublicWithoutReason(operation) {
48
+ return operation.is_public_override && operation.public_reason === null;
49
+ }
50
+ /**
51
+ * Determine if an operation requires authentication to be safe
52
+ */
53
+ function needsAuthentication(operation) {
54
+ return (isWriteOperation(operation) &&
55
+ hasRequestSurface(operation) &&
56
+ !hasAuthentication(operation));
57
+ }
58
+ /**
59
+ * Evaluate a single operation against all safety rules
60
+ */
61
+ function evaluateOperation(operation) {
62
+ const findings = [];
63
+ const route = operation.path;
64
+ const method = operation.method;
65
+ // BLOCKING RULE: Write operation without authentication
66
+ if (needsAuthentication(operation)) {
67
+ findings.push({
68
+ route,
69
+ method,
70
+ severity: 'block',
71
+ message: `Write operation ${method} ${route} must declare authentication. ` +
72
+ `Add a security scheme or use x-public with a documented reason.`,
73
+ });
74
+ }
75
+ // WARNING: Public override without reason
76
+ if (isPublicWithoutReason(operation)) {
77
+ findings.push({
78
+ route,
79
+ method,
80
+ severity: 'warn',
81
+ message: `Public operation ${method} ${route} should include x-reason ` +
82
+ `to document why authentication is not required.`,
83
+ });
84
+ }
85
+ // WARNING: Read-only route without authentication
86
+ if (isReadOperation(operation) && !hasAuthentication(operation)) {
87
+ // Only warn if this looks like a sensitive path
88
+ if (operation.has_path_params) {
89
+ findings.push({
90
+ route,
91
+ method,
92
+ severity: 'warn',
93
+ message: `Read operation ${method} ${route} with path parameters ` +
94
+ `has no authentication. Consider if this exposes sensitive data.`,
95
+ });
96
+ }
97
+ }
98
+ return findings;
99
+ }
100
+ /**
101
+ * Evaluate all operations against safety rules
102
+ */
103
+ function evaluateOperations(operations) {
104
+ const allFindings = [];
105
+ // Evaluate each operation independently
106
+ for (const operation of operations) {
107
+ const findings = evaluateOperation(operation);
108
+ allFindings.push(...findings);
109
+ }
110
+ // Sort findings deterministically by route then method
111
+ allFindings.sort((a, b) => {
112
+ if (a.route !== b.route) {
113
+ return a.route.localeCompare(b.route);
114
+ }
115
+ return a.method.localeCompare(b.method);
116
+ });
117
+ return allFindings;
118
+ }
119
+ /**
120
+ * Determine if deployment should proceed based on findings
121
+ */
122
+ function isDeploymentSafe(findings) {
123
+ return !findings.some((f) => f.severity === 'block');
124
+ }
125
+ /**
126
+ * Get a summary of findings by severity
127
+ */
128
+ function getFindingSummary(findings) {
129
+ const summary = { block: 0, warn: 0 };
130
+ for (const finding of findings) {
131
+ if (finding.severity === 'block') {
132
+ summary.block++;
133
+ }
134
+ else if (finding.severity === 'warn') {
135
+ summary.warn++;
136
+ }
137
+ }
138
+ return summary;
139
+ }
140
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/utils/safety.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "dispatch-deploy",
3
+ "version": "1.0.0",
4
+ "description": "CLI for Dispatch - Deploy APIs Instantly",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "dispatch": "./dist/cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "test": "jest",
13
+ "lint": "eslint src --ext .ts",
14
+ "format": "prettier --write \"src/**/*.ts\"",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "dispatch",
19
+ "cli",
20
+ "openapi",
21
+ "safety",
22
+ "serverless",
23
+ "paas",
24
+ "api-gateway",
25
+ "lambda",
26
+ "aws",
27
+ "deployment"
28
+ ],
29
+ "author": "Dispatch Team <hello@usedp.xyz>",
30
+ "license": "MIT",
31
+ "homepage": "https://usedp.xyz",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/dispatch-paas/dispatch-cli.git"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/dispatch-paas/dispatch-cli/issues"
38
+ },
39
+ "dependencies": {
40
+ "@types/inquirer": "^9.0.9",
41
+ "archiver": "^7.0.1",
42
+ "chalk": "^4.1.2",
43
+ "commander": "^11.1.0",
44
+ "dotenv": "^17.2.3",
45
+ "inquirer": "^9.3.8",
46
+ "js-yaml": "^4.1.0",
47
+ "read": "^5.0.1"
48
+ },
49
+ "devDependencies": {
50
+ "@types/archiver": "^7.0.0",
51
+ "@types/js-yaml": "^4.0.9",
52
+ "@types/node": "^20.10.0",
53
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
54
+ "@typescript-eslint/parser": "^6.13.0",
55
+ "eslint": "^8.54.0",
56
+ "prettier": "^3.1.0",
57
+ "typescript": "^5.3.2"
58
+ },
59
+ "engines": {
60
+ "node": ">=16.0.0"
61
+ },
62
+ "files": [
63
+ "dist/",
64
+ "README.md",
65
+ "LICENSE"
66
+ ],
67
+ "publishConfig": {
68
+ "access": "public"
69
+ }
70
+ }