@omnia/tooling-vue
Version:
Used to bundle and serve manifests web component that build on Vue framework.
182 lines (181 loc) • 8.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.setupHmrPlugin = exports.getModuleTimestamp = void 0;
const tslib_1 = require("tslib");
const rimraf_1 = tslib_1.__importDefault(require("rimraf"));
const path_1 = tslib_1.__importDefault(require("path"));
const globby_1 = require("globby");
const vite_1 = require("vite");
const fx_models_1 = require("@omnia/fx-models");
const internal_1 = require("./transformers/internal");
const utils_1 = require("./utils");
const graph = tslib_1.__importStar(require("./graph"));
const $ = tslib_1.__importStar(require("../../variables"));
let _runtimeContext;
const transformerInstanceCache = {
preInternal: { resolved: false, value: [] },
configuredExternal: { resolved: false, value: [] },
postInternal: { resolved: false, value: [] }
};
const coreManifesIds = [
fx_models_1.OmniaResourceManifests.FxCoreBoot.toString(),
fx_models_1.OmniaGroupManifests.Fx.toString(),
fx_models_1.OmniaResourceManifests.Fx.toString(),
fx_models_1.OmniaResourceManifests.FxContexts.toString(),
fx_models_1.OmniaResourceManifests.FxCore.toString(),
fx_models_1.OmniaResourceManifests.FxShared.toString(),
];
function getModuleTimestamp(id) {
const fileGraph = graph.getFileGraph(id);
if (fileGraph && fileGraph.timestamp) {
return fileGraph.timestamp;
}
}
exports.getModuleTimestamp = getModuleTimestamp;
function setupHmrPlugin(options, config) {
const runtimeContext = {
options: options,
alias: config.alias,
serviceId: $.tooling.composer.getServiceId(),
toModuleId: graph.toModuleId,
toFileGraphId: graph.toFileGraphId,
getFileGraph: graph.getFileGraph
};
_runtimeContext = runtimeContext;
const resolvers = config.resolvers.filter(item => !!item);
const omniaPackagesPathPattern = (0, vite_1.normalizePath)(path_1.default.join(utils_1.envUtils.getRootDirPath(), 'node_modules/@omnia/*/*'));
const omniaPackagesDeepImports = (0, globby_1.sync)(omniaPackagesPathPattern).map(p => p.replace((0, vite_1.normalizePath)(path_1.default.join(utils_1.envUtils.getRootDirPath(), 'node_modules/')), ''));
const { dependencies, devDependencies } = require(path_1.default.join(utils_1.envUtils.getRootDirPath(), 'package.json'));
clearCacheAssets();
// Manifests changed
// entriesResolver.registerManifestEventHandler(() => {
// Object.keys(_runtimeContext.dependencyGraph).forEach(name => resetModule(_runtimeContext.dependencyGraph[name]));
// });
return {
config: () => ({
optimizeDeps: {
exclude: [
...Object.keys(dependencies),
...Object.keys(devDependencies),
...omniaPackagesDeepImports
]
},
server: {
hmr: {
host: 'localhost'
}
}
}),
handleHotUpdate(ctx) {
const hotModules = [];
const fileGraphs = [];
const select = (modules) => {
modules.filter(m => hotModules.every(h => h.id != m.id)).forEach(m => {
const fileGraph = graph.getFileGraph(m.file);
fileGraphs.push(fileGraph);
hotModules.push(m);
// for UI components we dont need to hot reload importers
if (m.file.endsWith('.tsx')) {
return;
}
select(Array.from(m.importers));
});
};
if (ctx.modules.length > 0) {
select(ctx.modules);
}
const fileGraph = fileGraphs.find(fileGraph => coreManifesIds.includes(fileGraph.resourceId));
if (fileGraph) {
const updatedFileGraph = graph.getFileGraph(ctx.file);
$.tooling.log(`'${updatedFileGraph.id}' => '${fileGraph.id}' (${fileGraph.resourceId}). Page reloaded.`, $.tooling.utils.LogTypes.Info);
ctx.server.ws.send({ type: 'full-reload' });
return [];
}
fileGraphs.forEach(fileGraph => {
fileGraph.timestamp = ctx.timestamp;
});
return hotModules;
},
async resolveId(source, importer) {
const { pathname, fromWorker } = utils_1.pathUtils.parsePhysicalPath(source);
const fileGraph = graph.getFileGraph(source);
const resolver = resolvers.find(resolver => resolver.test(pathname, importer, fileGraph, runtimeContext, fromWorker));
if (resolver) {
return resolver.resolve(pathname, importer, fileGraph, runtimeContext, fromWorker);
}
return source;
},
async transform(code, id) {
const { pathname, fromWorker } = utils_1.pathUtils.parsePhysicalPath(id);
if (!transformerInstanceCache.preInternal.resolved) {
transformerInstanceCache.preInternal.value = await resolveTransformers([
(0, internal_1.stylesheet)()
]);
transformerInstanceCache.preInternal.resolved = true;
}
if (!transformerInstanceCache.configuredExternal.resolved) {
transformerInstanceCache.configuredExternal.value = await resolveTransformers(config.transformers);
transformerInstanceCache.configuredExternal.resolved = true;
}
if (!transformerInstanceCache.postInternal.resolved) {
transformerInstanceCache.postInternal.value = await resolveTransformers([
(0, internal_1.omniaBuildToken)(),
(0, internal_1.omniaCurrentManifestRuntime)(),
(0, internal_1.omniaRuntime)(),
(0, internal_1.preBundleImportPath)(config.alias),
(0, internal_1.referenceImportPath)(config.alias),
(0, internal_1.dynamicBundle)(),
(0, internal_1.tempFix)()
]);
transformerInstanceCache.postInternal.resolved = true;
}
if (pathname.includes('/node_modules/')) {
return code;
}
const { fileGraph, code: transformedCode, esbuildTransformResult } = await graph.buildFileGraph(pathname, code);
if (!!fileGraph.js) {
if (fileGraph.js.empty) {
return esbuildTransformResult;
}
code = transformedCode;
}
code = await executeTransformers(pathname, code, null, [
...transformerInstanceCache.preInternal.value
], fromWorker);
return await executeTransformers(pathname, code, fileGraph, [
...transformerInstanceCache.configuredExternal.value,
...transformerInstanceCache.postInternal.value
], fromWorker);
}
};
}
exports.setupHmrPlugin = setupHmrPlugin;
async function executeTransformers(id, code, fileGraph, transformers, fromWorker) {
if (transformers.length == 0) {
return code;
}
const currentTransformer = transformers.shift();
if (currentTransformer.test(code, id, fileGraph, _runtimeContext, fromWorker)) {
const transformResult = currentTransformer.transform(code, id, fileGraph, _runtimeContext, fromWorker);
if (!!transformResult['then']) {
return transformResult.then(transformedCode => {
return executeTransformers(id, transformedCode, fileGraph, transformers, fromWorker);
});
}
return executeTransformers(id, transformResult, fileGraph, transformers, fromWorker);
}
return executeTransformers(id, code, fileGraph, transformers, fromWorker);
}
async function resolveTransformers(transformers) {
const definedTransformers = transformers.filter(item => !!item);
const hasAsyncTransformers = !definedTransformers.every(item => !item['then']);
if (hasAsyncTransformers) {
let asyncTransfomers = await Promise.all(definedTransformers);
asyncTransfomers = asyncTransfomers.filter(item => !!item);
return asyncTransfomers;
}
return definedTransformers;
}
function clearCacheAssets() {
rimraf_1.default.sync(utils_1.envUtils.getBundleOutputDirPath());
}