esa-cli
Version:
A CLI for operating Alibaba Cloud ESA EdgeRoutine (Edge Functions).
58 lines (57 loc) • 1.99 kB
JavaScript
import fs from 'fs';
import path from 'path';
import esbuild from 'esbuild';
import { lessLoader } from 'esbuild-plugin-less';
import { getRoot } from '../../utils/fileUtils/base.js';
import { NODE_EXTERNALS } from '../common/constant.js';
import parser from '@babel/parser';
import _traverse from '@babel/traverse';
import _generator from '@babel/generator';
const replacements = { cache: 'mockCache', EdgeKV: 'mockKV' };
const traverse = _traverse.default;
const generator = _generator.default;
const renameMock = {
name: 'rename-mock',
setup(build) {
build.onEnd(() => {
if (build.initialOptions.outfile) {
const outFile = fs.readFileSync(build.initialOptions.outfile, 'utf-8');
const ast = parser.parse(outFile, {
sourceType: 'module'
});
traverse(ast, {
Identifier(path) {
const name = path.node.name;
if (replacements.hasOwnProperty(name)) {
path.node.name = replacements[name];
}
}
});
const { code } = generator(ast);
fs.writeFileSync(build.initialOptions.outfile, code);
}
});
}
};
export default function (options) {
const userRoot = getRoot();
// @ts-ignore
const id = global.id;
const devEntry = path.resolve(userRoot, `.dev/devEntry-${id}.js`);
return esbuild.build({
entryPoints: [devEntry],
outfile: path.resolve(userRoot, `.dev/index-${id}.js`),
bundle: true,
minify: !!options.minify,
splitting: false,
format: 'esm',
platform: options.isNode ? 'node' : 'browser',
// EW2 support node externals
external: NODE_EXTERNALS,
// @ts-ignore
plugins: [lessLoader(), renameMock],
loader: {
'.client.js': 'text'
}
});
}