diff --git a/lib/register.js b/lib/register.js index 9b72e624..29935cf9 100644 --- a/lib/register.js +++ b/lib/register.js @@ -5,6 +5,10 @@ * to insert tracking code. * ------------------*/ +/* eeslint-disable import/no-extraneous-dependencies */ +/* eeslint-disable node/no-extraneous-require */ +/* eslint-disable global-require */ + 'use strict'; // Catalog globals etc @@ -120,10 +124,22 @@ function register(options) { } }); + const {dirname, join: pathJoin, sep: pathSep} = require('path'), + {writeFileSync} = require('fs'), + {ensureDirSync} = require('fs-extra'); + const rootDir = pathJoin(__dirname, '..', pathSep); + // Add pirates hook to capture code post-babel if (piratesRevert) piratesRevert(); piratesRevert = addHook((code, filename) => { transpiledFiles[filename] = parseSourceMapFromCode(code); + + if (filename.startsWith(rootDir)) { + const writePath = pathJoin(rootDir, 'example/intermediate', filename.slice(rootDir.length)); + ensureDirSync(dirname(writePath)); + writeFileSync(writePath, code); + } + return code; }, {ignoreNodeModules: false}); } diff --git a/lib/serialize/records.js b/lib/serialize/records.js index 56c53c25..253e5e14 100644 --- a/lib/serialize/records.js +++ b/lib/serialize/records.js @@ -125,6 +125,12 @@ function updateBlockParent(block, parent) { } } +// TODO Delete this +function traceBlock(name, block) { + console.log(`${name}.id:`, block.id); // eslint-disable-line no-console + if (block.parent) traceBlock(`${name}.parent`, block.parent); // eslint-disable-line no-unused-vars +} + /** * Create scope object * @param {number} [id] - Scope ID @@ -178,6 +184,12 @@ function updateScopeParent(scope, parent) { } } +// TODO Delete this +function traceScope(name, scope) { + console.log(`${name}.block.id:`, scope.block.id); // eslint-disable-line no-console + if (scope.parent) traceScope(`${name}.parent`, scope.parent); // eslint-disable-line no-unused-vars +} + /** * Create dependency relationship between two values. * @param {Object} srcRecord - Record for value which depends on the other diff --git a/lib/serialize/serializer.js b/lib/serialize/serializer.js index 784d4dce..6fadf1ba 100644 --- a/lib/serialize/serializer.js +++ b/lib/serialize/serializer.js @@ -225,6 +225,40 @@ class Serializer { importNodes = [], {mangle} = this.options; + /* + // TODO Delete this + const found = new Set(); + function findCircularDependency(record, stack) { // eslint-disable-line no-shadow + if (found.has(record)) return; + + const newStack = new Set(stack); + newStack.add(record); + // console.log('stack:', [...newStack].map(rec => rec.varNode.name)); + + if (stack.has(record)) { + // eslint-disable-next-line no-console + console.log('circular:', [...newStack].map(rec => rec.varNode.name)); + process.exit(); // eslint-disable-line no-process-exit + } + + for (const dependency of record.dependencies) { + findCircularDependency(dependency.record, newStack); + } + + found.add(record); + + if (record.assignments) { + for (const assignment of record.assignments) { + for (const dependency of assignment.dependencies) { + findCircularDependency(dependency.record, new Set()); + } + } + } + } + + findCircularDependency(record, new Set()); + */ + const queue = [record], processing = new Map(); // Keyed by record, values = `true` for processed, `false` for processing function processQueue() { diff --git a/validateSourcemaps.js b/validateSourcemaps.js new file mode 100644 index 00000000..c7a34f5b --- /dev/null +++ b/validateSourcemaps.js @@ -0,0 +1,41 @@ +/* eslint-disable no-console */ + +'use strict'; + +const pathJoin = require('path').join, + {readFile} = require('fs').promises, // eslint-disable-line node/no-unsupported-features/node-builtins + readdir = require('recursive-readdir'), + validate = require('sourcemap-validator'); + +const dirPath = pathJoin(__dirname, 'example/intermediate/example'); +// const dirPath = pathJoin(__dirname, 'node_modules/is-it-type/dist'); + +(async () => { + const paths = await readdir(dirPath); + + for (const path of paths) { + if (!path.match(/\.js$/)) continue; + + const code = await readFile(path, 'utf8'); + + let map; + const mapPath = `${path}.map`; + try { + map = await readFile(mapPath, 'utf8'); + } catch (err) {} // eslint-disable-line no-empty + + const pathShort = path.slice(dirPath.length); + + try { + validate(code, map); + console.log('VALID:', pathShort); + } catch (err) { + if (err.message === 'No map argument provided, and no inline sourcemap found') { + console.log('NO SOURCE MAP:', pathShort); + } else { + console.log('INVALID:', pathShort, err.message); + } + // console.log(path, err.message); + } + } +})();