From 17c2d3192d82b100860185303cbe63bdb113d9e6 Mon Sep 17 00:00:00 2001 From: Edward Faulkner Date: Wed, 25 Nov 2020 14:38:08 -0500 Subject: [PATCH] apply rules to colocated templates Before, component rules about the component itself were not getting applied to co-located templates unless you explicitly set a layout on the rule. --- packages/compat/src/resolver.ts | 57 ++++++++++++++++++-------- packages/compat/tests/resolver.test.ts | 16 ++++++++ 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/packages/compat/src/resolver.ts b/packages/compat/src/resolver.ts index 6b1cba4fd..42cee1f06 100644 --- a/packages/compat/src/resolver.ts +++ b/packages/compat/src/resolver.ts @@ -1,28 +1,28 @@ import { - Resolver, - TemplateCompiler, - PackageCache, - explicitRelative, - extensionsPattern, - Package, -} from '@embroider/core'; -import { + ActivePackageRules, ComponentRules, + ModuleRules, PackageRules, PreprocessedComponentRule, preprocessComponentRule, - ActivePackageRules, - ModuleRules, } from './dependency-rules'; +import { + Package, + PackageCache, + Resolver, + TemplateCompiler, + explicitRelative, + extensionsPattern, +} from '@embroider/core'; +import { dirname, join, relative, sep } from 'path'; + +import { Options as AdjustImportsOptions } from '@embroider/core/src/babel-plugin-adjust-imports'; +import { Memoize } from 'typescript-memoize'; import Options from './options'; -import { join, relative, dirname, sep } from 'path'; -import { pathExistsSync } from 'fs-extra'; +import { ResolvedDep } from '@embroider/core/src/resolver'; import { dasherize } from './dasherize-component-name'; import { makeResolverTransform } from './resolver-transform'; -import { Memoize } from 'typescript-memoize'; -import { ResolvedDep } from '@embroider/core/src/resolver'; -import { Options as AdjustImportsOptions } from '@embroider/core/src/babel-plugin-adjust-imports'; - +import { pathExistsSync } from 'fs-extra'; import resolve from 'resolve'; export interface ComponentResolution { @@ -160,8 +160,29 @@ export default class CompatResolver implements Resolver { return resolution; } - private findComponentRules(absPath: string) { - return this.rules.components.get(absPath); + private findComponentRules(absPath: string): PreprocessedComponentRule | undefined { + let rules = this.rules.components.get(absPath); + if (rules) { + return rules; + } + + // co-located templates aren't visible to the resolver, because they never + // get resolved from a template (they are always handled directly by the + // corresponding JS module, which the resolver *does* see). This means their + // paths won't ever be in `this.rules.components`. But we do want them to + // "inherit" the rules that are attached to their corresonding JS module. + if (absPath.endsWith('.hbs')) { + let stem = absPath.slice(0, -4); + for (let ext of this.params.adjustImportsOptions.resolvableExtensions) { + if (ext !== '.hbs') { + let rules = this.rules.components.get(stem + ext); + if (rules) { + return rules; + } + } + } + } + return undefined; } private isIgnoredComponent(dasherizedName: string) { diff --git a/packages/compat/tests/resolver.test.ts b/packages/compat/tests/resolver.test.ts index 4ec8dccdb..ae153bc58 100644 --- a/packages/compat/tests/resolver.test.ts +++ b/packages/compat/tests/resolver.test.ts @@ -986,6 +986,22 @@ describe('compat-resolver', function () { ); }); + test('acceptsComponentArguments matches co-located template', function () { + let packageRules = [ + { + package: 'the-app', + components: { + '': { + acceptsComponentArguments: ['title'], + }, + }, + }, + ]; + let findDependencies = configure({ staticComponents: true, packageRules }); + givenFile('components/form-builder.js'); + expect(findDependencies('components/form-builder.hbs', `{{component title}}`)).toEqual([]); + }); + test(`element block params are not in scope for element's own attributes`, function () { let packageRules = [ {