UNPKG

5.36 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const resolve_1 = __importDefault(require("resolve"));
7const path_1 = require("path");
8const fs_1 = require("fs");
9const cache = new WeakMap();
10let pkgGeneration = 0;
11function reloadDevPackages() {
12 pkgGeneration++;
13}
14exports.reloadDevPackages = reloadDevPackages;
15class 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 // This is the per-package options from ember-cli
23 let options = this.isAddon
24 ? appOrAddon.parent.options
25 : appOrAddon.app.options;
26 // Stash our own config options
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 // Generate the same babel options that the package (meaning app or addon)
44 // is using. We will use these so we can configure our parser to
45 // match.
46 let babelAddon = instance.addons.find((addon) => addon.name === 'ember-cli-babel');
47 let babelOptions = babelAddon.buildBabelOptions(options);
48 // https://github.com/babel/ember-cli-babel/issues/227
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 // avoiding `require` here because we don't want to go through the
62 // require cache.
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 // This namespacing ensures we can be used by multiple packages as
70 // well as by an addon and its dummy app simultaneously
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 // only apps (not addons) are allowed to set this, because it's motivated by
121 // the apps own Content Security Policy.
122 return Boolean(!this.isAddon && this.autoImportOptions && this.autoImportOptions.forbidEval);
123 }
124}
125exports.default = Package;
126//# sourceMappingURL=package.js.map
\No newline at end of file