60 lines
1.4 KiB
JavaScript
60 lines
1.4 KiB
JavaScript
const path = require('path');
|
|
|
|
const glob = require('glob');
|
|
const {getOptions} = require('loader-utils');
|
|
const validateOptions = require('schema-utils');
|
|
|
|
const {lookupSourcePaths} = require('../webpack/util');
|
|
|
|
const schema = {
|
|
type: 'object',
|
|
properties: {
|
|
paths: {
|
|
items: {
|
|
type: 'string',
|
|
},
|
|
type: 'array',
|
|
},
|
|
},
|
|
required: [
|
|
'paths',
|
|
],
|
|
};
|
|
|
|
// Dynamically require all traits.
|
|
module.exports = function(source) {
|
|
const options = getOptions(this);
|
|
// Validate schema.
|
|
validateOptions(schema, options, '[avocado] Hooks');
|
|
// Extract options.
|
|
const {paths, root} = options;
|
|
// Build registers.
|
|
const sourcePaths = lookupSourcePaths(paths, 'hooks.js');
|
|
const registers = sourcePaths.map((sourcePath) => {
|
|
const relativePath = path.relative(root, sourcePath);
|
|
const parts = relativePath.split('/');
|
|
// Chop off basename.
|
|
parts.pop();
|
|
// Module or local?
|
|
let importDirectory;
|
|
if ('node_modules' === parts[0]) {
|
|
importDirectory = parts.slice(1).join('/');
|
|
}
|
|
else {
|
|
importDirectory = `./${parts.join('/')}`;
|
|
}
|
|
// Register hooks.
|
|
const importPath = `${importDirectory}/hooks`;
|
|
return [
|
|
`registerHooks('${importDirectory}', require('${importPath}'));`,
|
|
].join('\n');
|
|
});
|
|
// Import trait registry first.
|
|
const output = [
|
|
`import {registerHooks} from '@avocado/core/hook/registry'`,
|
|
'',
|
|
...registers
|
|
].join('\n');
|
|
return output;
|
|
}
|