@generazioneai/authz 0.0.1

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 (105) hide show
  1. package/dist/codegen/authz-check.d.ts +3 -0
  2. package/dist/codegen/authz-check.d.ts.map +1 -0
  3. package/dist/codegen/authz-check.js +76 -0
  4. package/dist/codegen/authz-check.js.map +1 -0
  5. package/dist/codegen/check-rules.d.ts +73 -0
  6. package/dist/codegen/check-rules.d.ts.map +1 -0
  7. package/dist/codegen/check-rules.js +387 -0
  8. package/dist/codegen/check-rules.js.map +1 -0
  9. package/dist/codegen/effective-actions.d.ts +13 -0
  10. package/dist/codegen/effective-actions.d.ts.map +1 -0
  11. package/dist/codegen/effective-actions.js +44 -0
  12. package/dist/codegen/effective-actions.js.map +1 -0
  13. package/dist/codegen/generate-types.d.ts +8 -0
  14. package/dist/codegen/generate-types.d.ts.map +1 -0
  15. package/dist/codegen/generate-types.js +121 -0
  16. package/dist/codegen/generate-types.js.map +1 -0
  17. package/dist/codegen/index.d.ts +3 -0
  18. package/dist/codegen/index.d.ts.map +1 -0
  19. package/dist/codegen/index.js +74 -0
  20. package/dist/codegen/index.js.map +1 -0
  21. package/dist/codegen/manifest-io.d.ts +19 -0
  22. package/dist/codegen/manifest-io.d.ts.map +1 -0
  23. package/dist/codegen/manifest-io.js +59 -0
  24. package/dist/codegen/manifest-io.js.map +1 -0
  25. package/dist/context/als.d.ts +14 -0
  26. package/dist/context/als.d.ts.map +1 -0
  27. package/dist/context/als.js +30 -0
  28. package/dist/context/als.js.map +1 -0
  29. package/dist/context/authz-context.d.ts +54 -0
  30. package/dist/context/authz-context.d.ts.map +1 -0
  31. package/dist/context/authz-context.js +24 -0
  32. package/dist/context/authz-context.js.map +1 -0
  33. package/dist/define-resource.d.ts +150 -0
  34. package/dist/define-resource.d.ts.map +1 -0
  35. package/dist/define-resource.js +26 -0
  36. package/dist/define-resource.js.map +1 -0
  37. package/dist/index.d.ts +7 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +23 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/nats/canonical-hash.d.ts +5 -0
  42. package/dist/nats/canonical-hash.d.ts.map +1 -0
  43. package/dist/nats/canonical-hash.js +24 -0
  44. package/dist/nats/canonical-hash.js.map +1 -0
  45. package/dist/nats/index.d.ts +7 -0
  46. package/dist/nats/index.d.ts.map +1 -0
  47. package/dist/nats/index.js +27 -0
  48. package/dist/nats/index.js.map +1 -0
  49. package/dist/nats/internal-token.d.ts +56 -0
  50. package/dist/nats/internal-token.d.ts.map +1 -0
  51. package/dist/nats/internal-token.js +93 -0
  52. package/dist/nats/internal-token.js.map +1 -0
  53. package/dist/nats/internal-token.signer.d.ts +21 -0
  54. package/dist/nats/internal-token.signer.d.ts.map +1 -0
  55. package/dist/nats/internal-token.signer.js +48 -0
  56. package/dist/nats/internal-token.signer.js.map +1 -0
  57. package/dist/nats/jwks-client.d.ts +10 -0
  58. package/dist/nats/jwks-client.d.ts.map +1 -0
  59. package/dist/nats/jwks-client.js +14 -0
  60. package/dist/nats/jwks-client.js.map +1 -0
  61. package/dist/nats/key-loader.d.ts +24 -0
  62. package/dist/nats/key-loader.d.ts.map +1 -0
  63. package/dist/nats/key-loader.js +65 -0
  64. package/dist/nats/key-loader.js.map +1 -0
  65. package/dist/nats/replay-cache.d.ts +14 -0
  66. package/dist/nats/replay-cache.d.ts.map +1 -0
  67. package/dist/nats/replay-cache.js +23 -0
  68. package/dist/nats/replay-cache.js.map +1 -0
  69. package/dist/nest/authz-context.interceptor.d.ts +6 -0
  70. package/dist/nest/authz-context.interceptor.d.ts.map +1 -0
  71. package/dist/nest/authz-context.interceptor.js +47 -0
  72. package/dist/nest/authz-context.interceptor.js.map +1 -0
  73. package/dist/nest/authz-context.middleware.d.ts +15 -0
  74. package/dist/nest/authz-context.middleware.d.ts.map +1 -0
  75. package/dist/nest/authz-context.middleware.js +40 -0
  76. package/dist/nest/authz-context.middleware.js.map +1 -0
  77. package/dist/nest/index.d.ts +6 -0
  78. package/dist/nest/index.d.ts.map +1 -0
  79. package/dist/nest/index.js +25 -0
  80. package/dist/nest/index.js.map +1 -0
  81. package/dist/nest/internal-auth.interceptor.d.ts +29 -0
  82. package/dist/nest/internal-auth.interceptor.d.ts.map +1 -0
  83. package/dist/nest/internal-auth.interceptor.js +140 -0
  84. package/dist/nest/internal-auth.interceptor.js.map +1 -0
  85. package/dist/nest/nats-scoped-client.proxy.d.ts +23 -0
  86. package/dist/nest/nats-scoped-client.proxy.d.ts.map +1 -0
  87. package/dist/nest/nats-scoped-client.proxy.js +50 -0
  88. package/dist/nest/nats-scoped-client.proxy.js.map +1 -0
  89. package/dist/nest/skip-internal-auth.decorator.d.ts +4 -0
  90. package/dist/nest/skip-internal-auth.decorator.d.ts.map +1 -0
  91. package/dist/nest/skip-internal-auth.decorator.js +13 -0
  92. package/dist/nest/skip-internal-auth.decorator.js.map +1 -0
  93. package/dist/resource-registry.d.ts +31 -0
  94. package/dist/resource-registry.d.ts.map +1 -0
  95. package/dist/resource-registry.js +64 -0
  96. package/dist/resource-registry.js.map +1 -0
  97. package/dist/resource-registry.module.d.ts +25 -0
  98. package/dist/resource-registry.module.d.ts.map +1 -0
  99. package/dist/resource-registry.module.js +67 -0
  100. package/dist/resource-registry.module.js.map +1 -0
  101. package/dist/scope-substitute.d.ts +20 -0
  102. package/dist/scope-substitute.d.ts.map +1 -0
  103. package/dist/scope-substitute.js +58 -0
  104. package/dist/scope-substitute.js.map +1 -0
  105. package/package.json +94 -0
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ // Step 1 DEC-17/18: NestJS DI module for explicit manifest registration.
3
+ //
4
+ // Wiring (in each owning service):
5
+ // @Module({
6
+ // imports: [
7
+ // ResourceRegistryModule.forRoot(), // once, app root
8
+ // ResourceRegistryModule.forFeature([JuridicalIndividualResource]), // per feature module
9
+ // ],
10
+ // })
11
+ //
12
+ // DEC-17: registration is EXPLICIT (no glob magic) — a manifest not passed to
13
+ // forFeature is never registered, and TypeScript flags a missing import.
14
+ // DEC-3: the registry throws on a duplicate subject/prismaModel.
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.ResourceRegistryModule = exports.RESOURCE_REGISTRY = void 0;
17
+ const resource_registry_1 = require("./resource-registry");
18
+ /** DI token for the per-process ResourceRegistry (alias of the class token). */
19
+ exports.RESOURCE_REGISTRY = Symbol('skillera:resource-registry');
20
+ class ResourceRegistryModule {
21
+ /**
22
+ * Provides the singleton `ResourceRegistry` for the process. Global, so
23
+ * `forFeature(...)` in any feature module can inject it. Call once at app root.
24
+ */
25
+ static forRoot(options = {}) {
26
+ const registry = options.registry ?? new resource_registry_1.ResourceRegistry();
27
+ for (const m of options.manifests ?? [])
28
+ registry.register(m);
29
+ const providers = [
30
+ { provide: resource_registry_1.ResourceRegistry, useValue: registry },
31
+ { provide: exports.RESOURCE_REGISTRY, useValue: registry },
32
+ ];
33
+ return {
34
+ module: ResourceRegistryModule,
35
+ global: true,
36
+ providers,
37
+ exports: [resource_registry_1.ResourceRegistry, exports.RESOURCE_REGISTRY],
38
+ };
39
+ }
40
+ /**
41
+ * Registers a feature module's manifests into the root registry. The factory
42
+ * runs at bootstrap (eager, non-request-scoped) and registers each manifest;
43
+ * a duplicate subject/prismaModel surfaces as a startup error (DEC-3).
44
+ */
45
+ static forFeature(manifests) {
46
+ const token = `skillera:resource-feature:${manifests
47
+ .map((m) => m.subject)
48
+ .sort()
49
+ .join(',')}`;
50
+ const provider = {
51
+ provide: token,
52
+ useFactory: (registry) => {
53
+ for (const m of manifests)
54
+ registry.register(m);
55
+ return manifests;
56
+ },
57
+ inject: [resource_registry_1.ResourceRegistry],
58
+ };
59
+ return {
60
+ module: ResourceRegistryModule,
61
+ providers: [provider],
62
+ exports: [provider],
63
+ };
64
+ }
65
+ }
66
+ exports.ResourceRegistryModule = ResourceRegistryModule;
67
+ //# sourceMappingURL=resource-registry.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-registry.module.js","sourceRoot":"","sources":["../src/resource-registry.module.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,EAAE;AACF,mCAAmC;AACnC,cAAc;AACd,iBAAiB;AACjB,qFAAqF;AACrF,iGAAiG;AACjG,SAAS;AACT,OAAO;AACP,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,iEAAiE;;;AAQjE,2DAAuD;AAEvD,gFAAgF;AACnE,QAAA,iBAAiB,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAStE,MAAa,sBAAsB;IACjC;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,UAAuC,EAAE;QACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,oCAAgB,EAAE,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE;YAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE9D,MAAM,SAAS,GAAe;YAC5B,EAAE,OAAO,EAAE,oCAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACjD,EAAE,OAAO,EAAE,yBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE;SACnD,CAAC;QACF,OAAO;YACL,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,IAAI;YACZ,SAAS;YACT,OAAO,EAAE,CAAC,oCAAgB,EAAE,yBAAiB,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,SAA6B;QAC7C,MAAM,KAAK,GAAG,6BAA6B,SAAS;aACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACrB,IAAI,EAAE;aACN,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,CAAC,QAA0B,EAAE,EAAE;gBACzC,KAAK,MAAM,CAAC,IAAI,SAAS;oBAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,EAAE,CAAC,oCAAgB,CAAC;SAC3B,CAAC;QACF,OAAO;YACL,MAAM,EAAE,sBAAsB;YAC9B,SAAS,EAAE,CAAC,QAAQ,CAAC;YACrB,OAAO,EAAE,CAAC,QAAQ,CAAC;SACpB,CAAC;IACJ,CAAC;CACF;AA7CD,wDA6CC"}
@@ -0,0 +1,20 @@
1
+ import type { AuthzContext } from './context/authz-context';
2
+ /**
3
+ * Sostituisce ricorsivamente `{ $ctx: 'path' }` con `getPath(ctx, path)`.
4
+ * Preserva tipi primitivi e shape oggetto/array.
5
+ *
6
+ * Esempio:
7
+ * substituteContext(
8
+ * { juridicalId: { $ctx: 'tenantId' } },
9
+ * { tenantId: 'abc', ... }
10
+ * )
11
+ * → { juridicalId: 'abc' }
12
+ *
13
+ * substituteContext(
14
+ * { enrolledLearnerIds: { hasSome: { $ctx: 'connected.studentsOfTeacher' } } },
15
+ * ctx
16
+ * )
17
+ * → { enrolledLearnerIds: { hasSome: ['student1', 'student2'] } }
18
+ */
19
+ export declare function substituteContext<T = any>(template: any, ctx: AuthzContext): T;
20
+ //# sourceMappingURL=scope-substitute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-substitute.d.ts","sourceRoot":"","sources":["../src/scope-substitute.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAc5D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,GAAG,EACvC,QAAQ,EAAE,GAAG,EACb,GAAG,EAAE,YAAY,GAChB,CAAC,CAkBH"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ // Step 1 + Step 4 DEC-S4.1: substituteContext()
3
+ // Sostituisce ricorsivamente i placeholder `{ $ctx: 'path.to.value' }`
4
+ // con i valori effettivi presi da `AuthzContext`.
5
+ //
6
+ // Usato da skillID snapshot builder per trasformare i template manifest in
7
+ // rules CASL pronte (post-substitution) che viaggiano nello snapshot envelope.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.substituteContext = substituteContext;
10
+ /** Risolve una path "a.b.c" in un oggetto profondo. Ritorna undefined su miss. */
11
+ function getPath(obj, path) {
12
+ if (!path)
13
+ return obj;
14
+ const parts = path.split('.');
15
+ let current = obj;
16
+ for (const part of parts) {
17
+ if (current == null)
18
+ return undefined;
19
+ current = current[part];
20
+ }
21
+ return current;
22
+ }
23
+ /**
24
+ * Sostituisce ricorsivamente `{ $ctx: 'path' }` con `getPath(ctx, path)`.
25
+ * Preserva tipi primitivi e shape oggetto/array.
26
+ *
27
+ * Esempio:
28
+ * substituteContext(
29
+ * { juridicalId: { $ctx: 'tenantId' } },
30
+ * { tenantId: 'abc', ... }
31
+ * )
32
+ * → { juridicalId: 'abc' }
33
+ *
34
+ * substituteContext(
35
+ * { enrolledLearnerIds: { hasSome: { $ctx: 'connected.studentsOfTeacher' } } },
36
+ * ctx
37
+ * )
38
+ * → { enrolledLearnerIds: { hasSome: ['student1', 'student2'] } }
39
+ */
40
+ function substituteContext(template, ctx) {
41
+ if (template === null || template === undefined)
42
+ return template;
43
+ if (typeof template !== 'object')
44
+ return template;
45
+ // Placeholder $ctx
46
+ if ('$ctx' in template && typeof template.$ctx === 'string') {
47
+ return getPath(ctx, template.$ctx);
48
+ }
49
+ if (Array.isArray(template)) {
50
+ return template.map((item) => substituteContext(item, ctx));
51
+ }
52
+ const out = {};
53
+ for (const [key, value] of Object.entries(template)) {
54
+ out[key] = substituteContext(value, ctx);
55
+ }
56
+ return out;
57
+ }
58
+ //# sourceMappingURL=scope-substitute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-substitute.js","sourceRoot":"","sources":["../src/scope-substitute.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,uEAAuE;AACvE,kDAAkD;AAClD,EAAE;AACF,2EAA2E;AAC3E,+EAA+E;;AAiC/E,8CAqBC;AAlDD,kFAAkF;AAClF,SAAS,OAAO,CAAC,GAAQ,EAAE,IAAY;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QACtC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,iBAAiB,CAC/B,QAAa,EACb,GAAiB;IAEjB,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACjE,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAElD,mBAAmB;IACnB,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAQ,QAAgB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrE,OAAO,OAAO,CAAC,GAAG,EAAG,QAAgB,CAAC,IAAI,CAAM,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAiB,CAAC;IAC9E,CAAC;IAED,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAQ,CAAC;AAClB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@generazioneai/authz",
3
+ "version": "0.0.1",
4
+ "description": "Runtime authz + autoquery for Skillera microservices",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "authz-check": "dist/codegen/authz-check.js",
9
+ "authz-codegen": "dist/codegen/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git@github.com:GenerazioneAI-SRL/SKILLERA-AUTHZ-PACKAGES.git",
21
+ "directory": "packages/authz"
22
+ },
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.json",
25
+ "clean": "rm -rf dist",
26
+ "test": "jest",
27
+ "test:cov": "jest --coverage",
28
+ "lint": "echo 'TODO: lint' && exit 0",
29
+ "authz:genkey": "ts-node scripts/generate-key.ts"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "default": "./dist/index.js"
35
+ },
36
+ "./internal": {
37
+ "types": "./dist/internal/index.d.ts",
38
+ "default": "./dist/internal/index.js"
39
+ },
40
+ "./nats": {
41
+ "types": "./dist/nats/index.d.ts",
42
+ "default": "./dist/nats/index.js"
43
+ },
44
+ "./nest": {
45
+ "types": "./dist/nest/index.d.ts",
46
+ "default": "./dist/nest/index.js"
47
+ }
48
+ },
49
+ "typesVersions": {
50
+ "*": {
51
+ "nats": [
52
+ "dist/nats/index.d.ts"
53
+ ],
54
+ "nest": [
55
+ "dist/nest/index.d.ts"
56
+ ],
57
+ "internal": [
58
+ "dist/internal/index.d.ts"
59
+ ]
60
+ }
61
+ },
62
+ "peerDependencies": {
63
+ "@casl/ability": "^6.7.0",
64
+ "@casl/prisma": "^1.5.0 || ^2.0.0",
65
+ "@nestjs/common": "^11.0.0",
66
+ "@nestjs/core": "^11.0.0",
67
+ "@nestjs/microservices": "^11.0.0",
68
+ "@prisma/client": "^6.0.0 || ^7.0.0"
69
+ },
70
+ "peerDependenciesMeta": {
71
+ "@prisma/client": {
72
+ "optional": true
73
+ }
74
+ },
75
+ "dependencies": {
76
+ "@noble/hashes": "^1.4.0",
77
+ "ioredis": "^5.4.0",
78
+ "jose": "^6.0.10",
79
+ "json-stable-stringify": "^1.1.1",
80
+ "lru-cache": "^10.4.0",
81
+ "lz4-napi": "^2.7.0"
82
+ },
83
+ "devDependencies": {
84
+ "@casl/ability": "^6.7.3",
85
+ "@casl/prisma": "^1.5.0",
86
+ "@nestjs/core": "^11.1.24",
87
+ "@nestjs/microservices": "^11.1.24",
88
+ "@types/json-stable-stringify": "^1.0.36",
89
+ "@types/node": "^22.0.0",
90
+ "rxjs": "^7.8.2",
91
+ "ts-node": "^10.9.2",
92
+ "typescript": "^5.1.3"
93
+ }
94
+ }