@tern-secure/nextjs 4.2.3 → 4.2.4
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/server/ternSecureMiddleware.js +18 -25
- package/dist/cjs/server/ternSecureMiddleware.js.map +1 -1
- package/dist/esm/server/ternSecureMiddleware.js +17 -25
- package/dist/esm/server/ternSecureMiddleware.js.map +1 -1
- package/dist/types/server/ternSecureMiddleware.d.ts +1 -0
- package/dist/types/server/ternSecureMiddleware.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -19,18 +19,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var ternSecureMiddleware_exports = {};
|
|
20
20
|
__export(ternSecureMiddleware_exports, {
|
|
21
21
|
createRouteMatcher: () => createRouteMatcher,
|
|
22
|
+
runtime: () => runtime,
|
|
22
23
|
ternSecureMiddleware: () => ternSecureMiddleware
|
|
23
24
|
});
|
|
24
25
|
module.exports = __toCommonJS(ternSecureMiddleware_exports);
|
|
25
26
|
var import_server = require("next/server");
|
|
26
|
-
|
|
27
|
+
const runtime = "edge";
|
|
27
28
|
function createRouteMatcher(patterns) {
|
|
28
29
|
return (request) => {
|
|
29
30
|
const { pathname } = request.nextUrl;
|
|
30
31
|
return patterns.some((pattern) => {
|
|
31
|
-
const regexPattern = new RegExp(
|
|
32
|
-
`^${pattern.replace(/\*/g, ".*").replace(/\((.*)\)/, "(?:$1)?")}$`
|
|
33
|
-
);
|
|
32
|
+
const regexPattern = new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/$$(.*)$$/, "(?:$1)?")}$`);
|
|
34
33
|
return regexPattern.test(pathname);
|
|
35
34
|
});
|
|
36
35
|
};
|
|
@@ -48,35 +47,28 @@ function ternSecureMiddleware(callback) {
|
|
|
48
47
|
if (currentPath !== "/sign-in") {
|
|
49
48
|
const redirectUrl = new URL("/sign-in", request.url);
|
|
50
49
|
redirectUrl.searchParams.set("redirect", currentPath);
|
|
51
|
-
throw new import_errors.TernSecureError("UNAUTHENTICATED", redirectUrl.toString());
|
|
52
|
-
} else {
|
|
53
50
|
throw new Error("UNAUTHENTICATED");
|
|
54
51
|
}
|
|
55
52
|
}
|
|
56
53
|
}
|
|
57
54
|
};
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
55
|
+
if (callback) {
|
|
56
|
+
try {
|
|
57
|
+
await callback(auth, request);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
if (error instanceof Error && error.message === "UNAUTHENTICATED") {
|
|
60
|
+
const redirectUrl = new URL("/sign-in", request.url);
|
|
61
|
+
redirectUrl.searchParams.set("redirect", request.nextUrl.pathname);
|
|
62
|
+
return import_server.NextResponse.redirect(redirectUrl);
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
68
65
|
}
|
|
69
|
-
throw error;
|
|
70
66
|
}
|
|
67
|
+
const response = import_server.NextResponse.next();
|
|
68
|
+
response.headers.delete("x-middleware-next");
|
|
69
|
+
return response;
|
|
71
70
|
} catch (error) {
|
|
72
|
-
console.error("Middleware error:",
|
|
73
|
-
error: error instanceof Error ? {
|
|
74
|
-
name: error.name,
|
|
75
|
-
message: error.message,
|
|
76
|
-
stack: error.stack
|
|
77
|
-
} : error,
|
|
78
|
-
path: request.nextUrl.pathname
|
|
79
|
-
});
|
|
71
|
+
console.error("Middleware error:", error);
|
|
80
72
|
return import_server.NextResponse.redirect(new URL("/sign-in", request.url));
|
|
81
73
|
}
|
|
82
74
|
};
|
|
@@ -84,6 +76,7 @@ function ternSecureMiddleware(callback) {
|
|
|
84
76
|
// Annotate the CommonJS export names for ESM import in node:
|
|
85
77
|
0 && (module.exports = {
|
|
86
78
|
createRouteMatcher,
|
|
79
|
+
runtime,
|
|
87
80
|
ternSecureMiddleware
|
|
88
81
|
});
|
|
89
82
|
//# sourceMappingURL=ternSecureMiddleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/ternSecureMiddleware.ts"],"sourcesContent":["import { type NextRequest, NextResponse } from 'next/server';\nimport type { UserInfo } from './types'\
|
|
1
|
+
{"version":3,"sources":["../../../src/server/ternSecureMiddleware.ts"],"sourcesContent":["import { type NextRequest, NextResponse } from 'next/server';\nimport type { UserInfo } from './types'\n\nexport const runtime = \"edge\"\n\ninterface Auth {\n user: UserInfo | null\n sessionId : string | null\n protect: () => Promise<void>\n}\n\ntype MiddlewareCallback = (\n auth: Auth,\n request: NextRequest\n) => Promise<void>\n\n\n/**\n * Create a route matcher function for public paths\n */\nexport function createRouteMatcher(patterns: string[]) {\n return (request: NextRequest): boolean => {\n const { pathname } = request.nextUrl\n return patterns.some((pattern) => {\n // Convert route pattern to regex\n const regexPattern = new RegExp(`^${pattern.replace(/\\*/g, \".*\").replace(/$$(.*)$$/, \"(?:$1)?\")}$`)\n return regexPattern.test(pathname)\n })\n }\n}\n\n\n/**\n * Middleware factory that handles authentication and custom logic\n * @param customHandler Optional function for additional custom logic\n */\n\nexport function ternSecureMiddleware(callback: MiddlewareCallback) {\n return async function middleware(request: NextRequest) {\n try {\n\n const hasCookies = request.cookies.has('_session_cookie') || request.cookies.has('_session_token')\n\n const auth: Auth = {\n user: null,\n sessionId: null,\n protect: async () => {\n if (!hasCookies) {\n const currentPath = request.nextUrl.pathname\n if (currentPath !== '/sign-in') {\n const redirectUrl = new URL('/sign-in', request.url)\n redirectUrl.searchParams.set('redirect', currentPath)\n throw new Error(\"UNAUTHENTICATED\")\n }\n }\n },\n }\n\n //if (!callback) {\n // return NextResponse.next()\n // }\n\n if (callback){\n try {\n await callback(auth, request)\n } catch (error) {\n // Handle authentication errors\n if (error instanceof Error && error.message === \"UNAUTHENTICATED\") {\n const redirectUrl = new URL(\"/sign-in\", request.url)\n redirectUrl.searchParams.set(\"redirect\", request.nextUrl.pathname)\n return NextResponse.redirect(redirectUrl)\n }\n // Re-throw other errors\n throw error\n }\n }\n\n // Continue to the next middleware or route handler\n const response = NextResponse.next()\n\n // Clean up response\n response.headers.delete(\"x-middleware-next\")\n\n return response\n } catch (error) {\n console.error(\"Middleware error:\", error)\n return NextResponse.redirect(new URL('/sign-in', request.url))\n }\n }\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+C;AAGxC,MAAM,UAAU;AAiBhB,SAAS,mBAAmB,UAAoB;AACrD,SAAO,CAAC,YAAkC;AACxC,UAAM,EAAE,SAAS,IAAI,QAAQ;AAC7B,WAAO,SAAS,KAAK,CAAC,YAAY;AAEhC,YAAM,eAAe,IAAI,OAAO,IAAI,QAAQ,QAAQ,OAAO,IAAI,EAAE,QAAQ,YAAY,SAAS,CAAC,GAAG;AAClG,aAAO,aAAa,KAAK,QAAQ;AAAA,IACnC,CAAC;AAAA,EACH;AACF;AAQO,SAAS,qBAAqB,UAA8B;AACjE,SAAO,eAAe,WAAW,SAAsB;AACrD,QAAI;AAEF,YAAM,aAAa,QAAQ,QAAQ,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,IAAI,gBAAgB;AAEjG,YAAM,OAAa;AAAA,QACjB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,YAAY;AACnB,cAAI,CAAC,YAAY;AACf,kBAAM,cAAc,QAAQ,QAAQ;AACpC,gBAAI,gBAAgB,YAAY;AAC9B,oBAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,0BAAY,aAAa,IAAI,YAAY,WAAW;AACpD,oBAAM,IAAI,MAAM,iBAAiB;AAAA,YACnC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAMF,UAAI,UAAS;AACX,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO;AAAA,QAC9B,SAAS,OAAO;AAEd,cAAI,iBAAiB,SAAS,MAAM,YAAY,mBAAmB;AACjE,kBAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,wBAAY,aAAa,IAAI,YAAY,QAAQ,QAAQ,QAAQ;AACjE,mBAAO,2BAAa,SAAS,WAAW;AAAA,UAC1C;AAEA,gBAAM;AAAA,QACR;AAAA,MACF;AAGE,YAAM,WAAW,2BAAa,KAAK;AAGnC,eAAS,QAAQ,OAAO,mBAAmB;AAE3C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,qBAAqB,KAAK;AACxC,aAAO,2BAAa,SAAS,IAAI,IAAI,YAAY,QAAQ,GAAG,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { NextResponse } from "next/server";
|
|
2
|
-
|
|
2
|
+
const runtime = "edge";
|
|
3
3
|
function createRouteMatcher(patterns) {
|
|
4
4
|
return (request) => {
|
|
5
5
|
const { pathname } = request.nextUrl;
|
|
6
6
|
return patterns.some((pattern) => {
|
|
7
|
-
const regexPattern = new RegExp(
|
|
8
|
-
`^${pattern.replace(/\*/g, ".*").replace(/\((.*)\)/, "(?:$1)?")}$`
|
|
9
|
-
);
|
|
7
|
+
const regexPattern = new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/$$(.*)$$/, "(?:$1)?")}$`);
|
|
10
8
|
return regexPattern.test(pathname);
|
|
11
9
|
});
|
|
12
10
|
};
|
|
@@ -24,41 +22,35 @@ function ternSecureMiddleware(callback) {
|
|
|
24
22
|
if (currentPath !== "/sign-in") {
|
|
25
23
|
const redirectUrl = new URL("/sign-in", request.url);
|
|
26
24
|
redirectUrl.searchParams.set("redirect", currentPath);
|
|
27
|
-
throw new TernSecureError("UNAUTHENTICATED", redirectUrl.toString());
|
|
28
|
-
} else {
|
|
29
25
|
throw new Error("UNAUTHENTICATED");
|
|
30
26
|
}
|
|
31
27
|
}
|
|
32
28
|
}
|
|
33
29
|
};
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
30
|
+
if (callback) {
|
|
31
|
+
try {
|
|
32
|
+
await callback(auth, request);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
if (error instanceof Error && error.message === "UNAUTHENTICATED") {
|
|
35
|
+
const redirectUrl = new URL("/sign-in", request.url);
|
|
36
|
+
redirectUrl.searchParams.set("redirect", request.nextUrl.pathname);
|
|
37
|
+
return NextResponse.redirect(redirectUrl);
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
44
40
|
}
|
|
45
|
-
throw error;
|
|
46
41
|
}
|
|
42
|
+
const response = NextResponse.next();
|
|
43
|
+
response.headers.delete("x-middleware-next");
|
|
44
|
+
return response;
|
|
47
45
|
} catch (error) {
|
|
48
|
-
console.error("Middleware error:",
|
|
49
|
-
error: error instanceof Error ? {
|
|
50
|
-
name: error.name,
|
|
51
|
-
message: error.message,
|
|
52
|
-
stack: error.stack
|
|
53
|
-
} : error,
|
|
54
|
-
path: request.nextUrl.pathname
|
|
55
|
-
});
|
|
46
|
+
console.error("Middleware error:", error);
|
|
56
47
|
return NextResponse.redirect(new URL("/sign-in", request.url));
|
|
57
48
|
}
|
|
58
49
|
};
|
|
59
50
|
}
|
|
60
51
|
export {
|
|
61
52
|
createRouteMatcher,
|
|
53
|
+
runtime,
|
|
62
54
|
ternSecureMiddleware
|
|
63
55
|
};
|
|
64
56
|
//# sourceMappingURL=ternSecureMiddleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/ternSecureMiddleware.ts"],"sourcesContent":["import { type NextRequest, NextResponse } from 'next/server';\nimport type { UserInfo } from './types'\
|
|
1
|
+
{"version":3,"sources":["../../../src/server/ternSecureMiddleware.ts"],"sourcesContent":["import { type NextRequest, NextResponse } from 'next/server';\nimport type { UserInfo } from './types'\n\nexport const runtime = \"edge\"\n\ninterface Auth {\n user: UserInfo | null\n sessionId : string | null\n protect: () => Promise<void>\n}\n\ntype MiddlewareCallback = (\n auth: Auth,\n request: NextRequest\n) => Promise<void>\n\n\n/**\n * Create a route matcher function for public paths\n */\nexport function createRouteMatcher(patterns: string[]) {\n return (request: NextRequest): boolean => {\n const { pathname } = request.nextUrl\n return patterns.some((pattern) => {\n // Convert route pattern to regex\n const regexPattern = new RegExp(`^${pattern.replace(/\\*/g, \".*\").replace(/$$(.*)$$/, \"(?:$1)?\")}$`)\n return regexPattern.test(pathname)\n })\n }\n}\n\n\n/**\n * Middleware factory that handles authentication and custom logic\n * @param customHandler Optional function for additional custom logic\n */\n\nexport function ternSecureMiddleware(callback: MiddlewareCallback) {\n return async function middleware(request: NextRequest) {\n try {\n\n const hasCookies = request.cookies.has('_session_cookie') || request.cookies.has('_session_token')\n\n const auth: Auth = {\n user: null,\n sessionId: null,\n protect: async () => {\n if (!hasCookies) {\n const currentPath = request.nextUrl.pathname\n if (currentPath !== '/sign-in') {\n const redirectUrl = new URL('/sign-in', request.url)\n redirectUrl.searchParams.set('redirect', currentPath)\n throw new Error(\"UNAUTHENTICATED\")\n }\n }\n },\n }\n\n //if (!callback) {\n // return NextResponse.next()\n // }\n\n if (callback){\n try {\n await callback(auth, request)\n } catch (error) {\n // Handle authentication errors\n if (error instanceof Error && error.message === \"UNAUTHENTICATED\") {\n const redirectUrl = new URL(\"/sign-in\", request.url)\n redirectUrl.searchParams.set(\"redirect\", request.nextUrl.pathname)\n return NextResponse.redirect(redirectUrl)\n }\n // Re-throw other errors\n throw error\n }\n }\n\n // Continue to the next middleware or route handler\n const response = NextResponse.next()\n\n // Clean up response\n response.headers.delete(\"x-middleware-next\")\n\n return response\n } catch (error) {\n console.error(\"Middleware error:\", error)\n return NextResponse.redirect(new URL('/sign-in', request.url))\n }\n }\n}"],"mappings":"AAAA,SAA2B,oBAAoB;AAGxC,MAAM,UAAU;AAiBhB,SAAS,mBAAmB,UAAoB;AACrD,SAAO,CAAC,YAAkC;AACxC,UAAM,EAAE,SAAS,IAAI,QAAQ;AAC7B,WAAO,SAAS,KAAK,CAAC,YAAY;AAEhC,YAAM,eAAe,IAAI,OAAO,IAAI,QAAQ,QAAQ,OAAO,IAAI,EAAE,QAAQ,YAAY,SAAS,CAAC,GAAG;AAClG,aAAO,aAAa,KAAK,QAAQ;AAAA,IACnC,CAAC;AAAA,EACH;AACF;AAQO,SAAS,qBAAqB,UAA8B;AACjE,SAAO,eAAe,WAAW,SAAsB;AACrD,QAAI;AAEF,YAAM,aAAa,QAAQ,QAAQ,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,IAAI,gBAAgB;AAEjG,YAAM,OAAa;AAAA,QACjB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,YAAY;AACnB,cAAI,CAAC,YAAY;AACf,kBAAM,cAAc,QAAQ,QAAQ;AACpC,gBAAI,gBAAgB,YAAY;AAC9B,oBAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,0BAAY,aAAa,IAAI,YAAY,WAAW;AACpD,oBAAM,IAAI,MAAM,iBAAiB;AAAA,YACnC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAMF,UAAI,UAAS;AACX,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO;AAAA,QAC9B,SAAS,OAAO;AAEd,cAAI,iBAAiB,SAAS,MAAM,YAAY,mBAAmB;AACjE,kBAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,wBAAY,aAAa,IAAI,YAAY,QAAQ,QAAQ,QAAQ;AACjE,mBAAO,aAAa,SAAS,WAAW;AAAA,UAC1C;AAEA,gBAAM;AAAA,QACR;AAAA,MACF;AAGE,YAAM,WAAW,aAAa,KAAK;AAGnC,eAAS,QAAQ,OAAO,mBAAmB;AAE3C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,qBAAqB,KAAK;AACxC,aAAO,aAAa,SAAS,IAAI,IAAI,YAAY,QAAQ,GAAG,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ternSecureMiddleware.d.ts","sourceRoot":"","sources":["../../../src/server/ternSecureMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"ternSecureMiddleware.d.ts","sourceRoot":"","sources":["../../../src/server/ternSecureMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,OAAO,SAAS,CAAA;AAE7B,UAAU,IAAI;IACZ,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IACrB,SAAS,EAAG,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,KAAK,kBAAkB,GAAG,CACxB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,IAAI,CAAC,CAAA;AAGlB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAClC,WAAW,KAAG,OAAO,CAQvC;AAGD;;;GAGG;AAEH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,aACrB,WAAW,oCAmDtD"}
|