astro-sessionkit 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/dist/core/config.d.ts +9 -0
  3. package/dist/core/config.d.ts.map +1 -0
  4. package/dist/core/config.js +43 -0
  5. package/dist/core/config.js.map +1 -0
  6. package/dist/core/context.d.ts +7 -0
  7. package/dist/core/context.d.ts.map +1 -0
  8. package/dist/core/context.js +11 -0
  9. package/dist/core/context.js.map +1 -0
  10. package/dist/core/guardMiddleware.d.ts +3 -0
  11. package/dist/core/guardMiddleware.d.ts.map +1 -0
  12. package/dist/core/guardMiddleware.js +56 -0
  13. package/dist/core/guardMiddleware.js.map +1 -0
  14. package/dist/core/matcher.d.ts +2 -0
  15. package/dist/core/matcher.d.ts.map +1 -0
  16. package/dist/core/matcher.js +38 -0
  17. package/dist/core/matcher.js.map +1 -0
  18. package/dist/core/sessionMiddleware.d.ts +3 -0
  19. package/dist/core/sessionMiddleware.d.ts.map +1 -0
  20. package/dist/core/sessionMiddleware.js +23 -0
  21. package/dist/core/sessionMiddleware.js.map +1 -0
  22. package/dist/core/types.d.ts +40 -0
  23. package/dist/core/types.d.ts.map +1 -0
  24. package/dist/core/types.js +2 -0
  25. package/dist/core/types.js.map +1 -0
  26. package/dist/core/validation.d.ts +5 -0
  27. package/dist/core/validation.d.ts.map +1 -0
  28. package/dist/core/validation.js +91 -0
  29. package/dist/core/validation.js.map +1 -0
  30. package/dist/guard.d.ts +2 -0
  31. package/dist/guard.d.ts.map +1 -0
  32. package/dist/guard.js +5 -0
  33. package/dist/guard.js.map +1 -0
  34. package/dist/index.d.ts +6 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +25 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/integration.d.ts +5 -0
  39. package/dist/integration.d.ts.map +1 -0
  40. package/dist/integration.js +22 -0
  41. package/dist/integration.js.map +1 -0
  42. package/dist/middleware.d.ts +2 -0
  43. package/dist/middleware.d.ts.map +1 -0
  44. package/dist/middleware.js +1 -0
  45. package/dist/middleware.js.map +1 -0
  46. package/dist/server.d.ts +13 -0
  47. package/dist/server.d.ts.map +1 -0
  48. package/dist/server.js +67 -0
  49. package/dist/server.js.map +1 -0
  50. package/package.json +89 -0
  51. package/readme.md +601 -0
  52. package/security.md +349 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Alex Mora
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,9 @@
1
+ import type { SessionKitConfig, AccessHooks, ProtectionRule } from "./types";
2
+ export interface ResolvedConfig {
3
+ loginPath: string;
4
+ protect: ProtectionRule[];
5
+ access: Required<AccessHooks>;
6
+ }
7
+ export declare function setConfig(userConfig: SessionKitConfig): void;
8
+ export declare function getConfig(): ResolvedConfig;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAM7E,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;CAC/B;AAeD,wBAAgB,SAAS,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAwC5D;AAKD,wBAAgB,SAAS,IAAI,cAAc,CAE1C"}
@@ -0,0 +1,43 @@
1
+ import { isValidRedirectPath, isValidPattern } from './validation.js';
2
+
3
+ let config = {
4
+ loginPath: "/login",
5
+ protect: [],
6
+ access: {
7
+ getRole: (session) => session?.role ?? null,
8
+ getPermissions: (session) => session?.permissions ?? [],
9
+ check: undefined,
10
+ },
11
+ };
12
+ function setConfig(userConfig) {
13
+ const loginPath = userConfig.loginPath ?? "/login";
14
+ if (!isValidRedirectPath(loginPath)) {
15
+ throw new Error(`[SessionKit] Invalid loginPath: "${loginPath}". Must start with / and be less than 500 characters.`);
16
+ }
17
+ if (userConfig.protect) {
18
+ for (const rule of userConfig.protect) {
19
+ if (!isValidPattern(rule.pattern)) {
20
+ throw new Error(`[SessionKit] Invalid pattern: "${rule.pattern}". ` +
21
+ `Patterns must start with / and be less than 1000 characters.`);
22
+ }
23
+ if (rule.redirectTo && !isValidRedirectPath(rule.redirectTo)) {
24
+ throw new Error(`[SessionKit] Invalid redirectTo: "${rule.redirectTo}". ` +
25
+ `Must start with / and be less than 500 characters.`);
26
+ }
27
+ }
28
+ }
29
+ config = {
30
+ loginPath,
31
+ protect: userConfig.protect ?? [],
32
+ access: {
33
+ getRole: userConfig.access?.getRole ?? ((session) => session?.role ?? null),
34
+ getPermissions: userConfig.access?.getPermissions ?? ((session) => session?.permissions ?? []),
35
+ check: userConfig.access?.check,
36
+ },
37
+ };
38
+ }
39
+ function getConfig() {
40
+ return config;
41
+ }
42
+
43
+ export { getConfig, setConfig };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAWnE,IAAI,MAAM,GAAmB;IAC3B,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,EAAE;IACX,MAAM,EAAE;QACN,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;QAC3C,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE;QACvD,KAAK,EAAE,SAAgB;KACxB;CACF,CAAC;AAKF,MAAM,UAAU,SAAS,CAAC,UAA4B;IAEpD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,QAAQ,CAAC;IACnD,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,oCAAoC,SAAS,uDAAuD,CACrG,CAAC;IACJ,CAAC;IAGD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YAEtC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CACb,kCAAkC,IAAI,CAAC,OAAO,KAAK;oBACnD,8DAA8D,CAC/D,CAAC;YACJ,CAAC;YAGD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,CAAC,UAAU,KAAK;oBACzD,oDAAoD,CACrD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAGD,MAAM,GAAG;QACP,SAAS;QACT,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE;QACjC,MAAM,EAAE;YACN,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;YAC3E,cAAc,EAAE,UAAU,CAAC,MAAM,EAAE,cAAc,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;YAC9F,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,KAAY;SACvC;KACF,CAAC;AACJ,CAAC;AAKD,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Session } from "./types";
2
+ export interface SessionContext {
3
+ session: Session | null;
4
+ }
5
+ export declare function runWithSessionContext<T>(context: SessionContext, fn: () => T): T;
6
+ export declare function getSessionContext(): SessionContext | undefined;
7
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKvC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB;AAOD,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAEH;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D"}
@@ -0,0 +1,11 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+
3
+ const als = new AsyncLocalStorage();
4
+ function runWithSessionContext(context, fn) {
5
+ return als.run(context, fn);
6
+ }
7
+ function getSessionContext() {
8
+ return als.getStore();
9
+ }
10
+
11
+ export { getSessionContext, runWithSessionContext };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAUrD,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAKpD,MAAM,UAAU,qBAAqB,CACnC,OAAuB,EACvB,EAAW;IAEX,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAKD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MiddlewareHandler } from "astro";
2
+ export declare function createGuardMiddleware(): MiddlewareHandler;
3
+ //# sourceMappingURL=guardMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardMiddleware.d.ts","sourceRoot":"","sources":["../../src/core/guardMiddleware.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,iBAAiB,EAAC,MAAM,OAAO,CAAC;AA0DzD,wBAAgB,qBAAqB,IAAI,iBAAiB,CA+BzD"}
@@ -0,0 +1,56 @@
1
+ import { getSessionContext } from './context.js';
2
+ import { getConfig } from './config.js';
3
+ import { matchesPattern } from './matcher.js';
4
+
5
+ async function checkRule(rule, session) {
6
+ const { access } = getConfig();
7
+ if (access.check) {
8
+ return await Promise.resolve(access.check(rule, session));
9
+ }
10
+ if ("allow" in rule) {
11
+ return await Promise.resolve(rule.allow(session));
12
+ }
13
+ if (!session) {
14
+ return false;
15
+ }
16
+ if ("role" in rule) {
17
+ const userRole = access.getRole(session);
18
+ return userRole === rule.role;
19
+ }
20
+ if ("roles" in rule) {
21
+ const userRole = access.getRole(session);
22
+ return userRole !== null && rule.roles.includes(userRole);
23
+ }
24
+ if ("permission" in rule) {
25
+ const userPermissions = access.getPermissions(session);
26
+ return userPermissions.includes(rule.permission);
27
+ }
28
+ if ("permissions" in rule) {
29
+ const userPermissions = access.getPermissions(session);
30
+ return rule.permissions.every((p) => userPermissions.includes(p));
31
+ }
32
+ return true;
33
+ }
34
+ function createGuardMiddleware() {
35
+ return async (context, next) => {
36
+ const { protect, loginPath } = getConfig();
37
+ if (protect.length === 0) {
38
+ return next();
39
+ }
40
+ const pathname = new URL(context.request.url).pathname;
41
+ const sessionContext = getSessionContext();
42
+ const session = sessionContext?.session ?? null;
43
+ const rule = protect.find((r) => matchesPattern(r.pattern, pathname));
44
+ if (!rule) {
45
+ return next();
46
+ }
47
+ const allowed = await checkRule(rule, session);
48
+ if (!allowed) {
49
+ const redirectTo = rule.redirectTo ?? loginPath;
50
+ return context.redirect(redirectTo);
51
+ }
52
+ return next();
53
+ };
54
+ }
55
+
56
+ export { createGuardMiddleware };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardMiddleware.js","sourceRoot":"","sources":["../../src/core/guardMiddleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function matchesPattern(pattern: string, path: string): boolean;
2
+ //# sourceMappingURL=matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/core/matcher.ts"],"names":[],"mappings":"AAgDA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAErE"}
@@ -0,0 +1,38 @@
1
+ function escapeRegex(str) {
2
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3
+ }
4
+ function globToRegex(pattern) {
5
+ let regex = "";
6
+ let i = 0;
7
+ while (i < pattern.length) {
8
+ const char = pattern[i];
9
+ const next = pattern[i + 1];
10
+ if (char === "*" && next === "*") {
11
+ const isAtEnd = i + 2 === pattern.length;
12
+ const prevIsSlash = i > 0 && pattern[i - 1] === "/";
13
+ if (isAtEnd && prevIsSlash) {
14
+ if (regex.endsWith("/"))
15
+ regex = regex.slice(0, -1);
16
+ regex += "(?:/.*)?";
17
+ }
18
+ else {
19
+ regex += ".*";
20
+ }
21
+ i += 2;
22
+ continue;
23
+ }
24
+ if (char === "*") {
25
+ regex += "[^/]+(?:/[^/]+)*";
26
+ i += 1;
27
+ continue;
28
+ }
29
+ regex += escapeRegex(char);
30
+ i += 1;
31
+ }
32
+ return new RegExp(`^${regex}$`);
33
+ }
34
+ function matchesPattern(pattern, path) {
35
+ return globToRegex(pattern).test(path);
36
+ }
37
+
38
+ export { matchesPattern };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/core/matcher.ts"],"names":[],"mappings":"AAIA,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAG5B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC;YACzC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;YAGpD,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpD,KAAK,IAAI,UAAU,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,IAAI,CAAC;YAChB,CAAC;YAED,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAGD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAEjB,KAAK,IAAI,kBAAkB,CAAC;YAC5B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,IAAI,WAAW,CAAC,IAAc,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAY;IAC1D,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MiddlewareHandler } from "astro";
2
+ export declare const sessionMiddleware: MiddlewareHandler;
3
+ //# sourceMappingURL=sessionMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionMiddleware.d.ts","sourceRoot":"","sources":["../../src/core/sessionMiddleware.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAgB/C,eAAO,MAAM,iBAAiB,EAAE,iBAwB/B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { runWithSessionContext } from './context.js';
2
+ import { isValidSessionStructure } from './validation.js';
3
+
4
+ const SESSION_KEY = "__session__";
5
+ const sessionMiddleware = async (context, next) => {
6
+ const rawSession = context.session?.get(SESSION_KEY) ?? null;
7
+ let session = null;
8
+ if (rawSession) {
9
+ if (isValidSessionStructure(rawSession)) {
10
+ session = rawSession;
11
+ }
12
+ else {
13
+ if (process.env.NODE_ENV !== 'production') {
14
+ console.warn('[SessionKit] Invalid session structure detected. Session will be ignored. ' +
15
+ 'Ensure context.session.set("__session__", ...) has the correct structure.');
16
+ }
17
+ session = null;
18
+ }
19
+ }
20
+ return runWithSessionContext({ session }, () => next());
21
+ };
22
+
23
+ export { sessionMiddleware };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionMiddleware.js","sourceRoot":"","sources":["../../src/core/sessionMiddleware.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAMvD,MAAM,WAAW,GAAG,aAAa,CAAC;AAQlC,MAAM,CAAC,MAAM,iBAAiB,GAAsB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAE1E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAU,WAAW,CAAC,IAAI,IAAI,CAAC;IAGtE,IAAI,OAAO,GAAmB,IAAI,CAAC;IAEnC,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,UAAU,CAAC;QACvB,CAAC;aAAM,CAAC;YAEN,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC1C,OAAO,CAAC,IAAI,CACR,4EAA4E;oBAC5E,2EAA2E,CAC9E,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAGD,OAAO,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface Session {
2
+ userId: string;
3
+ email?: string;
4
+ role?: string;
5
+ roles?: string[];
6
+ permissions?: string[];
7
+ [key: string]: unknown;
8
+ }
9
+ interface BaseProtectionRule {
10
+ pattern: string;
11
+ redirectTo?: string;
12
+ }
13
+ export interface RoleProtectionRule extends BaseProtectionRule {
14
+ role: string;
15
+ }
16
+ export interface RolesProtectionRule extends BaseProtectionRule {
17
+ roles: string[];
18
+ }
19
+ export interface PermissionProtectionRule extends BaseProtectionRule {
20
+ permission: string;
21
+ }
22
+ export interface PermissionsProtectionRule extends BaseProtectionRule {
23
+ permissions: string[];
24
+ }
25
+ export interface CustomProtectionRule extends BaseProtectionRule {
26
+ allow: (session: Session | null) => boolean | Promise<boolean>;
27
+ }
28
+ export type ProtectionRule = RoleProtectionRule | RolesProtectionRule | PermissionProtectionRule | PermissionsProtectionRule | CustomProtectionRule;
29
+ export interface AccessHooks {
30
+ getRole?: (session: Session | null) => string | null;
31
+ getPermissions?: (session: Session | null) => string[];
32
+ check?: (rule: ProtectionRule, session: Session | null) => boolean | Promise<boolean>;
33
+ }
34
+ export interface SessionKitConfig {
35
+ loginPath?: string;
36
+ protect?: ProtectionRule[];
37
+ access?: AccessHooks;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,OAAO;IAEtB,MAAM,EAAE,MAAM,CAAC;IAGf,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAGjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAGvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAMD,UAAU,kBAAkB;IAE1B,OAAO,EAAE,MAAM,CAAC;IAGhB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAGD,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAGD,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAGD,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,mBAAmB,GACnB,wBAAwB,GACxB,yBAAyB,GACzB,oBAAoB,CAAC;AASzB,MAAM,WAAW,WAAW;IAE1B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC;IAGrD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC;IAGvD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAKD,MAAM,WAAW,gBAAgB;IAE/B,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAG3B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { Session } from "./types";
2
+ export declare function isValidSessionStructure(input: unknown): input is Session;
3
+ export declare function isValidPattern(pattern: string): boolean;
4
+ export declare function isValidRedirectPath(path: string): boolean;
5
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAMrC,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAoExE;AAKD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAgCvD;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAezD"}
@@ -0,0 +1,91 @@
1
+ function isValidSessionStructure(input) {
2
+ if (!input || typeof input !== 'object') {
3
+ return false;
4
+ }
5
+ const session = input;
6
+ if (typeof session.userId !== 'string' || !session.userId.trim()) {
7
+ return false;
8
+ }
9
+ if (session.userId.length > 255) {
10
+ return false;
11
+ }
12
+ if (session.email !== undefined) {
13
+ if (typeof session.email !== 'string') {
14
+ return false;
15
+ }
16
+ if (session.email.length > 320) {
17
+ return false;
18
+ }
19
+ }
20
+ if (session.role !== undefined) {
21
+ if (typeof session.role !== 'string') {
22
+ return false;
23
+ }
24
+ if (session.role.length > 100) {
25
+ return false;
26
+ }
27
+ }
28
+ if (session.roles !== undefined) {
29
+ if (!Array.isArray(session.roles)) {
30
+ return false;
31
+ }
32
+ if (session.roles.length > 100) {
33
+ return false;
34
+ }
35
+ if (!session.roles.every((r) => typeof r === 'string' && r.length <= 100)) {
36
+ return false;
37
+ }
38
+ }
39
+ if (session.permissions !== undefined) {
40
+ if (!Array.isArray(session.permissions)) {
41
+ return false;
42
+ }
43
+ if (session.permissions.length > 500) {
44
+ return false;
45
+ }
46
+ if (!session.permissions.every((p) => typeof p === 'string' && p.length <= 200)) {
47
+ return false;
48
+ }
49
+ }
50
+ return true;
51
+ }
52
+ function isValidPattern(pattern) {
53
+ if (typeof pattern !== "string")
54
+ return false;
55
+ if (pattern.length === 0)
56
+ return false;
57
+ if (pattern.length > 1000)
58
+ return false;
59
+ if (!pattern.startsWith("/"))
60
+ return false;
61
+ if (/\*{4,}/.test(pattern))
62
+ return false;
63
+ for (let i = 0; i < pattern.length; i++) {
64
+ if (pattern[i] !== "*")
65
+ continue;
66
+ let j = i;
67
+ while (j < pattern.length && pattern[j] === "*")
68
+ j++;
69
+ const run = j - i;
70
+ if (run < 1 || run > 3)
71
+ return false;
72
+ const next = pattern[j];
73
+ if (next !== undefined && next !== "/")
74
+ return false;
75
+ i = j - 1;
76
+ }
77
+ return true;
78
+ }
79
+ function isValidRedirectPath(path) {
80
+ if (typeof path !== "string")
81
+ return false;
82
+ if (path.length === 0 || path.length > 500)
83
+ return false;
84
+ if (!path.startsWith("/") || path.startsWith("//"))
85
+ return false;
86
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(path))
87
+ return false;
88
+ return true;
89
+ }
90
+
91
+ export { isValidPattern, isValidRedirectPath, isValidSessionStructure };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const onRequest: import("astro").MiddlewareHandler;
2
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,mCAA0B,CAAC"}
package/dist/guard.js ADDED
@@ -0,0 +1,5 @@
1
+ import { createGuardMiddleware } from './core/guardMiddleware.js';
2
+
3
+ const onRequest = createGuardMiddleware();
4
+
5
+ export { onRequest };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,CAAC,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AstroIntegration } from "astro";
2
+ import type { SessionKitConfig } from "./core/types";
3
+ export default function sessionkit(config?: SessionKitConfig): AstroIntegration;
4
+ export type { Session, ProtectionRule, RoleProtectionRule, RolesProtectionRule, PermissionProtectionRule, PermissionsProtectionRule, CustomProtectionRule, SessionKitConfig, AccessHooks, } from "./core/types";
5
+ export declare const version = "0.1.0";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAwBrD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAAM,GAAE,gBAAqB,GAAG,gBAAgB,CAwBlF;AAMD,YAAY,EACR,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,GACd,MAAM,cAAc,CAAC;AAMtB,eAAO,MAAM,OAAO,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ import { setConfig } from './core/config.js';
2
+
3
+ function sessionkit(config = {}) {
4
+ setConfig(config);
5
+ return {
6
+ name: "astro-sessionkit",
7
+ hooks: {
8
+ "astro:config:setup": ({ addMiddleware }) => {
9
+ addMiddleware({
10
+ entrypoint: "astro-sessionkit/middleware",
11
+ order: "pre",
12
+ });
13
+ if (config.protect && config.protect.length > 0) {
14
+ addMiddleware({
15
+ entrypoint: "astro-sessionkit/guard",
16
+ order: "pre",
17
+ });
18
+ }
19
+ },
20
+ },
21
+ };
22
+ }
23
+ const version = "0.1.0";
24
+
25
+ export { sessionkit as default, version };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAyB1C,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,SAA2B,EAAE;IAE5D,SAAS,CAAC,MAAM,CAAC,CAAC;IAElB,OAAO;QACH,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE;YACH,oBAAoB,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;gBAExC,aAAa,CAAC;oBACV,UAAU,EAAE,6BAA6B;oBACzC,KAAK,EAAE,KAAK;iBACf,CAAC,CAAC;gBAGH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9C,aAAa,CAAC;wBACV,UAAU,EAAE,wBAAwB;wBACpC,KAAK,EAAE,KAAK;qBACf,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;SACJ;KACJ,CAAC;AACN,CAAC;AAsBD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AstroIntegration } from "astro";
2
+ import type { SessionKitConfig } from "./core/types";
3
+ export default function sessionkit(config?: SessionKitConfig): AstroIntegration;
4
+ export type { Session, ProtectionRule, SessionKitConfig } from "./core/types";
5
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAwBrD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAAM,GAAE,gBAAqB,GAAG,gBAAgB,CAwBlF;AAGD,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { setConfig } from "./core/config";
2
+ export default function sessionkit(config = {}) {
3
+ setConfig(config);
4
+ return {
5
+ name: "astro-sessionkit",
6
+ hooks: {
7
+ "astro:config:setup": ({ addMiddleware }) => {
8
+ addMiddleware({
9
+ entrypoint: "astro-sessionkit/middleware",
10
+ order: "pre",
11
+ });
12
+ if (config.protect && config.protect.length > 0) {
13
+ addMiddleware({
14
+ entrypoint: "astro-sessionkit/guard",
15
+ order: "pre",
16
+ });
17
+ }
18
+ },
19
+ },
20
+ };
21
+ }
22
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAyB1C,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,SAA2B,EAAE;IAE9D,SAAS,CAAC,MAAM,CAAC,CAAC;IAElB,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE;YACL,oBAAoB,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;gBAE1C,aAAa,CAAC;oBACZ,UAAU,EAAE,6BAA6B;oBACzC,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;gBAGH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,aAAa,CAAC;wBACZ,UAAU,EAAE,wBAAwB;wBACpC,KAAK,EAAE,KAAK;qBACb,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { sessionMiddleware as onRequest } from "./core/sessionMiddleware";
2
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,IAAI,SAAS,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1 @@
1
+ export { sessionMiddleware as onRequest } from './core/sessionMiddleware.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,IAAI,SAAS,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Session } from "./core/types";
2
+ import type { APIContext } from "astro";
3
+ export declare function getSession(): Session | null;
4
+ export declare function requireSession(): Session;
5
+ export declare function isAuthenticated(): boolean;
6
+ export declare function hasRole(role: string): boolean;
7
+ export declare function hasPermission(permission: string): boolean;
8
+ export declare function hasAllPermissions(...permissions: string[]): boolean;
9
+ export declare function hasAnyPermission(...permissions: string[]): boolean;
10
+ export declare function setSession(context: APIContext, session: Session): void;
11
+ export declare function clearSession(context: APIContext): void;
12
+ export declare function updateSession(context: APIContext, updates: Partial<Session>): void;
13
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,OAAO,CAAC;AActC,wBAAgB,UAAU,IAAI,OAAO,GAAG,IAAI,CAG3C;AAcD,wBAAgB,cAAc,IAAI,OAAO,CAQxC;AAKD,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAKD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAS7C;AAKD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAKzD;AAKD,wBAAgB,iBAAiB,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAMnE;AAKD,wBAAgB,gBAAgB,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAMlE;AAyCD,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAUtE;AAyBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAEtD;AA6BD,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAkBlF"}