You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.6 KiB
97 lines
2.6 KiB
4 years ago
|
const fs = require('fs');
|
||
|
const path = require('path');
|
||
|
const baseDir = path.join(__dirname, '..');
|
||
|
const formatDir = path.join(baseDir, 'test', 'fixtures', 'formats');
|
||
|
const parsingDir = path.join(baseDir, 'test', 'fixtures', 'parsing');
|
||
|
|
||
|
const getFiles = (dir) => (fs.readdirSync(dir) || []).reduce((acc, d) => {
|
||
|
d = path.resolve(dir, d);
|
||
|
|
||
|
const stat = fs.statSync(d);
|
||
|
|
||
|
if (!stat.isDirectory()) {
|
||
|
return acc;
|
||
|
}
|
||
|
|
||
|
const subfiles = fs.readdirSync(d).map((f) => path.resolve(d, f));
|
||
|
|
||
|
return acc.concat(subfiles);
|
||
|
}, []);
|
||
|
|
||
|
const buildDataString = function(files, id) {
|
||
|
const data = {};
|
||
|
|
||
|
files.forEach((file) => {
|
||
|
// read the file directly as a buffer before converting to base64
|
||
|
const base64 = fs.readFileSync(file).toString('base64');
|
||
|
|
||
|
data[path.basename(file)] = base64;
|
||
|
});
|
||
|
|
||
|
const dataExportStrings = Object.keys(data).reduce((acc, key) => {
|
||
|
// use a function since the segment may be cleared out on usage
|
||
|
acc.push(`${id}Files['${key}'] = () => {
|
||
|
cache['${key}'] = cache['${key}'] || base64ToUint8Array('${data[key]}');
|
||
|
const dest = new Uint8Array(cache['${key}'].byteLength);
|
||
|
dest.set(cache['${key}']);
|
||
|
return dest;
|
||
|
};`);
|
||
|
return acc;
|
||
|
}, []);
|
||
|
|
||
|
const file =
|
||
|
'/* istanbul ignore file */\n' +
|
||
|
'\n' +
|
||
|
`import base64ToUint8Array from "${path.resolve(baseDir, 'src/decode-b64-to-uint8-array.js')}";\n` +
|
||
|
'const cache = {};\n' +
|
||
|
`const ${id}Files = {};\n` +
|
||
|
dataExportStrings.join('\n') +
|
||
|
`export default ${id}Files`;
|
||
|
|
||
|
return file;
|
||
|
};
|
||
|
|
||
|
/* we refer to them as .js, so that babel and other plugins can work on them */
|
||
|
const formatsKey = 'create-test-data!formats.js';
|
||
|
const parsingKey = 'create-test-data!parsing.js';
|
||
|
|
||
|
module.exports = function() {
|
||
|
return {
|
||
|
name: 'createTestData',
|
||
|
buildStart() {
|
||
|
this.addWatchFile(formatDir);
|
||
|
this.addWatchFile(parsingDir);
|
||
|
|
||
|
getFiles(formatDir).forEach((file) => this.addWatchFile(file));
|
||
|
getFiles(parsingDir).forEach((file) => this.addWatchFile(file));
|
||
|
},
|
||
|
resolveId(importee, importer) {
|
||
|
// if this is not an id we can resolve return
|
||
|
if (importee.indexOf('create-test-data!') !== 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const name = importee.split('!')[1];
|
||
|
|
||
|
if (name.indexOf('formats') !== -1) {
|
||
|
return formatsKey;
|
||
|
}
|
||
|
|
||
|
if (name.indexOf('parsing') !== -1) {
|
||
|
return parsingKey;
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
},
|
||
|
load(id) {
|
||
|
if (id === formatsKey) {
|
||
|
return buildDataString.call(this, getFiles(formatDir), 'format');
|
||
|
}
|
||
|
|
||
|
if (id === parsingKey) {
|
||
|
return buildDataString.call(this, getFiles(parsingDir), 'parsing');
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
};
|