@friggframework/devtools 2.0.0--canary.490.de9ed00.0 → 2.0.0--canary.493.f8d621f.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/infrastructure/domains/networking/vpc-builder.js +2 -159
- package/infrastructure/domains/networking/vpc-builder.test.js +0 -140
- package/infrastructure/domains/networking/vpc-resolver.js +10 -57
- package/infrastructure/domains/networking/vpc-resolver.test.js +0 -40
- package/infrastructure/domains/shared/cloudformation-discovery.js +5 -157
- package/infrastructure/domains/shared/cloudformation-discovery.test.js +0 -218
- package/infrastructure/domains/shared/providers/aws-provider-adapter.js +0 -23
- package/infrastructure/domains/shared/resource-discovery.js +5 -17
- package/infrastructure/domains/shared/resource-discovery.test.js +0 -36
- package/infrastructure/scripts/build-prisma-layer.js +81 -8
- package/infrastructure/scripts/build-prisma-layer.test.js +53 -1
- package/infrastructure/scripts/verify-prisma-layer.js +72 -0
- package/package.json +7 -7
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* The CLI is only needed for migrations and is packaged separately with the dbMigrate function.
|
|
11
11
|
*
|
|
12
12
|
* The layer is configured based on AppDefinition database settings:
|
|
13
|
-
* - PostgreSQL: Includes PostgreSQL client + query engine
|
|
14
|
-
* - MongoDB: Includes MongoDB client + query engine
|
|
13
|
+
* - PostgreSQL: Includes PostgreSQL client + query engine + migrations
|
|
14
|
+
* - MongoDB: Includes MongoDB client + query engine + migrations (if needed)
|
|
15
15
|
* - Defaults to PostgreSQL only if not specified
|
|
16
16
|
*
|
|
17
17
|
* Usage:
|
|
@@ -22,7 +22,11 @@
|
|
|
22
22
|
* layers/prisma/nodejs/node_modules/
|
|
23
23
|
* ├── @prisma/client (runtime only, ~10-15MB)
|
|
24
24
|
* ├── generated/prisma-postgresql (if PostgreSQL enabled)
|
|
25
|
+
* │ ├── schema.prisma
|
|
26
|
+
* │ └── migrations/
|
|
25
27
|
* └── generated/prisma-mongodb (if MongoDB enabled)
|
|
28
|
+
* ├── schema.prisma
|
|
29
|
+
* └── migrations/
|
|
26
30
|
*
|
|
27
31
|
* See: LAMBDA-LAYER-PRISMA.md for complete documentation
|
|
28
32
|
*/
|
|
@@ -85,6 +89,27 @@ function getGeneratedClientPackages(databaseConfig = {}) {
|
|
|
85
89
|
return packages;
|
|
86
90
|
}
|
|
87
91
|
|
|
92
|
+
function getMigrationsPackages(clientPackages) {
|
|
93
|
+
return clientPackages.map(pkg => ({
|
|
94
|
+
dbType: pkg.replace('generated/prisma-', ''),
|
|
95
|
+
clientPackage: pkg
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function getMigrationSourcePath(searchPaths, dbType) {
|
|
100
|
+
for (const searchPath of searchPaths) {
|
|
101
|
+
const candidatePath = path.join(searchPath, `prisma-${dbType}`, 'migrations');
|
|
102
|
+
if (fs.existsSync(candidatePath)) {
|
|
103
|
+
return candidatePath;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function getMigrationDestinationPath(layerNodeModules, clientPackage) {
|
|
110
|
+
return path.join(layerNodeModules, clientPackage, 'migrations');
|
|
111
|
+
}
|
|
112
|
+
|
|
88
113
|
// Configuration
|
|
89
114
|
// Script runs from integration project root (e.g., backend/)
|
|
90
115
|
// and reads Prisma packages from @friggframework/core
|
|
@@ -299,11 +324,47 @@ async function copyPrismaPackages(clientPackages) {
|
|
|
299
324
|
logSuccess(`Copied ${copiedCount} generated client packages from @friggframework/core`);
|
|
300
325
|
}
|
|
301
326
|
|
|
327
|
+
async function copyMigrations(clientPackages) {
|
|
328
|
+
logStep(5, 'Copying migrations from @friggframework/core');
|
|
329
|
+
|
|
330
|
+
const workspaceNodeModules = path.join(path.dirname(CORE_PACKAGE_PATH), '..');
|
|
331
|
+
const searchPaths = [
|
|
332
|
+
path.join(CORE_PACKAGE_PATH, 'node_modules'),
|
|
333
|
+
path.join(PROJECT_ROOT, 'node_modules'),
|
|
334
|
+
workspaceNodeModules,
|
|
335
|
+
CORE_PACKAGE_PATH,
|
|
336
|
+
];
|
|
337
|
+
|
|
338
|
+
const migrations = getMigrationsPackages(clientPackages);
|
|
339
|
+
let copiedCount = 0;
|
|
340
|
+
|
|
341
|
+
for (const { dbType, clientPackage } of migrations) {
|
|
342
|
+
const sourcePath = getMigrationSourcePath(searchPaths, dbType);
|
|
343
|
+
|
|
344
|
+
if (sourcePath) {
|
|
345
|
+
const destPath = getMigrationDestinationPath(LAYER_NODE_MODULES, clientPackage);
|
|
346
|
+
await fs.copy(sourcePath, destPath, { dereference: true });
|
|
347
|
+
|
|
348
|
+
const fromLocation = sourcePath.includes('@friggframework/core/prisma')
|
|
349
|
+
? 'core package'
|
|
350
|
+
: 'workspace';
|
|
351
|
+
logSuccess(`Copied migrations for ${dbType} (from ${fromLocation})`);
|
|
352
|
+
copiedCount++;
|
|
353
|
+
} else {
|
|
354
|
+
logWarning(`Migrations not found for ${dbType} - this may cause migration failures`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (copiedCount > 0) {
|
|
359
|
+
logSuccess(`Copied migrations for ${copiedCount} database ${copiedCount === 1 ? 'type' : 'types'}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
302
363
|
/**
|
|
303
364
|
* Remove unnecessary files to reduce layer size
|
|
304
365
|
*/
|
|
305
366
|
async function removeUnnecessaryFiles() {
|
|
306
|
-
logStep(
|
|
367
|
+
logStep(6, 'Removing unnecessary files (source maps, docs, tests)');
|
|
307
368
|
|
|
308
369
|
let removedCount = 0;
|
|
309
370
|
let totalSize = 0;
|
|
@@ -341,7 +402,7 @@ async function removeUnnecessaryFiles() {
|
|
|
341
402
|
* Remove non-rhel engine binaries to reduce layer size
|
|
342
403
|
*/
|
|
343
404
|
async function removeNonRhelBinaries() {
|
|
344
|
-
logStep(
|
|
405
|
+
logStep(7, 'Removing non-rhel engine binaries');
|
|
345
406
|
|
|
346
407
|
let removedCount = 0;
|
|
347
408
|
let totalSize = 0;
|
|
@@ -380,7 +441,7 @@ async function removeNonRhelBinaries() {
|
|
|
380
441
|
* @param {Array} expectedClients - List of client packages that should have binaries
|
|
381
442
|
*/
|
|
382
443
|
async function verifyRhelBinaries(expectedClients) {
|
|
383
|
-
logStep(
|
|
444
|
+
logStep(8, 'Verifying rhel-openssl-3.0.x binaries are present');
|
|
384
445
|
|
|
385
446
|
try {
|
|
386
447
|
const findCmd = `find "${LAYER_NODE_MODULES}" -name "*rhel-openssl-3.0.x*" 2>/dev/null || true`;
|
|
@@ -414,7 +475,7 @@ async function verifyRhelBinaries(expectedClients) {
|
|
|
414
475
|
* @param {Array} clientPackages - Generated client packages that were included
|
|
415
476
|
*/
|
|
416
477
|
async function verifyLayerStructure(clientPackages) {
|
|
417
|
-
logStep(
|
|
478
|
+
logStep(9, 'Verifying layer structure (runtime only)');
|
|
418
479
|
|
|
419
480
|
const requiredPaths = [
|
|
420
481
|
'@prisma/client/runtime',
|
|
@@ -426,6 +487,11 @@ async function verifyLayerStructure(clientPackages) {
|
|
|
426
487
|
requiredPaths.push(`${pkg}/schema.prisma`);
|
|
427
488
|
}
|
|
428
489
|
|
|
490
|
+
// Add migrations directory for each included client
|
|
491
|
+
for (const pkg of clientPackages) {
|
|
492
|
+
requiredPaths.push(`${pkg}/migrations/migration_lock.toml`);
|
|
493
|
+
}
|
|
494
|
+
|
|
429
495
|
// Verify CLI is NOT present (keeps layer small)
|
|
430
496
|
const forbiddenPaths = [
|
|
431
497
|
'prisma/build',
|
|
@@ -463,7 +529,7 @@ async function verifyLayerStructure(clientPackages) {
|
|
|
463
529
|
* Calculate and display final layer size
|
|
464
530
|
*/
|
|
465
531
|
async function displayLayerSummary() {
|
|
466
|
-
logStep(
|
|
532
|
+
logStep(10, 'Layer build summary');
|
|
467
533
|
|
|
468
534
|
const layerSizeMB = getDirectorySize(LAYER_OUTPUT_PATH);
|
|
469
535
|
|
|
@@ -514,6 +580,7 @@ async function buildPrismaLayer(databaseConfig = {}) {
|
|
|
514
580
|
await createLayerStructure();
|
|
515
581
|
await installPrismaPackages(); // Install runtime client only (NO CLI)
|
|
516
582
|
await copyPrismaPackages(clientPackages); // Copy generated clients from core
|
|
583
|
+
await copyMigrations(clientPackages); // Copy migrations from core
|
|
517
584
|
await removeUnnecessaryFiles(); // Remove source maps, docs, tests (37MB+)
|
|
518
585
|
await removeNonRhelBinaries(); // Remove non-Linux binaries
|
|
519
586
|
await verifyRhelBinaries(clientPackages); // Verify query engines present
|
|
@@ -550,4 +617,10 @@ if (require.main === module) {
|
|
|
550
617
|
.catch(() => process.exit(1));
|
|
551
618
|
}
|
|
552
619
|
|
|
553
|
-
module.exports = {
|
|
620
|
+
module.exports = {
|
|
621
|
+
buildPrismaLayer,
|
|
622
|
+
getGeneratedClientPackages,
|
|
623
|
+
getMigrationsPackages,
|
|
624
|
+
getMigrationSourcePath,
|
|
625
|
+
getMigrationDestinationPath
|
|
626
|
+
};
|
|
@@ -3,7 +3,12 @@
|
|
|
3
3
|
* Validates database client selection logic
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const {
|
|
6
|
+
const {
|
|
7
|
+
getGeneratedClientPackages,
|
|
8
|
+
getMigrationsPackages,
|
|
9
|
+
getMigrationSourcePath,
|
|
10
|
+
getMigrationDestinationPath
|
|
11
|
+
} = require('./build-prisma-layer');
|
|
7
12
|
|
|
8
13
|
// Mock the log function
|
|
9
14
|
jest.mock('./build-prisma-layer', () => {
|
|
@@ -11,6 +16,9 @@ jest.mock('./build-prisma-layer', () => {
|
|
|
11
16
|
return {
|
|
12
17
|
...actual,
|
|
13
18
|
getGeneratedClientPackages: actual.getGeneratedClientPackages,
|
|
19
|
+
getMigrationsPackages: actual.getMigrationsPackages,
|
|
20
|
+
getMigrationSourcePath: actual.getMigrationSourcePath,
|
|
21
|
+
getMigrationDestinationPath: actual.getMigrationDestinationPath,
|
|
14
22
|
};
|
|
15
23
|
});
|
|
16
24
|
|
|
@@ -99,4 +107,48 @@ describe('getGeneratedClientPackages()', () => {
|
|
|
99
107
|
});
|
|
100
108
|
});
|
|
101
109
|
|
|
110
|
+
describe('getMigrationsPackages()', () => {
|
|
111
|
+
it('should extract database types from client packages', () => {
|
|
112
|
+
const clientPackages = ['generated/prisma-postgresql', 'generated/prisma-mongodb'];
|
|
113
|
+
const migrations = getMigrationsPackages(clientPackages);
|
|
102
114
|
|
|
115
|
+
expect(migrations).toEqual([
|
|
116
|
+
{ dbType: 'postgresql', clientPackage: 'generated/prisma-postgresql' },
|
|
117
|
+
{ dbType: 'mongodb', clientPackage: 'generated/prisma-mongodb' }
|
|
118
|
+
]);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('should handle single client package', () => {
|
|
122
|
+
const clientPackages = ['generated/prisma-postgresql'];
|
|
123
|
+
const migrations = getMigrationsPackages(clientPackages);
|
|
124
|
+
|
|
125
|
+
expect(migrations).toEqual([
|
|
126
|
+
{ dbType: 'postgresql', clientPackage: 'generated/prisma-postgresql' }
|
|
127
|
+
]);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should handle empty array', () => {
|
|
131
|
+
const migrations = getMigrationsPackages([]);
|
|
132
|
+
expect(migrations).toEqual([]);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
describe('getMigrationSourcePath()', () => {
|
|
137
|
+
it('should return correct source path for database type', () => {
|
|
138
|
+
const searchPaths = ['/workspace/packages/core'];
|
|
139
|
+
const dbType = 'postgresql';
|
|
140
|
+
|
|
141
|
+
const sourcePath = getMigrationSourcePath(searchPaths, dbType);
|
|
142
|
+
expect(sourcePath).toBe('/workspace/packages/core/prisma-postgresql/migrations');
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe('getMigrationDestinationPath()', () => {
|
|
147
|
+
it('should return correct destination path for client package', () => {
|
|
148
|
+
const layerNodeModules = '/layers/prisma/nodejs/node_modules';
|
|
149
|
+
const clientPackage = 'generated/prisma-postgresql';
|
|
150
|
+
|
|
151
|
+
const destPath = getMigrationDestinationPath(layerNodeModules, clientPackage);
|
|
152
|
+
expect(destPath).toBe('/layers/prisma/nodejs/node_modules/generated/prisma-postgresql/migrations');
|
|
153
|
+
});
|
|
154
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
const PROJECT_ROOT = process.cwd();
|
|
7
|
+
const LAYER_PATH = path.join(PROJECT_ROOT, 'layers/prisma/nodejs/node_modules');
|
|
8
|
+
|
|
9
|
+
async function verifyLayerStructure() {
|
|
10
|
+
console.log('Verifying Prisma layer structure...\n');
|
|
11
|
+
|
|
12
|
+
const checks = [
|
|
13
|
+
{
|
|
14
|
+
name: 'PostgreSQL schema',
|
|
15
|
+
path: 'generated/prisma-postgresql/schema.prisma'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'PostgreSQL migrations directory',
|
|
19
|
+
path: 'generated/prisma-postgresql/migrations'
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'PostgreSQL migration_lock.toml',
|
|
23
|
+
path: 'generated/prisma-postgresql/migrations/migration_lock.toml'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: '@prisma/client runtime',
|
|
27
|
+
path: '@prisma/client/runtime'
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
let allPassed = true;
|
|
32
|
+
|
|
33
|
+
for (const check of checks) {
|
|
34
|
+
const fullPath = path.join(LAYER_PATH, check.path);
|
|
35
|
+
const exists = await fs.pathExists(fullPath);
|
|
36
|
+
|
|
37
|
+
if (exists) {
|
|
38
|
+
console.log(`✓ ${check.name}`);
|
|
39
|
+
} else {
|
|
40
|
+
console.log(`✗ ${check.name} (missing)`);
|
|
41
|
+
allPassed = false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.log('\n');
|
|
46
|
+
|
|
47
|
+
if (allPassed) {
|
|
48
|
+
console.log('✓ All checks passed!');
|
|
49
|
+
const migrationsPath = path.join(LAYER_PATH, 'generated/prisma-postgresql/migrations');
|
|
50
|
+
const migrationFiles = await fs.readdir(migrationsPath);
|
|
51
|
+
console.log(`\nFound ${migrationFiles.length} items in migrations directory:`);
|
|
52
|
+
migrationFiles.forEach(file => {
|
|
53
|
+
console.log(` - ${file}`);
|
|
54
|
+
});
|
|
55
|
+
return 0;
|
|
56
|
+
} else {
|
|
57
|
+
console.log('✗ Some checks failed!');
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (require.main === module) {
|
|
63
|
+
verifyLayerStructure()
|
|
64
|
+
.then(code => process.exit(code))
|
|
65
|
+
.catch(err => {
|
|
66
|
+
console.error('Error:', err.message);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = { verifyLayerStructure };
|
|
72
|
+
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@friggframework/devtools",
|
|
3
3
|
"prettier": "@friggframework/prettier-config",
|
|
4
|
-
"version": "2.0.0--canary.
|
|
4
|
+
"version": "2.0.0--canary.493.f8d621f.0",
|
|
5
5
|
"bin": {
|
|
6
6
|
"frigg": "./frigg-cli/index.js"
|
|
7
7
|
},
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
"@babel/eslint-parser": "^7.18.9",
|
|
17
17
|
"@babel/parser": "^7.25.3",
|
|
18
18
|
"@babel/traverse": "^7.25.3",
|
|
19
|
-
"@friggframework/core": "2.0.0--canary.
|
|
20
|
-
"@friggframework/schemas": "2.0.0--canary.
|
|
21
|
-
"@friggframework/test": "2.0.0--canary.
|
|
19
|
+
"@friggframework/core": "2.0.0--canary.493.f8d621f.0",
|
|
20
|
+
"@friggframework/schemas": "2.0.0--canary.493.f8d621f.0",
|
|
21
|
+
"@friggframework/test": "2.0.0--canary.493.f8d621f.0",
|
|
22
22
|
"@hapi/boom": "^10.0.1",
|
|
23
23
|
"@inquirer/prompts": "^5.3.8",
|
|
24
24
|
"axios": "^1.7.2",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"validate-npm-package-name": "^5.0.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@friggframework/eslint-config": "2.0.0--canary.
|
|
50
|
-
"@friggframework/prettier-config": "2.0.0--canary.
|
|
49
|
+
"@friggframework/eslint-config": "2.0.0--canary.493.f8d621f.0",
|
|
50
|
+
"@friggframework/prettier-config": "2.0.0--canary.493.f8d621f.0",
|
|
51
51
|
"aws-sdk-client-mock": "^4.1.0",
|
|
52
52
|
"aws-sdk-client-mock-jest": "^4.1.0",
|
|
53
53
|
"jest": "^30.1.3",
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"publishConfig": {
|
|
80
80
|
"access": "public"
|
|
81
81
|
},
|
|
82
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "f8d621f5fdc06756c1351e99a4686767a46f7064"
|
|
83
83
|
}
|