pipework 0.270.0 → 0.272.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/CHANGELOG.md +8 -0
- package/REFERENCE.md +4 -2
- package/dist/infra/email/sns.d.ts +4 -0
- package/dist/infra/email/sns.d.ts.map +1 -1
- package/dist/infra/email/sns.js +1 -1
- package/dist/infra/email/sns.js.map +1 -1
- package/dist/infra/webhook/inbound.d.ts +2 -0
- package/dist/infra/webhook/inbound.d.ts.map +1 -1
- package/dist/infra/webhook/inbound.js +1 -1
- package/dist/infra/webhook/inbound.js.map +1 -1
- package/dist/lint/config.d.ts +4 -0
- package/dist/lint/config.d.ts.map +1 -1
- package/dist/lint/config.js +6 -0
- package/dist/lint/config.js.map +1 -1
- package/dist/lint/doctrine.d.ts +2 -0
- package/dist/lint/doctrine.d.ts.map +1 -1
- package/dist/lint/doctrine.js +11 -6
- package/dist/lint/doctrine.js.map +1 -1
- package/dist/lint/rules/doctrine.d.ts +3 -0
- package/dist/lint/rules/doctrine.d.ts.map +1 -0
- package/dist/lint/rules/doctrine.js +28 -0
- package/dist/lint/rules/doctrine.js.map +1 -0
- package/package.json +1 -1
- package/src/infra/email/sns.ts +5 -1
- package/src/infra/webhook/inbound.ts +3 -1
- package/src/lint/config.ts +6 -0
- package/src/lint/doctrine.ts +12 -7
- package/src/lint/rules/doctrine.ts +31 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.272.0
|
|
4
|
+
|
|
5
|
+
- **Added: inbound webhooks can opt out of cancel-on-disconnect** (#948). `webhook.defineInbound` and `mail.snsWebhook` hardcoded their route, so a receiver could not use the `.route(..., { cancelOnDisconnect: false })` option added in 0.269.0. Both configs now accept `cancelOnDisconnect`, passed to the route; `false` lets the handler run to completion and commit after the sender hangs up. The default is unchanged (`true`).
|
|
6
|
+
|
|
7
|
+
## 0.271.0
|
|
8
|
+
|
|
9
|
+
- **Added: the doctrine rules run in eslint** (#947). `define/prefer-pipe-define`, `define/no-raw-pgTable`, `define/brand-primary-key` and `define/use-traits` are now ESLint rules in the lint preset, on at `error`, with the same ids, lines and messages `pipework check`'s doctrine step reports, from one shared implementation. `pipework lint`, editors and plain `eslint` with the generated config see them per file; test files and `.d.ts` are not judged. Turn one off through `lint.extra` rules like any preset rule. `check` keeps its doctrine step, so a finding in a linted file may appear in both steps.
|
|
10
|
+
|
|
3
11
|
## 0.270.0
|
|
4
12
|
|
|
5
13
|
- **Added: check's steps run on their own, with JSON per violation** (#946). `pipework doctrine`, `pipework flow`, `pipework cardinality` and `pipework startup` each run one step of `check`, with `--format json` (a record of `rule`, `file`, `line`, `message` per violation and one entry per scanned file), `--output-file <path>`, the scope flags, and for the first three explicit file paths. `pipework check` gains `--format json` (one record per step) and `--only` / `--skip` by step name; a step not selected is reported as skipped, never passed. Each record's `reads` and REFERENCE.md say what a verdict depends on: doctrine and flow read only the file; cardinality cycles and the derived cap read every scanned file.
|
package/REFERENCE.md
CHANGED
|
@@ -605,6 +605,8 @@ Thrown for configuration problems — includes a suggestion for how to fix.
|
|
|
605
605
|
|
|
606
606
|
Generated module manifests declare `"lint": "pipework lint"` and `"type-check": "tsc --noEmit -p tsconfig.check.json"` (the config `check` type-checks with, which resolves sibling packages from source), so `pnpm -C <module> run lint --format json --output-file r.json <file>` gives `check`'s verdict for that file. `test` stays `vitest run`: `pipework test` provisions test databases and project filters that a bare `vitest run` in a module does not. Run `pipework sync` (or `pipework install`) to regenerate the manifests and `eslint.config.js`.
|
|
607
607
|
|
|
608
|
+
The lint preset also carries the four doctrine rules at `error`: `define/prefer-pipe-define`, `define/no-raw-pgTable`, `define/brand-primary-key` and `define/use-traits`. They are the same scans `pipework check`'s doctrine step runs (one implementation, same file, line and message), skip test files and `.d.ts`, and can be turned off through `lint.extra` rules like any preset rule. `check` keeps its doctrine step for files outside the lint globs, so a finding in a linted file can appear in both steps.
|
|
609
|
+
|
|
608
610
|
`lint.modules.<path>` overrides apply per file: the root `eslint.config.js` carries each module's `rules` and `configs` with their `files` and `ignores` globs prefixed by the module's path, so plain `eslint <file>` from the workspace root or a module directory agrees with `pipework check`.
|
|
609
611
|
|
|
610
612
|
### `pipework check` steps
|
|
@@ -1429,7 +1431,7 @@ Webhook namespace — inbound verification, outbound delivery with retries, HMAC
|
|
|
1429
1431
|
|
|
1430
1432
|
### `webhook.defineInbound`
|
|
1431
1433
|
|
|
1432
|
-
Defines an inbound webhook handler with signature verification and optional idempotency.
|
|
1434
|
+
Defines an inbound webhook handler with signature verification and optional idempotency. Config: `{ path, method?, verifier, parsePayload?, idempotencyKey?, cancelOnDisconnect? }`. `cancelOnDisconnect: false` lets the handler run to completion and commit after the sender hangs up (default `true`; see the route option of the same name), for senders that abandon slow deliveries and do not redeliver, e.g. GitHub at 10 s.
|
|
1433
1435
|
|
|
1434
1436
|
### `webhook.createOutbound`
|
|
1435
1437
|
|
|
@@ -1473,7 +1475,7 @@ Development provider that writes each message to a file instead of sending; refu
|
|
|
1473
1475
|
|
|
1474
1476
|
Inbound handler for SES bounce and complaint events delivered through SNS; suppresses the address.
|
|
1475
1477
|
|
|
1476
|
-
`mail.snsWebhook({ path, topicArns, region?, fetchCert?, confirm? })` returns a public POST handler for an SNS HTTP/S subscription to the SES event topic. `topicArns` is required: after the signature verifies, a message whose `TopicArn` is not listed is refused with 401, before a subscription is confirmed or an event processed (SNS signs every topic, so anyone could otherwise subscribe the endpoint to their own topic and forge bounces). Every message's signature (SignatureVersion 1 or 2) is verified against the certificate at `SigningCertURL`, which must be `https://sns.<region>.amazonaws.com/...pem` (any AWS region when `region` is omitted); otherwise the answer is 401. A `SubscriptionConfirmation` is confirmed by fetching its `SubscribeURL` (same host rule). A `Notification` with a permanent bounce or a complaint puts each recipient on `pipework_email_suppressions`; a transient or undetermined bounce is logged only. Each is the step `pipework/email:notification` with an `Email:bounce` or `Email:complaint` audit record (`entity_id` the message id when found by `provider_message_id`; `after` has `address`, `bounceType`, `suppressed`, `messageTraceId`, the trace of the original send). A suppression logs a warning `email suppressed`; the alert condition (#458) is not built yet. SES events delivered through EventBridge are not supported. `fetchCert` and `confirm` replace the default HTTP fetches (for tests).
|
|
1478
|
+
`mail.snsWebhook({ path, topicArns, region?, fetchCert?, confirm?, cancelOnDisconnect? })` returns a public POST handler for an SNS HTTP/S subscription to the SES event topic. `topicArns` is required: after the signature verifies, a message whose `TopicArn` is not listed is refused with 401, before a subscription is confirmed or an event processed (SNS signs every topic, so anyone could otherwise subscribe the endpoint to their own topic and forge bounces). Every message's signature (SignatureVersion 1 or 2) is verified against the certificate at `SigningCertURL`, which must be `https://sns.<region>.amazonaws.com/...pem` (any AWS region when `region` is omitted); otherwise the answer is 401. A `SubscriptionConfirmation` is confirmed by fetching its `SubscribeURL` (same host rule). A `Notification` with a permanent bounce or a complaint puts each recipient on `pipework_email_suppressions`; a transient or undetermined bounce is logged only. Each is the step `pipework/email:notification` with an `Email:bounce` or `Email:complaint` audit record (`entity_id` the message id when found by `provider_message_id`; `after` has `address`, `bounceType`, `suppressed`, `messageTraceId`, the trace of the original send). A suppression logs a warning `email suppressed`; the alert condition (#458) is not built yet. SES events delivered through EventBridge are not supported. `fetchCert` and `confirm` replace the default HTTP fetches (for tests). `cancelOnDisconnect: false` lets the handler finish and commit after SNS hangs up (default `true`).
|
|
1477
1479
|
|
|
1478
1480
|
### `mail.inbound`
|
|
1479
1481
|
|
|
@@ -9,6 +9,8 @@ export interface SnsWebhookConfig {
|
|
|
9
9
|
readonly fetchCert?: (url: string) => Promise<string>;
|
|
10
10
|
/** Confirms a subscription by GET of its SubscribeURL. Default: `fetch`. */
|
|
11
11
|
readonly confirm?: (url: string) => Promise<void>;
|
|
12
|
+
/** Default true. false lets the handler run to completion and commit after the sender hangs up, for senders that abandon slow deliveries and do not redeliver (GitHub at 10 s). */
|
|
13
|
+
readonly cancelOnDisconnect?: boolean;
|
|
12
14
|
}
|
|
13
15
|
type SnsMessage = Record<string, string | undefined>;
|
|
14
16
|
export declare function snsStringToSign(msg: SnsMessage): string;
|
|
@@ -18,6 +20,8 @@ export interface SnsHandlerConfig {
|
|
|
18
20
|
readonly region?: string;
|
|
19
21
|
readonly fetchCert?: (url: string) => Promise<string>;
|
|
20
22
|
readonly confirm?: (url: string) => Promise<void>;
|
|
23
|
+
/** Default true. false lets the handler run to completion and commit after the sender hangs up, for senders that abandon slow deliveries and do not redeliver (GitHub at 10 s). */
|
|
24
|
+
readonly cancelOnDisconnect?: boolean;
|
|
21
25
|
}
|
|
22
26
|
/**
|
|
23
27
|
* The shared SNS endpoint: parses the body, verifies the signature (SignatureVersion 1 or 2) against the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sns.d.ts","sourceRoot":"","sources":["../../../src/infra/email/sns.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAKxD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iJAAiJ;IACjJ,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,wHAAwH;IACxH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACrD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"sns.d.ts","sourceRoot":"","sources":["../../../src/infra/email/sns.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAKxD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iJAAiJ;IACjJ,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,wHAAwH;IACxH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACrD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,mLAAmL;IACnL,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;AAKpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAGvD;AAqED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,mLAAmL;IACnL,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAC3E,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAsD3C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAW9F"}
|
package/dist/infra/email/sns.js
CHANGED
|
@@ -128,7 +128,7 @@ export function snsHandler(config, onNotification) {
|
|
|
128
128
|
.public()
|
|
129
129
|
.rawBody()
|
|
130
130
|
.request()
|
|
131
|
-
.route('POST', config.path)
|
|
131
|
+
.route('POST', config.path, config.cancelOnDisconnect !== undefined ? { cancelOnDisconnect: config.cancelOnDisconnect } : undefined)
|
|
132
132
|
.fit(async ({ rawBody }) => {
|
|
133
133
|
let parsed;
|
|
134
134
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sns.js","sourceRoot":"","sources":["../../../src/infra/email/sns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"sns.js","sourceRoot":"","sources":["../../../src/infra/email/sns.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ export interface InboundWebhookConfig<TPayload> {
|
|
|
6
6
|
verifier: SignatureVerifier;
|
|
7
7
|
parsePayload?: (rawBody: Buffer) => TPayload;
|
|
8
8
|
idempotencyKey?: (payload: TPayload) => string;
|
|
9
|
+
/** Default true. false lets the handler run to completion and commit after the sender hangs up, for senders that abandon slow deliveries and do not redeliver (GitHub at 10 s). */
|
|
10
|
+
cancelOnDisconnect?: boolean;
|
|
9
11
|
}
|
|
10
12
|
export interface InboundWebhookContext<TPayload> {
|
|
11
13
|
payload: TPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../../../src/infra/webhook/inbound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAIpD,MAAM,WAAW,oBAAoB,CAAC,QAAQ;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAA;IAC5C,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../../../src/infra/webhook/inbound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAIpD,MAAM,WAAW,oBAAoB,CAAC,QAAQ;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAA;IAC5C,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAA;IAC9C,mLAAmL;IACnL,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,qBAAqB,CAAC,QAAQ;IAC7C,OAAO,EAAE,QAAQ,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;CACtD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,GAAG,OAAO,EACrD,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EACtC,OAAO,EAAE,CAAC,GAAG,EAAE,qBAAqB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAClE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAsB3C"}
|
|
@@ -7,7 +7,7 @@ export function defineInboundWebhook(config, handler) {
|
|
|
7
7
|
.public()
|
|
8
8
|
.rawBody()
|
|
9
9
|
.request()
|
|
10
|
-
.route(method, config.path)
|
|
10
|
+
.route(method, config.path, config.cancelOnDisconnect !== undefined ? { cancelOnDisconnect: config.cancelOnDisconnect } : undefined)
|
|
11
11
|
.fit(async ({ rawBody, request }) => {
|
|
12
12
|
if (!config.verifier.verify(rawBody, request.headers)) {
|
|
13
13
|
throw new UnauthorizedError('Webhook signature verification failed.\n\n' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../../src/infra/webhook/inbound.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../../src/infra/webhook/inbound.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAkB9D,MAAM,UAAU,oBAAoB,CAClC,MAAsC,EACtC,OAAmE;IAEnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAA;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAa,CAAC,CAAA;IAErG,OAAO,IAAI,OAAO,EAAE;SACjB,MAAM,EAAE;SACR,OAAO,EAAE;SACT,OAAO,EAAE;SACT,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SACnI,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,iBAAiB,CACzB,4CAA4C;gBAC5C,8DAA8D;gBAC9D,8EAA8E,CAC/E,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;QAE9B,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
package/dist/lint/config.d.ts
CHANGED
|
@@ -9,6 +9,10 @@ export declare const rules: {
|
|
|
9
9
|
readonly '@typescript-eslint/no-unnecessary-condition': "error";
|
|
10
10
|
readonly '@typescript-eslint/strict-boolean-expressions': "error";
|
|
11
11
|
readonly 'pipework/no-reexports': "error";
|
|
12
|
+
readonly 'define/prefer-pipe-define': "error";
|
|
13
|
+
readonly 'define/no-raw-pgTable': "error";
|
|
14
|
+
readonly 'define/brand-primary-key': "error";
|
|
15
|
+
readonly 'define/use-traits': "error";
|
|
12
16
|
};
|
|
13
17
|
export interface LintOptions {
|
|
14
18
|
readonly tsconfigRootDir?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;CAaR,CAAA;AAEV,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACzD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;CAC3C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,EAAE,CAgChE"}
|
package/dist/lint/config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import tseslint from '@typescript-eslint/eslint-plugin';
|
|
2
2
|
import tsparser from '@typescript-eslint/parser';
|
|
3
3
|
import { noReexports } from './rules/no-reexports.js';
|
|
4
|
+
import { doctrineRules } from './rules/doctrine.js';
|
|
4
5
|
export const rules = {
|
|
5
6
|
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
6
7
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
@@ -10,6 +11,10 @@ export const rules = {
|
|
|
10
11
|
'@typescript-eslint/no-unnecessary-condition': 'error',
|
|
11
12
|
'@typescript-eslint/strict-boolean-expressions': 'error',
|
|
12
13
|
'pipework/no-reexports': 'error',
|
|
14
|
+
'define/prefer-pipe-define': 'error',
|
|
15
|
+
'define/no-raw-pgTable': 'error',
|
|
16
|
+
'define/brand-primary-key': 'error',
|
|
17
|
+
'define/use-traits': 'error',
|
|
13
18
|
};
|
|
14
19
|
export function createLintConfig(config) {
|
|
15
20
|
const files = config?.include ?? ['src/**/*.ts', 'src/**/*.tsx'];
|
|
@@ -21,6 +26,7 @@ export function createLintConfig(config) {
|
|
|
21
26
|
const appliedPlugins = {
|
|
22
27
|
'@typescript-eslint': tseslint,
|
|
23
28
|
'pipework': { rules: { 'no-reexports': noReexports } },
|
|
29
|
+
'define': { rules: doctrineRules },
|
|
24
30
|
...config?.extraPlugins,
|
|
25
31
|
};
|
|
26
32
|
const blocks = [
|
package/dist/lint/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,kCAAkC,CAAA;AACvD,OAAO,QAAQ,MAAM,2BAA2B,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,kCAAkC,CAAA;AACvD,OAAO,QAAQ,MAAM,2BAA2B,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,mCAAmC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC3E,oCAAoC,EAAE,OAAO;IAC7C,yCAAyC,EAAE,OAAO;IAClD,wCAAwC,EAAE,OAAO;IACjD,kCAAkC,EAAE,OAAO;IAC3C,6CAA6C,EAAE,OAAO;IACtD,+CAA+C,EAAE,OAAO;IACxD,uBAAuB,EAAE,OAAO;IAChC,2BAA2B,EAAE,OAAO;IACpC,uBAAuB,EAAE,OAAO;IAChC,0BAA0B,EAAE,OAAO;IACnC,mBAAmB,EAAE,OAAO;CACpB,CAAA;AAWV,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,MAAM,KAAK,GAAG,MAAM,EAAE,OAAO,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;IAChE,MAAM,aAAa,GAA4B,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;IACvE,IAAI,MAAM,EAAE,eAAe,KAAK,SAAS,EAAE,CAAC;QAC1C,aAAa,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,eAAe,CAAA;IAC3D,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAA;IACxD,MAAM,cAAc,GAA4B;QAC9C,oBAAoB,EAAE,QAAQ;QAC9B,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE;QACtD,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;QAClC,GAAG,MAAM,EAAE,YAAY;KACxB,CAAA;IAED,MAAM,MAAM,GAAc;QACxB;YACE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;YACjB,eAAe,EAAE;gBACf,MAAM,EAAE,QAAQ;gBAChB,aAAa;aACd;YACD,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,YAAY;SACpB;QACD,GAAG,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;QAC/B;YACE,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;SAChE;KACF,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/dist/lint/doctrine.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export interface DoctrineResult {
|
|
|
11
11
|
readonly scannedFiles: readonly string[];
|
|
12
12
|
}
|
|
13
13
|
export declare function validateDoctrine(cwd: string, sourceFiles: readonly string[]): DoctrineResult;
|
|
14
|
+
/** The four doctrine scans over one file's text; shared by `check` and the eslint rules. */
|
|
15
|
+
export declare function doctrineViolations(file: string, content: string): DoctrineViolation[];
|
|
14
16
|
export declare function findSourceFiles(cwd: string, modulePaths: readonly string[]): string[];
|
|
15
17
|
/** A `.ts` or `.tsx` source: not a test file, not a declaration file. */
|
|
16
18
|
export declare function isSourceFileName(name: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctrine.d.ts","sourceRoot":"","sources":["../../src/lint/doctrine.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"doctrine.d.ts","sourceRoot":"","sources":["../../src/lint/doctrine.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAe5F;AAED,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAQrF;AAiGD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAUrF;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAItD"}
|
package/dist/lint/doctrine.js
CHANGED
|
@@ -8,17 +8,22 @@ export function validateDoctrine(cwd, sourceFiles) {
|
|
|
8
8
|
const abs = join(cwd, file);
|
|
9
9
|
if (!existsSync(abs))
|
|
10
10
|
continue;
|
|
11
|
-
const content = readFileSync(abs, 'utf-8');
|
|
12
|
-
const lines = content.split('\n');
|
|
13
11
|
scanned++;
|
|
14
12
|
scannedFiles.push(file);
|
|
15
|
-
|
|
16
|
-
checkRawPgTableImport(file, lines, violations);
|
|
17
|
-
checkUnbrandedPrimaryKeys(file, lines, violations);
|
|
18
|
-
checkHandWrittenTraitFields(file, lines, violations);
|
|
13
|
+
violations.push(...doctrineViolations(file, readFileSync(abs, 'utf-8')));
|
|
19
14
|
}
|
|
20
15
|
return { violations, scanned, scannedFiles };
|
|
21
16
|
}
|
|
17
|
+
/** The four doctrine scans over one file's text; shared by `check` and the eslint rules. */
|
|
18
|
+
export function doctrineViolations(file, content) {
|
|
19
|
+
const lines = content.split('\n');
|
|
20
|
+
const violations = [];
|
|
21
|
+
checkSchemaTableUsage(file, lines, violations);
|
|
22
|
+
checkRawPgTableImport(file, lines, violations);
|
|
23
|
+
checkUnbrandedPrimaryKeys(file, lines, violations);
|
|
24
|
+
checkHandWrittenTraitFields(file, lines, violations);
|
|
25
|
+
return violations;
|
|
26
|
+
}
|
|
22
27
|
const SCHEMA_TABLE_PATTERN = /\bschema\.table\s*\(/;
|
|
23
28
|
const PIPE_DEFINE_FILE_PATTERN = /\bpipe\.define\s*\(/;
|
|
24
29
|
function checkSchemaTableUsage(file, lines, violations) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctrine.js","sourceRoot":"","sources":["../../src/lint/doctrine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAgB1C,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,WAA8B;IAC1E,MAAM,UAAU,GAAwB,EAAE,CAAA;IAC1C,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,YAAY,GAAa,EAAE,CAAA;IAEjC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAE9B,
|
|
1
|
+
{"version":3,"file":"doctrine.js","sourceRoot":"","sources":["../../src/lint/doctrine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctrine.d.ts","sourceRoot":"","sources":["../../../src/lint/rules/doctrine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AA2BlC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAEzD,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { basename } from 'node:path';
|
|
2
|
+
import { doctrineViolations, isSourceFileName } from '../doctrine.js';
|
|
3
|
+
const RULES = ['prefer-pipe-define', 'no-raw-pgTable', 'brand-primary-key', 'use-traits'];
|
|
4
|
+
function doctrineRule(name) {
|
|
5
|
+
const id = `define/${name}`;
|
|
6
|
+
return {
|
|
7
|
+
meta: {
|
|
8
|
+
type: 'problem',
|
|
9
|
+
docs: { description: `Doctrine rule ${id}; same scan as the doctrine step of pipework check.` },
|
|
10
|
+
schema: [],
|
|
11
|
+
},
|
|
12
|
+
create(context) {
|
|
13
|
+
return {
|
|
14
|
+
'Program:exit'() {
|
|
15
|
+
if (!isSourceFileName(basename(context.filename)))
|
|
16
|
+
return;
|
|
17
|
+
for (const v of doctrineViolations(context.filename, context.sourceCode.text)) {
|
|
18
|
+
if (v.rule !== id)
|
|
19
|
+
continue;
|
|
20
|
+
context.report({ loc: { line: v.line, column: 0 }, message: v.message });
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export const doctrineRules = Object.fromEntries(RULES.map(name => [name, doctrineRule(name)]));
|
|
28
|
+
//# sourceMappingURL=doctrine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctrine.js","sourceRoot":"","sources":["../../../src/lint/rules/doctrine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAErE,MAAM,KAAK,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,CAAU,CAAA;AAElG,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,EAAE,GAAG,UAAU,IAAI,EAAE,CAAA;IAC3B,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,qDAAqD,EAAE;YAC/F,MAAM,EAAE,EAAE;SACX;QACD,MAAM,CAAC,OAAO;YACZ,OAAO;gBACL,cAAc;oBACZ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;wBAAE,OAAM;oBACzD,KAAK,MAAM,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC9E,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE;4BAAE,SAAQ;wBAC3B,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;oBAC1E,CAAC;gBACH,CAAC;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAoC,MAAM,CAAC,WAAW,CAC9E,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAC9C,CAAA"}
|
package/package.json
CHANGED
package/src/infra/email/sns.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface SnsWebhookConfig {
|
|
|
19
19
|
readonly fetchCert?: (url: string) => Promise<string>
|
|
20
20
|
/** Confirms a subscription by GET of its SubscribeURL. Default: `fetch`. */
|
|
21
21
|
readonly confirm?: (url: string) => Promise<void>
|
|
22
|
+
/** Default true. false lets the handler run to completion and commit after the sender hangs up, for senders that abandon slow deliveries and do not redeliver (GitHub at 10 s). */
|
|
23
|
+
readonly cancelOnDisconnect?: boolean
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
type SnsMessage = Record<string, string | undefined>
|
|
@@ -104,6 +106,8 @@ export interface SnsHandlerConfig {
|
|
|
104
106
|
readonly region?: string
|
|
105
107
|
readonly fetchCert?: (url: string) => Promise<string>
|
|
106
108
|
readonly confirm?: (url: string) => Promise<void>
|
|
109
|
+
/** Default true. false lets the handler run to completion and commit after the sender hangs up, for senders that abandon slow deliveries and do not redeliver (GitHub at 10 s). */
|
|
110
|
+
readonly cancelOnDisconnect?: boolean
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
/**
|
|
@@ -145,7 +149,7 @@ export function snsHandler(
|
|
|
145
149
|
.public()
|
|
146
150
|
.rawBody()
|
|
147
151
|
.request()
|
|
148
|
-
.route('POST', config.path)
|
|
152
|
+
.route('POST', config.path, config.cancelOnDisconnect !== undefined ? { cancelOnDisconnect: config.cancelOnDisconnect } : undefined)
|
|
149
153
|
.fit(async ({ rawBody }) => {
|
|
150
154
|
let parsed: unknown
|
|
151
155
|
try {
|
|
@@ -9,6 +9,8 @@ export interface InboundWebhookConfig<TPayload> {
|
|
|
9
9
|
verifier: SignatureVerifier
|
|
10
10
|
parsePayload?: (rawBody: Buffer) => TPayload
|
|
11
11
|
idempotencyKey?: (payload: TPayload) => string
|
|
12
|
+
/** Default true. false lets the handler run to completion and commit after the sender hangs up, for senders that abandon slow deliveries and do not redeliver (GitHub at 10 s). */
|
|
13
|
+
cancelOnDisconnect?: boolean
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
export interface InboundWebhookContext<TPayload> {
|
|
@@ -28,7 +30,7 @@ export function defineInboundWebhook<TPayload = unknown>(
|
|
|
28
30
|
.public()
|
|
29
31
|
.rawBody()
|
|
30
32
|
.request()
|
|
31
|
-
.route(method, config.path)
|
|
33
|
+
.route(method, config.path, config.cancelOnDisconnect !== undefined ? { cancelOnDisconnect: config.cancelOnDisconnect } : undefined)
|
|
32
34
|
.fit(async ({ rawBody, request }) => {
|
|
33
35
|
if (!config.verifier.verify(rawBody, request.headers)) {
|
|
34
36
|
throw new UnauthorizedError(
|
package/src/lint/config.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import tseslint from '@typescript-eslint/eslint-plugin'
|
|
2
2
|
import tsparser from '@typescript-eslint/parser'
|
|
3
3
|
import { noReexports } from './rules/no-reexports.js'
|
|
4
|
+
import { doctrineRules } from './rules/doctrine.js'
|
|
4
5
|
|
|
5
6
|
export const rules = {
|
|
6
7
|
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
@@ -11,6 +12,10 @@ export const rules = {
|
|
|
11
12
|
'@typescript-eslint/no-unnecessary-condition': 'error',
|
|
12
13
|
'@typescript-eslint/strict-boolean-expressions': 'error',
|
|
13
14
|
'pipework/no-reexports': 'error',
|
|
15
|
+
'define/prefer-pipe-define': 'error',
|
|
16
|
+
'define/no-raw-pgTable': 'error',
|
|
17
|
+
'define/brand-primary-key': 'error',
|
|
18
|
+
'define/use-traits': 'error',
|
|
14
19
|
} as const
|
|
15
20
|
|
|
16
21
|
export interface LintOptions {
|
|
@@ -33,6 +38,7 @@ export function createLintConfig(config?: LintOptions): unknown[] {
|
|
|
33
38
|
const appliedPlugins: Record<string, unknown> = {
|
|
34
39
|
'@typescript-eslint': tseslint,
|
|
35
40
|
'pipework': { rules: { 'no-reexports': noReexports } },
|
|
41
|
+
'define': { rules: doctrineRules },
|
|
36
42
|
...config?.extraPlugins,
|
|
37
43
|
}
|
|
38
44
|
|
package/src/lint/doctrine.ts
CHANGED
|
@@ -24,20 +24,25 @@ export function validateDoctrine(cwd: string, sourceFiles: readonly string[]): D
|
|
|
24
24
|
const abs = join(cwd, file)
|
|
25
25
|
if (!existsSync(abs)) continue
|
|
26
26
|
|
|
27
|
-
const content = readFileSync(abs, 'utf-8')
|
|
28
|
-
const lines = content.split('\n')
|
|
29
27
|
scanned++
|
|
30
28
|
scannedFiles.push(file)
|
|
31
|
-
|
|
32
|
-
checkSchemaTableUsage(file, lines, violations)
|
|
33
|
-
checkRawPgTableImport(file, lines, violations)
|
|
34
|
-
checkUnbrandedPrimaryKeys(file, lines, violations)
|
|
35
|
-
checkHandWrittenTraitFields(file, lines, violations)
|
|
29
|
+
violations.push(...doctrineViolations(file, readFileSync(abs, 'utf-8')))
|
|
36
30
|
}
|
|
37
31
|
|
|
38
32
|
return { violations, scanned, scannedFiles }
|
|
39
33
|
}
|
|
40
34
|
|
|
35
|
+
/** The four doctrine scans over one file's text; shared by `check` and the eslint rules. */
|
|
36
|
+
export function doctrineViolations(file: string, content: string): DoctrineViolation[] {
|
|
37
|
+
const lines = content.split('\n')
|
|
38
|
+
const violations: DoctrineViolation[] = []
|
|
39
|
+
checkSchemaTableUsage(file, lines, violations)
|
|
40
|
+
checkRawPgTableImport(file, lines, violations)
|
|
41
|
+
checkUnbrandedPrimaryKeys(file, lines, violations)
|
|
42
|
+
checkHandWrittenTraitFields(file, lines, violations)
|
|
43
|
+
return violations
|
|
44
|
+
}
|
|
45
|
+
|
|
41
46
|
const SCHEMA_TABLE_PATTERN = /\bschema\.table\s*\(/
|
|
42
47
|
const PIPE_DEFINE_FILE_PATTERN = /\bpipe\.define\s*\(/
|
|
43
48
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { basename } from 'node:path'
|
|
2
|
+
import type { Rule } from 'eslint'
|
|
3
|
+
import { doctrineViolations, isSourceFileName } from '../doctrine.js'
|
|
4
|
+
|
|
5
|
+
const RULES = ['prefer-pipe-define', 'no-raw-pgTable', 'brand-primary-key', 'use-traits'] as const
|
|
6
|
+
|
|
7
|
+
function doctrineRule(name: string): Rule.RuleModule {
|
|
8
|
+
const id = `define/${name}`
|
|
9
|
+
return {
|
|
10
|
+
meta: {
|
|
11
|
+
type: 'problem',
|
|
12
|
+
docs: { description: `Doctrine rule ${id}; same scan as the doctrine step of pipework check.` },
|
|
13
|
+
schema: [],
|
|
14
|
+
},
|
|
15
|
+
create(context) {
|
|
16
|
+
return {
|
|
17
|
+
'Program:exit'() {
|
|
18
|
+
if (!isSourceFileName(basename(context.filename))) return
|
|
19
|
+
for (const v of doctrineViolations(context.filename, context.sourceCode.text)) {
|
|
20
|
+
if (v.rule !== id) continue
|
|
21
|
+
context.report({ loc: { line: v.line, column: 0 }, message: v.message })
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const doctrineRules: Record<string, Rule.RuleModule> = Object.fromEntries(
|
|
30
|
+
RULES.map(name => [name, doctrineRule(name)]),
|
|
31
|
+
)
|