@bgord/bun 1.4.6 → 1.4.8

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.
Files changed (60) hide show
  1. package/dist/healthcheck.service.d.ts.map +1 -1
  2. package/dist/healthcheck.service.js +2 -1
  3. package/dist/healthcheck.service.js.map +1 -1
  4. package/dist/index.d.ts +1 -3
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/logger-noop.adapter.d.ts +1 -0
  9. package/dist/logger-noop.adapter.d.ts.map +1 -1
  10. package/dist/logger-noop.adapter.js +3 -0
  11. package/dist/logger-noop.adapter.js.map +1 -1
  12. package/dist/logger-winston-local.adapter.d.ts.map +1 -1
  13. package/dist/logger-winston-local.adapter.js +1 -0
  14. package/dist/logger-winston-local.adapter.js.map +1 -1
  15. package/dist/logger-winston-production.adapter.d.ts +0 -2
  16. package/dist/logger-winston-production.adapter.d.ts.map +1 -1
  17. package/dist/logger-winston-production.adapter.js +3 -6
  18. package/dist/logger-winston-production.adapter.js.map +1 -1
  19. package/dist/logger-winston.adapter.d.ts +4 -0
  20. package/dist/logger-winston.adapter.d.ts.map +1 -1
  21. package/dist/logger-winston.adapter.js +5 -0
  22. package/dist/logger-winston.adapter.js.map +1 -1
  23. package/dist/logger.port.d.ts +2 -0
  24. package/dist/logger.port.d.ts.map +1 -1
  25. package/dist/logger.port.js.map +1 -1
  26. package/dist/prerequisites/log-file.d.ts +2 -2
  27. package/dist/prerequisites/log-file.d.ts.map +1 -1
  28. package/dist/prerequisites/log-file.js +5 -3
  29. package/dist/prerequisites/log-file.js.map +1 -1
  30. package/dist/shield-noop.adapter.d.ts +5 -0
  31. package/dist/shield-noop.adapter.d.ts.map +1 -0
  32. package/dist/{shield-captcha-noop.adapter.js → shield-noop.adapter.js} +2 -2
  33. package/dist/shield-noop.adapter.js.map +1 -0
  34. package/dist/shield-rate-limit.adapter.d.ts +2 -2
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +2 -2
  37. package/readme.md +1 -3
  38. package/src/healthcheck.service.ts +4 -1
  39. package/src/index.ts +1 -3
  40. package/src/logger-noop.adapter.ts +4 -0
  41. package/src/logger-winston-local.adapter.ts +1 -0
  42. package/src/logger-winston-production.adapter.ts +7 -10
  43. package/src/logger-winston.adapter.ts +10 -0
  44. package/src/logger.port.ts +3 -0
  45. package/src/prerequisites/log-file.ts +8 -6
  46. package/src/{shield-captcha-noop.adapter.ts → shield-noop.adapter.ts} +1 -1
  47. package/src/shield-rate-limit.adapter.ts +2 -2
  48. package/dist/shield-api-key-noop.adapter.d.ts +0 -5
  49. package/dist/shield-api-key-noop.adapter.d.ts.map +0 -1
  50. package/dist/shield-api-key-noop.adapter.js +0 -7
  51. package/dist/shield-api-key-noop.adapter.js.map +0 -1
  52. package/dist/shield-captcha-noop.adapter.d.ts +0 -5
  53. package/dist/shield-captcha-noop.adapter.d.ts.map +0 -1
  54. package/dist/shield-captcha-noop.adapter.js.map +0 -1
  55. package/dist/shield-rate-limit-noop.adapter.d.ts +0 -5
  56. package/dist/shield-rate-limit-noop.adapter.d.ts.map +0 -1
  57. package/dist/shield-rate-limit-noop.adapter.js +0 -7
  58. package/dist/shield-rate-limit-noop.adapter.js.map +0 -1
  59. package/src/shield-api-key-noop.adapter.ts +0 -8
  60. package/src/shield-rate-limit-noop.adapter.ts +0 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/bun",
3
- "version": "1.4.6",
3
+ "version": "1.4.8",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "author": "Bartosz Gordon",
@@ -28,7 +28,7 @@
28
28
  "@types/nodemailer": "7.0.4",
29
29
  "@types/yazl": "3.3.0",
30
30
  "cspell": "9.4.0",
31
- "knip": "5.73.0",
31
+ "knip": "5.73.3",
32
32
  "lefthook": "2.0.9",
33
33
  "only-allow": "1.2.2",
34
34
  "sharp": "0.34.5",
package/readme.md CHANGED
@@ -237,14 +237,12 @@ src/
237
237
  ├── secret-manager.port.ts
238
238
  ├── secret.vo.ts
239
239
  ├── setup.service.ts
240
- ├── shield-api-key-noop.adapter.ts
241
240
  ├── shield-api-key.adapter.ts
242
241
  ├── shield-auth.middleware.ts
243
242
  ├── shield-captcha-hcaptcha-local.adapter.ts
244
243
  ├── shield-captcha-hcaptcha.adapter.ts
245
- ├── shield-captcha-noop.adapter.ts
246
244
  ├── shield-captcha-recaptcha.adapter.ts
247
- ├── shield-rate-limit-noop.adapter.ts
245
+ ├── shield-noop.adapter.ts
248
246
  ├── shield-rate-limit.adapter.ts
249
247
  ├── shield.port.ts
250
248
  ├── simulated-error.middleware.ts
@@ -5,6 +5,7 @@ import type { ClockPort } from "./clock.port";
5
5
  import type { JsonFileReaderPort } from "./json-file-reader.port";
6
6
  import type { LoggerPort } from "./logger.port";
7
7
  import { MemoryConsumption } from "./memory-consumption.service";
8
+ import { PrerequisiteSelf } from "./prerequisites/self";
8
9
  import * as prereqs from "./prerequisites.service";
9
10
  import { Uptime, type UptimeResultType } from "./uptime.service";
10
11
 
@@ -30,7 +31,9 @@ export class Healthcheck {
30
31
 
31
32
  const details: HealthcheckResultType["details"][number][] = [];
32
33
 
33
- for (const prerequisite of prerequisites) {
34
+ for (const prerequisite of [new PrerequisiteSelf({ label: "self" }), ...prerequisites].filter(
35
+ (prerequisite) => prerequisite.kind !== "port",
36
+ )) {
34
37
  details.push({ label: prerequisite.label, outcome: await prerequisite.verify(deps.Clock) });
35
38
  }
36
39
 
package/src/index.ts CHANGED
@@ -160,14 +160,12 @@ export * from "./secret-manager-noop.adapter";
160
160
  export * from "./setup.service";
161
161
  export * from "./shield.port";
162
162
  export * from "./shield-api-key.adapter";
163
- export * from "./shield-api-key-noop.adapter";
164
163
  export * from "./shield-auth.middleware";
165
164
  export * from "./shield-captcha-hcaptcha.adapter";
166
165
  export * from "./shield-captcha-hcaptcha-local.adapter";
167
- export * from "./shield-captcha-noop.adapter";
168
166
  export * from "./shield-captcha-recaptcha.adapter";
167
+ export * from "./shield-noop.adapter";
169
168
  export * from "./shield-rate-limit.adapter";
170
- export * from "./shield-rate-limit-noop.adapter";
171
169
  export * from "./simulated-error.middleware";
172
170
  export * from "./slower.middleware";
173
171
  export * from "./static-files.service";
@@ -10,4 +10,8 @@ export class LoggerNoopAdapter implements LoggerPort {
10
10
  silly: LoggerPort["silly"] = (_log) => {};
11
11
 
12
12
  setSilent: LoggerPort["setSilent"] = (_silent) => {};
13
+
14
+ getFilePath() {
15
+ return null;
16
+ }
13
17
  }
@@ -16,6 +16,7 @@ export class LoggerWinstonLocalAdapter {
16
16
  level,
17
17
  redactor: this.config.redactor,
18
18
  formats: [winston.format.prettyPrint()],
19
+ filePath: null,
19
20
  });
20
21
  }
21
22
  }
@@ -13,15 +13,15 @@ type LoggerWinstonProductionAdapterConfigType = {
13
13
  };
14
14
 
15
15
  export class LoggerWinstonProductionAdapter {
16
- readonly prodLogFile: string;
17
-
18
- constructor(private readonly config: LoggerWinstonProductionAdapterConfigType) {
19
- this.prodLogFile = this.createProdLogFile();
20
- }
16
+ constructor(private readonly config: LoggerWinstonProductionAdapterConfigType) {}
21
17
 
22
18
  create(level: LogLevelEnum): LoggerPort {
19
+ const filePath = tools.FilePathAbsolute.fromString(
20
+ `/var/log/${this.config.app}-${NodeEnvironmentEnum.production}.log`,
21
+ );
22
+
23
23
  const file = new winston.transports.File({
24
- filename: this.prodLogFile,
24
+ filename: filePath.get(),
25
25
  maxsize: tools.Size.fromMB(100).toBytes(),
26
26
  maxFiles: 3,
27
27
  tailable: true,
@@ -38,10 +38,7 @@ export class LoggerWinstonProductionAdapter {
38
38
  : undefined,
39
39
  ].filter((adapter) => adapter !== undefined),
40
40
  redactor: this.config.redactor,
41
+ filePath,
41
42
  });
42
43
  }
43
-
44
- private createProdLogFile() {
45
- return `/var/log/${this.config.app}-${NodeEnvironmentEnum.production}.log`;
46
- }
47
44
  }
@@ -1,3 +1,4 @@
1
+ import type * as tools from "@bgord/tools";
1
2
  import * as winston from "winston";
2
3
  import { type LogAppType, type LoggerPort, LogLevelEnum } from "./logger.port";
3
4
  import type { NodeEnvironmentEnum } from "./node-env.vo";
@@ -10,11 +11,14 @@ type WinstonLoggerOptions = {
10
11
  redactor: RedactorPort;
11
12
  formats?: winston.Logform.Format[];
12
13
  transports?: winston.transport[];
14
+ filePath: tools.FilePathAbsolute | null;
13
15
  };
14
16
 
15
17
  export class LoggerWinstonAdapter implements LoggerPort {
16
18
  private readonly logger: winston.Logger;
17
19
 
20
+ private readonly filePath: tools.FilePathAbsolute | null;
21
+
18
22
  constructor(options: WinstonLoggerOptions) {
19
23
  const format = winston.format.combine(
20
24
  winston.format((info) => options.redactor.redact(info))(),
@@ -33,6 +37,8 @@ export class LoggerWinstonAdapter implements LoggerPort {
33
37
  format,
34
38
  transports: [new winston.transports.Console(), ...(options.transports ?? [])],
35
39
  });
40
+
41
+ this.filePath = options.filePath;
36
42
  }
37
43
 
38
44
  warn: LoggerPort["warn"] = (log) => this.logger.log({ level: LogLevelEnum.warn, ...log });
@@ -46,4 +52,8 @@ export class LoggerWinstonAdapter implements LoggerPort {
46
52
  setSilent: LoggerPort["setSilent"] = (silent) => {
47
53
  this.logger.silent = silent;
48
54
  };
55
+
56
+ getFilePath() {
57
+ return this.filePath;
58
+ }
49
59
  }
@@ -1,3 +1,4 @@
1
+ import type * as tools from "@bgord/tools";
1
2
  import { z } from "zod/v4";
2
3
  import type { CorrelationIdType } from "./correlation-id.vo";
3
4
  import type { NodeEnvironmentEnum } from "./node-env.vo";
@@ -58,4 +59,6 @@ export interface LoggerPort {
58
59
  silly(entry: Omit<LogCoreType, AdapterInjectedFields>): void;
59
60
 
60
61
  setSilent(silent: boolean): void;
62
+
63
+ getFilePath(): tools.FilePathAbsolute | null;
61
64
  }
@@ -1,6 +1,6 @@
1
1
  import * as tools from "@bgord/tools";
2
2
  import type { ClockPort } from "../clock.port";
3
- import type { LoggerWinstonProductionAdapter } from "../logger-winston-production.adapter";
3
+ import type { LoggerPort } from "../logger.port";
4
4
  import * as prereqs from "../prerequisites.service";
5
5
 
6
6
  export class PrerequisiteLogFile implements prereqs.Prerequisite {
@@ -8,9 +8,9 @@ export class PrerequisiteLogFile implements prereqs.Prerequisite {
8
8
  readonly label: prereqs.PrerequisiteLabelType;
9
9
  readonly enabled?: boolean = true;
10
10
 
11
- private readonly Logger: LoggerWinstonProductionAdapter;
11
+ private readonly Logger: LoggerPort;
12
12
 
13
- constructor(config: prereqs.PrerequisiteConfigType & { Logger: LoggerWinstonProductionAdapter }) {
13
+ constructor(config: prereqs.PrerequisiteConfigType & { Logger: LoggerPort }) {
14
14
  this.label = config.label;
15
15
  this.enabled = config.enabled === undefined ? true : config.enabled;
16
16
 
@@ -23,11 +23,13 @@ export class PrerequisiteLogFile implements prereqs.Prerequisite {
23
23
  if (!this.enabled) return prereqs.Verification.undetermined(stopwatch.stop());
24
24
 
25
25
  try {
26
- const path = this.Logger.prodLogFile;
27
- const result = await Bun.file(path).exists();
26
+ const path = this.Logger.getFilePath();
27
+ if (!path) return prereqs.Verification.undetermined(stopwatch.stop());
28
+
29
+ const result = await Bun.file(path.get()).exists();
28
30
 
29
31
  if (result) return prereqs.Verification.success(stopwatch.stop());
30
- return prereqs.Verification.failure(stopwatch.stop(), { message: `Missing file: ${path}` });
32
+ return prereqs.Verification.failure(stopwatch.stop(), { message: `Missing file: ${path.get()}` });
31
33
  } catch (error) {
32
34
  return prereqs.Verification.failure(stopwatch.stop(), error as Error);
33
35
  }
@@ -1,6 +1,6 @@
1
1
  import { createMiddleware } from "hono/factory";
2
2
  import type { ShieldPort } from "./shield.port";
3
3
 
4
- export class ShieldCaptchaNoopAdapter implements ShieldPort {
4
+ export class ShieldNoopAdapter implements ShieldPort {
5
5
  verify = createMiddleware(async (_c, next) => next());
6
6
  }
@@ -7,7 +7,7 @@ import type { RateLimitStorePort } from "./rate-limit-store.port";
7
7
  import type { ShieldPort } from "./shield.port";
8
8
 
9
9
  type SubjectResolver = (c: Context) => string;
10
- type RateLimitShieldOptionsType = { enabled: boolean; store: RateLimitStorePort; subject: SubjectResolver };
10
+ type ShieldRateLimitOptionsType = { enabled: boolean; store: RateLimitStorePort; subject: SubjectResolver };
11
11
 
12
12
  type Dependencies = { Clock: ClockPort };
13
13
 
@@ -18,7 +18,7 @@ export const TooManyRequestsError = new HTTPException(429, { message: "app.too_m
18
18
 
19
19
  export class ShieldRateLimitAdapter implements ShieldPort {
20
20
  constructor(
21
- private readonly options: RateLimitShieldOptionsType,
21
+ private readonly options: ShieldRateLimitOptionsType,
22
22
  private readonly deps: Dependencies,
23
23
  ) {}
24
24
 
@@ -1,5 +0,0 @@
1
- import type { ShieldPort } from "./shield.port";
2
- export declare class ShieldApiKeyAdapterNoop implements ShieldPort {
3
- verify: import("hono").MiddlewareHandler<any, string, {}, Response>;
4
- }
5
- //# sourceMappingURL=shield-api-key-noop.adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-api-key-noop.adapter.d.ts","sourceRoot":"","sources":["../src/shield-api-key-noop.adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,qBAAa,uBAAwB,YAAW,UAAU;IACxD,MAAM,8DAEH;CACJ"}
@@ -1,7 +0,0 @@
1
- import { createMiddleware } from "hono/factory";
2
- export class ShieldApiKeyAdapterNoop {
3
- verify = createMiddleware(async (_c, next) => {
4
- return next();
5
- });
6
- }
7
- //# sourceMappingURL=shield-api-key-noop.adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-api-key-noop.adapter.js","sourceRoot":"","sources":["../src/shield-api-key-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,OAAO,uBAAuB;IAClC,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;QAC3C,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;CACJ"}
@@ -1,5 +0,0 @@
1
- import type { ShieldPort } from "./shield.port";
2
- export declare class ShieldCaptchaNoopAdapter implements ShieldPort {
3
- verify: import("hono").MiddlewareHandler<any, string, {}, Response>;
4
- }
5
- //# sourceMappingURL=shield-captcha-noop.adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-captcha-noop.adapter.d.ts","sourceRoot":"","sources":["../src/shield-captcha-noop.adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,qBAAa,wBAAyB,YAAW,UAAU;IACzD,MAAM,8DAAgD;CACvD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-captcha-noop.adapter.js","sourceRoot":"","sources":["../src/shield-captcha-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,OAAO,wBAAwB;IACnC,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;CACvD"}
@@ -1,5 +0,0 @@
1
- import type { ShieldPort } from "./shield.port";
2
- export declare class ShieldRateLimitNoopAdapter implements ShieldPort {
3
- verify: import("hono").MiddlewareHandler<any, string, {}, Response>;
4
- }
5
- //# sourceMappingURL=shield-rate-limit-noop.adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-rate-limit-noop.adapter.d.ts","sourceRoot":"","sources":["../src/shield-rate-limit-noop.adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,qBAAa,0BAA2B,YAAW,UAAU;IAC3D,MAAM,8DAEH;CACJ"}
@@ -1,7 +0,0 @@
1
- import { createMiddleware } from "hono/factory";
2
- export class ShieldRateLimitNoopAdapter {
3
- verify = createMiddleware(async (_c, next) => {
4
- return next();
5
- });
6
- }
7
- //# sourceMappingURL=shield-rate-limit-noop.adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-rate-limit-noop.adapter.js","sourceRoot":"","sources":["../src/shield-rate-limit-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,OAAO,0BAA0B;IACrC,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;QAC3C,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;CACJ"}
@@ -1,8 +0,0 @@
1
- import { createMiddleware } from "hono/factory";
2
- import type { ShieldPort } from "./shield.port";
3
-
4
- export class ShieldApiKeyAdapterNoop implements ShieldPort {
5
- verify = createMiddleware(async (_c, next) => {
6
- return next();
7
- });
8
- }
@@ -1,8 +0,0 @@
1
- import { createMiddleware } from "hono/factory";
2
- import type { ShieldPort } from "./shield.port";
3
-
4
- export class ShieldRateLimitNoopAdapter implements ShieldPort {
5
- verify = createMiddleware(async (_c, next) => {
6
- return next();
7
- });
8
- }