@glubean/auth 0.1.2

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,11 @@
1
+ import type { ConfigureHttpOptions } from "@glubean/sdk";
2
+ /**
3
+ * API Key authentication — header or query param.
4
+ *
5
+ * @param prefixUrlVar - Var key for the base URL
6
+ * @param headerOrParam - Header name or query param name
7
+ * @param secretKey - Secret key for the API key value
8
+ * @param location - "header" (default) or "query"
9
+ */
10
+ export declare function apiKey(prefixUrlVar: string, headerOrParam: string, secretKey: string, location?: "header" | "query"): ConfigureHttpOptions;
11
+ //# sourceMappingURL=api_key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api_key.d.ts","sourceRoot":"","sources":["../src/api_key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,MAAM,CACpB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,QAAQ,GAAG,OAAkB,GACtC,oBAAoB,CAiCtB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * API Key authentication — header or query param.
3
+ *
4
+ * @param prefixUrlVar - Var key for the base URL
5
+ * @param headerOrParam - Header name or query param name
6
+ * @param secretKey - Secret key for the API key value
7
+ * @param location - "header" (default) or "query"
8
+ */
9
+ export function apiKey(prefixUrlVar, headerOrParam, secretKey, location = "header") {
10
+ if (location === "query") {
11
+ const MARKER = "X-Glubean-ApiKey-Query";
12
+ return {
13
+ prefixUrl: prefixUrlVar,
14
+ headers: { [MARKER]: `{{${secretKey}}}` },
15
+ hooks: {
16
+ beforeRequest: [
17
+ (request) => {
18
+ const keyValue = request.headers.get(MARKER);
19
+ if (!keyValue)
20
+ return request;
21
+ const url = new URL(request.url);
22
+ url.searchParams.set(headerOrParam, keyValue);
23
+ const headers = new Headers(request.headers);
24
+ headers.delete(MARKER);
25
+ return new Request(url.toString(), {
26
+ method: request.method,
27
+ headers,
28
+ body: request.body,
29
+ redirect: request.redirect,
30
+ signal: request.signal,
31
+ });
32
+ },
33
+ ],
34
+ },
35
+ };
36
+ }
37
+ return {
38
+ prefixUrl: prefixUrlVar,
39
+ headers: { [headerOrParam]: `{{${secretKey}}}` },
40
+ };
41
+ }
42
+ //# sourceMappingURL=api_key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api_key.js","sourceRoot":"","sources":["../src/api_key.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CACpB,YAAoB,EACpB,aAAqB,EACrB,SAAiB,EACjB,WAA+B,QAAQ;IAEvC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACxC,OAAO;YACL,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE;YACzC,KAAK,EAAE;gBACL,aAAa,EAAE;oBACb,CAAC,OAAgB,EAAW,EAAE;wBAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAC7C,IAAI,CAAC,QAAQ;4BAAE,OAAO,OAAO,CAAC;wBAE9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACvB,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;4BACjC,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,OAAO;4BACP,IAAI,EAAE,OAAO,CAAC,IAAI;4BAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;4BAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;yBACvB,CAAC,CAAC;oBACL,CAAC;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE;KACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ConfigureHttpOptions } from "@glubean/sdk";
2
+ /**
3
+ * HTTP Basic authentication.
4
+ *
5
+ * Uses a beforeRequest hook to compute `Authorization: Basic base64(user:pass)`
6
+ * from resolved secret values.
7
+ *
8
+ * @param prefixUrlVar - Var key for the base URL
9
+ * @param usernameSecret - Secret key for the username
10
+ * @param passwordSecret - Secret key for the password
11
+ */
12
+ export declare function basicAuth(prefixUrlVar: string, usernameSecret: string, passwordSecret: string): ConfigureHttpOptions;
13
+ //# sourceMappingURL=basic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../src/basic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIzD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB,oBAAoB,CA2BtB"}
package/dist/basic.js ADDED
@@ -0,0 +1,40 @@
1
+ const MARKER = "X-Glubean-Basic-Auth";
2
+ /**
3
+ * HTTP Basic authentication.
4
+ *
5
+ * Uses a beforeRequest hook to compute `Authorization: Basic base64(user:pass)`
6
+ * from resolved secret values.
7
+ *
8
+ * @param prefixUrlVar - Var key for the base URL
9
+ * @param usernameSecret - Secret key for the username
10
+ * @param passwordSecret - Secret key for the password
11
+ */
12
+ export function basicAuth(prefixUrlVar, usernameSecret, passwordSecret) {
13
+ return {
14
+ prefixUrl: prefixUrlVar,
15
+ headers: {
16
+ [MARKER]: `{{${usernameSecret}}}:{{${passwordSecret}}}`,
17
+ },
18
+ hooks: {
19
+ beforeRequest: [
20
+ (request) => {
21
+ const credentials = request.headers.get(MARKER);
22
+ if (!credentials)
23
+ return request;
24
+ const encoded = Buffer.from(credentials).toString("base64");
25
+ const headers = new Headers(request.headers);
26
+ headers.delete(MARKER);
27
+ headers.set("Authorization", `Basic ${encoded}`);
28
+ return new Request(request.url, {
29
+ method: request.method,
30
+ headers,
31
+ body: request.body,
32
+ redirect: request.redirect,
33
+ signal: request.signal,
34
+ });
35
+ },
36
+ ],
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=basic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.js","sourceRoot":"","sources":["../src/basic.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,sBAAsB,CAAC;AAEtC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACvB,YAAoB,EACpB,cAAsB,EACtB,cAAsB;IAEtB,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE;YACP,CAAC,MAAM,CAAC,EAAE,KAAK,cAAc,QAAQ,cAAc,IAAI;SACxD;QACD,KAAK,EAAE;YACL,aAAa,EAAE;gBACb,CAAC,OAAgB,EAAW,EAAE;oBAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAChD,IAAI,CAAC,WAAW;wBAAE,OAAO,OAAO,CAAC;oBAEjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC5D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC;oBACjD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;wBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,OAAO;wBACP,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;qBACvB,CAAC,CAAC;gBACL,CAAC;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ConfigureHttpOptions } from "@glubean/sdk";
2
+ /**
3
+ * Bearer token authentication.
4
+ *
5
+ * @param prefixUrlVar - Var key for the base URL
6
+ * @param tokenSecret - Secret key for the bearer token
7
+ */
8
+ export declare function bearer(prefixUrlVar: string, tokenSecret: string): ConfigureHttpOptions;
9
+ //# sourceMappingURL=bearer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bearer.d.ts","sourceRoot":"","sources":["../src/bearer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,oBAAoB,CAOtB"}
package/dist/bearer.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Bearer token authentication.
3
+ *
4
+ * @param prefixUrlVar - Var key for the base URL
5
+ * @param tokenSecret - Secret key for the bearer token
6
+ */
7
+ export function bearer(prefixUrlVar, tokenSecret) {
8
+ return {
9
+ prefixUrl: prefixUrlVar,
10
+ headers: {
11
+ Authorization: `Bearer {{${tokenSecret}}}`,
12
+ },
13
+ };
14
+ }
15
+ //# sourceMappingURL=bearer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bearer.js","sourceRoot":"","sources":["../src/bearer.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CACpB,YAAoB,EACpB,WAAmB;IAEnB,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE;YACP,aAAa,EAAE,YAAY,WAAW,IAAI;SAC3C;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { bearer } from "./bearer.js";
2
+ export { basicAuth } from "./basic.js";
3
+ export { apiKey } from "./api_key.js";
4
+ export { oauth2 } from "./oauth2.js";
5
+ export type { OAuth2ClientCredentialsOptions, OAuth2RefreshTokenOptions } from "./oauth2.js";
6
+ export { withLogin } from "./with_login.js";
7
+ export type { WithLoginOptions } from "./with_login.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { bearer } from "./bearer.js";
2
+ export { basicAuth } from "./basic.js";
3
+ export { apiKey } from "./api_key.js";
4
+ export { oauth2 } from "./oauth2.js";
5
+ export { withLogin } from "./with_login.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ConfigureHttpOptions } from "@glubean/sdk";
2
+ export interface OAuth2ClientCredentialsOptions {
3
+ prefixUrl: string;
4
+ tokenUrl: string;
5
+ clientId: string;
6
+ clientSecret: string;
7
+ scope?: string;
8
+ }
9
+ export interface OAuth2RefreshTokenOptions {
10
+ prefixUrl: string;
11
+ tokenUrl: string;
12
+ refreshToken: string;
13
+ clientId: string;
14
+ clientSecret?: string;
15
+ }
16
+ declare function clientCredentials(opts: OAuth2ClientCredentialsOptions): ConfigureHttpOptions;
17
+ declare function refreshToken(opts: OAuth2RefreshTokenOptions): ConfigureHttpOptions;
18
+ export declare const oauth2: {
19
+ clientCredentials: typeof clientCredentials;
20
+ refreshToken: typeof refreshToken;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=oauth2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2.d.ts","sourceRoot":"","sources":["../src/oauth2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,cAAc,CAAC;AAI7E,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6BD,iBAAS,iBAAiB,CAAC,IAAI,EAAE,8BAA8B,GAAG,oBAAoB,CA+CrF;AAID,iBAAS,YAAY,CAAC,IAAI,EAAE,yBAAyB,GAAG,oBAAoB,CAuD3E;AAID,eAAO,MAAM,MAAM;;;CAAsC,CAAC"}
package/dist/oauth2.js ADDED
@@ -0,0 +1,122 @@
1
+ // ── Helpers ──────────────────────────────────────────────────────────────────
2
+ const TOKEN_URL_H = "X-Glubean-OAuth2-TokenUrl";
3
+ const CLIENT_ID_H = "X-Glubean-OAuth2-ClientId";
4
+ const CLIENT_SECRET_H = "X-Glubean-OAuth2-ClientSecret";
5
+ const REFRESH_TOKEN_H = "X-Glubean-OAuth2-RefreshToken";
6
+ function rebuildRequest(request, headers) {
7
+ return new Request(request.url, {
8
+ method: request.method,
9
+ headers,
10
+ body: request.body,
11
+ redirect: request.redirect,
12
+ signal: request.signal,
13
+ });
14
+ }
15
+ function cleanMarkers(request, ...names) {
16
+ const h = new Headers(request.headers);
17
+ for (const n of names)
18
+ h.delete(n);
19
+ return h;
20
+ }
21
+ function clientCredentials(opts) {
22
+ let cached = null;
23
+ return {
24
+ prefixUrl: opts.prefixUrl,
25
+ headers: {
26
+ [TOKEN_URL_H]: `{{${opts.tokenUrl}}}`,
27
+ [CLIENT_ID_H]: `{{${opts.clientId}}}`,
28
+ [CLIENT_SECRET_H]: `{{${opts.clientSecret}}}`,
29
+ },
30
+ hooks: {
31
+ beforeRequest: [
32
+ async (request) => {
33
+ const markers = [TOKEN_URL_H, CLIENT_ID_H, CLIENT_SECRET_H];
34
+ if (cached && cached.expiresAt > Date.now() + 30_000) {
35
+ const h = cleanMarkers(request, ...markers);
36
+ h.set("Authorization", `Bearer ${cached.accessToken}`);
37
+ return rebuildRequest(request, h);
38
+ }
39
+ const body = new URLSearchParams({
40
+ grant_type: "client_credentials",
41
+ client_id: request.headers.get(CLIENT_ID_H) ?? "",
42
+ client_secret: request.headers.get(CLIENT_SECRET_H) ?? "",
43
+ });
44
+ if (opts.scope)
45
+ body.set("scope", opts.scope);
46
+ const res = await fetch(request.headers.get(TOKEN_URL_H) ?? opts.tokenUrl, {
47
+ method: "POST",
48
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
49
+ body,
50
+ });
51
+ if (!res.ok) {
52
+ throw new Error(`OAuth2 client_credentials failed (${res.status}): ${await res.text()}`);
53
+ }
54
+ const data = (await res.json());
55
+ cached = { accessToken: data.access_token, expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000 };
56
+ const h = cleanMarkers(request, ...markers);
57
+ h.set("Authorization", `Bearer ${cached.accessToken}`);
58
+ return rebuildRequest(request, h);
59
+ },
60
+ ],
61
+ },
62
+ };
63
+ }
64
+ // ── Refresh Token ───────────────────────────────────────────────────────────
65
+ function refreshToken(opts) {
66
+ let accessToken = null;
67
+ const headers = {
68
+ [TOKEN_URL_H]: `{{${opts.tokenUrl}}}`,
69
+ [REFRESH_TOKEN_H]: `{{${opts.refreshToken}}}`,
70
+ [CLIENT_ID_H]: `{{${opts.clientId}}}`,
71
+ };
72
+ if (opts.clientSecret)
73
+ headers[CLIENT_SECRET_H] = `{{${opts.clientSecret}}}`;
74
+ const allMarkers = [TOKEN_URL_H, REFRESH_TOKEN_H, CLIENT_ID_H, CLIENT_SECRET_H];
75
+ async function fetchToken(request) {
76
+ const body = new URLSearchParams({
77
+ grant_type: "refresh_token",
78
+ refresh_token: request.headers.get(REFRESH_TOKEN_H) ?? "",
79
+ client_id: request.headers.get(CLIENT_ID_H) ?? "",
80
+ });
81
+ const secret = request.headers.get(CLIENT_SECRET_H);
82
+ if (secret)
83
+ body.set("client_secret", secret);
84
+ const res = await fetch(request.headers.get(TOKEN_URL_H) ?? opts.tokenUrl, {
85
+ method: "POST",
86
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
87
+ body,
88
+ });
89
+ if (!res.ok) {
90
+ throw new Error(`OAuth2 refresh_token failed (${res.status}): ${await res.text()}`);
91
+ }
92
+ return (await res.json()).access_token;
93
+ }
94
+ return {
95
+ prefixUrl: opts.prefixUrl,
96
+ headers,
97
+ hooks: {
98
+ beforeRequest: [
99
+ async (request) => {
100
+ if (!accessToken)
101
+ accessToken = await fetchToken(request);
102
+ const h = cleanMarkers(request, ...allMarkers);
103
+ h.set("Authorization", `Bearer ${accessToken}`);
104
+ return rebuildRequest(request, h);
105
+ },
106
+ ],
107
+ afterResponse: [
108
+ async (request, _options, response) => {
109
+ if (response.status !== 401)
110
+ return;
111
+ accessToken = await fetchToken(request);
112
+ const h = cleanMarkers(request, ...allMarkers);
113
+ h.set("Authorization", `Bearer ${accessToken}`);
114
+ return fetch(request.url, { method: request.method, headers: h, body: request.body, redirect: request.redirect, signal: request.signal });
115
+ },
116
+ ],
117
+ },
118
+ };
119
+ }
120
+ // ── Public API ───────────────────────────────────────────────────────────────
121
+ export const oauth2 = { clientCredentials, refreshToken };
122
+ //# sourceMappingURL=oauth2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2.js","sourceRoot":"","sources":["../src/oauth2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { HttpClient, TestBuilder } from "@glubean/sdk";
2
+ export interface WithLoginOptions {
3
+ endpoint: string;
4
+ credentials: Record<string, string>;
5
+ extractToken: (body: any) => string;
6
+ headerName?: string;
7
+ headerPrefix?: string;
8
+ }
9
+ /**
10
+ * Builder transform that adds a login step.
11
+ *
12
+ * POSTs credentials → extracts token → creates `authedHttp` client.
13
+ */
14
+ export declare function withLogin<S>(options: WithLoginOptions): (builder: TestBuilder<S>) => TestBuilder<S & {
15
+ authedHttp: HttpClient;
16
+ }>;
17
+ //# sourceMappingURL=with_login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_login.d.ts","sourceRoot":"","sources":["../src/with_login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAe,MAAM,cAAc,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAQD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,OAAO,EAAE,gBAAgB,GACxB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,GAAG;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC,CAsC1E"}
@@ -0,0 +1,36 @@
1
+ function resolveTemplate(template, ctx) {
2
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
3
+ return ctx.secrets.get(key) ?? ctx.vars.get(key) ?? `{{${key}}}`;
4
+ });
5
+ }
6
+ /**
7
+ * Builder transform that adds a login step.
8
+ *
9
+ * POSTs credentials → extracts token → creates `authedHttp` client.
10
+ */
11
+ export function withLogin(options) {
12
+ const { endpoint, credentials, extractToken, headerName = "Authorization", headerPrefix = "Bearer ", } = options;
13
+ return (builder) => {
14
+ return builder.step("login", async (ctx, state) => {
15
+ const resolved = {};
16
+ for (const [k, v] of Object.entries(credentials)) {
17
+ resolved[k] = resolveTemplate(v, ctx);
18
+ }
19
+ const response = await ctx.http
20
+ .post(resolveTemplate(endpoint, ctx), {
21
+ json: resolved,
22
+ throwHttpErrors: false,
23
+ })
24
+ .json();
25
+ const token = extractToken(response);
26
+ if (!token || typeof token !== "string") {
27
+ throw new Error("withLogin: extractToken() did not return a valid string token");
28
+ }
29
+ const authedHttp = ctx.http.extend({
30
+ headers: { [headerName]: `${headerPrefix}${token}` },
31
+ });
32
+ return { ...state, authedHttp };
33
+ });
34
+ };
35
+ }
36
+ //# sourceMappingURL=with_login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_login.js","sourceRoot":"","sources":["../src/with_login.ts"],"names":[],"mappings":"AAWA,SAAS,eAAe,CAAC,QAAgB,EAAE,GAAgB;IACzD,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QAC3D,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,OAAyB;IAEzB,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,UAAU,GAAG,eAAe,EAC5B,YAAY,GAAG,SAAS,GACzB,GAAG,OAAO,CAAC;IAEZ,OAAO,CAAC,OAAuB,EAAE,EAAE;QACjC,OAAO,OAAO,CAAC,IAAI,CACjB,OAAO,EACP,KAAK,EAAE,GAAgB,EAAE,KAAQ,EAA2C,EAAE;YAC5E,MAAM,QAAQ,GAA2B,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjD,QAAQ,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI;iBAC5B,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBACpC,IAAI,EAAE,QAAQ;gBACd,eAAe,EAAE,KAAK;aACvB,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnF,CAAC;YAED,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACjC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,YAAY,GAAG,KAAK,EAAE,EAAE;aACrD,CAAC,CAAC;YAEH,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC;QAClC,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@glubean/auth",
3
+ "version": "0.1.2",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js"
9
+ }
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "dependencies": {
15
+ "@glubean/sdk": "0.1.2"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.0.0"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.build.json",
22
+ "test": "vitest run"
23
+ }
24
+ }