Skip to content

Commit

Permalink
Merge pull request #1008 from thoov/helper-@-issue
Browse files Browse the repository at this point in the history
  • Loading branch information
rwjblue authored Oct 25, 2021
2 parents 51abbb4 + a7c7b6d commit ac17423
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 4 deletions.
19 changes: 17 additions & 2 deletions packages/compat/src/resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -437,14 +437,29 @@ export default class CompatResolver implements Resolver {
}

private tryHelper(path: string, from: string): Resolution | null {
let parts = path.split('@');
if (parts.length > 1 && parts[0].length > 0) {
let cache = PackageCache.shared('embroider-stage3');
let packageName = parts[0];
let renamed = this.adjustImportsOptions.renamePackages[packageName];
if (renamed) {
packageName = renamed;
}
return this._tryHelper(parts[1], from, cache.resolve(packageName, cache.ownerOfFile(from)!));
} else {
return this._tryHelper(path, from, this.appPackage);
}
}

private _tryHelper(path: string, from: string, targetPackage: Package | AppPackagePlaceholder): Resolution | null {
for (let extension of this.adjustImportsOptions.resolvableExtensions) {
let absPath = join(this.params.root, 'helpers', path) + extension;
let absPath = join(targetPackage.root, 'helpers', path) + extension;
if (pathExistsSync(absPath)) {
return {
type: 'helper',
modules: [
{
runtimeName: `${this.params.modulePrefix}/helpers/${path}`,
runtimeName: this.absPathToRuntimeName(absPath, targetPackage),
path: explicitRelative(dirname(from), absPath),
absPath,
},
Expand Down
108 changes: 106 additions & 2 deletions packages/compat/tests/resolver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,84 @@ import { emberTemplateCompilerPath } from '@embroider/test-support';
import { Options as AdjustImportsOptions } from '@embroider/core/src/babel-plugin-adjust-imports';
import Resolver from '../src/resolver';
import { PackageRules } from '../src';
import type { TemplateCompilerPlugins } from '@embroider/core';
import type { AST, ASTPluginEnvironment } from '@glimmer/syntax';

const compilerPath = emberTemplateCompilerPath();
const compilerChecksum = `mock-compiler-checksum${Math.random()}`;

function emberHolyFuturisticNamespacingBatmanTransform(env: ASTPluginEnvironment) {
let sigil = '$';
let b = env.syntax.builders;

function rewriteOrWrapComponentParam(node: AST.MustacheStatement | AST.SubExpression | AST.BlockStatement) {
if (!node.params.length) {
return;
}

let firstParam = node.params[0];
if (firstParam.type !== 'StringLiteral') {
// note: does not support dynamic / runtime strings
return;
}

node.params[0] = b.string(firstParam.original.replace(sigil, '@'));
}

return {
name: 'ember-holy-futuristic-template-namespacing-batman:namespacing-transform',

visitor: {
PathExpression(node: AST.PathExpression) {
if (node.parts.length > 1 || !node.original.includes(sigil)) {
return;
}

return b.path(node.original.replace(sigil, '@'), node.loc);
},
ElementNode(node: AST.ElementNode) {
if (node.tag.indexOf(sigil) > -1) {
node.tag = node.tag.replace(sigil, '@');
}
},
MustacheStatement(node: AST.MustacheStatement) {
if (node.path.type === 'PathExpression' && node.path.original === 'component') {
// we don't care about non-component expressions
return;
}
rewriteOrWrapComponentParam(node);
},
SubExpression(node: AST.SubExpression) {
if (node.path.type === 'PathExpression' && node.path.original !== 'component') {
// we don't care about non-component expressions
return;
}
rewriteOrWrapComponentParam(node);
},
BlockStatement(node: AST.BlockStatement) {
if (node.path.type === 'PathExpression' && node.path.original !== 'component') {
// we don't care about blocks not using component
return;
}
rewriteOrWrapComponentParam(node);
},
},
};
}

describe('compat-resolver', function () {
let appDir: string;

function configure(
compatOptions: Options,
otherOptions: { podModulePrefix?: string; adjustImportsImports?: Partial<AdjustImportsOptions> } = {}
otherOptions: {
podModulePrefix?: string;
adjustImportsImports?: Partial<AdjustImportsOptions>;
plugins?: TemplateCompilerPlugins;
} = {}
) {
let EmberENV = {};
let plugins = { ast: [] };
let plugins: TemplateCompilerPlugins = otherOptions.plugins ?? { ast: [] };
appDir = realpathSync(mkdtempSync(join(tmpdir, 'embroider-compat-tests-')));
writeJSONSync(join(appDir, 'package.json'), { name: 'the-app' });
let resolver = new Resolver({
Expand Down Expand Up @@ -474,6 +539,45 @@ describe('compat-resolver', function () {
},
]);
});
test('helper with @ syntax', function () {
let findDependencies = configure(
{
staticHelpers: true,
},
{ plugins: { ast: [emberHolyFuturisticNamespacingBatmanTransform] } }
);
givenFile('node_modules/my-addon/package.json', `{ "name": "my-addon" }`);
givenFile('node_modules/my-addon/helpers/thing.js');
expect(findDependencies('templates/application.hbs', `{{my-addon$thing}}`)).toEqual([
{
path: '../node_modules/my-addon/helpers/thing.js',
runtimeName: 'my-addon/helpers/thing',
},
]);
});
test('helper with @ syntax and direct addon package reference to a renamed package', function () {
let findDependencies = configure(
{
staticHelpers: true,
},
{
adjustImportsImports: {
renamePackages: {
'has-been-renamed': 'my-addon',
},
},
plugins: { ast: [emberHolyFuturisticNamespacingBatmanTransform] },
}
);
givenFile('node_modules/my-addon/package.json', `{ "name": "my-addon"}`);
givenFile('node_modules/my-addon/helpers/thing.js');
expect(findDependencies('templates/application.hbs', `{{has-been-renamed$thing}}`)).toEqual([
{
path: '../node_modules/my-addon/helpers/thing.js',
runtimeName: 'has-been-renamed/helpers/thing',
},
]);
});
test('string literal passed to component helper with block', function () {
let findDependencies = configure({
staticComponents: true,
Expand Down

0 comments on commit ac17423

Please sign in to comment.