@getstrata/core 0.5.68 → 0.5.70
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/CHANGELOG.md +8 -0
- package/dist/core/auth/membershipService.d.ts +1 -0
- package/dist/core/auth/oauth/oidcProvider.d.ts +2 -2
- package/dist/core/auth/oauth/providers.d.ts +2 -2
- package/dist/core/auth/oauth/types.d.ts +2 -2
- package/dist/core/contracts/membership.d.ts +1 -0
- package/dist/entries/auth/membershipMiddleware.js +3 -0
- package/dist/entries/auth/membershipScope.js +3 -0
- package/dist/entries/auth/membershipService.js +6 -0
- package/dist/entries/auth/oauth/oidcProvider.js +4 -4
- package/dist/entries/auth/oauth/providers.js +4 -4
- package/dist/index.js +6 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @getstrata/core changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.70
|
|
4
|
+
|
|
5
|
+
- `OAuthProvider.getAuthorizationUrl` / `exchangeCode` accept an optional `redirectUri` so HTMX login can use `/oauth/:provider/callback` while the API keeps `OAUTH_REDIRECT_URI`.
|
|
6
|
+
|
|
7
|
+
## 0.5.69
|
|
8
|
+
|
|
9
|
+
- `MembershipLookup.updateMemberRole(organizationId, userId, role)` is required. The uninitialized lookup throws until `configureMembershipLookup()` is called. `MembershipService.updateMemberRole` delegates to the adapter.
|
|
10
|
+
|
|
3
11
|
## 0.5.68
|
|
4
12
|
|
|
5
13
|
- Published core no longer imports WorkHub `src/config`. Frontend mode, queue retries, CORS, and upload limits read env (`FRONTEND_MODE`, `QUEUE_*`, `CORS_ALLOWED_ORIGINS`, `MAX_UPLOAD_BYTES`).
|
|
@@ -16,6 +16,7 @@ declare class MembershipService {
|
|
|
16
16
|
role?: OrganizationMemberRole;
|
|
17
17
|
}): Promise<import("../contracts/membership").MembershipRecord>;
|
|
18
18
|
removeMember(organizationId: number, userId: number): Promise<unknown>;
|
|
19
|
+
updateMemberRole(organizationId: number, userId: number, role: OrganizationMemberRole): Promise<import("../contracts/membership").MembershipRecord>;
|
|
19
20
|
}
|
|
20
21
|
export type { MembershipRepositoryLike };
|
|
21
22
|
export default MembershipService;
|
|
@@ -11,8 +11,8 @@ declare class OidcProvider implements OAuthProvider {
|
|
|
11
11
|
private readonly options;
|
|
12
12
|
readonly name: string;
|
|
13
13
|
constructor(options: OidcProviderOptions);
|
|
14
|
-
getAuthorizationUrl(state: string): string;
|
|
15
|
-
exchangeCode(code: string): Promise<OAuthProfile>;
|
|
14
|
+
getAuthorizationUrl(state: string, redirectUri?: string): string;
|
|
15
|
+
exchangeCode(code: string, redirectUri?: string): Promise<OAuthProfile>;
|
|
16
16
|
}
|
|
17
17
|
export type { OidcProviderOptions };
|
|
18
18
|
export { OidcProvider };
|
|
@@ -8,8 +8,8 @@ declare class GitHubOAuthProvider implements OAuthProvider {
|
|
|
8
8
|
private readonly options;
|
|
9
9
|
readonly name = "github";
|
|
10
10
|
constructor(options: GitHubOAuthOptions);
|
|
11
|
-
getAuthorizationUrl(state: string): string;
|
|
12
|
-
exchangeCode(code: string): Promise<OAuthProfile>;
|
|
11
|
+
getAuthorizationUrl(state: string, redirectUri?: string): string;
|
|
12
|
+
exchangeCode(code: string, redirectUri?: string): Promise<OAuthProfile>;
|
|
13
13
|
}
|
|
14
14
|
declare class MockOAuthProvider implements OAuthProvider {
|
|
15
15
|
private readonly profile;
|
|
@@ -5,7 +5,7 @@ interface OAuthProfile {
|
|
|
5
5
|
}
|
|
6
6
|
interface OAuthProvider {
|
|
7
7
|
readonly name: string;
|
|
8
|
-
getAuthorizationUrl(state: string): string;
|
|
9
|
-
exchangeCode(code: string): Promise<OAuthProfile>;
|
|
8
|
+
getAuthorizationUrl(state: string, redirectUri?: string): string;
|
|
9
|
+
exchangeCode(code: string, redirectUri?: string): Promise<OAuthProfile>;
|
|
10
10
|
}
|
|
11
11
|
export type { OAuthProfile, OAuthProvider };
|
|
@@ -16,5 +16,6 @@ interface MembershipLookup {
|
|
|
16
16
|
role?: OrganizationMemberRole;
|
|
17
17
|
}): Promise<MembershipRecord>;
|
|
18
18
|
removeMember(organizationId: number, userId: number): Promise<unknown>;
|
|
19
|
+
updateMemberRole(organizationId: number, userId: number, role: OrganizationMemberRole): Promise<MembershipRecord>;
|
|
19
20
|
}
|
|
20
21
|
export type { MembershipLookup, MembershipRecord, OrganizationMemberRole };
|
|
@@ -69,6 +69,9 @@ var uninitializedMembershipLookup = {
|
|
|
69
69
|
},
|
|
70
70
|
async removeMember() {
|
|
71
71
|
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
72
|
+
},
|
|
73
|
+
async updateMemberRole() {
|
|
74
|
+
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
72
75
|
}
|
|
73
76
|
};
|
|
74
77
|
var membershipRepository = uninitializedMembershipLookup;
|
|
@@ -73,6 +73,9 @@ var uninitializedMembershipLookup = {
|
|
|
73
73
|
},
|
|
74
74
|
async removeMember() {
|
|
75
75
|
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
76
|
+
},
|
|
77
|
+
async updateMemberRole() {
|
|
78
|
+
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
76
79
|
}
|
|
77
80
|
};
|
|
78
81
|
var membershipRepository = uninitializedMembershipLookup;
|
|
@@ -72,6 +72,9 @@ var uninitializedMembershipLookup = {
|
|
|
72
72
|
},
|
|
73
73
|
async removeMember() {
|
|
74
74
|
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
75
|
+
},
|
|
76
|
+
async updateMemberRole() {
|
|
77
|
+
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
75
78
|
}
|
|
76
79
|
};
|
|
77
80
|
var membershipRepository = uninitializedMembershipLookup;
|
|
@@ -157,6 +160,9 @@ class MembershipService {
|
|
|
157
160
|
removeMember(organizationId, userId) {
|
|
158
161
|
return this.members.removeMember(organizationId, userId);
|
|
159
162
|
}
|
|
163
|
+
updateMemberRole(organizationId, userId, role) {
|
|
164
|
+
return this.members.updateMemberRole(organizationId, userId, role);
|
|
165
|
+
}
|
|
160
166
|
}
|
|
161
167
|
var membershipService_default = MembershipService;
|
|
162
168
|
export {
|
|
@@ -7,24 +7,24 @@ class OidcProvider {
|
|
|
7
7
|
this.options = options;
|
|
8
8
|
this.name = options.name;
|
|
9
9
|
}
|
|
10
|
-
getAuthorizationUrl(state) {
|
|
10
|
+
getAuthorizationUrl(state, redirectUri = this.options.redirectUri) {
|
|
11
11
|
const params = new URLSearchParams({
|
|
12
12
|
client_id: this.options.clientId,
|
|
13
|
-
redirect_uri:
|
|
13
|
+
redirect_uri: redirectUri,
|
|
14
14
|
response_type: "code",
|
|
15
15
|
scope: (this.options.scopes ?? ["openid", "email", "profile"]).join(" "),
|
|
16
16
|
state
|
|
17
17
|
});
|
|
18
18
|
return `${this.options.issuer.replace(/\/$/, "")}/authorize?${params.toString()}`;
|
|
19
19
|
}
|
|
20
|
-
async exchangeCode(code) {
|
|
20
|
+
async exchangeCode(code, redirectUri = this.options.redirectUri) {
|
|
21
21
|
const tokenResponse = await fetch(`${this.options.issuer.replace(/\/$/, "")}/token`, {
|
|
22
22
|
method: "POST",
|
|
23
23
|
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
24
24
|
body: new URLSearchParams({
|
|
25
25
|
grant_type: "authorization_code",
|
|
26
26
|
code,
|
|
27
|
-
redirect_uri:
|
|
27
|
+
redirect_uri: redirectUri,
|
|
28
28
|
client_id: this.options.clientId,
|
|
29
29
|
client_secret: this.options.clientSecret
|
|
30
30
|
})
|
|
@@ -54,16 +54,16 @@ class GitHubOAuthProvider {
|
|
|
54
54
|
constructor(options) {
|
|
55
55
|
this.options = options;
|
|
56
56
|
}
|
|
57
|
-
getAuthorizationUrl(state) {
|
|
57
|
+
getAuthorizationUrl(state, redirectUri = this.options.redirectUri) {
|
|
58
58
|
const params = new URLSearchParams({
|
|
59
59
|
client_id: this.options.clientId,
|
|
60
|
-
redirect_uri:
|
|
60
|
+
redirect_uri: redirectUri,
|
|
61
61
|
scope: "read:user user:email",
|
|
62
62
|
state
|
|
63
63
|
});
|
|
64
64
|
return `https://github.com/login/oauth/authorize?${params.toString()}`;
|
|
65
65
|
}
|
|
66
|
-
async exchangeCode(code) {
|
|
66
|
+
async exchangeCode(code, redirectUri = this.options.redirectUri) {
|
|
67
67
|
const tokenResponse = await fetch("https://github.com/login/oauth/access_token", {
|
|
68
68
|
method: "POST",
|
|
69
69
|
headers: {
|
|
@@ -74,7 +74,7 @@ class GitHubOAuthProvider {
|
|
|
74
74
|
client_id: this.options.clientId,
|
|
75
75
|
client_secret: this.options.clientSecret,
|
|
76
76
|
code,
|
|
77
|
-
redirect_uri:
|
|
77
|
+
redirect_uri: redirectUri
|
|
78
78
|
})
|
|
79
79
|
});
|
|
80
80
|
const tokenBody = await tokenResponse.json();
|
package/dist/index.js
CHANGED
|
@@ -364,6 +364,9 @@ var uninitializedMembershipLookup = {
|
|
|
364
364
|
},
|
|
365
365
|
async removeMember() {
|
|
366
366
|
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
367
|
+
},
|
|
368
|
+
async updateMemberRole() {
|
|
369
|
+
throw new Error("configureMembershipLookup() must be called before mutating memberships.");
|
|
367
370
|
}
|
|
368
371
|
};
|
|
369
372
|
var membershipRepository = uninitializedMembershipLookup;
|
|
@@ -688,6 +691,9 @@ class MembershipService {
|
|
|
688
691
|
removeMember(organizationId, userId) {
|
|
689
692
|
return this.members.removeMember(organizationId, userId);
|
|
690
693
|
}
|
|
694
|
+
updateMemberRole(organizationId, userId, role) {
|
|
695
|
+
return this.members.updateMemberRole(organizationId, userId, role);
|
|
696
|
+
}
|
|
691
697
|
}
|
|
692
698
|
var membershipService_default = MembershipService;
|
|
693
699
|
// ../../src/core/auth/policy.ts
|