107 lines
3.2 KiB
JavaScript
107 lines
3.2 KiB
JavaScript
(function installLTJTLifecycleResult(root, factory) {
|
|
const api = factory();
|
|
if (typeof module !== 'undefined' && module.exports) module.exports = api;
|
|
if (root) root.LTJTLifecycleResult = api;
|
|
}(typeof self !== 'undefined' ? self : globalThis, () => {
|
|
const EVIDENCE_KEYS = [
|
|
'resolved_refs',
|
|
'before_snapshot',
|
|
'preflight',
|
|
'native_request',
|
|
'server_response',
|
|
'requery',
|
|
'side_effects',
|
|
'manual_review_required'
|
|
];
|
|
|
|
function emptyLifecycleEvidence() {
|
|
return {
|
|
resolved_refs: {},
|
|
before_snapshot: null,
|
|
preflight: null,
|
|
native_request: null,
|
|
server_response: null,
|
|
requery: null,
|
|
side_effects: [],
|
|
manual_review_required: false
|
|
};
|
|
}
|
|
|
|
function lifecycleResult(status, data = {}) {
|
|
return {
|
|
status: String(status || 'blocked'),
|
|
...emptyLifecycleEvidence(),
|
|
...data,
|
|
side_effects: Array.isArray(data.side_effects) ? data.side_effects : [],
|
|
manual_review_required: data.manual_review_required === true
|
|
};
|
|
}
|
|
|
|
function hasServerResponse(result) {
|
|
const response = result?.server_response;
|
|
return Boolean(response && typeof response === 'object'
|
|
&& response.completed === true
|
|
&& Number.isInteger(response.http_status)
|
|
&& response.http_status >= 200
|
|
&& response.http_status < 300);
|
|
}
|
|
|
|
function hasVerifiedRequery(result) {
|
|
return Boolean(result && result.requery && result.requery.matched === true);
|
|
}
|
|
|
|
function isVerifiedResult(result) {
|
|
return result?.status === 'lifecycle_completed'
|
|
&& hasServerResponse(result)
|
|
&& hasVerifiedRequery(result)
|
|
&& result.manual_review_required !== true;
|
|
}
|
|
|
|
function hasFrozenSourceArtifacts(result) {
|
|
return Array.isArray(result?.artifacts)
|
|
&& result.artifacts.length > 0
|
|
&& result.artifacts.every((artifact) => artifact
|
|
&& artifact.ok === true
|
|
&& Number.isInteger(artifact.http_status)
|
|
&& artifact.http_status >= 200
|
|
&& artifact.http_status < 300
|
|
&& Number.isInteger(artifact.bytes)
|
|
&& artifact.bytes > 0
|
|
&& typeof artifact.content_type === 'string'
|
|
&& artifact.content_type.trim().length > 0
|
|
&& /^[a-f0-9]{64}$/i.test(String(artifact.sha256 || ''))
|
|
&& artifact.login_timeout !== true
|
|
&& artifact.permission_error !== true
|
|
&& artifact.downloaded === false
|
|
&& artifact.converted === false
|
|
&& artifact.scheduled === false
|
|
&& artifact.sent === false);
|
|
}
|
|
|
|
function isVerifiedExportResult(result) {
|
|
return result?.status === 'export_source_completed'
|
|
&& result.no_erp_write === true
|
|
&& result.write_attempted === false
|
|
&& hasServerResponse(result)
|
|
&& hasVerifiedRequery(result)
|
|
&& result.requery?.hashes_frozen === true
|
|
&& hasFrozenSourceArtifacts(result)
|
|
&& result.downloaded === false
|
|
&& result.converted === false
|
|
&& result.scheduled === false
|
|
&& result.sent === false
|
|
&& result.manual_review_required !== true;
|
|
}
|
|
|
|
return {
|
|
EVIDENCE_KEYS,
|
|
emptyLifecycleEvidence,
|
|
hasFrozenSourceArtifacts,
|
|
hasServerResponse,
|
|
hasVerifiedRequery,
|
|
isVerifiedExportResult,
|
|
isVerifiedResult,
|
|
lifecycleResult
|
|
};
|
|
}));
|