UNPKG

node-red-contrib-netvar-utils

Version:

Network Variable List utility nodes for node-red

145 lines 4.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildJSONSchemaFromDefinitions = exports.getForStatementRanges = exports.generateSafeVariableName = void 0; /** * Generates a variable name that is all uppercase based on given number */ function generateSafeVariableName(number) { const uppercaseLetterCount = 26; const uppercaseFirst = 65; number = Math.floor(number); if (number < 0) number = Number.MAX_SAFE_INTEGER + number; if (number === 0) return 'A'; const chars = []; while (number > 0) { const value = number % uppercaseLetterCount; chars.unshift(String.fromCharCode(uppercaseFirst + value)); number -= value; number /= uppercaseLetterCount; } return chars.join(''); } exports.generateSafeVariableName = generateSafeVariableName; /** * Get index ranges for looping over an array slice with given dimensions. */ function getForStatementRanges(dimensions, begin, end) { /** Size array length plus one equals dimension array length */ const sizes = []; for (let i = 1; i < dimensions.length; i++) { sizes.push(dimensions.slice(i) .reduce((a, b) => a * b, 1)); } const points = []; points.push(begin); for (let i = sizes.length - 1; i > -1; i--) { const size = sizes[i]; points.push(Math.ceil(begin / size) * size); } for (let i = 0; i < sizes.length; i++) { const size = sizes[i]; points.push(Math.floor(end / size) * size); } points.push(end); const volume = dimensions.reduce((a, b) => a * b); const getBeginIndexes = (value) => { if (value < 0 || value > volume) throw new Error(`cannot be less than 0, more than ${volume}`); if (value === 0) return dimensions.map(() => 0); const indexes = []; let remainder = value; for (let i = 0; i < dimensions.length - 1; i++) { if (remainder > 0) { const size = sizes[i]; const result = Math.floor(remainder / size); remainder = value % size; indexes.push(result); } else { indexes.push(0); } } indexes.push(remainder); return indexes; }; const getEndIndexes = (value) => { if (value < 0 || value > volume) throw new Error(`cannot be less than 0, more than ${volume}`); if (value === volume) return dimensions.slice(0); const indexes = []; let remainder = value; for (let i = 0; i < dimensions.length - 1; i++) { if (remainder > 0) { const size = sizes[i]; const result = Math.floor(remainder / size); remainder = value % size; indexes.push(remainder === 0 ? result - 1 : result); } else { indexes.push(dimensions[i]); } } indexes.push(remainder || dimensions[dimensions.length - 1]); return indexes; }; const ranges = []; let lastPoint = points[0]; for (let i = 1; i < points.length; i++) { const point = points[i]; if (lastPoint !== point) { ranges.push({ begin: getBeginIndexes(lastPoint), end: getEndIndexes(point), }); } lastPoint = point; } return ranges; } exports.getForStatementRanges = getForStatementRanges; function buildJSONSchemaFromDefinitions(definitions) { const schema = { type: 'object', properties: {}, }; for (const definition of definitions) { if (definition.isArray) { const subschema = {}; let next = subschema; for (const dimension of definition.dimensions) { next.type = 'array'; next.minItems = dimension; next = next.items = {}; } Object.assign(next, getJSONSchemaOf(definition.type)); schema.properties[definition.name] = subschema; } else { const subschema = getJSONSchemaOf(definition.type); schema.properties[definition.name] = subschema; } } return schema; } exports.buildJSONSchemaFromDefinitions = buildJSONSchemaFromDefinitions; /** Get JSON Schema for given NVL Type. Based on https://github.com/fastify/fast-json-stringify#fastjsonstringifyschema */ function getJSONSchemaOf(type) { switch (type) { case 'BOOL': return { type: 'boolean' }; case 'STRING': return { type: 'string' }; case 'REAL': case 'LREAL': return { type: 'number' }; default: return { type: 'integer' }; } } //# sourceMappingURL=util.js.map