@tern-secure/nextjs 5.1.8 → 5.1.10
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/dist/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js +31 -0
- package/dist/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
- package/dist/cjs/app-router/admin/actions.js +62 -0
- package/dist/cjs/app-router/admin/actions.js.map +1 -0
- package/dist/cjs/app-router/admin/constants.js +29 -0
- package/dist/cjs/app-router/admin/constants.js.map +1 -0
- package/dist/cjs/app-router/admin/fnValidators.js +295 -0
- package/dist/cjs/app-router/admin/fnValidators.js.map +1 -0
- package/dist/cjs/app-router/admin/index.js +16 -3
- package/dist/cjs/app-router/admin/index.js.map +1 -1
- package/dist/cjs/app-router/admin/responses.js +120 -0
- package/dist/cjs/app-router/admin/responses.js.map +1 -0
- package/dist/cjs/app-router/admin/sessionHandlers.js +167 -0
- package/dist/cjs/app-router/admin/sessionHandlers.js.map +1 -0
- package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js +84 -0
- package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
- package/dist/cjs/app-router/admin/types.js +127 -0
- package/dist/cjs/app-router/admin/types.js.map +1 -0
- package/dist/cjs/app-router/admin/utils.js +107 -0
- package/dist/cjs/app-router/admin/utils.js.map +1 -0
- package/dist/cjs/app-router/admin/validators.js +217 -0
- package/dist/cjs/app-router/admin/validators.js.map +1 -0
- package/dist/cjs/app-router/client/TernSecureProvider.js +2 -6
- package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/cjs/app-router/server/auth.js +100 -0
- package/dist/cjs/app-router/server/auth.js.map +1 -0
- package/dist/cjs/app-router/server/utils.js +87 -0
- package/dist/cjs/app-router/server/utils.js.map +1 -0
- package/dist/cjs/boundary/components.js +4 -7
- package/dist/cjs/boundary/components.js.map +1 -1
- package/dist/cjs/{components/uiComponents.js → constants.js} +17 -18
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.js +4 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/constant.js +38 -0
- package/dist/cjs/server/constant.js.map +1 -0
- package/dist/cjs/server/edge-session.js +118 -24
- package/dist/cjs/server/edge-session.js.map +1 -1
- package/dist/cjs/server/headers-utils.js +70 -0
- package/dist/cjs/server/headers-utils.js.map +1 -0
- package/dist/cjs/server/index.js +8 -6
- package/dist/cjs/server/index.js.map +1 -1
- package/dist/cjs/server/jwt-edge.js +47 -19
- package/dist/cjs/server/jwt-edge.js.map +1 -1
- package/dist/cjs/server/jwt.js +11 -4
- package/dist/cjs/server/jwt.js.map +1 -1
- package/dist/cjs/server/nextErrors.js +131 -0
- package/dist/cjs/server/nextErrors.js.map +1 -0
- package/dist/cjs/server/nextFetcher.js +31 -0
- package/dist/cjs/server/nextFetcher.js.map +1 -0
- package/dist/cjs/server/node/SessionTernSecure.js +55 -0
- package/dist/cjs/server/node/SessionTernSecure.js.map +1 -0
- package/dist/cjs/server/{auth.js → node/auth.js} +11 -20
- package/dist/cjs/server/node/auth.js.map +1 -0
- package/dist/cjs/server/node/index.js +40 -0
- package/dist/cjs/server/node/index.js.map +1 -0
- package/dist/cjs/server/node/node-session.js +60 -0
- package/dist/cjs/server/node/node-session.js.map +1 -0
- package/dist/cjs/server/node/ternSecureNodeMiddleware.js +182 -0
- package/dist/cjs/server/node/ternSecureNodeMiddleware.js.map +1 -0
- package/dist/cjs/server/protect.js +90 -0
- package/dist/cjs/server/protect.js.map +1 -0
- package/dist/cjs/server/redirect.js +84 -0
- package/dist/cjs/server/redirect.js.map +1 -0
- package/dist/cjs/server/routeMatcher.js +36 -0
- package/dist/cjs/server/routeMatcher.js.map +1 -0
- package/dist/cjs/server/sdk-versions.js +43 -0
- package/dist/cjs/server/sdk-versions.js.map +1 -0
- package/dist/cjs/server/session-store.js.map +1 -1
- package/dist/cjs/server/ternSecureEdgeMiddleware.js +298 -0
- package/dist/cjs/server/ternSecureEdgeMiddleware.js.map +1 -0
- package/dist/cjs/server/ternSecureFireMiddleware.js +192 -0
- package/dist/cjs/server/ternSecureFireMiddleware.js.map +1 -0
- package/dist/cjs/server/types.js.map +1 -1
- package/dist/cjs/server/utils.js +115 -2
- package/dist/cjs/server/utils.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/NextCookieAdapter.js +44 -0
- package/dist/cjs/utils/NextCookieAdapter.js.map +1 -0
- package/dist/cjs/utils/allNextProviderProps.js +10 -24
- package/dist/cjs/utils/allNextProviderProps.js.map +1 -1
- package/dist/cjs/utils/config.js +38 -2
- package/dist/cjs/utils/config.js.map +1 -1
- package/dist/cjs/utils/construct.js.map +1 -1
- package/dist/cjs/utils/fireconfig.js +38 -0
- package/dist/cjs/utils/fireconfig.js.map +1 -0
- package/dist/cjs/utils/logger.js +101 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/cjs/utils/redis.js +33 -0
- package/dist/cjs/utils/redis.js.map +1 -0
- package/dist/cjs/utils/response.js +38 -0
- package/dist/cjs/utils/response.js.map +1 -0
- package/dist/cjs/utils/serverRedirectAuth.js +39 -0
- package/dist/cjs/utils/serverRedirectAuth.js.map +1 -0
- package/dist/cjs/utils/ternsecure-sw.js +1 -1
- package/dist/cjs/utils/ternsecure-sw.js.map +1 -1
- package/dist/cjs/utils/withLogger.js +82 -0
- package/dist/cjs/utils/withLogger.js.map +1 -0
- package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js +30 -0
- package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
- package/dist/esm/app-router/admin/actions.js +40 -0
- package/dist/esm/app-router/admin/actions.js.map +1 -0
- package/dist/esm/app-router/admin/constants.js +5 -0
- package/dist/esm/app-router/admin/constants.js.map +1 -0
- package/dist/esm/app-router/admin/fnValidators.js +270 -0
- package/dist/esm/app-router/admin/fnValidators.js.map +1 -0
- package/dist/esm/app-router/admin/index.js +16 -2
- package/dist/esm/app-router/admin/index.js.map +1 -1
- package/dist/esm/app-router/admin/responses.js +93 -0
- package/dist/esm/app-router/admin/responses.js.map +1 -0
- package/dist/esm/app-router/admin/sessionHandlers.js +131 -0
- package/dist/esm/app-router/admin/sessionHandlers.js.map +1 -0
- package/dist/esm/app-router/admin/ternsecureNextjsHandler.js +62 -0
- package/dist/esm/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
- package/dist/esm/app-router/admin/types.js +98 -0
- package/dist/esm/app-router/admin/types.js.map +1 -0
- package/dist/esm/app-router/admin/utils.js +80 -0
- package/dist/esm/app-router/admin/utils.js.map +1 -0
- package/dist/esm/app-router/admin/validators.js +189 -0
- package/dist/esm/app-router/admin/validators.js.map +1 -0
- package/dist/esm/app-router/client/TernSecureProvider.js +2 -6
- package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/esm/app-router/server/auth.js +81 -0
- package/dist/esm/app-router/server/auth.js.map +1 -0
- package/dist/esm/app-router/server/utils.js +51 -0
- package/dist/esm/app-router/server/utils.js.map +1 -0
- package/dist/esm/boundary/components.js +4 -7
- package/dist/esm/boundary/components.js.map +1 -1
- package/dist/esm/constants.js +17 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +5 -11
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/constant.js +11 -0
- package/dist/esm/server/constant.js.map +1 -0
- package/dist/esm/server/edge-session.js +113 -22
- package/dist/esm/server/edge-session.js.map +1 -1
- package/dist/esm/server/headers-utils.js +41 -0
- package/dist/esm/server/headers-utils.js.map +1 -0
- package/dist/esm/server/index.js +9 -3
- package/dist/esm/server/index.js.map +1 -1
- package/dist/esm/server/jwt-edge.js +48 -20
- package/dist/esm/server/jwt-edge.js.map +1 -1
- package/dist/esm/server/jwt.js +12 -5
- package/dist/esm/server/jwt.js.map +1 -1
- package/dist/esm/server/nextErrors.js +97 -0
- package/dist/esm/server/nextErrors.js.map +1 -0
- package/dist/esm/server/nextFetcher.js +7 -0
- package/dist/esm/server/nextFetcher.js.map +1 -0
- package/dist/esm/server/node/SessionTernSecure.js +31 -0
- package/dist/esm/server/node/SessionTernSecure.js.map +1 -0
- package/dist/esm/server/{auth.js → node/auth.js} +11 -20
- package/dist/esm/server/node/auth.js.map +1 -0
- package/dist/esm/server/node/index.js +19 -0
- package/dist/esm/server/node/index.js.map +1 -0
- package/dist/esm/server/node/node-session.js +36 -0
- package/dist/esm/server/node/node-session.js.map +1 -0
- package/dist/esm/server/node/ternSecureNodeMiddleware.js +165 -0
- package/dist/esm/server/node/ternSecureNodeMiddleware.js.map +1 -0
- package/dist/esm/server/protect.js +66 -0
- package/dist/esm/server/protect.js.map +1 -0
- package/dist/esm/server/redirect.js +60 -0
- package/dist/esm/server/redirect.js.map +1 -0
- package/dist/esm/server/routeMatcher.js +12 -0
- package/dist/esm/server/routeMatcher.js.map +1 -0
- package/dist/esm/server/sdk-versions.js +8 -0
- package/dist/esm/server/sdk-versions.js.map +1 -0
- package/dist/esm/server/session-store.js.map +1 -1
- package/dist/esm/server/ternSecureEdgeMiddleware.js +286 -0
- package/dist/esm/server/ternSecureEdgeMiddleware.js.map +1 -0
- package/dist/esm/server/ternSecureFireMiddleware.js +179 -0
- package/dist/esm/server/ternSecureFireMiddleware.js.map +1 -0
- package/dist/esm/server/utils.js +99 -1
- package/dist/esm/server/utils.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/NextCookieAdapter.js +20 -0
- package/dist/esm/utils/NextCookieAdapter.js.map +1 -0
- package/dist/esm/utils/allNextProviderProps.js +10 -24
- package/dist/esm/utils/allNextProviderProps.js.map +1 -1
- package/dist/esm/utils/config.js +34 -1
- package/dist/esm/utils/config.js.map +1 -1
- package/dist/esm/utils/construct.js +1 -1
- package/dist/esm/utils/construct.js.map +1 -1
- package/dist/esm/utils/fireconfig.js +14 -0
- package/dist/esm/utils/fireconfig.js.map +1 -0
- package/dist/esm/utils/logger.js +74 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/redis.js +9 -0
- package/dist/esm/utils/redis.js.map +1 -0
- package/dist/esm/utils/response.js +13 -0
- package/dist/esm/utils/response.js.map +1 -0
- package/dist/esm/utils/serverRedirectAuth.js +17 -0
- package/dist/esm/utils/serverRedirectAuth.js.map +1 -0
- package/dist/esm/utils/ternsecure-sw.js +1 -1
- package/dist/esm/utils/ternsecure-sw.js.map +1 -1
- package/dist/esm/utils/withLogger.js +57 -0
- package/dist/esm/utils/withLogger.js.map +1 -0
- package/package.json +21 -7
- package/server/node/package.json +5 -0
- package/server/package.json +5 -0
- package/dist/cjs/app-router/admin/sessionHandler.js +0 -74
- package/dist/cjs/app-router/admin/sessionHandler.js.map +0 -1
- package/dist/cjs/app-router/client/actions.js +0 -4
- package/dist/cjs/app-router/client/actions.js.map +0 -1
- package/dist/cjs/components/uiComponents.js.map +0 -1
- package/dist/cjs/server/auth.js.map +0 -1
- package/dist/cjs/server/ternSecureMiddleware.js +0 -95
- package/dist/cjs/server/ternSecureMiddleware.js.map +0 -1
- package/dist/cjs/utils/tern-ui-script.js +0 -78
- package/dist/cjs/utils/tern-ui-script.js.map +0 -1
- package/dist/esm/app-router/admin/sessionHandler.js +0 -50
- package/dist/esm/app-router/admin/sessionHandler.js.map +0 -1
- package/dist/esm/app-router/client/actions.js +0 -3
- package/dist/esm/app-router/client/actions.js.map +0 -1
- package/dist/esm/components/uiComponents.js +0 -21
- package/dist/esm/components/uiComponents.js.map +0 -1
- package/dist/esm/server/auth.js.map +0 -1
- package/dist/esm/server/ternSecureMiddleware.js +0 -69
- package/dist/esm/server/ternSecureMiddleware.js.map +0 -1
- package/dist/esm/utils/tern-ui-script.js +0 -44
- package/dist/esm/utils/tern-ui-script.js.map +0 -1
- package/dist/types/app-router/admin/index.d.ts +0 -2
- package/dist/types/app-router/admin/index.d.ts.map +0 -1
- package/dist/types/app-router/admin/sessionHandler.d.ts +0 -3
- package/dist/types/app-router/admin/sessionHandler.d.ts.map +0 -1
- package/dist/types/app-router/client/TernSecureProvider.d.ts +0 -25
- package/dist/types/app-router/client/TernSecureProvider.d.ts.map +0 -1
- package/dist/types/app-router/client/actions.d.ts +0 -2
- package/dist/types/app-router/client/actions.d.ts.map +0 -1
- package/dist/types/app-router/route-handler/internal-route.d.ts +0 -2
- package/dist/types/app-router/route-handler/internal-route.d.ts.map +0 -1
- package/dist/types/boundary/components.d.ts +0 -2
- package/dist/types/boundary/components.d.ts.map +0 -1
- package/dist/types/boundary/hooks.d.ts +0 -2
- package/dist/types/boundary/hooks.d.ts.map +0 -1
- package/dist/types/components/uiComponents.d.ts +0 -6
- package/dist/types/components/uiComponents.d.ts.map +0 -1
- package/dist/types/errors.d.ts +0 -44
- package/dist/types/errors.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -5
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/server/auth.d.ts +0 -23
- package/dist/types/server/auth.d.ts.map +0 -1
- package/dist/types/server/crypto.d.ts +0 -3
- package/dist/types/server/crypto.d.ts.map +0 -1
- package/dist/types/server/ctx-store.d.ts +0 -24
- package/dist/types/server/ctx-store.d.ts.map +0 -1
- package/dist/types/server/edge-session.d.ts +0 -4
- package/dist/types/server/edge-session.d.ts.map +0 -1
- package/dist/types/server/index.d.ts +0 -4
- package/dist/types/server/index.d.ts.map +0 -1
- package/dist/types/server/jwt-edge.d.ts +0 -20
- package/dist/types/server/jwt-edge.d.ts.map +0 -1
- package/dist/types/server/jwt.d.ts +0 -20
- package/dist/types/server/jwt.d.ts.map +0 -1
- package/dist/types/server/session-store.d.ts +0 -30
- package/dist/types/server/session-store.d.ts.map +0 -1
- package/dist/types/server/ternSecureMiddleware.d.ts +0 -20
- package/dist/types/server/ternSecureMiddleware.d.ts.map +0 -1
- package/dist/types/server/types.d.ts +0 -26
- package/dist/types/server/types.d.ts.map +0 -1
- package/dist/types/server/utils.d.ts +0 -22
- package/dist/types/server/utils.d.ts.map +0 -1
- package/dist/types/types.d.ts +0 -112
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/utils/admin-init.d.ts +0 -2
- package/dist/types/utils/admin-init.d.ts.map +0 -1
- package/dist/types/utils/allNextProviderProps.d.ts +0 -6
- package/dist/types/utils/allNextProviderProps.d.ts.map +0 -1
- package/dist/types/utils/client-init.d.ts +0 -2
- package/dist/types/utils/client-init.d.ts.map +0 -1
- package/dist/types/utils/config.d.ts +0 -35
- package/dist/types/utils/config.d.ts.map +0 -1
- package/dist/types/utils/construct.d.ts +0 -38
- package/dist/types/utils/construct.d.ts.map +0 -1
- package/dist/types/utils/create-styles.d.ts +0 -99
- package/dist/types/utils/create-styles.d.ts.map +0 -1
- package/dist/types/utils/redirect.d.ts +0 -9
- package/dist/types/utils/redirect.d.ts.map +0 -1
- package/dist/types/utils/tern-ui-script.d.ts +0 -9
- package/dist/types/utils/tern-ui-script.d.ts.map +0 -1
- package/dist/types/utils/ternsecure-sw.d.ts +0 -8
- package/dist/types/utils/ternsecure-sw.d.ts.map +0 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var import_vitest = require("vitest");
|
|
3
|
+
var import_server = require("next/server");
|
|
4
|
+
var import_gemini_fnTernSecureNextHandler = require("../../examples/gemini_fnTernSecureNextHandler");
|
|
5
|
+
var import_sessionHandlers = require("../app-router/admin/sessionHandlers");
|
|
6
|
+
import_vitest.vi.mock("../sessionHandlers", () => ({
|
|
7
|
+
SessionEndpointHandler: {
|
|
8
|
+
handle: import_vitest.vi.fn()
|
|
9
|
+
}
|
|
10
|
+
}));
|
|
11
|
+
const authHandlerOptions = {
|
|
12
|
+
cors: {
|
|
13
|
+
allowedOrigins: ["http://localhost:3000", "https://ternsecure.com"],
|
|
14
|
+
allowedMethods: ["GET", "POST"]
|
|
15
|
+
},
|
|
16
|
+
security: {
|
|
17
|
+
requireCSRF: true,
|
|
18
|
+
allowedReferers: ["http://localhost:3000", "https://ternsecure.com"]
|
|
19
|
+
},
|
|
20
|
+
debug: false
|
|
21
|
+
};
|
|
22
|
+
(0, import_vitest.bench)("handler performance for a valid request", async () => {
|
|
23
|
+
const handler = (0, import_gemini_fnTernSecureNextHandler.geminiCreateTernSecureNextJsHandlerFn)(authHandlerOptions);
|
|
24
|
+
const request = new import_server.NextRequest("http://localhost/api/auth/sessions/verify", {
|
|
25
|
+
method: "GET",
|
|
26
|
+
headers: { origin: "http://localhost:3000" }
|
|
27
|
+
});
|
|
28
|
+
import_sessionHandlers.SessionEndpointHandler.handle.mockResolvedValue(new import_server.NextResponse(null, { status: 200 }));
|
|
29
|
+
await handler.GET(request);
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=gemini_fnTernSecureNextHandler.bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/gemini_fnTernSecureNextHandler.bench.ts"],"sourcesContent":["import { bench, vi } from 'vitest';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { geminiCreateTernSecureNextJsHandlerFn } from '../../examples/gemini_fnTernSecureNextHandler';\nimport { SessionEndpointHandler } from '../app-router/admin/sessionHandlers';\n\nvi.mock('../sessionHandlers', () => ({\n SessionEndpointHandler: {\n handle: vi.fn(),\n },\n}));\n\nconst authHandlerOptions = {\n cors: {\n allowedOrigins: ['http://localhost:3000', 'https://ternsecure.com'],\n allowedMethods: ['GET', 'POST'],\n },\n security: {\n requireCSRF: true,\n allowedReferers: ['http://localhost:3000', 'https://ternsecure.com'],\n },\n debug: false,\n};\n\nbench('handler performance for a valid request', async () => {\n const handler = geminiCreateTernSecureNextJsHandlerFn(authHandlerOptions);\n const request = new NextRequest('http://localhost/api/auth/sessions/verify', {\n method: 'GET',\n headers: { origin: 'http://localhost:3000' },\n });\n (SessionEndpointHandler.handle as any).mockResolvedValue(new NextResponse(null, { status: 200 }));\n\n await handler.GET(request);\n});\n"],"mappings":";AAAA,oBAA0B;AAC1B,oBAA0C;AAC1C,4CAAsD;AACtD,6BAAuC;AAEvC,iBAAG,KAAK,sBAAsB,OAAO;AAAA,EACnC,wBAAwB;AAAA,IACtB,QAAQ,iBAAG,GAAG;AAAA,EAChB;AACF,EAAE;AAEF,MAAM,qBAAqB;AAAA,EACzB,MAAM;AAAA,IACJ,gBAAgB,CAAC,yBAAyB,wBAAwB;AAAA,IAClE,gBAAgB,CAAC,OAAO,MAAM;AAAA,EAChC;AAAA,EACA,UAAU;AAAA,IACR,aAAa;AAAA,IACb,iBAAiB,CAAC,yBAAyB,wBAAwB;AAAA,EACrE;AAAA,EACA,OAAO;AACT;AAAA,IAEA,qBAAM,2CAA2C,YAAY;AAC3D,QAAM,cAAU,6EAAsC,kBAAkB;AACxE,QAAM,UAAU,IAAI,0BAAY,6CAA6C;AAAA,IAC3E,QAAQ;AAAA,IACR,SAAS,EAAE,QAAQ,wBAAwB;AAAA,EAC7C,CAAC;AACD,EAAC,8CAAuB,OAAe,kBAAkB,IAAI,2BAAa,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;AAEhG,QAAM,QAAQ,IAAI,OAAO;AAC3B,CAAC;","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use server";
|
|
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
|
+
var actions_exports = {};
|
|
21
|
+
__export(actions_exports, {
|
|
22
|
+
clearNextSessionCookie: () => clearNextSessionCookie,
|
|
23
|
+
clearSessionCookieServer: () => clearSessionCookieServer,
|
|
24
|
+
createNextSessionCookie: () => createNextSessionCookie,
|
|
25
|
+
createSessionCookieServer: () => createSessionCookieServer,
|
|
26
|
+
setNextServerSession: () => setNextServerSession,
|
|
27
|
+
setNextServerToken: () => setNextServerToken
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(actions_exports);
|
|
30
|
+
var import_admin = require("@tern-secure/backend/admin");
|
|
31
|
+
var import_NextCookieAdapter = require("../../utils/NextCookieAdapter");
|
|
32
|
+
var import_constants = require("./constants");
|
|
33
|
+
async function createSessionCookieServer(idToken) {
|
|
34
|
+
const cookieStore = new import_NextCookieAdapter.NextCookieStore();
|
|
35
|
+
return (0, import_admin.createSessionCookie)(idToken, cookieStore);
|
|
36
|
+
}
|
|
37
|
+
async function clearSessionCookieServer() {
|
|
38
|
+
const cookieStore = new import_NextCookieAdapter.NextCookieStore();
|
|
39
|
+
return (0, import_admin.clearSessionCookie)(cookieStore);
|
|
40
|
+
}
|
|
41
|
+
async function clearNextSessionCookie() {
|
|
42
|
+
return (0, import_admin.ClearNextSessionCookie)(import_constants.TENANT_ID);
|
|
43
|
+
}
|
|
44
|
+
async function setNextServerSession(idToken) {
|
|
45
|
+
return (0, import_admin.SetNextServerSession)(idToken);
|
|
46
|
+
}
|
|
47
|
+
async function setNextServerToken(token) {
|
|
48
|
+
return (0, import_admin.SetNextServerToken)(token);
|
|
49
|
+
}
|
|
50
|
+
async function createNextSessionCookie(idToken) {
|
|
51
|
+
return (0, import_admin.CreateNextSessionCookie)(idToken);
|
|
52
|
+
}
|
|
53
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
54
|
+
0 && (module.exports = {
|
|
55
|
+
clearNextSessionCookie,
|
|
56
|
+
clearSessionCookieServer,
|
|
57
|
+
createNextSessionCookie,
|
|
58
|
+
createSessionCookieServer,
|
|
59
|
+
setNextServerSession,
|
|
60
|
+
setNextServerToken
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/admin/actions.ts"],"sourcesContent":["'use server'\n\nimport {\n ClearNextSessionCookie,\n clearSessionCookie, \n CreateNextSessionCookie,\n createSessionCookie, \n SetNextServerSession, \n SetNextServerToken,\n} from \"@tern-secure/backend/admin\";\n\nimport { NextCookieStore } from \"../../utils/NextCookieAdapter\";\nimport { TENANT_ID } from \"./constants\";\n\nexport async function createSessionCookieServer(idToken: string) {\n const cookieStore = new NextCookieStore();\n return createSessionCookie(idToken, cookieStore);\n}\n\nexport async function clearSessionCookieServer() {\n const cookieStore = new NextCookieStore();\n return clearSessionCookie(cookieStore);\n}\n\nexport async function clearNextSessionCookie() {\n return ClearNextSessionCookie(TENANT_ID);\n}\n\nexport async function setNextServerSession(idToken: string) {\n return SetNextServerSession(idToken);\n}\n\nexport async function setNextServerToken(token: string) {\n return SetNextServerToken(token);\n}\n\nexport async function createNextSessionCookie(idToken: string) {\n return CreateNextSessionCookie(idToken);\n}"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAOO;AAEP,+BAAgC;AAChC,uBAA0B;AAE1B,eAAsB,0BAA0B,SAAiB;AAC7D,QAAM,cAAc,IAAI,yCAAgB;AACxC,aAAO,kCAAoB,SAAS,WAAW;AACnD;AAEA,eAAsB,2BAA2B;AAC7C,QAAM,cAAc,IAAI,yCAAgB;AACxC,aAAO,iCAAmB,WAAW;AACzC;AAEA,eAAsB,yBAAyB;AAC3C,aAAO,qCAAuB,0BAAS;AAC3C;AAEA,eAAsB,qBAAqB,SAAiB;AACxD,aAAO,mCAAqB,OAAO;AACvC;AAEA,eAAsB,mBAAmB,OAAe;AACpD,aAAO,iCAAmB,KAAK;AACnC;AAEA,eAAsB,wBAAwB,SAAiB;AAC3D,aAAO,sCAAwB,OAAO;AAC1C;","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
var constants_exports = {};
|
|
20
|
+
__export(constants_exports, {
|
|
21
|
+
TENANT_ID: () => TENANT_ID
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(constants_exports);
|
|
24
|
+
const TENANT_ID = process.env.NEXT_PUBLIC_FIREBASE_TENANT_ID || "";
|
|
25
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
26
|
+
0 && (module.exports = {
|
|
27
|
+
TENANT_ID
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/admin/constants.ts"],"sourcesContent":["export const TENANT_ID = process.env.NEXT_PUBLIC_FIREBASE_TENANT_ID || '';"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,YAAY,QAAQ,IAAI,kCAAkC;","names":[]}
|
|
@@ -0,0 +1,295 @@
|
|
|
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
|
+
var fnValidators_exports = {};
|
|
20
|
+
__export(fnValidators_exports, {
|
|
21
|
+
createRequestContext: () => createRequestContext,
|
|
22
|
+
createValidators: () => createValidators
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(fnValidators_exports);
|
|
25
|
+
var import_server = require("next/server");
|
|
26
|
+
var import_responses = require("./responses");
|
|
27
|
+
function createRequestContext(request) {
|
|
28
|
+
const url = new URL(request.url);
|
|
29
|
+
const pathSegments = url.pathname.split("/").filter(Boolean);
|
|
30
|
+
return {
|
|
31
|
+
request,
|
|
32
|
+
origin: request.headers.get("origin"),
|
|
33
|
+
host: request.headers.get("host"),
|
|
34
|
+
referer: request.headers.get("referer"),
|
|
35
|
+
userAgent: request.headers.get("user-agent") || "",
|
|
36
|
+
method: request.method,
|
|
37
|
+
pathSegments
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function createValidators(context) {
|
|
41
|
+
const { request, origin, host, referer, userAgent, method, pathSegments } = context;
|
|
42
|
+
async function validateCors(corsOptions) {
|
|
43
|
+
if (corsOptions.skipSameOrigin) {
|
|
44
|
+
if (!origin || host && origin.includes(host)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (corsOptions.allowedOrigins !== "*") {
|
|
49
|
+
const isAllowed = corsOptions.allowedOrigins.some((allowedOrigin) => {
|
|
50
|
+
if (allowedOrigin.startsWith("*")) {
|
|
51
|
+
const domain = allowedOrigin.slice(1);
|
|
52
|
+
return origin?.endsWith(domain);
|
|
53
|
+
}
|
|
54
|
+
return origin === allowedOrigin;
|
|
55
|
+
});
|
|
56
|
+
if (!isAllowed) {
|
|
57
|
+
return (0, import_responses.createApiErrorResponse)("CORS_ORIGIN_NOT_ALLOWED", "Origin not allowed", 403);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
function createCorsOptionsResponse(corsOptions) {
|
|
63
|
+
const response = new import_server.NextResponse(null, { status: 204 });
|
|
64
|
+
if (corsOptions.allowedOrigins === "*") {
|
|
65
|
+
response.headers.set("Access-Control-Allow-Origin", "*");
|
|
66
|
+
} else {
|
|
67
|
+
response.headers.set("Access-Control-Allow-Origin", corsOptions.allowedOrigins.join(","));
|
|
68
|
+
}
|
|
69
|
+
response.headers.set(
|
|
70
|
+
"Access-Control-Allow-Methods",
|
|
71
|
+
corsOptions.allowedMethods?.join(",") || "GET,POST"
|
|
72
|
+
);
|
|
73
|
+
response.headers.set(
|
|
74
|
+
"Access-Control-Allow-Headers",
|
|
75
|
+
corsOptions.allowedHeaders?.join(",") || "Content-Type,Authorization"
|
|
76
|
+
);
|
|
77
|
+
if (corsOptions.allowCredentials) {
|
|
78
|
+
response.headers.set("Access-Control-Allow-Credentials", "true");
|
|
79
|
+
}
|
|
80
|
+
if (corsOptions.maxAge) {
|
|
81
|
+
response.headers.set("Access-Control-Max-Age", corsOptions.maxAge.toString());
|
|
82
|
+
}
|
|
83
|
+
return response;
|
|
84
|
+
}
|
|
85
|
+
async function validateSecurity(securityOptions) {
|
|
86
|
+
const csrfResult = validateCsrf(securityOptions);
|
|
87
|
+
if (csrfResult) return csrfResult;
|
|
88
|
+
const headersResult = validateRequiredHeaders(securityOptions);
|
|
89
|
+
if (headersResult) return headersResult;
|
|
90
|
+
const userAgentResult = validateUserAgent(securityOptions);
|
|
91
|
+
if (userAgentResult) return userAgentResult;
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
function validateCsrf(securityOptions) {
|
|
95
|
+
if (securityOptions.requireCSRF && origin && host && !origin.includes(host)) {
|
|
96
|
+
const hasCSRFHeader = request.headers.get("x-requested-with") === "XMLHttpRequest";
|
|
97
|
+
const hasValidReferer = referer && host && referer.includes(host);
|
|
98
|
+
if (!hasCSRFHeader && !hasValidReferer) {
|
|
99
|
+
const isAllowedReferer = securityOptions.allowedReferers?.some(
|
|
100
|
+
(allowedRef) => referer?.includes(allowedRef)
|
|
101
|
+
);
|
|
102
|
+
if (!isAllowedReferer) {
|
|
103
|
+
return (0, import_responses.createApiErrorResponse)("CSRF_PROTECTION", "Access denied", 403);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
function validateRequiredHeaders(securityOptions) {
|
|
110
|
+
if (securityOptions.requiredHeaders) {
|
|
111
|
+
for (const [headerName, expectedValue] of Object.entries(securityOptions.requiredHeaders)) {
|
|
112
|
+
const actualValue = request.headers.get(headerName);
|
|
113
|
+
if (actualValue !== expectedValue) {
|
|
114
|
+
return (0, import_responses.createApiErrorResponse)(
|
|
115
|
+
"INVALID_HEADERS",
|
|
116
|
+
"Required header missing or invalid",
|
|
117
|
+
400
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
function validateUserAgent(securityOptions) {
|
|
125
|
+
if (securityOptions.userAgent?.block?.length) {
|
|
126
|
+
const isBlocked = securityOptions.userAgent.block.some(
|
|
127
|
+
(blocked) => userAgent.toLowerCase().includes(blocked.toLowerCase())
|
|
128
|
+
);
|
|
129
|
+
if (isBlocked) {
|
|
130
|
+
return (0, import_responses.createApiErrorResponse)("USER_AGENT_BLOCKED", "Access denied", 403);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (securityOptions.userAgent?.allow?.length) {
|
|
134
|
+
const isAllowed = securityOptions.userAgent.allow.some(
|
|
135
|
+
(allowed) => userAgent.toLowerCase().includes(allowed.toLowerCase())
|
|
136
|
+
);
|
|
137
|
+
if (!isAllowed) {
|
|
138
|
+
return (0, import_responses.createApiErrorResponse)("USER_AGENT_NOT_ALLOWED", "Access denied", 403);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
function validateCsrfToken(csrfToken, csrfCookieValue) {
|
|
144
|
+
if (!csrfToken) {
|
|
145
|
+
return (0, import_responses.createApiErrorResponse)("INVALID_CSRF_TOKEN", "CSRF token is required", 400);
|
|
146
|
+
}
|
|
147
|
+
if (!csrfCookieValue) {
|
|
148
|
+
return (0, import_responses.createApiErrorResponse)("CSRF_COOKIE_MISSING", "CSRF token cookie not found", 403);
|
|
149
|
+
}
|
|
150
|
+
if (csrfToken !== csrfCookieValue) {
|
|
151
|
+
return (0, import_responses.createApiErrorResponse)("CSRF_TOKEN_MISMATCH", "CSRF token mismatch", 403);
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
function validatePathStructure() {
|
|
156
|
+
if (pathSegments.length < 3) {
|
|
157
|
+
return (0, import_responses.createApiErrorResponse)(
|
|
158
|
+
"INVALID_ROUTE",
|
|
159
|
+
"Invalid route structure. Expected: /api/auth/{endpoint}",
|
|
160
|
+
404
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
function validateEndpoint(_endpoint, endpointConfig) {
|
|
166
|
+
if (!endpointConfig || !endpointConfig.enabled) {
|
|
167
|
+
return (0, import_responses.createApiErrorResponse)("ENDPOINT_NOT_FOUND", "Endpoint not found", 404);
|
|
168
|
+
}
|
|
169
|
+
if (method !== "OPTIONS" && !endpointConfig.methods.includes(method)) {
|
|
170
|
+
return (0, import_responses.createApiErrorResponse)("METHOD_NOT_ALLOWED", "Method not allowed", 405);
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
function validateSubEndpoint(subEndpoint, subEndpointConfig) {
|
|
175
|
+
if (!subEndpoint) {
|
|
176
|
+
return (0, import_responses.createApiErrorResponse)("SUB_ENDPOINT_REQUIRED", "Session sub-endpoint required", 400);
|
|
177
|
+
}
|
|
178
|
+
if (!subEndpointConfig || !subEndpointConfig.enabled) {
|
|
179
|
+
return (0, import_responses.createApiErrorResponse)("ENDPOINT_NOT_FOUND", "Endpoint not found", 404);
|
|
180
|
+
}
|
|
181
|
+
if (!subEndpointConfig.methods?.includes(method)) {
|
|
182
|
+
return (0, import_responses.createApiErrorResponse)("METHOD_NOT_ALLOWED", "Method not allowed", 405);
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
async function validateSessionRequest() {
|
|
187
|
+
try {
|
|
188
|
+
const body = await request.json();
|
|
189
|
+
return { body, idToken: body.idToken, csrfToken: body.csrfToken };
|
|
190
|
+
} catch (error) {
|
|
191
|
+
return {
|
|
192
|
+
body: null,
|
|
193
|
+
error: (0, import_responses.createApiErrorResponse)("INVALID_REQUEST_FORMAT", "Invalid request format", 400)
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function validateIdToken(idToken) {
|
|
198
|
+
if (!idToken) {
|
|
199
|
+
return (0, import_responses.createApiErrorResponse)(
|
|
200
|
+
"INVALID_TOKEN",
|
|
201
|
+
"ID token is required for creating session",
|
|
202
|
+
400
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
async function validateRequest(config) {
|
|
208
|
+
if (method === "OPTIONS" && config.cors) {
|
|
209
|
+
return {
|
|
210
|
+
isValid: true,
|
|
211
|
+
corsResponse: createCorsOptionsResponse(config.cors)
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const pathError = validatePathStructure();
|
|
215
|
+
if (pathError) {
|
|
216
|
+
return { isValid: false, error: pathError };
|
|
217
|
+
}
|
|
218
|
+
if (config.cors) {
|
|
219
|
+
const corsError = await validateCors(config.cors);
|
|
220
|
+
if (corsError) {
|
|
221
|
+
return { isValid: false, error: corsError };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (config.security) {
|
|
225
|
+
const securityError = await validateSecurity(config.security);
|
|
226
|
+
if (securityError) {
|
|
227
|
+
return { isValid: false, error: securityError };
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (config.endpoint) {
|
|
231
|
+
const endpointError = validateEndpoint(config.endpoint.name, config.endpoint.config);
|
|
232
|
+
if (endpointError) {
|
|
233
|
+
return { isValid: false, error: endpointError };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (config.subEndpoint) {
|
|
237
|
+
const subEndpointError = validateSubEndpoint(
|
|
238
|
+
config.subEndpoint.name,
|
|
239
|
+
config.subEndpoint.config
|
|
240
|
+
);
|
|
241
|
+
if (subEndpointError) {
|
|
242
|
+
return { isValid: false, error: subEndpointError };
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
let sessionData;
|
|
246
|
+
if (method === "POST" && (config.requireIdToken || config.requireCsrfToken)) {
|
|
247
|
+
const sessionResult = await validateSessionRequest();
|
|
248
|
+
if (sessionResult.error) {
|
|
249
|
+
return { isValid: false, error: sessionResult.error };
|
|
250
|
+
}
|
|
251
|
+
sessionData = sessionResult;
|
|
252
|
+
if (config.requireIdToken) {
|
|
253
|
+
const idTokenError = validateIdToken(sessionData.idToken);
|
|
254
|
+
if (idTokenError) {
|
|
255
|
+
return { isValid: false, error: idTokenError };
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (config.requireCsrfToken && sessionData.csrfToken) {
|
|
259
|
+
const csrfCookieValue = request.cookies.get("csrfToken")?.value;
|
|
260
|
+
const csrfError = validateCsrfToken(sessionData.csrfToken, csrfCookieValue);
|
|
261
|
+
if (csrfError) {
|
|
262
|
+
return { isValid: false, error: csrfError };
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
isValid: true,
|
|
268
|
+
sessionData
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function createValidationConfig(overrides = {}) {
|
|
272
|
+
return {
|
|
273
|
+
...overrides
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
createValidationConfig,
|
|
278
|
+
validateRequest,
|
|
279
|
+
validateCors,
|
|
280
|
+
validateSecurity,
|
|
281
|
+
validatePathStructure,
|
|
282
|
+
validateEndpoint,
|
|
283
|
+
validateSubEndpoint,
|
|
284
|
+
validateSessionRequest,
|
|
285
|
+
validateIdToken,
|
|
286
|
+
validateCsrfToken,
|
|
287
|
+
createCorsOptionsResponse
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
291
|
+
0 && (module.exports = {
|
|
292
|
+
createRequestContext,
|
|
293
|
+
createValidators
|
|
294
|
+
});
|
|
295
|
+
//# sourceMappingURL=fnValidators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/admin/fnValidators.ts"],"sourcesContent":["import { type NextRequest, NextResponse } from 'next/server';\n\nimport { createApiErrorResponse } from './responses';\nimport type {\n AuthEndpoint,\n ComprehensiveValidationResult,\n CorsOptions,\n EndpointConfig,\n SecurityOptions,\n SessionSubEndpoint,\n ValidationConfig,\n} from './types';\n\nexport interface RequestContext {\n request: NextRequest;\n origin: string | null;\n host: string | null;\n referer: string | null;\n userAgent: string;\n method: string;\n pathSegments: string[];\n}\n\nexport function createRequestContext(request: NextRequest): RequestContext {\n const url = new URL(request.url);\n const pathSegments = url.pathname.split('/').filter(Boolean);\n\n return {\n request,\n origin: request.headers.get('origin'),\n host: request.headers.get('host'),\n referer: request.headers.get('referer'),\n userAgent: request.headers.get('user-agent') || '',\n method: request.method,\n pathSegments,\n };\n}\n\n/**\n * Main validators factory function\n * Returns an object containing all validator functions and utilities\n */\nexport function createValidators(context: RequestContext) {\n const { request, origin, host, referer, userAgent, method, pathSegments } = context;\n\n async function validateCors(corsOptions: CorsOptions): Promise<NextResponse | null> {\n if (corsOptions.skipSameOrigin) {\n if (!origin || (host && origin.includes(host))) {\n return null;\n }\n }\n\n if (corsOptions.allowedOrigins !== '*') {\n const isAllowed = corsOptions.allowedOrigins.some(allowedOrigin => {\n if (allowedOrigin.startsWith('*')) {\n const domain = allowedOrigin.slice(1);\n return origin?.endsWith(domain);\n }\n return origin === allowedOrigin;\n });\n\n if (!isAllowed) {\n return createApiErrorResponse('CORS_ORIGIN_NOT_ALLOWED', 'Origin not allowed', 403);\n }\n }\n\n return null;\n }\n\n function createCorsOptionsResponse(corsOptions: CorsOptions): NextResponse {\n const response = new NextResponse(null, { status: 204 });\n\n if (corsOptions.allowedOrigins === '*') {\n response.headers.set('Access-Control-Allow-Origin', '*');\n } else {\n response.headers.set('Access-Control-Allow-Origin', corsOptions.allowedOrigins.join(','));\n }\n\n response.headers.set(\n 'Access-Control-Allow-Methods',\n corsOptions.allowedMethods?.join(',') || 'GET,POST',\n );\n response.headers.set(\n 'Access-Control-Allow-Headers',\n corsOptions.allowedHeaders?.join(',') || 'Content-Type,Authorization',\n );\n\n if (corsOptions.allowCredentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (corsOptions.maxAge) {\n response.headers.set('Access-Control-Max-Age', corsOptions.maxAge.toString());\n }\n\n return response;\n }\n\n async function validateSecurity(securityOptions: SecurityOptions): Promise<NextResponse | null> {\n const csrfResult = validateCsrf(securityOptions);\n if (csrfResult) return csrfResult;\n\n const headersResult = validateRequiredHeaders(securityOptions);\n if (headersResult) return headersResult;\n\n const userAgentResult = validateUserAgent(securityOptions);\n if (userAgentResult) return userAgentResult;\n\n return null;\n }\n\n function validateCsrf(securityOptions: SecurityOptions): NextResponse | null {\n if (securityOptions.requireCSRF && origin && host && !origin.includes(host)) {\n const hasCSRFHeader = request.headers.get('x-requested-with') === 'XMLHttpRequest';\n const hasValidReferer = referer && host && referer.includes(host);\n\n if (!hasCSRFHeader && !hasValidReferer) {\n const isAllowedReferer = securityOptions.allowedReferers?.some((allowedRef: string) =>\n referer?.includes(allowedRef),\n );\n\n if (!isAllowedReferer) {\n return createApiErrorResponse('CSRF_PROTECTION', 'Access denied', 403);\n }\n }\n }\n return null;\n }\n\n function validateRequiredHeaders(securityOptions: SecurityOptions): NextResponse | null {\n if (securityOptions.requiredHeaders) {\n for (const [headerName, expectedValue] of Object.entries(securityOptions.requiredHeaders)) {\n const actualValue = request.headers.get(headerName);\n if (actualValue !== expectedValue) {\n return createApiErrorResponse(\n 'INVALID_HEADERS',\n 'Required header missing or invalid',\n 400,\n );\n }\n }\n }\n return null;\n }\n\n function validateUserAgent(securityOptions: SecurityOptions): NextResponse | null {\n if (securityOptions.userAgent?.block?.length) {\n const isBlocked = securityOptions.userAgent.block.some((blocked: string) =>\n userAgent.toLowerCase().includes(blocked.toLowerCase()),\n );\n\n if (isBlocked) {\n return createApiErrorResponse('USER_AGENT_BLOCKED', 'Access denied', 403);\n }\n }\n\n if (securityOptions.userAgent?.allow?.length) {\n const isAllowed = securityOptions.userAgent.allow.some((allowed: string) =>\n userAgent.toLowerCase().includes(allowed.toLowerCase()),\n );\n\n if (!isAllowed) {\n return createApiErrorResponse('USER_AGENT_NOT_ALLOWED', 'Access denied', 403);\n }\n }\n\n return null;\n }\n\n function validateCsrfToken(\n csrfToken: string,\n csrfCookieValue: string | undefined,\n ): NextResponse | null {\n if (!csrfToken) {\n return createApiErrorResponse('INVALID_CSRF_TOKEN', 'CSRF token is required', 400);\n }\n\n if (!csrfCookieValue) {\n return createApiErrorResponse('CSRF_COOKIE_MISSING', 'CSRF token cookie not found', 403);\n }\n\n if (csrfToken !== csrfCookieValue) {\n return createApiErrorResponse('CSRF_TOKEN_MISMATCH', 'CSRF token mismatch', 403);\n }\n\n return null;\n }\n\n function validatePathStructure(): NextResponse | null {\n if (pathSegments.length < 3) {\n return createApiErrorResponse(\n 'INVALID_ROUTE',\n 'Invalid route structure. Expected: /api/auth/{endpoint}',\n 404,\n );\n }\n return null;\n }\n\n function validateEndpoint(\n _endpoint: AuthEndpoint,\n endpointConfig: EndpointConfig,\n ): NextResponse | null {\n if (!endpointConfig || !endpointConfig.enabled) {\n return createApiErrorResponse('ENDPOINT_NOT_FOUND', 'Endpoint not found', 404);\n }\n\n if (method !== 'OPTIONS' && !endpointConfig.methods.includes(method as any)) {\n return createApiErrorResponse('METHOD_NOT_ALLOWED', 'Method not allowed', 405);\n }\n\n return null;\n }\n\n function validateSubEndpoint(\n subEndpoint: SessionSubEndpoint | undefined,\n subEndpointConfig: any,\n ): NextResponse | null {\n if (!subEndpoint) {\n return createApiErrorResponse('SUB_ENDPOINT_REQUIRED', 'Session sub-endpoint required', 400);\n }\n\n if (!subEndpointConfig || !subEndpointConfig.enabled) {\n return createApiErrorResponse('ENDPOINT_NOT_FOUND', 'Endpoint not found', 404);\n }\n\n if (!subEndpointConfig.methods?.includes(method as any)) {\n return createApiErrorResponse('METHOD_NOT_ALLOWED', 'Method not allowed', 405);\n }\n\n return null;\n }\n\n async function validateSessionRequest(): Promise<{\n body: any;\n idToken?: string;\n csrfToken?: string;\n error?: NextResponse;\n }> {\n try {\n const body = await request.json();\n return { body, idToken: body.idToken, csrfToken: body.csrfToken };\n } catch (error) {\n return {\n body: null,\n error: createApiErrorResponse('INVALID_REQUEST_FORMAT', 'Invalid request format', 400),\n };\n }\n }\n\n function validateIdToken(idToken: string | undefined): NextResponse | null {\n if (!idToken) {\n return createApiErrorResponse(\n 'INVALID_TOKEN',\n 'ID token is required for creating session',\n 400,\n );\n }\n return null;\n }\n\n /**\n * Main validation orchestrator function\n * Runs all configured validations in the correct order\n */\n async function validateRequest(config: ValidationConfig): Promise<ComprehensiveValidationResult> {\n if (method === 'OPTIONS' && config.cors) {\n return {\n isValid: true,\n corsResponse: createCorsOptionsResponse(config.cors),\n };\n }\n const pathError = validatePathStructure();\n if (pathError) {\n return { isValid: false, error: pathError };\n }\n\n if (config.cors) {\n const corsError = await validateCors(config.cors);\n if (corsError) {\n return { isValid: false, error: corsError };\n }\n }\n\n if (config.security) {\n const securityError = await validateSecurity(config.security);\n if (securityError) {\n return { isValid: false, error: securityError };\n }\n }\n\n if (config.endpoint) {\n const endpointError = validateEndpoint(config.endpoint.name, config.endpoint.config);\n if (endpointError) {\n return { isValid: false, error: endpointError };\n }\n }\n\n if (config.subEndpoint) {\n const subEndpointError = validateSubEndpoint(\n config.subEndpoint.name,\n config.subEndpoint.config,\n );\n if (subEndpointError) {\n return { isValid: false, error: subEndpointError };\n }\n }\n\n let sessionData;\n if (method === 'POST' && (config.requireIdToken || config.requireCsrfToken)) {\n const sessionResult = await validateSessionRequest();\n if (sessionResult.error) {\n return { isValid: false, error: sessionResult.error };\n }\n\n sessionData = sessionResult;\n\n if (config.requireIdToken) {\n const idTokenError = validateIdToken(sessionData.idToken);\n if (idTokenError) {\n return { isValid: false, error: idTokenError };\n }\n }\n\n if (config.requireCsrfToken && sessionData.csrfToken) {\n const csrfCookieValue = request.cookies.get('csrfToken')?.value;\n const csrfError = validateCsrfToken(sessionData.csrfToken, csrfCookieValue);\n if (csrfError) {\n return { isValid: false, error: csrfError };\n }\n }\n }\n\n return {\n isValid: true,\n sessionData,\n };\n }\n\n /**\n * Convenience function for quick validation setup\n */\n function createValidationConfig(overrides: Partial<ValidationConfig> = {}): ValidationConfig {\n return {\n ...overrides,\n };\n }\n\n return {\n createValidationConfig,\n\n validateRequest,\n\n validateCors,\n validateSecurity,\n validatePathStructure,\n validateEndpoint,\n validateSubEndpoint,\n validateSessionRequest,\n validateIdToken,\n validateCsrfToken,\n\n createCorsOptionsResponse,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -18,12 +18,25 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var admin_exports = {};
|
|
20
20
|
__export(admin_exports, {
|
|
21
|
-
|
|
21
|
+
clearNextSessionCookie: () => import_actions.clearNextSessionCookie,
|
|
22
|
+
clearSessionCookieServer: () => import_actions.clearSessionCookieServer,
|
|
23
|
+
createNextSessionCookie: () => import_actions.createNextSessionCookie,
|
|
24
|
+
createSessionCookieServer: () => import_actions.createSessionCookieServer,
|
|
25
|
+
createTernSecureNextJsHandler: () => import_ternsecureNextjsHandler.createTernSecureNextJsHandler,
|
|
26
|
+
setNextServerSession: () => import_actions.setNextServerSession,
|
|
27
|
+
setNextServerToken: () => import_actions.setNextServerToken
|
|
22
28
|
});
|
|
23
29
|
module.exports = __toCommonJS(admin_exports);
|
|
24
|
-
var
|
|
30
|
+
var import_ternsecureNextjsHandler = require("./ternsecureNextjsHandler");
|
|
31
|
+
var import_actions = require("./actions");
|
|
25
32
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
33
|
0 && (module.exports = {
|
|
27
|
-
|
|
34
|
+
clearNextSessionCookie,
|
|
35
|
+
clearSessionCookieServer,
|
|
36
|
+
createNextSessionCookie,
|
|
37
|
+
createSessionCookieServer,
|
|
38
|
+
createTernSecureNextJsHandler,
|
|
39
|
+
setNextServerSession,
|
|
40
|
+
setNextServerToken
|
|
28
41
|
});
|
|
29
42
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export {
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { createTernSecureNextJsHandler } from './ternsecureNextjsHandler'\n\nexport { \n clearSessionCookieServer,\n clearNextSessionCookie,\n createSessionCookieServer,\n createNextSessionCookie,\n setNextServerSession,\n setNextServerToken\n} from './actions'\n\nexport type { TernSecureHandlerOptions } from './types'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAA8C;AAE9C,qBAOO;","names":[]}
|
|
@@ -0,0 +1,120 @@
|
|
|
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
|
+
var responses_exports = {};
|
|
20
|
+
__export(responses_exports, {
|
|
21
|
+
HttpResponseHelper: () => HttpResponseHelper,
|
|
22
|
+
SessionResponseHelper: () => SessionResponseHelper,
|
|
23
|
+
createApiErrorResponse: () => createApiErrorResponse,
|
|
24
|
+
createApiSuccessResponse: () => createApiSuccessResponse
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(responses_exports);
|
|
27
|
+
var import_server = require("next/server");
|
|
28
|
+
function createApiErrorResponse(code, message, status) {
|
|
29
|
+
const errors = [
|
|
30
|
+
{
|
|
31
|
+
code,
|
|
32
|
+
message
|
|
33
|
+
}
|
|
34
|
+
];
|
|
35
|
+
return import_server.NextResponse.json(
|
|
36
|
+
{
|
|
37
|
+
success: false,
|
|
38
|
+
message,
|
|
39
|
+
error: code,
|
|
40
|
+
errors
|
|
41
|
+
// Include both formats for compatibility
|
|
42
|
+
},
|
|
43
|
+
{ status }
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
function createApiSuccessResponse(data, status = 200) {
|
|
47
|
+
return import_server.NextResponse.json(
|
|
48
|
+
{
|
|
49
|
+
success: true,
|
|
50
|
+
...data
|
|
51
|
+
},
|
|
52
|
+
{ status }
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
class SessionResponseHelper {
|
|
56
|
+
static createVerificationResponse(decodedSession) {
|
|
57
|
+
return createApiSuccessResponse({
|
|
58
|
+
valid: true,
|
|
59
|
+
uid: decodedSession.data?.payload?.sub,
|
|
60
|
+
exp: decodedSession.data?.payload?.exp
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
static createUnauthorizedResponse() {
|
|
64
|
+
return createApiErrorResponse("UNAUTHORIZED", "Authentication required", 401);
|
|
65
|
+
}
|
|
66
|
+
static createSessionCreationResponse(res) {
|
|
67
|
+
if (!res.success) {
|
|
68
|
+
console.error("[TernSecureAuthHandler] Error creating session:", {
|
|
69
|
+
error: res.error,
|
|
70
|
+
message: res.message,
|
|
71
|
+
cookieSet: res.cookieSet
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const statusCode = res.success ? 200 : res.error === "INVALID_TOKEN" ? 400 : res.error === "EXPIRED_TOKEN" ? 401 : 500;
|
|
75
|
+
return import_server.NextResponse.json(res, { status: statusCode });
|
|
76
|
+
}
|
|
77
|
+
static createRefreshResponse(refreshRes) {
|
|
78
|
+
if (!refreshRes.success) {
|
|
79
|
+
console.error("[TernSecureAuthHandler] Error refreshing session:", {
|
|
80
|
+
error: refreshRes.error,
|
|
81
|
+
message: refreshRes.message
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const statusCode = refreshRes.success ? 200 : 401;
|
|
85
|
+
return import_server.NextResponse.json(refreshRes, { status: statusCode });
|
|
86
|
+
}
|
|
87
|
+
static createRevokeResponse(res) {
|
|
88
|
+
if (!res.success) {
|
|
89
|
+
console.error("[TernSecureAuthHandler] Error revoking session:", {
|
|
90
|
+
error: res.error,
|
|
91
|
+
message: res.message
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const statusCode = res.success ? 200 : 500;
|
|
95
|
+
return import_server.NextResponse.json(res, { status: statusCode });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
class HttpResponseHelper {
|
|
99
|
+
static createMethodNotAllowedResponse() {
|
|
100
|
+
return createApiErrorResponse("METHOD_NOT_ALLOWED", "Method not allowed", 405);
|
|
101
|
+
}
|
|
102
|
+
static createNotFoundResponse() {
|
|
103
|
+
return createApiErrorResponse("NOT_FOUND", "Endpoint not found", 404);
|
|
104
|
+
}
|
|
105
|
+
static createSubEndpointNotSupportedResponse() {
|
|
106
|
+
return createApiErrorResponse(
|
|
107
|
+
"SUB_ENDPOINT_NOT_SUPPORTED",
|
|
108
|
+
"Sub-endpoint not supported for POST method",
|
|
109
|
+
400
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
114
|
+
0 && (module.exports = {
|
|
115
|
+
HttpResponseHelper,
|
|
116
|
+
SessionResponseHelper,
|
|
117
|
+
createApiErrorResponse,
|
|
118
|
+
createApiSuccessResponse
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/admin/responses.ts"],"sourcesContent":["import type { TernSecureApiErrorJSON } from '@tern-secure/types';\nimport { NextResponse } from 'next/server';\n\n/**\n * Standardized error response creation\n */\nexport function createApiErrorResponse(\n code: string,\n message: string,\n status: number,\n): NextResponse {\n const errors: TernSecureApiErrorJSON[] = [\n {\n code,\n message,\n },\n ];\n\n return NextResponse.json(\n {\n success: false,\n message,\n error: code,\n errors, // Include both formats for compatibility\n },\n { status },\n );\n}\n\n/**\n * Standardized success response creation\n */\nexport function createApiSuccessResponse<T>(data: T, status: number = 200): NextResponse {\n return NextResponse.json(\n {\n success: true,\n ...data,\n },\n { status },\n );\n}\n\n/**\n * Session verification response utilities\n */\nexport class SessionResponseHelper {\n static createVerificationResponse(decodedSession: any): NextResponse {\n return createApiSuccessResponse({\n valid: true,\n uid: decodedSession.data?.payload?.sub,\n exp: decodedSession.data?.payload?.exp,\n });\n }\n\n static createUnauthorizedResponse(): NextResponse {\n return createApiErrorResponse('UNAUTHORIZED', 'Authentication required', 401);\n }\n\n static createSessionCreationResponse(res: any): NextResponse {\n if (!res.success) {\n console.error('[TernSecureAuthHandler] Error creating session:', {\n error: res.error,\n message: res.message,\n cookieSet: res.cookieSet,\n });\n }\n\n const statusCode = res.success\n ? 200\n : res.error === 'INVALID_TOKEN'\n ? 400\n : res.error === 'EXPIRED_TOKEN'\n ? 401\n : 500;\n\n return NextResponse.json(res, { status: statusCode });\n }\n\n static createRefreshResponse(refreshRes: any): NextResponse {\n if (!refreshRes.success) {\n console.error('[TernSecureAuthHandler] Error refreshing session:', {\n error: refreshRes.error,\n message: refreshRes.message,\n });\n }\n\n const statusCode = refreshRes.success ? 200 : 401;\n return NextResponse.json(refreshRes, { status: statusCode });\n }\n\n static createRevokeResponse(res: any): NextResponse {\n if (!res.success) {\n console.error('[TernSecureAuthHandler] Error revoking session:', {\n error: res.error,\n message: res.message,\n });\n }\n const statusCode = res.success ? 200 : 500;\n return NextResponse.json(res, { status: statusCode });\n }\n}\n\n/**\n * HTTP method response utilities\n */\nexport class HttpResponseHelper {\n static createMethodNotAllowedResponse(): NextResponse {\n return createApiErrorResponse('METHOD_NOT_ALLOWED', 'Method not allowed', 405);\n }\n\n static createNotFoundResponse(): NextResponse {\n return createApiErrorResponse('NOT_FOUND', 'Endpoint not found', 404);\n }\n\n static createSubEndpointNotSupportedResponse(): NextResponse {\n return createApiErrorResponse(\n 'SUB_ENDPOINT_NOT_SUPPORTED',\n 'Sub-endpoint not supported for POST method',\n 400,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA6B;AAKtB,SAAS,uBACd,MACA,SACA,QACc;AACd,QAAM,SAAmC;AAAA,IACvC;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,2BAAa;AAAA,IAClB;AAAA,MACE,SAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP;AAAA;AAAA,IACF;AAAA,IACA,EAAE,OAAO;AAAA,EACX;AACF;AAKO,SAAS,yBAA4B,MAAS,SAAiB,KAAmB;AACvF,SAAO,2BAAa;AAAA,IAClB;AAAA,MACE,SAAS;AAAA,MACT,GAAG;AAAA,IACL;AAAA,IACA,EAAE,OAAO;AAAA,EACX;AACF;AAKO,MAAM,sBAAsB;AAAA,EACjC,OAAO,2BAA2B,gBAAmC;AACnE,WAAO,yBAAyB;AAAA,MAC9B,OAAO;AAAA,MACP,KAAK,eAAe,MAAM,SAAS;AAAA,MACnC,KAAK,eAAe,MAAM,SAAS;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,6BAA2C;AAChD,WAAO,uBAAuB,gBAAgB,2BAA2B,GAAG;AAAA,EAC9E;AAAA,EAEA,OAAO,8BAA8B,KAAwB;AAC3D,QAAI,CAAC,IAAI,SAAS;AAChB,cAAQ,MAAM,mDAAmD;AAAA,QAC/D,OAAO,IAAI;AAAA,QACX,SAAS,IAAI;AAAA,QACb,WAAW,IAAI;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,IAAI,UACnB,MACA,IAAI,UAAU,kBACZ,MACA,IAAI,UAAU,kBACZ,MACA;AAER,WAAO,2BAAa,KAAK,KAAK,EAAE,QAAQ,WAAW,CAAC;AAAA,EACtD;AAAA,EAEA,OAAO,sBAAsB,YAA+B;AAC1D,QAAI,CAAC,WAAW,SAAS;AACvB,cAAQ,MAAM,qDAAqD;AAAA,QACjE,OAAO,WAAW;AAAA,QAClB,SAAS,WAAW;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,WAAW,UAAU,MAAM;AAC9C,WAAO,2BAAa,KAAK,YAAY,EAAE,QAAQ,WAAW,CAAC;AAAA,EAC7D;AAAA,EAEA,OAAO,qBAAqB,KAAwB;AAClD,QAAI,CAAC,IAAI,SAAS;AAChB,cAAQ,MAAM,mDAAmD;AAAA,QAC/D,OAAO,IAAI;AAAA,QACX,SAAS,IAAI;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,aAAa,IAAI,UAAU,MAAM;AACvC,WAAO,2BAAa,KAAK,KAAK,EAAE,QAAQ,WAAW,CAAC;AAAA,EACtD;AACF;AAKO,MAAM,mBAAmB;AAAA,EAC9B,OAAO,iCAA+C;AACpD,WAAO,uBAAuB,sBAAsB,sBAAsB,GAAG;AAAA,EAC/E;AAAA,EAEA,OAAO,yBAAuC;AAC5C,WAAO,uBAAuB,aAAa,sBAAsB,GAAG;AAAA,EACtE;AAAA,EAEA,OAAO,wCAAsD;AAC3D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|