@objectql/cli 1.6.1 ā 1.7.1
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/CHANGELOG.md +26 -5
- package/IMPLEMENTATION_SUMMARY.md +437 -0
- package/README.md +385 -7
- package/USAGE_EXAMPLES.md +804 -0
- package/__tests__/commands.test.ts +153 -0
- package/dist/commands/i18n.d.ts +27 -0
- package/dist/commands/i18n.js +280 -0
- package/dist/commands/i18n.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.js +202 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +26 -0
- package/dist/commands/migrate.js +301 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +7 -0
- package/dist/commands/new.js +279 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/serve.js +1 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/studio.js +92 -9
- package/dist/commands/studio.js.map +1 -1
- package/dist/index.js +130 -2
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/commands/i18n.ts +303 -0
- package/src/commands/init.ts +191 -0
- package/src/commands/migrate.ts +314 -0
- package/src/commands/new.ts +268 -0
- package/src/commands/serve.ts +2 -2
- package/src/commands/studio.ts +98 -10
- package/src/index.ts +131 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.initProject = initProject;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const util_1 = require("util");
|
|
44
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
46
|
+
const TEMPLATES = {
|
|
47
|
+
basic: '@objectql/starter-basic',
|
|
48
|
+
'express-api': '@objectql/starter-express-api',
|
|
49
|
+
enterprise: '@objectql/starter-enterprise'
|
|
50
|
+
};
|
|
51
|
+
async function initProject(options) {
|
|
52
|
+
const projectName = options.name || 'my-objectql-project';
|
|
53
|
+
const targetDir = options.dir || path.join(process.cwd(), projectName);
|
|
54
|
+
const template = (options.template || 'basic');
|
|
55
|
+
if (!TEMPLATES[template]) {
|
|
56
|
+
console.error(chalk_1.default.red(`ā Unknown template: ${template}`));
|
|
57
|
+
console.log(chalk_1.default.gray(`Available templates: ${Object.keys(TEMPLATES).join(', ')}`));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
console.log(chalk_1.default.blue(`\nš Initializing ObjectQL project: ${chalk_1.default.bold(projectName)}`));
|
|
61
|
+
console.log(chalk_1.default.gray(`Template: ${template}`));
|
|
62
|
+
console.log(chalk_1.default.gray(`Directory: ${targetDir}\n`));
|
|
63
|
+
// Check if directory exists
|
|
64
|
+
if (fs.existsSync(targetDir)) {
|
|
65
|
+
console.error(chalk_1.default.red(`ā Directory already exists: ${targetDir}`));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
// Create project directory
|
|
69
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
70
|
+
try {
|
|
71
|
+
// Copy template files from starters
|
|
72
|
+
const templatePath = path.join(__dirname, '../../../../starters', template);
|
|
73
|
+
// Check if we're in the monorepo (for development)
|
|
74
|
+
if (fs.existsSync(templatePath)) {
|
|
75
|
+
console.log(chalk_1.default.gray('Copying template files...'));
|
|
76
|
+
await copyDirectory(templatePath, targetDir, ['node_modules', 'dist', '.git']);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Try to use the published package
|
|
80
|
+
console.log(chalk_1.default.gray(`Installing template from npm: ${TEMPLATES[template]}...`));
|
|
81
|
+
await execAsync(`npm create ${TEMPLATES[template]} ${targetDir}`, {
|
|
82
|
+
cwd: process.cwd()
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Update package.json with project name
|
|
86
|
+
const pkgPath = path.join(targetDir, 'package.json');
|
|
87
|
+
if (fs.existsSync(pkgPath)) {
|
|
88
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
89
|
+
pkg.name = projectName;
|
|
90
|
+
pkg.version = '0.1.0';
|
|
91
|
+
// Convert workspace dependencies to actual versions for standalone project
|
|
92
|
+
if (pkg.dependencies) {
|
|
93
|
+
for (const dep of Object.keys(pkg.dependencies)) {
|
|
94
|
+
if (pkg.dependencies[dep] === 'workspace:*') {
|
|
95
|
+
pkg.dependencies[dep] = '^1.0.0'; // Use latest published version
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (pkg.devDependencies) {
|
|
100
|
+
for (const dep of Object.keys(pkg.devDependencies)) {
|
|
101
|
+
if (pkg.devDependencies[dep] === 'workspace:*') {
|
|
102
|
+
pkg.devDependencies[dep] = '^1.0.0';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
|
|
107
|
+
}
|
|
108
|
+
// Initialize git repository
|
|
109
|
+
if (!options.skipGit) {
|
|
110
|
+
try {
|
|
111
|
+
console.log(chalk_1.default.gray('\nInitializing git repository...'));
|
|
112
|
+
await execAsync('git init', { cwd: targetDir });
|
|
113
|
+
// Create .gitignore if it doesn't exist
|
|
114
|
+
const gitignorePath = path.join(targetDir, '.gitignore');
|
|
115
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
116
|
+
const gitignore = `node_modules/
|
|
117
|
+
dist/
|
|
118
|
+
*.log
|
|
119
|
+
.DS_Store
|
|
120
|
+
*.sqlite3
|
|
121
|
+
.env
|
|
122
|
+
.env.local
|
|
123
|
+
`;
|
|
124
|
+
fs.writeFileSync(gitignorePath, gitignore);
|
|
125
|
+
}
|
|
126
|
+
console.log(chalk_1.default.green('ā Git repository initialized'));
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.log(chalk_1.default.yellow('ā Git initialization skipped (git not available)'));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Install dependencies
|
|
133
|
+
if (!options.skipInstall) {
|
|
134
|
+
console.log(chalk_1.default.gray('\nInstalling dependencies...'));
|
|
135
|
+
console.log(chalk_1.default.gray('This might take a few minutes...\n'));
|
|
136
|
+
try {
|
|
137
|
+
// Try pnpm first, fall back to npm
|
|
138
|
+
const hasNpm = await checkCommand('pnpm');
|
|
139
|
+
const packageManager = hasNpm ? 'pnpm' : 'npm';
|
|
140
|
+
await execAsync(`${packageManager} install`, {
|
|
141
|
+
cwd: targetDir,
|
|
142
|
+
// Show output in real-time would be better, but this is simpler
|
|
143
|
+
});
|
|
144
|
+
console.log(chalk_1.default.green(`ā Dependencies installed with ${packageManager}`));
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
console.log(chalk_1.default.yellow(`ā Failed to install dependencies: ${err.message}`));
|
|
148
|
+
console.log(chalk_1.default.gray(`You can install them manually by running:`));
|
|
149
|
+
console.log(chalk_1.default.gray(` cd ${projectName} && npm install`));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Success message
|
|
153
|
+
console.log(chalk_1.default.green('\nā
Project created successfully!\n'));
|
|
154
|
+
console.log(chalk_1.default.bold('Next steps:'));
|
|
155
|
+
console.log(chalk_1.default.gray(` cd ${projectName}`));
|
|
156
|
+
if (options.skipInstall) {
|
|
157
|
+
console.log(chalk_1.default.gray(' pnpm install # or npm install'));
|
|
158
|
+
}
|
|
159
|
+
console.log(chalk_1.default.gray(' pnpm run build'));
|
|
160
|
+
console.log(chalk_1.default.gray(' pnpm run repl\n'));
|
|
161
|
+
console.log(chalk_1.default.blue('š Documentation: https://github.com/objectql/objectql'));
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
console.error(chalk_1.default.red(`\nā Failed to create project: ${error.message}`));
|
|
165
|
+
// Clean up
|
|
166
|
+
if (fs.existsSync(targetDir)) {
|
|
167
|
+
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
168
|
+
}
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function copyDirectory(src, dest, ignore = []) {
|
|
173
|
+
// Create destination directory
|
|
174
|
+
if (!fs.existsSync(dest)) {
|
|
175
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
176
|
+
}
|
|
177
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
178
|
+
for (const entry of entries) {
|
|
179
|
+
const srcPath = path.join(src, entry.name);
|
|
180
|
+
const destPath = path.join(dest, entry.name);
|
|
181
|
+
// Skip ignored directories
|
|
182
|
+
if (ignore.includes(entry.name)) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (entry.isDirectory()) {
|
|
186
|
+
await copyDirectory(srcPath, destPath, ignore);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
fs.copyFileSync(srcPath, destPath);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function checkCommand(cmd) {
|
|
194
|
+
try {
|
|
195
|
+
await execAsync(`${cmd} --version`);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface MigrateOptions {
|
|
2
|
+
config?: string;
|
|
3
|
+
dir?: string;
|
|
4
|
+
}
|
|
5
|
+
interface MigrateCreateOptions {
|
|
6
|
+
name: string;
|
|
7
|
+
dir?: string;
|
|
8
|
+
}
|
|
9
|
+
interface MigrateStatusOptions {
|
|
10
|
+
config?: string;
|
|
11
|
+
dir?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Run pending migrations
|
|
15
|
+
*/
|
|
16
|
+
export declare function migrate(options: MigrateOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Create a new migration file with boilerplate code
|
|
19
|
+
*/
|
|
20
|
+
export declare function migrateCreate(options: MigrateCreateOptions): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Show migration status - displays pending and completed migrations
|
|
23
|
+
* @param options - Configuration options including config path and migrations directory
|
|
24
|
+
*/
|
|
25
|
+
export declare function migrateStatus(options: MigrateStatusOptions): Promise<void>;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.migrate = migrate;
|
|
40
|
+
exports.migrateCreate = migrateCreate;
|
|
41
|
+
exports.migrateStatus = migrateStatus;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
+
const MIGRATION_TEMPLATE = `import { ObjectQL } from '@objectql/core';
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Migration: {{name}}
|
|
49
|
+
* Created: {{timestamp}}
|
|
50
|
+
*/
|
|
51
|
+
export async function up(app: ObjectQL) {
|
|
52
|
+
// TODO: Implement migration logic
|
|
53
|
+
console.log('Running migration: {{name}}');
|
|
54
|
+
|
|
55
|
+
// Example: Add a new field to an object
|
|
56
|
+
// const tasks = app.getObject('tasks');
|
|
57
|
+
// await tasks.updateSchema({
|
|
58
|
+
// fields: {
|
|
59
|
+
// new_field: { type: 'text', label: 'New Field' }
|
|
60
|
+
// }
|
|
61
|
+
// });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function down(app: ObjectQL) {
|
|
65
|
+
// TODO: Implement rollback logic
|
|
66
|
+
console.log('Rolling back migration: {{name}}');
|
|
67
|
+
|
|
68
|
+
// Example: Remove the field
|
|
69
|
+
// const tasks = app.getObject('tasks');
|
|
70
|
+
// await tasks.updateSchema({
|
|
71
|
+
// fields: {
|
|
72
|
+
// new_field: undefined
|
|
73
|
+
// }
|
|
74
|
+
// });
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
/**
|
|
78
|
+
* Run pending migrations
|
|
79
|
+
*/
|
|
80
|
+
async function migrate(options) {
|
|
81
|
+
const migrationsDir = path.resolve(process.cwd(), options.dir || './migrations');
|
|
82
|
+
console.log(chalk_1.default.blue('š Running migrations...'));
|
|
83
|
+
console.log(chalk_1.default.gray(`Migrations directory: ${migrationsDir}\n`));
|
|
84
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
85
|
+
console.log(chalk_1.default.yellow('ā No migrations directory found'));
|
|
86
|
+
console.log(chalk_1.default.gray('Create one with: objectql migrate:create --name init'));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
// Load ObjectQL instance from config
|
|
91
|
+
const app = await loadObjectQLInstance(options.config);
|
|
92
|
+
// Get list of migration files
|
|
93
|
+
const files = fs.readdirSync(migrationsDir)
|
|
94
|
+
.filter(f => f.endsWith('.ts') || f.endsWith('.js'))
|
|
95
|
+
.sort();
|
|
96
|
+
if (files.length === 0) {
|
|
97
|
+
console.log(chalk_1.default.yellow('ā No migration files found'));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Get already run migrations
|
|
101
|
+
const migrations = app.getObject('_migrations');
|
|
102
|
+
let runMigrations = [];
|
|
103
|
+
try {
|
|
104
|
+
const result = await migrations.find({
|
|
105
|
+
fields: ['name'],
|
|
106
|
+
sort: [['created_at', 'asc']]
|
|
107
|
+
});
|
|
108
|
+
runMigrations = result.records.map((r) => r.name);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
// Migrations table doesn't exist yet, create it
|
|
112
|
+
console.log(chalk_1.default.gray('Creating migrations tracking table...'));
|
|
113
|
+
await createMigrationsTable(app);
|
|
114
|
+
}
|
|
115
|
+
// Run pending migrations
|
|
116
|
+
let ranCount = 0;
|
|
117
|
+
for (const file of files) {
|
|
118
|
+
const migrationName = file.replace(/\.(ts|js)$/, '');
|
|
119
|
+
if (runMigrations.includes(migrationName)) {
|
|
120
|
+
console.log(chalk_1.default.gray(`ā ${migrationName} (already run)`));
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
console.log(chalk_1.default.blue(`ā¶ ${migrationName}`));
|
|
124
|
+
const migrationPath = path.join(migrationsDir, file);
|
|
125
|
+
const migration = require(migrationPath);
|
|
126
|
+
if (!migration.up) {
|
|
127
|
+
console.log(chalk_1.default.red(` ā No 'up' function found`));
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
await migration.up(app);
|
|
132
|
+
// Record migration
|
|
133
|
+
await migrations.insert({
|
|
134
|
+
name: migrationName,
|
|
135
|
+
run_at: new Date()
|
|
136
|
+
});
|
|
137
|
+
console.log(chalk_1.default.green(` ā Complete`));
|
|
138
|
+
ranCount++;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.log(chalk_1.default.red(` ā Failed: ${error.message}`));
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
console.log(chalk_1.default.green(`\nā
Ran ${ranCount} migration(s)`));
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.error(chalk_1.default.red(`ā Migration failed: ${error.message}`));
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Create a new migration file with boilerplate code
|
|
154
|
+
*/
|
|
155
|
+
async function migrateCreate(options) {
|
|
156
|
+
const { name } = options;
|
|
157
|
+
const migrationsDir = path.resolve(process.cwd(), options.dir || './migrations');
|
|
158
|
+
// Validate name
|
|
159
|
+
if (!name || !/^[a-z][a-z0-9_]*$/.test(name)) {
|
|
160
|
+
console.error(chalk_1.default.red('ā Invalid migration name. Use lowercase with underscores (e.g., add_status_field)'));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
// Create migrations directory if it doesn't exist
|
|
164
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
165
|
+
fs.mkdirSync(migrationsDir, { recursive: true });
|
|
166
|
+
console.log(chalk_1.default.gray(`Created directory: ${migrationsDir}`));
|
|
167
|
+
}
|
|
168
|
+
// Generate filename with timestamp
|
|
169
|
+
const timestamp = new Date().toISOString().replace(/[:\-T.]/g, '').slice(0, 14);
|
|
170
|
+
const filename = `${timestamp}_${name}.ts`;
|
|
171
|
+
const filePath = path.join(migrationsDir, filename);
|
|
172
|
+
// Create migration file from template
|
|
173
|
+
const content = MIGRATION_TEMPLATE
|
|
174
|
+
.replace(/\{\{name\}\}/g, name)
|
|
175
|
+
.replace(/\{\{timestamp\}\}/g, new Date().toISOString());
|
|
176
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
177
|
+
console.log(chalk_1.default.green(`ā
Created migration: ${filename}`));
|
|
178
|
+
console.log(chalk_1.default.gray(`Path: ${filePath}`));
|
|
179
|
+
console.log(chalk_1.default.gray(`\nNext steps:`));
|
|
180
|
+
console.log(chalk_1.default.gray(` 1. Edit the migration file to add your changes`));
|
|
181
|
+
console.log(chalk_1.default.gray(` 2. Run: objectql migrate`));
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Show migration status - displays pending and completed migrations
|
|
185
|
+
* @param options - Configuration options including config path and migrations directory
|
|
186
|
+
*/
|
|
187
|
+
async function migrateStatus(options) {
|
|
188
|
+
const migrationsDir = path.resolve(process.cwd(), options.dir || './migrations');
|
|
189
|
+
console.log(chalk_1.default.blue('š Migration Status\n'));
|
|
190
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
191
|
+
console.log(chalk_1.default.yellow('ā No migrations directory found'));
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
// Load ObjectQL instance
|
|
196
|
+
const app = await loadObjectQLInstance(options.config);
|
|
197
|
+
// Get list of migration files
|
|
198
|
+
const files = fs.readdirSync(migrationsDir)
|
|
199
|
+
.filter(f => f.endsWith('.ts') || f.endsWith('.js'))
|
|
200
|
+
.sort();
|
|
201
|
+
if (files.length === 0) {
|
|
202
|
+
console.log(chalk_1.default.gray('No migration files found'));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// Get run migrations
|
|
206
|
+
const migrations = app.getObject('_migrations');
|
|
207
|
+
let runMigrations = [];
|
|
208
|
+
try {
|
|
209
|
+
const result = await migrations.find({
|
|
210
|
+
fields: ['name', 'run_at'],
|
|
211
|
+
sort: [['run_at', 'asc']]
|
|
212
|
+
});
|
|
213
|
+
runMigrations = result.records.map((r) => r.name);
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
// Migrations table doesn't exist
|
|
217
|
+
runMigrations = [];
|
|
218
|
+
}
|
|
219
|
+
// Display status
|
|
220
|
+
let pendingCount = 0;
|
|
221
|
+
for (const file of files) {
|
|
222
|
+
const migrationName = file.replace(/\.(ts|js)$/, '');
|
|
223
|
+
const isRun = runMigrations.includes(migrationName);
|
|
224
|
+
if (isRun) {
|
|
225
|
+
console.log(chalk_1.default.green(`ā ${migrationName}`));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log(chalk_1.default.yellow(`ā ${migrationName} (pending)`));
|
|
229
|
+
pendingCount++;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
console.log(chalk_1.default.blue(`\nš Summary:`));
|
|
233
|
+
console.log(chalk_1.default.gray(`Total migrations: ${files.length}`));
|
|
234
|
+
console.log(chalk_1.default.gray(`Run: ${files.length - pendingCount}`));
|
|
235
|
+
console.log(chalk_1.default.gray(`Pending: ${pendingCount}`));
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.error(chalk_1.default.red(`ā Failed to get status: ${error.message}`));
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async function loadObjectQLInstance(configPath) {
|
|
243
|
+
const cwd = process.cwd();
|
|
244
|
+
// Try to load from config file
|
|
245
|
+
let configFile = configPath;
|
|
246
|
+
if (!configFile) {
|
|
247
|
+
const potentialFiles = ['objectql.config.ts', 'objectql.config.js'];
|
|
248
|
+
for (const file of potentialFiles) {
|
|
249
|
+
if (fs.existsSync(path.join(cwd, file))) {
|
|
250
|
+
configFile = file;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (!configFile) {
|
|
256
|
+
throw new Error('No configuration file found (objectql.config.ts/js)');
|
|
257
|
+
}
|
|
258
|
+
// Register ts-node for TypeScript support
|
|
259
|
+
try {
|
|
260
|
+
require('ts-node').register({
|
|
261
|
+
transpileOnly: true,
|
|
262
|
+
compilerOptions: {
|
|
263
|
+
module: 'commonjs'
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
// ts-node not available, try to load JS directly
|
|
269
|
+
}
|
|
270
|
+
const configModule = require(path.join(cwd, configFile));
|
|
271
|
+
const app = configModule.default || configModule.app || configModule.objectql || configModule.db;
|
|
272
|
+
if (!app) {
|
|
273
|
+
throw new Error('Config file must export an ObjectQL instance');
|
|
274
|
+
}
|
|
275
|
+
await app.init();
|
|
276
|
+
return app;
|
|
277
|
+
}
|
|
278
|
+
async function createMigrationsTable(app) {
|
|
279
|
+
// Create a system object to track migrations
|
|
280
|
+
app.metadata.register('object', {
|
|
281
|
+
name: '_migrations',
|
|
282
|
+
label: 'Migrations',
|
|
283
|
+
system: true,
|
|
284
|
+
fields: {
|
|
285
|
+
name: {
|
|
286
|
+
type: 'text',
|
|
287
|
+
label: 'Migration Name',
|
|
288
|
+
required: true,
|
|
289
|
+
unique: true
|
|
290
|
+
},
|
|
291
|
+
run_at: {
|
|
292
|
+
type: 'datetime',
|
|
293
|
+
label: 'Run At',
|
|
294
|
+
required: true
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
// Sync to database
|
|
299
|
+
await app.getObject('_migrations').sync();
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|