@authrim/setup 0.1.63 → 0.1.64
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/__tests__/migrate.test.d.ts +5 -0
- package/dist/__tests__/migrate.test.d.ts.map +1 -0
- package/dist/__tests__/migrate.test.js +273 -0
- package/dist/__tests__/migrate.test.js.map +1 -0
- package/dist/__tests__/paths.test.d.ts +2 -0
- package/dist/__tests__/paths.test.d.ts.map +1 -0
- package/dist/__tests__/paths.test.js +257 -0
- package/dist/__tests__/paths.test.js.map +1 -0
- package/dist/cli/commands/config.d.ts +1 -0
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +41 -7
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/deploy.d.ts +1 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -1
- package/dist/cli/commands/deploy.js +181 -19
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +267 -82
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts +21 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +166 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/core/admin.d.ts +18 -1
- package/dist/core/admin.d.ts.map +1 -1
- package/dist/core/admin.js +36 -7
- package/dist/core/admin.js.map +1 -1
- package/dist/core/config.d.ts +10 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +6 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/keys.d.ts +55 -4
- package/dist/core/keys.d.ts.map +1 -1
- package/dist/core/keys.js +104 -12
- package/dist/core/keys.js.map +1 -1
- package/dist/core/lock.d.ts +60 -3
- package/dist/core/lock.d.ts.map +1 -1
- package/dist/core/lock.js +108 -4
- package/dist/core/lock.js.map +1 -1
- package/dist/core/migrate.d.ts +95 -0
- package/dist/core/migrate.d.ts.map +1 -0
- package/dist/core/migrate.js +549 -0
- package/dist/core/migrate.js.map +1 -0
- package/dist/core/paths.d.ts +171 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +319 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/wrangler-sync.d.ts +88 -0
- package/dist/core/wrangler-sync.d.ts.map +1 -0
- package/dist/core/wrangler-sync.js +242 -0
- package/dist/core/wrangler-sync.js.map +1 -0
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/web/api.d.ts.map +1 -1
- package/dist/web/api.js +102 -28
- package/dist/web/api.js.map +1 -1
- package/dist/web/ui.d.ts.map +1 -1
- package/dist/web/ui.js +831 -273
- package/dist/web/ui.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Module
|
|
3
|
+
*
|
|
4
|
+
* Handles migration from legacy flat file structure to new unified
|
|
5
|
+
* .authrim/{env}/ directory structure.
|
|
6
|
+
*
|
|
7
|
+
* Legacy structure:
|
|
8
|
+
* project/
|
|
9
|
+
* ├── authrim-config.json
|
|
10
|
+
* ├── authrim-lock.json
|
|
11
|
+
* └── .keys/{env}/
|
|
12
|
+
*
|
|
13
|
+
* New structure:
|
|
14
|
+
* project/
|
|
15
|
+
* └── .authrim/
|
|
16
|
+
* └── {env}/
|
|
17
|
+
* ├── config.json
|
|
18
|
+
* ├── lock.json
|
|
19
|
+
* ├── version.txt
|
|
20
|
+
* └── keys/
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync } from 'node:fs';
|
|
23
|
+
import { mkdir, copyFile, readFile, writeFile, readdir, rm, chmod } from 'node:fs/promises';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import { createRequire } from 'node:module';
|
|
26
|
+
import { LEGACY_CONFIG_FILE, LEGACY_LOCK_FILE, LEGACY_KEYS_DIR, getEnvironmentPaths, getLegacyPaths, detectStructure, listEnvironments, validateEnvName, } from './paths.js';
|
|
27
|
+
import { AuthrimConfigSchema } from './config.js';
|
|
28
|
+
import { AuthrimLockSchema } from './lock.js';
|
|
29
|
+
import { saveMasterWranglerConfigs } from './wrangler-sync.js';
|
|
30
|
+
// File permission constants
|
|
31
|
+
const SENSITIVE_FILE_MODE = 0o600; // Owner read/write only
|
|
32
|
+
const DIRECTORY_MODE = 0o700; // Owner read/write/execute only
|
|
33
|
+
// Get package version
|
|
34
|
+
const require = createRequire(import.meta.url);
|
|
35
|
+
function getVersion() {
|
|
36
|
+
try {
|
|
37
|
+
const pkg = require('../../package.json');
|
|
38
|
+
return pkg.version;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return '0.0.0';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// Migration Detection
|
|
46
|
+
// =============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* Check if migration from legacy structure is needed
|
|
49
|
+
*/
|
|
50
|
+
export function needsMigration(baseDir = process.cwd()) {
|
|
51
|
+
const structure = detectStructure(baseDir);
|
|
52
|
+
return structure.type === 'legacy';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get list of environments that need migration
|
|
56
|
+
*/
|
|
57
|
+
export function getEnvironmentsToMigrate(baseDir = process.cwd()) {
|
|
58
|
+
const legacyConfigPath = join(baseDir, LEGACY_CONFIG_FILE);
|
|
59
|
+
const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR);
|
|
60
|
+
const environments = [];
|
|
61
|
+
// Check if legacy config exists and extract environment from it
|
|
62
|
+
if (existsSync(legacyConfigPath)) {
|
|
63
|
+
try {
|
|
64
|
+
const content = require('fs').readFileSync(legacyConfigPath, 'utf-8');
|
|
65
|
+
const config = JSON.parse(content);
|
|
66
|
+
if (config.environment?.prefix) {
|
|
67
|
+
environments.push(config.environment.prefix);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Ignore parse errors
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Also check for environments in .keys directory
|
|
75
|
+
if (existsSync(legacyKeysDir)) {
|
|
76
|
+
try {
|
|
77
|
+
const entries = require('fs').readdirSync(legacyKeysDir, { withFileTypes: true });
|
|
78
|
+
for (const entry of entries) {
|
|
79
|
+
if (entry.isDirectory() && !environments.includes(entry.name)) {
|
|
80
|
+
environments.push(entry.name);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Ignore errors
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return environments;
|
|
89
|
+
}
|
|
90
|
+
// =============================================================================
|
|
91
|
+
// Backup
|
|
92
|
+
// =============================================================================
|
|
93
|
+
/**
|
|
94
|
+
* Create a backup of legacy files before migration
|
|
95
|
+
*/
|
|
96
|
+
export async function createBackup(baseDir = process.cwd(), onProgress) {
|
|
97
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
98
|
+
const backupDir = join(baseDir, `.authrim-backup-${timestamp}`);
|
|
99
|
+
const files = [];
|
|
100
|
+
try {
|
|
101
|
+
onProgress?.(`Creating backup at ${backupDir}`);
|
|
102
|
+
// Create backup directory
|
|
103
|
+
await mkdir(backupDir, { recursive: true });
|
|
104
|
+
// Backup legacy config
|
|
105
|
+
const legacyConfigPath = join(baseDir, LEGACY_CONFIG_FILE);
|
|
106
|
+
if (existsSync(legacyConfigPath)) {
|
|
107
|
+
const destPath = join(backupDir, LEGACY_CONFIG_FILE);
|
|
108
|
+
await copyFile(legacyConfigPath, destPath);
|
|
109
|
+
files.push(LEGACY_CONFIG_FILE);
|
|
110
|
+
onProgress?.(` Backed up ${LEGACY_CONFIG_FILE}`);
|
|
111
|
+
}
|
|
112
|
+
// Backup legacy lock file
|
|
113
|
+
const legacyLockPath = join(baseDir, LEGACY_LOCK_FILE);
|
|
114
|
+
if (existsSync(legacyLockPath)) {
|
|
115
|
+
const destPath = join(backupDir, LEGACY_LOCK_FILE);
|
|
116
|
+
await copyFile(legacyLockPath, destPath);
|
|
117
|
+
files.push(LEGACY_LOCK_FILE);
|
|
118
|
+
onProgress?.(` Backed up ${LEGACY_LOCK_FILE}`);
|
|
119
|
+
}
|
|
120
|
+
// Backup .keys directory
|
|
121
|
+
const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR);
|
|
122
|
+
if (existsSync(legacyKeysDir)) {
|
|
123
|
+
const backupKeysDir = join(backupDir, LEGACY_KEYS_DIR);
|
|
124
|
+
await copyDirectoryRecursive(legacyKeysDir, backupKeysDir, files, LEGACY_KEYS_DIR);
|
|
125
|
+
onProgress?.(` Backed up ${LEGACY_KEYS_DIR}/`);
|
|
126
|
+
}
|
|
127
|
+
onProgress?.(`Backup complete: ${files.length} files`);
|
|
128
|
+
return {
|
|
129
|
+
success: true,
|
|
130
|
+
backupPath: backupDir,
|
|
131
|
+
files,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
backupPath: backupDir,
|
|
138
|
+
error: error instanceof Error ? error.message : String(error),
|
|
139
|
+
files,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if a file is sensitive (keys, secrets)
|
|
145
|
+
*/
|
|
146
|
+
function isSensitiveFile(filename) {
|
|
147
|
+
return (filename.endsWith('.pem') ||
|
|
148
|
+
filename.endsWith('.key') ||
|
|
149
|
+
filename.includes('secret') ||
|
|
150
|
+
filename.includes('private') ||
|
|
151
|
+
filename.includes('token'));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Recursively copy a directory with security checks
|
|
155
|
+
*/
|
|
156
|
+
async function copyDirectoryRecursive(src, dest, files, relativePath) {
|
|
157
|
+
await mkdir(dest, { recursive: true, mode: DIRECTORY_MODE });
|
|
158
|
+
const entries = await readdir(src, { withFileTypes: true });
|
|
159
|
+
for (const entry of entries) {
|
|
160
|
+
const srcPath = join(src, entry.name);
|
|
161
|
+
const destPath = join(dest, entry.name);
|
|
162
|
+
const relPath = join(relativePath, entry.name);
|
|
163
|
+
// Security: Skip symbolic links to prevent symlink attacks
|
|
164
|
+
if (entry.isSymbolicLink()) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (entry.isDirectory()) {
|
|
168
|
+
await copyDirectoryRecursive(srcPath, destPath, files, relPath);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
await copyFile(srcPath, destPath);
|
|
172
|
+
files.push(relPath);
|
|
173
|
+
// Security: Set restrictive permissions on sensitive files
|
|
174
|
+
if (isSensitiveFile(entry.name)) {
|
|
175
|
+
await chmod(destPath, SENSITIVE_FILE_MODE);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// =============================================================================
|
|
181
|
+
// Migration
|
|
182
|
+
// =============================================================================
|
|
183
|
+
/**
|
|
184
|
+
* Migrate from legacy structure to new unified structure
|
|
185
|
+
*/
|
|
186
|
+
export async function migrateToNewStructure(options = {}) {
|
|
187
|
+
const { baseDir = process.cwd(), env, dryRun = false, noBackup = false, deleteLegacy = false, onProgress, } = options;
|
|
188
|
+
const result = {
|
|
189
|
+
success: false,
|
|
190
|
+
migratedEnvs: [],
|
|
191
|
+
errors: [],
|
|
192
|
+
migratedFiles: [],
|
|
193
|
+
};
|
|
194
|
+
// Check if migration is needed
|
|
195
|
+
const structure = detectStructure(baseDir);
|
|
196
|
+
if (structure.type !== 'legacy') {
|
|
197
|
+
if (structure.type === 'new') {
|
|
198
|
+
onProgress?.('Already using new directory structure');
|
|
199
|
+
result.success = true;
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
result.errors.push('No configuration files found to migrate');
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Determine environments to migrate
|
|
208
|
+
const environments = env ? [env] : getEnvironmentsToMigrate(baseDir);
|
|
209
|
+
if (environments.length === 0) {
|
|
210
|
+
result.errors.push('No environments detected for migration');
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
onProgress?.(`Environments to migrate: ${environments.join(', ')}`);
|
|
214
|
+
// Create backup (unless skipped or dry run)
|
|
215
|
+
if (!noBackup && !dryRun) {
|
|
216
|
+
onProgress?.('\nCreating backup...');
|
|
217
|
+
const backupResult = await createBackup(baseDir, onProgress);
|
|
218
|
+
if (!backupResult.success) {
|
|
219
|
+
result.errors.push(`Backup failed: ${backupResult.error}`);
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
result.backupPath = backupResult.backupPath;
|
|
223
|
+
}
|
|
224
|
+
// Migrate each environment
|
|
225
|
+
for (const envName of environments) {
|
|
226
|
+
onProgress?.(`\nMigrating environment: ${envName}`);
|
|
227
|
+
try {
|
|
228
|
+
const envResult = await migrateEnvironment(baseDir, envName, dryRun, onProgress);
|
|
229
|
+
if (envResult.success) {
|
|
230
|
+
result.migratedEnvs.push(envName);
|
|
231
|
+
result.migratedFiles.push(...envResult.files);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
result.errors.push(...envResult.errors);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
result.errors.push(`Failed to migrate ${envName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Delete legacy files if requested and migration succeeded
|
|
242
|
+
if (deleteLegacy && !dryRun && result.migratedEnvs.length > 0 && result.errors.length === 0) {
|
|
243
|
+
onProgress?.('\nCleaning up legacy files...');
|
|
244
|
+
await deleteLegacyFiles(baseDir, onProgress);
|
|
245
|
+
}
|
|
246
|
+
result.success = result.errors.length === 0 && result.migratedEnvs.length > 0;
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Migrate a single environment
|
|
251
|
+
*/
|
|
252
|
+
async function migrateEnvironment(baseDir, env, dryRun, onProgress) {
|
|
253
|
+
const files = [];
|
|
254
|
+
const errors = [];
|
|
255
|
+
// Security: Validate environment name to prevent path traversal
|
|
256
|
+
if (!validateEnvName(env)) {
|
|
257
|
+
errors.push(`Invalid environment name: ${env}. Must start with lowercase letter and contain only lowercase letters, numbers, and hyphens.`);
|
|
258
|
+
return { success: false, files, errors };
|
|
259
|
+
}
|
|
260
|
+
const newPaths = getEnvironmentPaths({ baseDir, env });
|
|
261
|
+
const legacyPaths = getLegacyPaths(baseDir, env);
|
|
262
|
+
// Create new directory structure with secure permissions
|
|
263
|
+
if (!dryRun) {
|
|
264
|
+
await mkdir(newPaths.root, { recursive: true, mode: DIRECTORY_MODE });
|
|
265
|
+
await mkdir(newPaths.keys, { recursive: true, mode: DIRECTORY_MODE });
|
|
266
|
+
onProgress?.(` Created ${newPaths.root}`);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
onProgress?.(` Would create ${newPaths.root}`);
|
|
270
|
+
}
|
|
271
|
+
// Migrate config.json
|
|
272
|
+
if (existsSync(legacyPaths.config)) {
|
|
273
|
+
try {
|
|
274
|
+
const content = await readFile(legacyPaths.config, 'utf-8');
|
|
275
|
+
const config = JSON.parse(content);
|
|
276
|
+
// Update secretsPath to relative path within new structure
|
|
277
|
+
if (config.keys) {
|
|
278
|
+
config.keys.secretsPath = './keys/';
|
|
279
|
+
}
|
|
280
|
+
if (!dryRun) {
|
|
281
|
+
await writeFile(newPaths.config, JSON.stringify(config, null, 2));
|
|
282
|
+
onProgress?.(` Migrated config.json`);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
onProgress?.(` Would migrate config.json`);
|
|
286
|
+
}
|
|
287
|
+
files.push(newPaths.config);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
errors.push(`Failed to migrate config: ${error instanceof Error ? error.message : String(error)}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Migrate lock.json
|
|
294
|
+
if (existsSync(legacyPaths.lock)) {
|
|
295
|
+
try {
|
|
296
|
+
const content = await readFile(legacyPaths.lock, 'utf-8');
|
|
297
|
+
const lock = JSON.parse(content);
|
|
298
|
+
if (!dryRun) {
|
|
299
|
+
await writeFile(newPaths.lock, JSON.stringify(lock, null, 2));
|
|
300
|
+
onProgress?.(` Migrated lock.json`);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
onProgress?.(` Would migrate lock.json`);
|
|
304
|
+
}
|
|
305
|
+
files.push(newPaths.lock);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
errors.push(`Failed to migrate lock: ${error instanceof Error ? error.message : String(error)}`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Migrate keys directory
|
|
312
|
+
const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR, env);
|
|
313
|
+
if (existsSync(legacyKeysDir)) {
|
|
314
|
+
try {
|
|
315
|
+
const keyFiles = await readdir(legacyKeysDir, { withFileTypes: true });
|
|
316
|
+
let migratedCount = 0;
|
|
317
|
+
for (const entry of keyFiles) {
|
|
318
|
+
// Security: Skip symbolic links to prevent symlink attacks
|
|
319
|
+
if (entry.isSymbolicLink() || entry.isDirectory()) {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const srcPath = join(legacyKeysDir, entry.name);
|
|
323
|
+
const destPath = join(newPaths.keys, entry.name);
|
|
324
|
+
if (!dryRun) {
|
|
325
|
+
await copyFile(srcPath, destPath);
|
|
326
|
+
// Security: Set restrictive permissions on sensitive files
|
|
327
|
+
if (isSensitiveFile(entry.name)) {
|
|
328
|
+
await chmod(destPath, SENSITIVE_FILE_MODE);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
files.push(destPath);
|
|
332
|
+
migratedCount++;
|
|
333
|
+
}
|
|
334
|
+
if (!dryRun) {
|
|
335
|
+
onProgress?.(` Migrated ${migratedCount} key files`);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
onProgress?.(` Would migrate ${migratedCount} key files`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
errors.push(`Failed to migrate keys: ${error instanceof Error ? error.message : String(error)}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Create version.txt
|
|
346
|
+
const version = getVersion();
|
|
347
|
+
if (!dryRun) {
|
|
348
|
+
await writeFile(newPaths.version, version);
|
|
349
|
+
onProgress?.(` Created version.txt (${version})`);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
onProgress?.(` Would create version.txt (${version})`);
|
|
353
|
+
}
|
|
354
|
+
files.push(newPaths.version);
|
|
355
|
+
// Generate wrangler configs from migrated config and lock
|
|
356
|
+
// This is needed because legacy structure has no wrangler/ directory
|
|
357
|
+
if (existsSync(newPaths.config) && existsSync(newPaths.lock)) {
|
|
358
|
+
try {
|
|
359
|
+
const configContent = await readFile(newPaths.config, 'utf-8');
|
|
360
|
+
const lockContent = await readFile(newPaths.lock, 'utf-8');
|
|
361
|
+
const config = JSON.parse(configContent);
|
|
362
|
+
const lock = JSON.parse(lockContent);
|
|
363
|
+
// Build ResourceIds from lock file
|
|
364
|
+
// AuthrimLock has d1, kv, queues, r2 at the top level (not nested under resources)
|
|
365
|
+
const resourceIds = {
|
|
366
|
+
d1: {},
|
|
367
|
+
kv: {},
|
|
368
|
+
queues: {},
|
|
369
|
+
r2: {},
|
|
370
|
+
};
|
|
371
|
+
// Map D1 databases
|
|
372
|
+
if (lock.d1) {
|
|
373
|
+
for (const [binding, info] of Object.entries(lock.d1)) {
|
|
374
|
+
resourceIds.d1[binding] = { id: info.id, name: info.name };
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Map KV namespaces
|
|
378
|
+
if (lock.kv) {
|
|
379
|
+
for (const [binding, info] of Object.entries(lock.kv)) {
|
|
380
|
+
resourceIds.kv[binding] = { id: info.id, name: info.name };
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Map Queues (if present)
|
|
384
|
+
if (lock.queues) {
|
|
385
|
+
for (const [binding, info] of Object.entries(lock.queues)) {
|
|
386
|
+
if (resourceIds.queues) {
|
|
387
|
+
resourceIds.queues[binding] = { id: info.id, name: info.name };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// Map R2 buckets (if present)
|
|
392
|
+
if (lock.r2) {
|
|
393
|
+
for (const [binding, info] of Object.entries(lock.r2)) {
|
|
394
|
+
if (resourceIds.r2) {
|
|
395
|
+
resourceIds.r2[binding] = { name: info.name };
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// Generate and save wrangler configs
|
|
400
|
+
if (!dryRun) {
|
|
401
|
+
onProgress?.(' Generating wrangler configs...');
|
|
402
|
+
const wranglerResult = await saveMasterWranglerConfigs(config, resourceIds, {
|
|
403
|
+
baseDir,
|
|
404
|
+
env,
|
|
405
|
+
dryRun: false,
|
|
406
|
+
onProgress,
|
|
407
|
+
});
|
|
408
|
+
if (wranglerResult.success) {
|
|
409
|
+
files.push(...wranglerResult.files);
|
|
410
|
+
onProgress?.(` Generated ${wranglerResult.files.length} wrangler configs`);
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
for (const err of wranglerResult.errors) {
|
|
414
|
+
errors.push(`Wrangler generation: ${err}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
onProgress?.(` Would generate wrangler configs`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
// Non-fatal: wrangler generation failure doesn't fail the migration
|
|
424
|
+
onProgress?.(` Warning: Could not generate wrangler configs: ${error instanceof Error ? error.message : String(error)}`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return {
|
|
428
|
+
success: errors.length === 0,
|
|
429
|
+
files,
|
|
430
|
+
errors,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Delete legacy files after successful migration
|
|
435
|
+
*/
|
|
436
|
+
async function deleteLegacyFiles(baseDir, onProgress) {
|
|
437
|
+
// Delete legacy config
|
|
438
|
+
const legacyConfigPath = join(baseDir, LEGACY_CONFIG_FILE);
|
|
439
|
+
if (existsSync(legacyConfigPath)) {
|
|
440
|
+
await rm(legacyConfigPath);
|
|
441
|
+
onProgress?.(` Deleted ${LEGACY_CONFIG_FILE}`);
|
|
442
|
+
}
|
|
443
|
+
// Delete legacy lock
|
|
444
|
+
const legacyLockPath = join(baseDir, LEGACY_LOCK_FILE);
|
|
445
|
+
if (existsSync(legacyLockPath)) {
|
|
446
|
+
await rm(legacyLockPath);
|
|
447
|
+
onProgress?.(` Deleted ${LEGACY_LOCK_FILE}`);
|
|
448
|
+
}
|
|
449
|
+
// Delete legacy keys directory
|
|
450
|
+
const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR);
|
|
451
|
+
if (existsSync(legacyKeysDir)) {
|
|
452
|
+
await rm(legacyKeysDir, { recursive: true });
|
|
453
|
+
onProgress?.(` Deleted ${LEGACY_KEYS_DIR}/`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// =============================================================================
|
|
457
|
+
// Validation
|
|
458
|
+
// =============================================================================
|
|
459
|
+
/**
|
|
460
|
+
* Validate a migrated environment
|
|
461
|
+
*/
|
|
462
|
+
export async function validateMigration(baseDir, env) {
|
|
463
|
+
const issues = [];
|
|
464
|
+
const paths = getEnvironmentPaths({ baseDir, env });
|
|
465
|
+
// Check directory exists
|
|
466
|
+
if (!existsSync(paths.root)) {
|
|
467
|
+
issues.push(`Environment directory not found: ${paths.root}`);
|
|
468
|
+
return { valid: false, issues };
|
|
469
|
+
}
|
|
470
|
+
// Check config.json
|
|
471
|
+
if (!existsSync(paths.config)) {
|
|
472
|
+
issues.push('config.json not found');
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
try {
|
|
476
|
+
const content = await readFile(paths.config, 'utf-8');
|
|
477
|
+
const data = JSON.parse(content);
|
|
478
|
+
const result = AuthrimConfigSchema.safeParse(data);
|
|
479
|
+
if (!result.success) {
|
|
480
|
+
issues.push(`config.json validation failed: ${result.error.message}`);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
issues.push(`config.json read error: ${error instanceof Error ? error.message : String(error)}`);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// Check lock.json
|
|
488
|
+
if (!existsSync(paths.lock)) {
|
|
489
|
+
issues.push('lock.json not found');
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
try {
|
|
493
|
+
const content = await readFile(paths.lock, 'utf-8');
|
|
494
|
+
const data = JSON.parse(content);
|
|
495
|
+
const result = AuthrimLockSchema.safeParse(data);
|
|
496
|
+
if (!result.success) {
|
|
497
|
+
issues.push(`lock.json validation failed: ${result.error.message}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
issues.push(`lock.json read error: ${error instanceof Error ? error.message : String(error)}`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
// Check version.txt
|
|
505
|
+
if (!existsSync(paths.version)) {
|
|
506
|
+
issues.push('version.txt not found');
|
|
507
|
+
}
|
|
508
|
+
// Check keys directory
|
|
509
|
+
if (!existsSync(paths.keys)) {
|
|
510
|
+
issues.push('keys/ directory not found');
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
// Check for essential key files
|
|
514
|
+
const essentialKeys = ['private.pem', 'public.jwk.json'];
|
|
515
|
+
for (const keyFile of essentialKeys) {
|
|
516
|
+
if (!existsSync(join(paths.keys, keyFile))) {
|
|
517
|
+
issues.push(`Key file not found: ${keyFile}`);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return {
|
|
522
|
+
valid: issues.length === 0,
|
|
523
|
+
issues,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Get migration status summary
|
|
528
|
+
*/
|
|
529
|
+
export function getMigrationStatus(baseDir = process.cwd()) {
|
|
530
|
+
const structure = detectStructure(baseDir);
|
|
531
|
+
const legacyFiles = [];
|
|
532
|
+
if (existsSync(join(baseDir, LEGACY_CONFIG_FILE))) {
|
|
533
|
+
legacyFiles.push(LEGACY_CONFIG_FILE);
|
|
534
|
+
}
|
|
535
|
+
if (existsSync(join(baseDir, LEGACY_LOCK_FILE))) {
|
|
536
|
+
legacyFiles.push(LEGACY_LOCK_FILE);
|
|
537
|
+
}
|
|
538
|
+
if (existsSync(join(baseDir, LEGACY_KEYS_DIR))) {
|
|
539
|
+
legacyFiles.push(LEGACY_KEYS_DIR + '/');
|
|
540
|
+
}
|
|
541
|
+
const environments = structure.type === 'new' ? listEnvironments(baseDir) : getEnvironmentsToMigrate(baseDir);
|
|
542
|
+
return {
|
|
543
|
+
needsMigration: structure.type === 'legacy',
|
|
544
|
+
currentStructure: structure.type,
|
|
545
|
+
environments,
|
|
546
|
+
legacyFiles,
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"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"}
|