123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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');
- }
- }
- };
- };
|