@onroad/core 4.0.0-alpha.15 → 4.0.0-alpha.17
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 +64 -0
- package/dist/database/ConnectionManager.d.ts +1 -0
- package/dist/database/ConnectionManager.d.ts.map +1 -1
- package/dist/database/ConnectionManager.js +5 -1
- package/dist/database/ConnectionManager.js.map +1 -1
- package/dist/filters/builtins/JwtFilter.d.ts +6 -3
- package/dist/filters/builtins/JwtFilter.d.ts.map +1 -1
- package/dist/filters/builtins/JwtFilter.js +25 -3
- package/dist/filters/builtins/JwtFilter.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -930,6 +930,70 @@ export class UserRepository extends BaseRepository<User> {
|
|
|
930
930
|
|
|
931
931
|
---
|
|
932
932
|
|
|
933
|
+
### `import type` with relationship decorators
|
|
934
|
+
|
|
935
|
+
TypeScript's `import type` is erased at compile time. If you use `import type { Foo }` and then reference `Foo` as a **runtime value** inside a decorator like `@HasMany(() => Foo, ...)`, the compiled JavaScript will throw `ReferenceError: Foo is not defined` because the import was stripped.
|
|
936
|
+
|
|
937
|
+
```ts
|
|
938
|
+
// ❌ Wrong — import type is erased, decorator callback fails at runtime
|
|
939
|
+
import type { CampoDeVerificacao } from "./CampoDeVerificacao.js"
|
|
940
|
+
|
|
941
|
+
@Entity("caderno", { engine: "sequelize" })
|
|
942
|
+
export class CadernoDeVerificacao {
|
|
943
|
+
@HasMany(() => CampoDeVerificacao, "cadernoId") // 💥 ReferenceError
|
|
944
|
+
campos!: CampoDeVerificacao[]
|
|
945
|
+
}
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
Fix: use a regular `import` for any class referenced inside a decorator callback:
|
|
949
|
+
|
|
950
|
+
```ts
|
|
951
|
+
// ✅ Correct — regular import keeps the binding at runtime
|
|
952
|
+
import { CampoDeVerificacao } from "./CampoDeVerificacao.js"
|
|
953
|
+
|
|
954
|
+
@Entity("caderno", { engine: "sequelize" })
|
|
955
|
+
export class CadernoDeVerificacao {
|
|
956
|
+
@HasMany(() => CampoDeVerificacao, "cadernoId")
|
|
957
|
+
campos!: CampoDeVerificacao[]
|
|
958
|
+
}
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
> **Tip:** `import type` is safe for type annotations and generics (`extends AbstractService<Foo>`), but never for decorator arguments, `instanceof`, or any expression evaluated at runtime.
|
|
962
|
+
|
|
963
|
+
---
|
|
964
|
+
|
|
965
|
+
### `emitDecoratorMetadata` causes TDZ errors with circular entity imports
|
|
966
|
+
|
|
967
|
+
When `emitDecoratorMetadata: true` is set in `tsconfig.json`, TypeScript emits `__metadata("design:type", CampoDeVerificacao)` for decorated properties. This accesses the imported class **at class definition time**. If two entities import each other (circular dependency), ESM module evaluation order causes a **Temporal Dead Zone (TDZ)** error:
|
|
968
|
+
|
|
969
|
+
```
|
|
970
|
+
ReferenceError: Cannot access 'CampoDeVerificacao' before initialization
|
|
971
|
+
```
|
|
972
|
+
|
|
973
|
+
The `@HasMany(() => Foo, ...)` arrow function is lazy (only called later by `wireSequelizeAssociations`), but `__metadata("design:type", Foo)` is **eager** — it runs during class definition.
|
|
974
|
+
|
|
975
|
+
```jsonc
|
|
976
|
+
// ❌ Wrong — causes TDZ crash in circular ESM imports
|
|
977
|
+
{
|
|
978
|
+
"compilerOptions": {
|
|
979
|
+
"experimentalDecorators": true,
|
|
980
|
+
"emitDecoratorMetadata": true // 💥
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
```
|
|
984
|
+
|
|
985
|
+
Fix: disable `emitDecoratorMetadata`. @onroad/core uses only custom metadata keys (`METADATA_KEY.ENTITY`, `ENTITY_COLUMNS`, etc.) and does **not** rely on `design:type`, `design:paramtypes`, or `design:returntype`.
|
|
986
|
+
|
|
987
|
+
```jsonc
|
|
988
|
+
// ✅ Correct — no TDZ, decorators still work
|
|
989
|
+
{
|
|
990
|
+
"compilerOptions": {
|
|
991
|
+
"experimentalDecorators": true,
|
|
992
|
+
"emitDecoratorMetadata": false
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
```
|
|
996
|
+
|
|
933
997
|
---
|
|
934
998
|
|
|
935
999
|
## Migration Guide — Lessons Learned (v3 → v4)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../../src/database/ConnectionManager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,8BAAsB,iBAAiB,CAAC,WAAW;IACjD,SAAS,CAAC,WAAW,2BAAiC;IACtD,SAAS,CAAC,MAAM,EAAE,cAAc,CAAA;gBAEpB,MAAM,EAAE,cAAc;IAIlC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAEjF,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAElC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAEpD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAS/D,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../../src/database/ConnectionManager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,8BAAsB,iBAAiB,CAAC,WAAW;IACjD,SAAS,CAAC,WAAW,2BAAiC;IACtD,SAAS,CAAC,MAAM,EAAE,cAAc,CAAA;gBAEpB,MAAM,EAAE,cAAc;IAIlC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAEjF,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAElC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAEpD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAS/D,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;CAM3E"}
|
|
@@ -18,7 +18,11 @@ export class ConnectionManager {
|
|
|
18
18
|
resolveDatabaseName(tenant, dataSource) {
|
|
19
19
|
if (this.config.database)
|
|
20
20
|
return this.config.database;
|
|
21
|
-
|
|
21
|
+
if (dataSource)
|
|
22
|
+
return dataSource;
|
|
23
|
+
if (this.config.suffix)
|
|
24
|
+
return `${tenant}_${this.config.suffix}`;
|
|
25
|
+
return `${this.config.prefix}_${tenant}`;
|
|
22
26
|
}
|
|
23
27
|
}
|
|
24
28
|
//# sourceMappingURL=ConnectionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionManager.js","sourceRoot":"","sources":["../../src/database/ConnectionManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConnectionManager.js","sourceRoot":"","sources":["../../src/database/ConnectionManager.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAgB,iBAAiB;IAC3B,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC5C,MAAM,CAAgB;IAEhC,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAQD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;IAC9B,CAAC;IAES,QAAQ,CAAC,MAAc,EAAE,UAAmB;QACpD,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;QACpF,CAAC;QACD,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IACxD,CAAC;IAES,mBAAmB,CAAC,MAAc,EAAE,UAAmB;QAC/D,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;QACrD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QACjC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QAChE,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE,CAAA;IAC1C,CAAC;CACF"}
|
|
@@ -6,11 +6,14 @@ export interface JwtFilterOptions {
|
|
|
6
6
|
/**
|
|
7
7
|
* Function that receives the raw token and returns the decoded payload.
|
|
8
8
|
* Throw any error to signal an invalid/expired token.
|
|
9
|
+
*
|
|
10
|
+
* Not needed when running behind teraprox-gateway — the gateway validates
|
|
11
|
+
* the JWT and forwards the decoded payload via `x-decoded-user` header.
|
|
9
12
|
*/
|
|
10
|
-
verify
|
|
13
|
+
verify?: (token: string) => Promise<unknown> | unknown;
|
|
11
14
|
/**
|
|
12
15
|
* Custom function to extract the token from the request.
|
|
13
|
-
* Default: reads "Authorization: Bearer <token>"
|
|
16
|
+
* Default: reads "x-app-token" header, then "Authorization: Bearer <token>"
|
|
14
17
|
*/
|
|
15
18
|
extractToken?: (req: Request) => string | undefined;
|
|
16
19
|
/**
|
|
@@ -21,7 +24,7 @@ export interface JwtFilterOptions {
|
|
|
21
24
|
}
|
|
22
25
|
export declare class JwtFilter extends OnRoadFilter {
|
|
23
26
|
private readonly options;
|
|
24
|
-
constructor(options
|
|
27
|
+
constructor(options?: JwtFilterOptions);
|
|
25
28
|
execute(req: Request, res: Response, chain: FilterChain): Promise<void>;
|
|
26
29
|
}
|
|
27
30
|
//# sourceMappingURL=JwtFilter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JwtFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/builtins/JwtFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,gCAAgC,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,gBAAgB;IAC/B
|
|
1
|
+
{"version":3,"file":"JwtFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/builtins/JwtFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,gCAAgC,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IACtD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAA;IACnD;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;gBAE9B,OAAO,GAAE,gBAAqB;IAKpC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CA8B9E"}
|
|
@@ -2,11 +2,21 @@ import "../../types/express-augment.js";
|
|
|
2
2
|
import { OnRoadFilter } from "../FilterChain.js";
|
|
3
3
|
export class JwtFilter extends OnRoadFilter {
|
|
4
4
|
options;
|
|
5
|
-
constructor(options) {
|
|
5
|
+
constructor(options = {}) {
|
|
6
6
|
super();
|
|
7
7
|
this.options = options;
|
|
8
8
|
}
|
|
9
9
|
async execute(req, res, chain) {
|
|
10
|
+
// 1. Gateway already validated — use forwarded decoded payload directly
|
|
11
|
+
const decodedHeader = req.headers["x-decoded-user"];
|
|
12
|
+
if (typeof decodedHeader === "string" && decodedHeader) {
|
|
13
|
+
try {
|
|
14
|
+
req.decoded = JSON.parse(decodedHeader);
|
|
15
|
+
return await chain.next(req, res);
|
|
16
|
+
}
|
|
17
|
+
catch { /* malformed header — fall through to token extraction */ }
|
|
18
|
+
}
|
|
19
|
+
// 2. Standalone mode — extract and verify token
|
|
10
20
|
const extract = this.options.extractToken ?? extractBearerToken;
|
|
11
21
|
const token = extract(req);
|
|
12
22
|
if (!token) {
|
|
@@ -14,11 +24,11 @@ export class JwtFilter extends OnRoadFilter {
|
|
|
14
24
|
res.status(401).json({ error: "Unauthorized", message: "Missing authentication token" });
|
|
15
25
|
return;
|
|
16
26
|
}
|
|
17
|
-
// Anonymous allowed — skip decode, proceed
|
|
18
27
|
return await chain.next(req, res);
|
|
19
28
|
}
|
|
20
29
|
try {
|
|
21
|
-
|
|
30
|
+
const verifyFn = this.options.verify ?? decodeJwtPayload;
|
|
31
|
+
req.decoded = await verifyFn(token);
|
|
22
32
|
await chain.next(req, res);
|
|
23
33
|
}
|
|
24
34
|
catch {
|
|
@@ -35,4 +45,16 @@ function extractBearerToken(req) {
|
|
|
35
45
|
return undefined;
|
|
36
46
|
return auth.slice(7);
|
|
37
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Decodes a JWT payload (base64url) without verifying the signature.
|
|
50
|
+
* Fallback for standalone mode when no verify function is provided.
|
|
51
|
+
*/
|
|
52
|
+
function decodeJwtPayload(token) {
|
|
53
|
+
const parts = token.split(".");
|
|
54
|
+
if (parts.length !== 3)
|
|
55
|
+
throw new Error("Invalid JWT structure");
|
|
56
|
+
const payload = parts[1];
|
|
57
|
+
const json = Buffer.from(payload, "base64url").toString("utf-8");
|
|
58
|
+
return JSON.parse(json);
|
|
59
|
+
}
|
|
38
60
|
//# sourceMappingURL=JwtFilter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JwtFilter.js","sourceRoot":"","sources":["../../../src/filters/builtins/JwtFilter.ts"],"names":[],"mappings":"AACA,OAAO,gCAAgC,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"JwtFilter.js","sourceRoot":"","sources":["../../../src/filters/builtins/JwtFilter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED