@tactical-ddd/nx 0.0.2-alpha.1 → 0.0.2-alpha.2

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.
@@ -4,7 +4,7 @@ export interface DomainGeneratorSchema {
4
4
  directory: string;
5
5
  name: string;
6
6
  layers: string[];
7
- prefix?: string;
7
+ prefix: string;
8
8
  preset?: string;
9
9
  linter: 'eslint' | 'none';
10
10
  unitTestRunner?: 'jest' | 'vitest' | 'none';
@@ -2,7 +2,7 @@ import { type Bundler } from '@nx/devkit';
2
2
 
3
3
  export interface SharedKernelGeneratorSchema {
4
4
  directory: string;
5
- prefix?: string;
5
+ prefix: string;
6
6
  linter?: 'eslint' | 'none';
7
7
  unitTestRunner?: 'jest' | 'vitest' | 'none';
8
8
  bundler?: Bundler;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tactical-ddd/nx",
3
- "version": "0.0.2-alpha.1",
3
+ "version": "0.0.2-alpha.2",
4
4
  "keywords": [
5
5
  "nx",
6
6
  "nx-plugin",
@@ -1 +1 @@
1
- {"version":3,"file":"eslint-module-boundaries.d.ts","sourceRoot":"","sources":["../../../../packages/nx/src/utils/eslint-module-boundaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAYvC,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AAEtE,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,EAAE,CAAC;CACpC;AAoCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CA+DT;AA2DD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CA0BT"}
1
+ {"version":3,"file":"eslint-module-boundaries.d.ts","sourceRoot":"","sources":["../../../../packages/nx/src/utils/eslint-module-boundaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAwCvC,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AAEtE,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,EAAE,CAAC;CACpC;AAoCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CA+DT;AA2DD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CA0BT"}
@@ -20,8 +20,22 @@ _export(exports, {
20
20
  }
21
21
  });
22
22
  const _extends = require("@swc/helpers/_/_extends");
23
- const _internal = require("@nx/eslint/internal");
24
23
  const _logger = require("./logger");
24
+ /**
25
+ * Loads `@nx/eslint`'s ESLint-config AST utilities across Nx major versions.
26
+ *
27
+ * Nx >= 23 exposes them through the curated `@nx/eslint/internal` subpath. Nx 22
28
+ * has no such subpath (requiring it throws "Cannot find module
29
+ * '@nx/eslint/internal'"), but ships no `package.json` `exports` map either, so
30
+ * the utilities can be required directly from their module path instead.
31
+ */ function loadEslintConfigUtils() {
32
+ try {
33
+ return require('@nx/eslint/internal');
34
+ } catch (unused) {
35
+ return require('@nx/eslint/src/generators/utils/eslint-file');
36
+ }
37
+ }
38
+ const { addOverrideToLintConfig, isEslintConfigSupported, lintConfigHasOverride, updateOverrideInLintConfig } = loadEslintConfigUtils();
25
39
  const MODULE_BOUNDARIES_RULE = '@nx/enforce-module-boundaries';
26
40
  /**
27
41
  * Baseline options every `@nx/enforce-module-boundaries` rule we write carries.
@@ -52,16 +66,16 @@ const MODULE_BOUNDARIES_RULE = '@nx/enforce-module-boundaries';
52
66
  ];
53
67
  }
54
68
  function applyDepConstraints(tree, constraints) {
55
- if (!(0, _internal.isEslintConfigSupported)(tree)) {
69
+ if (!isEslintConfigSupported(tree)) {
56
70
  (0, _logger.warning)('No supported ESLint config found at the workspace root — skipping module boundary rules.');
57
71
  return false;
58
72
  }
59
- const hasRule = (0, _internal.lintConfigHasOverride)(tree, '', (override)=>{
73
+ const hasRule = lintConfigHasOverride(tree, '', (override)=>{
60
74
  var _override_rules;
61
75
  return Boolean((_override_rules = override.rules) == null ? void 0 : _override_rules[MODULE_BOUNDARIES_RULE]);
62
76
  });
63
77
  if (!hasRule) {
64
- (0, _internal.addOverrideToLintConfig)(tree, '', {
78
+ addOverrideToLintConfig(tree, '', {
65
79
  files: [
66
80
  '**/*.ts',
67
81
  '**/*.js'
@@ -77,7 +91,7 @@ function applyDepConstraints(tree, constraints) {
77
91
  });
78
92
  return true;
79
93
  }
80
- (0, _internal.updateOverrideInLintConfig)(tree, '', (override)=>{
94
+ updateOverrideInLintConfig(tree, '', (override)=>{
81
95
  var _override_rules;
82
96
  return Boolean((_override_rules = override.rules) == null ? void 0 : _override_rules[MODULE_BOUNDARIES_RULE]);
83
97
  }, (override)=>{
@@ -157,10 +171,10 @@ function applicationLayerPatterns(prefix) {
157
171
  return patterns;
158
172
  }
159
173
  function applyCleanArchitectureBoundaries(tree, libraryRoot, prefix) {
160
- if (!(0, _internal.isEslintConfigSupported)(tree, libraryRoot)) {
174
+ if (!isEslintConfigSupported(tree, libraryRoot)) {
161
175
  return false;
162
176
  }
163
- (0, _internal.addOverrideToLintConfig)(tree, libraryRoot, {
177
+ addOverrideToLintConfig(tree, libraryRoot, {
164
178
  files: [
165
179
  'src/lib/domain/**/*.ts'
166
180
  ],
@@ -173,7 +187,7 @@ function applyCleanArchitectureBoundaries(tree, libraryRoot, prefix) {
173
187
  ]
174
188
  }
175
189
  });
176
- (0, _internal.addOverrideToLintConfig)(tree, libraryRoot, {
190
+ addOverrideToLintConfig(tree, libraryRoot, {
177
191
  files: [
178
192
  'src/lib/application/**/*.ts'
179
193
  ],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../packages/nx/src/utils/eslint-module-boundaries.ts"],"sourcesContent":["import { type Tree } from '@nx/devkit';\nimport {\n addOverrideToLintConfig,\n isEslintConfigSupported,\n lintConfigHasOverride,\n updateOverrideInLintConfig,\n} from '@nx/eslint/internal';\n\nimport type { Linter } from 'eslint';\n\nimport { warning } from './logger';\n\n/** The module-boundaries rule whose `depConstraints` encode the dependency graph. */\nexport const MODULE_BOUNDARIES_RULE = '@nx/enforce-module-boundaries';\n\n/** A single `@nx/enforce-module-boundaries` dependency constraint. */\nexport interface DepConstraint {\n sourceTag: string;\n onlyDependOnLibsWithTags: string[];\n}\n\n/** A single `no-restricted-imports` pattern group with its violation message. */\ninterface RestrictedImportPattern {\n group: string[];\n message: string;\n}\n\n/**\n * Baseline options every `@nx/enforce-module-boundaries` rule we write carries.\n * The `allow` glob keeps libraries free to import the workspace's flat ESLint\n * config files (which live outside any project's source) without tripping the\n * boundary check.\n */\nconst DEFAULT_RULE_OPTIONS = {\n enforceBuildableLibDependency: true,\n allow: ['^.*/eslint(\\\\.base)?\\\\.config\\\\.[cm]?[jt]s$'],\n};\n\n/**\n * Merges `incoming` constraints into `existing`, keyed by `sourceTag`: an\n * incoming constraint replaces any existing one with the same `sourceTag`,\n * otherwise it is appended. Order of first appearance is preserved so the\n * config stays stable across re-runs (idempotent).\n */\nfunction mergeConstraints(\n existing: DepConstraint[],\n incoming: DepConstraint[],\n): DepConstraint[] {\n const bySource = new Map<string, DepConstraint>();\n for (const constraint of [...existing, ...incoming]) {\n bySource.set(constraint.sourceTag, constraint);\n }\n return [...bySource.values()];\n}\n\n/**\n * Ensures the root `@nx/enforce-module-boundaries` rule exists and that every\n * constraint in `constraints` is present in its `depConstraints` (merged by\n * `sourceTag`). Existing rule options are preserved; the baseline options are\n * filled in for any that are missing.\n *\n * Returns `false` (and warns) when there is no ESLint config to update — e.g.\n * the workspace was set up with `linter: none`.\n */\nexport function applyDepConstraints(\n tree: Tree,\n constraints: DepConstraint[],\n): boolean {\n if (!isEslintConfigSupported(tree)) {\n warning(\n 'No supported ESLint config found at the workspace root — skipping module boundary rules.',\n );\n return false;\n }\n\n const hasRule = lintConfigHasOverride(tree, '', (override) =>\n Boolean(override.rules?.[MODULE_BOUNDARIES_RULE]),\n );\n\n if (!hasRule) {\n addOverrideToLintConfig(tree, '', {\n files: ['**/*.ts', '**/*.js'],\n rules: {\n [MODULE_BOUNDARIES_RULE]: [\n 'error',\n { ...DEFAULT_RULE_OPTIONS, depConstraints: constraints },\n ],\n },\n });\n return true;\n }\n\n updateOverrideInLintConfig(\n tree,\n '',\n (override) => Boolean(override.rules?.[MODULE_BOUNDARIES_RULE]),\n (override) => {\n const rules = override.rules ?? {};\n const rule = rules[MODULE_BOUNDARIES_RULE];\n\n // The rule may be a bare severity string (`'error'`) or the usual\n // `[severity, options]` tuple. Falling back to `{}` for the non-tuple\n // form would silently drop `enforceBuildableLibDependency`/`allow`, so we\n // start from the baseline options and layer any existing ones on top.\n const severity: Linter.RuleSeverity = Array.isArray(rule)\n ? (rule[0] as Linter.RuleSeverity)\n : ((rule as Linter.RuleSeverity) ?? 'error');\n const existingOptions = (\n Array.isArray(rule) ? (rule[1] ?? {}) : {}\n ) as Record<string, unknown>;\n const existingConstraints = Array.isArray(existingOptions.depConstraints)\n ? (existingOptions.depConstraints as DepConstraint[])\n : [];\n\n const updatedRule: Linter.RuleEntry = [\n severity,\n {\n ...DEFAULT_RULE_OPTIONS,\n ...existingOptions,\n depConstraints: mergeConstraints(existingConstraints, constraints),\n },\n ];\n\n return {\n ...override,\n rules: { ...rules, [MODULE_BOUNDARIES_RULE]: updatedRule },\n };\n },\n );\n return true;\n}\n\n/**\n * The `no-restricted-imports` patterns enforcing Clean Architecture layering\n * *inside* a domain's `core` library: `domain` may not reach into `application`\n * or `infrastructure`, and `application` may not reach into `infrastructure`.\n *\n * Each layer gets a relative-path rule (sibling folders under `src/lib`) and,\n * when an organization `prefix` is known, an absolute-path rule that closes the\n * loophole of bypassing the relative rule through a workspace alias.\n */\nfunction domainLayerPatterns(prefix?: string): RestrictedImportPattern[] {\n const patterns: RestrictedImportPattern[] = [\n {\n group: [\n '../application/*',\n '../application',\n '../infrastructure/*',\n '../infrastructure',\n ],\n message:\n 'Clean Architecture violation: Domain layer must be independent and cannot import from Application or Infrastructure layers.',\n },\n ];\n\n if (prefix) {\n patterns.push({\n group: [\n `${prefix}/*/core/infrastructure/*`,\n `${prefix}/*/core/application/*`,\n ],\n message:\n 'Clean Architecture violation: Domain layer cannot import upper layers via absolute paths.',\n });\n }\n\n return patterns;\n}\n\nfunction applicationLayerPatterns(prefix?: string): RestrictedImportPattern[] {\n const patterns: RestrictedImportPattern[] = [\n {\n group: ['../infrastructure/*', '../infrastructure'],\n message:\n 'Clean Architecture violation: Application layer cannot import from Infrastructure layer.',\n },\n ];\n\n if (prefix) {\n patterns.push({\n group: [`${prefix}/*/core/infrastructure/*`],\n message:\n 'Clean Architecture violation: Application layer cannot import Infrastructure via absolute paths.',\n });\n }\n\n return patterns;\n}\n\n/**\n * Adds Clean Architecture import boundaries to a `core` library's own ESLint\n * config (`<libraryRoot>/eslint.config.*`) via `no-restricted-imports` overrides\n * scoped to the `domain` and `application` layer folders. `@nx/enforce-module-\n * boundaries` guards dependencies *between* projects; these rules guard the\n * layering *within* the core library.\n *\n * No-op (returning `false`) when the library has no ESLint config — e.g. it was\n * generated with `linter: none`.\n */\nexport function applyCleanArchitectureBoundaries(\n tree: Tree,\n libraryRoot: string,\n prefix?: string,\n): boolean {\n if (!isEslintConfigSupported(tree, libraryRoot)) {\n return false;\n }\n\n addOverrideToLintConfig(tree, libraryRoot, {\n files: ['src/lib/domain/**/*.ts'],\n rules: {\n 'no-restricted-imports': [\n 'error',\n { patterns: domainLayerPatterns(prefix) },\n ],\n },\n });\n\n addOverrideToLintConfig(tree, libraryRoot, {\n files: ['src/lib/application/**/*.ts'],\n rules: {\n 'no-restricted-imports': [\n 'error',\n { patterns: applicationLayerPatterns(prefix) },\n ],\n },\n });\n\n return true;\n}\n"],"names":["MODULE_BOUNDARIES_RULE","applyCleanArchitectureBoundaries","applyDepConstraints","DEFAULT_RULE_OPTIONS","enforceBuildableLibDependency","allow","mergeConstraints","existing","incoming","bySource","Map","constraint","set","sourceTag","values","tree","constraints","isEslintConfigSupported","warning","hasRule","lintConfigHasOverride","override","Boolean","rules","addOverrideToLintConfig","files","depConstraints","updateOverrideInLintConfig","rule","severity","Array","isArray","existingOptions","existingConstraints","updatedRule","domainLayerPatterns","prefix","patterns","group","message","push","applicationLayerPatterns","libraryRoot"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../packages/nx/src/utils/eslint-module-boundaries.ts"],"sourcesContent":["import { type Tree } from '@nx/devkit';\n\nimport type { Linter } from 'eslint';\n\nimport { warning } from './logger';\n\n/**\n * The slice of `@nx/eslint`'s flat-config AST utilities this module relies on.\n */\ntype EslintConfigUtils = Pick<\n typeof import('@nx/eslint/internal'),\n | 'addOverrideToLintConfig'\n | 'isEslintConfigSupported'\n | 'lintConfigHasOverride'\n | 'updateOverrideInLintConfig'\n>;\n\n/**\n * Loads `@nx/eslint`'s ESLint-config AST utilities across Nx major versions.\n *\n * Nx >= 23 exposes them through the curated `@nx/eslint/internal` subpath. Nx 22\n * has no such subpath (requiring it throws \"Cannot find module\n * '@nx/eslint/internal'\"), but ships no `package.json` `exports` map either, so\n * the utilities can be required directly from their module path instead.\n */\nfunction loadEslintConfigUtils(): EslintConfigUtils {\n try {\n return require('@nx/eslint/internal');\n } catch {\n return require('@nx/eslint/src/generators/utils/eslint-file');\n }\n}\n\nconst {\n addOverrideToLintConfig,\n isEslintConfigSupported,\n lintConfigHasOverride,\n updateOverrideInLintConfig,\n} = loadEslintConfigUtils();\n\n/** The module-boundaries rule whose `depConstraints` encode the dependency graph. */\nexport const MODULE_BOUNDARIES_RULE = '@nx/enforce-module-boundaries';\n\n/** A single `@nx/enforce-module-boundaries` dependency constraint. */\nexport interface DepConstraint {\n sourceTag: string;\n onlyDependOnLibsWithTags: string[];\n}\n\n/** A single `no-restricted-imports` pattern group with its violation message. */\ninterface RestrictedImportPattern {\n group: string[];\n message: string;\n}\n\n/**\n * Baseline options every `@nx/enforce-module-boundaries` rule we write carries.\n * The `allow` glob keeps libraries free to import the workspace's flat ESLint\n * config files (which live outside any project's source) without tripping the\n * boundary check.\n */\nconst DEFAULT_RULE_OPTIONS = {\n enforceBuildableLibDependency: true,\n allow: ['^.*/eslint(\\\\.base)?\\\\.config\\\\.[cm]?[jt]s$'],\n};\n\n/**\n * Merges `incoming` constraints into `existing`, keyed by `sourceTag`: an\n * incoming constraint replaces any existing one with the same `sourceTag`,\n * otherwise it is appended. Order of first appearance is preserved so the\n * config stays stable across re-runs (idempotent).\n */\nfunction mergeConstraints(\n existing: DepConstraint[],\n incoming: DepConstraint[],\n): DepConstraint[] {\n const bySource = new Map<string, DepConstraint>();\n for (const constraint of [...existing, ...incoming]) {\n bySource.set(constraint.sourceTag, constraint);\n }\n return [...bySource.values()];\n}\n\n/**\n * Ensures the root `@nx/enforce-module-boundaries` rule exists and that every\n * constraint in `constraints` is present in its `depConstraints` (merged by\n * `sourceTag`). Existing rule options are preserved; the baseline options are\n * filled in for any that are missing.\n *\n * Returns `false` (and warns) when there is no ESLint config to update — e.g.\n * the workspace was set up with `linter: none`.\n */\nexport function applyDepConstraints(\n tree: Tree,\n constraints: DepConstraint[],\n): boolean {\n if (!isEslintConfigSupported(tree)) {\n warning(\n 'No supported ESLint config found at the workspace root — skipping module boundary rules.',\n );\n return false;\n }\n\n const hasRule = lintConfigHasOverride(tree, '', (override) =>\n Boolean(override.rules?.[MODULE_BOUNDARIES_RULE]),\n );\n\n if (!hasRule) {\n addOverrideToLintConfig(tree, '', {\n files: ['**/*.ts', '**/*.js'],\n rules: {\n [MODULE_BOUNDARIES_RULE]: [\n 'error',\n { ...DEFAULT_RULE_OPTIONS, depConstraints: constraints },\n ],\n },\n });\n return true;\n }\n\n updateOverrideInLintConfig(\n tree,\n '',\n (override) => Boolean(override.rules?.[MODULE_BOUNDARIES_RULE]),\n (override) => {\n const rules = override.rules ?? {};\n const rule = rules[MODULE_BOUNDARIES_RULE];\n\n // The rule may be a bare severity string (`'error'`) or the usual\n // `[severity, options]` tuple. Falling back to `{}` for the non-tuple\n // form would silently drop `enforceBuildableLibDependency`/`allow`, so we\n // start from the baseline options and layer any existing ones on top.\n const severity: Linter.RuleSeverity = Array.isArray(rule)\n ? (rule[0] as Linter.RuleSeverity)\n : ((rule as Linter.RuleSeverity) ?? 'error');\n const existingOptions = (\n Array.isArray(rule) ? (rule[1] ?? {}) : {}\n ) as Record<string, unknown>;\n const existingConstraints = Array.isArray(existingOptions.depConstraints)\n ? (existingOptions.depConstraints as DepConstraint[])\n : [];\n\n const updatedRule: Linter.RuleEntry = [\n severity,\n {\n ...DEFAULT_RULE_OPTIONS,\n ...existingOptions,\n depConstraints: mergeConstraints(existingConstraints, constraints),\n },\n ];\n\n return {\n ...override,\n rules: { ...rules, [MODULE_BOUNDARIES_RULE]: updatedRule },\n };\n },\n );\n return true;\n}\n\n/**\n * The `no-restricted-imports` patterns enforcing Clean Architecture layering\n * *inside* a domain's `core` library: `domain` may not reach into `application`\n * or `infrastructure`, and `application` may not reach into `infrastructure`.\n *\n * Each layer gets a relative-path rule (sibling folders under `src/lib`) and,\n * when an organization `prefix` is known, an absolute-path rule that closes the\n * loophole of bypassing the relative rule through a workspace alias.\n */\nfunction domainLayerPatterns(prefix?: string): RestrictedImportPattern[] {\n const patterns: RestrictedImportPattern[] = [\n {\n group: [\n '../application/*',\n '../application',\n '../infrastructure/*',\n '../infrastructure',\n ],\n message:\n 'Clean Architecture violation: Domain layer must be independent and cannot import from Application or Infrastructure layers.',\n },\n ];\n\n if (prefix) {\n patterns.push({\n group: [\n `${prefix}/*/core/infrastructure/*`,\n `${prefix}/*/core/application/*`,\n ],\n message:\n 'Clean Architecture violation: Domain layer cannot import upper layers via absolute paths.',\n });\n }\n\n return patterns;\n}\n\nfunction applicationLayerPatterns(prefix?: string): RestrictedImportPattern[] {\n const patterns: RestrictedImportPattern[] = [\n {\n group: ['../infrastructure/*', '../infrastructure'],\n message:\n 'Clean Architecture violation: Application layer cannot import from Infrastructure layer.',\n },\n ];\n\n if (prefix) {\n patterns.push({\n group: [`${prefix}/*/core/infrastructure/*`],\n message:\n 'Clean Architecture violation: Application layer cannot import Infrastructure via absolute paths.',\n });\n }\n\n return patterns;\n}\n\n/**\n * Adds Clean Architecture import boundaries to a `core` library's own ESLint\n * config (`<libraryRoot>/eslint.config.*`) via `no-restricted-imports` overrides\n * scoped to the `domain` and `application` layer folders. `@nx/enforce-module-\n * boundaries` guards dependencies *between* projects; these rules guard the\n * layering *within* the core library.\n *\n * No-op (returning `false`) when the library has no ESLint config — e.g. it was\n * generated with `linter: none`.\n */\nexport function applyCleanArchitectureBoundaries(\n tree: Tree,\n libraryRoot: string,\n prefix?: string,\n): boolean {\n if (!isEslintConfigSupported(tree, libraryRoot)) {\n return false;\n }\n\n addOverrideToLintConfig(tree, libraryRoot, {\n files: ['src/lib/domain/**/*.ts'],\n rules: {\n 'no-restricted-imports': [\n 'error',\n { patterns: domainLayerPatterns(prefix) },\n ],\n },\n });\n\n addOverrideToLintConfig(tree, libraryRoot, {\n files: ['src/lib/application/**/*.ts'],\n rules: {\n 'no-restricted-imports': [\n 'error',\n { patterns: applicationLayerPatterns(prefix) },\n ],\n },\n });\n\n return true;\n}\n"],"names":["MODULE_BOUNDARIES_RULE","applyCleanArchitectureBoundaries","applyDepConstraints","loadEslintConfigUtils","require","addOverrideToLintConfig","isEslintConfigSupported","lintConfigHasOverride","updateOverrideInLintConfig","DEFAULT_RULE_OPTIONS","enforceBuildableLibDependency","allow","mergeConstraints","existing","incoming","bySource","Map","constraint","set","sourceTag","values","tree","constraints","warning","hasRule","override","Boolean","rules","files","depConstraints","rule","severity","Array","isArray","existingOptions","existingConstraints","updatedRule","domainLayerPatterns","prefix","patterns","group","message","push","applicationLayerPatterns","libraryRoot"],"mappings":"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"}