@backstage/cli
Version:
CLI for developing Backstage plugins and apps
210 lines (202 loc) • 7.1 kB
JavaScript
var fs = require('fs-extra');
var path = require('path');
var webpack = require('webpack');
require('fork-ts-checker-webpack-plugin');
require('html-webpack-plugin');
require('react-dev-utils/ModuleScopePlugin');
require('run-script-webpack-plugin');
require('webpack-node-externals');
require('@backstage/cli-common');
require('@manypkg/get-packages');
var paths = require('./paths-a7d52d4f.cjs.js');
require('mini-css-extract-plugin');
require('@pmmmwh/react-refresh-webpack-plugin');
require('./index-d2845aa8.cjs.js');
require('./run-eac5f3ab.cjs.js');
require('eslint-webpack-plugin');
require('lodash/pickBy');
var yn = require('yn');
var FileSizeReporter = require('react-dev-utils/FileSizeReporter');
var formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
var chalk = require('chalk');
require('webpack-dev-server');
require('react-dev-utils/openBrowser');
var parallel = require('./parallel-4af834f6.cjs.js');
var config = require('./config-7ca1db14.cjs.js');
var os = require('os');
var tar = require('tar');
var createDistWorkspace = require('./createDistWorkspace-4f496e3c.cjs.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
var webpack__default = /*#__PURE__*/_interopDefaultLegacy(webpack);
var yn__default = /*#__PURE__*/_interopDefaultLegacy(yn);
var formatWebpackMessages__default = /*#__PURE__*/_interopDefaultLegacy(formatWebpackMessages);
var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
var tar__default = /*#__PURE__*/_interopDefaultLegacy(tar);
const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024;
const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024;
function applyContextToError(error, moduleName) {
return `Failed to compile '${moduleName}':
${error}`;
}
async function buildBundle(options) {
const { statsJsonEnabled, schema: configSchema } = options;
const paths$1 = paths.resolveBundlingPaths(options);
const config = await paths.createConfig(paths$1, {
...options,
checksEnabled: false,
isDev: false,
baseUrl: paths.resolveBaseUrl(options.frontendConfig)
});
const isCi = yn__default["default"](process.env.CI, { default: false });
const previousFileSizes = await FileSizeReporter.measureFileSizesBeforeBuild(paths$1.targetDist);
await fs__default["default"].emptyDir(paths$1.targetDist);
if (paths$1.targetPublic) {
await fs__default["default"].copy(paths$1.targetPublic, paths$1.targetDist, {
dereference: true,
filter: (file) => file !== paths$1.targetHtml
});
}
if (configSchema) {
await fs__default["default"].writeJson(
path.resolve(paths$1.targetDist, ".config-schema.json"),
configSchema.serialize(),
{ spaces: 2 }
);
}
const { stats } = await build(config, isCi);
if (!stats) {
throw new Error("No stats returned");
}
if (statsJsonEnabled) {
await require("bfj").write(
path.resolve(paths$1.targetDist, "bundle-stats.json"),
stats.toJson()
);
}
FileSizeReporter.printFileSizesAfterBuild(
stats,
previousFileSizes,
paths$1.targetDist,
WARN_AFTER_BUNDLE_GZIP_SIZE,
WARN_AFTER_CHUNK_GZIP_SIZE
);
}
async function build(config, isCi) {
var _a, _b, _c;
const stats = await new Promise(
(resolve, reject) => {
webpack__default["default"](config, (err, buildStats) => {
if (err) {
if (err.message) {
const { errors: errors2 } = formatWebpackMessages__default["default"]({
errors: [err.message],
warnings: new Array(),
_showErrors: true,
_showWarnings: true
});
throw new Error(errors2[0]);
} else {
reject(err);
}
} else {
resolve(buildStats);
}
});
}
);
if (!stats) {
throw new Error("Failed to compile: No stats provided");
}
const serializedStats = stats.toJson({
all: false,
warnings: true,
errors: true
});
const { errors, warnings } = formatWebpackMessages__default["default"]({
errors: serializedStats.errors,
warnings: serializedStats.warnings
});
if (errors.length) {
const errorWithContext = applyContextToError(
errors[0],
(_c = (_b = (_a = serializedStats.errors) == null ? void 0 : _a[0]) == null ? void 0 : _b.moduleName) != null ? _c : ""
);
throw new Error(errorWithContext);
}
if (isCi && warnings.length) {
const warningsWithContext = warnings.map((warning, i) => {
var _a2, _b2, _c2;
return applyContextToError(
warning,
(_c2 = (_b2 = (_a2 = serializedStats.warnings) == null ? void 0 : _a2[i]) == null ? void 0 : _b2.moduleName) != null ? _c2 : ""
);
});
console.log(
chalk__default["default"].yellow(
"\nTreating warnings as errors because process.env.CI = true.\n"
)
);
throw new Error(warningsWithContext.join("\n\n"));
}
return { stats };
}
async function buildFrontend(options) {
const { targetDir, writeStats, configPaths } = options;
const { name } = await fs__default["default"].readJson(path.resolve(targetDir, "package.json"));
await buildBundle({
targetDir,
entry: "src/index",
parallelism: parallel.getEnvironmentParallelism(),
statsJsonEnabled: writeStats,
...await config.loadCliConfig({
args: configPaths,
fromPackage: name
})
});
}
const BUNDLE_FILE = "bundle.tar.gz";
const SKELETON_FILE = "skeleton.tar.gz";
async function buildBackend(options) {
const { targetDir, skipBuildDependencies } = options;
const pkg = await fs__default["default"].readJson(path.resolve(targetDir, "package.json"));
await createDistWorkspace.buildPackage({
targetDir: options.targetDir,
packageJson: pkg,
outputs: /* @__PURE__ */ new Set([createDistWorkspace.Output.cjs])
});
const tmpDir = await fs__default["default"].mkdtemp(path.resolve(os__default["default"].tmpdir(), "backstage-bundle"));
try {
await createDistWorkspace.createDistWorkspace([pkg.name], {
targetDir: tmpDir,
buildDependencies: !skipBuildDependencies,
buildExcludes: [pkg.name],
parallelism: parallel.getEnvironmentParallelism(),
skeleton: SKELETON_FILE
});
const distDir = path.resolve(targetDir, "dist");
await fs__default["default"].remove(distDir);
await fs__default["default"].mkdir(distDir);
await fs__default["default"].move(
path.resolve(tmpDir, SKELETON_FILE),
path.resolve(distDir, SKELETON_FILE)
);
await tar__default["default"].create(
{
file: path.resolve(distDir, BUNDLE_FILE),
cwd: tmpDir,
portable: true,
noMtime: true,
gzip: true
},
[""]
);
} finally {
await fs__default["default"].remove(tmpDir);
}
}
exports.buildBackend = buildBackend;
exports.buildFrontend = buildFrontend;
//# sourceMappingURL=buildBackend-32a4adb3.cjs.js.map
;