@embroider/macros 0.50.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/package.json +4 -3
- package/src/addon/es-compat.js +3 -0
- package/src/babel/dependency-satisfies.js +4 -8
- package/src/babel/dependency-satisfies.js.map +1 -1
- package/src/babel/each.js +2 -3
- package/src/babel/each.js.map +1 -1
- package/src/babel/evaluate-json.js +5 -5
- package/src/babel/evaluate-json.js.map +1 -1
- package/src/babel/get-config.js +6 -15
- package/src/babel/get-config.js.map +1 -1
- package/src/babel/macro-condition.js +1 -1
- package/src/babel/macro-condition.js.map +1 -1
- package/src/babel/macros-babel-plugin.js +16 -64
- package/src/babel/macros-babel-plugin.js.map +1 -1
- package/src/babel/module-exists.js +1 -3
- package/src/babel/module-exists.js.map +1 -1
- package/src/babel/state.d.ts +10 -8
- package/src/babel/state.js +25 -29
- package/src/babel/state.js.map +1 -1
- package/src/ember-addon-main.js +29 -24
- package/src/ember-addon-main.js.map +1 -1
- package/src/glimmer/ast-transform.d.ts +12 -10
- package/src/glimmer/ast-transform.js +14 -15
- package/src/glimmer/ast-transform.js.map +1 -1
- package/src/glimmer/dependency-satisfies.d.ts +2 -1
- package/src/glimmer/dependency-satisfies.js +2 -4
- package/src/glimmer/dependency-satisfies.js.map +1 -1
- package/src/glimmer/get-config.d.ts +2 -1
- package/src/glimmer/get-config.js +1 -3
- package/src/glimmer/get-config.js.map +1 -1
- package/src/macros-config.d.ts +6 -6
- package/src/macros-config.js +101 -78
- package/src/macros-config.js.map +1 -1
package/README.md
CHANGED
|
@@ -121,6 +121,10 @@ let foo = importSync('foo');
|
|
|
121
121
|
let foo = require('foo');
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
+
#### hint
|
|
125
|
+
|
|
126
|
+
When using `importSync` on non ember-addon packages both the package being imported from *and* `ember-auto-import` *must* be in the `dependencies` of your addons `package.json`.
|
|
127
|
+
|
|
124
128
|
### dependencySatisfies
|
|
125
129
|
|
|
126
130
|
Tests whether a given dependency is present and satisfies the given semver range. Both arguments must be strings and the second argument will be passed into [semver's satisfies](https://github.com/npm/node-semver#usage) method.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embroider/macros",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Standardized build-time macros for ember apps.",
|
|
6
6
|
"keywords": [
|
|
@@ -24,8 +24,9 @@
|
|
|
24
24
|
"test": "jest"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@embroider/shared-internals": "
|
|
27
|
+
"@embroider/shared-internals": "1.1.0",
|
|
28
28
|
"assert-never": "^1.2.1",
|
|
29
|
+
"babel-import-util": "^1.1.0",
|
|
29
30
|
"ember-cli-babel": "^7.26.6",
|
|
30
31
|
"find-up": "^5.0.0",
|
|
31
32
|
"lodash": "^4.17.21",
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
"devDependencies": {
|
|
36
37
|
"@babel/core": "^7.14.5",
|
|
37
38
|
"@babel/traverse": "^7.14.5",
|
|
38
|
-
"@embroider/core": "
|
|
39
|
+
"@embroider/core": "1.1.0",
|
|
39
40
|
"@embroider/test-support": "0.36.0",
|
|
40
41
|
"@types/babel__core": "^7.1.14",
|
|
41
42
|
"@types/babel__generator": "^7.6.2",
|
|
@@ -3,30 +3,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const state_1 = require("./state");
|
|
7
6
|
const semver_1 = require("semver");
|
|
8
|
-
const shared_internals_1 = require("@embroider/shared-internals");
|
|
9
7
|
const error_1 = __importDefault(require("./error"));
|
|
10
8
|
const evaluate_json_1 = require("./evaluate-json");
|
|
11
|
-
const packageCache = shared_internals_1.PackageCache.shared('embroider-stage3');
|
|
12
9
|
function dependencySatisfies(path, state) {
|
|
13
10
|
if (path.node.arguments.length !== 2) {
|
|
14
11
|
throw (0, error_1.default)(path, `dependencySatisfies takes exactly two arguments, you passed ${path.node.arguments.length}`);
|
|
15
12
|
}
|
|
16
|
-
|
|
13
|
+
const [packageName, range] = path.node.arguments;
|
|
17
14
|
if (packageName.type !== 'StringLiteral') {
|
|
18
15
|
throw (0, error_1.default)((0, evaluate_json_1.assertArray)(path.get('arguments'))[0], `the first argument to dependencySatisfies must be a string literal`);
|
|
19
16
|
}
|
|
20
17
|
if (range.type !== 'StringLiteral') {
|
|
21
18
|
throw (0, error_1.default)((0, evaluate_json_1.assertArray)(path.get('arguments'))[1], `the second argument to dependencySatisfies must be a string literal`);
|
|
22
19
|
}
|
|
23
|
-
let sourceFileName = (0, state_1.sourceFile)(path, state);
|
|
24
20
|
try {
|
|
25
|
-
let us = packageCache.ownerOfFile(
|
|
26
|
-
if (!us) {
|
|
21
|
+
let us = state.packageCache.ownerOfFile(state.sourceFile);
|
|
22
|
+
if (!(us === null || us === void 0 ? void 0 : us.hasDependency(packageName.value))) {
|
|
27
23
|
return false;
|
|
28
24
|
}
|
|
29
|
-
let version = packageCache.resolve(packageName.value, us).version;
|
|
25
|
+
let version = state.packageCache.resolve(packageName.value, us).version;
|
|
30
26
|
return (0, semver_1.satisfies)(version, range.value, {
|
|
31
27
|
includePrerelease: true,
|
|
32
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-satisfies.js","sourceRoot":"","sources":["dependency-satisfies.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"dependency-satisfies.js","sourceRoot":"","sources":["dependency-satisfies.ts"],"names":[],"mappings":";;;;;AAGA,mCAAmC;AACnC,oDAA4B;AAC5B,mDAA8C;AAE9C,SAAwB,mBAAmB,CAAC,IAAgC,EAAE,KAAY;IACxF,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QACpC,MAAM,IAAA,eAAK,EAAC,IAAI,EAAE,+DAA+D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;KAChH;IACD,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IACjD,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE;QACxC,MAAM,IAAA,eAAK,EACT,IAAA,2BAAW,EAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EACrC,oEAAoE,CACrE,CAAC;KACH;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE;QAClC,MAAM,IAAA,eAAK,EACT,IAAA,2BAAW,EAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EACrC,qEAAqE,CACtE,CAAC;KACH;IACD,IAAI;QACF,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA,EAAE;YACzC,OAAO,KAAK,CAAC;SACd;QAED,IAAI,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;QACxE,OAAO,IAAA,kBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE;YACrC,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;KACJ;IAAC,OAAO,GAAG,EAAE;QACZ,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE;YACnC,MAAM,GAAG,CAAC;SACX;QACD,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAjCD,sCAiCC","sourcesContent":["import type { NodePath } from '@babel/traverse';\nimport type { types as t } from '@babel/core';\nimport State from './state';\nimport { satisfies } from 'semver';\nimport error from './error';\nimport { assertArray } from './evaluate-json';\n\nexport default function dependencySatisfies(path: NodePath<t.CallExpression>, state: State): boolean {\n if (path.node.arguments.length !== 2) {\n throw error(path, `dependencySatisfies takes exactly two arguments, you passed ${path.node.arguments.length}`);\n }\n const [packageName, range] = path.node.arguments;\n if (packageName.type !== 'StringLiteral') {\n throw error(\n assertArray(path.get('arguments'))[0],\n `the first argument to dependencySatisfies must be a string literal`\n );\n }\n if (range.type !== 'StringLiteral') {\n throw error(\n assertArray(path.get('arguments'))[1],\n `the second argument to dependencySatisfies must be a string literal`\n );\n }\n try {\n let us = state.packageCache.ownerOfFile(state.sourceFile);\n if (!us?.hasDependency(packageName.value)) {\n return false;\n }\n\n let version = state.packageCache.resolve(packageName.value, us).version;\n return satisfies(version, range.value, {\n includePrerelease: true,\n });\n } catch (err) {\n if (err.code !== 'MODULE_NOT_FOUND') {\n throw err;\n }\n return false;\n }\n}\n"]}
|
package/src/babel/each.js
CHANGED
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.insertEach = exports.isEachPath = void 0;
|
|
7
7
|
const evaluate_json_1 = require("./evaluate-json");
|
|
8
8
|
const error_1 = __importDefault(require("./error"));
|
|
9
|
-
const state_1 = require("./state");
|
|
10
9
|
function isEachPath(path) {
|
|
11
10
|
let right = path.get('right');
|
|
12
11
|
if (right.isCallExpression()) {
|
|
@@ -40,7 +39,7 @@ function insertEach(path, state, context) {
|
|
|
40
39
|
}
|
|
41
40
|
if (state.opts.mode === 'run-time') {
|
|
42
41
|
let callee = path.get('right').get('callee');
|
|
43
|
-
state.
|
|
42
|
+
callee.replaceWith(state.importUtil.import(callee, state.pathToOurAddon('runtime'), 'each'));
|
|
44
43
|
}
|
|
45
44
|
else {
|
|
46
45
|
for (let element of array.value) {
|
|
@@ -48,7 +47,7 @@ function insertEach(path, state, context) {
|
|
|
48
47
|
for (let target of nameRefs) {
|
|
49
48
|
target.replaceWith(literalElement);
|
|
50
49
|
}
|
|
51
|
-
path.insertBefore(
|
|
50
|
+
path.insertBefore(state.cloneDeep(path.get('body').node));
|
|
52
51
|
}
|
|
53
52
|
path.remove();
|
|
54
53
|
}
|
package/src/babel/each.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"each.js","sourceRoot":"","sources":["each.ts"],"names":[],"mappings":";;;;;;AACA,mDAA2D;AAE3D,oDAA4B;
|
|
1
|
+
{"version":3,"file":"each.js","sourceRoot":"","sources":["each.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NodePath } from '@babel/traverse';\nimport { buildLiterals, Evaluator } from './evaluate-json';\nimport type { types as t } from '@babel/core';\nimport error from './error';\nimport State from './state';\nimport type * as Babel from '@babel/core';\n\ntype CallEachExpression = NodePath<t.CallExpression> & {\n get(callee: 'callee'): NodePath<t.Identifier>;\n};\n\nexport type EachPath = NodePath<t.ForOfStatement> & {\n get(right: 'right'): CallEachExpression;\n};\n\nexport function isEachPath(path: NodePath<t.ForOfStatement>): path is EachPath {\n let right = path.get('right');\n if (right.isCallExpression()) {\n let callee = right.get('callee');\n if (callee.referencesImport('@embroider/macros', 'each')) {\n return true;\n }\n }\n return false;\n}\n\nexport function insertEach(path: EachPath, state: State, context: typeof Babel) {\n let args = path.get('right').get('arguments');\n if (args.length !== 1) {\n throw error(path, `the each() macro accepts exactly one argument, you passed ${args.length}`);\n }\n\n let left = path.get('left');\n if (!left.isVariableDeclaration() || left.get('declarations').length !== 1) {\n throw error(left, `the each() macro doesn't support this syntax`);\n }\n\n let body = path.get('body');\n let varName = (left.get('declarations')[0].get('id') as NodePath<t.Identifier>).node.name;\n let nameRefs = body.scope.getBinding(varName)!.referencePaths;\n\n let [arrayPath] = args;\n let array = new Evaluator({ state }).evaluate(arrayPath);\n if (!array.confident) {\n throw error(args[0], `the argument to the each() macro must be statically known`);\n }\n\n if (state.opts.mode === 'compile-time' && !Array.isArray(array.value)) {\n throw error(args[0], `the argument to the each() macro must be an array`);\n }\n\n if (state.opts.mode === 'run-time') {\n let callee = path.get('right').get('callee');\n callee.replaceWith(state.importUtil.import(callee, state.pathToOurAddon('runtime'), 'each'));\n } else {\n for (let element of array.value) {\n let literalElement = buildLiterals(element, context);\n for (let target of nameRefs) {\n target.replaceWith(literalElement);\n }\n path.insertBefore(state.cloneDeep(path.get('body').node));\n }\n path.remove();\n }\n}\n"]}
|
|
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.buildLiterals = exports.assertArray = exports.assertNotArray = exports.Evaluator = void 0;
|
|
7
|
-
const state_1 = require("./state");
|
|
8
7
|
const dependency_satisfies_1 = __importDefault(require("./dependency-satisfies"));
|
|
9
8
|
const module_exists_1 = __importDefault(require("./module-exists"));
|
|
10
9
|
const get_config_1 = __importDefault(require("./get-config"));
|
|
@@ -294,12 +293,13 @@ class Evaluator {
|
|
|
294
293
|
// to runtime. That's why we've made `value` lazy. It lets us check the
|
|
295
294
|
// confidence without actually forcing the value.
|
|
296
295
|
maybeEvaluateRuntimeConfig(path) {
|
|
297
|
-
|
|
296
|
+
if (!this.state) {
|
|
297
|
+
return { confident: false };
|
|
298
|
+
}
|
|
298
299
|
let callee = path.get('callee');
|
|
299
300
|
if (callee.isIdentifier()) {
|
|
300
|
-
let { name } = callee.node;
|
|
301
301
|
// Does the identifier refer to our runtime config?
|
|
302
|
-
if ((
|
|
302
|
+
if (callee.referencesImport(this.state.pathToOurAddon('runtime'), 'config')) {
|
|
303
303
|
return {
|
|
304
304
|
confident: true,
|
|
305
305
|
get value() {
|
|
@@ -340,7 +340,7 @@ class Evaluator {
|
|
|
340
340
|
if (callee.referencesImport('@embroider/macros', 'isDevelopingThisPackage')) {
|
|
341
341
|
return {
|
|
342
342
|
confident: true,
|
|
343
|
-
value: this.state.opts.isDevelopingPackageRoots.includes(
|
|
343
|
+
value: this.state.opts.isDevelopingPackageRoots.includes(this.state.owningPackage().root),
|
|
344
344
|
};
|
|
345
345
|
}
|
|
346
346
|
if (callee.referencesImport('@embroider/macros', 'isTesting')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate-json.js","sourceRoot":"","sources":["evaluate-json.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NodePath } from '@babel/traverse';\nimport type * as Babel from '@babel/core';\nimport type { types as t } from '@babel/core';\nimport State, { owningPackage } from './state';\nimport dependencySatisfies from './dependency-satisfies';\nimport moduleExists from './module-exists';\nimport getConfig from './get-config';\n\ntype OpValue = string | boolean | number;\n\nconst binops: { [operator: string]: any } = {\n '||': function (a: OpValue, b: OpValue) {\n return a || b;\n },\n '&&': function (a: OpValue, b: OpValue) {\n return a && b;\n },\n '|': function (a: any, b: any) {\n return a | b;\n },\n '^': function (a: any, b: any) {\n return a ^ b;\n },\n '&': function (a: any, b: any) {\n return a & b;\n },\n '==': function (a: OpValue, b: OpValue) {\n // eslint-disable-next-line eqeqeq\n return a == b;\n },\n '!=': function (a: OpValue, b: OpValue) {\n // eslint-disable-next-line eqeqeq\n return a != b;\n },\n '===': function (a: OpValue, b: OpValue) {\n return a === b;\n },\n '!==': function (a: OpValue, b: OpValue) {\n return a !== b;\n },\n '<': function (a: OpValue, b: OpValue) {\n return a < b;\n },\n '>': function (a: OpValue, b: OpValue) {\n return a > b;\n },\n '<=': function (a: OpValue, b: OpValue) {\n return a <= b;\n },\n '>=': function (a: OpValue, b: OpValue) {\n return a >= b;\n },\n '<<': function (a: any, b: any) {\n return a << b;\n },\n '>>': function (a: any, b: any) {\n return a >> b;\n },\n '>>>': function (a: any, b: any) {\n return a >>> b;\n },\n '+': function (a: any, b: any) {\n return a + b;\n },\n '-': function (a: any, b: any) {\n return a - b;\n },\n '*': function (a: any, b: any) {\n return a * b;\n },\n '/': function (a: any, b: any) {\n return a / b;\n },\n '%': function (a: any, b: any) {\n return a % b;\n },\n '??': function (a: any, b: any) {\n if (a === null || a === undefined) {\n return b;\n }\n return a;\n },\n};\n\nconst unops: { [operator: string]: any } = {\n '-': function (a: OpValue) {\n return -a;\n },\n '+': function (a: OpValue) {\n return +a;\n },\n '~': function (a: OpValue) {\n return ~a;\n },\n '!': function (a: OpValue) {\n return !a;\n },\n void: function () {\n return undefined;\n },\n};\n\nexport interface ConfidentResult {\n confident: true;\n value: any;\n}\n\nexport interface UnknownResult {\n confident: false;\n}\n\nexport type EvaluateResult = ConfidentResult | UnknownResult;\n\n// this is needed to make our strict types work when inter-operating with\n// babel's own built-in evaluator\nfunction isConfidentResult(result: { confident: boolean; value: any }): result is ConfidentResult {\n return result.confident;\n}\n\nexport interface EvaluationEnv {\n knownPaths?: Map<NodePath, EvaluateResult>;\n locals?: { [localVar: string]: any };\n state?: State;\n}\n\nexport class Evaluator {\n private knownPaths: Map<NodePath, EvaluateResult>;\n private locals: { [localVar: string]: any };\n private state: State | undefined;\n\n constructor(env: EvaluationEnv = {}) {\n this.knownPaths = env.knownPaths || new Map();\n this.locals = env.locals || {};\n this.state = env.state;\n }\n\n evaluateMember(\n path: NodePath<t.MemberExpression | t.OptionalMemberExpression>,\n optionalChain: boolean\n ): EvaluateResult {\n let propertyPath = assertNotArray(path.get('property'));\n let property: EvaluateResult;\n if (path.node.computed) {\n property = this.evaluate(propertyPath);\n } else {\n property = this.evaluateKey(propertyPath);\n }\n if (property.confident) {\n let objectPath = path.get('object');\n let object = this.evaluate(objectPath);\n if (object.confident) {\n let confidentObject = object;\n let confidentProperty = property;\n return {\n confident: true,\n get value() {\n if (optionalChain) {\n return confidentObject.value != null\n ? confidentObject.value[confidentProperty.value]\n : confidentObject.value;\n } else {\n return confidentObject.value[confidentProperty.value];\n }\n },\n };\n }\n }\n return { confident: false };\n }\n\n evaluateKey(path: NodePath): EvaluateResult {\n let first = this.evaluate(path);\n if (first.confident) {\n return first;\n }\n if (path.isIdentifier()) {\n return { confident: true, value: path.node.name };\n }\n return { confident: false };\n }\n\n evaluate(path: NodePath): EvaluateResult {\n let known = this.knownPaths.get(path);\n if (known) {\n return known;\n }\n let result = this.realEvaluate(path);\n return result;\n }\n\n private realEvaluate(path: NodePath): EvaluateResult {\n let builtIn = path.evaluate();\n if (isConfidentResult(builtIn)) {\n return builtIn;\n }\n\n if (path.isMemberExpression()) {\n return this.evaluateMember(path, false);\n }\n\n // Here we are glossing over the lack of a real OptionalMemberExpression type\n // in our @babel/traverse typings.\n if (path.node.type === 'OptionalMemberExpression') {\n return this.evaluateMember(path as NodePath<t.OptionalMemberExpression>, true);\n }\n\n if (path.isStringLiteral()) {\n return { confident: true, value: path.node.value };\n }\n\n if (path.isNumericLiteral()) {\n return { confident: true, value: path.node.value };\n }\n\n if (path.isBooleanLiteral()) {\n return { confident: true, value: path.node.value };\n }\n\n if (path.isNullLiteral()) {\n return { confident: true, value: null };\n }\n\n if (path.isObjectExpression()) {\n let props = assertArray(path.get('properties')).map(p => {\n let key = assertNotArray(p.get('key'));\n let keyEvalValue = this.evaluateKey(key);\n let value = assertNotArray(p.get('value'));\n let valueEvalValue = this.evaluate(value);\n return [keyEvalValue, valueEvalValue];\n });\n for (let [k, v] of props) {\n if (!k.confident || !v.confident) {\n return { confident: false };\n }\n }\n let confidentProps = props as ConfidentResult[][];\n return {\n confident: true,\n get value() {\n let result: any = {};\n for (let [k, v] of confidentProps) {\n result[k.value] = v.value;\n }\n return result;\n },\n };\n }\n\n if (path.isArrayExpression()) {\n let elements = path.get('elements').map(element => {\n return this.evaluate(element as NodePath);\n });\n if (elements.every(element => element.confident)) {\n let confidentElements = elements as ConfidentResult[];\n return {\n confident: true,\n get value() {\n return confidentElements.map(element => element.value);\n },\n };\n }\n }\n\n if (path.isAssignmentExpression()) {\n let leftPath = path.get('left');\n if (leftPath.isIdentifier()) {\n let rightPath = path.get('right');\n let right = this.evaluate(rightPath);\n if (right.confident) {\n this.locals[leftPath.node.name] = right.value;\n return right;\n }\n }\n }\n\n if (path.isCallExpression()) {\n let result = this.maybeEvaluateRuntimeConfig(path);\n if (result.confident) {\n return result;\n }\n result = this.evaluateMacroCall(path);\n if (result.confident) {\n return result;\n }\n }\n\n if (path.isLogicalExpression() || path.isBinaryExpression()) {\n let operator = path.node.operator as string;\n if (binops[operator]) {\n let leftOperand = this.evaluate(path.get('left') as NodePath<t.Expression>);\n if (leftOperand.confident) {\n let rightOperand = this.evaluate(path.get('right') as NodePath<t.Expression>);\n if (leftOperand.confident && rightOperand.confident) {\n let value = binops[operator](leftOperand.value, rightOperand.value);\n return { confident: true, value };\n }\n }\n }\n return { confident: false };\n }\n\n if (path.isConditionalExpression()) {\n let test = this.evaluate(path.get('test'));\n if (test.confident) {\n let result = test.value ? this.evaluate(path.get('consequent')) : this.evaluate(path.get('alternate'));\n if (result.confident) {\n return result;\n }\n }\n }\n\n if (path.isUnaryExpression()) {\n let operator = path.node.operator as string;\n if (unops[operator]) {\n let operand = this.evaluate(path.get('argument') as NodePath<t.Expression>);\n if (operand.confident) {\n let value = unops[operator](operand.value);\n return { confident: true, value };\n }\n }\n return { confident: false };\n }\n\n if (path.isIdentifier()) {\n if (!this.locals.hasOwnProperty(path.node.name)) {\n return { confident: false };\n }\n return { confident: true, value: this.locals[path.node.name] };\n }\n\n return { confident: false };\n }\n\n // This handles the presence of our runtime-mode getConfig functions. We want\n // to designate them as { confident: true }, because it's important that we\n // give feedback even in runtime-mode if the developer is trying to pass\n // non-static arguments somewhere they're not supposed to. But we don't\n // actually want to calculate their value here because that has been deferred\n // to runtime. That's why we've made `value` lazy. It lets us check the\n // confidence without actually forcing the value.\n private maybeEvaluateRuntimeConfig(path: NodePath<t.CallExpression>): EvaluateResult {\n let callee = path.get('callee');\n if (callee.isIdentifier()) {\n let { name } = callee.node;\n // Does the identifier refer to our runtime config?\n if (this.state?.neededRuntimeImports.get(name) === 'config') {\n return {\n confident: true,\n get value() {\n throw new Error(`bug in @embroider/macros: didn't expect to need to evaluate this value`);\n },\n };\n }\n }\n return { confident: false };\n }\n\n evaluateMacroCall(path: NodePath<t.CallExpression>): EvaluateResult {\n if (!this.state) {\n return { confident: false };\n }\n let callee = path.get('callee');\n if (callee.referencesImport('@embroider/macros', 'dependencySatisfies')) {\n return { confident: true, value: dependencySatisfies(path, this.state) };\n }\n if (callee.referencesImport('@embroider/macros', 'moduleExists')) {\n return { confident: true, value: moduleExists(path, this.state) };\n }\n if (callee.referencesImport('@embroider/macros', 'getConfig')) {\n return { confident: true, value: getConfig(path, this.state, 'package') };\n }\n if (callee.referencesImport('@embroider/macros', 'getOwnConfig')) {\n return { confident: true, value: getConfig(path, this.state, 'own') };\n }\n if (callee.referencesImport('@embroider/macros', 'getGlobalConfig')) {\n return { confident: true, value: getConfig(path, this.state, 'getGlobalConfig') };\n }\n if (callee.referencesImport('@embroider/macros', 'isDevelopingApp')) {\n return {\n confident: true,\n value: Boolean(\n this.state.opts.appPackageRoot &&\n this.state.opts.isDevelopingPackageRoots.includes(this.state.opts.appPackageRoot)\n ),\n };\n }\n if (callee.referencesImport('@embroider/macros', 'isDevelopingThisPackage')) {\n return {\n confident: true,\n value: this.state.opts.isDevelopingPackageRoots.includes(owningPackage(path, this.state).root),\n };\n }\n if (callee.referencesImport('@embroider/macros', 'isTesting')) {\n let g = getConfig(path, this.state, 'getGlobalConfig') as any;\n let e = g && g['@embroider/macros'];\n let value = Boolean(e && e.isTesting);\n return { confident: true, value };\n }\n return { confident: false };\n }\n}\n\n// these next two functions are here because the type definitions we're using\n// don't seem to know exactly which NodePath properties are arrays and which\n// aren't.\nexport function assertNotArray<T>(input: T | T[]): T {\n if (Array.isArray(input)) {\n throw new Error(`bug: not supposed to be an array`);\n }\n return input;\n}\nexport function assertArray<T>(input: T | T[]): T[] {\n if (!Array.isArray(input)) {\n throw new Error(`bug: supposed to be an array`);\n }\n return input;\n}\n\nexport function buildLiterals(\n value: unknown | undefined,\n babelContext: typeof Babel\n): t.Identifier | t.ObjectExpression {\n if (typeof value === 'undefined') {\n return babelContext.types.identifier('undefined');\n }\n let statement = babelContext.parse(`a(${JSON.stringify(value)})`) as t.File;\n let expression = (statement.program.body[0] as t.ExpressionStatement).expression as t.CallExpression;\n return expression.arguments[0] as t.ObjectExpression;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"evaluate-json.js","sourceRoot":"","sources":["evaluate-json.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NodePath } from '@babel/traverse';\nimport type * as Babel from '@babel/core';\nimport type { types as t } from '@babel/core';\nimport State from './state';\nimport dependencySatisfies from './dependency-satisfies';\nimport moduleExists from './module-exists';\nimport getConfig from './get-config';\n\ntype OpValue = string | boolean | number;\n\nconst binops: { [operator: string]: any } = {\n '||': function (a: OpValue, b: OpValue) {\n return a || b;\n },\n '&&': function (a: OpValue, b: OpValue) {\n return a && b;\n },\n '|': function (a: any, b: any) {\n return a | b;\n },\n '^': function (a: any, b: any) {\n return a ^ b;\n },\n '&': function (a: any, b: any) {\n return a & b;\n },\n '==': function (a: OpValue, b: OpValue) {\n // eslint-disable-next-line eqeqeq\n return a == b;\n },\n '!=': function (a: OpValue, b: OpValue) {\n // eslint-disable-next-line eqeqeq\n return a != b;\n },\n '===': function (a: OpValue, b: OpValue) {\n return a === b;\n },\n '!==': function (a: OpValue, b: OpValue) {\n return a !== b;\n },\n '<': function (a: OpValue, b: OpValue) {\n return a < b;\n },\n '>': function (a: OpValue, b: OpValue) {\n return a > b;\n },\n '<=': function (a: OpValue, b: OpValue) {\n return a <= b;\n },\n '>=': function (a: OpValue, b: OpValue) {\n return a >= b;\n },\n '<<': function (a: any, b: any) {\n return a << b;\n },\n '>>': function (a: any, b: any) {\n return a >> b;\n },\n '>>>': function (a: any, b: any) {\n return a >>> b;\n },\n '+': function (a: any, b: any) {\n return a + b;\n },\n '-': function (a: any, b: any) {\n return a - b;\n },\n '*': function (a: any, b: any) {\n return a * b;\n },\n '/': function (a: any, b: any) {\n return a / b;\n },\n '%': function (a: any, b: any) {\n return a % b;\n },\n '??': function (a: any, b: any) {\n if (a === null || a === undefined) {\n return b;\n }\n return a;\n },\n};\n\nconst unops: { [operator: string]: any } = {\n '-': function (a: OpValue) {\n return -a;\n },\n '+': function (a: OpValue) {\n return +a;\n },\n '~': function (a: OpValue) {\n return ~a;\n },\n '!': function (a: OpValue) {\n return !a;\n },\n void: function () {\n return undefined;\n },\n};\n\nexport interface ConfidentResult {\n confident: true;\n value: any;\n}\n\nexport interface UnknownResult {\n confident: false;\n}\n\nexport type EvaluateResult = ConfidentResult | UnknownResult;\n\n// this is needed to make our strict types work when inter-operating with\n// babel's own built-in evaluator\nfunction isConfidentResult(result: { confident: boolean; value: any }): result is ConfidentResult {\n return result.confident;\n}\n\nexport interface EvaluationEnv {\n knownPaths?: Map<NodePath, EvaluateResult>;\n locals?: { [localVar: string]: any };\n state?: State;\n}\n\nexport class Evaluator {\n private knownPaths: Map<NodePath, EvaluateResult>;\n private locals: { [localVar: string]: any };\n private state: State | undefined;\n\n constructor(env: EvaluationEnv = {}) {\n this.knownPaths = env.knownPaths || new Map();\n this.locals = env.locals || {};\n this.state = env.state;\n }\n\n evaluateMember(\n path: NodePath<t.MemberExpression | t.OptionalMemberExpression>,\n optionalChain: boolean\n ): EvaluateResult {\n let propertyPath = assertNotArray(path.get('property'));\n let property: EvaluateResult;\n if (path.node.computed) {\n property = this.evaluate(propertyPath);\n } else {\n property = this.evaluateKey(propertyPath);\n }\n if (property.confident) {\n let objectPath = path.get('object');\n let object = this.evaluate(objectPath);\n if (object.confident) {\n let confidentObject = object;\n let confidentProperty = property;\n return {\n confident: true,\n get value() {\n if (optionalChain) {\n return confidentObject.value != null\n ? confidentObject.value[confidentProperty.value]\n : confidentObject.value;\n } else {\n return confidentObject.value[confidentProperty.value];\n }\n },\n };\n }\n }\n return { confident: false };\n }\n\n evaluateKey(path: NodePath): EvaluateResult {\n let first = this.evaluate(path);\n if (first.confident) {\n return first;\n }\n if (path.isIdentifier()) {\n return { confident: true, value: path.node.name };\n }\n return { confident: false };\n }\n\n evaluate(path: NodePath): EvaluateResult {\n let known = this.knownPaths.get(path);\n if (known) {\n return known;\n }\n let result = this.realEvaluate(path);\n return result;\n }\n\n private realEvaluate(path: NodePath): EvaluateResult {\n let builtIn = path.evaluate();\n if (isConfidentResult(builtIn)) {\n return builtIn;\n }\n\n if (path.isMemberExpression()) {\n return this.evaluateMember(path, false);\n }\n\n // Here we are glossing over the lack of a real OptionalMemberExpression type\n // in our @babel/traverse typings.\n if (path.node.type === 'OptionalMemberExpression') {\n return this.evaluateMember(path as NodePath<t.OptionalMemberExpression>, true);\n }\n\n if (path.isStringLiteral()) {\n return { confident: true, value: path.node.value };\n }\n\n if (path.isNumericLiteral()) {\n return { confident: true, value: path.node.value };\n }\n\n if (path.isBooleanLiteral()) {\n return { confident: true, value: path.node.value };\n }\n\n if (path.isNullLiteral()) {\n return { confident: true, value: null };\n }\n\n if (path.isObjectExpression()) {\n let props = assertArray(path.get('properties')).map(p => {\n let key = assertNotArray(p.get('key'));\n let keyEvalValue = this.evaluateKey(key);\n let value = assertNotArray(p.get('value'));\n let valueEvalValue = this.evaluate(value);\n return [keyEvalValue, valueEvalValue];\n });\n for (let [k, v] of props) {\n if (!k.confident || !v.confident) {\n return { confident: false };\n }\n }\n let confidentProps = props as ConfidentResult[][];\n return {\n confident: true,\n get value() {\n let result: any = {};\n for (let [k, v] of confidentProps) {\n result[k.value] = v.value;\n }\n return result;\n },\n };\n }\n\n if (path.isArrayExpression()) {\n let elements = path.get('elements').map(element => {\n return this.evaluate(element as NodePath);\n });\n if (elements.every(element => element.confident)) {\n let confidentElements = elements as ConfidentResult[];\n return {\n confident: true,\n get value() {\n return confidentElements.map(element => element.value);\n },\n };\n }\n }\n\n if (path.isAssignmentExpression()) {\n let leftPath = path.get('left');\n if (leftPath.isIdentifier()) {\n let rightPath = path.get('right');\n let right = this.evaluate(rightPath);\n if (right.confident) {\n this.locals[leftPath.node.name] = right.value;\n return right;\n }\n }\n }\n\n if (path.isCallExpression()) {\n let result = this.maybeEvaluateRuntimeConfig(path);\n if (result.confident) {\n return result;\n }\n result = this.evaluateMacroCall(path);\n if (result.confident) {\n return result;\n }\n }\n\n if (path.isLogicalExpression() || path.isBinaryExpression()) {\n let operator = path.node.operator as string;\n if (binops[operator]) {\n let leftOperand = this.evaluate(path.get('left') as NodePath<t.Expression>);\n if (leftOperand.confident) {\n let rightOperand = this.evaluate(path.get('right') as NodePath<t.Expression>);\n if (leftOperand.confident && rightOperand.confident) {\n let value = binops[operator](leftOperand.value, rightOperand.value);\n return { confident: true, value };\n }\n }\n }\n return { confident: false };\n }\n\n if (path.isConditionalExpression()) {\n let test = this.evaluate(path.get('test'));\n if (test.confident) {\n let result = test.value ? this.evaluate(path.get('consequent')) : this.evaluate(path.get('alternate'));\n if (result.confident) {\n return result;\n }\n }\n }\n\n if (path.isUnaryExpression()) {\n let operator = path.node.operator as string;\n if (unops[operator]) {\n let operand = this.evaluate(path.get('argument') as NodePath<t.Expression>);\n if (operand.confident) {\n let value = unops[operator](operand.value);\n return { confident: true, value };\n }\n }\n return { confident: false };\n }\n\n if (path.isIdentifier()) {\n if (!this.locals.hasOwnProperty(path.node.name)) {\n return { confident: false };\n }\n return { confident: true, value: this.locals[path.node.name] };\n }\n\n return { confident: false };\n }\n\n // This handles the presence of our runtime-mode getConfig functions. We want\n // to designate them as { confident: true }, because it's important that we\n // give feedback even in runtime-mode if the developer is trying to pass\n // non-static arguments somewhere they're not supposed to. But we don't\n // actually want to calculate their value here because that has been deferred\n // to runtime. That's why we've made `value` lazy. It lets us check the\n // confidence without actually forcing the value.\n private maybeEvaluateRuntimeConfig(path: NodePath<t.CallExpression>): EvaluateResult {\n if (!this.state) {\n return { confident: false };\n }\n let callee = path.get('callee');\n if (callee.isIdentifier()) {\n // Does the identifier refer to our runtime config?\n if (callee.referencesImport(this.state.pathToOurAddon('runtime'), 'config')) {\n return {\n confident: true,\n get value() {\n throw new Error(`bug in @embroider/macros: didn't expect to need to evaluate this value`);\n },\n };\n }\n }\n return { confident: false };\n }\n\n evaluateMacroCall(path: NodePath<t.CallExpression>): EvaluateResult {\n if (!this.state) {\n return { confident: false };\n }\n let callee = path.get('callee');\n if (callee.referencesImport('@embroider/macros', 'dependencySatisfies')) {\n return { confident: true, value: dependencySatisfies(path, this.state) };\n }\n if (callee.referencesImport('@embroider/macros', 'moduleExists')) {\n return { confident: true, value: moduleExists(path, this.state) };\n }\n if (callee.referencesImport('@embroider/macros', 'getConfig')) {\n return { confident: true, value: getConfig(path, this.state, 'package') };\n }\n if (callee.referencesImport('@embroider/macros', 'getOwnConfig')) {\n return { confident: true, value: getConfig(path, this.state, 'own') };\n }\n if (callee.referencesImport('@embroider/macros', 'getGlobalConfig')) {\n return { confident: true, value: getConfig(path, this.state, 'getGlobalConfig') };\n }\n if (callee.referencesImport('@embroider/macros', 'isDevelopingApp')) {\n return {\n confident: true,\n value: Boolean(\n this.state.opts.appPackageRoot &&\n this.state.opts.isDevelopingPackageRoots.includes(this.state.opts.appPackageRoot)\n ),\n };\n }\n if (callee.referencesImport('@embroider/macros', 'isDevelopingThisPackage')) {\n return {\n confident: true,\n value: this.state.opts.isDevelopingPackageRoots.includes(this.state.owningPackage().root),\n };\n }\n if (callee.referencesImport('@embroider/macros', 'isTesting')) {\n let g = getConfig(path, this.state, 'getGlobalConfig') as any;\n let e = g && g['@embroider/macros'];\n let value = Boolean(e && e.isTesting);\n return { confident: true, value };\n }\n return { confident: false };\n }\n}\n\n// these next two functions are here because the type definitions we're using\n// don't seem to know exactly which NodePath properties are arrays and which\n// aren't.\nexport function assertNotArray<T>(input: T | T[]): T {\n if (Array.isArray(input)) {\n throw new Error(`bug: not supposed to be an array`);\n }\n return input;\n}\nexport function assertArray<T>(input: T | T[]): T[] {\n if (!Array.isArray(input)) {\n throw new Error(`bug: supposed to be an array`);\n }\n return input;\n}\n\nexport function buildLiterals(\n value: unknown | undefined,\n babelContext: typeof Babel\n): t.Identifier | t.ObjectExpression {\n if (typeof value === 'undefined') {\n return babelContext.types.identifier('undefined');\n }\n let statement = babelContext.parse(`a(${JSON.stringify(value)})`) as t.File;\n let expression = (statement.program.body[0] as t.ExpressionStatement).expression as t.CallExpression;\n return expression.arguments[0] as t.ObjectExpression;\n}\n"]}
|
package/src/babel/get-config.js
CHANGED
|
@@ -4,12 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.inlineRuntimeConfig = exports.insertConfig = void 0;
|
|
7
|
-
const state_1 = require("./state");
|
|
8
|
-
const shared_internals_1 = require("@embroider/shared-internals");
|
|
9
7
|
const error_1 = __importDefault(require("./error"));
|
|
10
8
|
const evaluate_json_1 = require("./evaluate-json");
|
|
11
9
|
const assert_never_1 = __importDefault(require("assert-never"));
|
|
12
|
-
const packageCache = shared_internals_1.PackageCache.shared('embroider-stage3');
|
|
13
10
|
function getPackage(path, state, mode) {
|
|
14
11
|
let packageName;
|
|
15
12
|
if (mode === 'own') {
|
|
@@ -31,7 +28,7 @@ function getPackage(path, state, mode) {
|
|
|
31
28
|
else {
|
|
32
29
|
(0, assert_never_1.default)(mode);
|
|
33
30
|
}
|
|
34
|
-
return targetPackage(
|
|
31
|
+
return targetPackage(state.sourceFile, packageName, state.packageCache);
|
|
35
32
|
}
|
|
36
33
|
// this evaluates to the actual value of the config. It can be used directly by the Evaluator.
|
|
37
34
|
function getConfig(path, state, mode) {
|
|
@@ -58,7 +55,8 @@ function insertConfig(path, state, mode, context) {
|
|
|
58
55
|
}
|
|
59
56
|
else {
|
|
60
57
|
if (mode === 'getGlobalConfig') {
|
|
61
|
-
|
|
58
|
+
let callee = path.get('callee');
|
|
59
|
+
callee.replaceWith(state.importUtil.import(callee, state.pathToOurAddon('runtime'), 'getGlobalConfig'));
|
|
62
60
|
}
|
|
63
61
|
else {
|
|
64
62
|
let pkg = getPackage(path, state, mode);
|
|
@@ -69,9 +67,9 @@ function insertConfig(path, state, mode, context) {
|
|
|
69
67
|
else {
|
|
70
68
|
pkgRoot = context.types.identifier('undefined');
|
|
71
69
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
path.replaceWith(context.types.callExpression(state.importUtil.import(path, state.pathToOurAddon('runtime'), 'config'), [
|
|
71
|
+
pkgRoot,
|
|
72
|
+
]));
|
|
75
73
|
}
|
|
76
74
|
}
|
|
77
75
|
}
|
|
@@ -108,11 +106,4 @@ function inlineRuntimeConfig(path, state, context) {
|
|
|
108
106
|
];
|
|
109
107
|
}
|
|
110
108
|
exports.inlineRuntimeConfig = inlineRuntimeConfig;
|
|
111
|
-
function calleeName(path, context) {
|
|
112
|
-
let callee = path.node.callee;
|
|
113
|
-
if (context.types.isIdentifier(callee)) {
|
|
114
|
-
return callee.name;
|
|
115
|
-
}
|
|
116
|
-
throw new Error(`bug: our macros should only be invoked as identifiers`);
|
|
117
|
-
}
|
|
118
109
|
//# sourceMappingURL=get-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-config.js","sourceRoot":"","sources":["get-config.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"get-config.js","sourceRoot":"","sources":["get-config.ts"],"names":[],"mappings":";;;;;;AAGA,oDAA4B;AAC5B,mDAAyF;AACzF,gEAAuC;AAMvC,SAAS,UAAU,CAAC,IAAgC,EAAE,KAAY,EAAE,IAAuB;IACzF,IAAI,WAA+B,CAAC;IACpC,IAAI,IAAI,KAAK,KAAK,EAAE;QAClB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YACpC,MAAM,IAAA,eAAK,EAAC,IAAI,EAAE,iDAAiD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;SAClG;QACD,WAAW,GAAG,SAAS,CAAC;KACzB;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE;QAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YACpC,MAAM,IAAA,eAAK,EAAC,IAAI,EAAE,oDAAoD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;SACrG;QACD,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE;YACxC,MAAM,IAAA,eAAK,EAAC,IAAA,2BAAW,EAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,oDAAoD,CAAC,CAAC;SAC1G;QACD,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;KACjC;SAAM;QACL,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;KACnB;IACD,OAAO,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;AAC1E,CAAC;AAED,8FAA8F;AAC9F,SAAwB,SAAS,CAAC,IAAgC,EAAE,KAAY,EAAE,IAAU;IAC1F,IAAI,MAA2B,CAAC;IAChC,IAAI,IAAI,KAAK,iBAAiB,EAAE;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;KAChC;IACD,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,GAAG,EAAE;QACP,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC3C;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAVD,4BAUC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,sCAAsC;AACtC,SAAgB,YAAY,CAAC,IAAgC,EAAE,KAAY,EAAE,IAAU,EAAE,OAAqB;IAC5G,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE;QACtC,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,aAAa,GAAG,IAAA,6BAAa,EAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7D,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;KAC3C;SAAM;QACL,IAAI,IAAI,KAAK,iBAAiB,EAAE;YAC9B,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC;SACzG;aAAM;YACL,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,OAAO,CAAC;YACZ,IAAI,GAAG,EAAE;gBACP,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aACjD;iBAAM;gBACL,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;aACjD;YACD,IAAI,CAAC,WAAW,CACd,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE;gBACrG,OAAO;aACR,CAAC,CACH,CAAC;SACH;KACF;AACH,CAAC;AAzBD,oCAyBC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,WAA+B,EAAE,YAA0B;IAClG,IAAI,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,EAAE;QACP,MAAM,IAAI,KAAK,CAAC,uDAAuD,QAAQ,EAAE,CAAC,CAAC;KACpF;IACD,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,EAAE,CAAC;KACX;IACD,IAAI;QACF,OAAO,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;KAC9C;IAAC,OAAO,GAAG,EAAE;QACZ,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc,EAAE,MAAW;IAC3C,IAAI,SAAS,GAAG,IAAI,yBAAS,CAAC,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAErG,OAAO,IAAI,EAAE;QACX,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,UAAU,CAAC,sBAAsB,EAAE,EAAE;YAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAqB,CAAC,KAAK,EAAE,CAAC;SAC9E;QACD,IAAI,GAAG,UAAU,CAAC;KACnB;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,IAAqC,EAAE,KAAY,EAAE,OAAqB;IAC5G,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG;QAC3B,OAAO,CAAC,KAAK,CAAC,eAAe,CAC3B,IAAA,6BAAa,EAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAC9F;KACF,CAAC;AACJ,CAAC;AAND,kDAMC","sourcesContent":["import type { NodePath } from '@babel/traverse';\nimport State from './state';\nimport { PackageCache, Package } from '@embroider/shared-internals';\nimport error from './error';\nimport { Evaluator, assertArray, buildLiterals, ConfidentResult } from './evaluate-json';\nimport assertNever from 'assert-never';\nimport type * as Babel from '@babel/core';\nimport type { types as t } from '@babel/core';\n\nexport type Mode = 'own' | 'getGlobalConfig' | 'package';\n\nfunction getPackage(path: NodePath<t.CallExpression>, state: State, mode: 'own' | 'package'): { root: string } | null {\n let packageName: string | undefined;\n if (mode === 'own') {\n if (path.node.arguments.length !== 0) {\n throw error(path, `getOwnConfig takes zero arguments, you passed ${path.node.arguments.length}`);\n }\n packageName = undefined;\n } else if (mode === 'package') {\n if (path.node.arguments.length !== 1) {\n throw error(path, `getConfig takes exactly one argument, you passed ${path.node.arguments.length}`);\n }\n let packageNode = path.node.arguments[0];\n if (packageNode.type !== 'StringLiteral') {\n throw error(assertArray(path.get('arguments'))[0], `the argument to getConfig must be a string literal`);\n }\n packageName = packageNode.value;\n } else {\n assertNever(mode);\n }\n return targetPackage(state.sourceFile, packageName, state.packageCache);\n}\n\n// this evaluates to the actual value of the config. It can be used directly by the Evaluator.\nexport default function getConfig(path: NodePath<t.CallExpression>, state: State, mode: Mode) {\n let config: unknown | undefined;\n if (mode === 'getGlobalConfig') {\n return state.opts.globalConfig;\n }\n let pkg = getPackage(path, state, mode);\n if (pkg) {\n config = state.opts.userConfigs[pkg.root];\n }\n return config;\n}\n\n// this is the imperative version that's invoked directly by the babel visitor\n// when we encounter getConfig. It's implemented in terms of getConfig so we can\n// be sure we have the same semantics.\nexport function insertConfig(path: NodePath<t.CallExpression>, state: State, mode: Mode, context: typeof Babel) {\n if (state.opts.mode === 'compile-time') {\n let config = getConfig(path, state, mode);\n let collapsed = collapse(path, config);\n let literalResult = buildLiterals(collapsed.config, context);\n collapsed.path.replaceWith(literalResult);\n } else {\n if (mode === 'getGlobalConfig') {\n let callee = path.get('callee');\n callee.replaceWith(state.importUtil.import(callee, state.pathToOurAddon('runtime'), 'getGlobalConfig'));\n } else {\n let pkg = getPackage(path, state, mode);\n let pkgRoot;\n if (pkg) {\n pkgRoot = context.types.stringLiteral(pkg.root);\n } else {\n pkgRoot = context.types.identifier('undefined');\n }\n path.replaceWith(\n context.types.callExpression(state.importUtil.import(path, state.pathToOurAddon('runtime'), 'config'), [\n pkgRoot,\n ])\n );\n }\n }\n}\n\nfunction targetPackage(fromPath: string, packageName: string | undefined, packageCache: PackageCache): Package | null {\n let us = packageCache.ownerOfFile(fromPath);\n if (!us) {\n throw new Error(`unable to determine which npm package owns the file ${fromPath}`);\n }\n if (!packageName) {\n return us;\n }\n try {\n return packageCache.resolve(packageName, us);\n } catch (err) {\n return null;\n }\n}\n\nfunction collapse(path: NodePath, config: any) {\n let evaluator = new Evaluator({ knownPaths: new Map([[path, { confident: true, value: config }]]) });\n\n while (true) {\n let parentPath = path.parentPath;\n let result = evaluator.evaluate(parentPath);\n if (!result.confident || parentPath.isAssignmentExpression()) {\n return { path, config: (evaluator.evaluate(path) as ConfidentResult).value };\n }\n path = parentPath;\n }\n}\n\nexport function inlineRuntimeConfig(path: NodePath<t.FunctionDeclaration>, state: State, context: typeof Babel) {\n path.get('body').node.body = [\n context.types.returnStatement(\n buildLiterals({ packages: state.opts.userConfigs, global: state.opts.globalConfig }, context)\n ),\n ];\n}\n"]}
|
|
@@ -31,7 +31,7 @@ function macroCondition(conditionalPath, state) {
|
|
|
31
31
|
let alternate = conditionalPath.get('alternate');
|
|
32
32
|
if (state.opts.mode === 'run-time') {
|
|
33
33
|
let callee = conditionalPath.get('test').get('callee');
|
|
34
|
-
state.
|
|
34
|
+
callee.replaceWith(state.importUtil.import(callee, state.pathToOurAddon('runtime'), 'macroCondition'));
|
|
35
35
|
}
|
|
36
36
|
else {
|
|
37
37
|
let [kept, removed] = predicate.value ? [consequent.node, alternate.node] : [alternate.node, consequent.node];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macro-condition.js","sourceRoot":"","sources":["macro-condition.ts"],"names":[],"mappings":";;;;;;AACA,mDAA4C;AAE5C,oDAA4B;AAO5B,SAAgB,oBAAoB,CAClC,IAAuD;IAEvD,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;QAC3B,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EAAE;YAClE,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAXD,oDAWC;AAED,SAAwB,cAAc,CAAC,eAAmC,EAAE,KAAY;IACtF,IAAI,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,MAAM,IAAA,eAAK,EAAC,eAAe,EAAE,2DAA2D,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KACxG;IAED,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAC3B,IAAI,SAAS,GAAG,IAAI,yBAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;QACxB,MAAM,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC,CAAC,EAAE,+DAA+D,CAAC,CAAC;KACvF;IAED,IAAI,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;QAClC,IAAI,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"macro-condition.js","sourceRoot":"","sources":["macro-condition.ts"],"names":[],"mappings":";;;;;;AACA,mDAA4C;AAE5C,oDAA4B;AAO5B,SAAgB,oBAAoB,CAClC,IAAuD;IAEvD,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;QAC3B,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EAAE;YAClE,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAXD,oDAWC;AAED,SAAwB,cAAc,CAAC,eAAmC,EAAE,KAAY;IACtF,IAAI,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,MAAM,IAAA,eAAK,EAAC,eAAe,EAAE,2DAA2D,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KACxG;IAED,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAC3B,IAAI,SAAS,GAAG,IAAI,yBAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;QACxB,MAAM,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC,CAAC,EAAE,+DAA+D,CAAC,CAAC;KACvF;IAED,IAAI,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;QAClC,IAAI,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;KACxG;SAAM;QACL,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9G,IAAI,IAAI,EAAE;YACR,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACnC;aAAM;YACL,eAAe,CAAC,MAAM,EAAE,CAAC;SAC1B;QACD,IAAI,OAAO,EAAE;YACX,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC5B;KACF;AACH,CAAC;AA7BD,iCA6BC","sourcesContent":["import type { NodePath } from '@babel/traverse';\nimport { Evaluator } from './evaluate-json';\nimport type { types as t } from '@babel/core';\nimport error from './error';\nimport State from './state';\n\nexport type MacroConditionPath = NodePath<t.IfStatement | t.ConditionalExpression> & {\n get(test: 'test'): NodePath<t.CallExpression> & { get(callee: 'callee'): NodePath<t.Identifier> };\n};\n\nexport function isMacroConditionPath(\n path: NodePath<t.IfStatement | t.ConditionalExpression>\n): path is MacroConditionPath {\n let test = path.get('test');\n if (test.isCallExpression()) {\n let callee = test.get('callee');\n if (callee.referencesImport('@embroider/macros', 'macroCondition')) {\n return true;\n }\n }\n return false;\n}\n\nexport default function macroCondition(conditionalPath: MacroConditionPath, state: State) {\n let args = conditionalPath.get('test').get('arguments');\n if (args.length !== 1) {\n throw error(conditionalPath, `macroCondition accepts exactly one argument, you passed ${args.length}`);\n }\n\n let [predicatePath] = args;\n let predicate = new Evaluator({ state }).evaluate(predicatePath);\n if (!predicate.confident) {\n throw error(args[0], `the first argument to macroCondition must be statically known`);\n }\n\n let consequent = conditionalPath.get('consequent');\n let alternate = conditionalPath.get('alternate');\n\n if (state.opts.mode === 'run-time') {\n let callee = conditionalPath.get('test').get('callee');\n callee.replaceWith(state.importUtil.import(callee, state.pathToOurAddon('runtime'), 'macroCondition'));\n } else {\n let [kept, removed] = predicate.value ? [consequent.node, alternate.node] : [alternate.node, consequent.node];\n if (kept) {\n conditionalPath.replaceWith(kept);\n } else {\n conditionalPath.remove();\n }\n if (removed) {\n state.removed.add(removed);\n }\n }\n}\n"]}
|
|
@@ -30,23 +30,17 @@ const each_1 = require("./each");
|
|
|
30
30
|
const error_1 = __importDefault(require("./error"));
|
|
31
31
|
const fail_build_1 = __importDefault(require("./fail-build"));
|
|
32
32
|
const evaluate_json_1 = require("./evaluate-json");
|
|
33
|
-
const packageCache = shared_internals_1.PackageCache.shared('embroider-stage3');
|
|
34
33
|
function main(context) {
|
|
35
34
|
let t = context.types;
|
|
36
35
|
let visitor = {
|
|
37
36
|
Program: {
|
|
38
|
-
enter(
|
|
39
|
-
|
|
40
|
-
state.
|
|
41
|
-
state.removed = new Set();
|
|
42
|
-
state.calledIdentifiers = new Set();
|
|
43
|
-
state.neededRuntimeImports = new Map();
|
|
44
|
-
state.neededEagerImports = new Map();
|
|
37
|
+
enter(path, state) {
|
|
38
|
+
(0, state_1.initState)(t, path, state);
|
|
39
|
+
state.packageCache = shared_internals_1.PackageCache.shared('embroider-stage3', state.opts.appPackageRoot);
|
|
45
40
|
},
|
|
46
|
-
exit(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
addEagerImports(path, state, t);
|
|
41
|
+
exit(_, state) {
|
|
42
|
+
// @embroider/macros itself has no runtime behaviors and should always be removed
|
|
43
|
+
state.importUtil.removeAllImports('@embroider/macros');
|
|
50
44
|
for (let handler of state.jobs) {
|
|
51
45
|
handler();
|
|
52
46
|
}
|
|
@@ -72,7 +66,7 @@ function main(context) {
|
|
|
72
66
|
enter(path, state) {
|
|
73
67
|
let id = path.get('id');
|
|
74
68
|
if (id.isIdentifier() && id.node.name === 'initializeRuntimeMacrosConfig') {
|
|
75
|
-
let pkg =
|
|
69
|
+
let pkg = state.owningPackage();
|
|
76
70
|
if (pkg && pkg.name === '@embroider/macros') {
|
|
77
71
|
(0, get_config_1.inlineRuntimeConfig)(path, state, context);
|
|
78
72
|
}
|
|
@@ -121,7 +115,7 @@ function main(context) {
|
|
|
121
115
|
// instead falls through to evaluateMacroCall.
|
|
122
116
|
if (callee.referencesImport('@embroider/macros', 'isTesting') && state.opts.mode === 'run-time') {
|
|
123
117
|
state.calledIdentifiers.add(callee.node);
|
|
124
|
-
state.
|
|
118
|
+
callee.replaceWith(state.importUtil.import(callee, state.pathToOurAddon('runtime'), 'isTesting'));
|
|
125
119
|
return;
|
|
126
120
|
}
|
|
127
121
|
let result = new evaluate_json_1.Evaluator({ state }).evaluateMacroCall(path);
|
|
@@ -146,18 +140,18 @@ function main(context) {
|
|
|
146
140
|
if ((specifier === null || specifier === void 0 ? void 0 : specifier.type) !== 'StringLiteral') {
|
|
147
141
|
throw new Error(`importSync eager mode doesn't implement non string literal arguments yet`);
|
|
148
142
|
}
|
|
149
|
-
|
|
150
|
-
if (!replacePaths) {
|
|
151
|
-
replacePaths = [];
|
|
152
|
-
state.neededEagerImports.set(specifier.value, replacePaths);
|
|
153
|
-
}
|
|
154
|
-
replacePaths.push(path);
|
|
143
|
+
path.replaceWith(state.importUtil.import(path, specifier.value, '*'));
|
|
155
144
|
state.calledIdentifiers.add(callee.node);
|
|
156
145
|
}
|
|
157
146
|
else {
|
|
147
|
+
if (path.scope.hasBinding('require')) {
|
|
148
|
+
path.scope.rename('require');
|
|
149
|
+
}
|
|
158
150
|
let r = t.identifier('require');
|
|
159
151
|
state.generatedRequires.add(r);
|
|
160
|
-
|
|
152
|
+
path.replaceWith(t.callExpression(state.importUtil.import(path, state.pathToOurAddon('es-compat'), 'default', 'esc'), [
|
|
153
|
+
t.callExpression(r, path.node.arguments),
|
|
154
|
+
]));
|
|
161
155
|
}
|
|
162
156
|
return;
|
|
163
157
|
}
|
|
@@ -202,7 +196,7 @@ function main(context) {
|
|
|
202
196
|
path.node.name === 'require' &&
|
|
203
197
|
!state.generatedRequires.has(path.node) &&
|
|
204
198
|
!path.scope.hasBinding('require') &&
|
|
205
|
-
|
|
199
|
+
state.owningPackage().isEmberPackage()) {
|
|
206
200
|
// Our importSync macro has been compiled to `require`. But we want to
|
|
207
201
|
// distinguish that from any pre-existing, user-written `require` in an
|
|
208
202
|
// Ember addon, which should retain its *runtime* meaning.
|
|
@@ -228,46 +222,4 @@ function main(context) {
|
|
|
228
222
|
return { visitor };
|
|
229
223
|
}
|
|
230
224
|
exports.default = main;
|
|
231
|
-
// This removes imports from "@embroider/macros" itself, because we have no
|
|
232
|
-
// runtime behavior at all.
|
|
233
|
-
function pruneMacroImports(path) {
|
|
234
|
-
if (!path.isProgram()) {
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
for (let topLevelPath of path.get('body')) {
|
|
238
|
-
if (topLevelPath.isImportDeclaration() && topLevelPath.get('source').node.value === '@embroider/macros') {
|
|
239
|
-
topLevelPath.remove();
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
function addRuntimeImports(path, state, context) {
|
|
244
|
-
let t = context.types;
|
|
245
|
-
if (state.neededRuntimeImports.size > 0) {
|
|
246
|
-
path.node.body.push(t.importDeclaration([...state.neededRuntimeImports].map(([local, imported]) => t.importSpecifier(t.identifier(local), t.identifier(imported))), t.stringLiteral((0, state_1.pathToRuntime)(path, state))));
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
function addEagerImports(path, state, t) {
|
|
250
|
-
let createdNames = new Set();
|
|
251
|
-
for (let [specifier, replacePaths] of state.neededEagerImports.entries()) {
|
|
252
|
-
let local = unusedNameLike('a', replacePaths, createdNames);
|
|
253
|
-
createdNames.add(local);
|
|
254
|
-
path.node.body.push(t.importDeclaration([t.importNamespaceSpecifier(t.identifier(local))], t.stringLiteral(specifier)));
|
|
255
|
-
for (let nodePath of replacePaths) {
|
|
256
|
-
nodePath.replaceWith(t.identifier(local));
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
function ownedByEmberPackage(path, state) {
|
|
261
|
-
let filename = (0, state_1.sourceFile)(path, state);
|
|
262
|
-
let pkg = packageCache.ownerOfFile(filename);
|
|
263
|
-
return pkg && pkg.isEmberPackage();
|
|
264
|
-
}
|
|
265
|
-
function unusedNameLike(name, paths, banned) {
|
|
266
|
-
let candidate = name;
|
|
267
|
-
let counter = 0;
|
|
268
|
-
while (banned.has(candidate) || paths.some(path => path.scope.getBinding(candidate))) {
|
|
269
|
-
candidate = `${name}${counter++}`;
|
|
270
|
-
}
|
|
271
|
-
return candidate;
|
|
272
|
-
}
|
|
273
225
|
//# sourceMappingURL=macros-babel-plugin.js.map
|