#!/usr/bin/env node // Emits, as JSON on stdout, one entry per node module in nodes/ describing what // its outputSchema currently declares at the top level: the plain property // names, any patternProperties regexes (for dynamic-named branches such as // switch's case0/case1), and whether additionalProperties allows anything // else through. check-output-schema-drift.py compares this against what a // real execution actually returned. // // Requiring each module is safe without the runtime: outputSchema is plain // data assembled at module load time, and nothing in it touches the // `smartbotic` global - that only happens inside execute(), which this never // calls. 'use strict'; const fs = require('fs'); const path = require('path'); const ROOT = path.resolve(__dirname, '..', 'nodes'); function walk(dir, out) { for (const entry of fs.readdirSync(dir)) { const full = path.join(dir, entry); const stat = fs.statSync(full); if (stat.isDirectory()) { walk(full, out); } else if (entry.endsWith('.js')) { out.push(full); } } } function nodeTypeOf(source) { const m = source.match(/@node\s+([a-zA-Z0-9_-]+)/); return m ? m[1] : null; } const files = []; walk(ROOT, files); const result = {}; for (const file of files) { const source = fs.readFileSync(file, 'utf8'); const nodeType = nodeTypeOf(source); if (!nodeType) { process.stderr.write('no @node tag found in ' + file + ', skipping\n'); continue; } let mod; try { delete require.cache[require.resolve(file)]; mod = require(file); } catch (e) { process.stderr.write('could not load ' + file + ': ' + e.message + '\n'); continue; } const schema = mod.outputSchema; if (!schema || typeof schema !== 'object') { process.stderr.write(nodeType + ' (' + file + ') has no outputSchema\n'); continue; } const properties = Object.keys(schema.properties || {}); const patternProps = Object.keys(schema.patternProperties || {}); const additionalProperties = schema.additionalProperties === true; result[nodeType] = { file: path.relative(path.resolve(__dirname, '..'), file), properties: properties, patternProperties: patternProps, additionalProperties: additionalProperties }; } process.stdout.write(JSON.stringify(result, null, 2) + '\n');