@deessejs/cli 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/db/generate.d.ts +14 -0
- package/dist/commands/db/generate.d.ts.map +1 -0
- package/dist/commands/db/generate.js +56 -0
- package/dist/commands/db/generate.js.map +1 -0
- package/dist/commands/db/index.d.ts +15 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +100 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/db/migrate.d.ts +16 -0
- package/dist/commands/db/migrate.d.ts.map +1 -0
- package/dist/commands/db/migrate.js +75 -0
- package/dist/commands/db/migrate.js.map +1 -0
- package/dist/commands/db/push.d.ts +16 -0
- package/dist/commands/db/push.d.ts.map +1 -0
- package/dist/commands/db/push.js +67 -0
- package/dist/commands/db/push.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 +2 -2
- 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 +1 -1
|
@@ -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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:generate command
|
|
3
|
+
*
|
|
4
|
+
* Verifies schema and config exist, then delegates to drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Requirements:
|
|
7
|
+
* - src/db/schema.ts: Your Drizzle tables
|
|
8
|
+
* - drizzle.config.ts: Standard drizzle-kit config with schema and out settings
|
|
9
|
+
*/
|
|
10
|
+
export interface DbGenerateOptions {
|
|
11
|
+
cwd?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function dbGenerate(options?: DbGenerateOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:generate command
|
|
3
|
+
*
|
|
4
|
+
* Verifies schema and config exist, then delegates to drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Requirements:
|
|
7
|
+
* - src/db/schema.ts: Your Drizzle tables
|
|
8
|
+
* - drizzle.config.ts: Standard drizzle-kit config with schema and out settings
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { verifySchemaPath, DEFAULT_SCHEMA_PATH } from '../../lib/db/schema.js';
|
|
12
|
+
import * as fs from 'node:fs/promises';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
const SCHEMA_PATH = DEFAULT_SCHEMA_PATH;
|
|
15
|
+
const DRIZZLE_CONFIG_PATH = './drizzle.config.ts';
|
|
16
|
+
export async function dbGenerate(options = {}) {
|
|
17
|
+
const cwd = options.cwd ?? process.cwd();
|
|
18
|
+
// Verify schema file exists
|
|
19
|
+
try {
|
|
20
|
+
await verifySchemaPath();
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new Error(`db:generate requires ${SCHEMA_PATH} to exist.\n` +
|
|
24
|
+
`Please create this file and export your Drizzle tables.`);
|
|
25
|
+
}
|
|
26
|
+
// Verify drizzle.config.ts exists
|
|
27
|
+
const drizzleConfigPath = path.join(cwd, DRIZZLE_CONFIG_PATH);
|
|
28
|
+
try {
|
|
29
|
+
await fs.access(drizzleConfigPath);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new Error(`db:generate requires ${DRIZZLE_CONFIG_PATH} to exist.\n` +
|
|
33
|
+
`Please create this file with your drizzle-kit configuration.\n\n` +
|
|
34
|
+
`Example:\n` +
|
|
35
|
+
`import { defineConfig } from 'drizzle-kit';\n` +
|
|
36
|
+
`export default defineConfig({\n` +
|
|
37
|
+
` schema: './src/db/schema.ts',\n` +
|
|
38
|
+
` out: './src/db/migrations',\n` +
|
|
39
|
+
` dialect: 'postgresql',\n` +
|
|
40
|
+
`});`);
|
|
41
|
+
}
|
|
42
|
+
console.warn('Generating migrations with drizzle-kit...');
|
|
43
|
+
try {
|
|
44
|
+
execSync('npx drizzle-kit generate', {
|
|
45
|
+
cwd,
|
|
46
|
+
stdio: 'inherit',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error.code === 'ENOENT') {
|
|
51
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"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,wBAAwB,CAAC;AAC/E,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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db command dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Handles all db:* subcommands:
|
|
5
|
+
* - db:generate Generate migrations from schema changes
|
|
6
|
+
* - db:push Push schema changes directly (dev only)
|
|
7
|
+
* - db:migrate Apply pending migrations to database
|
|
8
|
+
*/
|
|
9
|
+
export interface DbCommandOptions {
|
|
10
|
+
subcommand: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function runDbCommand(options: DbCommandOptions): Promise<void>;
|
|
14
|
+
export declare function showDbHelp(): void;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/db/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B3E;AA0CD,wBAAgB,UAAU,IAAI,IAAI,CA+BjC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db command dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Handles all db:* subcommands:
|
|
5
|
+
* - db:generate Generate migrations from schema changes
|
|
6
|
+
* - db:push Push schema changes directly (dev only)
|
|
7
|
+
* - db:migrate Apply pending migrations to database
|
|
8
|
+
*/
|
|
9
|
+
import { dbGenerate } from './generate.js';
|
|
10
|
+
import { dbPush } from './push.js';
|
|
11
|
+
import { dbMigrate } from './migrate.js';
|
|
12
|
+
export async function runDbCommand(options) {
|
|
13
|
+
const { subcommand, args } = options;
|
|
14
|
+
switch (subcommand) {
|
|
15
|
+
case 'generate': {
|
|
16
|
+
const opts = parseDbGenerateArgs(args);
|
|
17
|
+
await dbGenerate(opts);
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
case 'push': {
|
|
21
|
+
const opts = parseDbPushArgs(args);
|
|
22
|
+
await dbPush(opts);
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
case 'migrate': {
|
|
26
|
+
const opts = parseDbMigrateArgs(args);
|
|
27
|
+
await dbMigrate(opts);
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
default:
|
|
31
|
+
throw new Error(`Unknown db command: ${subcommand}\n` +
|
|
32
|
+
`Valid commands: generate, push, migrate`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function parseDbGenerateArgs(args) {
|
|
36
|
+
const opts = {};
|
|
37
|
+
for (let i = 0; i < args.length; i++) {
|
|
38
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
39
|
+
opts.cwd = args[++i];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return opts;
|
|
43
|
+
}
|
|
44
|
+
function parseDbPushArgs(args) {
|
|
45
|
+
const opts = {};
|
|
46
|
+
for (let i = 0; i < args.length; i++) {
|
|
47
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
48
|
+
opts.cwd = args[++i];
|
|
49
|
+
}
|
|
50
|
+
else if (args[i] === '--force' || args[i] === '-f') {
|
|
51
|
+
opts.force = true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return opts;
|
|
55
|
+
}
|
|
56
|
+
function parseDbMigrateArgs(args) {
|
|
57
|
+
const opts = {};
|
|
58
|
+
for (let i = 0; i < args.length; i++) {
|
|
59
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
60
|
+
opts.cwd = args[++i];
|
|
61
|
+
}
|
|
62
|
+
else if (args[i] === '--dry-run') {
|
|
63
|
+
opts.dryRun = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return opts;
|
|
67
|
+
}
|
|
68
|
+
export function showDbHelp() {
|
|
69
|
+
console.warn(`
|
|
70
|
+
Deesse DB Commands
|
|
71
|
+
|
|
72
|
+
Usage: npx deesse db:<command> [options]
|
|
73
|
+
|
|
74
|
+
Commands:
|
|
75
|
+
db:generate Generate migrations from schema changes
|
|
76
|
+
db:push Push schema changes directly to database
|
|
77
|
+
db:migrate Apply pending migrations to database
|
|
78
|
+
|
|
79
|
+
Options:
|
|
80
|
+
|
|
81
|
+
db:generate
|
|
82
|
+
--cwd <path> Set working directory
|
|
83
|
+
|
|
84
|
+
db:push
|
|
85
|
+
--cwd <path> Set working directory
|
|
86
|
+
--force, -f Force push without confirmation
|
|
87
|
+
|
|
88
|
+
db:migrate
|
|
89
|
+
--cwd <path> Set working directory
|
|
90
|
+
--dry-run Show what would be migrated without executing
|
|
91
|
+
|
|
92
|
+
Examples:
|
|
93
|
+
npx deesse db:generate
|
|
94
|
+
npx deesse db:push
|
|
95
|
+
npx deesse db:push --force
|
|
96
|
+
npx deesse db:migrate
|
|
97
|
+
npx deesse db:migrate --dry-run
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/db/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:migrate command
|
|
3
|
+
*
|
|
4
|
+
* Verifies schema and config exist, then delegates to drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Requirements:
|
|
7
|
+
* - src/db/schema.ts: Your Drizzle tables
|
|
8
|
+
* - drizzle.config.ts: Standard drizzle-kit config with schema and dbCredentials
|
|
9
|
+
* - .env: Should contain DATABASE_URL
|
|
10
|
+
*/
|
|
11
|
+
export interface DbMigrateOptions {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function dbMigrate(options?: DbMigrateOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:migrate command
|
|
3
|
+
*
|
|
4
|
+
* Verifies schema and config exist, then delegates to drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Requirements:
|
|
7
|
+
* - src/db/schema.ts: Your Drizzle tables
|
|
8
|
+
* - drizzle.config.ts: Standard drizzle-kit config with schema and dbCredentials
|
|
9
|
+
* - .env: Should contain DATABASE_URL
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import { verifySchemaPath, DEFAULT_SCHEMA_PATH } from '../../lib/db/schema.js';
|
|
13
|
+
import * as fs from 'node:fs/promises';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import * as dotenv from 'dotenv';
|
|
16
|
+
const DRIZZLE_CONFIG_PATH = './drizzle.config.ts';
|
|
17
|
+
const SCHEMA_PATH = DEFAULT_SCHEMA_PATH;
|
|
18
|
+
export async function dbMigrate(options = {}) {
|
|
19
|
+
const { cwd = process.cwd(), dryRun = false } = options;
|
|
20
|
+
// Verify schema file exists
|
|
21
|
+
try {
|
|
22
|
+
await verifySchemaPath(cwd);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error(`db:migrate requires ${SCHEMA_PATH} to exist.\n` +
|
|
26
|
+
`Please create this file and export your Drizzle tables.`);
|
|
27
|
+
}
|
|
28
|
+
// Verify drizzle.config.ts exists
|
|
29
|
+
const drizzleConfigPath = path.join(cwd, DRIZZLE_CONFIG_PATH);
|
|
30
|
+
try {
|
|
31
|
+
await fs.access(drizzleConfigPath);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new Error(`db:migrate requires ${DRIZZLE_CONFIG_PATH} to exist.\n` +
|
|
35
|
+
`Please create this file with your drizzle-kit configuration.\n\n` +
|
|
36
|
+
`Example:\n` +
|
|
37
|
+
`import { defineConfig } from 'drizzle-kit';\n` +
|
|
38
|
+
`export default defineConfig({\n` +
|
|
39
|
+
` schema: './src/db/schema.ts',\n` +
|
|
40
|
+
` out: './src/db/migrations',\n` +
|
|
41
|
+
` dialect: 'postgresql',\n` +
|
|
42
|
+
` dbCredentials: {\n` +
|
|
43
|
+
` url: process.env.DATABASE_URL!,\n` +
|
|
44
|
+
` },\n` +
|
|
45
|
+
`});`);
|
|
46
|
+
}
|
|
47
|
+
console.warn('Applying migrations with drizzle-kit...');
|
|
48
|
+
// Load .env file
|
|
49
|
+
dotenv.config();
|
|
50
|
+
// Build command
|
|
51
|
+
const cmd = dryRun ? 'npx drizzle-kit migrate --dry' : 'npx drizzle-kit migrate';
|
|
52
|
+
// Use spawn with shell:true so .env is inherited
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const child = spawn(cmd, {
|
|
55
|
+
cwd,
|
|
56
|
+
stdio: 'inherit',
|
|
57
|
+
shell: true,
|
|
58
|
+
});
|
|
59
|
+
child.on('close', (code) => {
|
|
60
|
+
if (code === 0) {
|
|
61
|
+
resolve();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
reject(new Error(`Command failed: npx drizzle-kit migrate${dryRun ? ' --dry' : ''}`));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
child.on('error', (error) => {
|
|
68
|
+
if (error.code === 'ENOENT') {
|
|
69
|
+
reject(new Error('drizzle-kit not found. Please install it: npm install drizzle-kit'));
|
|
70
|
+
}
|
|
71
|
+
reject(error);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"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,wBAAwB,CAAC;AAC/E,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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:push command
|
|
3
|
+
*
|
|
4
|
+
* Verifies schema and config exist, then delegates to drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Requirements:
|
|
7
|
+
* - src/db/schema.ts: Your Drizzle tables
|
|
8
|
+
* - drizzle.config.ts: Standard drizzle-kit config with schema and dbCredentials
|
|
9
|
+
* - .env: Should contain DATABASE_URL (loaded automatically)
|
|
10
|
+
*/
|
|
11
|
+
export interface DbPushOptions {
|
|
12
|
+
force?: boolean;
|
|
13
|
+
cwd?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function dbPush(options?: DbPushOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:push command
|
|
3
|
+
*
|
|
4
|
+
* Verifies schema and config exist, then delegates to drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Requirements:
|
|
7
|
+
* - src/db/schema.ts: Your Drizzle tables
|
|
8
|
+
* - drizzle.config.ts: Standard drizzle-kit config with schema and dbCredentials
|
|
9
|
+
* - .env: Should contain DATABASE_URL (loaded automatically)
|
|
10
|
+
*/
|
|
11
|
+
import { execSync } from 'node:child_process';
|
|
12
|
+
import { verifySchemaPath, DEFAULT_SCHEMA_PATH } from '../../lib/db/schema.js';
|
|
13
|
+
import * as fs from 'node:fs/promises';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import * as dotenv from 'dotenv';
|
|
16
|
+
const DRIZZLE_CONFIG_PATH = './drizzle.config.ts';
|
|
17
|
+
const SCHEMA_PATH = DEFAULT_SCHEMA_PATH;
|
|
18
|
+
export async function dbPush(options = {}) {
|
|
19
|
+
const { force = false, cwd = process.cwd() } = options;
|
|
20
|
+
// Verify schema file exists
|
|
21
|
+
try {
|
|
22
|
+
await verifySchemaPath(cwd);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error(`db:push requires ${SCHEMA_PATH} to exist.\n` +
|
|
26
|
+
`Please create this file and export your Drizzle tables.`);
|
|
27
|
+
}
|
|
28
|
+
// Verify drizzle.config.ts exists
|
|
29
|
+
const drizzleConfigPath = path.join(cwd, DRIZZLE_CONFIG_PATH);
|
|
30
|
+
try {
|
|
31
|
+
await fs.access(drizzleConfigPath);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new Error(`db:push requires ${DRIZZLE_CONFIG_PATH} to exist.\n` +
|
|
35
|
+
`Please create this file with your drizzle-kit configuration.\n\n` +
|
|
36
|
+
`Example:\n` +
|
|
37
|
+
`import { defineConfig } from 'drizzle-kit';\n` +
|
|
38
|
+
`export default defineConfig({\n` +
|
|
39
|
+
` schema: './src/db/schema.ts',\n` +
|
|
40
|
+
` dialect: 'postgresql',\n` +
|
|
41
|
+
` dbCredentials: {\n` +
|
|
42
|
+
` url: process.env.DATABASE_URL,\n` +
|
|
43
|
+
` },\n` +
|
|
44
|
+
`});`);
|
|
45
|
+
}
|
|
46
|
+
console.warn('Pushing schema to database with drizzle-kit...');
|
|
47
|
+
// Load .env file if it exists
|
|
48
|
+
dotenv.config();
|
|
49
|
+
const args = ['npx drizzle-kit', 'push'];
|
|
50
|
+
if (force) {
|
|
51
|
+
args.push('--force');
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
execSync(args.join(' '), {
|
|
55
|
+
cwd,
|
|
56
|
+
stdio: 'inherit',
|
|
57
|
+
env: process.env,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error.code === 'ENOENT') {
|
|
62
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"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,wBAAwB,CAAC;AAC/E,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"}
|
|
@@ -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
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import * as p from '@clack/prompts';
|
|
3
3
|
import { readFileSync } from 'node:fs';
|
|
4
4
|
import { execSync } from 'node:child_process';
|
|
5
|
-
import { runDbCommand, showDbHelp } from './commands/db.js';
|
|
6
|
-
import { adminCreate } from './commands/admin
|
|
5
|
+
import { runDbCommand, showDbHelp } from './commands/db/index.js';
|
|
6
|
+
import { adminCreate } from './commands/admin/create.js';
|
|
7
7
|
const getVersion = () => {
|
|
8
8
|
try {
|
|
9
9
|
const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
|
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,
|
|
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"}
|