@platformatic/runtime 2.65.1 → 2.66.1
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/config.d.ts +113 -90
- package/index.js +2 -1
- package/lib/config.js +16 -3
- package/lib/generator/runtime-generator.js +128 -31
- package/lib/logger.js +32 -32
- package/lib/runtime.js +42 -25
- package/lib/schema.js +12 -529
- package/lib/start.js +17 -4
- package/package.json +15 -14
- package/schema.json +80 -25
- package/undefined +5 -0
package/config.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* and run json-schema-to-typescript to regenerate this file.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
export type
|
|
8
|
+
export type HttpsSchemasPlatformaticDevPlatformaticRuntime2661Json = {
|
|
9
9
|
[k: string]: unknown;
|
|
10
10
|
} & {
|
|
11
11
|
$schema?: string;
|
|
@@ -85,6 +85,14 @@ export type HttpsSchemasPlatformaticDevPlatformaticRuntime2651Json = {
|
|
|
85
85
|
paths: string[];
|
|
86
86
|
censor?: string;
|
|
87
87
|
};
|
|
88
|
+
base?: {
|
|
89
|
+
[k: string]: unknown;
|
|
90
|
+
} | null;
|
|
91
|
+
messageKey?: string;
|
|
92
|
+
customLevels?: {
|
|
93
|
+
[k: string]: unknown;
|
|
94
|
+
};
|
|
95
|
+
captureStdio?: boolean;
|
|
88
96
|
[k: string]: unknown;
|
|
89
97
|
};
|
|
90
98
|
server?: {
|
|
@@ -140,11 +148,35 @@ export type HttpsSchemasPlatformaticDevPlatformaticRuntime2651Json = {
|
|
|
140
148
|
[k: string]: unknown;
|
|
141
149
|
};
|
|
142
150
|
interceptors?:
|
|
143
|
-
| UndiciInterceptor[]
|
|
144
151
|
| {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
152
|
+
module: string;
|
|
153
|
+
options: {
|
|
154
|
+
[k: string]: unknown;
|
|
155
|
+
};
|
|
156
|
+
[k: string]: unknown;
|
|
157
|
+
}[]
|
|
158
|
+
| {
|
|
159
|
+
Client?: {
|
|
160
|
+
module: string;
|
|
161
|
+
options: {
|
|
162
|
+
[k: string]: unknown;
|
|
163
|
+
};
|
|
164
|
+
[k: string]: unknown;
|
|
165
|
+
}[];
|
|
166
|
+
Pool?: {
|
|
167
|
+
module: string;
|
|
168
|
+
options: {
|
|
169
|
+
[k: string]: unknown;
|
|
170
|
+
};
|
|
171
|
+
[k: string]: unknown;
|
|
172
|
+
}[];
|
|
173
|
+
Agent?: {
|
|
174
|
+
module: string;
|
|
175
|
+
options: {
|
|
176
|
+
[k: string]: unknown;
|
|
177
|
+
};
|
|
178
|
+
[k: string]: unknown;
|
|
179
|
+
}[];
|
|
148
180
|
[k: string]: unknown;
|
|
149
181
|
};
|
|
150
182
|
[k: string]: unknown;
|
|
@@ -215,7 +247,82 @@ export type HttpsSchemasPlatformaticDevPlatformaticRuntime2651Json = {
|
|
|
215
247
|
additionalProperties?: never;
|
|
216
248
|
[k: string]: unknown;
|
|
217
249
|
};
|
|
218
|
-
telemetry?:
|
|
250
|
+
telemetry?: {
|
|
251
|
+
enabled?: boolean | string;
|
|
252
|
+
/**
|
|
253
|
+
* The name of the service. Defaults to the folder name if not specified.
|
|
254
|
+
*/
|
|
255
|
+
serviceName: string;
|
|
256
|
+
/**
|
|
257
|
+
* The version of the service (optional)
|
|
258
|
+
*/
|
|
259
|
+
version?: string;
|
|
260
|
+
/**
|
|
261
|
+
* An array of paths to skip when creating spans. Useful for health checks and other endpoints that do not need to be traced.
|
|
262
|
+
*/
|
|
263
|
+
skip?: {
|
|
264
|
+
/**
|
|
265
|
+
* The path to skip. Can be a string or a regex.
|
|
266
|
+
*/
|
|
267
|
+
path?: string;
|
|
268
|
+
/**
|
|
269
|
+
* HTTP method to skip
|
|
270
|
+
*/
|
|
271
|
+
method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS";
|
|
272
|
+
[k: string]: unknown;
|
|
273
|
+
}[];
|
|
274
|
+
exporter?:
|
|
275
|
+
| {
|
|
276
|
+
type?: "console" | "otlp" | "zipkin" | "memory" | "file";
|
|
277
|
+
/**
|
|
278
|
+
* Options for the exporter. These are passed directly to the exporter.
|
|
279
|
+
*/
|
|
280
|
+
options?: {
|
|
281
|
+
/**
|
|
282
|
+
* The URL to send the traces to. Not used for console or memory exporters.
|
|
283
|
+
*/
|
|
284
|
+
url?: string;
|
|
285
|
+
/**
|
|
286
|
+
* Headers to send to the exporter. Not used for console or memory exporters.
|
|
287
|
+
*/
|
|
288
|
+
headers?: {
|
|
289
|
+
[k: string]: unknown;
|
|
290
|
+
};
|
|
291
|
+
/**
|
|
292
|
+
* The path to write the traces to. Only for file exporter.
|
|
293
|
+
*/
|
|
294
|
+
path?: string;
|
|
295
|
+
[k: string]: unknown;
|
|
296
|
+
};
|
|
297
|
+
additionalProperties?: never;
|
|
298
|
+
[k: string]: unknown;
|
|
299
|
+
}[]
|
|
300
|
+
| {
|
|
301
|
+
type?: "console" | "otlp" | "zipkin" | "memory" | "file";
|
|
302
|
+
/**
|
|
303
|
+
* Options for the exporter. These are passed directly to the exporter.
|
|
304
|
+
*/
|
|
305
|
+
options?: {
|
|
306
|
+
/**
|
|
307
|
+
* The URL to send the traces to. Not used for console or memory exporters.
|
|
308
|
+
*/
|
|
309
|
+
url?: string;
|
|
310
|
+
/**
|
|
311
|
+
* Headers to send to the exporter. Not used for console or memory exporters.
|
|
312
|
+
*/
|
|
313
|
+
headers?: {
|
|
314
|
+
[k: string]: unknown;
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* The path to write the traces to. Only for file exporter.
|
|
318
|
+
*/
|
|
319
|
+
path?: string;
|
|
320
|
+
[k: string]: unknown;
|
|
321
|
+
};
|
|
322
|
+
additionalProperties?: never;
|
|
323
|
+
[k: string]: unknown;
|
|
324
|
+
};
|
|
325
|
+
};
|
|
219
326
|
inspectorOptions?: {
|
|
220
327
|
host?: string;
|
|
221
328
|
port?: number;
|
|
@@ -247,87 +354,3 @@ export type HttpsSchemasPlatformaticDevPlatformaticRuntime2651Json = {
|
|
|
247
354
|
[k: string]: unknown;
|
|
248
355
|
}[];
|
|
249
356
|
};
|
|
250
|
-
|
|
251
|
-
export interface UndiciInterceptor {
|
|
252
|
-
module: string;
|
|
253
|
-
options: {
|
|
254
|
-
[k: string]: unknown;
|
|
255
|
-
};
|
|
256
|
-
[k: string]: unknown;
|
|
257
|
-
}
|
|
258
|
-
export interface OpenTelemetry {
|
|
259
|
-
enabled?: boolean | string;
|
|
260
|
-
/**
|
|
261
|
-
* The name of the service. Defaults to the folder name if not specified.
|
|
262
|
-
*/
|
|
263
|
-
serviceName: string;
|
|
264
|
-
/**
|
|
265
|
-
* The version of the service (optional)
|
|
266
|
-
*/
|
|
267
|
-
version?: string;
|
|
268
|
-
/**
|
|
269
|
-
* An array of paths to skip when creating spans. Useful for health checks and other endpoints that do not need to be traced.
|
|
270
|
-
*/
|
|
271
|
-
skip?: {
|
|
272
|
-
/**
|
|
273
|
-
* The path to skip. Can be a string or a regex.
|
|
274
|
-
*/
|
|
275
|
-
path?: string;
|
|
276
|
-
/**
|
|
277
|
-
* HTTP method to skip
|
|
278
|
-
*/
|
|
279
|
-
method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS";
|
|
280
|
-
[k: string]: unknown;
|
|
281
|
-
}[];
|
|
282
|
-
exporter?:
|
|
283
|
-
| {
|
|
284
|
-
type?: "console" | "otlp" | "zipkin" | "memory" | "file";
|
|
285
|
-
/**
|
|
286
|
-
* Options for the exporter. These are passed directly to the exporter.
|
|
287
|
-
*/
|
|
288
|
-
options?: {
|
|
289
|
-
/**
|
|
290
|
-
* The URL to send the traces to. Not used for console or memory exporters.
|
|
291
|
-
*/
|
|
292
|
-
url?: string;
|
|
293
|
-
/**
|
|
294
|
-
* Headers to send to the exporter. Not used for console or memory exporters.
|
|
295
|
-
*/
|
|
296
|
-
headers?: {
|
|
297
|
-
[k: string]: unknown;
|
|
298
|
-
};
|
|
299
|
-
/**
|
|
300
|
-
* The path to write the traces to. Only for file exporter.
|
|
301
|
-
*/
|
|
302
|
-
path?: string;
|
|
303
|
-
[k: string]: unknown;
|
|
304
|
-
};
|
|
305
|
-
additionalProperties?: never;
|
|
306
|
-
[k: string]: unknown;
|
|
307
|
-
}[]
|
|
308
|
-
| {
|
|
309
|
-
type?: "console" | "otlp" | "zipkin" | "memory" | "file";
|
|
310
|
-
/**
|
|
311
|
-
* Options for the exporter. These are passed directly to the exporter.
|
|
312
|
-
*/
|
|
313
|
-
options?: {
|
|
314
|
-
/**
|
|
315
|
-
* The URL to send the traces to. Not used for console or memory exporters.
|
|
316
|
-
*/
|
|
317
|
-
url?: string;
|
|
318
|
-
/**
|
|
319
|
-
* Headers to send to the exporter. Not used for console or memory exporters.
|
|
320
|
-
*/
|
|
321
|
-
headers?: {
|
|
322
|
-
[k: string]: unknown;
|
|
323
|
-
};
|
|
324
|
-
/**
|
|
325
|
-
* The path to write the traces to. Only for file exporter.
|
|
326
|
-
*/
|
|
327
|
-
path?: string;
|
|
328
|
-
[k: string]: unknown;
|
|
329
|
-
};
|
|
330
|
-
additionalProperties?: never;
|
|
331
|
-
[k: string]: unknown;
|
|
332
|
-
};
|
|
333
|
-
}
|
package/index.js
CHANGED
|
@@ -4,7 +4,7 @@ const { buildServer } = require('./lib/build-server')
|
|
|
4
4
|
const { compile } = require('./lib/compile')
|
|
5
5
|
const errors = require('./lib/errors')
|
|
6
6
|
const { platformaticRuntime, wrapConfigInRuntimeConfig } = require('./lib/config')
|
|
7
|
-
const RuntimeGenerator = require('./lib/generator/runtime-generator')
|
|
7
|
+
const { RuntimeGenerator, WrappedGenerator } = require('./lib/generator/runtime-generator')
|
|
8
8
|
const { Runtime } = require('./lib/runtime')
|
|
9
9
|
const { buildRuntime, start, startCommand } = require('./lib/start')
|
|
10
10
|
const symbols = require('./lib/worker/symbols')
|
|
@@ -17,6 +17,7 @@ module.exports.buildRuntime = buildRuntime
|
|
|
17
17
|
module.exports.compile = compile
|
|
18
18
|
module.exports.errors = errors
|
|
19
19
|
module.exports.Generator = RuntimeGenerator
|
|
20
|
+
module.exports.WrappedGenerator = WrappedGenerator
|
|
20
21
|
module.exports.getRuntimeLogsDir = getRuntimeLogsDir
|
|
21
22
|
module.exports.loadConfig = loadConfig
|
|
22
23
|
module.exports.platformaticRuntime = platformaticRuntime
|
package/lib/config.js
CHANGED
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
const { readdir } = require('node:fs/promises')
|
|
4
4
|
const { join, resolve: pathResolve, isAbsolute } = require('node:path')
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
const {
|
|
6
|
+
createRequire,
|
|
7
|
+
loadModule,
|
|
8
|
+
omitProperties,
|
|
9
|
+
schemaComponents: { runtimeUnwrappablePropertiesList }
|
|
10
|
+
} = require('@platformatic/utils')
|
|
7
11
|
const ConfigManager = require('@platformatic/config')
|
|
8
12
|
const { Store } = require('@platformatic/config')
|
|
9
13
|
|
|
@@ -259,11 +263,18 @@ async function wrapConfigInRuntimeConfig ({ configManager, args }) {
|
|
|
259
263
|
// on purpose, the package.json might be missing
|
|
260
264
|
}
|
|
261
265
|
|
|
266
|
+
// If the service supports its (so far, only @platformatic/service and descendants)
|
|
267
|
+
const { hostname, port, http2, https } = configManager.current.server ?? {}
|
|
268
|
+
const server = { hostname, port, http2, https }
|
|
269
|
+
|
|
270
|
+
// Important: do not change the order of the properties in this object
|
|
262
271
|
/* c8 ignore next */
|
|
263
272
|
const wrapperConfig = {
|
|
264
273
|
$schema: schema.$id,
|
|
265
|
-
|
|
274
|
+
server,
|
|
266
275
|
watch: true,
|
|
276
|
+
...omitProperties(configManager.current.runtime ?? {}, runtimeUnwrappablePropertiesList),
|
|
277
|
+
entrypoint: serviceId,
|
|
267
278
|
services: [
|
|
268
279
|
{
|
|
269
280
|
id: serviceId,
|
|
@@ -272,6 +283,7 @@ async function wrapConfigInRuntimeConfig ({ configManager, args }) {
|
|
|
272
283
|
}
|
|
273
284
|
]
|
|
274
285
|
}
|
|
286
|
+
|
|
275
287
|
const cm = new ConfigManager({
|
|
276
288
|
source: wrapperConfig,
|
|
277
289
|
schema,
|
|
@@ -287,6 +299,7 @@ async function wrapConfigInRuntimeConfig ({ configManager, args }) {
|
|
|
287
299
|
})
|
|
288
300
|
|
|
289
301
|
await cm.parseAndValidate()
|
|
302
|
+
|
|
290
303
|
return cm
|
|
291
304
|
}
|
|
292
305
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const { BaseGenerator } = require('@platformatic/generators')
|
|
4
4
|
const { NoEntryPointError, NoServiceNamedError } = require('./errors')
|
|
5
5
|
const { existsSync } = require('node:fs')
|
|
6
|
-
const { join } = require('node:path')
|
|
6
|
+
const { join, basename } = require('node:path')
|
|
7
7
|
const { envObjectToString } = require('@platformatic/generators/lib/utils')
|
|
8
8
|
const { readFile, readdir, stat } = require('node:fs/promises')
|
|
9
9
|
const { ConfigManager } = require('@platformatic/config')
|
|
@@ -14,6 +14,30 @@ const { getArrayDifference } = require('../utils')
|
|
|
14
14
|
const { pathToFileURL } = require('node:url')
|
|
15
15
|
const { createRequire, safeRemove, generateDashedName } = require('@platformatic/utils')
|
|
16
16
|
|
|
17
|
+
const wrappableProperties = {
|
|
18
|
+
logger: {
|
|
19
|
+
level: '{PLT_SERVER_LOGGER_LEVEL}'
|
|
20
|
+
},
|
|
21
|
+
server: {
|
|
22
|
+
hostname: '{PLT_SERVER_HOSTNAME}',
|
|
23
|
+
port: '{PORT}'
|
|
24
|
+
},
|
|
25
|
+
managementApi: '{PLT_MANAGEMENT_API}'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const engines = {
|
|
29
|
+
node: '^18.8.0 || >=20.6.0'
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getRuntimeBaseEnvVars (config) {
|
|
33
|
+
return {
|
|
34
|
+
PLT_SERVER_HOSTNAME: '127.0.0.1',
|
|
35
|
+
PORT: config.port || 3042,
|
|
36
|
+
PLT_SERVER_LOGGER_LEVEL: config.logLevel || 'info',
|
|
37
|
+
PLT_MANAGEMENT_API: true
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
17
41
|
class RuntimeGenerator extends BaseGenerator {
|
|
18
42
|
constructor (opts) {
|
|
19
43
|
super({
|
|
@@ -62,7 +86,9 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
62
86
|
name: `${this.runtimeName}`,
|
|
63
87
|
workspaces: [this.servicesFolder + '/*'],
|
|
64
88
|
scripts: {
|
|
65
|
-
|
|
89
|
+
dev: this.config.devCommand,
|
|
90
|
+
build: this.config.buildCommand,
|
|
91
|
+
start: this.config.startCommand ?? 'platformatic start'
|
|
66
92
|
},
|
|
67
93
|
devDependencies: {
|
|
68
94
|
fastify: `^${this.fastifyVersion}`,
|
|
@@ -74,9 +100,7 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
74
100
|
wattpm: `^${this.platformaticVersion}`,
|
|
75
101
|
...this.config.dependencies
|
|
76
102
|
},
|
|
77
|
-
engines
|
|
78
|
-
node: '^18.8.0 || >=20.6.0'
|
|
79
|
-
}
|
|
103
|
+
engines
|
|
80
104
|
}
|
|
81
105
|
if (this.config.typescript) {
|
|
82
106
|
const typescriptVersion = JSON.parse(await readFile(join(__dirname, '..', '..', 'package.json'), 'utf-8'))
|
|
@@ -93,15 +117,7 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
93
117
|
this.setServicesConfigValues()
|
|
94
118
|
this.addServicesDependencies()
|
|
95
119
|
|
|
96
|
-
this.addEnvVars(
|
|
97
|
-
{
|
|
98
|
-
PLT_SERVER_HOSTNAME: '127.0.0.1',
|
|
99
|
-
PORT: this.config.port || 3042,
|
|
100
|
-
PLT_SERVER_LOGGER_LEVEL: this.config.logLevel || 'info',
|
|
101
|
-
PLT_MANAGEMENT_API: true
|
|
102
|
-
},
|
|
103
|
-
{ overwrite: false, default: true }
|
|
104
|
-
)
|
|
120
|
+
this.addEnvVars(getRuntimeBaseEnvVars(this.config), { overwrite: false, default: true })
|
|
105
121
|
}
|
|
106
122
|
|
|
107
123
|
addServicesDependencies () {
|
|
@@ -119,7 +135,8 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
119
135
|
return
|
|
120
136
|
}
|
|
121
137
|
this._hasCheckedForExistingConfig = true
|
|
122
|
-
const existingConfigFile =
|
|
138
|
+
const existingConfigFile =
|
|
139
|
+
this.runtimeConfig ?? (await ConfigManager.findConfigFile(this.targetDirectory, 'runtime'))
|
|
123
140
|
if (existingConfigFile && existsSync(join(this.targetDirectory, existingConfigFile))) {
|
|
124
141
|
const configManager = new ConfigManager({
|
|
125
142
|
...platformaticRuntime.configManagerConfig,
|
|
@@ -170,14 +187,7 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
170
187
|
path: this.config.autoload || this.servicesFolder,
|
|
171
188
|
exclude: ['docs']
|
|
172
189
|
},
|
|
173
|
-
|
|
174
|
-
level: '{PLT_SERVER_LOGGER_LEVEL}'
|
|
175
|
-
},
|
|
176
|
-
server: {
|
|
177
|
-
hostname: '{PLT_SERVER_HOSTNAME}',
|
|
178
|
-
port: '{PORT}'
|
|
179
|
-
},
|
|
180
|
-
managementApi: '{PLT_MANAGEMENT_API}'
|
|
190
|
+
...wrappableProperties
|
|
181
191
|
}
|
|
182
192
|
|
|
183
193
|
return config
|
|
@@ -326,9 +336,7 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
326
336
|
const output = {
|
|
327
337
|
services: []
|
|
328
338
|
}
|
|
329
|
-
const runtimePkgConfigFileData = JSON.parse(
|
|
330
|
-
await readFile(join(this.targetDirectory, this.runtimeConfig), 'utf-8')
|
|
331
|
-
)
|
|
339
|
+
const runtimePkgConfigFileData = JSON.parse(await readFile(join(this.targetDirectory, this.runtimeConfig), 'utf-8'))
|
|
332
340
|
const servicesPath = join(this.targetDirectory, runtimePkgConfigFileData.autoload.path)
|
|
333
341
|
|
|
334
342
|
// load all services
|
|
@@ -388,9 +396,7 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
388
396
|
// delete dependencies
|
|
389
397
|
const servicePath = join(this.targetDirectory, this.servicesFolder, s.name)
|
|
390
398
|
const configFile = await ConfigManager.findConfigFile(servicePath)
|
|
391
|
-
const servicePackageJson = JSON.parse(
|
|
392
|
-
await readFile(join(servicePath, configFile), 'utf-8')
|
|
393
|
-
)
|
|
399
|
+
const servicePackageJson = JSON.parse(await readFile(join(servicePath, configFile), 'utf-8'))
|
|
394
400
|
if (servicePackageJson.plugins && servicePackageJson.plugins.packages) {
|
|
395
401
|
servicePackageJson.plugins.packages.forEach(p => {
|
|
396
402
|
delete currrentPackageJson.dependencies[p.name]
|
|
@@ -502,5 +508,96 @@ class RuntimeGenerator extends BaseGenerator {
|
|
|
502
508
|
}
|
|
503
509
|
}
|
|
504
510
|
|
|
505
|
-
|
|
506
|
-
|
|
511
|
+
class WrappedGenerator extends BaseGenerator {
|
|
512
|
+
async prepare () {
|
|
513
|
+
await this.getPlatformaticVersion()
|
|
514
|
+
await this.#updateEnvironment()
|
|
515
|
+
await this.#updatePackageJson()
|
|
516
|
+
await this.#createConfigFile()
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
async #updateEnvironment () {
|
|
520
|
+
this.addEnvVars(getRuntimeBaseEnvVars(this.config), { overwrite: false, default: true })
|
|
521
|
+
|
|
522
|
+
this.addFile({
|
|
523
|
+
path: '',
|
|
524
|
+
file: '.env',
|
|
525
|
+
contents: (await this.#readExistingFile('.env', '', '\n')) + envObjectToString(this.config.env)
|
|
526
|
+
})
|
|
527
|
+
|
|
528
|
+
this.addFile({
|
|
529
|
+
path: '',
|
|
530
|
+
file: '.env.sample',
|
|
531
|
+
contents: (await this.#readExistingFile('.env.sample', '', '\n')) + envObjectToString(this.config.env)
|
|
532
|
+
})
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
async #updatePackageJson () {
|
|
536
|
+
// Manipulate the package.json, if any
|
|
537
|
+
const packageJson = JSON.parse(await this.#readExistingFile('package.json', '{}'))
|
|
538
|
+
let { name, dependencies, devDependencies, scripts, engines: packageJsonEngines, ...rest } = packageJson
|
|
539
|
+
|
|
540
|
+
// Add the dependencies
|
|
541
|
+
dependencies = {
|
|
542
|
+
...dependencies,
|
|
543
|
+
[this.module]: `^${this.platformaticVersion}`,
|
|
544
|
+
platformatic: `^${this.platformaticVersion}`,
|
|
545
|
+
wattpm: `^${this.platformaticVersion}`
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// For easier readbility, sort dependencies and devDependencies by name
|
|
549
|
+
dependencies = Object.fromEntries(Object.entries(dependencies).sort(([a], [b]) => a.localeCompare(b)))
|
|
550
|
+
devDependencies = Object.fromEntries(Object.entries(devDependencies ?? {}).sort(([a], [b]) => a.localeCompare(b)))
|
|
551
|
+
|
|
552
|
+
scripts ??= {}
|
|
553
|
+
scripts.dev ??= this.config.devCommand
|
|
554
|
+
scripts.build ??= this.config.buildCommand
|
|
555
|
+
scripts.start ??= this.config.startCommand ?? 'platformatic start'
|
|
556
|
+
|
|
557
|
+
this.addFile({
|
|
558
|
+
path: '',
|
|
559
|
+
file: 'package.json',
|
|
560
|
+
contents: JSON.stringify(
|
|
561
|
+
{
|
|
562
|
+
name: name ?? this.projectName ?? this.runtimeName ?? basename(this.targetDirectory),
|
|
563
|
+
scripts,
|
|
564
|
+
dependencies,
|
|
565
|
+
devDependencies,
|
|
566
|
+
...rest,
|
|
567
|
+
engines: { ...packageJsonEngines, ...engines }
|
|
568
|
+
},
|
|
569
|
+
null,
|
|
570
|
+
2
|
|
571
|
+
)
|
|
572
|
+
})
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
async #createConfigFile () {
|
|
576
|
+
const config = {
|
|
577
|
+
$schema: `https://schemas.platformatic.dev/${this.module}/${this.platformaticVersion}.json`,
|
|
578
|
+
runtime: wrappableProperties
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
this.addFile({
|
|
582
|
+
path: '',
|
|
583
|
+
file: 'watt.json',
|
|
584
|
+
contents: JSON.stringify(config, null, 2)
|
|
585
|
+
})
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
async #readExistingFile (path, emptyContents = '', suffix = '') {
|
|
589
|
+
const filePath = join(this.targetDirectory, path)
|
|
590
|
+
|
|
591
|
+
if (!existsSync(filePath)) {
|
|
592
|
+
return emptyContents
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
const contents = await readFile(filePath, 'utf-8')
|
|
596
|
+
return contents + suffix
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
module.exports = {
|
|
601
|
+
RuntimeGenerator,
|
|
602
|
+
WrappedGenerator
|
|
603
|
+
}
|
package/lib/logger.js
CHANGED
|
@@ -20,15 +20,22 @@ const customPrettifiers = {
|
|
|
20
20
|
|
|
21
21
|
// Create the runtime logger
|
|
22
22
|
async function createLogger (config, runtimeLogsDir) {
|
|
23
|
-
const loggerConfig = { ...config.logger }
|
|
23
|
+
const loggerConfig = { ...config.logger, transport: undefined }
|
|
24
|
+
if (config.logger.base === null) {
|
|
25
|
+
loggerConfig.base = undefined
|
|
26
|
+
}
|
|
24
27
|
|
|
25
28
|
// PLT_RUNTIME_LOGGER_STDOUT is used in test to reduce verbosity
|
|
26
|
-
|
|
29
|
+
let cliStream = process.env.PLT_RUNTIME_LOGGER_STDOUT
|
|
27
30
|
? pino.destination(process.env.PLT_RUNTIME_LOGGER_STDOUT)
|
|
28
31
|
: isatty(1)
|
|
29
32
|
? pretty({ customPrettifiers })
|
|
30
33
|
: pino.destination(1)
|
|
31
34
|
|
|
35
|
+
if (config.logger.transport) {
|
|
36
|
+
cliStream = pino.transport(config.logger.transport)
|
|
37
|
+
}
|
|
38
|
+
|
|
32
39
|
if (loggerConfig.formatters) {
|
|
33
40
|
loggerConfig.formatters = buildPinoFormatters(loggerConfig.formatters)
|
|
34
41
|
}
|
|
@@ -40,43 +47,36 @@ async function createLogger (config, runtimeLogsDir) {
|
|
|
40
47
|
return [pino(loggerConfig, cliStream), cliStream]
|
|
41
48
|
}
|
|
42
49
|
|
|
43
|
-
const multiStream = pino.multistream([{ stream: cliStream, level: loggerConfig.level
|
|
44
|
-
|
|
45
|
-
if (loggerConfig.transport) {
|
|
46
|
-
const transport = pino.transport(loggerConfig.transport)
|
|
47
|
-
multiStream.add({ level: loggerConfig.level || 'info', stream: transport })
|
|
48
|
-
}
|
|
50
|
+
const multiStream = pino.multistream([{ stream: cliStream, level: loggerConfig.level }])
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const logsLimitMb = config.managementApi?.logs?.maxSize || 200
|
|
52
|
+
const logsFileMb = 5
|
|
53
|
+
const logsLimitMb = config.managementApi?.logs?.maxSize || 200
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
let logsLimitCount = Math.ceil(logsLimitMb / logsFileMb) - 1
|
|
56
|
+
if (logsLimitCount < 1) {
|
|
57
|
+
logsLimitCount = 1
|
|
58
|
+
}
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
60
|
+
const pinoRoll = pino.transport({
|
|
61
|
+
target: 'pino-roll',
|
|
62
|
+
options: {
|
|
63
|
+
file: join(runtimeLogsDir, 'logs'),
|
|
64
|
+
mode: 0o600,
|
|
65
|
+
size: logsFileMb + 'm',
|
|
66
|
+
mkdir: true,
|
|
67
|
+
fsync: true,
|
|
68
|
+
limit: {
|
|
69
|
+
count: logsLimitCount
|
|
70
70
|
}
|
|
71
|
-
}
|
|
71
|
+
}
|
|
72
|
+
})
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
multiStream.add({ level: loggerConfig.level, stream: pinoRoll })
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
76
|
+
// Make sure there is a file before continuing otherwise the management API log endpoint might bail out
|
|
77
|
+
await once(pinoRoll, 'ready')
|
|
78
78
|
|
|
79
|
-
return [pino(
|
|
79
|
+
return [pino(loggerConfig, multiStream), multiStream]
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
module.exports = { createLogger }
|