index.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. /**
  4. * @license
  5. * Copyright Google Inc. All Rights Reserved.
  6. *
  7. * Use of this source code is governed by an MIT-style license that can be
  8. * found in the LICENSE file at https://angular.io/license
  9. */
  10. const core_1 = require("@angular-devkit/core");
  11. const schematics_1 = require("@angular-devkit/schematics");
  12. const tasks_1 = require("@angular-devkit/schematics/tasks");
  13. const dependencies_1 = require("../utility/dependencies");
  14. const latest_versions_1 = require("../utility/latest-versions");
  15. const lint_fix_1 = require("../utility/lint-fix");
  16. const paths_1 = require("../utility/paths");
  17. const validation_1 = require("../utility/validation");
  18. const workspace_1 = require("../utility/workspace");
  19. const workspace_models_1 = require("../utility/workspace-models");
  20. function updateJsonFile(host, path, callback) {
  21. const source = host.read(path);
  22. if (source) {
  23. const sourceText = source.toString('utf-8');
  24. const json = core_1.parseJson(sourceText, core_1.JsonParseMode.Loose);
  25. callback(json);
  26. host.overwrite(path, JSON.stringify(json, null, 2));
  27. }
  28. return host;
  29. }
  30. function updateTsConfig(packageName, ...paths) {
  31. return (host) => {
  32. if (!host.exists('tsconfig.json')) {
  33. return host;
  34. }
  35. return updateJsonFile(host, 'tsconfig.json', (tsconfig) => {
  36. if (!tsconfig.compilerOptions.paths) {
  37. tsconfig.compilerOptions.paths = {};
  38. }
  39. if (!tsconfig.compilerOptions.paths[packageName]) {
  40. tsconfig.compilerOptions.paths[packageName] = [];
  41. }
  42. tsconfig.compilerOptions.paths[packageName].push(...paths);
  43. });
  44. };
  45. }
  46. function addDependenciesToPackageJson() {
  47. return (host) => {
  48. [
  49. {
  50. type: dependencies_1.NodeDependencyType.Dev,
  51. name: '@angular/compiler-cli',
  52. version: latest_versions_1.latestVersions.Angular,
  53. },
  54. {
  55. type: dependencies_1.NodeDependencyType.Dev,
  56. name: '@angular-devkit/build-ng-packagr',
  57. version: latest_versions_1.latestVersions.DevkitBuildNgPackagr,
  58. },
  59. {
  60. type: dependencies_1.NodeDependencyType.Dev,
  61. name: '@angular-devkit/build-angular',
  62. version: latest_versions_1.latestVersions.DevkitBuildAngular,
  63. },
  64. {
  65. type: dependencies_1.NodeDependencyType.Dev,
  66. name: 'ng-packagr',
  67. version: latest_versions_1.latestVersions.ngPackagr,
  68. },
  69. {
  70. type: dependencies_1.NodeDependencyType.Default,
  71. name: 'tslib',
  72. version: latest_versions_1.latestVersions.TsLib,
  73. },
  74. {
  75. type: dependencies_1.NodeDependencyType.Dev,
  76. name: 'typescript',
  77. version: latest_versions_1.latestVersions.TypeScript,
  78. },
  79. ].forEach(dependency => dependencies_1.addPackageJsonDependency(host, dependency));
  80. return host;
  81. };
  82. }
  83. function addLibToWorkspaceFile(options, projectRoot, projectName) {
  84. return workspace_1.updateWorkspace(workspace => {
  85. if (workspace.projects.size === 0) {
  86. workspace.extensions.defaultProject = projectName;
  87. }
  88. workspace.projects.add({
  89. name: projectName,
  90. root: projectRoot,
  91. sourceRoot: `${projectRoot}/src`,
  92. projectType: workspace_models_1.ProjectType.Library,
  93. prefix: options.prefix,
  94. targets: {
  95. build: {
  96. builder: workspace_models_1.Builders.NgPackagr,
  97. options: {
  98. tsConfig: `${projectRoot}/tsconfig.lib.json`,
  99. project: `${projectRoot}/ng-package.json`,
  100. },
  101. configurations: {
  102. production: {
  103. tsConfig: `${projectRoot}/tsconfig.lib.prod.json`,
  104. },
  105. },
  106. },
  107. test: {
  108. builder: workspace_models_1.Builders.Karma,
  109. options: {
  110. main: `${projectRoot}/src/test.ts`,
  111. tsConfig: `${projectRoot}/tsconfig.spec.json`,
  112. karmaConfig: `${projectRoot}/karma.conf.js`,
  113. },
  114. },
  115. lint: {
  116. builder: workspace_models_1.Builders.TsLint,
  117. options: {
  118. tsConfig: [
  119. `${projectRoot}/tsconfig.lib.json`,
  120. `${projectRoot}/tsconfig.spec.json`,
  121. ],
  122. exclude: [
  123. '**/node_modules/**',
  124. ],
  125. },
  126. },
  127. },
  128. });
  129. });
  130. }
  131. function default_1(options) {
  132. return async (host) => {
  133. if (!options.name) {
  134. throw new schematics_1.SchematicsException(`Invalid options, "name" is required.`);
  135. }
  136. const prefix = options.prefix;
  137. validation_1.validateProjectName(options.name);
  138. // If scoped project (i.e. "@foo/bar"), convert projectDir to "foo/bar".
  139. const projectName = options.name;
  140. const packageName = core_1.strings.dasherize(projectName);
  141. let scopeName = null;
  142. if (/^@.*\/.*/.test(options.name)) {
  143. const [scope, name] = options.name.split('/');
  144. scopeName = scope.replace(/^@/, '');
  145. options.name = name;
  146. }
  147. const workspace = await workspace_1.getWorkspace(host);
  148. const newProjectRoot = workspace.extensions.newProjectRoot || '';
  149. const scopeFolder = scopeName ? core_1.strings.dasherize(scopeName) + '/' : '';
  150. const folderName = `${scopeFolder}${core_1.strings.dasherize(options.name)}`;
  151. const projectRoot = core_1.join(core_1.normalize(newProjectRoot), folderName);
  152. const distRoot = `dist/${folderName}`;
  153. const pathImportLib = `${distRoot}/${folderName.replace('/', '-')}`;
  154. const sourceDir = `${projectRoot}/src/lib`;
  155. const templateSource = schematics_1.apply(schematics_1.url('./files'), [
  156. schematics_1.applyTemplates({
  157. ...core_1.strings,
  158. ...options,
  159. packageName,
  160. projectRoot,
  161. distRoot,
  162. relativePathToWorkspaceRoot: paths_1.relativePathToWorkspaceRoot(projectRoot),
  163. prefix,
  164. angularLatestVersion: latest_versions_1.latestVersions.Angular.replace('~', '').replace('^', ''),
  165. tsLibLatestVersion: latest_versions_1.latestVersions.TsLib.replace('~', '').replace('^', ''),
  166. folderName,
  167. }),
  168. schematics_1.move(projectRoot),
  169. ]);
  170. return schematics_1.chain([
  171. schematics_1.mergeWith(templateSource),
  172. addLibToWorkspaceFile(options, projectRoot, projectName),
  173. options.skipPackageJson ? schematics_1.noop() : addDependenciesToPackageJson(),
  174. options.skipTsConfig ? schematics_1.noop() : updateTsConfig(packageName, pathImportLib, distRoot),
  175. schematics_1.schematic('module', {
  176. name: options.name,
  177. commonModule: false,
  178. flat: true,
  179. path: sourceDir,
  180. project: options.name,
  181. }),
  182. schematics_1.schematic('component', {
  183. name: options.name,
  184. selector: `${prefix}-${options.name}`,
  185. inlineStyle: true,
  186. inlineTemplate: true,
  187. flat: true,
  188. path: sourceDir,
  189. export: true,
  190. project: options.name,
  191. }),
  192. schematics_1.schematic('service', {
  193. name: options.name,
  194. flat: true,
  195. path: sourceDir,
  196. project: options.name,
  197. }),
  198. options.lintFix ? lint_fix_1.applyLintFix(sourceDir) : schematics_1.noop(),
  199. (_tree, context) => {
  200. if (!options.skipPackageJson && !options.skipInstall) {
  201. context.addTask(new tasks_1.NodePackageInstallTask());
  202. }
  203. },
  204. ]);
  205. };
  206. }
  207. exports.default = default_1;