2022-01-06 12:57:22 +08:00

92 lines
2.8 KiB
JavaScript

import assert from 'assert';
import { dirname, join } from 'path';
import {
existsSync, statSync, readFileSync, writeFileSync, copyFileSync
} from 'fs';
export default function (api) {
[
'onExit',
'onGenerateFiles',
'addPluginExports',
'addCoreExports',
'addRuntimePluginKey',
'addRuntimePlugin',
'addEntryImportsAhead',
'addEntryImports',
'addEntryCodeAhead',
'addEntryCode',
'addBeforeMiddlewares',
'addHTMLHeadScripts',
'addMiddlewares',
'modifyRoutes',
'modifyBundleConfigOpts',
'modifyBundleConfig',
'modifyBabelOpts',
'modifyBabelPresetOpts',
'chainWebpack',
'addTmpGenerateWatcherPaths',
'modifyPublicPathStr'
].forEach((name) => {
api.registerMethod({ name });
});
api.registerMethod({
name: 'writeTmpFile',
fn({
path,
content
}) {
assert(
api.stage >= api.ServiceStage.pluginReady,
'api.writeTmpFile() should not execute in register stage.'
);
const absPath = join(api.paths.absTmpPath, path);
api.utils.mkdirp.sync(dirname(absPath));
if (!existsSync(absPath) || readFileSync(absPath, 'utf-8') !== content) {
writeFileSync(absPath, content, 'utf-8');
}
}
});
api.registerMethod({
name: 'copyTmpFiles',
fn({
namespace, path, ignore
}) {
assert(
api.stage >= api.ServiceStage.pluginReady,
'api.copyTmpFiles() should not execute in register stage.'
);
assert(
path,
'api.copyTmpFiles() should has param path'
);
assert(
namespace,
'api.copyTmpFiles() should has param namespace'
);
const files = api.utils.glob.sync('**/*', {
cwd: path
});
const base = join(api.paths.absTmpPath, namespace);
files.forEach((file) => {
const source = join(path, file);
const target = join(base, file);
if (!existsSync(dirname(target))) {
api.utils.mkdirp.sync(dirname(target));
}
if (statSync(source).isDirectory()) {
api.utils.mkdirp.sync(target);
} else if (Array.isArray(ignore)) {
if (!ignore.some(pattern => new RegExp(pattern).test(file))) {
copyFileSync(source, target);
}
} else {
copyFileSync(source, target);
}
});
}
});
}