@platformatic/generators 1.17.0 → 1.19.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/lib/base-generator.d.ts +1 -1
- package/lib/base-generator.js +19 -3
- package/lib/utils.js +20 -1
- package/package.json +3 -2
- package/test/base-generator.test.js +153 -5
package/lib/base-generator.d.ts
CHANGED
|
@@ -88,7 +88,7 @@ export namespace BaseGenerator {
|
|
|
88
88
|
getFastifyVersion(): Promise<string>
|
|
89
89
|
getPlatformaticVersion(): Promise<string>
|
|
90
90
|
|
|
91
|
-
addPackage(pkg: PackageDefinition): void
|
|
91
|
+
addPackage(pkg: PackageDefinition): Promise<void>
|
|
92
92
|
|
|
93
93
|
prepare(): Promise<GeneratorMetadata>
|
|
94
94
|
run(): Promise<GeneratorMetadata>
|
package/lib/base-generator.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { readFile } = require('node:fs/promises')
|
|
4
|
-
const {
|
|
4
|
+
const {
|
|
5
|
+
stripVersion,
|
|
6
|
+
convertServiceNameToPrefix,
|
|
7
|
+
addPrefixToEnv,
|
|
8
|
+
extractEnvVariablesFromText,
|
|
9
|
+
getPackageConfigurationObject,
|
|
10
|
+
PLT_ROOT,
|
|
11
|
+
getLatestNpmVersion
|
|
12
|
+
} = require('./utils')
|
|
5
13
|
const { join } = require('node:path')
|
|
6
14
|
const { FileGenerator } = require('./file-generator')
|
|
7
15
|
const { generateTests, generatePlugins } = require('./create-plugin')
|
|
@@ -388,9 +396,17 @@ class BaseGenerator extends FileGenerator {
|
|
|
388
396
|
return metadata
|
|
389
397
|
}
|
|
390
398
|
|
|
391
|
-
addPackage (pkg) {
|
|
392
|
-
this.packages.push(pkg)
|
|
399
|
+
async addPackage (pkg) {
|
|
393
400
|
this.config.dependencies[pkg.name] = 'latest'
|
|
401
|
+
try {
|
|
402
|
+
const version = await getLatestNpmVersion(pkg.name)
|
|
403
|
+
if (version) {
|
|
404
|
+
this.config.dependencies[pkg.name] = version
|
|
405
|
+
}
|
|
406
|
+
} catch (err) {
|
|
407
|
+
this.logger.warn(`Could not get latest version for ${pkg.name}, setting it to latest`)
|
|
408
|
+
}
|
|
409
|
+
this.packages.push(pkg)
|
|
394
410
|
}
|
|
395
411
|
|
|
396
412
|
// implement in the subclass
|
package/lib/utils.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
const { mkdir } = require('node:fs/promises')
|
|
4
4
|
const { WrongTypeError } = require('./errors')
|
|
5
5
|
const { join } = require('node:path')
|
|
6
|
+
const { request } = require('undici')
|
|
7
|
+
const { setTimeout } = require('timers/promises')
|
|
6
8
|
const PLT_ROOT = 'PLT_ROOT'
|
|
7
9
|
|
|
8
10
|
async function safeMkdir (dir) {
|
|
@@ -133,6 +135,22 @@ function getPackageConfigurationObject (config, serviceName = '') {
|
|
|
133
135
|
}
|
|
134
136
|
return output
|
|
135
137
|
}
|
|
138
|
+
|
|
139
|
+
async function getLatestNpmVersion (pkg) {
|
|
140
|
+
const npmCall = request(`https://registry.npmjs.org/${pkg}`)
|
|
141
|
+
const timeout = setTimeout(1000, null)
|
|
142
|
+
const res = await Promise.race([npmCall, timeout])
|
|
143
|
+
if (!res) {
|
|
144
|
+
return null
|
|
145
|
+
}
|
|
146
|
+
clearTimeout(timeout)
|
|
147
|
+
if (res.statusCode === 200) {
|
|
148
|
+
const json = await res.body.json()
|
|
149
|
+
return json['dist-tags'].latest
|
|
150
|
+
}
|
|
151
|
+
return null
|
|
152
|
+
}
|
|
153
|
+
|
|
136
154
|
module.exports = {
|
|
137
155
|
addPrefixToEnv,
|
|
138
156
|
addPrefixToString,
|
|
@@ -142,5 +160,6 @@ module.exports = {
|
|
|
142
160
|
extractEnvVariablesFromText,
|
|
143
161
|
safeMkdir,
|
|
144
162
|
stripVersion,
|
|
145
|
-
PLT_ROOT
|
|
163
|
+
PLT_ROOT,
|
|
164
|
+
getLatestNpmVersion
|
|
146
165
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platformatic/generators",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.0",
|
|
4
4
|
"description": "Main classes and utils for generators.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"keywords": [],
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"@fastify/error": "^3.4.1",
|
|
11
11
|
"boring-name-generator": "^1.0.3",
|
|
12
12
|
"fastify": "^4.24.3",
|
|
13
|
-
"pino": "^8.16.1"
|
|
13
|
+
"pino": "^8.16.1",
|
|
14
|
+
"undici": "^6.3.0"
|
|
14
15
|
},
|
|
15
16
|
"devDependencies": {
|
|
16
17
|
"@types/inquirer": "^9.0.7",
|
|
@@ -8,6 +8,11 @@ const { join } = require('node:path')
|
|
|
8
8
|
const { fakeLogger, getTempDir } = require('./helpers')
|
|
9
9
|
const { BaseGenerator } = require('../lib/base-generator')
|
|
10
10
|
const { convertServiceNameToPrefix } = require('../lib/utils')
|
|
11
|
+
const { MockAgent, setGlobalDispatcher } = require('undici')
|
|
12
|
+
|
|
13
|
+
const mockAgent = new MockAgent()
|
|
14
|
+
setGlobalDispatcher(mockAgent)
|
|
15
|
+
mockAgent.disableNetConnect()
|
|
11
16
|
|
|
12
17
|
afterEach(async () => {
|
|
13
18
|
try {
|
|
@@ -398,7 +403,7 @@ test('should add package', async () => {
|
|
|
398
403
|
}
|
|
399
404
|
]
|
|
400
405
|
}
|
|
401
|
-
bg.addPackage(packageDefinition)
|
|
406
|
+
await bg.addPackage(packageDefinition)
|
|
402
407
|
|
|
403
408
|
assert.equal(bg.packages.length, 1)
|
|
404
409
|
assert.deepEqual(bg.packages[0], packageDefinition)
|
|
@@ -431,7 +436,7 @@ test('support packages', async (t) => {
|
|
|
431
436
|
isRuntimeContext: true,
|
|
432
437
|
serviceName: 'my-service'
|
|
433
438
|
})
|
|
434
|
-
svc.addPackage(packageDefinitions[0])
|
|
439
|
+
await svc.addPackage(packageDefinitions[0])
|
|
435
440
|
await svc.prepare()
|
|
436
441
|
|
|
437
442
|
const platformaticConfigFile = svc.getFileObject('platformatic.json')
|
|
@@ -450,7 +455,12 @@ test('support packages', async (t) => {
|
|
|
450
455
|
})
|
|
451
456
|
|
|
452
457
|
assert.equal(svc.config.env.PLT_MY_SERVICE_FST_PLUGIN_STATIC_FOOBAR, 123)
|
|
458
|
+
|
|
459
|
+
const packageJsonFile = svc.getFileObject('package.json')
|
|
460
|
+
const packageJson = JSON.parse(packageJsonFile.contents)
|
|
461
|
+
assert.equal(packageJson.dependencies['@fastify/compress'], 'latest')
|
|
453
462
|
}
|
|
463
|
+
|
|
454
464
|
{
|
|
455
465
|
// with standard platformatic plugin
|
|
456
466
|
const svc = new BaseGenerator({
|
|
@@ -471,7 +481,7 @@ test('support packages', async (t) => {
|
|
|
471
481
|
]
|
|
472
482
|
}
|
|
473
483
|
]
|
|
474
|
-
svc.addPackage(packageDefinitions[0])
|
|
484
|
+
await svc.addPackage(packageDefinitions[0])
|
|
475
485
|
await svc.prepare()
|
|
476
486
|
|
|
477
487
|
const platformaticConfigFile = svc.getFileObject('platformatic.json')
|
|
@@ -510,7 +520,7 @@ test('support packages', async (t) => {
|
|
|
510
520
|
]
|
|
511
521
|
}
|
|
512
522
|
]
|
|
513
|
-
svc.addPackage(packageDefinitions[0])
|
|
523
|
+
await svc.addPackage(packageDefinitions[0])
|
|
514
524
|
await svc.prepare()
|
|
515
525
|
|
|
516
526
|
const platformaticConfigFile = svc.getFileObject('platformatic.json')
|
|
@@ -527,6 +537,7 @@ test('support packages', async (t) => {
|
|
|
527
537
|
]
|
|
528
538
|
})
|
|
529
539
|
}
|
|
540
|
+
|
|
530
541
|
{
|
|
531
542
|
// with relative path type and name
|
|
532
543
|
const svc = new BaseGenerator({
|
|
@@ -550,7 +561,7 @@ test('support packages', async (t) => {
|
|
|
550
561
|
]
|
|
551
562
|
}
|
|
552
563
|
]
|
|
553
|
-
svc.addPackage(packageDefinitions[0])
|
|
564
|
+
await svc.addPackage(packageDefinitions[0])
|
|
554
565
|
await svc.prepare()
|
|
555
566
|
|
|
556
567
|
const platformaticConfigFile = svc.getFileObject('platformatic.json')
|
|
@@ -567,6 +578,143 @@ test('support packages', async (t) => {
|
|
|
567
578
|
]
|
|
568
579
|
})
|
|
569
580
|
}
|
|
581
|
+
|
|
582
|
+
{
|
|
583
|
+
// should get the version from npm
|
|
584
|
+
mockAgent
|
|
585
|
+
.get('https://registry.npmjs.org')
|
|
586
|
+
.intercept({
|
|
587
|
+
method: 'GET',
|
|
588
|
+
path: '/foobar'
|
|
589
|
+
})
|
|
590
|
+
.reply(200, {
|
|
591
|
+
'dist-tags': {
|
|
592
|
+
latest: '1.42.0'
|
|
593
|
+
}
|
|
594
|
+
})
|
|
595
|
+
|
|
596
|
+
const svc = new BaseGenerator({
|
|
597
|
+
module: '@platformatic/service'
|
|
598
|
+
})
|
|
599
|
+
const packageDefinitions = [
|
|
600
|
+
{
|
|
601
|
+
name: 'foobar',
|
|
602
|
+
options: []
|
|
603
|
+
}
|
|
604
|
+
]
|
|
605
|
+
svc.setConfig({
|
|
606
|
+
isRuntimeContext: true,
|
|
607
|
+
serviceName: 'my-service'
|
|
608
|
+
})
|
|
609
|
+
await svc.addPackage(packageDefinitions[0])
|
|
610
|
+
await svc.prepare()
|
|
611
|
+
|
|
612
|
+
const packageJsonFile = svc.getFileObject('package.json')
|
|
613
|
+
const packageJson = JSON.parse(packageJsonFile.contents)
|
|
614
|
+
assert.equal(packageJson.dependencies.foobar, '1.42.0')
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
{
|
|
618
|
+
// should default to `latest` if getting the version from npm fails
|
|
619
|
+
mockAgent
|
|
620
|
+
.get('https://registry.npmjs.org')
|
|
621
|
+
.intercept({
|
|
622
|
+
method: 'GET',
|
|
623
|
+
path: '/foobar'
|
|
624
|
+
})
|
|
625
|
+
.reply(500, {
|
|
626
|
+
message: 'Internal Server Error'
|
|
627
|
+
})
|
|
628
|
+
|
|
629
|
+
const svc = new BaseGenerator({
|
|
630
|
+
module: '@platformatic/service'
|
|
631
|
+
})
|
|
632
|
+
const packageDefinitions = [
|
|
633
|
+
{
|
|
634
|
+
name: 'foobar',
|
|
635
|
+
options: []
|
|
636
|
+
}
|
|
637
|
+
]
|
|
638
|
+
svc.setConfig({
|
|
639
|
+
isRuntimeContext: true,
|
|
640
|
+
serviceName: 'my-service'
|
|
641
|
+
})
|
|
642
|
+
await svc.addPackage(packageDefinitions[0])
|
|
643
|
+
await svc.prepare()
|
|
644
|
+
|
|
645
|
+
const packageJsonFile = svc.getFileObject('package.json')
|
|
646
|
+
const packageJson = JSON.parse(packageJsonFile.contents)
|
|
647
|
+
assert.equal(packageJson.dependencies.foobar, 'latest')
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
{
|
|
651
|
+
// should set latest on timeout
|
|
652
|
+
mockAgent
|
|
653
|
+
.get('https://registry.npmjs.org')
|
|
654
|
+
.intercept({
|
|
655
|
+
method: 'GET',
|
|
656
|
+
path: '/foobarxxx'
|
|
657
|
+
})
|
|
658
|
+
.reply(200, {
|
|
659
|
+
'dist-tags': {
|
|
660
|
+
latest: '1.42.0'
|
|
661
|
+
}
|
|
662
|
+
}).delay(3000)
|
|
663
|
+
|
|
664
|
+
const svc = new BaseGenerator({
|
|
665
|
+
module: '@platformatic/service'
|
|
666
|
+
})
|
|
667
|
+
const packageName = 'foobarxxx'
|
|
668
|
+
const packageDefinitions = [
|
|
669
|
+
{
|
|
670
|
+
name: packageName,
|
|
671
|
+
options: []
|
|
672
|
+
}
|
|
673
|
+
]
|
|
674
|
+
svc.setConfig({
|
|
675
|
+
isRuntimeContext: true,
|
|
676
|
+
serviceName: 'my-service'
|
|
677
|
+
})
|
|
678
|
+
await svc.addPackage(packageDefinitions[0])
|
|
679
|
+
await svc.prepare()
|
|
680
|
+
|
|
681
|
+
const packageJsonFile = svc.getFileObject('package.json')
|
|
682
|
+
const packageJson = JSON.parse(packageJsonFile.contents)
|
|
683
|
+
assert.equal(packageJson.dependencies[packageName], 'latest')
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
{
|
|
687
|
+
// should default to `latest` if getting the version from npm fails
|
|
688
|
+
mockAgent
|
|
689
|
+
.get('https://registry.npmjs.org')
|
|
690
|
+
.intercept({
|
|
691
|
+
method: 'GET',
|
|
692
|
+
path: '/foobar'
|
|
693
|
+
})
|
|
694
|
+
.reply(500, {
|
|
695
|
+
message: 'Internal Server Error'
|
|
696
|
+
})
|
|
697
|
+
|
|
698
|
+
const svc = new BaseGenerator({
|
|
699
|
+
module: '@platformatic/service'
|
|
700
|
+
})
|
|
701
|
+
const packageDefinitions = [
|
|
702
|
+
{
|
|
703
|
+
name: 'foobar',
|
|
704
|
+
options: []
|
|
705
|
+
}
|
|
706
|
+
]
|
|
707
|
+
svc.setConfig({
|
|
708
|
+
isRuntimeContext: true,
|
|
709
|
+
serviceName: 'my-service'
|
|
710
|
+
})
|
|
711
|
+
await svc.addPackage(packageDefinitions[0])
|
|
712
|
+
await svc.prepare()
|
|
713
|
+
|
|
714
|
+
const packageJsonFile = svc.getFileObject('package.json')
|
|
715
|
+
const packageJson = JSON.parse(packageJsonFile.contents)
|
|
716
|
+
assert.equal(packageJson.dependencies.foobar, 'latest')
|
|
717
|
+
}
|
|
570
718
|
})
|
|
571
719
|
|
|
572
720
|
describe('runtime context', () => {
|