node-module-engine-host.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. "use strict";
  2. /**
  3. * @license
  4. * Copyright Google LLC All Rights Reserved.
  5. *
  6. * Use of this source code is governed by an MIT-style license that can be
  7. * found in the LICENSE file at https://angular.io/license
  8. */
  9. Object.defineProperty(exports, "__esModule", { value: true });
  10. exports.NodeModulesEngineHost = exports.NodePackageDoesNotSupportSchematics = void 0;
  11. const core_1 = require("@angular-devkit/core");
  12. const path_1 = require("path");
  13. const export_ref_1 = require("./export-ref");
  14. const file_system_engine_host_base_1 = require("./file-system-engine-host-base");
  15. const file_system_utility_1 = require("./file-system-utility");
  16. class NodePackageDoesNotSupportSchematics extends core_1.BaseException {
  17. constructor(name) {
  18. super(`Package ${JSON.stringify(name)} was found but does not support schematics.`);
  19. }
  20. }
  21. exports.NodePackageDoesNotSupportSchematics = NodePackageDoesNotSupportSchematics;
  22. /**
  23. * A simple EngineHost that uses NodeModules to resolve collections.
  24. */
  25. class NodeModulesEngineHost extends file_system_engine_host_base_1.FileSystemEngineHostBase {
  26. constructor(paths) {
  27. super();
  28. this.paths = paths;
  29. }
  30. resolve(name, requester, references = new Set()) {
  31. if (requester) {
  32. if (references.has(requester)) {
  33. references.add(requester);
  34. throw new Error('Circular schematic reference detected: ' + JSON.stringify(Array.from(references)));
  35. }
  36. else {
  37. references.add(requester);
  38. }
  39. }
  40. const relativeBase = requester ? (0, path_1.dirname)(requester) : process.cwd();
  41. let collectionPath = undefined;
  42. if (name.startsWith('.')) {
  43. name = (0, path_1.resolve)(relativeBase, name);
  44. }
  45. const resolveOptions = {
  46. paths: requester ? [(0, path_1.dirname)(requester), ...(this.paths || [])] : this.paths,
  47. };
  48. // Try to resolve as a package
  49. try {
  50. const packageJsonPath = require.resolve((0, path_1.join)(name, 'package.json'), resolveOptions);
  51. const { schematics } = require(packageJsonPath);
  52. if (!schematics || typeof schematics !== 'string') {
  53. throw new NodePackageDoesNotSupportSchematics(name);
  54. }
  55. collectionPath = this.resolve(schematics, packageJsonPath, references);
  56. }
  57. catch (e) {
  58. if (e.code !== 'MODULE_NOT_FOUND') {
  59. throw e;
  60. }
  61. }
  62. // If not a package, try to resolve as a file
  63. if (!collectionPath) {
  64. try {
  65. collectionPath = require.resolve(name, resolveOptions);
  66. }
  67. catch (e) {
  68. if (e.code !== 'MODULE_NOT_FOUND') {
  69. throw e;
  70. }
  71. }
  72. }
  73. // If not a package or a file, error
  74. if (!collectionPath) {
  75. throw new file_system_engine_host_base_1.CollectionCannotBeResolvedException(name);
  76. }
  77. return collectionPath;
  78. }
  79. _resolveCollectionPath(name, requester) {
  80. const collectionPath = this.resolve(name, requester);
  81. (0, file_system_utility_1.readJsonFile)(collectionPath);
  82. return collectionPath;
  83. }
  84. _resolveReferenceString(refString, parentPath, collectionDescription) {
  85. const ref = new export_ref_1.ExportStringRef(refString, parentPath);
  86. if (!ref.ref) {
  87. return null;
  88. }
  89. return { ref: ref.ref, path: ref.module };
  90. }
  91. _transformCollectionDescription(name, desc) {
  92. if (!desc.schematics || typeof desc.schematics != 'object') {
  93. throw new file_system_engine_host_base_1.CollectionMissingSchematicsMapException(name);
  94. }
  95. return {
  96. ...desc,
  97. name,
  98. };
  99. }
  100. _transformSchematicDescription(name, _collection, desc) {
  101. if (!desc.factoryFn || !desc.path || !desc.description) {
  102. throw new file_system_engine_host_base_1.SchematicMissingFieldsException(name);
  103. }
  104. return desc;
  105. }
  106. }
  107. exports.NodeModulesEngineHost = NodeModulesEngineHost;
  108. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1tb2R1bGUtZW5naW5lLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9zY2hlbWF0aWNzL3Rvb2xzL25vZGUtbW9kdWxlLWVuZ2luZS1ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7OztBQUVILCtDQUFxRDtBQUNyRCwrQkFBOEM7QUFHOUMsNkNBQStDO0FBQy9DLGlGQUt3QztBQUN4QywrREFBcUQ7QUFFckQsTUFBYSxtQ0FBb0MsU0FBUSxvQkFBYTtJQUNwRSxZQUFZLElBQVk7UUFDdEIsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUN0RixDQUFDO0NBQ0Y7QUFKRCxrRkFJQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSx1REFBd0I7SUFDakUsWUFBNkIsS0FBZ0I7UUFDM0MsS0FBSyxFQUFFLENBQUM7UUFEbUIsVUFBSyxHQUFMLEtBQUssQ0FBVztJQUU3QyxDQUFDO0lBRU8sT0FBTyxDQUFDLElBQVksRUFBRSxTQUFrQixFQUFFLGFBQWEsSUFBSSxHQUFHLEVBQVU7UUFDOUUsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzdCLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUNBQXlDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQ25GLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7UUFFRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFD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aEMsQ0FBQztJQUVTLDhCQUE4QixDQUN0QyxJQUFZLEVBQ1osV0FBcUMsRUFDckMsSUFBc0M7UUFFdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN0RCxNQUFNLElBQUksOERBQStCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakQ7UUFFRCxPQUFPLElBQStCLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBNUdELHNEQTRHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUnVsZUZhY3RvcnkgfSBmcm9tICcuLi9zcmMnO1xuaW1wb3J0IHsgRmlsZVN5c3RlbUNvbGxlY3Rpb25EZXNjLCBGaWxlU3lzdGVtU2NoZW1hdGljRGVzYyB9IGZyb20gJy4vZGVzY3JpcHRpb24nO1xuaW1wb3J0IHsgRXhwb3J0U3RyaW5nUmVmIH0gZnJvbSAnLi9leHBvcnQtcmVmJztcbmltcG9ydCB7XG4gIENvbGxlY3Rpb25DYW5ub3RCZVJlc29sdmVkRXhjZXB0aW9uLFxuICBDb2xsZWN0aW9uTWlzc2luZ1NjaGVtYXRpY3NNYXBFeGNlcHRpb24sXG4gIEZpbGVTeXN0ZW1FbmdpbmVIb3N0QmFzZSxcbiAgU2NoZW1hdGljTWlzc2luZ0ZpZWxkc0V4Y2VwdGlvbixcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS1lbmdpbmUtaG9zdC1iYXNlJztcbmltcG9ydCB7IHJlYWRKc29uRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0tdXRpbGl0eSc7XG5cbmV4cG9ydCBjbGFzcyBOb2RlUGFja2FnZURvZXNOb3RTdXBwb3J0U2NoZW1hdGljcyBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgUGFja2FnZSAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSB3YXMgZm91bmQgYnV0IGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hdGljcy5gKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc2ltcGxlIEVuZ2luZUhvc3QgdGhhdCB1c2VzIE5vZGVNb2R1bGVzIHRvIHJlc29sdmUgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb2RlTW9kdWxlc0VuZ2luZUhvc3QgZXh0ZW5kcyBGaWxlU3lzdGVtRW5naW5lSG9zdEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhdGhzPzogc3RyaW5nW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlKG5hbWU6IHN0cmluZywgcmVxdWVzdGVyPzogc3RyaW5nLCByZWZlcmVuY2VzID0gbmV3IFNldDxzdHJpbmc+KCkpOiBzdHJpbmcge1xuICAgIGlmIChyZXF1ZXN0ZXIpIHtcbiAgICAgIGlmIChyZWZlcmVuY2VzLmhhcyhyZXF1ZXN0ZXIpKSB7XG4gICAgICAgIHJlZmVyZW5jZXMuYWRkKHJlcXVlc3Rlcik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQ2lyY3VsYXIgc2NoZW1hdGljIHJlZmVyZW5jZSBkZXRlY3RlZDogJyArIEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVmZXJlbmNlcykpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVmZXJlbmNlcy5hZGQocmVxdWVzdGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZUJhc2UgPSByZXF1ZXN0ZXIgPyBkaXJuYW1lKHJlcXVlc3RlcikgOiBwcm9jZXNzLmN3ZCgpO1xuICAgIGxldCBjb2xsZWN0aW9uUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICBuYW1lID0gcmVzb2x2ZShyZWxhdGl2ZUJhc2UsIG5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVPcHRpb25zID0ge1xuICAgICAgcGF0aHM6IHJlcXVlc3RlciA/IFtkaXJuYW1lKHJlcXVlc3RlciksIC4uLih0aGlzLnBhdGhzIHx8IFtdKV0gOiB0aGlzLnBhdGhzLFxuICAgIH07XG5cbiAgICAvLyBUcnkgdG8gcmVzb2x2ZSBhcyBhIHBhY2thZ2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKGpvaW4obmFtZSwgJ3BhY2thZ2UuanNvbicpLCByZXNvbHZlT3B0aW9ucyk7XG4gICAgICBjb25zdCB7IHNjaGVtYXRpY3MgfSA9IHJlcXVpcmUocGFja2FnZUpzb25QYXRoKTtcblxuICAgICAgaWYgKCFzY2hlbWF0aWNzIHx8IHR5cGVvZiBzY2hlbWF0aWNzICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgTm9kZVBhY2thZ2VEb2VzTm90U3VwcG9ydFNjaGVtYXRpY3MobmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbGxlY3Rpb25QYXRoID0gdGhpcy5yZXNvbHZlKHNjaGVtYXRpY3MsIHBhY2thZ2VKc29uUGF0aCwgcmVmZXJlbmNlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IGEgcGFja2FnZSwgdHJ5IHRvIHJlc29sdmUgYXMgYSBmaWxlXG4gICAgaWYgKCFjb2xsZWN0aW9uUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29sbGVjdGlvblBhdGggPSByZXF1aXJlLnJlc29sdmUobmFtZSwgcmVzb2x2ZU9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnTU9EVUxFX05PVF9GT1VORCcpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IGEgcGFja2FnZSBvciBhIGZpbGUsIGVycm9yXG4gICAgaWYgKCFjb2xsZWN0aW9uUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IENvbGxlY3Rpb25DYW5ub3RCZVJlc29sdmVkRXhjZXB0aW9uKG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBjb2xsZWN0aW9uUGF0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfcmVzb2x2ZUNvbGxlY3Rpb25QYXRoKG5hbWU6IHN0cmluZywgcmVxdWVzdGVyPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uUGF0aCA9IHRoaXMucmVzb2x2ZShuYW1lLCByZXF1ZXN0ZXIpO1xuICAgIHJlYWRKc29uRmlsZShjb2xsZWN0aW9uUGF0aCk7XG5cbiAgICByZXR1cm4gY29sbGVjdGlvblBhdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Jlc29sdmVSZWZlcmVuY2VTdHJpbmcoXG4gICAgcmVmU3RyaW5nOiBzdHJpbmcsXG4gICAgcGFyZW50UGF0aDogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb25EZXNjcmlwdGlvbj86IEZpbGVTeXN0ZW1Db2xsZWN0aW9uRGVzYyxcbiAgKSB7XG4gICAgY29uc3QgcmVmID0gbmV3IEV4cG9ydFN0cmluZ1JlZjxSdWxlRmFjdG9yeTx7fT4+KHJlZlN0cmluZywgcGFyZW50UGF0aCk7XG4gICAgaWYgKCFyZWYucmVmKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4geyByZWY6IHJlZi5yZWYsIHBhdGg6IHJlZi5tb2R1bGUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfdHJhbnNmb3JtQ29sbGVjdGlvbkRlc2NyaXB0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjOiBQYXJ0aWFsPEZpbGVTeXN0ZW1Db2xsZWN0aW9uRGVzYz4sXG4gICk6IEZpbGVTeXN0ZW1Db2xsZWN0aW9uRGVzYyB7XG4gICAgaWYgKCFkZXNjLnNjaGVtYXRpY3MgfHwgdHlwZW9mIGRlc2Muc2NoZW1hdGljcyAhPSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IENvbGxlY3Rpb25NaXNzaW5nU2NoZW1hdGljc01hcEV4Y2VwdGlvbihuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVzYyxcbiAgICAgIG5hbWUsXG4gICAgfSBhcyBGaWxlU3lzdGVtQ29sbGVjdGlvbkRlc2M7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3RyYW5zZm9ybVNjaGVtYXRpY0Rlc2NyaXB0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfY29sbGVjdGlvbjogRmlsZVN5c3RlbUNvbGxlY3Rpb25EZXNjLFxuICAgIGRlc2M6IFBhcnRpYWw8RmlsZVN5c3RlbVNjaGVtYXRpY0Rlc2M+LFxuICApOiBGaWxlU3lzdGVtU2NoZW1hdGljRGVzYyB7XG4gICAgaWYgKCFkZXNjLmZhY3RvcnlGbiB8fCAhZGVzYy5wYXRoIHx8ICFkZXNjLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hdGljTWlzc2luZ0ZpZWxkc0V4Y2VwdGlvbihuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzYyBhcyBGaWxlU3lzdGVtU2NoZW1hdGljRGVzYztcbiAgfVxufVxuIl19