Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libs/ddd/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@angular-architects/ddd",
"version": "19.0.4",
"version": "19.0.6",
"license": "MIT",
"author": "Manfred Steyer",
"description": "Nx plugin for structuring a monorepo with domain driven design",
Expand Down
24 changes: 15 additions & 9 deletions libs/ddd/src/generators/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,41 @@ import { ApiOptions } from './schema';
import { strings } from '@angular-devkit/core';
import { validateInputs } from '../utils/validate-inputs';
import { deleteDefaultComponent } from '../utils/delete-default-component';
import { getWorkspaceScope } from '../utils/get-workspace-scope';

export default async function (tree: Tree, options: ApiOptions) {
validateInputs(options);

const libName = options.name ? `api-${strings.dasherize(options.name)}` : 'api';
const libDirectory = options.directory ? strings.dasherize(options.directory) : libName;
const workspaceName = getWorkspaceScope(tree);

const libName = options.name
? `api-${strings.dasherize(options.name)}`
: 'api';
const libDirectory = options.directory
? strings.dasherize(options.directory)
: libName;
const domainName = options.shared ? 'shared' : options.domain;
const isPublishableLib = options.type === 'publishable';

// additions for Nx20 by LXT
const finalName = domainName + '-' + libName;
const finalDirectory = `libs/${domainName}/${libDirectory}`;

const prefix = strings.dasherize(finalName).split('/').join('-');
const importPath = `${workspaceName}/${domainName}/${libDirectory}`;

await libraryGenerator(tree, {
name: finalName,
prefix: finalName,
prefix: prefix,
directory: finalDirectory,
tags: `domain:${domainName},domain:${domainName}/${libName},type:api`,
publishable: isPublishableLib,
buildable: options.type === 'buildable',
importPath: options.importPath,
importPath: options.importPath ?? importPath,
standalone: options.standalone,
});

deleteDefaultComponent(
tree,
finalDirectory,
finalName
);
deleteDefaultComponent(tree, finalDirectory, finalName);

console.info(
`\nHINT: Don\'t forget to extend the rules in your "eslint.config.js" to allow selected domains to access this API.\nFor this, add the tag domain:${domainName}/${libName} to the respective domains' rule sets.\n `
Expand Down
14 changes: 11 additions & 3 deletions libs/ddd/src/generators/domain/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ function convertToStandaloneApp(
}

export default async function (tree: Tree, options: DomainOptions) {
const npmScope = getNpmScope(tree);

const appName = strings.dasherize(options.name);
const appNameAndDirectory = options.appDirectory
? `apps/${options.appDirectory}/${appName}`
Expand Down Expand Up @@ -82,14 +84,21 @@ export default async function (tree: Tree, options: DomainOptions) {
);
}*/

const prefix = strings
.dasherize(finalName)
.split('/')
.join('-');

const importPath = `${npmScope}/${domainNameAndDirectory}/domain`;

await libraryGenerator(tree, {
name: finalName,
prefix: finalName,
prefix: prefix,
directory: finalDirectory,
tags: `domain:${domainName},type:domain-logic`,
publishable: options.type === 'publishable',
buildable: options.type === 'buildable',
importPath: options.importPath,
importPath: options.importPath ?? importPath,
standalone: options.standalone,
});

Expand Down Expand Up @@ -122,7 +131,6 @@ export default async function (tree: Tree, options: DomainOptions) {
}

const wsConfig = readNxJson(tree);
const npmScope = getNpmScope(tree);
// const wsConfig = readWorkspaceConfiguration(tree);

if (options.addApp && options.standalone) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { CommonModule } from '@angular/common';
@Component({ <% if (standalone) { %>
standalone: true,
imports: [CommonModule],
<% } %>selector: '<%=dasherize(domain)%>-<%=dasherize(name)%>',
<% } %>selector: '<%=dasherize(flatDomain)%>-feature-<%=dasherize(name)%>',
templateUrl: './<%=dasherize(name)%>.component.html',
styleUrls: ['./<%=dasherize(name)%>.component.scss']
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { CommonModule } from '@angular/common';
@Component({ <% if (standalone) { %>
standalone: true,
imports: [CommonModule],
<% } %>selector: '<%=dasherize(domain)%>-<%=dasherize(name)%>',
<% } %>selector: '<%=dasherize(flatDomain)%>-feature-<%=dasherize(name)%>',
templateUrl: './<%=dasherize(name)%>.component.html',
styleUrls: ['./<%=dasherize(name)%>.component.scss']
})
Expand Down
15 changes: 13 additions & 2 deletions libs/ddd/src/generators/feature/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,21 @@ export default async function (tree: Tree, options: FeatureOptions) {
? `libs/${domainNameAndDirectory}/${featureDirectory}`
: `libs/${domainNameAndDirectory}/${featureFolderName}`;

const prefix = strings
.dasherize(finalName)
.split('/')
.join('-');

const importPath = `${workspaceName}/${domainNameAndDirectory}/${featureFolderName}`;

await libraryGenerator(tree, {
name: finalName,
prefix: finalName,
prefix: prefix,
directory: finalDirectory,
tags: `domain:${domainName},type:feature`,
publishable: options.type === 'publishable',
buildable: options.type === 'buildable',
importPath: options.importPath,
importPath: options.importPath ?? importPath,
standalone: options.standalone,
});

Expand Down Expand Up @@ -279,6 +286,9 @@ function generate(
featureLibFolderPath: string;
}
) {

const flatDomain = strings.dasherize(options.domain).split('/').join('-');

const tmpl = '';
const params = {
...strings,
Expand All @@ -290,6 +300,7 @@ function generate(
domainLibFolderPath,
featureLibFolderPath,
tmpl,
flatDomain
};

if (options.ngrx && entityName) {
Expand Down
4 changes: 3 additions & 1 deletion libs/ddd/src/generators/init/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Tree } from '@nx/devkit';
import { formatFiles, Tree } from '@nx/devkit';
import { updateDepConst } from '../utils/update-dep-const';

export default async function (tree: Tree, schema: any) {
Expand Down Expand Up @@ -53,4 +53,6 @@ export default async function (tree: Tree, schema: any) {
onlyDependOnLibsWithTags: ['domain:shared'],
});
});

await formatFiles(tree);
}
10 changes: 8 additions & 2 deletions libs/ddd/src/generators/ui/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ import { UiOptions } from './schema';
import { strings } from '@angular-devkit/core';
import { validateInputs } from '../utils/validate-inputs';
import { deleteDefaultComponent } from '../utils/delete-default-component';
import { getWorkspaceScope } from '../utils/get-workspace-scope';

export default async function (tree: Tree, options: UiOptions) {
validateInputs(options);

const workspaceName = getWorkspaceScope(tree);

const libName = `ui-${strings.dasherize(options.name)}`;
const libDirectory = options.directory ? strings.dasherize(options.directory) : libName;
const domainName = options.shared ? 'shared' : options.domain;
Expand All @@ -17,14 +20,17 @@ export default async function (tree: Tree, options: UiOptions) {
const finalName = domainName + '-' + libName;
const finalDirectory = `libs/${domainName}/${libDirectory}`;

const prefix = strings.dasherize(finalName).split('/').join('-');
const importPath = `${workspaceName}/${domainName}/${libDirectory}`;

await libraryGenerator(tree, {
name: finalName,
prefix: finalName,
prefix: prefix,
directory: finalDirectory,
tags: `domain:${domainName},type:ui`,
publishable: isPublishableLib,
buildable: options.type === 'buildable',
importPath: options.importPath,
importPath: options.importPath ?? importPath,
standalone: options.standalone,
});

Expand Down
10 changes: 8 additions & 2 deletions libs/ddd/src/generators/util/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ import { UtilOptions } from './schema';
import { strings } from '@angular-devkit/core';
import { validateInputs } from '../utils/validate-inputs';
import { deleteDefaultComponent } from '../utils/delete-default-component';
import { getWorkspaceScope } from '../utils/get-workspace-scope';

export default async function (tree: Tree, options: UtilOptions) {
validateInputs(options);

const workspaceName = getWorkspaceScope(tree);

const libName = `util-${strings.dasherize(options.name)}`;
const libDirectory = options.directory ? strings.dasherize(options.directory) : libName;
const domainName = options.shared ? 'shared' : options.domain;
Expand All @@ -17,14 +20,17 @@ export default async function (tree: Tree, options: UtilOptions) {
const finalName = domainName + '-' + libName;
const finalDirectory = `libs/${domainName}/${libDirectory}`;

const prefix = strings.dasherize(finalName).split('/').join('-');
const importPath = `${workspaceName}/${domainName}/${libDirectory}`;

await libraryGenerator(tree, {
name: finalName,
prefix: finalName,
prefix: prefix,
directory: finalDirectory,
tags: `domain:${domainName},type:util`,
publishable: isPublishableLib,
buildable: options.type === 'buildable',
importPath: options.importPath,
importPath: options.importPath ?? importPath,
standalone: options.standalone,
});

Expand Down
68 changes: 52 additions & 16 deletions libs/ddd/src/generators/utils/update-dep-const.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
import { Tree } from '@nx/devkit';
import { checkRuleExists } from './check-rule-exists';

const allowAll = /\s*\{\s*sourceTag:\s*'\*',\s*onlyDependOnLibsWithTags:\s*\['\*'\],?\s*\}\s*,?/;
const depConstraints = /depConstraints:\s*\[\s*/;


export function updateDepConst(
host: Tree,
update: (depConst: Array<object>) => void
) {
let filePath = 'tslint.json';
let rule = 'nx-enforce-module-boundaries';
const rule = 'nx-enforce-module-boundaries';
let isJson = true;
let newText = '';

if (!host.exists('tslint.json')) {
if (host.exists('.eslintrc.json')) {
filePath = '.eslintrc.json';
rule = '@nx/enforce-module-boundaries';
console.info('Found .eslintrc.json');
} else if (host.exists('.eslintrc')) {
filePath = '.eslintrc';
rule = '@nx/enforce-module-boundaries';
console.info('Did not find .eslintrc.json but found .eslintrc');
console.info('Found .eslintrc');
} else if (host.exists('eslint.config.cjs')) {
filePath = 'eslint.config.cjs';
console.info('Found .eslintrc');
isJson = false;
} else if (host.exists('eslint.config.mjs')) {
filePath = 'eslint.config.mjs';
console.info('Found .eslintrc');
isJson = false;
} else {
console.info(
'Cannot add linting rules: linting config file does not exist'
Expand All @@ -26,20 +38,44 @@ export function updateDepConst(
}

const text = host.read(filePath).toString();
const json = JSON.parse(text);
let rules = json;
if (rules['overrides']) {
const overrides = rules['overrides'];
rules = overrides.find(
(e) => e.rules && e.rules['@nx/enforce-module-boundaries']
);
}

if (!checkRuleExists(filePath, rule, rules)) return;
if (isJson) {
const json = JSON.parse(text);
let rules = json;
if (rules['overrides']) {
const overrides = rules['overrides'];
rules = overrides.find(
(e) => e.rules && e.rules['@nx/enforce-module-boundaries']
);
}

if (!checkRuleExists(filePath, rule, rules)) return;

const depConst = rules['rules'][rule][1]['depConstraints'] as Array<object>;
update(depConst);
const depConst = rules['rules'][rule][1]['depConstraints'] as Array<object>;
update(depConst);
newText = JSON.stringify(json, undefined, 2);

}
else {
const rules = new Array<object>();
update(rules);
const code = trim(JSON.stringify(rules, null, 2)) + ',';
newText = text.replace(allowAll, '');
newText = newText.replace(depConstraints, 'depConstraints: [\n' + code);
}

const newText = JSON.stringify(json, undefined, 2);
host.write(filePath, newText);
}

function trim(str: string) {

if (str.startsWith('[')) {
str = str.substring(1);
}

if (str.endsWith(']')) {
str = str.substring(0, str.length-1);
}

return str.trim();
}
3 changes: 3 additions & 0 deletions update.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
npx nx build ddd
npm unpublish @angular-architects/[email protected] -f --registry http://localhost:4873
npm publish dist/libs/ddd --registry http://localhost:4873