@platformatic/generators 1.21.1 → 1.22.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/index.d.ts CHANGED
@@ -1,8 +1,7 @@
1
- import { BaseGenerator } from "./lib/base-generator";
2
- import { generateTests } from "./lib/create-plugin";
3
- import addPrefixToEnv from "./lib/utils"
1
+ import { BaseGenerator } from './lib/base-generator'
2
+ import { generateTests } from './lib/create-plugin'
3
+
4
4
  export {
5
- addPrefixToEnv,
6
5
  BaseGenerator,
7
- generateTests,
6
+ generateTests
8
7
  }
package/index.js CHANGED
@@ -3,9 +3,8 @@
3
3
  const { BaseGenerator } = require('./lib/base-generator')
4
4
  const { StackableGenerator } = require('./lib/stackable-generator')
5
5
  const { generateTests } = require('./lib/create-plugin')
6
- const { addPrefixToEnv } = require('./lib/utils')
6
+
7
7
  module.exports = {
8
- addPrefixToEnv,
9
8
  BaseGenerator,
10
9
  StackableGenerator,
11
10
  generateTests
@@ -7,8 +7,9 @@ export namespace BaseGenerator {
7
7
  inquirer?: object
8
8
  }
9
9
 
10
+ export type EnvVarValue = string | number | boolean
10
11
  export type Env = {
11
- [key: string]: string | number | boolean
12
+ [key: string]: EnvVarValue
12
13
  }
13
14
  type KeyValue = {
14
15
  [key: string]: string | number | undefined | null | boolean | object
@@ -80,7 +81,12 @@ export namespace BaseGenerator {
80
81
  constructor(opts?: BaseGeneratorOptions)
81
82
 
82
83
  setConfig(config?: BaseGeneratorConfig): void
83
- setEnv(env?: Env): void
84
+
85
+ getEnvVarName (envVarName: string): string
86
+ addEnvVars (envVars: Env): void
87
+ addEnvVar (envVarName: string, envVarValue: EnvVarValue): void
88
+ getEnvVar (envVarName: string): EnvVarValue
89
+ setEnvVars(env?: Env): void
84
90
 
85
91
  getDefaultConfig(): JSONValue
86
92
  getDefaultEnv(): Env
@@ -4,7 +4,6 @@ const { readFile } = require('node:fs/promises')
4
4
  const {
5
5
  stripVersion,
6
6
  convertServiceNameToPrefix,
7
- addPrefixToEnv,
8
7
  extractEnvVariablesFromText,
9
8
  getPackageConfigurationObject,
10
9
  PLT_ROOT,
@@ -76,7 +75,7 @@ class BaseGenerator extends FileGenerator {
76
75
  for (const field of fields) {
77
76
  if (shouldHandleConfigField(field)) {
78
77
  if (field.var) {
79
- this.config.env[field.var] = field.value
78
+ this.addEnvVar(field.var, field.value)
80
79
  }
81
80
  if (field.configValue) {
82
81
  this.config[field.configValue] = field.value
@@ -89,14 +88,39 @@ class BaseGenerator extends FileGenerator {
89
88
  return {}
90
89
  }
91
90
 
92
- setEnv (env) {
93
- if (this.config.isRuntimeContext) {
94
- this.config.env = addPrefixToEnv(this.config.env, this.config.envPrefix)
95
- } else {
96
- this.config.env = env
91
+ getEnvVarName (envVarName) {
92
+ const envVarPrefix = 'PLT_' + this.config.envPrefix + '_'
93
+ if (this.config.isRuntimeContext && !envVarName.startsWith(envVarPrefix)) {
94
+ if (envVarName.startsWith('PLT_')) {
95
+ return envVarName.replace('PLT_', envVarPrefix)
96
+ }
97
+ return envVarPrefix + envVarName
98
+ }
99
+ return envVarName
100
+ }
101
+
102
+ addEnvVars (envVars) {
103
+ for (const envVarName of Object.keys(envVars)) {
104
+ const envVarValue = envVars[envVarName]
105
+ this.addEnvVar(envVarName, envVarValue)
97
106
  }
98
107
  }
99
108
 
109
+ addEnvVar (envVarName, envVarValue) {
110
+ envVarName = this.getEnvVarName(envVarName)
111
+ this.config.env[envVarName] = envVarValue
112
+ }
113
+
114
+ getEnvVar (envVarName) {
115
+ envVarName = this.getEnvVarName(envVarName)
116
+ return this.config.env[envVarName]
117
+ }
118
+
119
+ setEnvVars (envVars) {
120
+ this.config.env = {}
121
+ this.addEnvVars(envVars)
122
+ }
123
+
100
124
  setConfig (config) {
101
125
  if (!config) {
102
126
  this.config = this.getDefaultConfig()
@@ -116,10 +140,8 @@ class BaseGenerator extends FileGenerator {
116
140
  if (this.config.serviceName && !this.config.envPrefix) {
117
141
  this.config.envPrefix = convertServiceNameToPrefix(this.config.serviceName)
118
142
  }
119
-
120
- // modify env
121
- this.config.env = addPrefixToEnv(this.config.env, this.config.envPrefix)
122
143
  }
144
+ this.setEnvVars(this.config.env)
123
145
 
124
146
  if (this.config.targetDirectory) {
125
147
  this.targetDirectory = this.config.targetDirectory
@@ -213,8 +235,8 @@ class BaseGenerator extends FileGenerator {
213
235
  checkEnvVariablesInConfigFile () {
214
236
  const excludedEnvs = [PLT_ROOT]
215
237
  const configFileName = 'platformatic.json'
216
- const fileOjbect = this.getFileObject(configFileName)
217
- const envVars = extractEnvVariablesFromText(fileOjbect.contents)
238
+ const fileObject = this.getFileObject(configFileName)
239
+ const envVars = extractEnvVariablesFromText(fileObject.contents)
218
240
  const envKeys = Object.keys(this.config.env)
219
241
  if (envVars.length > 0) {
220
242
  for (const ev of envVars) {
@@ -298,12 +320,7 @@ class BaseGenerator extends FileGenerator {
298
320
  Object.entries(packageConfigOutput.env).forEach((kv) => {
299
321
  envForPackages[kv[0]] = kv[1]
300
322
  })
301
- if (this.config.isRuntimeContext) {
302
- this.config.env = {
303
- ...this.config.env,
304
- ...addPrefixToEnv(envForPackages, this.config.envPrefix)
305
- }
306
- }
323
+ this.addEnvVars(envForPackages)
307
324
  }
308
325
  return {
309
326
  name: packageDefinition.name,
@@ -6,11 +6,11 @@ function getJsStackableStartCli () {
6
6
  return `\
7
7
  #!/usr/bin/env node
8
8
  'use strict'
9
-
9
+
10
10
  const stackable = require('../index')
11
11
  const { start } = require('@platformatic/service')
12
12
  const { printAndExitLoadConfigError } = require('@platformatic/config')
13
-
13
+
14
14
  start(stackable, process.argv.splice(2)).catch(printAndExitLoadConfigError)
15
15
  `
16
16
  }
@@ -32,48 +32,44 @@ function getJsStackableCreateCli (stackableName) {
32
32
  'use strict'
33
33
 
34
34
  const { join } = require('node:path')
35
- const pino = require('pino')
36
- const pretty = require('pino-pretty')
37
- const minimist = require('minimist')
35
+ const { parseArgs } = require('node:util')
38
36
  const { Generator } = require('../lib/generator')
39
-
37
+
40
38
  async function execute () {
41
- const logger = pino(pretty({
42
- translateTime: 'SYS:HH:MM:ss',
43
- ignore: 'hostname,pid'
44
- }))
45
-
46
- const args = minimist(process.argv.slice(2), {
47
- string: ['dir', 'port', 'hostname'],
48
- boolean: ['typescript', 'install', 'plugin', 'git'],
49
- default: {
50
- dir: join(process.cwd(), '${kebabCase(stackableName + '-app')}'),
51
- port: 3042,
52
- hostname: '0.0.0.0',
53
- plugin: true,
54
- typescript: false,
55
- git: false,
56
- install: true
39
+ const args = parseArgs({
40
+ args: process.argv.slice(2),
41
+ options: {
42
+ dir: {
43
+ type: 'string',
44
+ default: join(process.cwd(), '${kebabCase(stackableName + '-app')}')
45
+ },
46
+ port: { type: 'string', default: '3042' },
47
+ hostname: { type: 'string', default: '0.0.0.0' },
48
+ plugins: { type: 'boolean', default: true },
49
+ tests: { type: 'boolean', default: true },
50
+ typescript: { type: 'boolean', default: false },
51
+ git: { type: 'boolean', default: false },
52
+ install: { type: 'boolean', default: true }
57
53
  }
58
54
  })
59
-
60
- const generator = new Generator({ logger })
61
-
55
+
56
+ const generator = new Generator()
57
+
62
58
  generator.setConfig({
63
- port: args.port,
64
- hostname: args.hostname,
65
- plugin: args.plugin,
66
- tests: args.plugin,
67
- typescript: args.typescript,
68
- initGitRepository: args.git,
69
- targetDirectory: args.dir
59
+ port: parseInt(args.values.port),
60
+ hostname: args.values.hostname,
61
+ plugins: args.values.plugins,
62
+ tests: args.values.tests,
63
+ typescript: args.values.typescript,
64
+ initGitRepository: args.values.git,
65
+ targetDirectory: args.values.dir
70
66
  })
71
-
67
+
72
68
  await generator.run()
73
-
74
- logger.info('Application created successfully! Run \`npm run start\` to start an application.')
69
+
70
+ console.log('Application created successfully! Run \`npm run start\` to start an application.')
75
71
  }
76
-
72
+
77
73
  execute()
78
74
  `
79
75
  }
@@ -82,46 +78,42 @@ function getTsStackableCreateCli (stackableName) {
82
78
  return `\
83
79
  #!/usr/bin/env node
84
80
  import { join } from 'node:path'
85
- import pino from 'pino'
86
- import pretty from 'pino-pretty'
87
- import minimist from 'minimist'
81
+ import { parseArgs } from 'node:util'
88
82
  import { Generator } from '../lib/generator'
89
83
 
90
84
  async function execute () {
91
- const logger = pino(pretty({
92
- translateTime: 'SYS:HH:MM:ss',
93
- ignore: 'hostname,pid'
94
- }))
95
-
96
- const args = minimist(process.argv.slice(2), {
97
- string: ['dir', 'port', 'hostname'],
98
- boolean: ['typescript', 'install', 'plugin', 'git'],
99
- default: {
100
- dir: join(process.cwd(), '${kebabCase(stackableName + '-app')}'),
101
- port: 3042,
102
- hostname: '0.0.0.0',
103
- plugin: true,
104
- typescript: false,
105
- git: false,
106
- install: true
85
+ const args = parseArgs({
86
+ args: process.argv.slice(2),
87
+ options: {
88
+ dir: {
89
+ type: 'string',
90
+ default: join(process.cwd(), '${kebabCase(stackableName + '-app')}')
91
+ },
92
+ port: { type: 'string', default: '3042' },
93
+ hostname: { type: 'string', default: '0.0.0.0' },
94
+ plugins: { type: 'boolean', default: true },
95
+ tests: { type: 'boolean', default: true },
96
+ typescript: { type: 'boolean', default: false },
97
+ git: { type: 'boolean', default: false },
98
+ install: { type: 'boolean', default: true }
107
99
  }
108
100
  })
109
101
 
110
- const generator = new Generator({ logger })
102
+ const generator = new Generator()
111
103
 
112
104
  generator.setConfig({
113
- port: args.port,
114
- hostname: args.hostname,
115
- plugin: args.plugin,
116
- tests: args.plugin,
117
- typescript: args.typescript,
118
- initGitRepository: args.git,
119
- targetDirectory: args.dir
105
+ port: parseInt(args.values.port as string),
106
+ hostname: args.values.hostname,
107
+ plugins: args.values.plugins,
108
+ tests: args.values.tests,
109
+ typescript: args.values.typescript,
110
+ initGitRepository: args.values.git,
111
+ targetDirectory: args.values.dir
120
112
  })
121
113
 
122
114
  await generator.run()
123
115
 
124
- logger.info('Application created successfully! Run \`npm run start\` to start an application.')
116
+ console.log('Application created successfully! Run \`npm run start\` to start an application.')
125
117
  }
126
118
 
127
119
  execute()
@@ -28,7 +28,7 @@ stackable.configManagerConfig = {
28
28
  allErrors: true,
29
29
  strict: false
30
30
  },
31
- transformConfig: async () => {}
31
+ async transformConfig () {}
32
32
  }
33
33
 
34
34
  // break Fastify encapsulation
@@ -67,7 +67,7 @@ stackable.configManagerConfig = {
67
67
  allErrors: true,
68
68
  strict: false
69
69
  },
70
- transformConfig: async () => {}
70
+ async transformConfig () {}
71
71
  }
72
72
 
73
73
  // break Fastify encapsulation
@@ -181,7 +181,7 @@ class ${stackableGeneratorType} extends ServiceGenerator {
181
181
  $schema: './stackable.schema.json',
182
182
  module: packageJson.name,
183
183
  greeting: {
184
- text: '{PLT_GREETING_TEXT}'
184
+ text: \`{\${this.getEnvVarName('PLT_GREETING_TEXT')}}\`
185
185
  }
186
186
  }
187
187
  return Object.assign({}, baseConfig, config)
@@ -190,10 +190,9 @@ class ${stackableGeneratorType} extends ServiceGenerator {
190
190
  async _beforePrepare () {
191
191
  super._beforePrepare()
192
192
 
193
- this.config.env = {
194
- PLT_GREETING_TEXT: this.config.greeting ?? 'Hello world!',
195
- ...this.config.env
196
- }
193
+ this.addEnvVars({
194
+ PLT_GREETING_TEXT: this.config.greeting ?? 'Hello world!'
195
+ })
197
196
 
198
197
  const packageJson = await this.getStackablePackageJson()
199
198
 
@@ -226,7 +225,7 @@ class ${stackableGeneratorType} extends ServiceGenerator {
226
225
  if (!packageJson.name) {
227
226
  throw new Error('Missing package name in package.json')
228
227
  }
229
-
228
+
230
229
  if (!packageJson.version) {
231
230
  throw new Error('Missing package version in package.json')
232
231
  }
@@ -290,7 +289,7 @@ class ${stackableGeneratorType} extends ServiceGenerator {
290
289
  $schema: './stackable.schema.json',
291
290
  module: packageJson.name,
292
291
  greeting: {
293
- text: '{PLT_GREETING_TEXT}'
292
+ text: \`{\${this.getEnvVarName('PLT_GREETING_TEXT')}}\`
294
293
  }
295
294
  }
296
295
  return Object.assign({}, baseConfig, config)
@@ -299,10 +298,9 @@ class ${stackableGeneratorType} extends ServiceGenerator {
299
298
  async _beforePrepare () {
300
299
  super._beforePrepare()
301
300
 
302
- this.config.env = {
303
- PLT_GREETING_TEXT: this.config.greeting ?? 'Hello world!',
304
- ...this.config.env
305
- }
301
+ this.addEnvVars({
302
+ PLT_GREETING_TEXT: this.config.greeting ?? 'Hello world!'
303
+ })
306
304
 
307
305
  const packageJson = await this.getStackablePackageJson()
308
306
 
@@ -335,7 +333,7 @@ class ${stackableGeneratorType} extends ServiceGenerator {
335
333
  if (!packageJson.name) {
336
334
  throw new Error('Missing package name in package.json')
337
335
  }
338
-
336
+
339
337
  if (!packageJson.version) {
340
338
  throw new Error('Missing package version in package.json')
341
339
  }
@@ -205,11 +205,7 @@ class StackableGenerator extends FileGenerator {
205
205
  const dependencies = {
206
206
  '@platformatic/config': `^${this.platformaticVersion}`,
207
207
  '@platformatic/service': `^${this.platformaticVersion}`,
208
- 'json-schema-to-typescript': '^13.0.0',
209
- pino: '^8.0.0',
210
- 'pino-pretty': '^10.0.0',
211
- minimist: '^1.2.0',
212
- platformatic: `^${this.platformaticVersion}`
208
+ 'json-schema-to-typescript': '^13.0.0'
213
209
  }
214
210
 
215
211
  const devDependencies = {
@@ -237,9 +233,11 @@ class StackableGenerator extends FileGenerator {
237
233
  'build:config': 'node ./dist/lib/schema.js | json2ts > config.d.ts',
238
234
  clean: 'rm -fr ./dist'
239
235
  },
236
+ engines: {
237
+ node: '^18.8.0 || >=20.6.0'
238
+ },
240
239
  devDependencies: {
241
240
  ...devDependencies,
242
- '@types/minimist': '^1.2.5',
243
241
  typescript: typescriptVersion,
244
242
  ...this.config.devDependencies
245
243
  },
@@ -248,8 +246,8 @@ class StackableGenerator extends FileGenerator {
248
246
  '@platformatic/generators': `^${this.platformaticVersion}`,
249
247
  ...this.config.dependencies
250
248
  },
251
- engines: {
252
- node: '^18.8.0 || >=20.6.0'
249
+ overrides: {
250
+ minimatch: '^5.0.0'
253
251
  }
254
252
  }
255
253
  }
@@ -263,18 +261,20 @@ class StackableGenerator extends FileGenerator {
263
261
  [startStackableCommand]: './cli/start.js'
264
262
  },
265
263
  scripts: {
266
- 'build:config': 'node lib/schema.js | json2ts > config.d.ts'
264
+ 'build:config': 'node lib/schema.js | json2ts > config.d.ts',
265
+ lint: 'standard'
266
+ },
267
+ engines: {
268
+ node: '^18.8.0 || >=20.6.0'
267
269
  },
268
270
  devDependencies: {
269
271
  ...devDependencies,
272
+ standard: '^17.0.0',
270
273
  ...this.config.devDependencies
271
274
  },
272
275
  dependencies: {
273
276
  ...dependencies,
274
277
  ...this.config.dependencies
275
- },
276
- engines: {
277
- node: '^18.8.0 || >=20.6.0'
278
278
  }
279
279
  }
280
280
  }
package/lib/utils.d.ts CHANGED
@@ -12,8 +12,6 @@ export namespace GeneratorUtils {
12
12
  export function safeMkdir(dir: string): Promise<void>
13
13
  export function stripVersion(version: string): string
14
14
  export function convertServiceNameToPrefix(serviceName: string): string
15
- export function addPrefixToEnv(env: Env, prefix: string): Env
16
- export function addPrefixToEnv(input: string, prefix: string): string
17
15
  export function envObjectToString(env: Env): string
18
16
  export function extractEnvVariablesFromText(text: string): string[]
19
17
  export function getPackageConfigurationObject(config: PackageConfiguration[]): object
package/lib/utils.js CHANGED
@@ -46,24 +46,6 @@ function addPrefixToString (input, prefix) {
46
46
  return input
47
47
  }
48
48
  }
49
- function addPrefixToEnv (env, prefix) {
50
- const newEnv = {}
51
- if (!prefix) {
52
- // return original env
53
- return env
54
- }
55
- const prefixRegExp = new RegExp(`^PLT_${prefix}_`)
56
- Object.entries(env).forEach((kv) => {
57
- if (!kv[0].match(prefixRegExp)) {
58
- // strip PLT_ if needed
59
- kv[0] = kv[0].replace(/^PLT_/, '')
60
- newEnv[`PLT_${prefix}_${kv[0]}`] = kv[1]
61
- } else {
62
- newEnv[kv[0]] = kv[1]
63
- }
64
- })
65
- return newEnv
66
- }
67
49
 
68
50
  function envObjectToString (env) {
69
51
  const output = []
@@ -152,7 +134,6 @@ async function getLatestNpmVersion (pkg) {
152
134
  }
153
135
 
154
136
  module.exports = {
155
- addPrefixToEnv,
156
137
  addPrefixToString,
157
138
  convertServiceNameToPrefix,
158
139
  getPackageConfigurationObject,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platformatic/generators",
3
- "version": "1.21.1",
3
+ "version": "1.22.0",
4
4
  "description": "Main classes and utils for generators.",
5
5
  "main": "index.js",
6
6
  "keywords": [],
@@ -2,7 +2,14 @@
2
2
 
3
3
  const { test, describe } = require('node:test')
4
4
  const assert = require('node:assert')
5
- const { stripVersion, convertServiceNameToPrefix, addPrefixToEnv, envObjectToString, extractEnvVariablesFromText, getPackageConfigurationObject, addPrefixToString } = require('../lib/utils')
5
+ const {
6
+ stripVersion,
7
+ convertServiceNameToPrefix,
8
+ envObjectToString,
9
+ extractEnvVariablesFromText,
10
+ getPackageConfigurationObject,
11
+ addPrefixToString
12
+ } = require('../lib/utils')
6
13
 
7
14
  describe('utils', () => {
8
15
  describe('stripVersion', async () => {
@@ -33,42 +40,6 @@ describe('utils', () => {
33
40
  })
34
41
  })
35
42
 
36
- describe('addPrefixToEnv', () => {
37
- test('Should convert env and add prefix, if needed', async (t) => {
38
- {
39
- const testEnv = {
40
- FOO: 'bar',
41
- PLT_MY_SERVICE_NAME: 'service',
42
- DATABASE_URL: 'foobar',
43
- PLT_ANOTHER_VALUE: 'anotherValue'
44
- }
45
-
46
- assert.deepEqual(addPrefixToEnv(testEnv, 'MY_SERVICE'), {
47
- PLT_MY_SERVICE_FOO: 'bar',
48
- PLT_MY_SERVICE_NAME: 'service',
49
- PLT_MY_SERVICE_DATABASE_URL: 'foobar',
50
- PLT_MY_SERVICE_ANOTHER_VALUE: 'anotherValue'
51
- })
52
- }
53
- {
54
- // empty service name, return same env
55
- const testEnv = {
56
- FOO: 'bar',
57
- PLT_MY_SERVICE_NAME: 'service',
58
- DATABASE_URL: 'foobar',
59
- PLT_ANOTHER_VALUE: 'anotherValue'
60
- }
61
-
62
- assert.deepEqual(addPrefixToEnv(testEnv, ''), {
63
- FOO: 'bar',
64
- PLT_MY_SERVICE_NAME: 'service',
65
- DATABASE_URL: 'foobar',
66
- PLT_ANOTHER_VALUE: 'anotherValue'
67
- })
68
- }
69
- })
70
- })
71
-
72
43
  describe('envObjectToString', () => {
73
44
  test('should convert env object to string', async () => {
74
45
  const env = {
@@ -176,7 +147,7 @@ describe('utils', () => {
176
147
  assert.fail()
177
148
  } catch (err) {
178
149
  assert.equal(err.code, 'PLT_GEN_WRONG_TYPE')
179
- assert.equal(err.message, 'Invalid value type. Accepted values are \'string\', \'number\' and \'boolean\', found \'object\'.')
150
+ assert.equal(err.message, "Invalid value type. Accepted values are 'string', 'number' and 'boolean', found 'object'.")
180
151
  }
181
152
  })
182
153