kroxt 1.2.1 → 1.3.0

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 (91) hide show
  1. package/README.md +29 -96
  2. package/dist/adapters/drizzle.d.ts +2 -1
  3. package/dist/adapters/drizzle.d.ts.map +1 -1
  4. package/dist/adapters/index.d.ts +9 -0
  5. package/dist/adapters/index.d.ts.map +1 -1
  6. package/dist/adapters/memory.d.ts.map +1 -1
  7. package/dist/adapters/mongoose.d.ts +7 -1
  8. package/dist/adapters/mongoose.d.ts.map +1 -1
  9. package/dist/adapters/prisma.d.ts +2 -1
  10. package/dist/adapters/prisma.d.ts.map +1 -1
  11. package/dist/{adapters → auth/adapters}/drizzle.cjs +33 -2
  12. package/dist/auth/adapters/drizzle.cjs.map +7 -0
  13. package/dist/auth/adapters/drizzle.js +58 -0
  14. package/dist/auth/adapters/drizzle.js.map +7 -0
  15. package/dist/auth/adapters/index.cjs.map +7 -0
  16. package/dist/{adapters → auth/adapters}/memory.cjs +28 -0
  17. package/dist/auth/adapters/memory.cjs.map +7 -0
  18. package/dist/auth/adapters/memory.js +59 -0
  19. package/dist/auth/adapters/memory.js.map +7 -0
  20. package/dist/auth/adapters/mongoose.cjs +99 -0
  21. package/dist/auth/adapters/mongoose.cjs.map +7 -0
  22. package/dist/auth/adapters/mongoose.js +74 -0
  23. package/dist/auth/adapters/mongoose.js.map +7 -0
  24. package/dist/{adapters → auth/adapters}/prisma.cjs +36 -2
  25. package/dist/auth/adapters/prisma.cjs.map +7 -0
  26. package/dist/auth/adapters/prisma.js +68 -0
  27. package/dist/auth/adapters/prisma.js.map +7 -0
  28. package/dist/{core → auth/core}/index.cjs +67 -2
  29. package/dist/auth/core/index.cjs.map +7 -0
  30. package/dist/auth/core/index.js +143 -0
  31. package/dist/auth/core/index.js.map +7 -0
  32. package/dist/{index.cjs → auth/index.cjs} +12 -4
  33. package/dist/auth/index.cjs.map +7 -0
  34. package/dist/{index.js → auth/index.js} +6 -1
  35. package/dist/auth/index.js.map +7 -0
  36. package/dist/auth/providers/index.cjs.map +7 -0
  37. package/dist/auth/providers/index.js.map +7 -0
  38. package/dist/{security → auth/security}/index.cjs +10 -9
  39. package/dist/auth/security/index.cjs.map +7 -0
  40. package/dist/auth/security/index.js +19 -0
  41. package/dist/auth/security/index.js.map +7 -0
  42. package/dist/auth/security/rate-limit.cjs +82 -0
  43. package/dist/auth/security/rate-limit.cjs.map +7 -0
  44. package/dist/auth/security/rate-limit.js +57 -0
  45. package/dist/auth/security/rate-limit.js.map +7 -0
  46. package/dist/cli/index.cjs +134 -0
  47. package/dist/cli/index.cjs.map +7 -0
  48. package/dist/cli/index.js +111 -0
  49. package/dist/cli/index.js.map +7 -0
  50. package/dist/cli/templates.cjs +147 -0
  51. package/dist/cli/templates.cjs.map +7 -0
  52. package/dist/cli/templates.js +111 -0
  53. package/dist/cli/templates.js.map +7 -0
  54. package/dist/core/index.d.ts +16 -1
  55. package/dist/core/index.d.ts.map +1 -1
  56. package/dist/index.d.ts +3 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/security/index.d.ts +1 -0
  59. package/dist/security/index.d.ts.map +1 -1
  60. package/dist/security/rate-limit.d.ts +39 -0
  61. package/dist/security/rate-limit.d.ts.map +1 -0
  62. package/package.json +8 -2
  63. package/dist/adapters/drizzle.cjs.map +0 -7
  64. package/dist/adapters/drizzle.js +0 -27
  65. package/dist/adapters/drizzle.js.map +0 -7
  66. package/dist/adapters/index.cjs.map +0 -7
  67. package/dist/adapters/memory.cjs.map +0 -7
  68. package/dist/adapters/memory.js +0 -31
  69. package/dist/adapters/memory.js.map +0 -7
  70. package/dist/adapters/mongoose.cjs +0 -55
  71. package/dist/adapters/mongoose.cjs.map +0 -7
  72. package/dist/adapters/mongoose.js +0 -31
  73. package/dist/adapters/mongoose.js.map +0 -7
  74. package/dist/adapters/prisma.cjs.map +0 -7
  75. package/dist/adapters/prisma.js +0 -34
  76. package/dist/adapters/prisma.js.map +0 -7
  77. package/dist/core/index.cjs.map +0 -7
  78. package/dist/core/index.js +0 -78
  79. package/dist/core/index.js.map +0 -7
  80. package/dist/index.cjs.map +0 -7
  81. package/dist/index.js.map +0 -7
  82. package/dist/providers/index.cjs.map +0 -7
  83. package/dist/providers/index.js.map +0 -7
  84. package/dist/security/index.cjs.map +0 -7
  85. package/dist/security/index.js +0 -20
  86. package/dist/security/index.js.map +0 -7
  87. /package/dist/{adapters → auth/adapters}/index.cjs +0 -0
  88. /package/dist/{adapters → auth/adapters}/index.js +0 -0
  89. /package/dist/{adapters → auth/adapters}/index.js.map +0 -0
  90. /package/dist/{providers → auth/providers}/index.cjs +0 -0
  91. /package/dist/{providers → auth/providers}/index.js +0 -0
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+ var import_commander = require("commander");
26
+ var import_enquirer = __toESM(require("enquirer"), 1);
27
+ var import_chalk = __toESM(require("chalk"), 1);
28
+ var import_fs = __toESM(require("fs"), 1);
29
+ var import_path = __toESM(require("path"), 1);
30
+ var import_crypto = __toESM(require("crypto"), 1);
31
+ var import_templates = require("./templates.js");
32
+ const program = new import_commander.Command();
33
+ const enquirer = new import_enquirer.default();
34
+ program.name("kroxt").description("Kroxt CLI for bootstrapping auth engines").version("1.0.0");
35
+ program.command("init").description("Initialize Kroxt in your project").option("-y, --yes", "Skip prompts and use defaults").action(async (options) => {
36
+ console.log(import_chalk.default.bold.white("\n\u2B22 KROXT AUTH INITIALIZER\n"));
37
+ try {
38
+ let response = {
39
+ adapter: "memory",
40
+ generateEnv: true,
41
+ useRateLimit: true,
42
+ useIPBlocking: true,
43
+ useStrictRevocation: true,
44
+ usePepper: true
45
+ };
46
+ if (!options.yes) {
47
+ response = await enquirer.prompt([
48
+ {
49
+ type: "select",
50
+ name: "adapter",
51
+ message: "Choose your database adapter:",
52
+ choices: [
53
+ { name: "memory", message: "In-Memory (Testing)" },
54
+ { name: "mongoose", message: "Mongoose (MongoDB)" },
55
+ { name: "prisma", message: "Prisma (PostgreSQL/MySQL)" },
56
+ { name: "drizzle", message: "Drizzle (SQLite/PostgreSQL)" },
57
+ { name: "none", message: "None (Manual Setup)" }
58
+ ]
59
+ },
60
+ {
61
+ type: "confirm",
62
+ name: "useRateLimit",
63
+ message: "Enable rate limiting defensive layer?",
64
+ initial: true
65
+ },
66
+ {
67
+ type: "confirm",
68
+ name: "useIPBlocking",
69
+ message: "Enable automatic IP blocking?",
70
+ initial: true
71
+ },
72
+ {
73
+ type: "confirm",
74
+ name: "useStrictRevocation",
75
+ message: "Enforce strict session revocation?",
76
+ initial: true
77
+ },
78
+ {
79
+ type: "confirm",
80
+ name: "usePepper",
81
+ message: "Use server-side password peppering?",
82
+ initial: true
83
+ },
84
+ {
85
+ type: "confirm",
86
+ name: "generateEnv",
87
+ message: "Generate secure secrets in .env?",
88
+ initial: true
89
+ }
90
+ ]);
91
+ } else {
92
+ console.log(import_chalk.default.gray("Using default settings (--yes)..."));
93
+ response = {
94
+ ...response,
95
+ useRateLimit: true,
96
+ useIPBlocking: true,
97
+ useStrictRevocation: true,
98
+ usePepper: true
99
+ };
100
+ }
101
+ const secret = import_crypto.default.randomBytes(32).toString("hex");
102
+ const authContent = (0, import_templates.authTemplate)(response.adapter, secret, response);
103
+ const authPath = import_path.default.join(process.cwd(), "src", "lib", "auth.ts");
104
+ const dirPath = import_path.default.dirname(authPath);
105
+ if (!import_fs.default.existsSync(dirPath)) {
106
+ import_fs.default.mkdirSync(dirPath, { recursive: true });
107
+ }
108
+ import_fs.default.writeFileSync(authPath, authContent);
109
+ console.log(import_chalk.default.green(`
110
+ \u2714 Created: ${import_chalk.default.white("src/lib/auth.ts")}`));
111
+ const tsConfigPath = import_path.default.join(process.cwd(), "tsconfig.json");
112
+ if (!import_fs.default.existsSync(tsConfigPath)) {
113
+ import_fs.default.writeFileSync(tsConfigPath, import_templates.tsConfigTemplate);
114
+ console.log(import_chalk.default.green(`\u2714 Created: ${import_chalk.default.white("tsconfig.json")}`));
115
+ }
116
+ if (response.generateEnv) {
117
+ const envPath = import_path.default.join(process.cwd(), ".env");
118
+ const envContent = (0, import_templates.envTemplate)(secret, response.usePepper);
119
+ if (import_fs.default.existsSync(envPath)) {
120
+ import_fs.default.appendFileSync(envPath, envContent);
121
+ console.log(import_chalk.default.green(`\u2714 Updated: ${import_chalk.default.white(".env")} (Appended JWT_SECRET)`));
122
+ } else {
123
+ import_fs.default.writeFileSync(envPath, envContent);
124
+ console.log(import_chalk.default.green(`\u2714 Created: ${import_chalk.default.white(".env")}`));
125
+ }
126
+ }
127
+ console.log(import_chalk.default.bold.white("\nKroxt is ready. Happy coding! \u{1F680}\n"));
128
+ } catch (err) {
129
+ console.error(import_chalk.default.red("\n\u2716 Initialization cancelled."));
130
+ process.exit(1);
131
+ }
132
+ });
133
+ program.parse(process.argv);
134
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cli/index.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport Enquirer from 'enquirer';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { authTemplate, envTemplate, tsConfigTemplate } from './templates.js';\n\nconst program = new Command();\nconst enquirer = new Enquirer();\n\nprogram\n .name('kroxt')\n .description('Kroxt CLI for bootstrapping auth engines')\n .version('1.0.0');\n\nprogram\n .command('init')\n .description('Initialize Kroxt in your project')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .action(async (options) => {\n console.log(chalk.bold.white('\\n\u2B22 KROXT AUTH INITIALIZER\\n'));\n\n try {\n let response = {\n adapter: 'memory',\n generateEnv: true,\n useRateLimit: true,\n useIPBlocking: true,\n useStrictRevocation: true,\n usePepper: true\n };\n\n if (!options.yes) {\n response = await enquirer.prompt([\n {\n type: 'select',\n name: 'adapter',\n message: 'Choose your database adapter:',\n choices: [\n { name: 'memory', message: 'In-Memory (Testing)' },\n { name: 'mongoose', message: 'Mongoose (MongoDB)' },\n { name: 'prisma', message: 'Prisma (PostgreSQL/MySQL)' },\n { name: 'drizzle', message: 'Drizzle (SQLite/PostgreSQL)' },\n { name: 'none', message: 'None (Manual Setup)' }\n ]\n },\n {\n type: 'confirm',\n name: 'useRateLimit',\n message: 'Enable rate limiting defensive layer?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'useIPBlocking',\n message: 'Enable automatic IP blocking?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'useStrictRevocation',\n message: 'Enforce strict session revocation?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'usePepper',\n message: 'Use server-side password peppering?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'generateEnv',\n message: 'Generate secure secrets in .env?',\n initial: true\n }\n ]) as any;\n } else {\n console.log(chalk.gray('Using default settings (--yes)...'));\n response = {\n ...response,\n useRateLimit: true,\n useIPBlocking: true,\n useStrictRevocation: true,\n usePepper: true\n } as any;\n }\n\n const secret = crypto.randomBytes(32).toString('hex');\n const authContent = authTemplate(response.adapter, secret, response);\n\n // Write auth.ts\n const authPath = path.join(process.cwd(), 'src', 'lib', 'auth.ts');\n const dirPath = path.dirname(authPath);\n\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n\n fs.writeFileSync(authPath, authContent);\n console.log(chalk.green(`\\n\u2714 Created: ${chalk.white('src/lib/auth.ts')}`));\n\n // Write tsconfig.json if not present\n const tsConfigPath = path.join(process.cwd(), 'tsconfig.json');\n if (!fs.existsSync(tsConfigPath)) {\n fs.writeFileSync(tsConfigPath, tsConfigTemplate);\n console.log(chalk.green(`\u2714 Created: ${chalk.white('tsconfig.json')}`));\n }\n\n // Write .env\n if (response.generateEnv) {\n const envPath = path.join(process.cwd(), '.env');\n const envContent = envTemplate(secret, response.usePepper);\n \n if (fs.existsSync(envPath)) {\n fs.appendFileSync(envPath, envContent);\n console.log(chalk.green(`\u2714 Updated: ${chalk.white('.env')} (Appended JWT_SECRET)`));\n } else {\n fs.writeFileSync(envPath, envContent);\n console.log(chalk.green(`\u2714 Created: ${chalk.white('.env')}`));\n }\n }\n\n console.log(chalk.bold.white('\\nKroxt is ready. Happy coding! \uD83D\uDE80\\n'));\n\n } catch (err) {\n console.error(chalk.red('\\n\u2716 Initialization cancelled.'));\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);\n"],
5
+ "mappings": "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",
6
+ "names": ["Enquirer", "chalk", "crypto", "path", "fs"]
7
+ }
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import Enquirer from "enquirer";
4
+ import chalk from "chalk";
5
+ import fs from "fs";
6
+ import path from "path";
7
+ import crypto from "crypto";
8
+ import { authTemplate, envTemplate, tsConfigTemplate } from "./templates.js";
9
+ const program = new Command();
10
+ const enquirer = new Enquirer();
11
+ program.name("kroxt").description("Kroxt CLI for bootstrapping auth engines").version("1.0.0");
12
+ program.command("init").description("Initialize Kroxt in your project").option("-y, --yes", "Skip prompts and use defaults").action(async (options) => {
13
+ console.log(chalk.bold.white("\n\u2B22 KROXT AUTH INITIALIZER\n"));
14
+ try {
15
+ let response = {
16
+ adapter: "memory",
17
+ generateEnv: true,
18
+ useRateLimit: true,
19
+ useIPBlocking: true,
20
+ useStrictRevocation: true,
21
+ usePepper: true
22
+ };
23
+ if (!options.yes) {
24
+ response = await enquirer.prompt([
25
+ {
26
+ type: "select",
27
+ name: "adapter",
28
+ message: "Choose your database adapter:",
29
+ choices: [
30
+ { name: "memory", message: "In-Memory (Testing)" },
31
+ { name: "mongoose", message: "Mongoose (MongoDB)" },
32
+ { name: "prisma", message: "Prisma (PostgreSQL/MySQL)" },
33
+ { name: "drizzle", message: "Drizzle (SQLite/PostgreSQL)" },
34
+ { name: "none", message: "None (Manual Setup)" }
35
+ ]
36
+ },
37
+ {
38
+ type: "confirm",
39
+ name: "useRateLimit",
40
+ message: "Enable rate limiting defensive layer?",
41
+ initial: true
42
+ },
43
+ {
44
+ type: "confirm",
45
+ name: "useIPBlocking",
46
+ message: "Enable automatic IP blocking?",
47
+ initial: true
48
+ },
49
+ {
50
+ type: "confirm",
51
+ name: "useStrictRevocation",
52
+ message: "Enforce strict session revocation?",
53
+ initial: true
54
+ },
55
+ {
56
+ type: "confirm",
57
+ name: "usePepper",
58
+ message: "Use server-side password peppering?",
59
+ initial: true
60
+ },
61
+ {
62
+ type: "confirm",
63
+ name: "generateEnv",
64
+ message: "Generate secure secrets in .env?",
65
+ initial: true
66
+ }
67
+ ]);
68
+ } else {
69
+ console.log(chalk.gray("Using default settings (--yes)..."));
70
+ response = {
71
+ ...response,
72
+ useRateLimit: true,
73
+ useIPBlocking: true,
74
+ useStrictRevocation: true,
75
+ usePepper: true
76
+ };
77
+ }
78
+ const secret = crypto.randomBytes(32).toString("hex");
79
+ const authContent = authTemplate(response.adapter, secret, response);
80
+ const authPath = path.join(process.cwd(), "src", "lib", "auth.ts");
81
+ const dirPath = path.dirname(authPath);
82
+ if (!fs.existsSync(dirPath)) {
83
+ fs.mkdirSync(dirPath, { recursive: true });
84
+ }
85
+ fs.writeFileSync(authPath, authContent);
86
+ console.log(chalk.green(`
87
+ \u2714 Created: ${chalk.white("src/lib/auth.ts")}`));
88
+ const tsConfigPath = path.join(process.cwd(), "tsconfig.json");
89
+ if (!fs.existsSync(tsConfigPath)) {
90
+ fs.writeFileSync(tsConfigPath, tsConfigTemplate);
91
+ console.log(chalk.green(`\u2714 Created: ${chalk.white("tsconfig.json")}`));
92
+ }
93
+ if (response.generateEnv) {
94
+ const envPath = path.join(process.cwd(), ".env");
95
+ const envContent = envTemplate(secret, response.usePepper);
96
+ if (fs.existsSync(envPath)) {
97
+ fs.appendFileSync(envPath, envContent);
98
+ console.log(chalk.green(`\u2714 Updated: ${chalk.white(".env")} (Appended JWT_SECRET)`));
99
+ } else {
100
+ fs.writeFileSync(envPath, envContent);
101
+ console.log(chalk.green(`\u2714 Created: ${chalk.white(".env")}`));
102
+ }
103
+ }
104
+ console.log(chalk.bold.white("\nKroxt is ready. Happy coding! \u{1F680}\n"));
105
+ } catch (err) {
106
+ console.error(chalk.red("\n\u2716 Initialization cancelled."));
107
+ process.exit(1);
108
+ }
109
+ });
110
+ program.parse(process.argv);
111
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cli/index.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport Enquirer from 'enquirer';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { authTemplate, envTemplate, tsConfigTemplate } from './templates.js';\n\nconst program = new Command();\nconst enquirer = new Enquirer();\n\nprogram\n .name('kroxt')\n .description('Kroxt CLI for bootstrapping auth engines')\n .version('1.0.0');\n\nprogram\n .command('init')\n .description('Initialize Kroxt in your project')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .action(async (options) => {\n console.log(chalk.bold.white('\\n\u2B22 KROXT AUTH INITIALIZER\\n'));\n\n try {\n let response = {\n adapter: 'memory',\n generateEnv: true,\n useRateLimit: true,\n useIPBlocking: true,\n useStrictRevocation: true,\n usePepper: true\n };\n\n if (!options.yes) {\n response = await enquirer.prompt([\n {\n type: 'select',\n name: 'adapter',\n message: 'Choose your database adapter:',\n choices: [\n { name: 'memory', message: 'In-Memory (Testing)' },\n { name: 'mongoose', message: 'Mongoose (MongoDB)' },\n { name: 'prisma', message: 'Prisma (PostgreSQL/MySQL)' },\n { name: 'drizzle', message: 'Drizzle (SQLite/PostgreSQL)' },\n { name: 'none', message: 'None (Manual Setup)' }\n ]\n },\n {\n type: 'confirm',\n name: 'useRateLimit',\n message: 'Enable rate limiting defensive layer?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'useIPBlocking',\n message: 'Enable automatic IP blocking?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'useStrictRevocation',\n message: 'Enforce strict session revocation?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'usePepper',\n message: 'Use server-side password peppering?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'generateEnv',\n message: 'Generate secure secrets in .env?',\n initial: true\n }\n ]) as any;\n } else {\n console.log(chalk.gray('Using default settings (--yes)...'));\n response = {\n ...response,\n useRateLimit: true,\n useIPBlocking: true,\n useStrictRevocation: true,\n usePepper: true\n } as any;\n }\n\n const secret = crypto.randomBytes(32).toString('hex');\n const authContent = authTemplate(response.adapter, secret, response);\n\n // Write auth.ts\n const authPath = path.join(process.cwd(), 'src', 'lib', 'auth.ts');\n const dirPath = path.dirname(authPath);\n\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n\n fs.writeFileSync(authPath, authContent);\n console.log(chalk.green(`\\n\u2714 Created: ${chalk.white('src/lib/auth.ts')}`));\n\n // Write tsconfig.json if not present\n const tsConfigPath = path.join(process.cwd(), 'tsconfig.json');\n if (!fs.existsSync(tsConfigPath)) {\n fs.writeFileSync(tsConfigPath, tsConfigTemplate);\n console.log(chalk.green(`\u2714 Created: ${chalk.white('tsconfig.json')}`));\n }\n\n // Write .env\n if (response.generateEnv) {\n const envPath = path.join(process.cwd(), '.env');\n const envContent = envTemplate(secret, response.usePepper);\n \n if (fs.existsSync(envPath)) {\n fs.appendFileSync(envPath, envContent);\n console.log(chalk.green(`\u2714 Updated: ${chalk.white('.env')} (Appended JWT_SECRET)`));\n } else {\n fs.writeFileSync(envPath, envContent);\n console.log(chalk.green(`\u2714 Created: ${chalk.white('.env')}`));\n }\n }\n\n console.log(chalk.bold.white('\\nKroxt is ready. Happy coding! \uD83D\uDE80\\n'));\n\n } catch (err) {\n console.error(chalk.red('\\n\u2716 Initialization cancelled.'));\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var templates_exports = {};
30
+ __export(templates_exports, {
31
+ authTemplate: () => authTemplate,
32
+ envTemplate: () => envTemplate,
33
+ tsConfigTemplate: () => tsConfigTemplate
34
+ });
35
+ module.exports = __toCommonJS(templates_exports);
36
+ var import_crypto = __toESM(require("crypto"), 1);
37
+ const authTemplate = (adapter, secret, options) => `import { createAuth } from "kroxt";
38
+ ${getAdapterImportBlock(adapter)}
39
+ import dotenv from "dotenv";
40
+
41
+ dotenv.config();
42
+
43
+ ${getAdapterInitialization(adapter)}
44
+
45
+ export const auth = createAuth({
46
+ adapter: authAdapter,
47
+ secret: process.env.JWT_SECRET || "${secret}",
48
+ ${options.usePepper ? 'pepper: process.env.JWT_PEPPER || "",' : ""}
49
+
50
+ // Global Security Configurations
51
+ session: {
52
+ expires: "15m",
53
+ refreshExpires: "7d",
54
+ enforceStrictRevocation: ${options.useStrictRevocation ? "true" : "false"}
55
+ },
56
+
57
+ // Custom JWT Payload logic
58
+ jwt: {
59
+ payload: (user: any, type: "access" | "refresh") => {
60
+ if (type === "access") {
61
+ return {
62
+ role: user.role,
63
+ // schoolId: user.schoolId
64
+ };
65
+ }
66
+ return {};
67
+ }
68
+ },
69
+
70
+ ${options.useRateLimit ? `rateLimit: {
71
+ max: 100, // Requests per minute
72
+ windowMs: 60 * 1000
73
+ },` : ""}
74
+ ${options.useIPBlocking ? `ipBlocking: {
75
+ maxStrikes: 5,
76
+ blockDurationMs: 15 * 60 * 1000
77
+ },` : ""}
78
+ passwordPolicy: {
79
+ minLength: 6,
80
+ requireUppercase: true,
81
+ requireSpecialCharacter: true
82
+ }
83
+ });
84
+ `;
85
+ function getAdapterImportBlock(adapter) {
86
+ switch (adapter) {
87
+ case "mongoose":
88
+ return `import { createMongoAdapter, createRateLimitModel } from "kroxt/adapters/mongoose";
89
+ import mongoose from "mongoose";`;
90
+ case "prisma":
91
+ return `import { createPrismaAdapter } from "kroxt/adapters/prisma";`;
92
+ case "drizzle":
93
+ return `import { createDrizzleAdapter } from "kroxt/adapters/drizzle";
94
+ import { eq } from "drizzle-orm";`;
95
+ case "memory":
96
+ return `import { createMemoryAdapter } from "kroxt/adapters/memory";`;
97
+ default:
98
+ return "";
99
+ }
100
+ }
101
+ function getAdapterInitialization(adapter) {
102
+ switch (adapter) {
103
+ case "mongoose":
104
+ return `// import { User } from "../models/user.model.js";
105
+ // The rate limit model is optional but recommended
106
+ const authAdapter = createMongoAdapter(User, createRateLimitModel(mongoose));`;
107
+ case "prisma":
108
+ return `// import { prisma } from "./lib/prisma";
109
+ const authAdapter = createPrismaAdapter(prisma.user);`;
110
+ case "drizzle":
111
+ return `// import { db } from "./db";
112
+ // import { users } from "./db/schema";
113
+ // import { eq } from "drizzle-orm";
114
+ const authAdapter = createDrizzleAdapter(db, users, eq);`;
115
+ case "memory":
116
+ return `const authAdapter = createMemoryAdapter();`;
117
+ default:
118
+ return `// const authAdapter = ...;`;
119
+ }
120
+ }
121
+ const envTemplate = (secret, usePepper) => `
122
+ # Kroxt Auth Secrets
123
+ JWT_SECRET="${secret}"
124
+ ${usePepper ? `JWT_PEPPER="${import_crypto.default.randomBytes(16).toString("hex")}"` : ""}
125
+ `;
126
+ const tsConfigTemplate = `{
127
+ "compilerOptions": {
128
+ "target": "ESNext",
129
+ "module": "ESNext",
130
+ "moduleResolution": "bundler",
131
+ "esModuleInterop": true,
132
+ "forceConsistentCasingInFileNames": true,
133
+ "strict": true,
134
+ "skipLibCheck": true,
135
+ "types": ["node"]
136
+ },
137
+ "include": ["src/**/*"],
138
+ "exclude": ["node_modules"]
139
+ }
140
+ `;
141
+ // Annotate the CommonJS export names for ESM import in node:
142
+ 0 && (module.exports = {
143
+ authTemplate,
144
+ envTemplate,
145
+ tsConfigTemplate
146
+ });
147
+ //# sourceMappingURL=templates.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cli/templates.ts"],
4
+ "sourcesContent": ["import crypto from 'crypto';\n\nexport const authTemplate = (adapter: string, secret: string, options: any) => `import { createAuth } from \"kroxt\";\n${getAdapterImportBlock(adapter)}\nimport dotenv from \"dotenv\";\n\ndotenv.config();\n\n${getAdapterInitialization(adapter)}\n\nexport const auth = createAuth({\n adapter: authAdapter,\n secret: process.env.JWT_SECRET || \"${secret}\",\n ${options.usePepper ? 'pepper: process.env.JWT_PEPPER || \"\",' : ''}\n \n // Global Security Configurations\n session: {\n expires: \"15m\",\n refreshExpires: \"7d\",\n enforceStrictRevocation: ${options.useStrictRevocation ? 'true' : 'false'}\n },\n \n // Custom JWT Payload logic\n jwt: {\n payload: (user: any, type: \"access\" | \"refresh\") => {\n if (type === \"access\") {\n return {\n role: user.role,\n // schoolId: user.schoolId \n };\n }\n return {};\n }\n },\n\n ${options.useRateLimit ? `rateLimit: {\n max: 100, // Requests per minute\n windowMs: 60 * 1000\n },` : ''}\n ${options.useIPBlocking ? `ipBlocking: {\n maxStrikes: 5,\n blockDurationMs: 15 * 60 * 1000\n },` : ''}\n passwordPolicy: {\n minLength: 6,\n requireUppercase: true,\n requireSpecialCharacter: true\n }\n});\n`;\n\nfunction getAdapterImportBlock(adapter: string) {\n switch (adapter) {\n case 'mongoose':\n return `import { createMongoAdapter, createRateLimitModel } from \"kroxt/adapters/mongoose\";\\nimport mongoose from \"mongoose\";`;\n case 'prisma':\n return `import { createPrismaAdapter } from \"kroxt/adapters/prisma\";`;\n case 'drizzle':\n return `import { createDrizzleAdapter } from \"kroxt/adapters/drizzle\";\\nimport { eq } from \"drizzle-orm\";`;\n case 'memory':\n return `import { createMemoryAdapter } from \"kroxt/adapters/memory\";`;\n default:\n return '';\n }\n}\n\nfunction getAdapterInitialization(adapter: string) {\n switch (adapter) {\n case 'mongoose':\n return `// import { User } from \"../models/user.model.js\";\\n// The rate limit model is optional but recommended\\nconst authAdapter = createMongoAdapter(User, createRateLimitModel(mongoose));`;\n case 'prisma':\n return `// import { prisma } from \"./lib/prisma\";\\nconst authAdapter = createPrismaAdapter(prisma.user);`;\n case 'drizzle':\n return `// import { db } from \"./db\";\\n// import { users } from \"./db/schema\";\\n// import { eq } from \"drizzle-orm\";\\nconst authAdapter = createDrizzleAdapter(db, users, eq);`;\n case 'memory':\n return `const authAdapter = createMemoryAdapter();`;\n default:\n return `// const authAdapter = ...;`;\n }\n}\n\nexport const envTemplate = (secret: string, usePepper: boolean) => `\n# Kroxt Auth Secrets\nJWT_SECRET=\"${secret}\"\n${usePepper ? `JWT_PEPPER=\"${crypto.randomBytes(16).toString('hex')}\"` : ''}\n`;\n\nexport const tsConfigTemplate = `{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true,\n \"types\": [\"node\"]\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\"]\n}\n`;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AAEZ,MAAM,eAAe,CAAC,SAAiB,QAAgB,YAAiB;AAAA,EAC7E,sBAAsB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,yBAAyB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,uCAII,MAAM;AAAA,IACzC,QAAQ,YAAY,0CAA0C,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAMrC,QAAQ,sBAAsB,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBzE,QAAQ,eAAe;AAAA;AAAA;AAAA,QAGnB,EAAE;AAAA,IACN,QAAQ,gBAAgB;AAAA;AAAA;AAAA,QAGpB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV,SAAS,sBAAsB,SAAiB;AAC9C,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,yBAAyB,SAAiB;AACjD,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,MAAM,cAAc,CAAC,QAAgB,cAAuB;AAAA;AAAA,cAErD,MAAM;AAAA,EAClB,YAAY,eAAe,cAAAA,QAAO,YAAY,EAAE,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE;AAAA;AAGpE,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": ["crypto"]
7
+ }
@@ -0,0 +1,111 @@
1
+ import crypto from "crypto";
2
+ const authTemplate = (adapter, secret, options) => `import { createAuth } from "kroxt";
3
+ ${getAdapterImportBlock(adapter)}
4
+ import dotenv from "dotenv";
5
+
6
+ dotenv.config();
7
+
8
+ ${getAdapterInitialization(adapter)}
9
+
10
+ export const auth = createAuth({
11
+ adapter: authAdapter,
12
+ secret: process.env.JWT_SECRET || "${secret}",
13
+ ${options.usePepper ? 'pepper: process.env.JWT_PEPPER || "",' : ""}
14
+
15
+ // Global Security Configurations
16
+ session: {
17
+ expires: "15m",
18
+ refreshExpires: "7d",
19
+ enforceStrictRevocation: ${options.useStrictRevocation ? "true" : "false"}
20
+ },
21
+
22
+ // Custom JWT Payload logic
23
+ jwt: {
24
+ payload: (user: any, type: "access" | "refresh") => {
25
+ if (type === "access") {
26
+ return {
27
+ role: user.role,
28
+ // schoolId: user.schoolId
29
+ };
30
+ }
31
+ return {};
32
+ }
33
+ },
34
+
35
+ ${options.useRateLimit ? `rateLimit: {
36
+ max: 100, // Requests per minute
37
+ windowMs: 60 * 1000
38
+ },` : ""}
39
+ ${options.useIPBlocking ? `ipBlocking: {
40
+ maxStrikes: 5,
41
+ blockDurationMs: 15 * 60 * 1000
42
+ },` : ""}
43
+ passwordPolicy: {
44
+ minLength: 6,
45
+ requireUppercase: true,
46
+ requireSpecialCharacter: true
47
+ }
48
+ });
49
+ `;
50
+ function getAdapterImportBlock(adapter) {
51
+ switch (adapter) {
52
+ case "mongoose":
53
+ return `import { createMongoAdapter, createRateLimitModel } from "kroxt/adapters/mongoose";
54
+ import mongoose from "mongoose";`;
55
+ case "prisma":
56
+ return `import { createPrismaAdapter } from "kroxt/adapters/prisma";`;
57
+ case "drizzle":
58
+ return `import { createDrizzleAdapter } from "kroxt/adapters/drizzle";
59
+ import { eq } from "drizzle-orm";`;
60
+ case "memory":
61
+ return `import { createMemoryAdapter } from "kroxt/adapters/memory";`;
62
+ default:
63
+ return "";
64
+ }
65
+ }
66
+ function getAdapterInitialization(adapter) {
67
+ switch (adapter) {
68
+ case "mongoose":
69
+ return `// import { User } from "../models/user.model.js";
70
+ // The rate limit model is optional but recommended
71
+ const authAdapter = createMongoAdapter(User, createRateLimitModel(mongoose));`;
72
+ case "prisma":
73
+ return `// import { prisma } from "./lib/prisma";
74
+ const authAdapter = createPrismaAdapter(prisma.user);`;
75
+ case "drizzle":
76
+ return `// import { db } from "./db";
77
+ // import { users } from "./db/schema";
78
+ // import { eq } from "drizzle-orm";
79
+ const authAdapter = createDrizzleAdapter(db, users, eq);`;
80
+ case "memory":
81
+ return `const authAdapter = createMemoryAdapter();`;
82
+ default:
83
+ return `// const authAdapter = ...;`;
84
+ }
85
+ }
86
+ const envTemplate = (secret, usePepper) => `
87
+ # Kroxt Auth Secrets
88
+ JWT_SECRET="${secret}"
89
+ ${usePepper ? `JWT_PEPPER="${crypto.randomBytes(16).toString("hex")}"` : ""}
90
+ `;
91
+ const tsConfigTemplate = `{
92
+ "compilerOptions": {
93
+ "target": "ESNext",
94
+ "module": "ESNext",
95
+ "moduleResolution": "bundler",
96
+ "esModuleInterop": true,
97
+ "forceConsistentCasingInFileNames": true,
98
+ "strict": true,
99
+ "skipLibCheck": true,
100
+ "types": ["node"]
101
+ },
102
+ "include": ["src/**/*"],
103
+ "exclude": ["node_modules"]
104
+ }
105
+ `;
106
+ export {
107
+ authTemplate,
108
+ envTemplate,
109
+ tsConfigTemplate
110
+ };
111
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cli/templates.ts"],
4
+ "sourcesContent": ["import crypto from 'crypto';\n\nexport const authTemplate = (adapter: string, secret: string, options: any) => `import { createAuth } from \"kroxt\";\n${getAdapterImportBlock(adapter)}\nimport dotenv from \"dotenv\";\n\ndotenv.config();\n\n${getAdapterInitialization(adapter)}\n\nexport const auth = createAuth({\n adapter: authAdapter,\n secret: process.env.JWT_SECRET || \"${secret}\",\n ${options.usePepper ? 'pepper: process.env.JWT_PEPPER || \"\",' : ''}\n \n // Global Security Configurations\n session: {\n expires: \"15m\",\n refreshExpires: \"7d\",\n enforceStrictRevocation: ${options.useStrictRevocation ? 'true' : 'false'}\n },\n \n // Custom JWT Payload logic\n jwt: {\n payload: (user: any, type: \"access\" | \"refresh\") => {\n if (type === \"access\") {\n return {\n role: user.role,\n // schoolId: user.schoolId \n };\n }\n return {};\n }\n },\n\n ${options.useRateLimit ? `rateLimit: {\n max: 100, // Requests per minute\n windowMs: 60 * 1000\n },` : ''}\n ${options.useIPBlocking ? `ipBlocking: {\n maxStrikes: 5,\n blockDurationMs: 15 * 60 * 1000\n },` : ''}\n passwordPolicy: {\n minLength: 6,\n requireUppercase: true,\n requireSpecialCharacter: true\n }\n});\n`;\n\nfunction getAdapterImportBlock(adapter: string) {\n switch (adapter) {\n case 'mongoose':\n return `import { createMongoAdapter, createRateLimitModel } from \"kroxt/adapters/mongoose\";\\nimport mongoose from \"mongoose\";`;\n case 'prisma':\n return `import { createPrismaAdapter } from \"kroxt/adapters/prisma\";`;\n case 'drizzle':\n return `import { createDrizzleAdapter } from \"kroxt/adapters/drizzle\";\\nimport { eq } from \"drizzle-orm\";`;\n case 'memory':\n return `import { createMemoryAdapter } from \"kroxt/adapters/memory\";`;\n default:\n return '';\n }\n}\n\nfunction getAdapterInitialization(adapter: string) {\n switch (adapter) {\n case 'mongoose':\n return `// import { User } from \"../models/user.model.js\";\\n// The rate limit model is optional but recommended\\nconst authAdapter = createMongoAdapter(User, createRateLimitModel(mongoose));`;\n case 'prisma':\n return `// import { prisma } from \"./lib/prisma\";\\nconst authAdapter = createPrismaAdapter(prisma.user);`;\n case 'drizzle':\n return `// import { db } from \"./db\";\\n// import { users } from \"./db/schema\";\\n// import { eq } from \"drizzle-orm\";\\nconst authAdapter = createDrizzleAdapter(db, users, eq);`;\n case 'memory':\n return `const authAdapter = createMemoryAdapter();`;\n default:\n return `// const authAdapter = ...;`;\n }\n}\n\nexport const envTemplate = (secret: string, usePepper: boolean) => `\n# Kroxt Auth Secrets\nJWT_SECRET=\"${secret}\"\n${usePepper ? `JWT_PEPPER=\"${crypto.randomBytes(16).toString('hex')}\"` : ''}\n`;\n\nexport const tsConfigTemplate = `{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true,\n \"types\": [\"node\"]\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\"]\n}\n`;\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AAEZ,MAAM,eAAe,CAAC,SAAiB,QAAgB,YAAiB;AAAA,EAC7E,sBAAsB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,yBAAyB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,uCAII,MAAM;AAAA,IACzC,QAAQ,YAAY,0CAA0C,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAMrC,QAAQ,sBAAsB,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBzE,QAAQ,eAAe;AAAA;AAAA;AAAA,QAGnB,EAAE;AAAA,IACN,QAAQ,gBAAgB;AAAA;AAAA;AAAA,QAGpB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV,SAAS,sBAAsB,SAAiB;AAC9C,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,yBAAyB,SAAiB;AACjD,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,MAAM,cAAc,CAAC,QAAgB,cAAuB;AAAA;AAAA,cAErD,MAAM;AAAA,EAClB,YAAY,eAAe,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE;AAAA;AAGpE,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -1,5 +1,6 @@
1
1
  import type { AuthAdapter, User } from "../adapters/index.js";
2
2
  import type { Provider } from "../providers/index.js";
3
+ import { type RateLimitOptions } from "../security/rate-limit.js";
3
4
  export interface CreateAuthOptions {
4
5
  adapter: AuthAdapter<any>;
5
6
  secret: string | Uint8Array;
@@ -7,6 +8,7 @@ export interface CreateAuthOptions {
7
8
  session?: {
8
9
  expires?: string | number;
9
10
  refreshExpires?: string | number;
11
+ enforceStrictRevocation?: boolean;
10
12
  };
11
13
  providers?: Provider[];
12
14
  jwt?: {
@@ -18,6 +20,18 @@ export interface CreateAuthOptions {
18
20
  */
19
21
  payload?: (user: User<any>, type: "access" | "refresh") => Record<string, any>;
20
22
  };
23
+ rateLimit?: RateLimitOptions;
24
+ ipBlocking?: {
25
+ maxStrikes: number;
26
+ blockDurationMs: number;
27
+ };
28
+ passwordPolicy?: {
29
+ minLength?: number;
30
+ requireUppercase?: boolean;
31
+ requireLowercase?: boolean;
32
+ requireNumber?: boolean;
33
+ requireSpecialCharacter?: boolean;
34
+ };
21
35
  }
22
36
  export declare function createAuth(options: CreateAuthOptions): {
23
37
  signup: (userData: Omit<User<any>, "id">, password?: string) => Promise<{
@@ -25,11 +39,12 @@ export declare function createAuth(options: CreateAuthOptions): {
25
39
  accessToken: string;
26
40
  refreshToken: string;
27
41
  }>;
28
- loginWithPassword: (email: string, password: string) => Promise<{
42
+ loginWithPassword: (email: string, password: string, clientIp?: string) => Promise<{
29
43
  user: any;
30
44
  accessToken: string;
31
45
  refreshToken: string;
32
46
  }>;
47
+ changePassword: (userId: string, newPassword: string) => Promise<any>;
33
48
  refresh: (refreshToken: string) => Promise<{
34
49
  accessToken: string;
35
50
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/core/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACpC,CAAC;IACF,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE;QACF;;;;;WAKG;QACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAClF,CAAC;CACL;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB;uBA4DjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,aAAa,MAAM;;;;;+BAmBhC,MAAM,YAAY,MAAM;;;;;4BAtC3B,MAAM;;;yBAbT,MAAM,iBAAgB,QAAQ,GAAG,SAAS;0BAnBzC,IAAI,CAAC,GAAG,CAAC,SAAQ,QAAQ,GAAG,SAAS;;EAmG3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,MAAW,GAAG,UAAU,CAE9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/core/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAErF,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACjC,uBAAuB,CAAC,EAAE,OAAO,CAAC;KACrC,CAAC;IACF,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE;QACF;;;;;WAKG;QACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAClF,CAAC;IACF,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,UAAU,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,cAAc,CAAC,EAAE;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;KACrC,CAAC;CACL;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB;uBAuGjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,aAAa,MAAM;;;;;+BAoBhC,MAAM,YAAY,MAAM,aAAa,MAAM;;;;;6BA0C7C,MAAM,eAAe,MAAM;4BA7G5B,MAAM;;;yBArBT,MAAM,iBAAgB,QAAQ,GAAG,SAAS;0BAxBzC,IAAI,CAAC,GAAG,CAAC,SAAQ,QAAQ,GAAG,SAAS;;EAoL3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,MAAW,GAAG,UAAU,CAE9D"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@ export type { Provider, ProviderConfig } from "./providers/index.js";
4
4
  export { createAuth, generateSecret } from "./core/index.js";
5
5
  export type { CreateAuthOptions } from "./core/index.js";
6
6
  export { createMemoryAdapter } from "./adapters/memory.js";
7
- export { createMongoAdapter } from "./adapters/mongoose.js";
7
+ export { createMongoAdapter, createRateLimitModel } from "./adapters/mongoose.js";
8
+ export { createPrismaAdapter } from "./adapters/prisma.js";
9
+ export { createDrizzleAdapter } from "./adapters/drizzle.js";
8
10
  export * from "./security/index.js";
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,cAAc,qBAAqB,CAAC"}