Files
2026-08-25 10:33:29 +08:00

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
};
}));