@platformatic/generators 1.21.1 → 1.23.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
@@ -61,13 +62,18 @@ export namespace BaseGenerator {
61
62
  default: string
62
63
  type: 'number' | 'string' | 'boolean' | 'path'
63
64
  configValue?: 'string'
64
-
65
65
  }
66
+
66
67
  type ConfigField = {
67
68
  var: string
68
69
  configValue?: 'string'
69
70
  value: 'string'
70
71
  }
72
+
73
+ type AddEnvVarOptions = {
74
+ overwrite: boolean
75
+ }
76
+
71
77
  export class BaseGenerator extends FileGenerator.FileGenerator {
72
78
  logger: BaseLogger
73
79
  platformaticVersion: string
@@ -80,7 +86,12 @@ export namespace BaseGenerator {
80
86
  constructor(opts?: BaseGeneratorOptions)
81
87
 
82
88
  setConfig(config?: BaseGeneratorConfig): void
83
- setEnv(env?: Env): void
89
+
90
+ getEnvVarName (envVarName: string): string
91
+ addEnvVars (envVars: Env, opts: AddEnvVarOptions): void
92
+ addEnvVar (envVarName: string, envVarValue: EnvVarValue, opts: AddEnvVarOptions): void
93
+ getEnvVar (envVarName: string): EnvVarValue
94
+ setEnvVars(env?: Env): void
84
95
 
85
96
  getDefaultConfig(): JSONValue
86
97
  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,12 +88,40 @@ 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
97
98
  }
99
+ return envVarName
100
+ }
101
+
102
+ addEnvVars (envVars, opts = {}) {
103
+ for (const envVarName of Object.keys(envVars)) {
104
+ const envVarValue = envVars[envVarName]
105
+ this.addEnvVar(envVarName, envVarValue, opts)
106
+ }
107
+ }
108
+
109
+ addEnvVar (envVarName, envVarValue, opts = {}) {
110
+ opts.overwrite ??= true
111
+ envVarName = this.getEnvVarName(envVarName)
112
+ if (opts.overwrite || !this.config.env[envVarName]) {
113
+ this.config.env[envVarName] = envVarValue
114
+ }
115
+ }
116
+
117
+ getEnvVar (envVarName) {
118
+ envVarName = this.getEnvVarName(envVarName)
119
+ return this.config.env[envVarName]
120
+ }
121
+
122
+ setEnvVars (envVars) {
123
+ this.config.env = {}
124
+ this.addEnvVars(envVars)
98
125
  }
99
126
 
100
127
  setConfig (config) {
@@ -116,10 +143,8 @@ class BaseGenerator extends FileGenerator {
116
143
  if (this.config.serviceName && !this.config.envPrefix) {
117
144
  this.config.envPrefix = convertServiceNameToPrefix(this.config.serviceName)
118
145
  }
119
-
120
- // modify env
121
- this.config.env = addPrefixToEnv(this.config.env, this.config.envPrefix)
122
146
  }
147
+ this.setEnvVars(this.config.env)
123
148
 
124
149
  if (this.config.targetDirectory) {
125
150
  this.targetDirectory = this.config.targetDirectory
@@ -213,8 +238,8 @@ class BaseGenerator extends FileGenerator {
213
238
  checkEnvVariablesInConfigFile () {
214
239
  const excludedEnvs = [PLT_ROOT]
215
240
  const configFileName = 'platformatic.json'
216
- const fileOjbect = this.getFileObject(configFileName)
217
- const envVars = extractEnvVariablesFromText(fileOjbect.contents)
241
+ const fileObject = this.getFileObject(configFileName)
242
+ const envVars = extractEnvVariablesFromText(fileObject.contents)
218
243
  const envKeys = Object.keys(this.config.env)
219
244
  if (envVars.length > 0) {
220
245
  for (const ev of envVars) {
@@ -298,12 +323,7 @@ class BaseGenerator extends FileGenerator {
298
323
  Object.entries(packageConfigOutput.env).forEach((kv) => {
299
324
  envForPackages[kv[0]] = kv[1]
300
325
  })
301
- if (this.config.isRuntimeContext) {
302
- this.config.env = {
303
- ...this.config.env,
304
- ...addPrefixToEnv(envForPackages, this.config.envPrefix)
305
- }
306
- }
326
+ this.addEnvVars(envForPackages)
307
327
  }
308
328
  return {
309
329
  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
+ }, { overwrite: false })
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
+ }, { overwrite: false })
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.23.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