yini-parser
Version:
Readable configuration without YAML foot-guns or JSON noise. The official Node.js parser for YINI config format — An INI-inspired configuration format with clear nesting, explicit types, and predictable parsing.
186 lines • 7.95 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildResultMetadata = void 0;
const package_json_1 = __importDefault(require("../../package.json")); // NOTE: Requires "resolveJsonModule": true (or "esModuleInterop": true).
const env_1 = require("../config/env");
const object_1 = require("../utils/object");
const print_1 = require("../utils/print");
const string_1 = require("../utils/string");
const modeFromRulesMatcher_1 = require("./parsingRules/modeFromRulesMatcher");
const buildResultMetadata = (p) => {
// --- Construct meta information -------------------------------------
const to3 = (n) => {
if (!n) {
if ((0, env_1.isProdEnv)()) {
return 0;
}
else {
(0, print_1.debugPrint)('In buildResultMetadata(..): p.runtimeInfo:');
(0, print_1.printObject)(p.runtimeInfo);
(0, print_1.debugPrint)('In buildResultMetadata(..): p.coreOptions:');
(0, print_1.printObject)(p.coreOptions);
(0, print_1.debugPrint)('In buildResultMetadata(..): p.durationMs:');
(0, print_1.printObject)(p.durationMs);
// p.errorHandler.pushOrBail(null,'Internal-Error', 'to3 received undefined')
throw Error('to3(..) received undefined');
}
}
return Number.parseFloat(n.toFixed(3));
};
// Construct meta data.
const metadata = {
parserVersion: package_json_1.default.version,
mode: p.coreOptions.rules.initialMode,
totalErrors: p.errorHandler.getNumOfErrors(),
totalWarnings: p.errorHandler.getNumOfWarnings(),
totalMessages: p.errorHandler.getNumOfAllMessages(),
runStartedAt: p.runStartedAt,
runFinishedAt: p.runFinishedAt,
durationMs: to3(p.durationMs),
preservesOrder: true,
orderGuarantee: 'implementation-defined',
source: {
// sourceType: toLowerSnakeCase(ast.sourceType),
sourceType: (0, string_1.toLowerKebabCase)(p.ast.sourceType),
fileName: p.ast.fileName,
hasDocumentTerminator: p.ast.terminatorSeen,
hasYiniMarker: p.ast.yiniMarkerSeen,
lineCount: p.runtimeInfo.lineCount,
byteSize: p.runtimeInfo.fileByteSize,
sha256: p.runtimeInfo.sha256,
},
structure: {
maxDepth: p.ast.maxDepth,
sectionCount: p.ast.numOfSections,
memberCount: p.ast.numOfMembers,
keysParsedCount: null,
// objectCount: null,
// listCount: null,
sectionNamePaths: p.ast.sectionNamePaths,
},
metaSchemaVersion: '1.1.1',
};
// Attach optional diagnostics.
if (p.coreOptions.isWithDiagnostics) {
const mapLevelKey = (level) => {
switch (level) {
case '0-Ignore-Errors':
return 'ignore-errors';
case '1-Abort-on-Errors':
return 'errors';
case '2-Abort-Even-on-Warnings':
return 'warnings-and-errors';
}
};
const mapLevelDescription = (level) => {
switch (level) {
case '0-Ignore-Errors':
return 'Continue despite errors.';
case '1-Abort-on-Errors':
return 'Abort when errors occur.';
case '2-Abort-Even-on-Warnings':
return 'Abort when errors or warnings occur.';
}
return null;
};
const effectiveMode = (0, modeFromRulesMatcher_1.matchModeFromCoreOptions)(p.coreOptions);
metadata.diagnostics = {
failLevel: {
preferredLevel: p.runtimeInfo.preferredBailSensitivity,
usedLevelType: p.coreOptions.bailSensitivity,
usedLevelKey: mapLevelKey(p.coreOptions.bailSensitivity),
levelDescription: (mapLevelDescription(p.coreOptions.bailSensitivity)),
},
errors: {
errorCount: p.errorHandler.getNumOfErrors(),
payload: p.errorHandler.getErrors(),
},
warnings: {
warningCount: p.errorHandler.getNumOfWarnings(),
payload: p.errorHandler.getWarnings(),
},
notices: {
noticeCount: p.errorHandler.getNumOfNotices(),
payload: p.errorHandler.getNotices(),
},
infos: {
infoCount: p.errorHandler.getNumOfInfos(),
payload: p.errorHandler.getInfos(),
},
environment: {
NODE_ENV: process.env.NODE_ENV,
APP_ENV: process.env.APP_ENV,
lib: {
nodeEnv: env_1.localNodeEnv,
appEnv: env_1.localAppEnv,
flags: { isDev: (0, env_1.isDev)(), isDebug: (0, env_1.isDebug)() },
},
},
effectiveOptions: (0, object_1.sortObjectKeys)({
effectiveMode: effectiveMode, // Appended.
// IMPORTANT: (!) These user options MUST be mapped from coreOptions (to user options).
strictMode: effectiveMode === 'strict' ? true : false,
failLevel: mapLevelKey(p.coreOptions.bailSensitivity),
includeMetadata: p.coreOptions.isIncludeMeta,
includeDiagnostics: p.coreOptions.isWithDiagnostics,
includeTiming: p.coreOptions.isWithTiming,
preserveUndefinedInMeta: p.coreOptions.isKeepUndefinedInMeta,
quiet: p.coreOptions.isQuiet,
requireDocTerminator: p.coreOptions.rules.requireDocTerminator,
treatEmptyValueAsNull: p.coreOptions.rules.treatEmptyValueAsNull,
onDuplicateKey: p.coreOptions.rules.onDuplicateKey,
}),
options: (0, object_1.sortObjectKeys)(p._meta_userOpts),
};
}
// Attach optional durations timing data.
if (p.coreOptions.isWithTiming) {
metadata.timing = {
total: !p.coreOptions.isWithTiming
? null
: {
timeMs: to3(p.durationMs), // durationMs = timeEnd4Ms - timeStartMs
name: p.runtimeInfo.sourceType === 'Inline'
? 'Total'
: 'Total (excluding phase0 (I/O))',
},
phase0: !p.coreOptions.isWithTiming ||
p.runtimeInfo.sourceType === 'Inline'
? undefined
: {
timeMs: to3(p.runtimeInfo.timeIoMs),
name: 'I/O',
},
phase1: !p.coreOptions.isWithTiming
? null
: {
timeMs: to3(p.timeEnd1Ms - p.timeStartMs),
name: 'Lexing',
},
phase2: !p.coreOptions.isWithTiming
? null
: {
timeMs: to3(p.timeEnd2Ms - p.timeEnd1Ms),
name: 'Parsing',
},
phase3: !p.coreOptions.isWithTiming
? null
: {
timeMs: to3(p.timeEnd3Ms - p.timeEnd2Ms),
name: 'AST Building',
},
phase4: !p.coreOptions.isWithTiming
? null
: {
timeMs: to3(p.timeEnd4Ms - p.timeEnd3Ms),
name: 'Object Building',
},
};
}
return metadata;
};
exports.buildResultMetadata = buildResultMetadata;
//# sourceMappingURL=resultMetadataBuilder.js.map