@grnsft/if 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +10 -0
- package/CONTAINER.md +148 -0
- package/Dockerfile +73 -0
- package/HELM_CHART.md +96 -0
- package/README.md +56 -0
- package/bin/docker-entrypoint.sh +15 -0
- package/build/common/types/manifest.d.ts +1 -0
- package/build/common/types/manifest.js +1 -1
- package/build/common/util/debug-logger.js +4 -18
- package/build/common/util/storage.d.ts +9 -0
- package/build/common/util/storage.js +24 -0
- package/build/if-api/config/config.d.ts +9 -0
- package/build/if-api/config/config.js +58 -0
- package/build/if-api/config/index.d.ts +2 -0
- package/build/if-api/config/index.js +8 -0
- package/build/if-api/config/strings.d.ts +16 -0
- package/build/if-api/config/strings.js +20 -0
- package/build/if-api/index.d.ts +2 -0
- package/build/if-api/index.js +268 -0
- package/build/if-api/types/process-args.d.ts +18 -0
- package/build/if-api/types/process-args.js +3 -0
- package/build/if-api/util/args.d.ts +5 -0
- package/build/if-api/util/args.js +42 -0
- package/build/if-metadata-check/config/config.d.ts +5 -0
- package/build/if-metadata-check/config/config.js +26 -0
- package/build/if-metadata-check/config/strings.d.ts +5 -0
- package/build/if-metadata-check/config/strings.js +9 -0
- package/build/if-metadata-check/index.d.ts +2 -0
- package/build/if-metadata-check/index.js +30 -0
- package/build/if-metadata-check/types/plugin.d.ts +7 -0
- package/build/if-metadata-check/types/plugin.js +3 -0
- package/build/if-metadata-check/types/process-args.d.ts +5 -0
- package/build/if-metadata-check/types/process-args.js +3 -0
- package/build/if-metadata-check/util/args.d.ts +57 -0
- package/build/if-metadata-check/util/args.js +29 -0
- package/build/if-metadata-check/util/metadata-checker.d.ts +44 -0
- package/build/if-metadata-check/util/metadata-checker.js +99 -0
- package/build/if-run/index.js +1 -1
- package/build/if-run/lib/aggregate.d.ts +2 -2
- package/build/if-run/lib/aggregate.js +5 -19
- package/build/if-run/lib/compute.d.ts +1 -1
- package/build/if-run/lib/compute.js +10 -9
- package/build/if-run/lib/environment.d.ts +5 -1
- package/build/if-run/lib/environment.js +21 -16
- package/build/if-run/lib/initialize.d.ts +12 -0
- package/build/if-run/lib/initialize.js +37 -3
- package/build/if-run/lib/regroup.d.ts +3 -2
- package/build/if-run/lib/regroup.js +13 -9
- package/build/if-run/types/compute.d.ts +1 -1
- package/build/if-run/types/compute.js +1 -1
- package/helm-chart/.helmignore +23 -0
- package/helm-chart/Chart.yaml +24 -0
- package/helm-chart/templates/NOTES.txt +22 -0
- package/helm-chart/templates/_helpers.tpl +62 -0
- package/helm-chart/templates/additionalPlugins.yaml +13 -0
- package/helm-chart/templates/deployment.yaml +144 -0
- package/helm-chart/templates/disabledPlugins.yaml +11 -0
- package/helm-chart/templates/env-configmap.yaml +10 -0
- package/helm-chart/templates/env-secret.yaml +10 -0
- package/helm-chart/templates/hpa.yaml +32 -0
- package/helm-chart/templates/ingress.yaml +43 -0
- package/helm-chart/templates/npmrc.yaml +11 -0
- package/helm-chart/templates/service.yaml +24 -0
- package/helm-chart/templates/serviceaccount.yaml +13 -0
- package/helm-chart/templates/tests/test-connection.yaml +15 -0
- package/helm-chart/values.yaml +175 -0
- package/manifests/examples/bugs/aggregation-error-wrong-metric.yml +173 -0
- package/manifests/examples/bugs/input-error-missing-duration.yml +25 -0
- package/manifests/examples/bugs/mock-observations-failure-duration-is-zero.yml +33 -0
- package/manifests/examples/bugs/pipeline-error-naming-mismatch.yml +32 -0
- package/manifests/examples/bugs/pipeline-error-uninitialized-plugin.yml +33 -0
- package/manifests/examples/bugs/pipeline-ordering-error.yml +91 -0
- package/manifests/examples/builtins/divide/success-denominator-equal-zero.yml +36 -0
- package/manifests/examples/builtins/mock-observations/failure-invalid-config-cpu-range.yml +0 -1
- package/manifests/examples/builtins/mock-observations/failure-invalid-memory-utilization-range.yml +0 -1
- package/manifests/examples/builtins/mock-observations/failure-missing-timestamp-from-param.yml +0 -1
- package/manifests/examples/builtins/mock-observations/success.yml +0 -1
- package/manifests/examples/builtins/sci/failure-invalid-config-value.yml +0 -1
- package/manifests/examples/builtins/sci/failure-missing-input-param.yml +0 -1
- package/manifests/examples/builtins/sci/success.yml +0 -1
- package/manifests/examples/builtins/sci-embodied/failure-invalid-default-emission-value.yml +22 -0
- package/manifests/examples/builtins/time-sync/failure-missing-config.yml +0 -2
- package/manifests/examples/builtins/time-sync/success.yml +0 -2
- package/manifests/examples/features/aggregate-failure-invalid-metrics.yml +50 -0
- package/manifests/examples/features/aggregate-failure-missing-metric-in-inputs.yml +50 -0
- package/manifests/examples/features/aggregate-horizontal.yml +58 -0
- package/manifests/examples/features/aggregate-vertical.yml +58 -0
- package/manifests/examples/features/aggregate.yml +58 -0
- package/manifests/examples/pipelines/cloud-metadata-divide.yml +36 -0
- package/manifests/examples/pipelines/pipeline-with-mocks.yml +0 -1
- package/manifests/examples/pipelines/scenario-5.yml +0 -1
- package/manifests/outputs/bugs/mock-observations-failure-duration-is-zero.yaml +0 -1
- package/manifests/outputs/builtins/mock-observations/failure-invalid-config-cpu-range.yaml +0 -1
- package/manifests/outputs/builtins/mock-observations/failure-invalid-memory-utilization-range.yaml +0 -1
- package/manifests/outputs/builtins/mock-observations/failure-missing-timestamp-from-param.yaml +0 -1
- package/manifests/outputs/builtins/sci/failure-invalid-config-value.yaml +0 -1
- package/manifests/outputs/builtins/sci/failure-missing-input-param.yaml +0 -1
- package/manifests/outputs/builtins/time-sync/failure-missing-config.yaml +0 -2
- package/manifests/outputs/features/regroup/success.yaml +72 -0
- package/manifests/outputs/pipelines/pipeline-with-aggregate.yaml +1291 -0
- package/manifests/outputs/pipelines/scenario-3.yaml +126 -0
- package/openapi.yaml +424 -0
- package/package.json +8 -3
- package/with-plugins/Dockerfile +59 -0
- package/manifests/outputs/builtins/interpolation/interpolation.yaml +0 -81
- package/manifests/outputs/features/failure-invalid-regroup.yaml +0 -87
- package/manifests/outputs/features/failure-missing-cloud-instance-type.yaml +0 -86
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STRINGS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Strings for if-api.
|
|
6
|
+
*/
|
|
7
|
+
exports.STRINGS = {
|
|
8
|
+
SERVER_STARTED: (addr) => `Server started on ${addr}`,
|
|
9
|
+
SERVER_START_FAILED: (err) => `Failed to start server: ${err}`,
|
|
10
|
+
PROCESSING_REQUEST: 'Processing request',
|
|
11
|
+
INTERNAL_SERVER_ERROR: 'Internal Server Error',
|
|
12
|
+
INVALID_JSON: 'Invalid JSON format',
|
|
13
|
+
INVALID_YAML: 'Invalid YAML format',
|
|
14
|
+
MISSING_MANIFEST: 'Missing manifest in request body',
|
|
15
|
+
UNSUPPORTED_CONTENT_TYPE: 'Unsupported content type. Supported types are: application/json, application/yaml',
|
|
16
|
+
DISCLAIMER_MESSAGE: 'Impact Framework API - Green Software Foundation',
|
|
17
|
+
INVALID_DISABLED_PLUGINS: (line) => `Invalid DisabledPlugins settings:${line}`,
|
|
18
|
+
INVALID_PORT_NUMBER: (port) => `Invalid port number \`${port}\`. The port number should be a number between 0 and 65535.`,
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1hcGkvY29uZmlnL3N0cmluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDVSxRQUFBLE9BQU8sR0FBRztJQUNyQixjQUFjLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixJQUFJLEVBQUU7SUFDN0QsbUJBQW1CLEVBQUUsQ0FBQyxHQUFVLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixHQUFHLEVBQUU7SUFDckUsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxZQUFZLEVBQUUscUJBQXFCO0lBQ25DLFlBQVksRUFBRSxxQkFBcUI7SUFDbkMsZ0JBQWdCLEVBQUUsa0NBQWtDO0lBQ3BELHdCQUF3QixFQUN0QixtRkFBbUY7SUFDckYsa0JBQWtCLEVBQUUsa0RBQWtEO0lBQ3RFLHdCQUF3QixFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDekMsb0NBQW9DLElBQUksRUFBRTtJQUM1QyxtQkFBbUIsRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFLENBQ3BDLHlCQUF5QixJQUFJLDZEQUE2RDtDQUNwRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdHJpbmdzIGZvciBpZi1hcGkuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdTID0ge1xuICBTRVJWRVJfU1RBUlRFRDogKGFkZHI6IHN0cmluZykgPT4gYFNlcnZlciBzdGFydGVkIG9uICR7YWRkcn1gLFxuICBTRVJWRVJfU1RBUlRfRkFJTEVEOiAoZXJyOiBFcnJvcikgPT4gYEZhaWxlZCB0byBzdGFydCBzZXJ2ZXI6ICR7ZXJyfWAsXG4gIFBST0NFU1NJTkdfUkVRVUVTVDogJ1Byb2Nlc3NpbmcgcmVxdWVzdCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gIElOVkFMSURfSlNPTjogJ0ludmFsaWQgSlNPTiBmb3JtYXQnLFxuICBJTlZBTElEX1lBTUw6ICdJbnZhbGlkIFlBTUwgZm9ybWF0JyxcbiAgTUlTU0lOR19NQU5JRkVTVDogJ01pc3NpbmcgbWFuaWZlc3QgaW4gcmVxdWVzdCBib2R5JyxcbiAgVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFOlxuICAgICdVbnN1cHBvcnRlZCBjb250ZW50IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IGFwcGxpY2F0aW9uL2pzb24sIGFwcGxpY2F0aW9uL3lhbWwnLFxuICBESVNDTEFJTUVSX01FU1NBR0U6ICdJbXBhY3QgRnJhbWV3b3JrIEFQSSAtIEdyZWVuIFNvZnR3YXJlIEZvdW5kYXRpb24nLFxuICBJTlZBTElEX0RJU0FCTEVEX1BMVUdJTlM6IChsaW5lOiBzdHJpbmcpID0+XG4gICAgYEludmFsaWQgRGlzYWJsZWRQbHVnaW5zIHNldHRpbmdzOiR7bGluZX1gLFxuICBJTlZBTElEX1BPUlRfTlVNQkVSOiAocG9ydDogc3RyaW5nKSA9PlxuICAgIGBJbnZhbGlkIHBvcnQgbnVtYmVyIFxcYCR7cG9ydH1cXGAuIFRoZSBwb3J0IG51bWJlciBzaG91bGQgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA2NTUzNS5gLFxufSBhcyBjb25zdDtcbiJdfQ==
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const express_1 = __importDefault(require("express"));
|
|
9
|
+
const js_yaml_1 = require("js-yaml");
|
|
10
|
+
const utils_1 = require("@grnsft/if-core/utils");
|
|
11
|
+
const debug_logger_1 = require("../common/util/debug-logger");
|
|
12
|
+
const logger_1 = require("../common/util/logger");
|
|
13
|
+
const storage_1 = require("../common/util/storage");
|
|
14
|
+
const validations_1 = require("../common/util/validations");
|
|
15
|
+
const aggregate_1 = require("../if-run/lib/aggregate");
|
|
16
|
+
const environment_1 = require("../if-run/lib/environment");
|
|
17
|
+
const initialize_1 = require("../if-run/lib/initialize");
|
|
18
|
+
const compute_1 = require("../if-run/lib/compute");
|
|
19
|
+
const explain_1 = require("../if-run/lib/explain");
|
|
20
|
+
const config_1 = require("./config");
|
|
21
|
+
const args_1 = require("./util/args");
|
|
22
|
+
const { DISCLAIMER_MESSAGE, INTERNAL_SERVER_ERROR, INVALID_DISABLED_PLUGINS, INVALID_JSON, INVALID_YAML, MISSING_MANIFEST, PROCESSING_REQUEST, SERVER_STARTED, SERVER_START_FAILED, UNSUPPORTED_CONTENT_TYPE, } = config_1.STRINGS;
|
|
23
|
+
const CT_YAML = 'application/yaml';
|
|
24
|
+
const CT_JSON = 'application/json';
|
|
25
|
+
const CT_VALID = [CT_YAML, CT_JSON];
|
|
26
|
+
const ERROR_LIST = Object.values(utils_1.ERRORS);
|
|
27
|
+
/**
|
|
28
|
+
* Determine response type.
|
|
29
|
+
*/
|
|
30
|
+
const determineResponseType = (req) => {
|
|
31
|
+
const acceptHeader = req.get('Accept');
|
|
32
|
+
if (acceptHeader && acceptHeader !== '*/*') {
|
|
33
|
+
// Determine based on request Accept header
|
|
34
|
+
const responseType = req.accepts(CT_VALID);
|
|
35
|
+
if (responseType) {
|
|
36
|
+
return responseType;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Determine based on request Content-Type
|
|
40
|
+
return req.get('Content-Type');
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Send the response in the appropriate format.
|
|
44
|
+
*/
|
|
45
|
+
const sendResponse = (req, res, manifest, status) => {
|
|
46
|
+
const responseType = determineResponseType(req);
|
|
47
|
+
if (responseType === CT_YAML) {
|
|
48
|
+
const yamlData = (0, js_yaml_1.dump)(manifest, { noRefs: true });
|
|
49
|
+
res.set('Content-Type', responseType);
|
|
50
|
+
res.status(status).send(yamlData);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
res.set('Content-Type', responseType);
|
|
54
|
+
res.status(status).json(manifest);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Parse disabled plugins file
|
|
59
|
+
* @param filename Filename that contains plugin names to be disabled
|
|
60
|
+
* @returns Set of disabledPlugins
|
|
61
|
+
*/
|
|
62
|
+
const parseDisabledPlugins = async (filename) => {
|
|
63
|
+
// If no filename is specified, disable builtin:Shell, builtin:CSVImport, builtin:CSVLookup by default.
|
|
64
|
+
if (!filename) {
|
|
65
|
+
return new Set([
|
|
66
|
+
'builtin:Shell',
|
|
67
|
+
'builtin:CSVImport',
|
|
68
|
+
'builtin:CSVLookup',
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
const disabledPlugins = new Set();
|
|
72
|
+
const file = await (0, promises_1.open)(filename);
|
|
73
|
+
try {
|
|
74
|
+
for await (const line of file.readLines()) {
|
|
75
|
+
const words = line.split(/ *: */);
|
|
76
|
+
switch (words.length) {
|
|
77
|
+
case 1:
|
|
78
|
+
disabledPlugins.add(`builtin:${words[0]}`);
|
|
79
|
+
break;
|
|
80
|
+
case 2:
|
|
81
|
+
disabledPlugins.add(`${words[0]}:${words[1]}`);
|
|
82
|
+
break;
|
|
83
|
+
default:
|
|
84
|
+
throw new Error(INVALID_DISABLED_PLUGINS(line));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await file.close();
|
|
90
|
+
}
|
|
91
|
+
return disabledPlugins;
|
|
92
|
+
};
|
|
93
|
+
const formatAddr = (addr) => {
|
|
94
|
+
if (typeof addr === 'string') {
|
|
95
|
+
return addr;
|
|
96
|
+
}
|
|
97
|
+
else if (addr === null) {
|
|
98
|
+
return 'unknown';
|
|
99
|
+
}
|
|
100
|
+
else if (addr.family === 'IPv6') {
|
|
101
|
+
return `[${addr.address}]:${addr.port}`;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
return `${addr.address}:${addr.port}`;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Start the API server.
|
|
109
|
+
*/
|
|
110
|
+
const startServer = async () => {
|
|
111
|
+
const options = (0, args_1.parseIfApiProcessArgs)();
|
|
112
|
+
debug_logger_1.debugLogger.overrideConsoleMethods(options.debug);
|
|
113
|
+
logger_1.logger.info(DISCLAIMER_MESSAGE);
|
|
114
|
+
(0, initialize_1.setExternalPluginWarning)(!options.disableExternalPluginWarning);
|
|
115
|
+
const disabledPlugins = await parseDisabledPlugins(options.disabledPlugins);
|
|
116
|
+
(0, initialize_1.setDisabledPlugins)(disabledPlugins);
|
|
117
|
+
// Get execution information (command, environment).
|
|
118
|
+
const execution = await (0, environment_1.getExecution)();
|
|
119
|
+
const app = (0, express_1.default)();
|
|
120
|
+
// Middleware for JSON requests
|
|
121
|
+
app.use(express_1.default.json({ type: CT_JSON }));
|
|
122
|
+
// Custom middleware for YAML requests
|
|
123
|
+
app.use(express_1.default.text({ type: CT_YAML }), (req, res, next) => {
|
|
124
|
+
if (req.is(CT_YAML)) {
|
|
125
|
+
try {
|
|
126
|
+
req.body = (0, js_yaml_1.load)(req.body);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
res.status(400).json({
|
|
130
|
+
error: INVALID_YAML,
|
|
131
|
+
detail: err.message,
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
next();
|
|
137
|
+
});
|
|
138
|
+
// Add request context storage
|
|
139
|
+
app.use((_req, _res, next) => (0, storage_1.executeWithContext)(next));
|
|
140
|
+
// Health check endpoint
|
|
141
|
+
app.get('/health', (_req, res) => {
|
|
142
|
+
res.status(200).send('OK');
|
|
143
|
+
});
|
|
144
|
+
// Process manifest endpoint
|
|
145
|
+
app.post('/v1/run', async (req, res) => {
|
|
146
|
+
logger_1.logger.info(PROCESSING_REQUEST);
|
|
147
|
+
// Check if request body exists
|
|
148
|
+
if (!req.body) {
|
|
149
|
+
res.status(400).json({ error: MISSING_MANIFEST });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Check request Content-Type
|
|
153
|
+
if (!req.is(CT_VALID)) {
|
|
154
|
+
res.status(415).json({ error: UNSUPPORTED_CONTENT_TYPE });
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Create manifest with execution information
|
|
158
|
+
const envManifest = {
|
|
159
|
+
...req.body,
|
|
160
|
+
execution: {
|
|
161
|
+
command: execution.command,
|
|
162
|
+
environment: {
|
|
163
|
+
...execution.environment,
|
|
164
|
+
'date-time': `${new Date().toISOString()} (UTC)`,
|
|
165
|
+
},
|
|
166
|
+
status: execution.status,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
try {
|
|
170
|
+
const { tree, ...context } = (0, validations_1.validateManifest)(envManifest);
|
|
171
|
+
const pluginStorage = await (0, initialize_1.initialize)(context);
|
|
172
|
+
const computedTree = await (0, compute_1.compute)(tree, {
|
|
173
|
+
context,
|
|
174
|
+
pluginStorage,
|
|
175
|
+
observe: req.query.observe === 'true',
|
|
176
|
+
regroup: req.query.regroup === 'true',
|
|
177
|
+
compute: req.query.compute === 'true',
|
|
178
|
+
append: false,
|
|
179
|
+
});
|
|
180
|
+
const aggregatedTree = (0, aggregate_1.aggregate)(computedTree, context.aggregation);
|
|
181
|
+
envManifest.explainer && (context.explain = (0, explain_1.explain)());
|
|
182
|
+
// Prepare response data
|
|
183
|
+
const responseData = { tree: aggregatedTree, ...context };
|
|
184
|
+
// Return response in the determined format
|
|
185
|
+
sendResponse(req, res, responseData, 200);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
// If it's one of the errors in ERRORS, terminate with status code 400
|
|
189
|
+
if (ERROR_LIST.some(val => err instanceof val)) {
|
|
190
|
+
/** Execution block exists because manifest is already processed. Set's status to `fail`. */
|
|
191
|
+
envManifest.execution.status = 'fail';
|
|
192
|
+
envManifest.execution.error = err.toString();
|
|
193
|
+
// Return response in the determined format
|
|
194
|
+
sendResponse(req, res, envManifest, 400);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Set Content-Type to application/json
|
|
198
|
+
res.set('Content-Type', CT_JSON);
|
|
199
|
+
// For all other cases, terminate with status code 500
|
|
200
|
+
if (err instanceof Error) {
|
|
201
|
+
res.status(500).json({
|
|
202
|
+
error: INTERNAL_SERVER_ERROR,
|
|
203
|
+
detail: err.message,
|
|
204
|
+
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
res.status(500).json({ error: INTERNAL_SERVER_ERROR });
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// Set up custom error handler
|
|
211
|
+
app.use(
|
|
212
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
213
|
+
(err, _req, res, _next) => {
|
|
214
|
+
// Set Content-Type to application/json
|
|
215
|
+
res.set('Content-Type', CT_JSON);
|
|
216
|
+
// If SyntaxError (JSON parse error), terminate with status code 400
|
|
217
|
+
if (err.status === 400 && err instanceof SyntaxError && 'body' in err) {
|
|
218
|
+
res.status(400).json({
|
|
219
|
+
error: INVALID_JSON,
|
|
220
|
+
detail: err.message,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
else if (err instanceof Error) {
|
|
224
|
+
if ('status' in err) {
|
|
225
|
+
res.status(err.status).json({
|
|
226
|
+
error: err.message,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
res.status(500).json({
|
|
231
|
+
error: INTERNAL_SERVER_ERROR,
|
|
232
|
+
detail: err.message,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
res.status(500).json({
|
|
238
|
+
error: INTERNAL_SERVER_ERROR,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
// Start the server
|
|
243
|
+
const { port, host } = options;
|
|
244
|
+
const server = app.listen(port, host, (err) => {
|
|
245
|
+
if (err) {
|
|
246
|
+
logger_1.logger.error(SERVER_START_FAILED(err));
|
|
247
|
+
// eslint-disable-next-line no-process-exit
|
|
248
|
+
process.exit(2);
|
|
249
|
+
}
|
|
250
|
+
logger_1.logger.info(SERVER_STARTED(formatAddr(server.address())));
|
|
251
|
+
});
|
|
252
|
+
// Handle Signal
|
|
253
|
+
const handler = (err) => {
|
|
254
|
+
logger_1.logger.debug(`${err} signal received: closing HTTP server`);
|
|
255
|
+
server.close(() => {
|
|
256
|
+
logger_1.logger.debug('HTTP server closed');
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
process.once('SIGTERM', handler);
|
|
260
|
+
process.once('SIGINT', handler);
|
|
261
|
+
};
|
|
262
|
+
// Start the server
|
|
263
|
+
startServer().catch(err => {
|
|
264
|
+
logger_1.logger.error(SERVER_START_FAILED(err));
|
|
265
|
+
// eslint-disable-next-line no-process-exit
|
|
266
|
+
process.exit(2);
|
|
267
|
+
});
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWYtYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDBDQUFpQztBQUdqQyxzREFBOEI7QUFFOUIscUNBQW1DO0FBQ25DLGlEQUE2QztBQUc3Qyw4REFBd0Q7QUFDeEQsa0RBQTZDO0FBQzdDLG9EQUEwRDtBQUMxRCw0REFBNEQ7QUFFNUQsdURBQWtEO0FBQ2xELDJEQUF1RDtBQUN2RCx5REFJa0M7QUFDbEMsbURBQThDO0FBQzlDLG1EQUE4QztBQUU5QyxxQ0FBaUM7QUFDakMsc0NBQWtEO0FBRWxELE1BQU0sRUFDSixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixZQUFZLEVBQ1osWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsR0FBRyxnQkFBTyxDQUFDO0FBRVosTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUM7QUFDbkMsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUM7QUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFcEMsTUFBTSxVQUFVLEdBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBTSxDQUFDLENBQUM7QUFFdEU7O0dBRUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBb0IsRUFBRSxFQUFFO0lBQ3JELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxZQUFZLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRTtRQUMxQywyQ0FBMkM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxJQUFJLFlBQVksRUFBRTtZQUNoQixPQUFPLFlBQVksQ0FBQztT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QWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBbUIsRUFBRSxFQUFFO1FBQ3RDLGVBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLHVDQUF1QyxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDaEIsZUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsbUJBQW1CO0FBQ25CLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUN4QixlQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkMsMkNBQTJDO0lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQge29wZW59IGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB0eXBlIHtBZGRyZXNzSW5mb30gZnJvbSAnbmV0JztcblxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7TmV4dEZ1bmN0aW9uLCBSZXF1ZXN0LCBSZXNwb25zZX0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge2R1bXAsIGxvYWR9IGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5cbmltcG9ydCB0eXBlIHtNYW5pZmVzdH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzL21hbmlmZXN0JztcbmltcG9ydCB7ZGVidWdMb2dnZXJ9IGZyb20gJy4uL2NvbW1vbi91dGlsL2RlYnVnLWxvZ2dlcic7XG5pbXBvcnQge2xvZ2dlcn0gZnJvbSAnLi4vY29tbW9uL3V0aWwvbG9nZ2VyJztcbmltcG9ydCB7ZXhlY3V0ZVdpdGhDb250ZXh0fSBmcm9tICcuLi9jb21tb24vdXRpbC9zdG9yYWdlJztcbmltcG9ydCB7dmFsaWRhdGVNYW5pZmVzdH0gZnJvbSAnLi4vY29tbW9uL3V0aWwvdmFsaWRhdGlvbnMnO1xuXG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vaWYtcnVuL2xpYi9hZ2dyZWdhdGUnO1xuaW1wb3J0IHtnZXRFeGVjdXRpb259IGZyb20gJy4uL2lmLXJ1bi9saWIvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtcbiAgaW5pdGlhbGl6ZSxcbiAgc2V0RXh0ZXJuYWxQbHVnaW5XYXJuaW5nLFxuICBzZXREaXNhYmxlZFBsdWdpbnMsXG59IGZyb20gJy4uL2lmLXJ1bi9saWIvaW5pdGlhbGl6ZSc7XG5pbXBvcnQge2NvbXB1dGV9IGZyb20gJy4uL2lmLXJ1bi9saWIvY29tcHV0ZSc7XG5pbXBvcnQge2V4cGxhaW59IGZyb20gJy4uL2lmLXJ1bi9saWIvZXhwbGFpbic7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtwYXJzZUlmQXBpUHJvY2Vzc0FyZ3N9IGZyb20gJy4vdXRpbC9hcmdzJztcblxuY29uc3Qge1xuICBESVNDTEFJTUVSX01FU1NBR0UsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgSU5WQUxJRF9ESVNBQkxFRF9QTFVHSU5TLFxuICBJTlZBTElEX0pTT04sXG4gIElOVkFMSURfWUFNTCxcbiAgTUlTU0lOR19NQU5JRkVTVCxcbiAgUFJPQ0VTU0lOR19SRVFVRVNULFxuICBTRVJWRVJfU1RBUlRFRCxcbiAgU0VSVkVSX1NUQVJUX0ZBSUxFRCxcbiAgVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFLFxufSA9IFNUUklOR1M7XG5cbmNvbnN0IENUX1lBTUwgPSAnYXBwbGljYXRpb24veWFtbCc7XG5jb25zdCBDVF9KU09OID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuY29uc3QgQ1RfVkFMSUQgPSBbQ1RfWUFNTCwgQ1RfSlNPTl07XG5cbmNvbnN0IEVSUk9SX0xJU1Q6IHJlYWRvbmx5IEVycm9yQ29uc3RydWN0b3JbXSA9IE9iamVjdC52YWx1ZXMoRVJST1JTKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgcmVzcG9uc2UgdHlwZS5cbiAqL1xuY29uc3QgZGV0ZXJtaW5lUmVzcG9uc2VUeXBlID0gKHJlcTogZXhwcmVzcy5SZXF1ZXN0KSA9PiB7XG4gIGNvbnN0IGFjY2VwdEhlYWRlciA9IHJlcS5nZXQoJ0FjY2VwdCcpO1xuICBpZiAoYWNjZXB0SGVhZGVyICYmIGFjY2VwdEhlYWRlciAhPT0gJyovKicpIHtcbiAgICAvLyBEZXRlcm1pbmUgYmFzZWQgb24gcmVxdWVzdCBBY2NlcHQgaGVhZGVyXG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gcmVxLmFjY2VwdHMoQ1RfVkFMSUQpO1xuICAgIGlmIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIGJhc2VkIG9uIHJlcXVlc3QgQ29udGVudC1UeXBlXG4gIHJldHVybiByZXEuZ2V0KCdDb250ZW50LVR5cGUnKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcmVzcG9uc2UgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdC5cbiAqL1xuY29uc3Qgc2VuZFJlc3BvbnNlID0gKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG1hbmlmZXN0OiBNYW5pZmVzdCxcbiAgc3RhdHVzOiBudW1iZXJcbikgPT4ge1xuICBjb25zdCByZXNwb25zZVR5cGUgPSBkZXRlcm1pbmVSZXNwb25zZVR5cGUocmVxKTtcbiAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gQ1RfWUFNTCkge1xuICAgIGNvbnN0IHlhbWxEYXRhID0gZHVtcChtYW5pZmVzdCwge25vUmVmczogdHJ1ZX0pO1xuICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIHJlc3BvbnNlVHlwZSk7XG4gICAgcmVzLnN0YXR1cyhzdGF0dXMpLnNlbmQoeWFtbERhdGEpO1xuICB9IGVsc2Uge1xuICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIHJlc3BvbnNlVHlwZSk7XG4gICAgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24obWFuaWZlc3QpO1xuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIGRpc2FibGVkIHBsdWdpbnMgZmlsZVxuICogQHBhcmFtIGZpbGVuYW1lIEZpbGVuYW1lIHRoYXQgY29udGFpbnMgcGx1Z2luIG5hbWVzIHRvIGJlIGRpc2FibGVkXG4gKiBAcmV0dXJucyBTZXQgb2YgZGlzYWJsZWRQbHVnaW5zXG4gKi9cbmNvbnN0IHBhcnNlRGlzYWJsZWRQbHVnaW5zID0gYXN5bmMgKGZpbGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgLy8gSWYgbm8gZmlsZW5hbWUgaXMgc3BlY2lmaWVkLCBkaXNhYmxlIGJ1aWx0aW46U2hlbGwsIGJ1aWx0aW46Q1NWSW1wb3J0LCBidWlsdGluOkNTVkxvb2t1cCBieSBkZWZhdWx0LlxuICBpZiAoIWZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAnYnVpbHRpbjpTaGVsbCcsXG4gICAgICAnYnVpbHRpbjpDU1ZJbXBvcnQnLFxuICAgICAgJ2J1aWx0aW46Q1NWTG9va3VwJyxcbiAgICBdKTtcbiAgfVxuXG4gIGNvbnN0IGRpc2FibGVkUGx1Z2lucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlID0gYXdhaXQgb3BlbihmaWxlbmFtZSk7XG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBsaW5lIG9mIGZpbGUucmVhZExpbmVzKCkpIHtcbiAgICAgIGNvbnN0IHdvcmRzID0gbGluZS5zcGxpdCgvICo6ICovKTtcbiAgICAgIHN3aXRjaCAod29yZHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBkaXNhYmxlZFBsdWdpbnMuYWRkKGBidWlsdGluOiR7d29yZHNbMF19YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBkaXNhYmxlZFBsdWdpbnMuYWRkKGAke3dvcmRzWzBdfToke3dvcmRzWzFdfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX0RJU0FCTEVEX1BMVUdJTlMobGluZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmaWxlLmNsb3NlKCk7XG4gIH1cbiAgcmV0dXJuIGRpc2FibGVkUGx1Z2lucztcbn07XG5cbmNvbnN0IGZvcm1hdEFkZHIgPSAoYWRkcjogc3RyaW5nIHwgQWRkcmVzc0luZm8gfCBudWxsKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiBhZGRyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhZGRyO1xuICB9IGVsc2UgaWYgKGFkZHIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ3Vua25vd24nO1xuICB9IGVsc2UgaWYgKGFkZHIuZmFtaWx5ID09PSAnSVB2NicpIHtcbiAgICByZXR1cm4gYFske2FkZHIuYWRkcmVzc31dOiR7YWRkci5wb3J0fWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2FkZHIuYWRkcmVzc306JHthZGRyLnBvcnR9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBTdGFydCB0aGUgQVBJIHNlcnZlci5cbiAqL1xuY29uc3Qgc3RhcnRTZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUlmQXBpUHJvY2Vzc0FyZ3MoKTtcblxuICBkZWJ1Z0xvZ2dlci5vdmVycmlkZUNvbnNvbGVNZXRob2RzKG9wdGlvbnMuZGVidWcpO1xuXG4gIGxvZ2dlci5pbmZvKERJU0NMQUlNRVJfTUVTU0FHRSk7XG5cbiAgc2V0RXh0ZXJuYWxQbHVnaW5XYXJuaW5nKCFvcHRpb25zLmRpc2FibGVFeHRlcm5hbFBsdWdpbldhcm5pbmcpO1xuXG4gIGNvbnN0IGRpc2FibGVkUGx1Z2lucyA9IGF3YWl0IHBhcnNlRGlzYWJsZWRQbHVnaW5zKG9wdGlvbnMuZGlzYWJsZWRQbHVnaW5zKTtcbiAgc2V0RGlzYWJsZWRQbHVnaW5zKGRpc2FibGVkUGx1Z2lucyk7XG5cbiAgLy8gR2V0IGV4ZWN1dGlvbiBpbmZvcm1hdGlvbiAoY29tbWFuZCwgZW52aXJvbm1lbnQpLlxuICBjb25zdCBleGVjdXRpb24gPSBhd2FpdCBnZXRFeGVjdXRpb24oKTtcblxuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gTWlkZGxld2FyZSBmb3IgSlNPTiByZXF1ZXN0c1xuICBhcHAudXNlKGV4cHJlc3MuanNvbih7dHlwZTogQ1RfSlNPTn0pKTtcblxuICAvLyBDdXN0b20gbWlkZGxld2FyZSBmb3IgWUFNTCByZXF1ZXN0c1xuICBhcHAudXNlKFxuICAgIGV4cHJlc3MudGV4dCh7dHlwZTogQ1RfWUFNTH0pLFxuICAgIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHJlcS5pcyhDVF9ZQU1MKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcS5ib2R5ID0gbG9hZChyZXEuYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgICAgZXJyb3I6IElOVkFMSURfWUFNTCxcbiAgICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICApO1xuXG4gIC8vIEFkZCByZXF1ZXN0IGNvbnRleHQgc3RvcmFnZVxuICBhcHAudXNlKChfcmVxOiBSZXF1ZXN0LCBfcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PlxuICAgIGV4ZWN1dGVXaXRoQ29udGV4dChuZXh0KVxuICApO1xuXG4gIC8vIEhlYWx0aCBjaGVjayBlbmRwb2ludFxuICBhcHAuZ2V0KCcvaGVhbHRoJywgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiB2b2lkID0+IHtcbiAgICByZXMuc3RhdHVzKDIwMCkuc2VuZCgnT0snKTtcbiAgfSk7XG5cbiAgLy8gUHJvY2VzcyBtYW5pZmVzdCBlbmRwb2ludFxuICBhcHAucG9zdCgnL3YxL3J1bicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBsb2dnZXIuaW5mbyhQUk9DRVNTSU5HX1JFUVVFU1QpO1xuXG4gICAgLy8gQ2hlY2sgaWYgcmVxdWVzdCBib2R5IGV4aXN0c1xuICAgIGlmICghcmVxLmJvZHkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtlcnJvcjogTUlTU0lOR19NQU5JRkVTVH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHJlcXVlc3QgQ29udGVudC1UeXBlXG4gICAgaWYgKCFyZXEuaXMoQ1RfVkFMSUQpKSB7XG4gICAgICByZXMuc3RhdHVzKDQxNSkuanNvbih7ZXJyb3I6IFVOU1VQUE9SVEVEX0NPTlRFTlRfVFlQRX0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBtYW5pZmVzdCB3aXRoIGV4ZWN1dGlvbiBpbmZvcm1hdGlvblxuICAgIGNvbnN0IGVudk1hbmlmZXN0OiBNYW5pZmVzdCA9IHtcbiAgICAgIC4uLnJlcS5ib2R5LFxuICAgICAgZXhlY3V0aW9uOiB7XG4gICAgICAgIGNvbW1hbmQ6IGV4ZWN1dGlvbi5jb21tYW5kLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIC4uLmV4ZWN1dGlvbi5lbnZpcm9ubWVudCxcbiAgICAgICAgICAnZGF0ZS10aW1lJzogYCR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfSAoVVRDKWAsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogZXhlY3V0aW9uLnN0YXR1cyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dHJlZSwgLi4uY29udGV4dH0gPSB2YWxpZGF0ZU1hbmlmZXN0KGVudk1hbmlmZXN0KTtcblxuICAgICAgY29uc3QgcGx1Z2luU3RvcmFnZSA9IGF3YWl0IGluaXRpYWxpemUoY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IGNvbXB1dGVkVHJlZSA9IGF3YWl0IGNvbXB1dGUodHJlZSwge1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICBwbHVnaW5TdG9yYWdlLFxuICAgICAgICBvYnNlcnZlOiByZXEucXVlcnkub2JzZXJ2ZSA9PT0gJ3RydWUnLFxuICAgICAgICByZWdyb3VwOiByZXEucXVlcnkucmVncm91cCA9PT0gJ3RydWUnLFxuICAgICAgICBjb21wdXRlOiByZXEucXVlcnkuY29tcHV0ZSA9PT0gJ3RydWUnLFxuICAgICAgICBhcHBlbmQ6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRUcmVlID0gYWdncmVnYXRlKGNvbXB1dGVkVHJlZSwgY29udGV4dC5hZ2dyZWdhdGlvbik7XG5cbiAgICAgIGVudk1hbmlmZXN0LmV4cGxhaW5lciAmJiAoY29udGV4dC5leHBsYWluID0gZXhwbGFpbigpKTtcblxuICAgICAgLy8gUHJlcGFyZSByZXNwb25zZSBkYXRhXG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSB7dHJlZTogYWdncmVnYXRlZFRyZWUsIC4uLmNvbnRleHR9O1xuXG4gICAgICAvLyBSZXR1cm4gcmVzcG9uc2UgaW4gdGhlIGRldGVybWluZWQgZm9ybWF0XG4gICAgICBzZW5kUmVzcG9uc2UocmVxLCByZXMsIHJlc3BvbnNlRGF0YSwgMjAwKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGl0J3Mgb25lIG9mIHRoZSBlcnJvcnMgaW4gRVJST1JTLCB0ZXJtaW5hdGUgd2l0aCBzdGF0dXMgY29kZSA0MDBcbiAgICAgIGlmIChFUlJPUl9MSVNULnNvbWUodmFsID0+IGVyciBpbnN0YW5jZW9mIHZhbCkpIHtcbiAgICAgICAgLyoqIEV4ZWN1dGlvbiBibG9jayBleGlzdHMgYmVjYXVzZSBtYW5pZmVzdCBpcyBhbHJlYWR5IHByb2Nlc3NlZC4gU2V0J3Mgc3RhdHVzIHRvIGBmYWlsYC4gKi9cbiAgICAgICAgZW52TWFuaWZlc3QuZXhlY3V0aW9uIS5zdGF0dXMgPSAnZmFpbCc7XG4gICAgICAgIGVudk1hbmlmZXN0LmV4ZWN1dGlvbiEuZXJyb3IgPSAoZXJyIGFzIEVycm9yKS50b1N0cmluZygpO1xuXG4gICAgICAgIC8vIFJldHVybiByZXNwb25zZSBpbiB0aGUgZGV0ZXJtaW5lZCBmb3JtYXRcbiAgICAgICAgc2VuZFJlc3BvbnNlKHJlcSwgcmVzLCBlbnZNYW5pZmVzdCwgNDAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgQ29udGVudC1UeXBlIHRvIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIENUX0pTT04pO1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBjYXNlcywgdGVybWluYXRlIHdpdGggc3RhdHVzIGNvZGUgNTAwXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICAgIGVycm9yOiBJTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgZGV0YWlsOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogSU5URVJOQUxfU0VSVkVSX0VSUk9SfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBTZXQgdXAgY3VzdG9tIGVycm9yIGhhbmRsZXJcbiAgYXBwLnVzZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgKGVycjogYW55LCBfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBfbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgICAvLyBTZXQgQ29udGVudC1UeXBlIHRvIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIENUX0pTT04pO1xuXG4gICAgICAvLyBJZiBTeW50YXhFcnJvciAoSlNPTiBwYXJzZSBlcnJvciksIHRlcm1pbmF0ZSB3aXRoIHN0YXR1cyBjb2RlIDQwMFxuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMCAmJiBlcnIgaW5zdGFuY2VvZiBTeW50YXhFcnJvciAmJiAnYm9keScgaW4gZXJyKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoJ3N0YXR1cycgaW4gZXJyKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyhlcnIuc3RhdHVzIGFzIG51bWJlcikuanNvbih7XG4gICAgICAgICAgICBlcnJvcjogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICAgICAgZXJyb3I6IElOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgLy8gU3RhcnQgdGhlIHNlcnZlclxuICBjb25zdCB7cG9ydCwgaG9zdH0gPSBvcHRpb25zO1xuICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKHBvcnQsIGhvc3QsIChlcnI/OiBFcnJvcikgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihTRVJWRVJfU1RBUlRfRkFJTEVEKGVycikpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb2Nlc3MtZXhpdFxuICAgICAgcHJvY2Vzcy5leGl0KDIpO1xuICAgIH1cbiAgICBsb2dnZXIuaW5mbyhTRVJWRVJfU1RBUlRFRChmb3JtYXRBZGRyKHNlcnZlci5hZGRyZXNzKCkpKSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTaWduYWxcbiAgY29uc3QgaGFuZGxlciA9IChlcnI6IE5vZGVKUy5TaWduYWxzKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke2Vycn0gc2lnbmFsIHJlY2VpdmVkOiBjbG9zaW5nIEhUVFAgc2VydmVyYCk7XG4gICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnSFRUUCBzZXJ2ZXIgY2xvc2VkJyk7XG4gICAgfSk7XG4gIH07XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZXIpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZXIpO1xufTtcblxuLy8gU3RhcnQgdGhlIHNlcnZlclxuc3RhcnRTZXJ2ZXIoKS5jYXRjaChlcnIgPT4ge1xuICBsb2dnZXIuZXJyb3IoU0VSVkVSX1NUQVJUX0ZBSUxFRChlcnIpKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb2Nlc3MtZXhpdFxuICBwcm9jZXNzLmV4aXQoMik7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for if-api process arguments.
|
|
3
|
+
*/
|
|
4
|
+
export interface IfApiArgs {
|
|
5
|
+
debug: boolean;
|
|
6
|
+
disableExternalPluginWarning: boolean;
|
|
7
|
+
disabledPlugins?: string;
|
|
8
|
+
port: string;
|
|
9
|
+
host: string;
|
|
10
|
+
help?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface IfApiOptions {
|
|
13
|
+
debug: boolean;
|
|
14
|
+
disableExternalPluginWarning: boolean;
|
|
15
|
+
disabledPlugins: string | undefined;
|
|
16
|
+
port: number;
|
|
17
|
+
host: string;
|
|
18
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1hcmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLWFwaS90eXBlcy9wcm9jZXNzLWFyZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJmYWNlIGZvciBpZi1hcGkgcHJvY2VzcyBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWZBcGlBcmdzIHtcbiAgZGVidWc6IGJvb2xlYW47XG4gIGRpc2FibGVFeHRlcm5hbFBsdWdpbldhcm5pbmc6IGJvb2xlYW47XG4gIGRpc2FibGVkUGx1Z2lucz86IHN0cmluZztcbiAgcG9ydDogc3RyaW5nO1xuICBob3N0OiBzdHJpbmc7XG4gIGhlbHA/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElmQXBpT3B0aW9ucyB7XG4gIGRlYnVnOiBib29sZWFuO1xuICBkaXNhYmxlRXh0ZXJuYWxQbHVnaW5XYXJuaW5nOiBib29sZWFuO1xuICBkaXNhYmxlZFBsdWdpbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcG9ydDogbnVtYmVyO1xuICBob3N0OiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseIfApiProcessArgs = void 0;
|
|
4
|
+
const ts_command_line_args_1 = require("ts-command-line-args");
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
const { ARGS, HELP } = config_1.CONFIG;
|
|
7
|
+
const { INVALID_PORT_NUMBER } = config_1.STRINGS;
|
|
8
|
+
/**
|
|
9
|
+
* Validates `if-api` process arguments.
|
|
10
|
+
*/
|
|
11
|
+
const validateAndParseProcessArgs = () => {
|
|
12
|
+
try {
|
|
13
|
+
return (0, ts_command_line_args_1.parse)(ARGS, HELP);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error instanceof Error) {
|
|
17
|
+
console.log(error.message);
|
|
18
|
+
console.log('Here are the supported flags for the `if-api` command:');
|
|
19
|
+
(0, ts_command_line_args_1.parse)(ARGS, { ...HELP, argv: ['--help'], processExitCode: 1 });
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Parse command line arguments for `if-api`.
|
|
26
|
+
*/
|
|
27
|
+
const parseIfApiProcessArgs = () => {
|
|
28
|
+
const options = validateAndParseProcessArgs();
|
|
29
|
+
const port = parseInt(options.port, 10);
|
|
30
|
+
if (Number.isNaN(port) || port < 0 || port > 65535) {
|
|
31
|
+
throw new Error(INVALID_PORT_NUMBER(options.port));
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
debug: options.debug,
|
|
35
|
+
disableExternalPluginWarning: options.disableExternalPluginWarning,
|
|
36
|
+
disabledPlugins: options.disabledPlugins,
|
|
37
|
+
port,
|
|
38
|
+
host: options.host,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
exports.parseIfApiProcessArgs = parseIfApiProcessArgs;
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1hcGkvdXRpbC9hcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUEyQztBQUUzQyxzQ0FBMEM7QUFHMUMsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDNUIsTUFBTSxFQUFDLG1CQUFtQixFQUFDLEdBQUcsZ0JBQU8sQ0FBQztBQUV0Qzs7R0FFRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsR0FBYyxFQUFFO0lBQ2xELElBQUk7UUFDRixPQUFPLElBQUEsNEJBQUssRUFBWSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDckM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDdEUsSUFBQSw0QkFBSyxFQUFZLElBQUksRUFBRSxFQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsTUFBTSxLQUFLLENBQUM7S0FDYjtBQUNILENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0ksTUFBTSxxQkFBcUIsR0FBRyxHQUFpQixFQUFFO0lBQ3RELE1BQU0sT0FBTyxHQUFHLDJCQUEyQixFQUFFLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRTtRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ3BEO0lBRUQsT0FBTztRQUNMLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQiw0QkFBNEIsRUFBRSxPQUFPLENBQUMsNEJBQTRCO1FBQ2xFLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtRQUN4QyxJQUFJO1FBQ0osSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0tBQ25CLENBQUM7QUFDSixDQUFDLENBQUM7QUFkVyxRQUFBLHFCQUFxQix5QkFjaEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3BhcnNlfSBmcm9tICd0cy1jb21tYW5kLWxpbmUtYXJncyc7XG5cbmltcG9ydCB7Q09ORklHLCBTVFJJTkdTfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHR5cGUge0lmQXBpQXJncywgSWZBcGlPcHRpb25zfSBmcm9tICcuLi90eXBlcy9wcm9jZXNzLWFyZ3MnO1xuXG5jb25zdCB7QVJHUywgSEVMUH0gPSBDT05GSUc7XG5jb25zdCB7SU5WQUxJRF9QT1JUX05VTUJFUn0gPSBTVFJJTkdTO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBgaWYtYXBpYCBwcm9jZXNzIGFyZ3VtZW50cy5cbiAqL1xuY29uc3QgdmFsaWRhdGVBbmRQYXJzZVByb2Nlc3NBcmdzID0gKCk6IElmQXBpQXJncyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlPElmQXBpQXJncz4oQVJHUywgSEVMUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5sb2coJ0hlcmUgYXJlIHRoZSBzdXBwb3J0ZWQgZmxhZ3MgZm9yIHRoZSBgaWYtYXBpYCBjb21tYW5kOicpO1xuICAgICAgcGFyc2U8SWZBcGlBcmdzPihBUkdTLCB7Li4uSEVMUCwgYXJndjogWyctLWhlbHAnXSwgcHJvY2Vzc0V4aXRDb2RlOiAxfSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIGBpZi1hcGlgLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VJZkFwaVByb2Nlc3NBcmdzID0gKCk6IElmQXBpT3B0aW9ucyA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB2YWxpZGF0ZUFuZFBhcnNlUHJvY2Vzc0FyZ3MoKTtcbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydCwgMTApO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBvcnQpIHx8IHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkge1xuICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1BPUlRfTlVNQkVSKG9wdGlvbnMucG9ydCkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICBkaXNhYmxlRXh0ZXJuYWxQbHVnaW5XYXJuaW5nOiBvcHRpb25zLmRpc2FibGVFeHRlcm5hbFBsdWdpbldhcm5pbmcsXG4gICAgZGlzYWJsZWRQbHVnaW5zOiBvcHRpb25zLmRpc2FibGVkUGx1Z2lucyxcbiAgICBwb3J0LFxuICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCxcbiAgfTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONFIG = void 0;
|
|
4
|
+
exports.CONFIG = {
|
|
5
|
+
ARGS: {
|
|
6
|
+
manifest: {
|
|
7
|
+
type: String,
|
|
8
|
+
alias: 'm',
|
|
9
|
+
description: 'Path of the manifest file',
|
|
10
|
+
},
|
|
11
|
+
parameters: {
|
|
12
|
+
type: String,
|
|
13
|
+
alias: 'p',
|
|
14
|
+
description: 'List of parameters to check',
|
|
15
|
+
multiple: true,
|
|
16
|
+
defaultValue: [],
|
|
17
|
+
},
|
|
18
|
+
help: {
|
|
19
|
+
type: Boolean,
|
|
20
|
+
alias: 'h',
|
|
21
|
+
description: 'Prints out the help instruction',
|
|
22
|
+
optional: true,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLW1ldGFkYXRhLWNoZWNrL2NvbmZpZy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR2EsUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFO1FBQ0osUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSwyQkFBMkI7U0FDekM7UUFDRCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLDZCQUE2QjtZQUMxQyxRQUFRLEVBQUUsSUFBSTtZQUNkLFlBQVksRUFBRSxFQUFFO1NBQ2pCO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSxpQ0FBaUM7WUFDOUMsUUFBUSxFQUFFLElBQUk7U0FDZjtLQUNxQztDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmd1bWVudENvbmZpZ30gZnJvbSAndHMtY29tbWFuZC1saW5lLWFyZ3MnO1xuaW1wb3J0IHtJRkNoZWNrTWV0YWRhdGFBcmdzfSBmcm9tICcuLi90eXBlcy9wcm9jZXNzLWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgQ09ORklHID0ge1xuICBBUkdTOiB7XG4gICAgbWFuaWZlc3Q6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGFsaWFzOiAnbScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIG1hbmlmZXN0IGZpbGUnLFxuICAgIH0sXG4gICAgcGFyYW1ldGVyczoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgYWxpYXM6ICdwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGNoZWNrJyxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBbXSxcbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBhbGlhczogJ2gnLFxuICAgICAgZGVzY3JpcHRpb246ICdQcmludHMgb3V0IHRoZSBoZWxwIGluc3RydWN0aW9uJyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0gYXMgQXJndW1lbnRDb25maWc8SUZDaGVja01ldGFkYXRhQXJncz4sXG59O1xuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STRINGS = void 0;
|
|
4
|
+
exports.STRINGS = {
|
|
5
|
+
PARAMETERS_MISSING_METADATA: 'The following parameters are missing metadata: ',
|
|
6
|
+
ALL_PARAMETERS_HAVE_METADATA: 'All parameters have associated metadata.',
|
|
7
|
+
PERCENTAGE_COVERAGE: 'Metadata coverage percentage: ',
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1tZXRhZGF0YS1jaGVjay9jb25maWcvc3RyaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLE9BQU8sR0FBRztJQUNyQiwyQkFBMkIsRUFDekIsaURBQWlEO0lBQ25ELDRCQUE0QixFQUFFLDBDQUEwQztJQUN4RSxtQkFBbUIsRUFBRSxnQ0FBZ0M7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBTVFJJTkdTID0ge1xuICBQQVJBTUVURVJTX01JU1NJTkdfTUVUQURBVEE6XG4gICAgJ1RoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgbWlzc2luZyBtZXRhZGF0YTogJyxcbiAgQUxMX1BBUkFNRVRFUlNfSEFWRV9NRVRBREFUQTogJ0FsbCBwYXJhbWV0ZXJzIGhhdmUgYXNzb2NpYXRlZCBtZXRhZGF0YS4nLFxuICBQRVJDRU5UQUdFX0NPVkVSQUdFOiAnTWV0YWRhdGEgY292ZXJhZ2UgcGVyY2VudGFnZTogJyxcbn07XG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/user/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const args_1 = require("./util/args");
|
|
5
|
+
const metadata_checker_1 = require("./util/metadata-checker");
|
|
6
|
+
const debug_logger_1 = require("../common/util/debug-logger");
|
|
7
|
+
const logger_1 = require("../common/util/logger");
|
|
8
|
+
const strings_1 = require("./config/strings");
|
|
9
|
+
const { PERCENTAGE_COVERAGE, ALL_PARAMETERS_HAVE_METADATA, PARAMETERS_MISSING_METADATA, } = strings_1.STRINGS;
|
|
10
|
+
const IfCheckMetadata = async () => {
|
|
11
|
+
debug_logger_1.debugLogger.overrideConsoleMethods(false);
|
|
12
|
+
const { parameters, ...manifestData } = await (0, args_1.parseIFCheckMetadataArgs)();
|
|
13
|
+
const parameterSet = (0, metadata_checker_1.getParameters)(Object.values(manifestData.initialize.plugins), parameters);
|
|
14
|
+
const parameterWithMetadataSet = (0, metadata_checker_1.getParametersWithMetadata)(Object.values(manifestData.initialize.plugins));
|
|
15
|
+
const { percentage, missingParameters } = (0, metadata_checker_1.calculateMetadataCoverage)(parameterSet, parameterWithMetadataSet);
|
|
16
|
+
console.log(`${PERCENTAGE_COVERAGE} ${percentage.toFixed(2)}%`);
|
|
17
|
+
if (missingParameters.length > 0) {
|
|
18
|
+
console.log(PARAMETERS_MISSING_METADATA);
|
|
19
|
+
missingParameters.forEach(parameter => console.log(` - ${parameter}`));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.log(ALL_PARAMETERS_HAVE_METADATA);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
IfCheckMetadata().catch(error => {
|
|
26
|
+
if (error instanceof Error)
|
|
27
|
+
logger_1.logger.error(`${error.message}`);
|
|
28
|
+
throw error;
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWYtbWV0YWRhdGEtY2hlY2svaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0Esc0NBQXFEO0FBQ3JELDhEQUlpQztBQUNqQyw4REFBd0Q7QUFDeEQsa0RBQTZDO0FBQzdDLDhDQUF5QztBQUV6QyxNQUFNLEVBQ0osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QiwyQkFBMkIsR0FDNUIsR0FBRyxpQkFBTyxDQUFDO0FBRVosTUFBTSxlQUFlLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDakMsMEJBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUMsVUFBVSxFQUFFLEdBQUcsWUFBWSxFQUFDLEdBQUcsTUFBTSxJQUFBLCtCQUF3QixHQUFFLENBQUM7SUFFdkUsTUFBTSxZQUFZLEdBQUcsSUFBQSxnQ0FBYSxFQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFlLEVBQzVELFVBQVUsQ0FDWCxDQUFDO0lBQ0YsTUFBTSx3QkFBd0IsR0FBRyxJQUFBLDRDQUF5QixFQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFlLENBQzdELENBQUM7SUFDRixNQUFNLEVBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFDLEdBQUcsSUFBQSw0Q0FBeUIsRUFDL0QsWUFBWSxFQUNaLHdCQUF3QixDQUN6QixDQUFDO0lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDekMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN6RTtTQUFNO1FBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQzlCLElBQUksS0FBSyxZQUFZLEtBQUs7UUFBRSxlQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0QsTUFBTSxLQUFLLENBQUM7QUFDZCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3VzZXIvYmluL2VudiBub2RlXG5cbmltcG9ydCB7SUZQbHVnaW59IGZyb20gJy4vdHlwZXMvcGx1Z2luJztcbmltcG9ydCB7cGFyc2VJRkNoZWNrTWV0YWRhdGFBcmdzfSBmcm9tICcuL3V0aWwvYXJncyc7XG5pbXBvcnQge1xuICBnZXRQYXJhbWV0ZXJzLFxuICBnZXRQYXJhbWV0ZXJzV2l0aE1ldGFkYXRhLFxuICBjYWxjdWxhdGVNZXRhZGF0YUNvdmVyYWdlLFxufSBmcm9tICcuL3V0aWwvbWV0YWRhdGEtY2hlY2tlcic7XG5pbXBvcnQge2RlYnVnTG9nZ2VyfSBmcm9tICcuLi9jb21tb24vdXRpbC9kZWJ1Zy1sb2dnZXInO1xuaW1wb3J0IHtsb2dnZXJ9IGZyb20gJy4uL2NvbW1vbi91dGlsL2xvZ2dlcic7XG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4vY29uZmlnL3N0cmluZ3MnO1xuXG5jb25zdCB7XG4gIFBFUkNFTlRBR0VfQ09WRVJBR0UsXG4gIEFMTF9QQVJBTUVURVJTX0hBVkVfTUVUQURBVEEsXG4gIFBBUkFNRVRFUlNfTUlTU0lOR19NRVRBREFUQSxcbn0gPSBTVFJJTkdTO1xuXG5jb25zdCBJZkNoZWNrTWV0YWRhdGEgPSBhc3luYyAoKSA9PiB7XG4gIGRlYnVnTG9nZ2VyLm92ZXJyaWRlQ29uc29sZU1ldGhvZHMoZmFsc2UpO1xuICBjb25zdCB7cGFyYW1ldGVycywgLi4ubWFuaWZlc3REYXRhfSA9IGF3YWl0IHBhcnNlSUZDaGVja01ldGFkYXRhQXJncygpO1xuXG4gIGNvbnN0IHBhcmFtZXRlclNldCA9IGdldFBhcmFtZXRlcnMoXG4gICAgT2JqZWN0LnZhbHVlcyhtYW5pZmVzdERhdGEuaW5pdGlhbGl6ZS5wbHVnaW5zKSBhcyBJRlBsdWdpbltdLFxuICAgIHBhcmFtZXRlcnNcbiAgKTtcbiAgY29uc3QgcGFyYW1ldGVyV2l0aE1ldGFkYXRhU2V0ID0gZ2V0UGFyYW1ldGVyc1dpdGhNZXRhZGF0YShcbiAgICBPYmplY3QudmFsdWVzKG1hbmlmZXN0RGF0YS5pbml0aWFsaXplLnBsdWdpbnMpIGFzIElGUGx1Z2luW11cbiAgKTtcbiAgY29uc3Qge3BlcmNlbnRhZ2UsIG1pc3NpbmdQYXJhbWV0ZXJzfSA9IGNhbGN1bGF0ZU1ldGFkYXRhQ292ZXJhZ2UoXG4gICAgcGFyYW1ldGVyU2V0LFxuICAgIHBhcmFtZXRlcldpdGhNZXRhZGF0YVNldFxuICApO1xuICBjb25zb2xlLmxvZyhgJHtQRVJDRU5UQUdFX0NPVkVSQUdFfSAke3BlcmNlbnRhZ2UudG9GaXhlZCgyKX0lYCk7XG4gIGlmIChtaXNzaW5nUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coUEFSQU1FVEVSU19NSVNTSU5HX01FVEFEQVRBKTtcbiAgICBtaXNzaW5nUGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtZXRlciA9PiBjb25zb2xlLmxvZyhgICAtICR7cGFyYW1ldGVyfWApKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhBTExfUEFSQU1FVEVSU19IQVZFX01FVEFEQVRBKTtcbiAgfVxufTtcblxuSWZDaGVja01ldGFkYXRhKCkuY2F0Y2goZXJyb3IgPT4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgbG9nZ2VyLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gIHRocm93IGVycm9yO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLW1ldGFkYXRhLWNoZWNrL3R5cGVzL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQbHVnaW5QYXJhbWV0ZXJzTWV0YWRhdGF9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZQbHVnaW4ge1xuICBwYXRoOiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAncGFyYW1ldGVyLW1ldGFkYXRhJz86IFBsdWdpblBhcmFtZXRlcnNNZXRhZGF0YTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1hcmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLW1ldGFkYXRhLWNoZWNrL3R5cGVzL3Byb2Nlc3MtYXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJRkNoZWNrTWV0YWRhdGFBcmdzIHtcbiAgbWFuaWZlc3Q6IHN0cmluZztcbiAgcGFyYW1ldGVyczogc3RyaW5nW107XG4gIGhlbHA/OiBib29sZWFuO1xufVxuIl19
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export declare const parseIFCheckMetadataArgs: () => Promise<{
|
|
2
|
+
parameters: string[];
|
|
3
|
+
name: string;
|
|
4
|
+
initialize: {
|
|
5
|
+
plugins: Record<string, {
|
|
6
|
+
path: string;
|
|
7
|
+
method: string;
|
|
8
|
+
mapping?: Record<string, string> | undefined;
|
|
9
|
+
config?: Record<string, any> | undefined;
|
|
10
|
+
'parameter-metadata'?: {
|
|
11
|
+
inputs?: Record<string, {
|
|
12
|
+
unit: string;
|
|
13
|
+
description: string;
|
|
14
|
+
'aggregation-method': {
|
|
15
|
+
time: "sum" | "avg" | "none" | "copy";
|
|
16
|
+
component: "sum" | "avg" | "none" | "copy";
|
|
17
|
+
};
|
|
18
|
+
}> | null | undefined;
|
|
19
|
+
outputs?: Record<string, {
|
|
20
|
+
unit: string;
|
|
21
|
+
description: string;
|
|
22
|
+
'aggregation-method': {
|
|
23
|
+
time: "sum" | "avg" | "none" | "copy";
|
|
24
|
+
component: "sum" | "avg" | "none" | "copy";
|
|
25
|
+
};
|
|
26
|
+
}> | null | undefined;
|
|
27
|
+
} | undefined;
|
|
28
|
+
} | undefined>;
|
|
29
|
+
};
|
|
30
|
+
tree: Record<string, any>;
|
|
31
|
+
description?: string | null | undefined;
|
|
32
|
+
tags?: {
|
|
33
|
+
kind?: string | null | undefined;
|
|
34
|
+
complexity?: string | null | undefined;
|
|
35
|
+
category?: string | null | undefined;
|
|
36
|
+
} | null | undefined;
|
|
37
|
+
explainer?: boolean | undefined;
|
|
38
|
+
explain?: Record<string, any> | undefined;
|
|
39
|
+
aggregation?: {
|
|
40
|
+
type: "horizontal" | "time" | "vertical" | "component" | "both";
|
|
41
|
+
metrics: string[];
|
|
42
|
+
'skip-components'?: string[] | undefined;
|
|
43
|
+
} | null | undefined;
|
|
44
|
+
execution?: {
|
|
45
|
+
status: string;
|
|
46
|
+
command?: string | undefined;
|
|
47
|
+
environment?: {
|
|
48
|
+
'if-version': string;
|
|
49
|
+
os: string;
|
|
50
|
+
'os-version': string;
|
|
51
|
+
'node-version': string;
|
|
52
|
+
'date-time': string;
|
|
53
|
+
dependencies: string[];
|
|
54
|
+
} | undefined;
|
|
55
|
+
error?: string | undefined;
|
|
56
|
+
} | undefined;
|
|
57
|
+
}>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseIFCheckMetadataArgs = void 0;
|
|
4
|
+
const ts_command_line_args_1 = require("ts-command-line-args");
|
|
5
|
+
const config_1 = require("../config/config");
|
|
6
|
+
const helpers_1 = require("../../common/util/helpers");
|
|
7
|
+
const load_1 = require("../../common/lib/load");
|
|
8
|
+
const validations_1 = require("../../common/util/validations");
|
|
9
|
+
const { ARGS } = config_1.CONFIG;
|
|
10
|
+
const validateAndParseIFCheckMetadataArgs = () => {
|
|
11
|
+
try {
|
|
12
|
+
return (0, ts_command_line_args_1.parse)(ARGS);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error instanceof Error) {
|
|
16
|
+
console.log(error.message);
|
|
17
|
+
(0, helpers_1.runHelpCommand)('if-check-metadata');
|
|
18
|
+
}
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const parseIFCheckMetadataArgs = async () => {
|
|
23
|
+
const { manifest, parameters } = validateAndParseIFCheckMetadataArgs();
|
|
24
|
+
const { rawManifest } = await (0, load_1.load)(manifest);
|
|
25
|
+
const validatedManifest = (0, validations_1.validateManifest)(rawManifest);
|
|
26
|
+
return { ...validatedManifest, parameters };
|
|
27
|
+
};
|
|
28
|
+
exports.parseIFCheckMetadataArgs = parseIFCheckMetadataArgs;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1tZXRhZGF0YS1jaGVjay91dGlsL2FyZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0RBQTJDO0FBQzNDLDZDQUF3QztBQUN4Qyx1REFBeUQ7QUFDekQsZ0RBQTJDO0FBQzNDLCtEQUErRDtBQUUvRCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRXRCLE1BQU0sbUNBQW1DLEdBQUcsR0FBd0IsRUFBRTtJQUNwRSxJQUFJO1FBQ0YsT0FBTyxJQUFBLDRCQUFLLEVBQXNCLElBQUksQ0FBQyxDQUFDO0tBQ3pDO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsSUFBQSx3QkFBYyxFQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDckM7UUFDRCxNQUFNLEtBQUssQ0FBQztLQUNiO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSx3QkFBd0IsR0FBRyxLQUFLLElBQUksRUFBRTtJQUNqRCxNQUFNLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBQyxHQUFHLG1DQUFtQyxFQUFFLENBQUM7SUFDckUsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLE1BQU0sSUFBQSxXQUFJLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLDhCQUFnQixFQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sRUFBQyxHQUFHLGlCQUFpQixFQUFFLFVBQVUsRUFBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQUxXLFFBQUEsd0JBQXdCLDRCQUtuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SUZDaGVja01ldGFkYXRhQXJnc30gZnJvbSAnLi4vdHlwZXMvcHJvY2Vzcy1hcmdzJztcbmltcG9ydCB7cGFyc2V9IGZyb20gJ3RzLWNvbW1hbmQtbGluZS1hcmdzJztcbmltcG9ydCB7Q09ORklHfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcbmltcG9ydCB7cnVuSGVscENvbW1hbmR9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlsL2hlbHBlcnMnO1xuaW1wb3J0IHtsb2FkfSBmcm9tICcuLi8uLi9jb21tb24vbGliL2xvYWQnO1xuaW1wb3J0IHt2YWxpZGF0ZU1hbmlmZXN0fSBmcm9tICcuLi8uLi9jb21tb24vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmNvbnN0IHtBUkdTfSA9IENPTkZJRztcblxuY29uc3QgdmFsaWRhdGVBbmRQYXJzZUlGQ2hlY2tNZXRhZGF0YUFyZ3MgPSAoKTogSUZDaGVja01ldGFkYXRhQXJncyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlPElGQ2hlY2tNZXRhZGF0YUFyZ3M+KEFSR1MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgIHJ1bkhlbHBDb21tYW5kKCdpZi1jaGVjay1tZXRhZGF0YScpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlSUZDaGVja01ldGFkYXRhQXJncyA9IGFzeW5jICgpID0+IHtcbiAgY29uc3Qge21hbmlmZXN0LCBwYXJhbWV0ZXJzfSA9IHZhbGlkYXRlQW5kUGFyc2VJRkNoZWNrTWV0YWRhdGFBcmdzKCk7XG4gIGNvbnN0IHtyYXdNYW5pZmVzdH0gPSBhd2FpdCBsb2FkKG1hbmlmZXN0KTtcbiAgY29uc3QgdmFsaWRhdGVkTWFuaWZlc3QgPSB2YWxpZGF0ZU1hbmlmZXN0KHJhd01hbmlmZXN0KTtcbiAgcmV0dXJuIHsuLi52YWxpZGF0ZWRNYW5pZmVzdCwgcGFyYW1ldGVyc307XG59O1xuIl19
|