@nx/angular
Version:
127 lines (126 loc) • 6.3 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.moduleFederationSsrDevServerExecutor = moduleFederationSsrDevServerExecutor;
const devkit_1 = require("@nx/devkit");
const async_iterable_1 = require("@nx/devkit/src/utils/async-iterable");
const rxjs_for_await_1 = require("@nx/devkit/src/utils/rxjs-for-await");
const utils_1 = require("@nx/module-federation/src/executors/utils");
const wait_for_port_open_1 = require("@nx/web/src/utils/wait-for-port-open");
const fs_1 = require("fs");
const ngcli_adapter_1 = require("nx/src/adapter/ngcli-adapter");
const project_graph_1 = require("nx/src/project-graph/project-graph");
const path_1 = require("path");
const module_federation_1 = require("../../builders/utilities/module-federation");
const builder_package_1 = require("../utilities/builder-package");
const normalize_options_1 = require("./lib/normalize-options");
const start_dev_remotes_1 = require("./lib/start-dev-remotes");
async function* moduleFederationSsrDevServerExecutor(schema, context) {
const options = (0, normalize_options_1.normalizeOptions)(schema);
(0, builder_package_1.assertBuilderPackageIsInstalled)('@angular-devkit/build-angular');
const { executeSSRDevServerBuilder } = await Promise.resolve().then(() => __importStar(require('@angular-devkit/build-angular')));
const currIter = (0, rxjs_for_await_1.eachValueFrom)(executeSSRDevServerBuilder(options, await (0, ngcli_adapter_1.createBuilderContext)({
builderName: '@nx/angular:webpack-server',
description: 'Build a ssr application',
optionSchema: require('../../builders/webpack-server/schema.json'),
}, context)));
if (options.isInitialHost === false) {
return yield* currIter;
}
const { projects: workspaceProjects } = (0, project_graph_1.readProjectsConfigurationFromProjectGraph)(context.projectGraph);
const project = workspaceProjects[context.projectName];
let pathToManifestFile;
if (options.pathToManifestFile) {
const userPathToManifestFile = (0, path_1.join)(context.root, options.pathToManifestFile);
if (!(0, fs_1.existsSync)(userPathToManifestFile)) {
throw new Error(`The provided Module Federation manifest file path does not exist. Please check the file exists at "${userPathToManifestFile}".`);
}
else if ((0, path_1.extname)(options.pathToManifestFile) !== '.json') {
throw new Error(`The Module Federation manifest file must be a JSON. Please ensure the file at ${userPathToManifestFile} is a JSON.`);
}
pathToManifestFile = userPathToManifestFile;
}
else {
pathToManifestFile = (0, module_federation_1.getDynamicMfManifestFile)(project, context.root);
}
(0, module_federation_1.validateDevRemotes)({ devRemotes: options.devRemotes }, workspaceProjects);
const { remotes, staticRemotesIter, devRemoteIters } = await (0, utils_1.startRemoteIterators)(options, context, start_dev_remotes_1.startRemotes, pathToManifestFile, 'angular', true);
const removeBaseUrlEmission = (iter) => (0, async_iterable_1.mapAsyncIterable)(iter, (v) => ({
...v,
baseUrl: undefined,
}));
const combined = (0, async_iterable_1.combineAsyncIterables)(removeBaseUrlEmission(staticRemotesIter), ...(devRemoteIters ? devRemoteIters.map(removeBaseUrlEmission) : []), (0, async_iterable_1.createAsyncIterable)(async ({ next, done }) => {
if (!options.isInitialHost) {
done();
return;
}
if (remotes.remotePorts.length) {
devkit_1.logger.info(`Nx All remotes started, server ready at http://localhost:${options.port}`);
next({ success: true, baseUrl: `http://localhost:${options.port}` });
done();
return;
}
try {
const portsToWaitFor = staticRemotesIter && options.staticRemotesPort
? [options.staticRemotesPort, ...remotes.remotePorts]
: [...remotes.remotePorts];
await Promise.all(portsToWaitFor.map((port) => (0, wait_for_port_open_1.waitForPortOpen)(port, {
retries: 480,
retryDelay: 2500,
host: 'localhost',
})));
next({ success: true, baseUrl: `http://localhost:${options.port}` });
}
catch (error) {
throw new Error(`Failed to start remotes. Check above for any errors.`, {
cause: error,
});
}
finally {
done();
}
}));
let refs = 2 + (devRemoteIters?.length ?? 0);
for await (const result of combined) {
if (result.success === false)
throw new Error('Remotes failed to start');
if (result.success)
refs--;
if (refs === 0)
break;
}
return yield* currIter;
}
exports.default = moduleFederationSsrDevServerExecutor;