@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.
- package/.turbo/turbo-build.log +37 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/CHANGELOG.md +10 -0
- package/dist/adapters/authjs.d.ts +9 -0
- package/dist/adapters/authjs.js +7 -0
- package/dist/adapters/authjs.js.map +1 -0
- package/dist/adapters/clerk.d.ts +9 -0
- package/dist/adapters/clerk.js +7 -0
- package/dist/adapters/clerk.js.map +1 -0
- package/dist/chunk-DOCMMNRB.js +55 -0
- package/dist/chunk-DOCMMNRB.js.map +1 -0
- package/dist/chunk-MZKK4BRU.js +22 -0
- package/dist/chunk-MZKK4BRU.js.map +1 -0
- package/dist/chunk-QKUYKQO6.js +35 -0
- package/dist/chunk-QKUYKQO6.js.map +1 -0
- package/dist/chunk-ZERXN5CV.js +46 -0
- package/dist/chunk-ZERXN5CV.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +6 -0
- package/dist/registry.js +10 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +3 -3
|
@@ -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
|
+
[34mCLI[39m Building entry: src/index.ts, src/registry.ts, src/types.ts, src/adapters/authjs.ts, src/adapters/clerk.ts
|
|
6
|
+
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
+
[34mCLI[39m tsup v8.5.1
|
|
8
|
+
[34mCLI[39m Using tsup config: /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/iam/identity/tsup.config.ts
|
|
9
|
+
[34mCLI[39m Target: es2022
|
|
10
|
+
[34mCLI[39m Cleaning output folder
|
|
11
|
+
[34mESM[39m Build start
|
|
12
|
+
[32mESM[39m [1mdist/index.js [22m[32m480.00 B[39m
|
|
13
|
+
[32mESM[39m [1mdist/adapters/authjs.js [22m[32m134.00 B[39m
|
|
14
|
+
[32mESM[39m [1mdist/registry.js [22m[32m255.00 B[39m
|
|
15
|
+
[32mESM[39m [1mdist/chunk-DOCMMNRB.js [22m[32m1.34 KB[39m
|
|
16
|
+
[32mESM[39m [1mdist/types.js [22m[32m136.00 B[39m
|
|
17
|
+
[32mESM[39m [1mdist/chunk-MZKK4BRU.js [22m[32m472.00 B[39m
|
|
18
|
+
[32mESM[39m [1mdist/chunk-ZERXN5CV.js [22m[32m1.34 KB[39m
|
|
19
|
+
[32mESM[39m [1mdist/adapters/clerk.js [22m[32m131.00 B[39m
|
|
20
|
+
[32mESM[39m [1mdist/chunk-QKUYKQO6.js [22m[32m1018.00 B[39m
|
|
21
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m71.00 B[39m
|
|
22
|
+
[32mESM[39m [1mdist/adapters/authjs.js.map [22m[32m71.00 B[39m
|
|
23
|
+
[32mESM[39m [1mdist/registry.js.map [22m[32m71.00 B[39m
|
|
24
|
+
[32mESM[39m [1mdist/chunk-DOCMMNRB.js.map [22m[32m3.24 KB[39m
|
|
25
|
+
[32mESM[39m [1mdist/types.js.map [22m[32m71.00 B[39m
|
|
26
|
+
[32mESM[39m [1mdist/chunk-MZKK4BRU.js.map [22m[32m1.22 KB[39m
|
|
27
|
+
[32mESM[39m [1mdist/chunk-ZERXN5CV.js.map [22m[32m2.68 KB[39m
|
|
28
|
+
[32mESM[39m [1mdist/adapters/clerk.js.map [22m[32m71.00 B[39m
|
|
29
|
+
[32mESM[39m [1mdist/chunk-QKUYKQO6.js.map [22m[32m1.94 KB[39m
|
|
30
|
+
[32mESM[39m ⚡️ Build success in 85ms
|
|
31
|
+
[34mDTS[39m Build start
|
|
32
|
+
[32mDTS[39m ⚡️ Build success in 29586ms
|
|
33
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.17 KB[39m
|
|
34
|
+
[32mDTS[39m [1mdist/registry.d.ts [22m[32m216.00 B[39m
|
|
35
|
+
[32mDTS[39m [1mdist/adapters/authjs.d.ts [22m[32m301.00 B[39m
|
|
36
|
+
[32mDTS[39m [1mdist/adapters/clerk.d.ts [22m[32m298.00 B[39m
|
|
37
|
+
[32mDTS[39m [1mdist/types.d.ts [22m[32m605.00 B[39m
|
package/CHANGELOG.md
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -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":[]}
|
package/dist/registry.js
ADDED
|
@@ -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":[]}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Provider-agnostic identity adapter layer (Clerk-first, Auth.js-ready)",
|
|
5
5
|
"private": false,
|
|
6
|
-
"license": "
|
|
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.
|
|
26
|
+
"@nebutra/contracts": "0.1.1"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^22.19.15",
|