/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { SchematicEngine } from '@angular-devkit/schematics'; import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import { NodeModulesEngineHost } from './node-module-engine-host'; const TMP_DIR = process.env['TEST_TMPDIR'] || os.tmpdir(); describe('NodeModulesEngineHost', () => { let tmpDir!: string; let previousDir!: string; beforeEach(() => { tmpDir = fs.mkdtempSync( path.join(TMP_DIR, 'angular-devkit-schematics-tools-node-module-engine-host'), ); previousDir = process.cwd(); process.chdir(tmpDir); }); afterEach(() => process.chdir(previousDir)); /** Creates a fake NPM module that can be used to test the node module engine host. */ function createFakeNpmModule() { fs.mkdirSync(path.join(tmpDir, 'node_modules')); fs.mkdirSync(path.join(tmpDir, 'node_modules/@angular/')); fs.mkdirSync(path.join(tmpDir, 'node_modules/@angular/core')); fs.mkdirSync(path.join(tmpDir, 'node_modules/@angular/core/schematics')); fs.writeFileSync( path.join(tmpDir, 'node_modules/@angular/core/package.json'), JSON.stringify({ name: '@angular/core' }), ); fs.writeFileSync( path.join(tmpDir, 'node_modules/@angular/core/schematics/migrations.json'), JSON.stringify({ schematics: {} }), ); } it('should properly create collections with explicit collection path', () => { createFakeNpmModule(); const engineHost = new NodeModulesEngineHost(); const engine = new SchematicEngine(engineHost); // Under Bazel 'require.resolve' is patched to use Bazel resolutions from the MANIFEST FILES. // Adding a temporary file won't be enough to make Bazel aware of this file. // We provide the full path here just to verify that the underlying logic works let prefix = ''; if (process.env['BAZEL_TARGET']) { prefix = path.join(process.cwd(), 'node_modules'); } expect(() => { engine.createCollection(path.join(prefix, '@angular/core', './schematics/migrations.json')); }).not.toThrow(); }); });