@deessejs/cli 0.6.3 → 0.6.5
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/bin/deesse.js +0 -0
- package/dist/commands/admin/create.d.ts +14 -0
- package/dist/commands/admin/create.d.ts.map +1 -0
- package/dist/commands/admin/create.js +144 -0
- package/dist/commands/admin/create.js.map +1 -0
- package/dist/commands/admin-create.d.ts +16 -0
- package/dist/commands/admin-create.d.ts.map +1 -0
- package/dist/commands/admin-create.js +264 -0
- package/dist/commands/admin-create.js.map +1 -0
- package/dist/commands/admin.d.ts +29 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +22 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/db-generate.d.ts.map +1 -1
- package/dist/commands/db-generate.js +2 -1
- package/dist/commands/db-generate.js.map +1 -1
- package/dist/commands/db-migrate.d.ts.map +1 -1
- package/dist/commands/db-migrate.js +3 -2
- package/dist/commands/db-migrate.js.map +1 -1
- package/dist/commands/db-push.d.ts.map +1 -1
- package/dist/commands/db-push.js +3 -2
- package/dist/commands/db-push.js.map +1 -1
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/admin/create.d.ts +35 -0
- package/dist/lib/admin/create.d.ts.map +1 -0
- package/dist/lib/admin/create.js +57 -0
- package/dist/lib/admin/create.js.map +1 -0
- package/dist/lib/config/loader.d.ts +57 -0
- package/dist/lib/config/loader.d.ts.map +1 -0
- package/dist/lib/config/loader.js +111 -0
- package/dist/lib/config/loader.js.map +1 -0
- package/dist/lib/db/schema.d.ts +26 -0
- package/dist/lib/db/schema.d.ts.map +1 -0
- package/dist/lib/db/schema.js +71 -0
- package/dist/lib/db/schema.js.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/index.js.map +1 -0
- package/package.json +16 -11
package/bin/deesse.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin create command - CLI interface
|
|
3
|
+
*
|
|
4
|
+
* Handles user interaction and delegates to backend logic.
|
|
5
|
+
*/
|
|
6
|
+
import 'dotenv/config';
|
|
7
|
+
export interface AdminCreateOptions {
|
|
8
|
+
email?: string;
|
|
9
|
+
password?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function adminCreate(options: AdminCreateOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/admin/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,eAAe,CAAC;AAUvB,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAmHD,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC5E"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin create command - CLI interface
|
|
3
|
+
*
|
|
4
|
+
* Handles user interaction and delegates to backend logic.
|
|
5
|
+
*/
|
|
6
|
+
import * as p from '@clack/prompts';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { loadConfig, verifyAdminPlugin, ConfigLoaderError } from '../../lib/config/loader.js';
|
|
9
|
+
import { createAdminUser, AdminCreationError } from '../../lib/admin/create.js';
|
|
10
|
+
// Load environment variables
|
|
11
|
+
import 'dotenv/config';
|
|
12
|
+
const AdminSchema = z.object({
|
|
13
|
+
email: z.string().email('Invalid email format'),
|
|
14
|
+
password: z.string().min(8, 'Password must be at least 8 characters'),
|
|
15
|
+
name: z.string().min(1, 'Name is required').default('Admin'),
|
|
16
|
+
});
|
|
17
|
+
// Public email domains that should warn users
|
|
18
|
+
const PUBLIC_EMAIL_DOMAINS = [
|
|
19
|
+
'gmail.com',
|
|
20
|
+
'yahoo.com',
|
|
21
|
+
'hotmail.com',
|
|
22
|
+
'outlook.com',
|
|
23
|
+
'icloud.com',
|
|
24
|
+
'mail.com',
|
|
25
|
+
'aol.com',
|
|
26
|
+
];
|
|
27
|
+
function isPublicEmailDomain(email) {
|
|
28
|
+
const domain = email.split('@')[1]?.toLowerCase();
|
|
29
|
+
return PUBLIC_EMAIL_DOMAINS.includes(domain);
|
|
30
|
+
}
|
|
31
|
+
function validateEmail(value) {
|
|
32
|
+
if (!value)
|
|
33
|
+
return 'Email is required';
|
|
34
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
35
|
+
if (!emailRegex.test(value))
|
|
36
|
+
return 'Invalid email format';
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
function validatePassword(value) {
|
|
40
|
+
if (value.length < 8)
|
|
41
|
+
return 'Password must be at least 8 characters';
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
async function promptForAdminDetails() {
|
|
45
|
+
p.intro('Creating admin user');
|
|
46
|
+
const emailResult = await p.text({
|
|
47
|
+
message: 'Admin email:',
|
|
48
|
+
validate: validateEmail,
|
|
49
|
+
});
|
|
50
|
+
if (p.isCancel(emailResult)) {
|
|
51
|
+
p.cancel('Operation cancelled.');
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
if (isPublicEmailDomain(emailResult)) {
|
|
55
|
+
p.log.warn(`Warning: ${emailResult} is a public email domain.\n` +
|
|
56
|
+
' Admin accounts should use organizational email addresses.');
|
|
57
|
+
}
|
|
58
|
+
const passwordResult = await p.password({
|
|
59
|
+
message: 'Admin password:',
|
|
60
|
+
mask: true,
|
|
61
|
+
validate: validatePassword,
|
|
62
|
+
});
|
|
63
|
+
if (p.isCancel(passwordResult)) {
|
|
64
|
+
p.cancel('Operation cancelled.');
|
|
65
|
+
process.exit(0);
|
|
66
|
+
}
|
|
67
|
+
const nameResult = await p.text({
|
|
68
|
+
message: 'Admin display name:',
|
|
69
|
+
defaultValue: 'Admin',
|
|
70
|
+
});
|
|
71
|
+
if (p.isCancel(nameResult)) {
|
|
72
|
+
p.cancel('Operation cancelled.');
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
email: emailResult,
|
|
77
|
+
password: passwordResult,
|
|
78
|
+
name: nameResult || 'Admin',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function validateInput(options) {
|
|
82
|
+
const result = AdminSchema.safeParse(options);
|
|
83
|
+
if (!result.success) {
|
|
84
|
+
const error = result.error.errors[0];
|
|
85
|
+
throw new Error(`${error.path.join('.')}: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
return result.data;
|
|
88
|
+
}
|
|
89
|
+
function handleError(error) {
|
|
90
|
+
if (error instanceof AdminCreationError) {
|
|
91
|
+
p.log.error(error.message);
|
|
92
|
+
if (error.suggestion) {
|
|
93
|
+
p.log.info(error.suggestion);
|
|
94
|
+
}
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
if (error instanceof ConfigLoaderError) {
|
|
98
|
+
p.log.error(error.message);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
// Fallback for unknown errors
|
|
102
|
+
p.log.error('Unexpected error: ' + (error instanceof Error ? error.message : String(error)));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
function printSuccess(result) {
|
|
106
|
+
p.log.success('Admin user created successfully!');
|
|
107
|
+
p.log.info(`Email: ${result.user.email}`);
|
|
108
|
+
p.log.info(`Name: ${result.user.name}`);
|
|
109
|
+
p.log.info(`ID: ${result.user.id.slice(0, 8)}...`);
|
|
110
|
+
}
|
|
111
|
+
export async function adminCreate(options) {
|
|
112
|
+
try {
|
|
113
|
+
const cwd = options.cwd || process.cwd();
|
|
114
|
+
// Load and process config
|
|
115
|
+
p.log.info('Loading config...');
|
|
116
|
+
const { processedConfig } = await loadConfig(cwd);
|
|
117
|
+
verifyAdminPlugin(processedConfig);
|
|
118
|
+
// Get admin input
|
|
119
|
+
let adminInput;
|
|
120
|
+
if (options.email && options.password) {
|
|
121
|
+
p.log.info('Creating admin user with provided credentials...');
|
|
122
|
+
adminInput = validateInput({
|
|
123
|
+
email: options.email,
|
|
124
|
+
password: options.password,
|
|
125
|
+
name: options.name || 'Admin',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
adminInput = await promptForAdminDetails();
|
|
130
|
+
}
|
|
131
|
+
// Warn about public email
|
|
132
|
+
if (isPublicEmailDomain(adminInput.email)) {
|
|
133
|
+
p.log.warn(`Warning: ${adminInput.email} is a public email domain.\n` +
|
|
134
|
+
' Admin accounts should use organizational email addresses.');
|
|
135
|
+
}
|
|
136
|
+
// Create admin user via backend logic
|
|
137
|
+
const result = await createAdminUser(processedConfig, adminInput);
|
|
138
|
+
printSuccess(result);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
handleError(error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/admin/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin user creation command
|
|
3
|
+
*
|
|
4
|
+
* Implements the `deesse admin create` command for creating admin users
|
|
5
|
+
* via better-auth's admin plugin.
|
|
6
|
+
*/
|
|
7
|
+
import 'dotenv/config';
|
|
8
|
+
interface AdminOptions {
|
|
9
|
+
email?: string;
|
|
10
|
+
password?: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
cwd?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function adminCreate(options: AdminOptions): Promise<void>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=admin-create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-create.d.ts","sourceRoot":"","sources":["../../src/commands/admin-create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,eAAe,CAAC;AAUvB,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAsQD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCtE"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin user creation command
|
|
3
|
+
*
|
|
4
|
+
* Implements the `deesse admin create` command for creating admin users
|
|
5
|
+
* via better-auth's admin plugin.
|
|
6
|
+
*/
|
|
7
|
+
import * as p from '@clack/prompts';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { pathToFileURL } from 'node:url';
|
|
11
|
+
import { createRequire } from 'module';
|
|
12
|
+
// Load environment variables
|
|
13
|
+
import 'dotenv/config';
|
|
14
|
+
const AdminSchema = z.object({
|
|
15
|
+
email: z.string().email('Invalid email format'),
|
|
16
|
+
password: z.string().min(8, 'Password must be at least 8 characters'),
|
|
17
|
+
name: z.string().min(1, 'Name is required').default('Admin'),
|
|
18
|
+
});
|
|
19
|
+
// Public email domains that should warn users
|
|
20
|
+
const PUBLIC_EMAIL_DOMAINS = [
|
|
21
|
+
'gmail.com',
|
|
22
|
+
'yahoo.com',
|
|
23
|
+
'hotmail.com',
|
|
24
|
+
'outlook.com',
|
|
25
|
+
'icloud.com',
|
|
26
|
+
'mail.com',
|
|
27
|
+
'aol.com',
|
|
28
|
+
];
|
|
29
|
+
function isPublicEmailDomain(email) {
|
|
30
|
+
const domain = email.split('@')[1]?.toLowerCase();
|
|
31
|
+
return PUBLIC_EMAIL_DOMAINS.includes(domain);
|
|
32
|
+
}
|
|
33
|
+
function warnPublicEmail(email) {
|
|
34
|
+
p.log.warn(`Warning: ${email} is a public email domain.\n` +
|
|
35
|
+
' Admin accounts should use organizational email addresses.');
|
|
36
|
+
}
|
|
37
|
+
const ERROR_MAP = {
|
|
38
|
+
USER_ALREADY_EXISTS: {
|
|
39
|
+
message: 'A user with this email already exists',
|
|
40
|
+
suggestion: 'Use a different email or check if an admin already exists',
|
|
41
|
+
},
|
|
42
|
+
DATABASE_ERROR: {
|
|
43
|
+
message: 'Cannot connect to database',
|
|
44
|
+
suggestion: 'Check DATABASE_URL in your .env file and ensure PostgreSQL is running',
|
|
45
|
+
},
|
|
46
|
+
INVALID_PASSWORD: {
|
|
47
|
+
message: 'Password must be at least 8 characters',
|
|
48
|
+
suggestion: 'Choose a longer password',
|
|
49
|
+
},
|
|
50
|
+
CONNECTION_REFUSED: {
|
|
51
|
+
message: 'Database connection refused',
|
|
52
|
+
suggestion: 'Ensure PostgreSQL is running and DATABASE_URL is correct',
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
function handleError(error) {
|
|
56
|
+
const err = error;
|
|
57
|
+
const code = err.code || '';
|
|
58
|
+
const mapped = ERROR_MAP[code];
|
|
59
|
+
if (mapped) {
|
|
60
|
+
p.log.error(mapped.message);
|
|
61
|
+
p.log.info(mapped.suggestion);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
// Fallback for unknown errors
|
|
65
|
+
p.log.error('Unexpected error: ' + (error instanceof Error ? error.message : String(error)));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
function validateEmail(value) {
|
|
69
|
+
if (!value)
|
|
70
|
+
return 'Email is required';
|
|
71
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
72
|
+
if (!emailRegex.test(value))
|
|
73
|
+
return 'Invalid email format';
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
function validatePassword(value) {
|
|
77
|
+
if (value.length < 8)
|
|
78
|
+
return 'Password must be at least 8 characters';
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
async function promptForAdminDetails() {
|
|
82
|
+
p.intro('Creating admin user');
|
|
83
|
+
const emailResult = await p.text({
|
|
84
|
+
message: 'Admin email:',
|
|
85
|
+
validate: validateEmail,
|
|
86
|
+
});
|
|
87
|
+
if (p.isCancel(emailResult)) {
|
|
88
|
+
p.cancel('Operation cancelled.');
|
|
89
|
+
process.exit(0);
|
|
90
|
+
}
|
|
91
|
+
if (isPublicEmailDomain(emailResult)) {
|
|
92
|
+
p.log.warn(`Warning: ${emailResult} is a public email domain.\n` +
|
|
93
|
+
' Admin accounts should use organizational email addresses.');
|
|
94
|
+
}
|
|
95
|
+
const passwordResult = await p.password({
|
|
96
|
+
message: 'Admin password:',
|
|
97
|
+
mask: true,
|
|
98
|
+
validate: validatePassword,
|
|
99
|
+
});
|
|
100
|
+
if (p.isCancel(passwordResult)) {
|
|
101
|
+
p.cancel('Operation cancelled.');
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
const nameResult = await p.text({
|
|
105
|
+
message: 'Admin display name:',
|
|
106
|
+
defaultValue: 'Admin',
|
|
107
|
+
});
|
|
108
|
+
if (p.isCancel(nameResult)) {
|
|
109
|
+
p.cancel('Operation cancelled.');
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
email: emailResult,
|
|
114
|
+
password: passwordResult,
|
|
115
|
+
name: nameResult || 'Admin',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function validateInput(options) {
|
|
119
|
+
const result = AdminSchema.safeParse(options);
|
|
120
|
+
if (!result.success) {
|
|
121
|
+
const error = result.error.errors[0];
|
|
122
|
+
throw new Error(`${error.path.join('.')}: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
return result.data;
|
|
125
|
+
}
|
|
126
|
+
async function loadConfig(cwd) {
|
|
127
|
+
const CONFIG_PATHS = ['src/deesse.config.ts', 'deesse.config.ts', 'config/deesse.ts'];
|
|
128
|
+
let configModule = null;
|
|
129
|
+
let configPath = '';
|
|
130
|
+
for (const configFile of CONFIG_PATHS) {
|
|
131
|
+
configPath = path.resolve(cwd, configFile);
|
|
132
|
+
try {
|
|
133
|
+
// Windows ESM compatibility: use file:// URL
|
|
134
|
+
const url = pathToFileURL(configPath).toString();
|
|
135
|
+
configModule = await import(url);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const err = error;
|
|
140
|
+
if (err.code !== 'ENOENT') {
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (!configModule) {
|
|
146
|
+
throw new Error(`Config file not found. Searched paths:\n` +
|
|
147
|
+
CONFIG_PATHS.map((p) => ` - ${p}`).join('\n') +
|
|
148
|
+
`\nRun 'deesse init' to create a new project.`);
|
|
149
|
+
}
|
|
150
|
+
const rawConfig = configModule.default ||
|
|
151
|
+
configModule.config;
|
|
152
|
+
if (!rawConfig) {
|
|
153
|
+
throw new Error(`No config found in ${configPath}`);
|
|
154
|
+
}
|
|
155
|
+
return rawConfig;
|
|
156
|
+
}
|
|
157
|
+
async function createAdminUser(options) {
|
|
158
|
+
const { email, password, name, cwd = process.cwd() } = options;
|
|
159
|
+
// Load the deesse config
|
|
160
|
+
const rawConfig = await loadConfig(cwd);
|
|
161
|
+
// Dynamically import defineConfig to process the config
|
|
162
|
+
const require = createRequire(import.meta.url);
|
|
163
|
+
let defineConfig = null;
|
|
164
|
+
try {
|
|
165
|
+
// Use require for CJS module
|
|
166
|
+
const deesse = require('deesse');
|
|
167
|
+
defineConfig = deesse.defineConfig;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// defineConfig not available, we'll do basic checks
|
|
171
|
+
}
|
|
172
|
+
let config = null;
|
|
173
|
+
if (defineConfig) {
|
|
174
|
+
config = defineConfig(rawConfig);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// If we can't load defineConfig, assume rawConfig is already processed or use it directly
|
|
178
|
+
config = rawConfig;
|
|
179
|
+
}
|
|
180
|
+
// Check if admin plugin is configured
|
|
181
|
+
const hasAdminPlugin = config?.auth?.plugins?.some((p) => {
|
|
182
|
+
const pluginStr = String(p);
|
|
183
|
+
return pluginStr.includes('admin') || pluginStr.includes('Admin');
|
|
184
|
+
}) ?? false;
|
|
185
|
+
if (!hasAdminPlugin) {
|
|
186
|
+
throw new Error('Admin plugin not configured. Add admin() to your auth.plugins in deesse.config.ts:\n\n' +
|
|
187
|
+
' import { admin } from "better-auth/plugins";\n\n' +
|
|
188
|
+
' export const config = defineConfig({\n' +
|
|
189
|
+
' auth: {\n' +
|
|
190
|
+
' plugins: [admin()],\n' +
|
|
191
|
+
' },\n' +
|
|
192
|
+
' });');
|
|
193
|
+
}
|
|
194
|
+
// Get better-auth instance - using require for better module resolution
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
196
|
+
const betterAuth = require('better-auth');
|
|
197
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
198
|
+
const betterAuthDrizzleAdapter = require('@better-auth/drizzle-adapter');
|
|
199
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
200
|
+
const drizzleOrm = require('drizzle-orm');
|
|
201
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
202
|
+
const pg = require('pg');
|
|
203
|
+
const Pool = pg.Pool;
|
|
204
|
+
// Create database client
|
|
205
|
+
const databaseUrl = process.env['DATABASE_URL'];
|
|
206
|
+
if (!databaseUrl) {
|
|
207
|
+
throw new Error('DATABASE_URL not found in environment. Check your .env file.');
|
|
208
|
+
}
|
|
209
|
+
// Create better-auth instance with admin plugin
|
|
210
|
+
const pool = new Pool({ connectionString: databaseUrl });
|
|
211
|
+
const auth = betterAuth.betterAuth({
|
|
212
|
+
database: betterAuthDrizzleAdapter.drizzleAdapter(drizzleOrm.drizzle(pool)),
|
|
213
|
+
plugins: [betterAuth.admin()],
|
|
214
|
+
});
|
|
215
|
+
// Create admin user via better-auth API
|
|
216
|
+
const result = await auth.api.createUser({
|
|
217
|
+
body: {
|
|
218
|
+
email,
|
|
219
|
+
password,
|
|
220
|
+
name,
|
|
221
|
+
role: 'admin',
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
await pool.end();
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
function printSuccess(result) {
|
|
228
|
+
p.log.success('Admin user created successfully!');
|
|
229
|
+
p.log.info(`Email: ${result.user.email}`);
|
|
230
|
+
p.log.info(`Name: ${result.user.name}`);
|
|
231
|
+
p.log.info(`ID: ${result.user.id.slice(0, 8)}...`);
|
|
232
|
+
}
|
|
233
|
+
export async function adminCreate(options) {
|
|
234
|
+
try {
|
|
235
|
+
// Normalize options
|
|
236
|
+
const opts = {
|
|
237
|
+
name: options.name || 'Admin',
|
|
238
|
+
cwd: options.cwd || process.cwd(),
|
|
239
|
+
};
|
|
240
|
+
// If email and password provided via CLI args, use them directly
|
|
241
|
+
// Otherwise prompt interactively
|
|
242
|
+
let adminInput;
|
|
243
|
+
if (options.email && options.password) {
|
|
244
|
+
opts['email'] = options.email;
|
|
245
|
+
opts['password'] = options.password;
|
|
246
|
+
p.log.info('Creating admin user with provided credentials...');
|
|
247
|
+
adminInput = validateInput(opts);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
adminInput = await promptForAdminDetails();
|
|
251
|
+
}
|
|
252
|
+
// Validate email domain
|
|
253
|
+
if (isPublicEmailDomain(adminInput.email)) {
|
|
254
|
+
warnPublicEmail(adminInput.email);
|
|
255
|
+
}
|
|
256
|
+
// Create the admin user
|
|
257
|
+
const result = await createAdminUser({ ...adminInput, cwd: opts['cwd'] });
|
|
258
|
+
printSuccess(result);
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
handleError(error);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=admin-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-create.js","sourceRoot":"","sources":["../../src/commands/admin-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin command for managing admin users
|
|
3
|
+
*
|
|
4
|
+
* Usage: deesse admin create [options]
|
|
5
|
+
*/
|
|
6
|
+
export interface AdminCreateOptions {
|
|
7
|
+
email?: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const adminCommand: {
|
|
13
|
+
name: "admin";
|
|
14
|
+
description: string;
|
|
15
|
+
subcommands: {
|
|
16
|
+
name: "create";
|
|
17
|
+
description: string;
|
|
18
|
+
options: ({
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
default?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
default: string;
|
|
26
|
+
})[];
|
|
27
|
+
}[];
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;CAexB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin command for managing admin users
|
|
3
|
+
*
|
|
4
|
+
* Usage: deesse admin create [options]
|
|
5
|
+
*/
|
|
6
|
+
export const adminCommand = {
|
|
7
|
+
name: 'admin',
|
|
8
|
+
description: 'Manage admin users',
|
|
9
|
+
subcommands: [
|
|
10
|
+
{
|
|
11
|
+
name: 'create',
|
|
12
|
+
description: 'Create an admin user',
|
|
13
|
+
options: [
|
|
14
|
+
{ name: '--email <email>', description: 'Admin email address' },
|
|
15
|
+
{ name: '--password <password>', description: 'Admin password (min 8 characters)' },
|
|
16
|
+
{ name: '--name <name>', description: 'Admin display name', default: 'Admin' },
|
|
17
|
+
{ name: '--cwd <path>', description: 'Working directory', default: process.cwd() },
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,OAAgB;IACtB,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE;QACX;YACE,IAAI,EAAE,QAAiB;YACvB,WAAW,EAAE,sBAAsB;YACnC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE;gBAC/D,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,mCAAmC,EAAE;gBACnF,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE;gBAC9E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;aACnF;SACF;KACF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-generate.d.ts","sourceRoot":"","sources":["../../src/commands/db-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"db-generate.d.ts","sourceRoot":"","sources":["../../src/commands/db-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C/E"}
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
* - drizzle.config.ts: Standard drizzle-kit config with schema and out settings
|
|
9
9
|
*/
|
|
10
10
|
import { execSync } from 'node:child_process';
|
|
11
|
-
import { verifySchemaPath,
|
|
11
|
+
import { verifySchemaPath, DEFAULT_SCHEMA_PATH } from '../lib/db/schema.js';
|
|
12
12
|
import * as fs from 'node:fs/promises';
|
|
13
13
|
import * as path from 'node:path';
|
|
14
|
+
const SCHEMA_PATH = DEFAULT_SCHEMA_PATH;
|
|
14
15
|
const DRIZZLE_CONFIG_PATH = './drizzle.config.ts';
|
|
15
16
|
export async function dbGenerate(options = {}) {
|
|
16
17
|
const cwd = options.cwd ?? process.cwd();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-generate.js","sourceRoot":"","sources":["../../src/commands/db-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"db-generate.js","sourceRoot":"","sources":["../../src/commands/db-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAMlD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA6B,EAAE;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzC,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,cAAc;YACjD,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,wBAAwB,mBAAmB,cAAc;YACzD,kEAAkE;YAClE,YAAY;YACZ,+CAA+C;YAC/C,iCAAiC;YACjC,mCAAmC;YACnC,iCAAiC;YACjC,4BAA4B;YAC5B,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,QAAQ,CAAC,0BAA0B,EAAE;YACnC,GAAG;YACH,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-migrate.d.ts","sourceRoot":"","sources":["../../src/commands/db-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"db-migrate.d.ts","sourceRoot":"","sources":["../../src/commands/db-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE7E"}
|
|
@@ -9,16 +9,17 @@
|
|
|
9
9
|
* - .env: Should contain DATABASE_URL
|
|
10
10
|
*/
|
|
11
11
|
import { spawn } from 'node:child_process';
|
|
12
|
-
import { verifySchemaPath,
|
|
12
|
+
import { verifySchemaPath, DEFAULT_SCHEMA_PATH } from '../lib/db/schema.js';
|
|
13
13
|
import * as fs from 'node:fs/promises';
|
|
14
14
|
import * as path from 'node:path';
|
|
15
15
|
import * as dotenv from 'dotenv';
|
|
16
16
|
const DRIZZLE_CONFIG_PATH = './drizzle.config.ts';
|
|
17
|
+
const SCHEMA_PATH = DEFAULT_SCHEMA_PATH;
|
|
17
18
|
export async function dbMigrate(options = {}) {
|
|
18
19
|
const { cwd = process.cwd(), dryRun = false } = options;
|
|
19
20
|
// Verify schema file exists
|
|
20
21
|
try {
|
|
21
|
-
await verifySchemaPath();
|
|
22
|
+
await verifySchemaPath(cwd);
|
|
22
23
|
}
|
|
23
24
|
catch {
|
|
24
25
|
throw new Error(`db:migrate requires ${SCHEMA_PATH} to exist.\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-migrate.js","sourceRoot":"","sources":["../../src/commands/db-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"db-migrate.js","sourceRoot":"","sources":["../../src/commands/db-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAClD,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAOxC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA4B,EAAE;IAC5D,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAExD,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uBAAuB,WAAW,cAAc;YAChD,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uBAAuB,mBAAmB,cAAc;YACxD,kEAAkE;YAClE,YAAY;YACZ,+CAA+C;YAC/C,iCAAiC;YACjC,mCAAmC;YACnC,iCAAiC;YACjC,4BAA4B;YAC5B,sBAAsB;YACtB,uCAAuC;YACvC,QAAQ;YACR,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAExD,iBAAiB;IACjB,MAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,gBAAgB;IAChB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAEjF,iDAAiD;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE;YACvB,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACxF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-push.d.ts","sourceRoot":"","sources":["../../src/commands/db-push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"db-push.d.ts","sourceRoot":"","sources":["../../src/commands/db-push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDvE"}
|
package/dist/commands/db-push.js
CHANGED
|
@@ -9,16 +9,17 @@
|
|
|
9
9
|
* - .env: Should contain DATABASE_URL (loaded automatically)
|
|
10
10
|
*/
|
|
11
11
|
import { execSync } from 'node:child_process';
|
|
12
|
-
import { verifySchemaPath,
|
|
12
|
+
import { verifySchemaPath, DEFAULT_SCHEMA_PATH } from '../lib/db/schema.js';
|
|
13
13
|
import * as fs from 'node:fs/promises';
|
|
14
14
|
import * as path from 'node:path';
|
|
15
15
|
import * as dotenv from 'dotenv';
|
|
16
16
|
const DRIZZLE_CONFIG_PATH = './drizzle.config.ts';
|
|
17
|
+
const SCHEMA_PATH = DEFAULT_SCHEMA_PATH;
|
|
17
18
|
export async function dbPush(options = {}) {
|
|
18
19
|
const { force = false, cwd = process.cwd() } = options;
|
|
19
20
|
// Verify schema file exists
|
|
20
21
|
try {
|
|
21
|
-
await verifySchemaPath();
|
|
22
|
+
await verifySchemaPath(cwd);
|
|
22
23
|
}
|
|
23
24
|
catch {
|
|
24
25
|
throw new Error(`db:push requires ${SCHEMA_PATH} to exist.\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-push.js","sourceRoot":"","sources":["../../src/commands/db-push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"db-push.js","sourceRoot":"","sources":["../../src/commands/db-push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAClD,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAOxC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAyB,EAAE;IACtD,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAEvD,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,oBAAoB,WAAW,cAAc;YAC7C,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,oBAAoB,mBAAmB,cAAc;YACrD,kEAAkE;YAClE,YAAY;YACZ,+CAA+C;YAC/C,iCAAiC;YACjC,mCAAmC;YACnC,4BAA4B;YAC5B,sBAAsB;YACtB,sCAAsC;YACtC,QAAQ;YACR,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAE/D,8BAA8B;IAC9B,MAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,MAAM,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACvB,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as p from '@clack/prompts';
|
|
|
3
3
|
import { readFileSync } from 'node:fs';
|
|
4
4
|
import { execSync } from 'node:child_process';
|
|
5
5
|
import { runDbCommand, showDbHelp } from './commands/db.js';
|
|
6
|
+
import { adminCreate } from './commands/admin/create.js';
|
|
6
7
|
const getVersion = () => {
|
|
7
8
|
try {
|
|
8
9
|
const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
|
|
@@ -22,12 +23,14 @@ Commands:
|
|
|
22
23
|
help Show this help message
|
|
23
24
|
init Initialize a new DeesseJS project in current directory
|
|
24
25
|
db Database management commands (db:generate, db:push, etc.)
|
|
26
|
+
admin Admin user management (admin create)
|
|
25
27
|
|
|
26
28
|
Examples:
|
|
27
29
|
npx deesse help
|
|
28
30
|
npx deesse init
|
|
29
31
|
npx deesse db:generate
|
|
30
32
|
npx deesse db:push --force
|
|
33
|
+
npx deesse admin create
|
|
31
34
|
|
|
32
35
|
For more information, visit: https://github.com/nesalia-inc/deessejs
|
|
33
36
|
`);
|
|
@@ -55,6 +58,24 @@ const runInit = async () => {
|
|
|
55
58
|
process.exit(1);
|
|
56
59
|
}
|
|
57
60
|
};
|
|
61
|
+
function parseAdminCreateArgs(args) {
|
|
62
|
+
const opts = {};
|
|
63
|
+
for (let i = 0; i < args.length; i++) {
|
|
64
|
+
if (args[i] === '--email' && i + 1 < args.length) {
|
|
65
|
+
opts.email = args[++i];
|
|
66
|
+
}
|
|
67
|
+
else if (args[i] === '--password' && i + 1 < args.length) {
|
|
68
|
+
opts.password = args[++i];
|
|
69
|
+
}
|
|
70
|
+
else if (args[i] === '--name' && i + 1 < args.length) {
|
|
71
|
+
opts.name = args[++i];
|
|
72
|
+
}
|
|
73
|
+
else if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
74
|
+
opts.cwd = args[++i];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return opts;
|
|
78
|
+
}
|
|
58
79
|
async function main() {
|
|
59
80
|
const args = process.argv.slice(2);
|
|
60
81
|
const command = args[0] || 'help';
|
|
@@ -82,6 +103,47 @@ async function main() {
|
|
|
82
103
|
}
|
|
83
104
|
return;
|
|
84
105
|
}
|
|
106
|
+
// Handle admin commands
|
|
107
|
+
if (command === 'admin') {
|
|
108
|
+
const subcommand = args[1];
|
|
109
|
+
const subArgs = args.slice(2);
|
|
110
|
+
if (!subcommand || subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
|
|
111
|
+
console.warn(`
|
|
112
|
+
DeesseJS Admin Commands
|
|
113
|
+
|
|
114
|
+
Usage: npx deesse admin <command>
|
|
115
|
+
|
|
116
|
+
Commands:
|
|
117
|
+
admin create Create an admin user
|
|
118
|
+
|
|
119
|
+
Options:
|
|
120
|
+
--email <email> Admin email address
|
|
121
|
+
--password <password> Admin password (min 8 characters)
|
|
122
|
+
--name <name> Admin display name (default: Admin)
|
|
123
|
+
--cwd <path> Working directory
|
|
124
|
+
|
|
125
|
+
Examples:
|
|
126
|
+
npx deesse admin create
|
|
127
|
+
npx deesse admin create --email admin@example.com --password Secur3P@ss!
|
|
128
|
+
`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (subcommand === 'create') {
|
|
132
|
+
const opts = parseAdminCreateArgs(subArgs);
|
|
133
|
+
try {
|
|
134
|
+
await adminCreate(opts);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error(`Error: ${error.message}`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
console.error(`Unknown admin command: ${subcommand}`);
|
|
143
|
+
console.error('Run "npx deesse admin help" for usage information.');
|
|
144
|
+
process.exit(1);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
85
147
|
switch (command) {
|
|
86
148
|
case 'help':
|
|
87
149
|
case '--help':
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend logic for creating admin users
|
|
3
|
+
*
|
|
4
|
+
* This module contains the pure business logic for creating an admin user
|
|
5
|
+
* via better-auth. It has no CLI dependencies (@clack/prompts, etc.).
|
|
6
|
+
*/
|
|
7
|
+
interface InternalConfig {
|
|
8
|
+
name?: string;
|
|
9
|
+
database?: unknown;
|
|
10
|
+
secret?: string;
|
|
11
|
+
auth?: {
|
|
12
|
+
baseURL?: string;
|
|
13
|
+
plugins?: unknown[];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface CreateAdminOptions {
|
|
17
|
+
email: string;
|
|
18
|
+
password: string;
|
|
19
|
+
name: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateAdminResult {
|
|
22
|
+
user: {
|
|
23
|
+
id: string;
|
|
24
|
+
email: string;
|
|
25
|
+
name: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare class AdminCreationError extends Error {
|
|
29
|
+
readonly code?: string | undefined;
|
|
30
|
+
readonly suggestion?: string | undefined;
|
|
31
|
+
constructor(message: string, code?: string | undefined, suggestion?: string | undefined);
|
|
32
|
+
}
|
|
33
|
+
export declare function createAdminUser(config: InternalConfig, options: CreateAdminOptions): Promise<CreateAdminResult>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,IAAI,CAAC,EAAE,MAAM;aACb,UAAU,CAAC,EAAE,MAAM;gBAFnC,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAiD5B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend logic for creating admin users
|
|
3
|
+
*
|
|
4
|
+
* This module contains the pure business logic for creating an admin user
|
|
5
|
+
* via better-auth. It has no CLI dependencies (@clack/prompts, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export class AdminCreationError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
suggestion;
|
|
10
|
+
constructor(message, code, suggestion) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.suggestion = suggestion;
|
|
14
|
+
this.name = 'AdminCreationError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function createAdminUser(config, options) {
|
|
18
|
+
const { email, password, name } = options;
|
|
19
|
+
// Validate environment
|
|
20
|
+
const databaseUrl = process.env['DATABASE_URL'];
|
|
21
|
+
if (!databaseUrl) {
|
|
22
|
+
throw new AdminCreationError('DATABASE_URL not found in environment. Check your .env file.', 'DATABASE_ERROR', 'Ensure DATABASE_URL is set in your .env file');
|
|
23
|
+
}
|
|
24
|
+
// Require better-auth packages
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
const betterAuth = require('better-auth');
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
const betterAuthDrizzleAdapter = require('@better-auth/drizzle-adapter');
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
const pg = require('pg');
|
|
31
|
+
const Pool = pg.Pool;
|
|
32
|
+
// Create database client
|
|
33
|
+
const pool = new Pool({ connectionString: databaseUrl });
|
|
34
|
+
try {
|
|
35
|
+
// Create better-auth instance with the config's database and auth settings
|
|
36
|
+
const auth = betterAuth.betterAuth({
|
|
37
|
+
database: betterAuthDrizzleAdapter.drizzleAdapter(config.database),
|
|
38
|
+
baseURL: config.auth?.baseURL,
|
|
39
|
+
secret: config.secret,
|
|
40
|
+
plugins: config.auth?.plugins || [],
|
|
41
|
+
});
|
|
42
|
+
// Create admin user via better-auth API
|
|
43
|
+
const result = await auth.api.createUser({
|
|
44
|
+
body: {
|
|
45
|
+
email,
|
|
46
|
+
password,
|
|
47
|
+
name,
|
|
48
|
+
role: 'admin',
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
await pool.end();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/lib/admin/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2BH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IACA;IAHlB,YACE,OAAe,EACC,IAAa,EACb,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAS;QACb,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAsB,EACtB,OAA2B;IAE3B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAE1C,uBAAuB;IACvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,kBAAkB,CAC1B,8DAA8D,EAC9D,gBAAgB,EAChB,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,8DAA8D;IAC9D,MAAM,UAAU,GAAQ,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,8DAA8D;IAC9D,MAAM,wBAAwB,GAAQ,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC9E,8DAA8D;IAC9D,MAAM,EAAE,GAAQ,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;IAErB,yBAAyB;IACzB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,2EAA2E;QAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,wBAAwB,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YAClE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE;SACpC,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YACvC,IAAI,EAAE;gBACJ,KAAK;gBACL,QAAQ;gBACR,IAAI;gBACJ,IAAI,EAAE,OAAO;aACd;SACF,CAAC,CAAC;QAEH,OAAO,MAA2B,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for Deesse projects
|
|
3
|
+
*
|
|
4
|
+
* Handles loading and processing of deesse.config.ts files.
|
|
5
|
+
* This is backend logic - it has no CLI dependencies.
|
|
6
|
+
*/
|
|
7
|
+
interface Config {
|
|
8
|
+
name?: string;
|
|
9
|
+
database?: unknown;
|
|
10
|
+
plugins?: unknown[];
|
|
11
|
+
pages?: unknown[];
|
|
12
|
+
secret?: string;
|
|
13
|
+
auth?: {
|
|
14
|
+
baseURL?: string;
|
|
15
|
+
plugins?: unknown[];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
interface InternalConfig extends Config {
|
|
19
|
+
auth?: {
|
|
20
|
+
baseURL: string;
|
|
21
|
+
plugins: unknown[];
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export declare class ConfigLoaderError extends Error {
|
|
25
|
+
readonly code?: string | undefined;
|
|
26
|
+
constructor(message: string, code?: string | undefined);
|
|
27
|
+
}
|
|
28
|
+
export interface LoadConfigResult {
|
|
29
|
+
rawConfig: Config;
|
|
30
|
+
processedConfig: InternalConfig;
|
|
31
|
+
configPath: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load the raw config from a deesse.config.ts file
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadRawConfig(cwd: string): Promise<{
|
|
37
|
+
config: Config;
|
|
38
|
+
configPath: string;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Process raw config via defineConfig to get InternalConfig
|
|
42
|
+
*/
|
|
43
|
+
export declare function processConfig(rawConfig: Config): InternalConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Load and process a deesse config
|
|
46
|
+
*/
|
|
47
|
+
export declare function loadConfig(cwd: string): Promise<LoadConfigResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Check if the admin plugin is configured in the config
|
|
50
|
+
*/
|
|
51
|
+
export declare function hasAdminPlugin(config: InternalConfig): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Verify admin plugin is configured, throw if not
|
|
54
|
+
*/
|
|
55
|
+
export declare function verifyAdminPlugin(config: InternalConfig): void;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/lib/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,UAAU,MAAM;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;KACrB,CAAC;CACH;AAED,UAAU,cAAe,SAAQ,MAAM;IACrC,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,CAAC;KACpB,CAAC;CACH;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aACG,IAAI,CAAC,EAAE,MAAM;gBAA9C,OAAO,EAAE,MAAM,EAAkB,IAAI,CAAC,EAAE,MAAM,YAAA;CAI3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,cAAc,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAiChG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAiB/D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAIvE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAe9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAc9D"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for Deesse projects
|
|
3
|
+
*
|
|
4
|
+
* Handles loading and processing of deesse.config.ts files.
|
|
5
|
+
* This is backend logic - it has no CLI dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { pathToFileURL } from 'node:url';
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
const CONFIG_PATHS = ['src/deesse.config.ts', 'deesse.config.ts', 'config/deesse.ts'];
|
|
11
|
+
export class ConfigLoaderError extends Error {
|
|
12
|
+
code;
|
|
13
|
+
constructor(message, code) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.name = 'ConfigLoaderError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Load the raw config from a deesse.config.ts file
|
|
21
|
+
*/
|
|
22
|
+
export async function loadRawConfig(cwd) {
|
|
23
|
+
let configModule = null;
|
|
24
|
+
let configPath = '';
|
|
25
|
+
for (const configFile of CONFIG_PATHS) {
|
|
26
|
+
configPath = path.resolve(cwd, configFile);
|
|
27
|
+
try {
|
|
28
|
+
// Windows ESM compatibility: use file:// URL
|
|
29
|
+
const url = pathToFileURL(configPath).toString();
|
|
30
|
+
configModule = await import(url);
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const err = error;
|
|
35
|
+
if (err.code !== 'ENOENT') {
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (!configModule) {
|
|
41
|
+
throw new ConfigLoaderError(`Config file not found. Searched paths:\n${CONFIG_PATHS.map((p) => ` - ${p}`).join('\n')}\nRun 'deesse init' to create a new project.`);
|
|
42
|
+
}
|
|
43
|
+
const rawConfig = configModule.default ||
|
|
44
|
+
configModule.config;
|
|
45
|
+
if (!rawConfig) {
|
|
46
|
+
throw new ConfigLoaderError(`No config found in ${configPath}`);
|
|
47
|
+
}
|
|
48
|
+
return { config: rawConfig, configPath };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Process raw config via defineConfig to get InternalConfig
|
|
52
|
+
*/
|
|
53
|
+
export function processConfig(rawConfig) {
|
|
54
|
+
const require = createRequire(import.meta.url);
|
|
55
|
+
try {
|
|
56
|
+
const deesse = require('deesse');
|
|
57
|
+
if (typeof deesse.defineConfig !== 'function') {
|
|
58
|
+
throw new ConfigLoaderError('deesse package does not export defineConfig');
|
|
59
|
+
}
|
|
60
|
+
return deesse.defineConfig(rawConfig);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error instanceof ConfigLoaderError) {
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
throw new ConfigLoaderError(`Failed to process config: ${error instanceof Error ? error.message : String(error)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Load and process a deesse config
|
|
71
|
+
*/
|
|
72
|
+
export async function loadConfig(cwd) {
|
|
73
|
+
const { config: rawConfig, configPath } = await loadRawConfig(cwd);
|
|
74
|
+
const processedConfig = processConfig(rawConfig);
|
|
75
|
+
return { rawConfig, processedConfig, configPath };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if the admin plugin is configured in the config
|
|
79
|
+
*/
|
|
80
|
+
export function hasAdminPlugin(config) {
|
|
81
|
+
if (!config.auth?.plugins) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return config.auth.plugins.some((plugin) => {
|
|
85
|
+
// Check if plugin has a name property indicating it's the admin plugin
|
|
86
|
+
if (plugin && typeof plugin === 'object' && 'name' in plugin) {
|
|
87
|
+
const name = plugin.name;
|
|
88
|
+
return name === 'admin' || String(name).includes('admin');
|
|
89
|
+
}
|
|
90
|
+
// Fallback to string representation check
|
|
91
|
+
const pluginStr = String(plugin);
|
|
92
|
+
return pluginStr.includes('admin') || pluginStr.includes('Admin');
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Verify admin plugin is configured, throw if not
|
|
97
|
+
*/
|
|
98
|
+
export function verifyAdminPlugin(config) {
|
|
99
|
+
if (!hasAdminPlugin(config)) {
|
|
100
|
+
throw new ConfigLoaderError('Admin plugin not configured. The admin plugin is automatically included by defineConfig,\n' +
|
|
101
|
+
'but your config must have an auth section configured.\n\n' +
|
|
102
|
+
'Example deesse.config.ts:\n' +
|
|
103
|
+
' export const config = defineConfig({\n' +
|
|
104
|
+
' auth: {\n' +
|
|
105
|
+
' baseURL: process.env.NEXT_PUBLIC_BASE_URL,\n' +
|
|
106
|
+
' },\n' +
|
|
107
|
+
' // ... other config\n' +
|
|
108
|
+
' });');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/lib/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drizzle schema loader
|
|
3
|
+
*
|
|
4
|
+
* Dynamically imports the user's schema from ./src/db/schema.ts
|
|
5
|
+
* This is required because drizzle-kit's programmatic API takes schema objects,
|
|
6
|
+
* not file paths.
|
|
7
|
+
*/
|
|
8
|
+
declare const DEFAULT_SCHEMA_PATH = "./src/db/schema.ts";
|
|
9
|
+
export { DEFAULT_SCHEMA_PATH };
|
|
10
|
+
export interface SchemaLoaderResult {
|
|
11
|
+
schema: Record<string, unknown>;
|
|
12
|
+
schemaPath: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class SchemaLoaderError extends Error {
|
|
15
|
+
readonly code?: string | undefined;
|
|
16
|
+
constructor(message: string, code?: string | undefined);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load Drizzle schema objects from the user's schema file
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadSchema(cwd?: string): Promise<SchemaLoaderResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Verify the schema file exists
|
|
24
|
+
*/
|
|
25
|
+
export declare function verifySchemaPath(cwd?: string): Promise<string>;
|
|
26
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/lib/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,QAAA,MAAM,mBAAmB,uBAAuB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aACG,IAAI,CAAC,EAAE,MAAM;gBAA9C,OAAO,EAAE,MAAM,EAAkB,IAAI,CAAC,EAAE,MAAM,YAAA;CAI3D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwCzF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAanF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drizzle schema loader
|
|
3
|
+
*
|
|
4
|
+
* Dynamically imports the user's schema from ./src/db/schema.ts
|
|
5
|
+
* This is required because drizzle-kit's programmatic API takes schema objects,
|
|
6
|
+
* not file paths.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
const DEFAULT_SCHEMA_PATH = './src/db/schema.ts';
|
|
11
|
+
export { DEFAULT_SCHEMA_PATH };
|
|
12
|
+
export class SchemaLoaderError extends Error {
|
|
13
|
+
code;
|
|
14
|
+
constructor(message, code) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.name = 'SchemaLoaderError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load Drizzle schema objects from the user's schema file
|
|
22
|
+
*/
|
|
23
|
+
export async function loadSchema(cwd = process.cwd()) {
|
|
24
|
+
const schemaPath = path.resolve(cwd, DEFAULT_SCHEMA_PATH);
|
|
25
|
+
const require = createRequire(import.meta.url);
|
|
26
|
+
try {
|
|
27
|
+
const schemaModule = require(schemaPath);
|
|
28
|
+
// Extract all exports that are schema objects (tables, etc.)
|
|
29
|
+
const schema = {};
|
|
30
|
+
for (const [key, value] of Object.entries(schemaModule)) {
|
|
31
|
+
// Skip non-schema exports (like imports, types, etc.)
|
|
32
|
+
if (key === '__esModule' || key === 'default')
|
|
33
|
+
continue;
|
|
34
|
+
if (typeof value !== 'object' && typeof value !== 'function')
|
|
35
|
+
continue;
|
|
36
|
+
schema[key] = value;
|
|
37
|
+
}
|
|
38
|
+
if (Object.keys(schema).length === 0) {
|
|
39
|
+
throw new SchemaLoaderError(`No schema objects found in ${DEFAULT_SCHEMA_PATH}.\n` +
|
|
40
|
+
`Please export your Drizzle tables from this file.`);
|
|
41
|
+
}
|
|
42
|
+
return { schema, schemaPath };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof SchemaLoaderError) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
const err = error;
|
|
49
|
+
if (err.code === 'ENOENT') {
|
|
50
|
+
throw new SchemaLoaderError(`Schema file not found: ${DEFAULT_SCHEMA_PATH}\n` +
|
|
51
|
+
`Please create this file and export your Drizzle tables.`);
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Verify the schema file exists
|
|
58
|
+
*/
|
|
59
|
+
export async function verifySchemaPath(cwd = process.cwd()) {
|
|
60
|
+
const { stat } = await import('node:fs/promises');
|
|
61
|
+
const schemaPath = path.resolve(cwd, DEFAULT_SCHEMA_PATH);
|
|
62
|
+
try {
|
|
63
|
+
await stat(schemaPath);
|
|
64
|
+
return schemaPath;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw new SchemaLoaderError(`Schema file not found: ${DEFAULT_SCHEMA_PATH}\n` +
|
|
68
|
+
`Please create this file and export your Drizzle tables.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/lib/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAO/B,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACG;IAA7C,YAAY,OAAe,EAAkB,IAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAS;QAExD,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAEzC,6DAA6D;QAC7D,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACxD,sDAAsD;YACtD,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS;YACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU;gBAAE,SAAS;YAEvE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,iBAAiB,CACzB,8BAA8B,mBAAmB,KAAK;gBACpD,mDAAmD,CACtD,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,KAA0B,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,iBAAiB,CACzB,0BAA0B,mBAAmB,IAAI;gBAC/C,yDAAyD,CAC5D,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CACzB,0BAA0B,mBAAmB,IAAI;YAC/C,yDAAyD,CAC5D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deessejs/cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"description": "DeesseJS CLI for managing DeesseJS projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,6 +16,14 @@
|
|
|
16
16
|
"bin",
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "tsc --watch",
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"type-check": "tsc --noEmit",
|
|
23
|
+
"lint": "eslint src",
|
|
24
|
+
"lint:fix": "eslint src --fix",
|
|
25
|
+
"clean": "rm -rf dist"
|
|
26
|
+
},
|
|
19
27
|
"keywords": [
|
|
20
28
|
"cli",
|
|
21
29
|
"deessejs",
|
|
@@ -24,8 +32,13 @@
|
|
|
24
32
|
"author": "DeesseJS",
|
|
25
33
|
"license": "MIT",
|
|
26
34
|
"dependencies": {
|
|
35
|
+
"@better-auth/drizzle-adapter": "^1.0.0",
|
|
27
36
|
"@clack/prompts": "^0.8.2",
|
|
28
|
-
"
|
|
37
|
+
"better-auth": "^1.0.0",
|
|
38
|
+
"dotenv": "^17.3.1",
|
|
39
|
+
"drizzle-orm": "^0.38.0",
|
|
40
|
+
"pg": "^8.13.0",
|
|
41
|
+
"zod": "^3.23.0"
|
|
29
42
|
},
|
|
30
43
|
"devDependencies": {
|
|
31
44
|
"@types/node": "^22.10.6",
|
|
@@ -33,13 +46,5 @@
|
|
|
33
46
|
},
|
|
34
47
|
"engines": {
|
|
35
48
|
"node": ">=18.0.0"
|
|
36
|
-
},
|
|
37
|
-
"scripts": {
|
|
38
|
-
"dev": "tsc --watch",
|
|
39
|
-
"build": "tsc",
|
|
40
|
-
"type-check": "tsc --noEmit",
|
|
41
|
-
"lint": "eslint src",
|
|
42
|
-
"lint:fix": "eslint src --fix",
|
|
43
|
-
"clean": "rm -rf dist"
|
|
44
49
|
}
|
|
45
|
-
}
|
|
50
|
+
}
|