@ddd-ts-kit/eslint-plugin 0.1.1 → 0.2.0
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.
- package/README.md +3 -1
- package/dist/project/config.d.ts +4 -0
- package/dist/project/config.d.ts.map +1 -1
- package/dist/project/is-judged.d.ts +5 -0
- package/dist/project/is-judged.d.ts.map +1 -0
- package/dist/project/is-judged.js +7 -0
- package/dist/project/is-judged.js.map +1 -0
- package/dist/project/parse-config.d.ts.map +1 -1
- package/dist/project/parse-config.js +4 -0
- package/dist/project/parse-config.js.map +1 -1
- package/dist/project/resolve-import.d.ts.map +1 -1
- package/dist/project/resolve-import.js +4 -1
- package/dist/project/resolve-import.js.map +1 -1
- package/dist/project/specifier-suffix.d.ts +6 -0
- package/dist/project/specifier-suffix.d.ts.map +1 -0
- package/dist/project/specifier-suffix.js +8 -0
- package/dist/project/specifier-suffix.js.map +1 -0
- package/dist/project/to-alias.d.ts +3 -2
- package/dist/project/to-alias.d.ts.map +1 -1
- package/dist/project/to-alias.js +4 -3
- package/dist/project/to-alias.js.map +1 -1
- package/dist/rules/clean-one-export-per-file.js +7 -3
- package/dist/rules/clean-one-export-per-file.js.map +1 -1
- package/dist/rules/declarations-constructor-injection.d.ts +5 -0
- package/dist/rules/declarations-constructor-injection.d.ts.map +1 -0
- package/dist/rules/declarations-constructor-injection.js +80 -0
- package/dist/rules/declarations-constructor-injection.js.map +1 -0
- package/dist/rules/imports-alias-only.d.ts.map +1 -1
- package/dist/rules/imports-alias-only.js +7 -9
- package/dist/rules/imports-alias-only.js.map +1 -1
- package/dist/rules/imports-extension.d.ts +5 -0
- package/dist/rules/imports-extension.d.ts.map +1 -0
- package/dist/rules/imports-extension.js +45 -0
- package/dist/rules/imports-extension.js.map +1 -0
- package/dist/rules/ports-no-concrete-dependency.d.ts +3 -1
- package/dist/rules/ports-no-concrete-dependency.d.ts.map +1 -1
- package/dist/rules/ports-no-concrete-dependency.js +51 -3
- package/dist/rules/ports-no-concrete-dependency.js.map +1 -1
- package/dist/rules/rules.d.ts.map +1 -1
- package/dist/rules/rules.js +4 -0
- package/dist/rules/rules.js.map +1 -1
- package/dist/support/declarations/declared-roles.d.ts.map +1 -1
- package/dist/support/declarations/declared-roles.js +1 -0
- package/dist/support/declarations/declared-roles.js.map +1 -1
- package/dist/support/injection/language-types.d.ts +3 -0
- package/dist/support/injection/language-types.d.ts.map +1 -0
- package/dist/support/injection/language-types.js +20 -0
- package/dist/support/injection/language-types.js.map +1 -0
- package/dist/support/injection/not-classes.d.ts +4 -0
- package/dist/support/injection/not-classes.d.ts.map +1 -0
- package/dist/support/injection/not-classes.js +20 -0
- package/dist/support/injection/not-classes.js.map +1 -0
- package/dist/support/injection/parameter-reading.d.ts +9 -0
- package/dist/support/injection/parameter-reading.d.ts.map +1 -0
- package/dist/support/injection/parameter-reading.js +2 -0
- package/dist/support/injection/parameter-reading.js.map +1 -0
- package/dist/support/injection/read-parameter.d.ts +9 -0
- package/dist/support/injection/read-parameter.d.ts.map +1 -0
- package/dist/support/injection/read-parameter.js +41 -0
- package/dist/support/injection/read-parameter.js.map +1 -0
- package/dist/support/injection/written-name.d.ts +4 -0
- package/dist/support/injection/written-name.d.ts.map +1 -0
- package/dist/support/injection/written-name.js +13 -0
- package/dist/support/injection/written-name.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/rules/clean-one-export-per-file.md +1 -1
- package/docs/rules/context-declared-relationship.md +2 -2
- package/docs/rules/context-extractable.md +3 -3
- package/docs/rules/context-published-language-is-a-contract.md +1 -1
- package/docs/rules/context-published-language-only.md +2 -2
- package/docs/rules/declarations-constructor-injection.md +89 -0
- package/docs/rules/declarations-role-declared.md +15 -9
- package/docs/rules/domain-events-transactional-before-commit.md +1 -1
- package/docs/rules/imports-alias-only.md +10 -9
- package/docs/rules/imports-extension.md +83 -0
- package/docs/rules/layer-application-inward.md +3 -3
- package/docs/rules/layer-domain-purity.md +3 -3
- package/docs/rules/layer-infrastructure-no-presentation.md +2 -2
- package/docs/rules/layer-presentation-no-infrastructure.md +2 -2
- package/docs/rules/ports-no-concrete-dependency.md +4 -3
- package/docs/rules/test-no-mocks.md +1 -1
- package/package.json +1 -1
|
@@ -30,7 +30,7 @@ Incorrect:
|
|
|
30
30
|
// src/contexts/billing/application/event-handlers/invoice-issued.event-handler.ts
|
|
31
31
|
import { Cache } from '@ddd-ts-kit/kernel';
|
|
32
32
|
import { DomainEventHandler } from '@ddd-ts-kit/kernel/declarations';
|
|
33
|
-
import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository
|
|
33
|
+
import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';
|
|
34
34
|
|
|
35
35
|
@DomainEventHandler(InvoiceIssued, { name: 'billing.invoice.issued' }, [InvoiceRepository, Cache])
|
|
36
36
|
export class InvoiceIssuedEventHandler {
|
|
@@ -12,7 +12,7 @@ The alias is declared once, under `paths` in `tsconfig.json`, which the compiler
|
|
|
12
12
|
|
|
13
13
|
## Reported
|
|
14
14
|
|
|
15
|
-
- a relative specifier, `./x
|
|
15
|
+
- a relative specifier, `./x` or `../x`, with or without an extension, the same directory included: fixed to the alias of the file
|
|
16
16
|
- a relative specifier that names a file under no aliased directory (a manifest, a build product): reported, not fixed
|
|
17
17
|
- an alias specifier with a `.` or `..` segment, which could name a file outside the directory of the alias: reported, not fixed
|
|
18
18
|
|
|
@@ -20,22 +20,22 @@ Incorrect:
|
|
|
20
20
|
|
|
21
21
|
```ts
|
|
22
22
|
// src/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.ts
|
|
23
|
-
import { Invoice } from '../../../domain/aggregates/invoice.aggregate
|
|
24
|
-
import { IssueInvoiceCommand } from './issue-invoice.command
|
|
23
|
+
import { Invoice } from '../../../domain/aggregates/invoice.aggregate';
|
|
24
|
+
import { IssueInvoiceCommand } from './issue-invoice.command';
|
|
25
25
|
|
|
26
26
|
// test/e2e/issue-invoice.e2e.spec.ts
|
|
27
|
-
import { startApplication } from './support/start-application
|
|
27
|
+
import { startApplication } from './support/start-application';
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Correct:
|
|
31
31
|
|
|
32
32
|
```ts
|
|
33
33
|
// src/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.ts
|
|
34
|
-
import { IssueInvoiceCommand } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command
|
|
35
|
-
import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate
|
|
34
|
+
import { IssueInvoiceCommand } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command';
|
|
35
|
+
import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate';
|
|
36
36
|
|
|
37
37
|
// test/e2e/issue-invoice.e2e.spec.ts
|
|
38
|
-
import { startApplication } from '$test/e2e/support/start-application
|
|
38
|
+
import { startApplication } from '$test/e2e/support/start-application';
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
## Details
|
|
@@ -51,7 +51,7 @@ The aliases of a project:
|
|
|
51
51
|
| `$scripts/` | `scripts/` | fixed |
|
|
52
52
|
| `$generated/` | `generated/`, with `stack.orm` `prisma` only | fixed |
|
|
53
53
|
|
|
54
|
-
The fix computes the alias from the place of the file and the config: the relative specifier is resolved from the directory of the file, and the result is written from the directory its alias names, with
|
|
54
|
+
The fix computes the alias from the place of the file and the config: the relative specifier is resolved from the directory of the file, and the result is written from the directory its alias names, ending as `importExtension` of the config says: with nothing under `none`, with `.js` under `js` (a config without the key). It keeps the quotes of the specifier. A fixed import is often longer than the line: run the formatter after the fix (`npm run format`). Fixing twice changes nothing.
|
|
55
55
|
|
|
56
56
|
Not judged: a file outside the three directories (a config file at the project root, a JavaScript migration), the client under `generated/`, which a tool writes, and a specifier that is neither relative nor one of the aliases (a package, a Node built-in).
|
|
57
57
|
|
|
@@ -59,13 +59,14 @@ An alias that names no file is not this rule's concern: the compiler reports it
|
|
|
59
59
|
|
|
60
60
|
## Options
|
|
61
61
|
|
|
62
|
-
None. `sourceRoot` and `importAlias` of `ddd-ts-kit.config.json` say what the alias of the sources is.
|
|
62
|
+
None. `sourceRoot` and `importAlias` of `ddd-ts-kit.config.json` say what the alias of the sources is, `importExtension` what the fixed specifier ends with.
|
|
63
63
|
|
|
64
64
|
`rules."imports/alias-only"` in `ddd-ts-kit.config.json` set to `off` silences the rule, and `// ddd-ts-kit-disable-next-line imports/alias-only -- <reason>` silences one line, exactly as for `ddd-ts-kit check`.
|
|
65
65
|
|
|
66
66
|
## Limits
|
|
67
67
|
|
|
68
68
|
- Only a module the build emits can be named by the alias: a JSON file or another asset is read at run time instead of imported.
|
|
69
|
+
- The ending of an alias specifier is the business of [`imports/extension`](imports-extension.md).
|
|
69
70
|
- The rule does not check that `tsconfig.json` declares the alias, nor that the build rewrites it: `imports/alias-declared` of `ddd-ts-kit check` does, with everything else that has to follow the one declaration.
|
|
70
71
|
|
|
71
72
|
## With the CLI checker
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# ddd-ts-kit/imports-extension
|
|
2
|
+
|
|
3
|
+
Architecture id: `imports/extension`. Default severity: `error` in `recommended`, `error` in `strict`. Fixable (`eslint --fix`).
|
|
4
|
+
|
|
5
|
+
Applies to: every TypeScript file under the source root, under `test/` and under `scripts/`.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
An import of a file of the project has one spelling. `importExtension` in `ddd-ts-kit.config.json` says which:
|
|
10
|
+
|
|
11
|
+
| `importExtension` | An import is written | The compiler resolves it | Who holds the other spelling |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| `none`, the default of a new project | `@/contexts/billing/domain/aggregates/invoice.aggregate` | as a bundler does (`"moduleResolution": "Bundler"`, with the `node` condition), which accepts both spellings | this rule: the compiler would let `.js` through |
|
|
14
|
+
| `js`, also what a config without the key means | `@/contexts/billing/domain/aggregates/invoice.aggregate.js` | as Node does (`"moduleResolution": "NodeNext"`), which requires the extension | the compiler (`TS2835`), and this rule, which fixes it |
|
|
15
|
+
|
|
16
|
+
Node needs the extension at run time whatever the sources write: `ddd-ts-kit build-aliases`, the second step of `npm run build`, rewrites each alias of the compiled output into a relative path ending in `.js`. The build names one file per specifier and guesses nothing, so a specifier written the other way stops it: this rule reports the mistake in the editor instead. See [Import aliases](../../../../docs/tools/import-aliases.md).
|
|
17
|
+
|
|
18
|
+
## Reported
|
|
19
|
+
|
|
20
|
+
- under `none`: an alias specifier that ends with `.js`, `.mjs`, `.cjs`, `.ts`, `.mts` or `.cts`: fixed by removing the extension
|
|
21
|
+
- under `js`: an alias specifier that does not end with `.js` (`.mjs` and `.cjs` are accepted, they name what an `.mts` or a `.cts` file emits): fixed by writing `.js` in place of what it ends with
|
|
22
|
+
|
|
23
|
+
Incorrect under `none`:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate.js';
|
|
27
|
+
import { startApplication } from '$test/e2e/support/start-application.ts';
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Correct under `none`:
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate';
|
|
34
|
+
import { startApplication } from '$test/e2e/support/start-application';
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Incorrect under `js`:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate';
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Correct under `js`:
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate.js';
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Details
|
|
50
|
+
|
|
51
|
+
Static imports, type-only imports, `export ... from`, `export *`, dynamic `import()`, `import()` types and `require()` are all read. A dynamic import whose specifier is computed is not judged.
|
|
52
|
+
|
|
53
|
+
Only a specifier that starts with an alias of the project is judged (`importAlias`, `$test/`, `$scripts/`, and `$generated/` with `stack.orm` `prisma`). A package is never a file of the project, whatever its subpath ends with: `zod/v4/core.js` and `@scope/package/file.js` are left alone, and so is a Node built-in. A relative import is reported by [`imports/alias-only`](imports-alias-only.md), whose fix writes the alias with the right ending.
|
|
54
|
+
|
|
55
|
+
A dot in a file name is not an extension: `invoice.aggregate`, `issue-invoice.command` and `load-config` are all read as written without one.
|
|
56
|
+
|
|
57
|
+
The fix keeps the quotes of the specifier. Under `none` a fixed import is three characters shorter and may now fit on one line: run the formatter after the fix (`npm run format`). Fixing twice changes nothing.
|
|
58
|
+
|
|
59
|
+
Not judged: a file outside the three directories (a config file at the project root, a JavaScript migration, which Node runs as written and which therefore keeps its extensions) and the client under `generated/`, which a tool writes.
|
|
60
|
+
|
|
61
|
+
## Moving a project to the other spelling
|
|
62
|
+
|
|
63
|
+
A project generated before the key existed is read as `js` and keeps working untouched. To drop the extensions:
|
|
64
|
+
|
|
65
|
+
1. set `"importExtension": "none"` in `ddd-ts-kit.config.json`;
|
|
66
|
+
2. run `ddd-ts-kit check`: `imports/alias-declared` gives the `module`, `moduleResolution` and `customConditions` to write in `tsconfig.json`, and the jest mapping when the project runs jest;
|
|
67
|
+
3. run `eslint --fix`, then `npm run format`;
|
|
68
|
+
4. regenerate what the kit generates (`ddd-ts-kit generate` or `ddd-ts-kit docs` rewrites the declarations barrels), then `npm run verify`.
|
|
69
|
+
|
|
70
|
+
## Options
|
|
71
|
+
|
|
72
|
+
None. `importExtension` of `ddd-ts-kit.config.json` decides.
|
|
73
|
+
|
|
74
|
+
`rules."imports/extension"` in `ddd-ts-kit.config.json` set to `off` silences the rule, and `// ddd-ts-kit-disable-next-line imports/extension -- <reason>` silences one line, exactly as for `ddd-ts-kit check`.
|
|
75
|
+
|
|
76
|
+
## Limits
|
|
77
|
+
|
|
78
|
+
- A specifier that names a directory (`@/contexts/billing/published-language`, resolved by a bundler to its `index.ts`) is not reported here: this rule reads no disk. `ddd-ts-kit check` reports it under the same id, and `ddd-ts-kit build-aliases` refuses it: an alias names one file, `.../published-language/index`.
|
|
79
|
+
- The rule does not check that `tsconfig.json` resolves as the config says: `imports/alias-declared` of `ddd-ts-kit check` does.
|
|
80
|
+
|
|
81
|
+
## With the CLI checker
|
|
82
|
+
|
|
83
|
+
`ddd-ts-kit check` reports the same id from the import specifiers it reads in the text of the files, under the source root, `test/` and `scripts/`, gives the specifier to write in its fix sentence, and also reports an alias that names a directory. This rule is the one that rewrites the import.
|
|
@@ -23,7 +23,7 @@ Incorrect:
|
|
|
23
23
|
import { eq } from 'drizzle-orm';
|
|
24
24
|
import { retry } from '@ddd-ts-kit/aspects';
|
|
25
25
|
import { RedisCache } from '@ddd-ts-kit/redis';
|
|
26
|
-
import { DrizzleInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/drizzle-invoice.repository
|
|
26
|
+
import { DrizzleInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/drizzle-invoice.repository';
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Correct:
|
|
@@ -31,8 +31,8 @@ Correct:
|
|
|
31
31
|
```ts
|
|
32
32
|
// a port is an abstract class: the type of the dependency and its injection token
|
|
33
33
|
import { Cache, Clock } from '@ddd-ts-kit/kernel';
|
|
34
|
-
import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository
|
|
35
|
-
import { PaymentGateway } from '@/contexts/billing/application/ports/payment-gateway.port
|
|
34
|
+
import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';
|
|
35
|
+
import { PaymentGateway } from '@/contexts/billing/application/ports/payment-gateway.port';
|
|
36
36
|
|
|
37
37
|
// declared style
|
|
38
38
|
import { CommandHandler } from '@ddd-ts-kit/kernel/declarations';
|
|
@@ -24,7 +24,7 @@ Incorrect:
|
|
|
24
24
|
import { z } from 'zod';
|
|
25
25
|
import { randomUUID } from 'node:crypto';
|
|
26
26
|
import { Logged } from '@ddd-ts-kit/aspects/decorators';
|
|
27
|
-
import type { InvoiceRow } from '@/contexts/billing/infrastructure/persistence/billing.schema
|
|
27
|
+
import type { InvoiceRow } from '@/contexts/billing/infrastructure/persistence/billing.schema';
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Correct:
|
|
@@ -32,8 +32,8 @@ Correct:
|
|
|
32
32
|
```ts
|
|
33
33
|
// src/contexts/billing/domain/aggregates/invoice.aggregate.ts
|
|
34
34
|
import { AggregateRoot } from '@ddd-ts-kit/kernel';
|
|
35
|
-
import type { Amount } from '@/contexts/billing/domain/value-objects/amount.vo
|
|
36
|
-
import { Money } from '@/shared-kernel/money.vo
|
|
35
|
+
import type { Amount } from '@/contexts/billing/domain/value-objects/amount.vo';
|
|
36
|
+
import { Money } from '@/shared-kernel/money.vo';
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
## Details
|
|
@@ -16,13 +16,13 @@ Incorrect:
|
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
18
|
// src/contexts/billing/infrastructure/persistence/drizzle-invoice.repository.ts
|
|
19
|
-
import type { IssueInvoiceBody } from '@/contexts/billing/presentation/http/issue-invoice.dto
|
|
19
|
+
import type { IssueInvoiceBody } from '@/contexts/billing/presentation/http/issue-invoice.dto';
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Correct:
|
|
23
23
|
|
|
24
24
|
```ts
|
|
25
|
-
import type { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository
|
|
25
|
+
import type { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
## Details
|
|
@@ -16,13 +16,13 @@ Incorrect:
|
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
18
|
// src/contexts/billing/presentation/http/issue-invoice.route.ts
|
|
19
|
-
import { DrizzleInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/drizzle-invoice.repository
|
|
19
|
+
import { DrizzleInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/drizzle-invoice.repository';
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Correct:
|
|
23
23
|
|
|
24
24
|
```ts
|
|
25
|
-
import { IssueInvoiceCommand } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command
|
|
25
|
+
import { IssueInvoiceCommand } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command';
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
## Details
|
|
@@ -6,17 +6,18 @@ Applies to: every linted file.
|
|
|
6
6
|
|
|
7
7
|
## Why
|
|
8
8
|
|
|
9
|
-
A dependency
|
|
9
|
+
A dependency is named by its port, never by what implements it. A handler that is given `KnexInvoiceRepository` is wired to one technology, cannot be given a fake, and makes the application layer depend on infrastructure through its own registration. In the declared style a class states what it depends on in its constructor, so the types of its parameters are held like the entries of a list.
|
|
10
10
|
|
|
11
11
|
## Reported
|
|
12
12
|
|
|
13
13
|
- a class named in a dependency list and imported from `infrastructure/` of a context
|
|
14
14
|
- a class named in a dependency list and imported from `test/fakes/` of a context
|
|
15
|
+
- in a declared-style project, in a role file: a class of either place that types a constructor parameter of a class carrying a declaration decorator without a list (`constructor(private readonly invoices: KnexInvoiceRepository) {}`)
|
|
15
16
|
|
|
16
17
|
Incorrect:
|
|
17
18
|
|
|
18
19
|
```ts
|
|
19
|
-
import { KnexInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/knex-invoice.repository
|
|
20
|
+
import { KnexInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/knex-invoice.repository';
|
|
20
21
|
|
|
21
22
|
@CommandHandler(IssueInvoiceCommand, [KnexInvoiceRepository, Clock])
|
|
22
23
|
export class IssueInvoiceHandler {}
|
|
@@ -25,7 +26,7 @@ export class IssueInvoiceHandler {}
|
|
|
25
26
|
Correct:
|
|
26
27
|
|
|
27
28
|
```ts
|
|
28
|
-
import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository
|
|
29
|
+
import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';
|
|
29
30
|
|
|
30
31
|
@CommandHandler(IssueInvoiceCommand, [InvoiceRepository, Clock])
|
|
31
32
|
export class IssueInvoiceHandler {}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ddd-ts-kit/eslint-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "AST-accurate ESLint rules for DDD and Clean Architecture in TypeScript: layer and context isolation, domain purity, clean code ordering.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|