@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.
@@ -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>
@@ -1,7 +1,15 @@
1
1
  'use strict'
2
2
 
3
3
  const { readFile } = require('node:fs/promises')
4
- const { stripVersion, convertServiceNameToPrefix, addPrefixToEnv, extractEnvVariablesFromText, getPackageConfigurationObject, PLT_ROOT } = require('./utils')
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.17.0",
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', () => {