@getstrata/core 0.5.70 → 0.5.72
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 +9 -0
- package/README.md +1 -1
- package/dist/entries/openapi/generator.js +20 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @getstrata/core changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.72
|
|
4
|
+
|
|
5
|
+
- OpenAPI treats `POST /auth/forgot-password` and `POST /auth/reset-password` as public operations (no bearer).
|
|
6
|
+
|
|
7
|
+
## 0.5.71
|
|
8
|
+
|
|
9
|
+
- OpenAPI treats `POST /auth/login` and `POST /auth/register` as public (no bearer), including when routes are registered under `API_PREFIX`.
|
|
10
|
+
- Route summaries look up `PUBLIC_ROUTE_DESCRIPTIONS` after stripping `API_PREFIX`.
|
|
11
|
+
|
|
3
12
|
## 0.5.70
|
|
4
13
|
|
|
5
14
|
- `OAuthProvider.getAuthorizationUrl` / `exchangeCode` accept an optional `redirectUri` so HTMX login can use `/oauth/:provider/callback` while the API keeps `OAUTH_REDIRECT_URI`.
|
package/README.md
CHANGED
|
@@ -82,7 +82,7 @@ import type { Migration } from "@getstrata/core/database/migrations/types";
|
|
|
82
82
|
Package name: **`@getstrata/core`** (npm org [`@getstrata`](https://www.npmjs.com/org/getstrata)).
|
|
83
83
|
|
|
84
84
|
1. Add `NPM_TOKEN` to GitHub repository secrets.
|
|
85
|
-
2. Tag a release: `git tag v0.5.
|
|
85
|
+
2. Tag a release: `git tag v0.5.72 && git push origin v0.5.72`
|
|
86
86
|
3. [Release workflow](../../.github/workflows/release.yml) builds and runs `npm publish --access public`.
|
|
87
87
|
|
|
88
88
|
Previously published as `@eyk-workhub/framework@0.1.0`, deprecated in favor of this package.
|
|
@@ -51,6 +51,9 @@ function sdkClientClassName() {
|
|
|
51
51
|
var PUBLIC_ROUTE_DESCRIPTIONS = {
|
|
52
52
|
"GET /auth/me": "Current authenticated user",
|
|
53
53
|
"POST /auth/login": "Login with email and password",
|
|
54
|
+
"POST /auth/register": "Register with name, email, and password",
|
|
55
|
+
"POST /auth/forgot-password": "Request a password reset email",
|
|
56
|
+
"POST /auth/reset-password": "Reset password with email and token",
|
|
54
57
|
"GET /auth/tokens": "List API tokens",
|
|
55
58
|
"POST /auth/tokens": "Create API token",
|
|
56
59
|
"DELETE /auth/tokens/:id": "Revoke API token",
|
|
@@ -83,27 +86,38 @@ var PUBLIC_ROUTE_DESCRIPTIONS = {
|
|
|
83
86
|
function toOpenApiPath(path) {
|
|
84
87
|
return path.replace(/:([A-Za-z_]+)/g, "{$1}");
|
|
85
88
|
}
|
|
89
|
+
function toRelativeApiPath(path) {
|
|
90
|
+
const prefix = apiPrefix();
|
|
91
|
+
if (path === prefix) {
|
|
92
|
+
return "/";
|
|
93
|
+
}
|
|
94
|
+
if (path.startsWith(`${prefix}/`)) {
|
|
95
|
+
return path.slice(prefix.length);
|
|
96
|
+
}
|
|
97
|
+
return path;
|
|
98
|
+
}
|
|
86
99
|
function requiresBearerAuth(path, method) {
|
|
87
|
-
|
|
100
|
+
const relative = toRelativeApiPath(path);
|
|
101
|
+
if (relative.startsWith("/auth/login") || relative.startsWith("/auth/register") || relative.startsWith("/auth/forgot-password") || relative.startsWith("/auth/reset-password") || relative.startsWith("/auth/oauth")) {
|
|
88
102
|
return false;
|
|
89
103
|
}
|
|
90
|
-
if (path.startsWith("/scim/") || path.startsWith("/billing/webhooks/")) {
|
|
104
|
+
if (relative.startsWith("/scim/") || relative.startsWith("/billing/webhooks/") || path.startsWith("/scim/") || path.startsWith("/billing/webhooks/")) {
|
|
91
105
|
return false;
|
|
92
106
|
}
|
|
93
|
-
if (["/health", "/ready", "/metrics", "/"].includes(path)) {
|
|
107
|
+
if (["/health", "/ready", "/metrics", "/"].includes(relative) || ["/health", "/ready", "/metrics", "/"].includes(path)) {
|
|
94
108
|
return false;
|
|
95
109
|
}
|
|
96
|
-
if (method === "GET" && ["/organizations", "/projects", "/tasks", "/search"].some((prefix) => path.startsWith(prefix))) {
|
|
110
|
+
if (method === "GET" && ["/organizations", "/projects", "/tasks", "/search"].some((prefix) => relative.startsWith(prefix) || path.startsWith(prefix))) {
|
|
97
111
|
return false;
|
|
98
112
|
}
|
|
99
|
-
return
|
|
113
|
+
return relative.startsWith("/auth/") || ["POST", "PATCH", "PUT", "DELETE"].includes(method);
|
|
100
114
|
}
|
|
101
115
|
function generateOpenApiSpec(routes) {
|
|
102
116
|
const paths = {};
|
|
103
117
|
for (const route of routes) {
|
|
104
118
|
const openApiPath = toOpenApiPath(route.path);
|
|
105
119
|
const method = route.method.toLowerCase();
|
|
106
|
-
const description = PUBLIC_ROUTE_DESCRIPTIONS[`${route.method} ${route.path}`] ?? `${route.method} ${route.path}`;
|
|
120
|
+
const description = PUBLIC_ROUTE_DESCRIPTIONS[`${route.method} ${toRelativeApiPath(route.path)}`] ?? PUBLIC_ROUTE_DESCRIPTIONS[`${route.method} ${route.path}`] ?? `${route.method} ${route.path}`;
|
|
107
121
|
paths[openApiPath] ??= {};
|
|
108
122
|
paths[openApiPath][method] = {
|
|
109
123
|
summary: description,
|