1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | const resolve_1 = __importDefault(require("resolve"));
|
7 | const path_1 = require("path");
|
8 | const fs_1 = require("fs");
|
9 | const cache = new WeakMap();
|
10 | let pkgGeneration = 0;
|
11 | function reloadDevPackages() {
|
12 | pkgGeneration++;
|
13 | }
|
14 | exports.reloadDevPackages = reloadDevPackages;
|
15 | class Package {
|
16 | constructor(appOrAddon) {
|
17 | this.isAddonCache = new Map();
|
18 | this.name = appOrAddon.parent.pkg.name;
|
19 | this.root = appOrAddon.parent.root;
|
20 | this.isAddon = appOrAddon.parent !== appOrAddon.project;
|
21 | this.isDeveloping = !this.isAddon || this.root === appOrAddon.project.root;
|
22 |
|
23 | let options = this.isAddon
|
24 | ? appOrAddon.parent.options
|
25 | : appOrAddon.app.options;
|
26 |
|
27 | this.autoImportOptions = options.autoImport;
|
28 | this.emberCLIBabelExtensions = options['ember-cli-babel']
|
29 | && options['ember-cli-babel'].extensions || ['js'];
|
30 | let { babelOptions, version } = this.buildBabelOptions(appOrAddon.parent, options);
|
31 | this.babelOptions = babelOptions;
|
32 | this.babelMajorVersion = version;
|
33 | this.pkgCache = appOrAddon.parent.pkg;
|
34 | this.pkgGeneration = pkgGeneration;
|
35 | }
|
36 | static lookup(appOrAddon) {
|
37 | if (!cache.has(appOrAddon)) {
|
38 | cache.set(appOrAddon, new this(appOrAddon));
|
39 | }
|
40 | return cache.get(appOrAddon);
|
41 | }
|
42 | buildBabelOptions(instance, options) {
|
43 |
|
44 |
|
45 |
|
46 | let babelAddon = instance.addons.find((addon) => addon.name === 'ember-cli-babel');
|
47 | let babelOptions = babelAddon.buildBabelOptions(options);
|
48 |
|
49 | delete babelOptions.annotation;
|
50 | delete babelOptions.throwUnlessParallelizable;
|
51 | delete babelOptions.filterExtensions;
|
52 | if (babelOptions.plugins) {
|
53 | babelOptions.plugins = babelOptions.plugins.filter((p) => !p._parallelBabel);
|
54 | }
|
55 | let version = parseInt(babelAddon.pkg.version.split('.')[0], 10);
|
56 | return { babelOptions, version };
|
57 | }
|
58 | get pkg() {
|
59 | if (!this.pkgCache ||
|
60 | (this.isDeveloping && pkgGeneration !== this.pkgGeneration)) {
|
61 |
|
62 |
|
63 | this.pkgCache = JSON.parse(fs_1.readFileSync(path_1.join(this.root, 'package.json'), 'utf-8'));
|
64 | this.pkgGeneration = pkgGeneration;
|
65 | }
|
66 | return this.pkgCache;
|
67 | }
|
68 | get namespace() {
|
69 |
|
70 |
|
71 | return `${this.name}/${this.isAddon ? 'addon' : 'app'}`;
|
72 | }
|
73 | hasDependency(name) {
|
74 | let pkg = this.pkg;
|
75 | return ((pkg.dependencies && Boolean(pkg.dependencies[name])) ||
|
76 | (pkg.devDependencies && Boolean(pkg.devDependencies[name])) ||
|
77 | (pkg.peerDependencies && Boolean(pkg.peerDependencies[name])));
|
78 | }
|
79 | hasNonDevDependency(name) {
|
80 | let pkg = this.pkg;
|
81 | return ((pkg.dependencies && Boolean(pkg.dependencies[name])) ||
|
82 | (pkg.peerDependencies && Boolean(pkg.peerDependencies[name])));
|
83 | }
|
84 | isEmberAddonDependency(name) {
|
85 | if (!this.isAddonCache.has(name)) {
|
86 | let packageJSON = require(resolve_1.default.sync(`${name}/package.json`, {
|
87 | basedir: this.root
|
88 | }));
|
89 | let keywords = packageJSON.keywords;
|
90 | this.isAddonCache.set(name, keywords && keywords.includes('ember-addon'));
|
91 | }
|
92 | return this.isAddonCache.get(name) || false;
|
93 | }
|
94 | assertAllowedDependency(name) {
|
95 | if (this.isAddon && !this.hasNonDevDependency(name)) {
|
96 | throw new Error(`${this.name} tried to import "${name}" from addon code, but "${name}" is a devDependency. You may need to move it into dependencies.`);
|
97 | }
|
98 | }
|
99 | excludesDependency(name) {
|
100 | return Boolean(this.autoImportOptions &&
|
101 | this.autoImportOptions.exclude &&
|
102 | this.autoImportOptions.exclude.includes(name));
|
103 | }
|
104 | get webpackConfig() {
|
105 | return this.autoImportOptions && this.autoImportOptions.webpack;
|
106 | }
|
107 | aliasFor(name) {
|
108 | return ((this.autoImportOptions &&
|
109 | this.autoImportOptions.alias &&
|
110 | this.autoImportOptions.alias[name]) ||
|
111 | name);
|
112 | }
|
113 | get fileExtensions() {
|
114 | return this.emberCLIBabelExtensions;
|
115 | }
|
116 | get publicAssetURL() {
|
117 | return this.autoImportOptions && this.autoImportOptions.publicAssetURL;
|
118 | }
|
119 | get forbidsEval() {
|
120 |
|
121 |
|
122 | return Boolean(!this.isAddon && this.autoImportOptions && this.autoImportOptions.forbidEval);
|
123 | }
|
124 | }
|
125 | exports.default = Package;
|
126 |
|
\ | No newline at end of file |