@citrineos/base
Version:
The base module for OCPP v2.0.1 including all interfaces. This module is not intended to be used directly, but rather as a dependency for other modules.
154 lines • 6.19 kB
JavaScript
"use strict";
// Copyright Contributors to the CitrineOS Project
//
// SPDX-License-Identifier: Apache 2.0
Object.defineProperty(exports, "__esModule", { value: true });
exports.bootstrapConfigSchema = void 0;
exports.loadBootstrapConfig = loadBootstrapConfig;
const zod_1 = require("zod");
const defineConfig_1 = require("./defineConfig");
// Bootstrap schema contains what's needed to start the application
exports.bootstrapConfigSchema = zod_1.z.object({
configFileName: zod_1.z.string().default('config.json'),
configDir: zod_1.z.string().optional(),
// Database configuration
database: zod_1.z.object({
host: zod_1.z.string().default('localhost'),
port: zod_1.z.number().int().positive().default(5432),
database: zod_1.z.string().default('citrine'),
dialect: zod_1.z.string().default('postgres'),
username: zod_1.z.string().default('citrine'),
password: zod_1.z.string().default('citrine'),
sync: zod_1.z.boolean().default(false),
alter: zod_1.z.boolean().default(false),
maxRetries: zod_1.z.number().int().positive().default(3),
retryDelay: zod_1.z.number().int().positive().default(1000),
}),
// File access configuration
fileAccess: zod_1.z
.object({
type: zod_1.z.enum(['local', 's3', 'directus']),
local: zod_1.z
.object({
defaultFilePath: zod_1.z.string().default('data'),
})
.optional(),
s3: zod_1.z
.object({
region: zod_1.z.string().optional(),
endpoint: zod_1.z.string().optional(),
defaultBucketName: zod_1.z.string().default('citrineos-s3-bucket'),
s3ForcePathStyle: zod_1.z.boolean().default(true),
accessKeyId: zod_1.z.string().optional(),
secretAccessKey: zod_1.z.string().optional(),
})
.optional(),
directus: zod_1.z
.object({
host: zod_1.z.string().default('localhost'),
port: zod_1.z.number().int().positive().default(8055),
token: zod_1.z.string().optional(),
username: zod_1.z.string().optional(),
password: zod_1.z.string().optional(),
generateFlows: zod_1.z.boolean().default(false),
})
.optional(),
})
.refine((obj) => {
// Ensure the selected type has corresponding config
switch (obj.type) {
case 'local':
return !!obj.local;
case 's3':
return !!obj.s3;
case 'directus':
return !!obj.directus;
default:
return false;
}
}, {
message: 'Configuration for the selected file access type must be provided',
}),
});
/**
* Helper function to load environment variables based on prefix
*/
function getEnvVarValue(key) {
const envKey = `${defineConfig_1.BOOSTRAP_CONFIG_ENV_VAR_PREFIX}${key}`.toUpperCase();
return process.env[envKey];
}
/**
* Parse a potentially JSON-formatted environment variable
*/
function parseEnvValue(value) {
try {
return JSON.parse(value);
}
catch (_a) {
return value;
}
}
/**
* Load bootstrap configuration from environment variables
*/
function loadBootstrapConfig() {
const config = {
configFileName: getEnvVarValue('config_filename') || 'config.json',
configDir: getEnvVarValue('config_dir'),
// Database configuration
database: {
host: getEnvVarValue('database_host'),
port: getEnvVarValue('database_port') && parseInt(getEnvVarValue('database_port'), 10),
database: getEnvVarValue('database_name'),
dialect: getEnvVarValue('database_dialect'),
username: getEnvVarValue('database_username'),
password: getEnvVarValue('database_password'),
sync: getEnvVarValue('database_sync') && parseEnvValue(getEnvVarValue('database_sync')),
alter: getEnvVarValue('database_alter') && parseEnvValue(getEnvVarValue('database_alter')),
maxRetries: getEnvVarValue('database_max_retries') &&
parseInt(getEnvVarValue('database_max_retries'), 10),
retryDelay: getEnvVarValue('database_retry_delay') &&
parseInt(getEnvVarValue('database_retry_delay'), 10),
},
fileAccess: {
type: getEnvVarValue('file_access_type') || 'local',
},
};
// File access configuration
switch (config.fileAccess.type) {
case 'local':
config.fileAccess.local = {
defaultFilePath: getEnvVarValue('file_access_local_default_file_path'),
};
break;
case 's3':
config.fileAccess.s3 = {
region: getEnvVarValue('file_access_s3_region'),
endpoint: getEnvVarValue('file_access_s3_endpoint'),
defaultBucketName: getEnvVarValue('file_access_s3_default_bucket_name'),
s3ForcePathStyle: getEnvVarValue('file_access_s3_force_path_style') &&
parseEnvValue(getEnvVarValue('file_access_s3_force_path_style')),
accessKeyId: getEnvVarValue('file_access_s3_access_key_id'),
secretAccessKey: getEnvVarValue('file_access_s3_secret_access_key'),
};
break;
case 'directus':
config.fileAccess.directus = {
host: getEnvVarValue('file_access_directus_host'),
port: getEnvVarValue('file_access_directus_port') &&
parseInt(getEnvVarValue('file_access_directus_port'), 10),
token: getEnvVarValue('file_access_directus_token'),
username: getEnvVarValue('file_access_directus_username'),
password: getEnvVarValue('file_access_directus_password'),
};
break;
}
try {
return exports.bootstrapConfigSchema.parse(config);
}
catch (error) {
console.error('Bootstrap configuration validation failed:', error);
throw error;
}
}
//# sourceMappingURL=boostrap.config.js.map