| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #!/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');
|