Skip to main content
Version: 7.0.0

Legacy Policy Configuration

Deprecated

Everything on this page is kept for backward compatibility but is deprecated and will be removed in a future major version. Prefer the modern configuration documented in Policies.

Legacy rules option in rules configuration

The rules option in rules configuration (the array of per-entry dependency declarations) has been renamed to policies. rules is kept as a deprecated alias — it keeps working exactly as before.

Deprecated

Using rules prints a one-time deprecation warning (suppressible by setting boundaries/legacy-warnings to false) and it will be removed in a future major version. When both policies and rules are set, policies takes precedence.

"boundaries/dependencies": [2, {
default: "disallow",
rules: [
policies: [
{ from: { element: { type: "component" } }, allow: { element: { type: "helper" } } }
]
}]

For TypeScript users, the following exports are kept as @deprecated aliases: DependenciesRule (→ DependenciesPolicy), EntryPointRule (→ EntryPointPolicy), ExternalRule (→ ExternalPolicy), RulePolicy (→ RuleEffect), RULE_POLICIES_MAP (→ RULE_EFFECTS_MAP), and isRulePolicy (→ isRuleEffect).

See the v6 to v7 migration guide for more details.

Deprecated Policy Properties

importKind (deprecated)

Type: <string> or <array of strings> or <micromatch pattern>

Available with: TypeScript

Optional

Deprecated in v6. Use the dependency.kind metadata selector instead; when both are defined, dependency.kind takes precedence.

Specifies whether a rule applies based on how the dependency is imported.

Possible values:

  • "value" - Importing as a value
  • "type" - Importing as a type
  • "typeof" - Importing with typeof
// Components can import helpers as values
{
from: { element: { type: "component" } },
allow: {
to: { element: { type: "helper" } },
dependency: { kind: "value" }
},
importKind: "value"
}
// Components cannot import helper types
{
from: { element: { type: "component" } },
disallow: {
to: { element: { type: "helper" } },
dependency: { kind: "type" }
}
importKind: "type"
}
// Modules can import helpers as values or types
{
from: { element: { type: "module" } },
allow: {
to: { element: { type: "helper" } },
dependency: { kind: ["value", "type"] }
}
importKind: ["value", "type"]
}
.
// Modules can import components as any import kind
{
from: { element: { type: "module" } },
allow: {
to: { element: { type: "component" } },
dependency: { kind: "*" }
},
importKind: "*"
}
warning

When both policy-level importKind and dependency-level kind are defined, dependency-level kind takes precedence.

target (deprecated)

The target property is a deprecated alias for to. It still works, but use to for clarity.

{
from: { element: { type: "component" } },
disallow: {
target: { element: { type: "helper" } }
to: { element: { type: "helper" } }
}
}
warning

When both target and to are defined, to takes precedence.

Legacy rule template variable

The custom message template data exposed under rule ({{rule.index}}, {{rule.selector}}) has been renamed to policy ({{policy.index}}, {{policy.selector}}). rule is kept as a deprecated alias with the exact same shape and value.

Deprecated

{{rule.*}} is kept for backward compatibility but is deprecated and will be removed in a future major version. Use {{policy.*}} instead.

{
"message": "Denied by policy at index {{rule.index}}"
"message": "Denied by policy at index {{policy.index}}"
}

TypeScript users importing CustomMessageTemplateRuleContext should switch to CustomMessageTemplatePolicyContext (the old name is kept as a @deprecated alias).

See the v6 to v7 migration guide for more details.

Legacy flat message aliases

For backward compatibility, each side also exposes V6 flat fields at the from/to root in custom message templates. These keep working but the nested paths are preferred:

Legacy aliasCanonical V7 path
{{from.type}}{{from.element.types.[0]}}
{{from.captured.X}}{{from.element.captured.X}}
{{from.elementPath}}{{from.element.path}}
{{from.internalPath}}{{from.element.fileInternalPath}}
{{from.origin}}{{from.module.origin}}
{{from.parents.[0].type}}{{from.element.parents.[0].types.[0]}}
Deprecated

{{from.category}} / {{to.category}} resolve the deprecated element-level category field. They still work, but use file categories ({{from.file.categories}} / {{to.file.categories}}) instead. See the v6 to v7 migration guide.

Legacy Message Templates

Legacy message template syntax using ${...} is kept for backward compatibility but is deprecated and will be removed in a future major version. Use Handlebars templates ({{...}}) instead.

It keeps working without changes, but using ${...} in a message now prints the same deprecation warning as legacy ${...} selectors. The boundaries/legacy-templates setting does not affect it — that setting only controls legacy templating in selectors, not the rendering of custom messages.

Backward Compatibility

For backward compatibility, message rendering runs in two phases:

  1. Legacy replacement (${...}): Processes legacy template syntax with flattened property access
  2. Handlebars rendering ({{...}}): Processes modern template syntax with nested object access

This allows existing templates to continue working while you migrate to the new format.

Available properties

Legacy templates do not support the full range of properties available in Handlebars templates. The following properties are available in legacy templates:

  • ${file.*} and ${dependency.*} - Legacy aliases for the importing/imported elements
    • type - Element type
    • internalPath - Path inside the element
    • source - Import source
    • importKind - Import kind (value, type, typeof)
    • All captured values from the element pattern
  • ${from.*} and ${target.*} - Alternative legacy aliases
  • ${file.parent.*}, ${from.parent.*}, ${dependency.parent.*}, ${target.parent.*} - Parent element properties
  • ${report.*} - Dependency metadata: ${report.path} is the target's internal path, ${report.specifiers} is the comma-separated list of imported specifiers

Example:

{
"message": "${file.type} cannot import ${dependency.type}"
}

Migration to Handlebars

To migrate from legacy templates to Handlebars:

  1. Replace ${...} with {{...}}: Change the delimiter syntax
  2. Update property paths: Use the new nested structure (from, to, dependency) instead of deprecated flattened aliases.
  3. Remove legacy aliases: Use official property names instead of deprecated aliases

Migration examples:

"${file.type} cannot import ${dependency.type}"
"{{from.element.types.[0]}} cannot import {{to.element.types.[0]}}"
"${file.type} with name ${file.elementName} cannot import ${dependency.family}"
"{{from.element.types.[0]}} with name {{from.element.captured.elementName}} cannot import {{to.element.captured.family}}"
"${file.type} in ${file.parent.type} cannot import ${dependency.type}"
"{{from.element.types.[0]}} in {{from.element.parents.[0].types.[0]}} cannot import {{to.element.types.[0]}}"
Migration Guide

For a detailed migration conversion table, see the v5 to v6 migration guide and the v6 to v7 migration guide.

See Also