@nebutra/identity 0.1.0 → 0.1.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.
@@ -0,0 +1,37 @@
1
+
2
+ > @nebutra/identity@0.1.1 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/iam/identity
3
+ > tsup
4
+
5
+ CLI Building entry: src/index.ts, src/registry.ts, src/types.ts, src/adapters/authjs.ts, src/adapters/clerk.ts
6
+ CLI Using tsconfig: tsconfig.json
7
+ CLI tsup v8.5.1
8
+ CLI Using tsup config: /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/iam/identity/tsup.config.ts
9
+ CLI Target: es2022
10
+ CLI Cleaning output folder
11
+ ESM Build start
12
+ ESM dist/index.js 480.00 B
13
+ ESM dist/adapters/authjs.js 134.00 B
14
+ ESM dist/registry.js 255.00 B
15
+ ESM dist/chunk-DOCMMNRB.js 1.34 KB
16
+ ESM dist/types.js 136.00 B
17
+ ESM dist/chunk-MZKK4BRU.js 472.00 B
18
+ ESM dist/chunk-ZERXN5CV.js 1.34 KB
19
+ ESM dist/adapters/clerk.js 131.00 B
20
+ ESM dist/chunk-QKUYKQO6.js 1018.00 B
21
+ ESM dist/index.js.map 71.00 B
22
+ ESM dist/adapters/authjs.js.map 71.00 B
23
+ ESM dist/registry.js.map 71.00 B
24
+ ESM dist/chunk-DOCMMNRB.js.map 3.24 KB
25
+ ESM dist/types.js.map 71.00 B
26
+ ESM dist/chunk-MZKK4BRU.js.map 1.22 KB
27
+ ESM dist/chunk-ZERXN5CV.js.map 2.68 KB
28
+ ESM dist/adapters/clerk.js.map 71.00 B
29
+ ESM dist/chunk-QKUYKQO6.js.map 1.94 KB
30
+ ESM ⚡️ Build success in 85ms
31
+ DTS Build start
32
+ DTS ⚡️ Build success in 29586ms
33
+ DTS dist/index.d.ts 1.17 KB
34
+ DTS dist/registry.d.ts 216.00 B
35
+ DTS dist/adapters/authjs.d.ts 301.00 B
36
+ DTS dist/adapters/clerk.d.ts 298.00 B
37
+ DTS dist/types.d.ts 605.00 B
@@ -0,0 +1,4 @@
1
+
2
+ > @nebutra/identity@0.1.1 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/iam/identity
3
+ > tsc --noEmit
4
+
package/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # @nebutra/identity
2
+
3
+ ## 0.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Publish registry package metadata under the MIT license.
8
+
9
+ - Updated dependencies []:
10
+ - @nebutra/contracts@0.1.1
@@ -0,0 +1,9 @@
1
+ import { CanonicalIdentity } from '@nebutra/contracts';
2
+ import { IdentityAdapter } from '../types.js';
3
+
4
+ declare class AuthJsIdentityAdapter implements IdentityAdapter<unknown> {
5
+ provider: "authjs";
6
+ mapToCanonical(input: unknown): CanonicalIdentity | null;
7
+ }
8
+
9
+ export { AuthJsIdentityAdapter };
@@ -0,0 +1,7 @@
1
+ import {
2
+ AuthJsIdentityAdapter
3
+ } from "../chunk-ZERXN5CV.js";
4
+ export {
5
+ AuthJsIdentityAdapter
6
+ };
7
+ //# sourceMappingURL=authjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,9 @@
1
+ import { CanonicalIdentity } from '@nebutra/contracts';
2
+ import { IdentityAdapter } from '../types.js';
3
+
4
+ declare class ClerkIdentityAdapter implements IdentityAdapter<unknown> {
5
+ provider: "clerk";
6
+ mapToCanonical(input: unknown): CanonicalIdentity | null;
7
+ }
8
+
9
+ export { ClerkIdentityAdapter };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ClerkIdentityAdapter
3
+ } from "../chunk-QKUYKQO6.js";
4
+ export {
5
+ ClerkIdentityAdapter
6
+ };
7
+ //# sourceMappingURL=clerk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,55 @@
1
+ import {
2
+ IdentityAdapterRegistry
3
+ } from "./chunk-MZKK4BRU.js";
4
+ import {
5
+ AuthJsIdentityAdapter
6
+ } from "./chunk-ZERXN5CV.js";
7
+ import {
8
+ ClerkIdentityAdapter
9
+ } from "./chunk-QKUYKQO6.js";
10
+
11
+ // src/adapters/nebutra.ts
12
+ var NebutraIdentityAdapter = class {
13
+ provider = "nebutra";
14
+ mapToCanonical(input) {
15
+ if (!input.sub) return null;
16
+ return {
17
+ provider: "nebutra",
18
+ userId: input.sub,
19
+ organizationId: input["nebutra:organization_id"],
20
+ role: this.mapRole(input["nebutra:role"]),
21
+ plan: this.mapPlan(input["nebutra:plan"]),
22
+ email: input.email,
23
+ claimsVersion: "v1"
24
+ };
25
+ }
26
+ mapRole(role) {
27
+ const validRoles = ["OWNER", "ADMIN", "MEMBER", "VIEWER"];
28
+ if (role && validRoles.includes(role)) {
29
+ return role;
30
+ }
31
+ return void 0;
32
+ }
33
+ mapPlan(plan) {
34
+ const validPlans = ["FREE", "PRO", "ENTERPRISE"];
35
+ if (plan && validPlans.includes(plan)) {
36
+ return plan;
37
+ }
38
+ return void 0;
39
+ }
40
+ };
41
+
42
+ // src/registry.ts
43
+ function createDefaultIdentityAdapterRegistry() {
44
+ const registry = new IdentityAdapterRegistry();
45
+ registry.register(new ClerkIdentityAdapter());
46
+ registry.register(new AuthJsIdentityAdapter());
47
+ registry.register(new NebutraIdentityAdapter());
48
+ return registry;
49
+ }
50
+
51
+ export {
52
+ NebutraIdentityAdapter,
53
+ createDefaultIdentityAdapterRegistry
54
+ };
55
+ //# sourceMappingURL=chunk-DOCMMNRB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/nebutra.ts","../src/registry.ts"],"sourcesContent":["/**\n * Nebutra Identity Adapter\n *\n * Maps oidc-provider / Nebutra-issued OIDC tokens to CanonicalIdentity.\n * Used when Nebutra acts as both the IdP AND the resource server —\n * i.e., when a Nebutra service receives an access token issued by\n * the Nebutra IdP and needs to resolve the user identity.\n */\n\nimport type { CanonicalIdentity } from \"@nebutra/contracts\";\nimport type { IdentityAdapter } from \"../types\";\n\ninterface NebutraOIDCClaims {\n sub: string;\n email?: string;\n name?: string;\n picture?: string;\n \"nebutra:organization_id\"?: string;\n \"nebutra:role\"?: string;\n \"nebutra:plan\"?: string;\n [key: string]: unknown;\n}\n\nexport class NebutraIdentityAdapter implements IdentityAdapter<NebutraOIDCClaims> {\n readonly provider = \"nebutra\" as const;\n\n mapToCanonical(input: NebutraOIDCClaims): CanonicalIdentity | null {\n if (!input.sub) return null;\n\n return {\n provider: \"nebutra\",\n userId: input.sub,\n organizationId: input[\"nebutra:organization_id\"],\n role: this.mapRole(input[\"nebutra:role\"]),\n plan: this.mapPlan(input[\"nebutra:plan\"]),\n email: input.email,\n claimsVersion: \"v1\",\n };\n }\n\n private mapRole(role?: string): \"OWNER\" | \"ADMIN\" | \"MEMBER\" | \"VIEWER\" | undefined {\n const validRoles = [\"OWNER\", \"ADMIN\", \"MEMBER\", \"VIEWER\"] as const;\n if (role && validRoles.includes(role as (typeof validRoles)[number])) {\n return role as (typeof validRoles)[number];\n }\n return undefined;\n }\n\n private mapPlan(plan?: string): \"FREE\" | \"PRO\" | \"ENTERPRISE\" | undefined {\n const validPlans = [\"FREE\", \"PRO\", \"ENTERPRISE\"] as const;\n if (plan && validPlans.includes(plan as (typeof validPlans)[number])) {\n return plan as (typeof validPlans)[number];\n }\n return undefined;\n }\n}\n","import { AuthJsIdentityAdapter } from \"./adapters/authjs\";\nimport { ClerkIdentityAdapter } from \"./adapters/clerk\";\nimport { NebutraIdentityAdapter } from \"./adapters/nebutra\";\nimport { IdentityAdapterRegistry } from \"./types\";\n\nexport function createDefaultIdentityAdapterRegistry(): IdentityAdapterRegistry {\n const registry = new IdentityAdapterRegistry();\n registry.register(new ClerkIdentityAdapter());\n registry.register(new AuthJsIdentityAdapter());\n registry.register(new NebutraIdentityAdapter());\n return registry;\n}\n"],"mappings":";;;;;;;;;;;AAuBO,IAAM,yBAAN,MAA2E;AAAA,EACvE,WAAW;AAAA,EAEpB,eAAe,OAAoD;AACjE,QAAI,CAAC,MAAM,IAAK,QAAO;AAEvB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,gBAAgB,MAAM,yBAAyB;AAAA,MAC/C,MAAM,KAAK,QAAQ,MAAM,cAAc,CAAC;AAAA,MACxC,MAAM,KAAK,QAAQ,MAAM,cAAc,CAAC;AAAA,MACxC,OAAO,MAAM;AAAA,MACb,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,QAAQ,MAAoE;AAClF,UAAM,aAAa,CAAC,SAAS,SAAS,UAAU,QAAQ;AACxD,QAAI,QAAQ,WAAW,SAAS,IAAmC,GAAG;AACpE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,MAA0D;AACxE,UAAM,aAAa,CAAC,QAAQ,OAAO,YAAY;AAC/C,QAAI,QAAQ,WAAW,SAAS,IAAmC,GAAG;AACpE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;;;AClDO,SAAS,uCAAgE;AAC9E,QAAM,WAAW,IAAI,wBAAwB;AAC7C,WAAS,SAAS,IAAI,qBAAqB,CAAC;AAC5C,WAAS,SAAS,IAAI,sBAAsB,CAAC;AAC7C,WAAS,SAAS,IAAI,uBAAuB,CAAC;AAC9C,SAAO;AACT;","names":[]}
@@ -0,0 +1,22 @@
1
+ // src/types.ts
2
+ var IdentityAdapterRegistry = class {
3
+ adapters = /* @__PURE__ */ new Map();
4
+ register(adapter) {
5
+ this.adapters.set(adapter.provider, adapter);
6
+ }
7
+ get(provider) {
8
+ return this.adapters.get(provider);
9
+ }
10
+ map(provider, input) {
11
+ const adapter = this.get(provider);
12
+ if (!adapter) {
13
+ return null;
14
+ }
15
+ return adapter.mapToCanonical(input);
16
+ }
17
+ };
18
+
19
+ export {
20
+ IdentityAdapterRegistry
21
+ };
22
+ //# sourceMappingURL=chunk-MZKK4BRU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CanonicalIdentity } from \"@nebutra/contracts\";\n\nexport type IdentityProvider = \"clerk\" | \"authjs\" | \"custom\";\n\nexport interface IdentityAdapter<TInput = unknown> {\n provider: IdentityProvider | string;\n mapToCanonical(input: TInput): CanonicalIdentity | null;\n}\n\nexport class IdentityAdapterRegistry {\n private readonly adapters = new Map<string, IdentityAdapter>();\n\n register(adapter: IdentityAdapter): void {\n this.adapters.set(adapter.provider, adapter);\n }\n\n get(provider: string): IdentityAdapter | undefined {\n return this.adapters.get(provider);\n }\n\n map<TInput = unknown>(provider: string, input: TInput): CanonicalIdentity | null {\n const adapter = this.get(provider);\n if (!adapter) {\n return null;\n }\n return adapter.mapToCanonical(input);\n }\n}\n"],"mappings":";AASO,IAAM,0BAAN,MAA8B;AAAA,EAClB,WAAW,oBAAI,IAA6B;AAAA,EAE7D,SAAS,SAAgC;AACvC,SAAK,SAAS,IAAI,QAAQ,UAAU,OAAO;AAAA,EAC7C;AAAA,EAEA,IAAI,UAA+C;AACjD,WAAO,KAAK,SAAS,IAAI,QAAQ;AAAA,EACnC;AAAA,EAEA,IAAsB,UAAkB,OAAyC;AAC/E,UAAM,UAAU,KAAK,IAAI,QAAQ;AACjC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,eAAe,KAAK;AAAA,EACrC;AACF;","names":[]}
@@ -0,0 +1,35 @@
1
+ // src/adapters/clerk.ts
2
+ import { CanonicalIdentitySchema } from "@nebutra/contracts";
3
+ import { z } from "zod";
4
+ var ClerkPayloadSchema = z.object({
5
+ sub: z.string().min(1),
6
+ org_id: z.string().min(1).optional(),
7
+ org_role: z.enum(["OWNER", "ADMIN", "MEMBER", "VIEWER"]).optional(),
8
+ sid: z.string().min(1).optional(),
9
+ email: z.string().email().optional()
10
+ });
11
+ var ClerkIdentityAdapter = class {
12
+ provider = "clerk";
13
+ mapToCanonical(input) {
14
+ const parsed = ClerkPayloadSchema.safeParse(input);
15
+ if (!parsed.success) {
16
+ return null;
17
+ }
18
+ const candidate = {
19
+ provider: "clerk",
20
+ userId: parsed.data.sub,
21
+ organizationId: parsed.data.org_id,
22
+ role: parsed.data.org_role,
23
+ email: parsed.data.email,
24
+ sessionId: parsed.data.sid,
25
+ claimsVersion: "v1"
26
+ };
27
+ const canonical = CanonicalIdentitySchema.safeParse(candidate);
28
+ return canonical.success ? canonical.data : null;
29
+ }
30
+ };
31
+
32
+ export {
33
+ ClerkIdentityAdapter
34
+ };
35
+ //# sourceMappingURL=chunk-QKUYKQO6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/clerk.ts"],"sourcesContent":["import { type CanonicalIdentity, CanonicalIdentitySchema } from \"@nebutra/contracts\";\nimport { z } from \"zod\";\n\nimport type { IdentityAdapter } from \"../types\";\n\nconst ClerkPayloadSchema = z.object({\n sub: z.string().min(1),\n org_id: z.string().min(1).optional(),\n org_role: z.enum([\"OWNER\", \"ADMIN\", \"MEMBER\", \"VIEWER\"]).optional(),\n sid: z.string().min(1).optional(),\n email: z.string().email().optional(),\n});\n\nexport class ClerkIdentityAdapter implements IdentityAdapter<unknown> {\n provider = \"clerk\" as const;\n\n mapToCanonical(input: unknown): CanonicalIdentity | null {\n const parsed = ClerkPayloadSchema.safeParse(input);\n if (!parsed.success) {\n return null;\n }\n\n const candidate = {\n provider: \"clerk\" as const,\n userId: parsed.data.sub,\n organizationId: parsed.data.org_id,\n role: parsed.data.org_role,\n email: parsed.data.email,\n sessionId: parsed.data.sid,\n claimsVersion: \"v1\" as const,\n };\n\n const canonical = CanonicalIdentitySchema.safeParse(candidate);\n return canonical.success ? canonical.data : null;\n }\n}\n"],"mappings":";AAAA,SAAiC,+BAA+B;AAChE,SAAS,SAAS;AAIlB,IAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACnC,UAAU,EAAE,KAAK,CAAC,SAAS,SAAS,UAAU,QAAQ,CAAC,EAAE,SAAS;AAAA,EAClE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAChC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AACrC,CAAC;AAEM,IAAM,uBAAN,MAA+D;AAAA,EACpE,WAAW;AAAA,EAEX,eAAe,OAA0C;AACvD,UAAM,SAAS,mBAAmB,UAAU,KAAK;AACjD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY;AAAA,MAChB,UAAU;AAAA,MACV,QAAQ,OAAO,KAAK;AAAA,MACpB,gBAAgB,OAAO,KAAK;AAAA,MAC5B,MAAM,OAAO,KAAK;AAAA,MAClB,OAAO,OAAO,KAAK;AAAA,MACnB,WAAW,OAAO,KAAK;AAAA,MACvB,eAAe;AAAA,IACjB;AAEA,UAAM,YAAY,wBAAwB,UAAU,SAAS;AAC7D,WAAO,UAAU,UAAU,UAAU,OAAO;AAAA,EAC9C;AACF;","names":[]}
@@ -0,0 +1,46 @@
1
+ // src/adapters/authjs.ts
2
+ import { CanonicalIdentitySchema } from "@nebutra/contracts";
3
+ import { z } from "zod";
4
+ var AuthJsSessionSchema = z.object({
5
+ user: z.object({
6
+ id: z.string().min(1).optional(),
7
+ email: z.string().email().optional()
8
+ }).optional(),
9
+ token: z.object({
10
+ sub: z.string().min(1).optional(),
11
+ orgId: z.string().min(1).optional(),
12
+ orgRole: z.enum(["OWNER", "ADMIN", "MEMBER", "VIEWER"]).optional(),
13
+ sid: z.string().min(1).optional(),
14
+ plan: z.enum(["FREE", "PRO", "ENTERPRISE"]).optional()
15
+ }).optional()
16
+ });
17
+ var AuthJsIdentityAdapter = class {
18
+ provider = "authjs";
19
+ mapToCanonical(input) {
20
+ const parsed = AuthJsSessionSchema.safeParse(input);
21
+ if (!parsed.success) {
22
+ return null;
23
+ }
24
+ const userId = parsed.data.user?.id ?? parsed.data.token?.sub;
25
+ if (!userId) {
26
+ return null;
27
+ }
28
+ const candidate = {
29
+ provider: "authjs",
30
+ userId,
31
+ organizationId: parsed.data.token?.orgId,
32
+ role: parsed.data.token?.orgRole,
33
+ plan: parsed.data.token?.plan,
34
+ email: parsed.data.user?.email,
35
+ sessionId: parsed.data.token?.sid,
36
+ claimsVersion: "v1"
37
+ };
38
+ const canonical = CanonicalIdentitySchema.safeParse(candidate);
39
+ return canonical.success ? canonical.data : null;
40
+ }
41
+ };
42
+
43
+ export {
44
+ AuthJsIdentityAdapter
45
+ };
46
+ //# sourceMappingURL=chunk-ZERXN5CV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/authjs.ts"],"sourcesContent":["import { type CanonicalIdentity, CanonicalIdentitySchema } from \"@nebutra/contracts\";\nimport { z } from \"zod\";\n\nimport type { IdentityAdapter } from \"../types\";\n\nconst AuthJsSessionSchema = z.object({\n user: z\n .object({\n id: z.string().min(1).optional(),\n email: z.string().email().optional(),\n })\n .optional(),\n token: z\n .object({\n sub: z.string().min(1).optional(),\n orgId: z.string().min(1).optional(),\n orgRole: z.enum([\"OWNER\", \"ADMIN\", \"MEMBER\", \"VIEWER\"]).optional(),\n sid: z.string().min(1).optional(),\n plan: z.enum([\"FREE\", \"PRO\", \"ENTERPRISE\"]).optional(),\n })\n .optional(),\n});\n\nexport class AuthJsIdentityAdapter implements IdentityAdapter<unknown> {\n provider = \"authjs\" as const;\n\n mapToCanonical(input: unknown): CanonicalIdentity | null {\n const parsed = AuthJsSessionSchema.safeParse(input);\n if (!parsed.success) {\n return null;\n }\n\n const userId = parsed.data.user?.id ?? parsed.data.token?.sub;\n if (!userId) {\n return null;\n }\n\n const candidate = {\n provider: \"authjs\" as const,\n userId,\n organizationId: parsed.data.token?.orgId,\n role: parsed.data.token?.orgRole,\n plan: parsed.data.token?.plan,\n email: parsed.data.user?.email,\n sessionId: parsed.data.token?.sid,\n claimsVersion: \"v1\" as const,\n };\n\n const canonical = CanonicalIdentitySchema.safeParse(candidate);\n return canonical.success ? canonical.data : null;\n }\n}\n"],"mappings":";AAAA,SAAiC,+BAA+B;AAChE,SAAS,SAAS;AAIlB,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,MAAM,EACH,OAAO;AAAA,IACN,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EACrC,CAAC,EACA,SAAS;AAAA,EACZ,OAAO,EACJ,OAAO;AAAA,IACN,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAChC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAClC,SAAS,EAAE,KAAK,CAAC,SAAS,SAAS,UAAU,QAAQ,CAAC,EAAE,SAAS;AAAA,IACjE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAChC,MAAM,EAAE,KAAK,CAAC,QAAQ,OAAO,YAAY,CAAC,EAAE,SAAS;AAAA,EACvD,CAAC,EACA,SAAS;AACd,CAAC;AAEM,IAAM,wBAAN,MAAgE;AAAA,EACrE,WAAW;AAAA,EAEX,eAAe,OAA0C;AACvD,UAAM,SAAS,oBAAoB,UAAU,KAAK;AAClD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK,OAAO;AAC1D,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,YAAY;AAAA,MAChB,UAAU;AAAA,MACV;AAAA,MACA,gBAAgB,OAAO,KAAK,OAAO;AAAA,MACnC,MAAM,OAAO,KAAK,OAAO;AAAA,MACzB,MAAM,OAAO,KAAK,OAAO;AAAA,MACzB,OAAO,OAAO,KAAK,MAAM;AAAA,MACzB,WAAW,OAAO,KAAK,OAAO;AAAA,MAC9B,eAAe;AAAA,IACjB;AAEA,UAAM,YAAY,wBAAwB,UAAU,SAAS;AAC7D,WAAO,UAAU,UAAU,UAAU,OAAO;AAAA,EAC9C;AACF;","names":[]}
@@ -0,0 +1,34 @@
1
+ export { AuthJsIdentityAdapter } from './adapters/authjs.js';
2
+ export { ClerkIdentityAdapter } from './adapters/clerk.js';
3
+ import { CanonicalIdentity } from '@nebutra/contracts';
4
+ import { IdentityAdapter } from './types.js';
5
+ export { IdentityAdapterRegistry, IdentityProvider } from './types.js';
6
+ export { createDefaultIdentityAdapterRegistry } from './registry.js';
7
+
8
+ /**
9
+ * Nebutra Identity Adapter
10
+ *
11
+ * Maps oidc-provider / Nebutra-issued OIDC tokens to CanonicalIdentity.
12
+ * Used when Nebutra acts as both the IdP AND the resource server —
13
+ * i.e., when a Nebutra service receives an access token issued by
14
+ * the Nebutra IdP and needs to resolve the user identity.
15
+ */
16
+
17
+ interface NebutraOIDCClaims {
18
+ sub: string;
19
+ email?: string;
20
+ name?: string;
21
+ picture?: string;
22
+ "nebutra:organization_id"?: string;
23
+ "nebutra:role"?: string;
24
+ "nebutra:plan"?: string;
25
+ [key: string]: unknown;
26
+ }
27
+ declare class NebutraIdentityAdapter implements IdentityAdapter<NebutraOIDCClaims> {
28
+ readonly provider: "nebutra";
29
+ mapToCanonical(input: NebutraOIDCClaims): CanonicalIdentity | null;
30
+ private mapRole;
31
+ private mapPlan;
32
+ }
33
+
34
+ export { IdentityAdapter, NebutraIdentityAdapter };
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ import {
2
+ NebutraIdentityAdapter,
3
+ createDefaultIdentityAdapterRegistry
4
+ } from "./chunk-DOCMMNRB.js";
5
+ import {
6
+ IdentityAdapterRegistry
7
+ } from "./chunk-MZKK4BRU.js";
8
+ import {
9
+ AuthJsIdentityAdapter
10
+ } from "./chunk-ZERXN5CV.js";
11
+ import {
12
+ ClerkIdentityAdapter
13
+ } from "./chunk-QKUYKQO6.js";
14
+ export {
15
+ AuthJsIdentityAdapter,
16
+ ClerkIdentityAdapter,
17
+ IdentityAdapterRegistry,
18
+ NebutraIdentityAdapter,
19
+ createDefaultIdentityAdapterRegistry
20
+ };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,6 @@
1
+ import { IdentityAdapterRegistry } from './types.js';
2
+ import '@nebutra/contracts';
3
+
4
+ declare function createDefaultIdentityAdapterRegistry(): IdentityAdapterRegistry;
5
+
6
+ export { createDefaultIdentityAdapterRegistry };
@@ -0,0 +1,10 @@
1
+ import {
2
+ createDefaultIdentityAdapterRegistry
3
+ } from "./chunk-DOCMMNRB.js";
4
+ import "./chunk-MZKK4BRU.js";
5
+ import "./chunk-ZERXN5CV.js";
6
+ import "./chunk-QKUYKQO6.js";
7
+ export {
8
+ createDefaultIdentityAdapterRegistry
9
+ };
10
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,15 @@
1
+ import { CanonicalIdentity } from '@nebutra/contracts';
2
+
3
+ type IdentityProvider = "clerk" | "authjs" | "custom";
4
+ interface IdentityAdapter<TInput = unknown> {
5
+ provider: IdentityProvider | string;
6
+ mapToCanonical(input: TInput): CanonicalIdentity | null;
7
+ }
8
+ declare class IdentityAdapterRegistry {
9
+ private readonly adapters;
10
+ register(adapter: IdentityAdapter): void;
11
+ get(provider: string): IdentityAdapter | undefined;
12
+ map<TInput = unknown>(provider: string, input: TInput): CanonicalIdentity | null;
13
+ }
14
+
15
+ export { type IdentityAdapter, IdentityAdapterRegistry, type IdentityProvider };
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ import {
2
+ IdentityAdapterRegistry
3
+ } from "./chunk-MZKK4BRU.js";
4
+ export {
5
+ IdentityAdapterRegistry
6
+ };
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@nebutra/identity",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Provider-agnostic identity adapter layer (Clerk-first, Auth.js-ready)",
5
5
  "private": false,
6
- "license": "AGPL-3.0",
6
+ "license": "MIT",
7
7
  "type": "module",
8
8
  "main": "./dist/index.js",
9
9
  "types": "./dist/index.d.ts",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "zod": "^4.3.6",
26
- "@nebutra/contracts": "0.1.0"
26
+ "@nebutra/contracts": "0.1.1"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/node": "^22.19.15",