UNPKG

@omnia/tooling-vue

Version:

Used to bundle and serve manifests web component that build on Vue framework.

182 lines (181 loc) • 8.45 kB
"use strict"; 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()); }