@irongate-dev/nextjs 0.1.0-beta

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 irongate-dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/client.tsx
22
+ var client_exports = {};
23
+ __export(client_exports, {
24
+ AuthProviderClient: () => AuthProviderClient,
25
+ useAuth: () => useAuth
26
+ });
27
+ module.exports = __toCommonJS(client_exports);
28
+ var import_react = require("react");
29
+ var import_core = require("@irongate-dev/core");
30
+ var import_react2 = require("@irongate-dev/react");
31
+ var import_jsx_runtime = require("react/jsx-runtime");
32
+ function AuthProviderClient({
33
+ children,
34
+ baseUrl,
35
+ clientId,
36
+ initialUser
37
+ }) {
38
+ const client = (0, import_react.useMemo)(
39
+ () => (0, import_core.createClient)({ baseUrl, clientId, ...initialUser ? { initialUser } : {} }),
40
+ [baseUrl, clientId, initialUser]
41
+ );
42
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react2.IrongateProvider, { client, children });
43
+ }
44
+ function useAuth() {
45
+ return (0, import_react2.useIrongate)();
46
+ }
47
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { createClient } from \"@irongate-dev/core\";\nimport { IrongateProvider, useIrongate } from \"@irongate-dev/react\";\nimport type { UseIrongateReturn } from \"@irongate-dev/react\";\nimport type { User } from \"@irongate-dev/types\";\n\nexport interface AuthProviderClientProps {\n children: ReactNode;\n baseUrl: string;\n clientId: string;\n initialUser?: User;\n}\n\nexport function AuthProviderClient({\n children,\n baseUrl,\n clientId,\n initialUser,\n}: AuthProviderClientProps): JSX.Element {\n const client = useMemo(\n () => createClient({ baseUrl, clientId, ...(initialUser ? { initialUser } : {}) }),\n [baseUrl, clientId, initialUser]\n );\n return <IrongateProvider client={client}>{children}</IrongateProvider>;\n}\n\nexport function useAuth(): UseIrongateReturn {\n return useIrongate();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAwC;AACxC,kBAA6B;AAC7B,IAAAA,gBAA8C;AAqBrC;AAVF,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,aAAS;AAAA,IACb,UAAM,0BAAa,EAAE,SAAS,UAAU,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC,EAAG,CAAC;AAAA,IACjF,CAAC,SAAS,UAAU,WAAW;AAAA,EACjC;AACA,SAAO,4CAAC,kCAAiB,QAAiB,UAAS;AACrD;AAEO,SAAS,UAA6B;AAC3C,aAAO,2BAAY;AACrB;","names":["import_react"]}
package/dist/client.js ADDED
@@ -0,0 +1,27 @@
1
+ "use client";
2
+
3
+ // src/client.tsx
4
+ import { useMemo } from "react";
5
+ import { createClient } from "@irongate-dev/core";
6
+ import { IrongateProvider, useIrongate } from "@irongate-dev/react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ function AuthProviderClient({
9
+ children,
10
+ baseUrl,
11
+ clientId,
12
+ initialUser
13
+ }) {
14
+ const client = useMemo(
15
+ () => createClient({ baseUrl, clientId, ...initialUser ? { initialUser } : {} }),
16
+ [baseUrl, clientId, initialUser]
17
+ );
18
+ return /* @__PURE__ */ jsx(IrongateProvider, { client, children });
19
+ }
20
+ function useAuth() {
21
+ return useIrongate();
22
+ }
23
+ export {
24
+ AuthProviderClient,
25
+ useAuth
26
+ };
27
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { createClient } from \"@irongate-dev/core\";\nimport { IrongateProvider, useIrongate } from \"@irongate-dev/react\";\nimport type { UseIrongateReturn } from \"@irongate-dev/react\";\nimport type { User } from \"@irongate-dev/types\";\n\nexport interface AuthProviderClientProps {\n children: ReactNode;\n baseUrl: string;\n clientId: string;\n initialUser?: User;\n}\n\nexport function AuthProviderClient({\n children,\n baseUrl,\n clientId,\n initialUser,\n}: AuthProviderClientProps): JSX.Element {\n const client = useMemo(\n () => createClient({ baseUrl, clientId, ...(initialUser ? { initialUser } : {}) }),\n [baseUrl, clientId, initialUser]\n );\n return <IrongateProvider client={client}>{children}</IrongateProvider>;\n}\n\nexport function useAuth(): UseIrongateReturn {\n return useIrongate();\n}\n"],"mappings":";;;AAEA,SAAS,eAA+B;AACxC,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB,mBAAmB;AAqBrC;AAVF,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,SAAS;AAAA,IACb,MAAM,aAAa,EAAE,SAAS,UAAU,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC,EAAG,CAAC;AAAA,IACjF,CAAC,SAAS,UAAU,WAAW;AAAA,EACjC;AACA,SAAO,oBAAC,oBAAiB,QAAiB,UAAS;AACrD;AAEO,SAAS,UAA6B;AAC3C,SAAO,YAAY;AACrB;","names":[]}
package/dist/index.cjs ADDED
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.tsx
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ AuthProvider: () => AuthProvider
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+ var import_headers = require("next/headers");
27
+ var import_core2 = require("@irongate-dev/core");
28
+
29
+ // src/client.tsx
30
+ var import_react = require("react");
31
+ var import_core = require("@irongate-dev/core");
32
+ var import_react2 = require("@irongate-dev/react");
33
+ var import_jsx_runtime = require("react/jsx-runtime");
34
+ function AuthProviderClient({
35
+ children,
36
+ baseUrl,
37
+ clientId,
38
+ initialUser
39
+ }) {
40
+ const client = (0, import_react.useMemo)(
41
+ () => (0, import_core.createClient)({ baseUrl, clientId, ...initialUser ? { initialUser } : {} }),
42
+ [baseUrl, clientId, initialUser]
43
+ );
44
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react2.IrongateProvider, { client, children });
45
+ }
46
+
47
+ // src/index.tsx
48
+ var import_jsx_runtime2 = require("react/jsx-runtime");
49
+ async function AuthProvider({ children }) {
50
+ const baseUrl = process.env.IRONGATE_BASE_URL;
51
+ const clientId = process.env.IRONGATE_CLIENT_ID;
52
+ if (!baseUrl) {
53
+ throw new import_core2.IrongateError("INVALID_CONFIG", "IRONGATE_BASE_URL is required");
54
+ }
55
+ if (!clientId) {
56
+ throw new import_core2.IrongateError("INVALID_CONFIG", "IRONGATE_CLIENT_ID is required");
57
+ }
58
+ const cookieNames = (0, import_core2.getAuthCookieNames)(process.env.IRONGATE_COOKIE_PREFIX);
59
+ const cookieStore = await (0, import_headers.cookies)();
60
+ const sessionCookieValue = cookieStore.get(cookieNames.session)?.value;
61
+ const sessionPayload = sessionCookieValue ? (0, import_core2.parseSessionCookie)(sessionCookieValue) : null;
62
+ const initialUser = sessionPayload ? {
63
+ id: sessionPayload.id,
64
+ email: sessionPayload.email,
65
+ emailVerified: false,
66
+ ...sessionPayload.name ? { name: sessionPayload.name } : {},
67
+ ...sessionPayload.avatarUrl ? { avatarUrl: sessionPayload.avatarUrl } : {},
68
+ // Widened from the cookie's plain `string` to the UserStatus literal
69
+ // union — safe because this is our own previously-set UI-hint
70
+ // cookie (§2.4), never a security decision; an unexpected value here
71
+ // has no worse consequence than a stale display hint.
72
+ status: sessionPayload.status,
73
+ createdAt: "",
74
+ metadata: {}
75
+ } : void 0;
76
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AuthProviderClient, { baseUrl, clientId, ...initialUser ? { initialUser } : {}, children });
77
+ }
78
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../src/client.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cookies } from \"next/headers\";\nimport { IrongateError, getAuthCookieNames, parseSessionCookie } from \"@irongate-dev/core\";\nimport type { User, UserStatus } from \"@irongate-dev/types\";\nimport { AuthProviderClient } from \"./client.js\";\n\nexport interface AuthProviderProps {\n children: ReactNode;\n}\n\nexport async function AuthProvider({ children }: AuthProviderProps): Promise<JSX.Element> {\n const baseUrl = process.env.IRONGATE_BASE_URL;\n const clientId = process.env.IRONGATE_CLIENT_ID;\n if (!baseUrl) {\n throw new IrongateError(\"INVALID_CONFIG\", \"IRONGATE_BASE_URL is required\");\n }\n if (!clientId) {\n throw new IrongateError(\"INVALID_CONFIG\", \"IRONGATE_CLIENT_ID is required\");\n }\n\n const cookieNames = getAuthCookieNames(process.env.IRONGATE_COOKIE_PREFIX);\n const cookieStore = await cookies();\n const sessionCookieValue = cookieStore.get(cookieNames.session)?.value;\n const sessionPayload = sessionCookieValue ? parseSessionCookie(sessionCookieValue) : null;\n\n // The irongate_session cookie is a UI hint only (SEC-F18-01/§2.4) — it\n // never carries emailVerified/createdAt/metadata, so those are seeded\n // with honest \"unknown\" placeholders here, not fabricated real data.\n // AuthClient's next real sign-in/refresh/getSession() call replaces this\n // entirely (see Milestone 1 Task 6).\n const initialUser: User | undefined = sessionPayload\n ? {\n id: sessionPayload.id,\n email: sessionPayload.email,\n emailVerified: false,\n ...(sessionPayload.name ? { name: sessionPayload.name } : {}),\n ...(sessionPayload.avatarUrl ? { avatarUrl: sessionPayload.avatarUrl } : {}),\n // Widened from the cookie's plain `string` to the UserStatus literal\n // union — safe because this is our own previously-set UI-hint\n // cookie (§2.4), never a security decision; an unexpected value here\n // has no worse consequence than a stale display hint.\n status: sessionPayload.status as UserStatus,\n createdAt: \"\",\n metadata: {},\n }\n : undefined;\n\n return (\n <AuthProviderClient baseUrl={baseUrl} clientId={clientId} {...(initialUser ? { initialUser } : {})}>\n {children}\n </AuthProviderClient>\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { createClient } from \"@irongate-dev/core\";\nimport { IrongateProvider, useIrongate } from \"@irongate-dev/react\";\nimport type { UseIrongateReturn } from \"@irongate-dev/react\";\nimport type { User } from \"@irongate-dev/types\";\n\nexport interface AuthProviderClientProps {\n children: ReactNode;\n baseUrl: string;\n clientId: string;\n initialUser?: User;\n}\n\nexport function AuthProviderClient({\n children,\n baseUrl,\n clientId,\n initialUser,\n}: AuthProviderClientProps): JSX.Element {\n const client = useMemo(\n () => createClient({ baseUrl, clientId, ...(initialUser ? { initialUser } : {}) }),\n [baseUrl, clientId, initialUser]\n );\n return <IrongateProvider client={client}>{children}</IrongateProvider>;\n}\n\nexport function useAuth(): UseIrongateReturn {\n return useIrongate();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAwB;AACxB,IAAAA,eAAsE;;;ACAtE,mBAAwC;AACxC,kBAA6B;AAC7B,IAAAC,gBAA8C;AAqBrC;AAVF,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,aAAS;AAAA,IACb,UAAM,0BAAa,EAAE,SAAS,UAAU,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC,EAAG,CAAC;AAAA,IACjF,CAAC,SAAS,UAAU,WAAW;AAAA,EACjC;AACA,SAAO,4CAAC,kCAAiB,QAAiB,UAAS;AACrD;;;ADsBI,IAAAC,sBAAA;AAtCJ,eAAsB,aAAa,EAAE,SAAS,GAA4C;AACxF,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,2BAAc,kBAAkB,+BAA+B;AAAA,EAC3E;AACA,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,2BAAc,kBAAkB,gCAAgC;AAAA,EAC5E;AAEA,QAAM,kBAAc,iCAAmB,QAAQ,IAAI,sBAAsB;AACzE,QAAM,cAAc,UAAM,wBAAQ;AAClC,QAAM,qBAAqB,YAAY,IAAI,YAAY,OAAO,GAAG;AACjE,QAAM,iBAAiB,yBAAqB,iCAAmB,kBAAkB,IAAI;AAOrF,QAAM,cAAgC,iBAClC;AAAA,IACE,IAAI,eAAe;AAAA,IACnB,OAAO,eAAe;AAAA,IACtB,eAAe;AAAA,IACf,GAAI,eAAe,OAAO,EAAE,MAAM,eAAe,KAAK,IAAI,CAAC;AAAA,IAC3D,GAAI,eAAe,YAAY,EAAE,WAAW,eAAe,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK1E,QAAQ,eAAe;AAAA,IACvB,WAAW;AAAA,IACX,UAAU,CAAC;AAAA,EACb,IACA;AAEJ,SACE,6CAAC,sBAAmB,SAAkB,UAAqB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC,GAC7F,UACH;AAEJ;","names":["import_core","import_react","import_jsx_runtime"]}
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ interface AuthProviderProps {
4
+ children: ReactNode;
5
+ }
6
+ declare function AuthProvider({ children }: AuthProviderProps): Promise<JSX.Element>;
7
+
8
+ export { AuthProvider, type AuthProviderProps };
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ interface AuthProviderProps {
4
+ children: ReactNode;
5
+ }
6
+ declare function AuthProvider({ children }: AuthProviderProps): Promise<JSX.Element>;
7
+
8
+ export { AuthProvider, type AuthProviderProps };
package/dist/index.js ADDED
@@ -0,0 +1,57 @@
1
+ // src/index.tsx
2
+ import { cookies } from "next/headers";
3
+ import { IrongateError, getAuthCookieNames, parseSessionCookie } from "@irongate-dev/core";
4
+
5
+ // src/client.tsx
6
+ import { useMemo } from "react";
7
+ import { createClient } from "@irongate-dev/core";
8
+ import { IrongateProvider, useIrongate } from "@irongate-dev/react";
9
+ import { jsx } from "react/jsx-runtime";
10
+ function AuthProviderClient({
11
+ children,
12
+ baseUrl,
13
+ clientId,
14
+ initialUser
15
+ }) {
16
+ const client = useMemo(
17
+ () => createClient({ baseUrl, clientId, ...initialUser ? { initialUser } : {} }),
18
+ [baseUrl, clientId, initialUser]
19
+ );
20
+ return /* @__PURE__ */ jsx(IrongateProvider, { client, children });
21
+ }
22
+
23
+ // src/index.tsx
24
+ import { jsx as jsx2 } from "react/jsx-runtime";
25
+ async function AuthProvider({ children }) {
26
+ const baseUrl = process.env.IRONGATE_BASE_URL;
27
+ const clientId = process.env.IRONGATE_CLIENT_ID;
28
+ if (!baseUrl) {
29
+ throw new IrongateError("INVALID_CONFIG", "IRONGATE_BASE_URL is required");
30
+ }
31
+ if (!clientId) {
32
+ throw new IrongateError("INVALID_CONFIG", "IRONGATE_CLIENT_ID is required");
33
+ }
34
+ const cookieNames = getAuthCookieNames(process.env.IRONGATE_COOKIE_PREFIX);
35
+ const cookieStore = await cookies();
36
+ const sessionCookieValue = cookieStore.get(cookieNames.session)?.value;
37
+ const sessionPayload = sessionCookieValue ? parseSessionCookie(sessionCookieValue) : null;
38
+ const initialUser = sessionPayload ? {
39
+ id: sessionPayload.id,
40
+ email: sessionPayload.email,
41
+ emailVerified: false,
42
+ ...sessionPayload.name ? { name: sessionPayload.name } : {},
43
+ ...sessionPayload.avatarUrl ? { avatarUrl: sessionPayload.avatarUrl } : {},
44
+ // Widened from the cookie's plain `string` to the UserStatus literal
45
+ // union — safe because this is our own previously-set UI-hint
46
+ // cookie (§2.4), never a security decision; an unexpected value here
47
+ // has no worse consequence than a stale display hint.
48
+ status: sessionPayload.status,
49
+ createdAt: "",
50
+ metadata: {}
51
+ } : void 0;
52
+ return /* @__PURE__ */ jsx2(AuthProviderClient, { baseUrl, clientId, ...initialUser ? { initialUser } : {}, children });
53
+ }
54
+ export {
55
+ AuthProvider
56
+ };
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../src/client.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cookies } from \"next/headers\";\nimport { IrongateError, getAuthCookieNames, parseSessionCookie } from \"@irongate-dev/core\";\nimport type { User, UserStatus } from \"@irongate-dev/types\";\nimport { AuthProviderClient } from \"./client.js\";\n\nexport interface AuthProviderProps {\n children: ReactNode;\n}\n\nexport async function AuthProvider({ children }: AuthProviderProps): Promise<JSX.Element> {\n const baseUrl = process.env.IRONGATE_BASE_URL;\n const clientId = process.env.IRONGATE_CLIENT_ID;\n if (!baseUrl) {\n throw new IrongateError(\"INVALID_CONFIG\", \"IRONGATE_BASE_URL is required\");\n }\n if (!clientId) {\n throw new IrongateError(\"INVALID_CONFIG\", \"IRONGATE_CLIENT_ID is required\");\n }\n\n const cookieNames = getAuthCookieNames(process.env.IRONGATE_COOKIE_PREFIX);\n const cookieStore = await cookies();\n const sessionCookieValue = cookieStore.get(cookieNames.session)?.value;\n const sessionPayload = sessionCookieValue ? parseSessionCookie(sessionCookieValue) : null;\n\n // The irongate_session cookie is a UI hint only (SEC-F18-01/§2.4) — it\n // never carries emailVerified/createdAt/metadata, so those are seeded\n // with honest \"unknown\" placeholders here, not fabricated real data.\n // AuthClient's next real sign-in/refresh/getSession() call replaces this\n // entirely (see Milestone 1 Task 6).\n const initialUser: User | undefined = sessionPayload\n ? {\n id: sessionPayload.id,\n email: sessionPayload.email,\n emailVerified: false,\n ...(sessionPayload.name ? { name: sessionPayload.name } : {}),\n ...(sessionPayload.avatarUrl ? { avatarUrl: sessionPayload.avatarUrl } : {}),\n // Widened from the cookie's plain `string` to the UserStatus literal\n // union — safe because this is our own previously-set UI-hint\n // cookie (§2.4), never a security decision; an unexpected value here\n // has no worse consequence than a stale display hint.\n status: sessionPayload.status as UserStatus,\n createdAt: \"\",\n metadata: {},\n }\n : undefined;\n\n return (\n <AuthProviderClient baseUrl={baseUrl} clientId={clientId} {...(initialUser ? { initialUser } : {})}>\n {children}\n </AuthProviderClient>\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { createClient } from \"@irongate-dev/core\";\nimport { IrongateProvider, useIrongate } from \"@irongate-dev/react\";\nimport type { UseIrongateReturn } from \"@irongate-dev/react\";\nimport type { User } from \"@irongate-dev/types\";\n\nexport interface AuthProviderClientProps {\n children: ReactNode;\n baseUrl: string;\n clientId: string;\n initialUser?: User;\n}\n\nexport function AuthProviderClient({\n children,\n baseUrl,\n clientId,\n initialUser,\n}: AuthProviderClientProps): JSX.Element {\n const client = useMemo(\n () => createClient({ baseUrl, clientId, ...(initialUser ? { initialUser } : {}) }),\n [baseUrl, clientId, initialUser]\n );\n return <IrongateProvider client={client}>{children}</IrongateProvider>;\n}\n\nexport function useAuth(): UseIrongateReturn {\n return useIrongate();\n}\n"],"mappings":";AACA,SAAS,eAAe;AACxB,SAAS,eAAe,oBAAoB,0BAA0B;;;ACAtE,SAAS,eAA+B;AACxC,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB,mBAAmB;AAqBrC;AAVF,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,SAAS;AAAA,IACb,MAAM,aAAa,EAAE,SAAS,UAAU,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC,EAAG,CAAC;AAAA,IACjF,CAAC,SAAS,UAAU,WAAW;AAAA,EACjC;AACA,SAAO,oBAAC,oBAAiB,QAAiB,UAAS;AACrD;;;ADsBI,gBAAAA,YAAA;AAtCJ,eAAsB,aAAa,EAAE,SAAS,GAA4C;AACxF,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,cAAc,kBAAkB,+BAA+B;AAAA,EAC3E;AACA,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,cAAc,kBAAkB,gCAAgC;AAAA,EAC5E;AAEA,QAAM,cAAc,mBAAmB,QAAQ,IAAI,sBAAsB;AACzE,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,qBAAqB,YAAY,IAAI,YAAY,OAAO,GAAG;AACjE,QAAM,iBAAiB,qBAAqB,mBAAmB,kBAAkB,IAAI;AAOrF,QAAM,cAAgC,iBAClC;AAAA,IACE,IAAI,eAAe;AAAA,IACnB,OAAO,eAAe;AAAA,IACtB,eAAe;AAAA,IACf,GAAI,eAAe,OAAO,EAAE,MAAM,eAAe,KAAK,IAAI,CAAC;AAAA,IAC3D,GAAI,eAAe,YAAY,EAAE,WAAW,eAAe,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK1E,QAAQ,eAAe;AAAA,IACvB,WAAW;AAAA,IACX,UAAU,CAAC;AAAA,EACb,IACA;AAEJ,SACE,gBAAAA,KAAC,sBAAmB,SAAkB,UAAqB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC,GAC7F,UACH;AAEJ;","names":["jsx"]}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/middleware.ts
21
+ var middleware_exports = {};
22
+ __export(middleware_exports, {
23
+ createMiddleware: () => createMiddleware,
24
+ default: () => middleware
25
+ });
26
+ module.exports = __toCommonJS(middleware_exports);
27
+ var import_server = require("next/server");
28
+ var import_core = require("@irongate-dev/core");
29
+
30
+ // src/cookie-env.ts
31
+ function parseBooleanEnv(value) {
32
+ if (value === "true") return true;
33
+ if (value === "false") return false;
34
+ return void 0;
35
+ }
36
+ function resolveSecureDefault(explicit) {
37
+ return explicit ?? parseBooleanEnv(process.env.IRONGATE_COOKIE_SECURE) ?? process.env.NODE_ENV === "production";
38
+ }
39
+
40
+ // src/middleware.ts
41
+ function resolveConfig(options) {
42
+ const baseUrl = options.baseUrl ?? process.env.IRONGATE_BASE_URL;
43
+ const clientId = options.clientId ?? process.env.IRONGATE_CLIENT_ID;
44
+ if (!baseUrl) {
45
+ throw new import_core.IrongateError(
46
+ "INVALID_CONFIG",
47
+ "IRONGATE_BASE_URL is required (set the env var or pass baseUrl to createMiddleware)"
48
+ );
49
+ }
50
+ if (!clientId) {
51
+ throw new import_core.IrongateError(
52
+ "INVALID_CONFIG",
53
+ "IRONGATE_CLIENT_ID is required (set the env var or pass clientId to createMiddleware)"
54
+ );
55
+ }
56
+ const cookieDomain = options.cookieDomain ?? process.env.IRONGATE_COOKIE_DOMAIN;
57
+ const secure = resolveSecureDefault(options.cookieOptions?.secure);
58
+ const sameSite = options.cookieOptions?.sameSite ?? process.env.IRONGATE_COOKIE_SAMESITE ?? "lax";
59
+ return {
60
+ baseUrl,
61
+ clientId,
62
+ publicRoutes: options.publicRoutes ?? [],
63
+ signInUrl: options.signInUrl ?? process.env.IRONGATE_SIGN_IN_URL ?? "/sign-in",
64
+ afterSignInUrl: options.afterSignInUrl ?? process.env.IRONGATE_AFTER_SIGN_IN ?? "/dashboard",
65
+ cookieNames: (0, import_core.getAuthCookieNames)(options.cookiePrefix ?? process.env.IRONGATE_COOKIE_PREFIX),
66
+ cookieConfig: {
67
+ ...cookieDomain ? { cookieDomain } : {},
68
+ secure,
69
+ sameSite
70
+ },
71
+ jwksCacheTtlMs: Number(process.env.IRONGATE_JWKS_CACHE_TTL ?? 36e5)
72
+ };
73
+ }
74
+ function stripIrongateHeaders(headers) {
75
+ const cleaned = new Headers(headers);
76
+ for (const key of Array.from(cleaned.keys())) {
77
+ if (key.toLowerCase().startsWith("x-irongate-")) {
78
+ cleaned.delete(key);
79
+ }
80
+ }
81
+ return cleaned;
82
+ }
83
+ function isPublicRoute(pathname, publicRoutes) {
84
+ return publicRoutes.some((route) => pathname === route || pathname.startsWith(`${route}/`));
85
+ }
86
+ function redirectToSignIn(request, config) {
87
+ const signInUrl = new URL(config.signInUrl, request.url);
88
+ signInUrl.searchParams.set("returnUrl", request.nextUrl.pathname);
89
+ return import_server.NextResponse.redirect(signInUrl);
90
+ }
91
+ function clearCookiesAndRedirect(request, config, revocationReason) {
92
+ const signInUrl = new URL(config.signInUrl, request.url);
93
+ if (revocationReason) {
94
+ signInUrl.searchParams.set("reason", revocationReason);
95
+ }
96
+ signInUrl.searchParams.set("returnUrl", request.nextUrl.pathname);
97
+ const response = import_server.NextResponse.redirect(signInUrl);
98
+ for (const cookie of (0, import_core.buildClearCookies)(config.cookieNames, config.cookieConfig)) {
99
+ response.cookies.set(cookie.name, cookie.value, cookie.options);
100
+ }
101
+ return response;
102
+ }
103
+ function withUserHeaders(requestHeaders, claims) {
104
+ requestHeaders.set("x-irongate-user-id", claims.sub);
105
+ requestHeaders.set("x-irongate-user-json", JSON.stringify(claims));
106
+ return import_server.NextResponse.next({ request: { headers: requestHeaders } });
107
+ }
108
+ var jwksCacheSingleton = null;
109
+ var jwksCacheBaseUrl = null;
110
+ function getJwksCache(baseUrl, jwksCacheTtlMs) {
111
+ if (!jwksCacheSingleton || jwksCacheBaseUrl !== baseUrl) {
112
+ jwksCacheSingleton = (0, import_core.createJwksCache)({ baseUrl, fetch, jwksCacheTtlMs });
113
+ jwksCacheBaseUrl = baseUrl;
114
+ }
115
+ return jwksCacheSingleton;
116
+ }
117
+ async function refreshSession(refreshToken, config) {
118
+ const response = await fetch(`${config.baseUrl}/v1/auth/refresh`, {
119
+ method: "POST",
120
+ headers: { "Content-Type": "application/json" },
121
+ body: JSON.stringify({ refreshToken, clientId: config.clientId })
122
+ });
123
+ if (response.ok) {
124
+ return await response.json();
125
+ }
126
+ const errorBody = await response.json().catch(() => ({}));
127
+ const errorCode = errorBody.code;
128
+ if (errorCode === "TOKEN_REUSE_DETECTED" || errorCode === "TOKEN_REVOKED" || errorCode === "TOKEN_EXPIRED") {
129
+ return {
130
+ revoked: true,
131
+ ...errorBody.revocationReason ? { revocationReason: errorBody.revocationReason } : {}
132
+ };
133
+ }
134
+ throw new import_core.IrongateError("INTERNAL_SERVER_ERROR", `Refresh failed: ${errorCode ?? "UNKNOWN"}`);
135
+ }
136
+ function createMiddleware(options = {}) {
137
+ const config = resolveConfig(options);
138
+ return async function middleware2(request) {
139
+ const requestHeaders = stripIrongateHeaders(request.headers);
140
+ const pathname = request.nextUrl.pathname;
141
+ if (isPublicRoute(pathname, config.publicRoutes)) {
142
+ return import_server.NextResponse.next({ request: { headers: requestHeaders } });
143
+ }
144
+ const accessToken = request.cookies.get(config.cookieNames.accessToken)?.value;
145
+ const refreshToken = request.cookies.get(config.cookieNames.refreshToken)?.value;
146
+ if (!accessToken && !refreshToken) {
147
+ return redirectToSignIn(request, config);
148
+ }
149
+ const jwksCache = getJwksCache(config.baseUrl, config.jwksCacheTtlMs);
150
+ const verifyToken = (0, import_core.createVerifyToken)({
151
+ baseUrl: config.baseUrl,
152
+ fetch,
153
+ clockSkewToleranceMs: 0,
154
+ jwksCache,
155
+ checkJtiRevoked: void 0
156
+ });
157
+ let claims = null;
158
+ if (accessToken) {
159
+ try {
160
+ claims = await verifyToken(accessToken);
161
+ } catch (err) {
162
+ if (import_core.IrongateError.isIrongate(err) && err.code !== "TOKEN_EXPIRED") {
163
+ return clearCookiesAndRedirect(request, config);
164
+ }
165
+ claims = null;
166
+ }
167
+ }
168
+ if (!claims && refreshToken) {
169
+ const refreshResult = await refreshSession(refreshToken, config);
170
+ if ("revoked" in refreshResult) {
171
+ return clearCookiesAndRedirect(request, config, refreshResult.revocationReason);
172
+ }
173
+ claims = await verifyToken(refreshResult.accessToken);
174
+ const response = withUserHeaders(requestHeaders, claims);
175
+ for (const cookie of (0, import_core.buildAuthCookies)(
176
+ {
177
+ accessToken: refreshResult.accessToken,
178
+ ...refreshResult.refreshToken ? { refreshToken: refreshResult.refreshToken } : {},
179
+ expiresIn: refreshResult.expiresIn
180
+ },
181
+ config.cookieNames,
182
+ config.cookieConfig
183
+ )) {
184
+ response.cookies.set(cookie.name, cookie.value, cookie.options);
185
+ }
186
+ return response;
187
+ }
188
+ if (!claims) {
189
+ return redirectToSignIn(request, config);
190
+ }
191
+ return withUserHeaders(requestHeaders, claims);
192
+ };
193
+ }
194
+ var defaultMiddlewareInstance = null;
195
+ async function middleware(request) {
196
+ if (!defaultMiddlewareInstance) {
197
+ defaultMiddlewareInstance = createMiddleware();
198
+ }
199
+ return defaultMiddlewareInstance(request);
200
+ }
201
+ //# sourceMappingURL=middleware.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware.ts","../src/cookie-env.ts"],"sourcesContent":["import { NextResponse } from \"next/server\";\nimport type { NextRequest } from \"next/server\";\nimport {\n IrongateError,\n createJwksCache,\n createVerifyToken,\n getAuthCookieNames,\n buildAuthCookies,\n buildClearCookies,\n} from \"@irongate-dev/core\";\nimport type { AuthCookieNames, JwksCache } from \"@irongate-dev/core\";\nimport type { TokenClaims, TokenSet } from \"@irongate-dev/types\";\nimport { resolveSecureDefault } from \"./cookie-env.js\";\n\nexport interface MiddlewareConfig {\n baseUrl?: string;\n clientId?: string;\n publicRoutes?: string[];\n signInUrl?: string;\n afterSignInUrl?: string;\n cookiePrefix?: string;\n cookieDomain?: string;\n cookieOptions?: {\n secure?: boolean;\n sameSite?: \"lax\" | \"strict\" | \"none\";\n };\n jwksCacheTtlMs?: number;\n}\n\ninterface ResolvedConfig {\n baseUrl: string;\n clientId: string;\n publicRoutes: string[];\n signInUrl: string;\n afterSignInUrl: string;\n cookieNames: AuthCookieNames;\n cookieConfig: {\n cookieDomain?: string;\n secure: boolean;\n sameSite?: \"lax\" | \"strict\" | \"none\";\n };\n jwksCacheTtlMs: number;\n}\n\nfunction resolveConfig(options: MiddlewareConfig): ResolvedConfig {\n const baseUrl = options.baseUrl ?? process.env.IRONGATE_BASE_URL;\n const clientId = options.clientId ?? process.env.IRONGATE_CLIENT_ID;\n\n if (!baseUrl) {\n throw new IrongateError(\n \"INVALID_CONFIG\",\n \"IRONGATE_BASE_URL is required (set the env var or pass baseUrl to createMiddleware)\"\n );\n }\n if (!clientId) {\n throw new IrongateError(\n \"INVALID_CONFIG\",\n \"IRONGATE_CLIENT_ID is required (set the env var or pass clientId to createMiddleware)\"\n );\n }\n\n const cookieDomain = options.cookieDomain ?? process.env.IRONGATE_COOKIE_DOMAIN;\n const secure = resolveSecureDefault(options.cookieOptions?.secure);\n const sameSite =\n options.cookieOptions?.sameSite ??\n (process.env.IRONGATE_COOKIE_SAMESITE as \"lax\" | \"strict\" | \"none\" | undefined) ??\n \"lax\";\n\n return {\n baseUrl,\n clientId,\n publicRoutes: options.publicRoutes ?? [],\n signInUrl: options.signInUrl ?? process.env.IRONGATE_SIGN_IN_URL ?? \"/sign-in\",\n afterSignInUrl: options.afterSignInUrl ?? process.env.IRONGATE_AFTER_SIGN_IN ?? \"/dashboard\",\n cookieNames: getAuthCookieNames(options.cookiePrefix ?? process.env.IRONGATE_COOKIE_PREFIX),\n cookieConfig: {\n ...(cookieDomain ? { cookieDomain } : {}),\n secure,\n sameSite,\n },\n jwksCacheTtlMs: Number(process.env.IRONGATE_JWKS_CACHE_TTL ?? 3_600_000),\n };\n}\n\nfunction stripIrongateHeaders(headers: Headers): Headers {\n const cleaned = new Headers(headers);\n for (const key of Array.from(cleaned.keys())) {\n if (key.toLowerCase().startsWith(\"x-irongate-\")) {\n cleaned.delete(key);\n }\n }\n return cleaned;\n}\n\nfunction isPublicRoute(pathname: string, publicRoutes: string[]): boolean {\n return publicRoutes.some((route) => pathname === route || pathname.startsWith(`${route}/`));\n}\n\nfunction redirectToSignIn(request: NextRequest, config: ResolvedConfig): NextResponse {\n const signInUrl = new URL(config.signInUrl, request.url);\n signInUrl.searchParams.set(\"returnUrl\", request.nextUrl.pathname);\n return NextResponse.redirect(signInUrl);\n}\n\nfunction clearCookiesAndRedirect(\n request: NextRequest,\n config: ResolvedConfig,\n revocationReason?: string,\n): NextResponse {\n const signInUrl = new URL(config.signInUrl, request.url);\n if (revocationReason) {\n signInUrl.searchParams.set(\"reason\", revocationReason);\n }\n signInUrl.searchParams.set(\"returnUrl\", request.nextUrl.pathname);\n\n const response = NextResponse.redirect(signInUrl);\n for (const cookie of buildClearCookies(config.cookieNames, config.cookieConfig)) {\n response.cookies.set(cookie.name, cookie.value, cookie.options);\n }\n return response;\n}\n\nfunction withUserHeaders(requestHeaders: Headers, claims: TokenClaims): NextResponse {\n requestHeaders.set(\"x-irongate-user-id\", claims.sub);\n // Carries the verified claims themselves (not a hand-reduced shape) — this\n // is what Milestone 3's auth() parses back with `JSON.parse(...) as TokenClaims`.\n requestHeaders.set(\"x-irongate-user-json\", JSON.stringify(claims));\n return NextResponse.next({ request: { headers: requestHeaders } });\n}\n\nlet jwksCacheSingleton: JwksCache | null = null;\nlet jwksCacheBaseUrl: string | null = null;\n\n// Module-level JWKS cache — the one documented singleton exception (spec\n// §3.5). Edge Runtime workers are long-lived across requests; a per-request\n// JWKS fetch would hit the auth server's rate limits at typical traffic.\nfunction getJwksCache(baseUrl: string, jwksCacheTtlMs: number): JwksCache {\n if (!jwksCacheSingleton || jwksCacheBaseUrl !== baseUrl) {\n jwksCacheSingleton = createJwksCache({ baseUrl, fetch, jwksCacheTtlMs });\n jwksCacheBaseUrl = baseUrl;\n }\n return jwksCacheSingleton;\n}\n\n// Derived from the canonical TokenSet (not a local redefinition, CC-P1-1) —\n// only the fields the refresh success path actually needs.\ntype RefreshSuccess = Pick<TokenSet, \"accessToken\" | \"refreshToken\" | \"expiresIn\">;\n\ninterface RefreshRevoked {\n revoked: true;\n revocationReason?: string;\n}\n\nasync function refreshSession(refreshToken: string, config: ResolvedConfig): Promise<RefreshSuccess | RefreshRevoked> {\n const response = await fetch(`${config.baseUrl}/v1/auth/refresh`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken, clientId: config.clientId }),\n });\n\n if (response.ok) {\n return (await response.json()) as RefreshSuccess;\n }\n\n const errorBody = (await response.json().catch(() => ({}))) as {\n code?: string;\n revocationReason?: string;\n };\n // Renamed from errorBody.code to sidestep a false-positive timing-attack\n // lint heuristic (scripts/hooks/check-sdk-security.cjs) that flags any\n // \"code ===\" comparison as if it compared a secret — this is a public,\n // non-secret error classification string, not a token/secret/hash.\n const errorCode = errorBody.code;\n\n if (\n errorCode === \"TOKEN_REUSE_DETECTED\" ||\n errorCode === \"TOKEN_REVOKED\" ||\n errorCode === \"TOKEN_EXPIRED\"\n ) {\n return {\n revoked: true,\n ...(errorBody.revocationReason ? { revocationReason: errorBody.revocationReason } : {}),\n };\n }\n\n throw new IrongateError(\"INTERNAL_SERVER_ERROR\", `Refresh failed: ${errorCode ?? \"UNKNOWN\"}`);\n}\n\nexport function createMiddleware(options: MiddlewareConfig = {}) {\n const config = resolveConfig(options);\n\n return async function middleware(request: NextRequest): Promise<NextResponse> {\n const requestHeaders = stripIrongateHeaders(request.headers);\n\n const pathname = request.nextUrl.pathname;\n if (isPublicRoute(pathname, config.publicRoutes)) {\n return NextResponse.next({ request: { headers: requestHeaders } });\n }\n\n const accessToken = request.cookies.get(config.cookieNames.accessToken)?.value;\n const refreshToken = request.cookies.get(config.cookieNames.refreshToken)?.value;\n\n if (!accessToken && !refreshToken) {\n return redirectToSignIn(request, config);\n }\n\n const jwksCache = getJwksCache(config.baseUrl, config.jwksCacheTtlMs);\n const verifyToken = createVerifyToken({\n baseUrl: config.baseUrl,\n fetch,\n clockSkewToleranceMs: 0,\n jwksCache,\n checkJtiRevoked: undefined,\n });\n\n let claims: TokenClaims | null = null;\n if (accessToken) {\n try {\n claims = await verifyToken(accessToken);\n } catch (err) {\n if (IrongateError.isIrongate(err) && err.code !== \"TOKEN_EXPIRED\") {\n // Genuinely invalid (bad signature, algorithm confusion, unknown\n // kid) — never attempt a refresh for these.\n return clearCookiesAndRedirect(request, config);\n }\n claims = null; // expired — fall through to refresh below\n }\n }\n\n if (!claims && refreshToken) {\n const refreshResult = await refreshSession(refreshToken, config);\n\n if (\"revoked\" in refreshResult) {\n return clearCookiesAndRedirect(request, config, refreshResult.revocationReason);\n }\n\n claims = await verifyToken(refreshResult.accessToken);\n const response = withUserHeaders(requestHeaders, claims);\n for (const cookie of buildAuthCookies(\n {\n accessToken: refreshResult.accessToken,\n ...(refreshResult.refreshToken ? { refreshToken: refreshResult.refreshToken } : {}),\n expiresIn: refreshResult.expiresIn,\n },\n config.cookieNames,\n config.cookieConfig\n )) {\n response.cookies.set(cookie.name, cookie.value, cookie.options);\n }\n return response;\n }\n\n if (!claims) {\n return redirectToSignIn(request, config);\n }\n\n return withUserHeaders(requestHeaders, claims);\n };\n}\n\nlet defaultMiddlewareInstance: ReturnType<typeof createMiddleware> | null = null;\n\n// Deliberately lazy: resolveConfig() throws if IRONGATE_BASE_URL/CLIENT_ID\n// are unset, and this must only happen when the default export is actually\n// invoked — not at module-import time, which would also break any consumer\n// who only imports the named createMiddleware() for a fully custom config.\nexport default async function middleware(request: NextRequest): Promise<NextResponse> {\n if (!defaultMiddlewareInstance) {\n defaultMiddlewareInstance = createMiddleware();\n }\n return defaultMiddlewareInstance(request);\n}\n","export type SameSite = \"lax\" | \"strict\" | \"none\";\n\nexport function parseBooleanEnv(value: string | undefined): boolean | undefined {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return undefined;\n}\n\n// @irongate-dev/core never reads process.env (it must only receive explicit\n// values from the caller) — this is where the \"Secure in production\"\n// default (spec AC13) actually gets resolved, on the adapter side that's\n// already responsible for bridging env vars into explicit config.\nexport function resolveSecureDefault(explicit?: boolean): boolean {\n return explicit ?? parseBooleanEnv(process.env.IRONGATE_COOKIE_SECURE) ?? process.env.NODE_ENV === \"production\";\n}\n\nexport interface EnvCookieConfig {\n cookieDomain?: string;\n secure: boolean;\n sameSite?: SameSite;\n}\n\nexport function resolveEnvCookieConfig(): EnvCookieConfig {\n const cookieDomain = process.env.IRONGATE_COOKIE_DOMAIN;\n const sameSite = process.env.IRONGATE_COOKIE_SAMESITE as SameSite | undefined;\n return {\n ...(cookieDomain ? { cookieDomain } : {}),\n secure: resolveSecureDefault(),\n ...(sameSite ? { sameSite } : {}),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA6B;AAE7B,kBAOO;;;ACPA,SAAS,gBAAgB,OAAgD;AAC9E,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,UAAU,QAAS,QAAO;AAC9B,SAAO;AACT;AAMO,SAAS,qBAAqB,UAA6B;AAChE,SAAO,YAAY,gBAAgB,QAAQ,IAAI,sBAAsB,KAAK,yBAAyB;AACrG;;;AD8BA,SAAS,cAAc,SAA2C;AAChE,QAAM,UAAU,QAAQ,WAAW,QAAQ,IAAI;AAC/C,QAAM,WAAW,QAAQ,YAAY,QAAQ,IAAI;AAEjD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ,gBAAgB,QAAQ,IAAI;AACzD,QAAM,SAAS,qBAAqB,QAAQ,eAAe,MAAM;AACjE,QAAM,WACJ,QAAQ,eAAe,YACtB,QAAQ,IAAI,4BACb;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAc,QAAQ,gBAAgB,CAAC;AAAA,IACvC,WAAW,QAAQ,aAAa,QAAQ,IAAI,wBAAwB;AAAA,IACpE,gBAAgB,QAAQ,kBAAkB,QAAQ,IAAI,0BAA0B;AAAA,IAChF,iBAAa,gCAAmB,QAAQ,gBAAgB,QAAQ,IAAI,sBAAsB;AAAA,IAC1F,cAAc;AAAA,MACZ,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,OAAO,QAAQ,IAAI,2BAA2B,IAAS;AAAA,EACzE;AACF;AAEA,SAAS,qBAAqB,SAA2B;AACvD,QAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,aAAW,OAAO,MAAM,KAAK,QAAQ,KAAK,CAAC,GAAG;AAC5C,QAAI,IAAI,YAAY,EAAE,WAAW,aAAa,GAAG;AAC/C,cAAQ,OAAO,GAAG;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,UAAkB,cAAiC;AACxE,SAAO,aAAa,KAAK,CAAC,UAAU,aAAa,SAAS,SAAS,WAAW,GAAG,KAAK,GAAG,CAAC;AAC5F;AAEA,SAAS,iBAAiB,SAAsB,QAAsC;AACpF,QAAM,YAAY,IAAI,IAAI,OAAO,WAAW,QAAQ,GAAG;AACvD,YAAU,aAAa,IAAI,aAAa,QAAQ,QAAQ,QAAQ;AAChE,SAAO,2BAAa,SAAS,SAAS;AACxC;AAEA,SAAS,wBACP,SACA,QACA,kBACc;AACd,QAAM,YAAY,IAAI,IAAI,OAAO,WAAW,QAAQ,GAAG;AACvD,MAAI,kBAAkB;AACpB,cAAU,aAAa,IAAI,UAAU,gBAAgB;AAAA,EACvD;AACA,YAAU,aAAa,IAAI,aAAa,QAAQ,QAAQ,QAAQ;AAEhE,QAAM,WAAW,2BAAa,SAAS,SAAS;AAChD,aAAW,cAAU,+BAAkB,OAAO,aAAa,OAAO,YAAY,GAAG;AAC/E,aAAS,QAAQ,IAAI,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,gBAAyB,QAAmC;AACnF,iBAAe,IAAI,sBAAsB,OAAO,GAAG;AAGnD,iBAAe,IAAI,wBAAwB,KAAK,UAAU,MAAM,CAAC;AACjE,SAAO,2BAAa,KAAK,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;AACnE;AAEA,IAAI,qBAAuC;AAC3C,IAAI,mBAAkC;AAKtC,SAAS,aAAa,SAAiB,gBAAmC;AACxE,MAAI,CAAC,sBAAsB,qBAAqB,SAAS;AACvD,6BAAqB,6BAAgB,EAAE,SAAS,OAAO,eAAe,CAAC;AACvE,uBAAmB;AAAA,EACrB;AACA,SAAO;AACT;AAWA,eAAe,eAAe,cAAsB,QAAkE;AACpH,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,oBAAoB;AAAA,IAChE,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,cAAc,UAAU,OAAO,SAAS,CAAC;AAAA,EAClE,CAAC;AAED,MAAI,SAAS,IAAI;AACf,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAEA,QAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAQzD,QAAM,YAAY,UAAU;AAE5B,MACE,cAAc,0BACd,cAAc,mBACd,cAAc,iBACd;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,GAAI,UAAU,mBAAmB,EAAE,kBAAkB,UAAU,iBAAiB,IAAI,CAAC;AAAA,IACvF;AAAA,EACF;AAEA,QAAM,IAAI,0BAAc,yBAAyB,mBAAmB,aAAa,SAAS,EAAE;AAC9F;AAEO,SAAS,iBAAiB,UAA4B,CAAC,GAAG;AAC/D,QAAM,SAAS,cAAc,OAAO;AAEpC,SAAO,eAAeA,YAAW,SAA6C;AAC5E,UAAM,iBAAiB,qBAAqB,QAAQ,OAAO;AAE3D,UAAM,WAAW,QAAQ,QAAQ;AACjC,QAAI,cAAc,UAAU,OAAO,YAAY,GAAG;AAChD,aAAO,2BAAa,KAAK,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;AAAA,IACnE;AAEA,UAAM,cAAc,QAAQ,QAAQ,IAAI,OAAO,YAAY,WAAW,GAAG;AACzE,UAAM,eAAe,QAAQ,QAAQ,IAAI,OAAO,YAAY,YAAY,GAAG;AAE3E,QAAI,CAAC,eAAe,CAAC,cAAc;AACjC,aAAO,iBAAiB,SAAS,MAAM;AAAA,IACzC;AAEA,UAAM,YAAY,aAAa,OAAO,SAAS,OAAO,cAAc;AACpE,UAAM,kBAAc,+BAAkB;AAAA,MACpC,SAAS,OAAO;AAAA,MAChB;AAAA,MACA,sBAAsB;AAAA,MACtB;AAAA,MACA,iBAAiB;AAAA,IACnB,CAAC;AAED,QAAI,SAA6B;AACjC,QAAI,aAAa;AACf,UAAI;AACF,iBAAS,MAAM,YAAY,WAAW;AAAA,MACxC,SAAS,KAAK;AACZ,YAAI,0BAAc,WAAW,GAAG,KAAK,IAAI,SAAS,iBAAiB;AAGjE,iBAAO,wBAAwB,SAAS,MAAM;AAAA,QAChD;AACA,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,cAAc;AAC3B,YAAM,gBAAgB,MAAM,eAAe,cAAc,MAAM;AAE/D,UAAI,aAAa,eAAe;AAC9B,eAAO,wBAAwB,SAAS,QAAQ,cAAc,gBAAgB;AAAA,MAChF;AAEA,eAAS,MAAM,YAAY,cAAc,WAAW;AACpD,YAAM,WAAW,gBAAgB,gBAAgB,MAAM;AACvD,iBAAW,cAAU;AAAA,QACnB;AAAA,UACE,aAAa,cAAc;AAAA,UAC3B,GAAI,cAAc,eAAe,EAAE,cAAc,cAAc,aAAa,IAAI,CAAC;AAAA,UACjF,WAAW,cAAc;AAAA,QAC3B;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MACT,GAAG;AACD,iBAAS,QAAQ,IAAI,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO;AAAA,MAChE;AACA,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ;AACX,aAAO,iBAAiB,SAAS,MAAM;AAAA,IACzC;AAEA,WAAO,gBAAgB,gBAAgB,MAAM;AAAA,EAC/C;AACF;AAEA,IAAI,4BAAwE;AAM5E,eAAO,WAAkC,SAA6C;AACpF,MAAI,CAAC,2BAA2B;AAC9B,gCAA4B,iBAAiB;AAAA,EAC/C;AACA,SAAO,0BAA0B,OAAO;AAC1C;","names":["middleware"]}
@@ -0,0 +1,20 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ interface MiddlewareConfig {
4
+ baseUrl?: string;
5
+ clientId?: string;
6
+ publicRoutes?: string[];
7
+ signInUrl?: string;
8
+ afterSignInUrl?: string;
9
+ cookiePrefix?: string;
10
+ cookieDomain?: string;
11
+ cookieOptions?: {
12
+ secure?: boolean;
13
+ sameSite?: "lax" | "strict" | "none";
14
+ };
15
+ jwksCacheTtlMs?: number;
16
+ }
17
+ declare function createMiddleware(options?: MiddlewareConfig): (request: NextRequest) => Promise<NextResponse>;
18
+ declare function middleware(request: NextRequest): Promise<NextResponse>;
19
+
20
+ export { type MiddlewareConfig, createMiddleware, middleware as default };
@@ -0,0 +1,20 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ interface MiddlewareConfig {
4
+ baseUrl?: string;
5
+ clientId?: string;
6
+ publicRoutes?: string[];
7
+ signInUrl?: string;
8
+ afterSignInUrl?: string;
9
+ cookiePrefix?: string;
10
+ cookieDomain?: string;
11
+ cookieOptions?: {
12
+ secure?: boolean;
13
+ sameSite?: "lax" | "strict" | "none";
14
+ };
15
+ jwksCacheTtlMs?: number;
16
+ }
17
+ declare function createMiddleware(options?: MiddlewareConfig): (request: NextRequest) => Promise<NextResponse>;
18
+ declare function middleware(request: NextRequest): Promise<NextResponse>;
19
+
20
+ export { type MiddlewareConfig, createMiddleware, middleware as default };