UNPKG

@nx/angular

Version:

The Nx Plugin for Angular contains executors, generators, and utilities for managing Angular applications and libraries within an Nx workspace. It provides: - Integration with libraries such as Storybook, Jest, ESLint, Tailwind CSS, Playwright and Cypre

127 lines (126 loc) 6.3 kB
"use strict"; 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;