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 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/utils/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
+
}
|