@achs/env 3.1.0 → 3.1.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/arguments.d.ts +25 -0
- package/arguments.d.ts.map +1 -0
- package/{src/arguments.ts → arguments.js} +8 -32
- package/arguments.js.map +1 -0
- package/commands/env.command.d.ts +8 -0
- package/commands/env.command.d.ts.map +1 -0
- package/commands/env.command.js +85 -0
- package/commands/env.command.js.map +1 -0
- package/commands/export.command.d.ts +8 -0
- package/commands/export.command.d.ts.map +1 -0
- package/commands/export.command.js +54 -0
- package/commands/export.command.js.map +1 -0
- package/{src/commands/index.ts → commands/index.d.ts} +1 -0
- package/commands/index.d.ts.map +1 -0
- package/commands/index.js +14 -0
- package/commands/index.js.map +1 -0
- package/commands/pull.command.d.ts +7 -0
- package/commands/pull.command.d.ts.map +1 -0
- package/commands/pull.command.js +39 -0
- package/commands/pull.command.js.map +1 -0
- package/commands/push.command.d.ts +7 -0
- package/commands/push.command.d.ts.map +1 -0
- package/commands/push.command.js +38 -0
- package/commands/push.command.js.map +1 -0
- package/commands/schema.command.d.ts +4 -0
- package/commands/schema.command.d.ts.map +1 -0
- package/commands/schema.command.js +18 -0
- package/commands/schema.command.js.map +1 -0
- package/exec.d.ts +3 -0
- package/exec.d.ts.map +1 -0
- package/exec.js +142 -0
- package/exec.js.map +1 -0
- package/{src/index.ts → index.d.ts} +1 -0
- package/index.d.ts.map +1 -0
- package/index.js +20 -0
- package/index.js.map +1 -0
- package/{src/interfaces/index.ts → interfaces/index.d.ts} +1 -0
- package/interfaces/index.d.ts.map +1 -0
- package/interfaces/index.js +18 -0
- package/interfaces/index.js.map +1 -0
- package/interfaces/loader.interface.d.ts +21 -0
- package/interfaces/loader.interface.d.ts.map +1 -0
- package/interfaces/loader.interface.js +3 -0
- package/interfaces/loader.interface.js.map +1 -0
- package/main.d.ts +3 -0
- package/main.d.ts.map +1 -0
- package/main.js +6 -0
- package/main.js.map +1 -0
- package/package.json +1 -1
- package/providers/app-settings.provider.d.ts +8 -0
- package/providers/app-settings.provider.d.ts.map +1 -0
- package/providers/app-settings.provider.js +50 -0
- package/providers/app-settings.provider.js.map +1 -0
- package/providers/azure-key-vault.provider.d.ts +20 -0
- package/providers/azure-key-vault.provider.d.ts.map +1 -0
- package/providers/azure-key-vault.provider.js +143 -0
- package/providers/azure-key-vault.provider.js.map +1 -0
- package/providers/index.d.ts +7 -0
- package/providers/index.d.ts.map +1 -0
- package/providers/index.js +30 -0
- package/providers/index.js.map +1 -0
- package/providers/local.provider.d.ts +8 -0
- package/providers/local.provider.d.ts.map +1 -0
- package/providers/local.provider.js +31 -0
- package/providers/local.provider.js.map +1 -0
- package/providers/package-json.provider.d.ts +8 -0
- package/providers/package-json.provider.d.ts.map +1 -0
- package/providers/package-json.provider.js +29 -0
- package/providers/package-json.provider.js.map +1 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/utils/command.util.d.ts +13 -0
- package/utils/command.util.d.ts.map +1 -0
- package/utils/command.util.js +134 -0
- package/utils/command.util.js.map +1 -0
- package/{src/utils/index.ts → utils/index.d.ts} +1 -0
- package/utils/index.d.ts.map +1 -0
- package/utils/index.js +23 -0
- package/utils/index.js.map +1 -0
- package/utils/interpolate.util.d.ts +4 -0
- package/utils/interpolate.util.d.ts.map +1 -0
- package/utils/interpolate.util.js +33 -0
- package/utils/interpolate.util.js.map +1 -0
- package/utils/json.util.d.ts +5 -0
- package/utils/json.util.d.ts.map +1 -0
- package/utils/json.util.js +48 -0
- package/utils/json.util.js.map +1 -0
- package/utils/logger.d.ts +3 -0
- package/utils/logger.d.ts.map +1 -0
- package/{src/utils/logger.ts → utils/logger.js} +6 -6
- package/utils/logger.js.map +1 -0
- package/utils/normalize.util.d.ts +3 -0
- package/utils/normalize.util.d.ts.map +1 -0
- package/utils/normalize.util.js +61 -0
- package/utils/normalize.util.js.map +1 -0
- package/utils/schema.util.d.ts +11 -0
- package/utils/schema.util.d.ts.map +1 -0
- package/utils/schema.util.js +100 -0
- package/utils/schema.util.js.map +1 -0
- package/.eslintignore +0 -3
- package/.eslintrc.json +0 -329
- package/.vscode/extensions.json +0 -18
- package/.vscode/launch.json +0 -30
- package/.vscode/settings.json +0 -29
- package/jest.config.json +0 -28
- package/src/commands/env.command.ts +0 -139
- package/src/commands/export.command.ts +0 -88
- package/src/commands/pull.command.ts +0 -52
- package/src/commands/push.command.ts +0 -48
- package/src/commands/schema.command.ts +0 -31
- package/src/exec.ts +0 -221
- package/src/interfaces/loader.interface.ts +0 -66
- package/src/main.ts +0 -6
- package/src/providers/app-settings.provider.ts +0 -67
- package/src/providers/azure-key-vault.provider.ts +0 -277
- package/src/providers/index.ts +0 -29
- package/src/providers/local.provider.ts +0 -44
- package/src/providers/package-json.provider.ts +0 -39
- package/src/utils/command.util.ts +0 -223
- package/src/utils/interpolate.util.ts +0 -65
- package/src/utils/json.util.ts +0 -116
- package/src/utils/normalize.util.ts +0 -142
- package/src/utils/schema.util.ts +0 -191
- package/tests/env/appsettings.json +0 -32
- package/tests/env/dev.env.json +0 -12
- package/tests/env/dev.local.env.json +0 -9
- package/tests/env/env.schema.json +0 -225
- package/tests/env/keys.json +0 -7
- package/tests/env/settings/schema.json +0 -239
- package/tests/env/settings/settings.json +0 -22
- package/tests/env.int.test.ts +0 -42
- package/tests/exec.ts +0 -19
- package/tests/export.int.test.ts +0 -9
- package/tests/pull-push.int.test.ts +0 -15
- package/tests/run.js +0 -32
- package/tests/schema.int.test.ts +0 -9
- package/tests/setup.ts +0 -13
- package/tsconfig.build.json +0 -10
- package/tsconfig.json +0 -37
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import merge from 'merge-deep';
|
|
3
|
-
import { spawn } from 'child_process';
|
|
4
|
-
import { CommandModule } from 'yargs';
|
|
5
|
-
import { CommandArguments } from '../arguments';
|
|
6
|
-
import {
|
|
7
|
-
createValidator,
|
|
8
|
-
flatAndValidateResults,
|
|
9
|
-
flatResults,
|
|
10
|
-
flatSchema,
|
|
11
|
-
flatten,
|
|
12
|
-
interpolate,
|
|
13
|
-
loadVariablesFromProviders,
|
|
14
|
-
logger,
|
|
15
|
-
normalize
|
|
16
|
-
} from '../utils';
|
|
17
|
-
|
|
18
|
-
export interface EnvCommandArguments extends CommandArguments {
|
|
19
|
-
// Command for execute after inject environment variables.
|
|
20
|
-
// Should be prefixed or surrounded by ':' character.
|
|
21
|
-
subcmd: string[];
|
|
22
|
-
// whether validate schema before injecting variables
|
|
23
|
-
schemaValidate: boolean;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Main command.
|
|
28
|
-
* Injects environment variables into process.env.
|
|
29
|
-
*
|
|
30
|
-
* @example [>_]: env -e dev -m debug : npm start
|
|
31
|
-
*/
|
|
32
|
-
export const envCommand: CommandModule<any, EnvCommandArguments> = {
|
|
33
|
-
command: '$0 [options..] [: <subcmd> :]',
|
|
34
|
-
describe: 'Inject environment variables into process',
|
|
35
|
-
builder: (builder) => {
|
|
36
|
-
builder
|
|
37
|
-
.options({
|
|
38
|
-
subcmd: {
|
|
39
|
-
type: 'array',
|
|
40
|
-
describe: 'Command for inject environment variables'
|
|
41
|
-
},
|
|
42
|
-
schemaValidate: {
|
|
43
|
-
alias: 'validate',
|
|
44
|
-
type: 'boolean',
|
|
45
|
-
default: true,
|
|
46
|
-
describe: 'Whether validates variables using JSON schema'
|
|
47
|
-
}
|
|
48
|
-
})
|
|
49
|
-
.example(
|
|
50
|
-
'env -e dev -m test unit : npm test',
|
|
51
|
-
'Loads "dev" environment variables, in "test" and "unit" modes, for "npm start" command'
|
|
52
|
-
)
|
|
53
|
-
.example(
|
|
54
|
-
'env -e dev -m debug : npm start : -c my-config.json',
|
|
55
|
-
'Loads "dev" environment variables, in "debug" mode, for "npm test" command and custom config file'
|
|
56
|
-
)
|
|
57
|
-
.example(
|
|
58
|
-
'env -e dev -m debug -c [[root]]/[[env]].env.json : npm start',
|
|
59
|
-
'Loads custom config file placed in root folder and named same as the env'
|
|
60
|
-
)
|
|
61
|
-
.check((argv): boolean => {
|
|
62
|
-
// special check for custom argument
|
|
63
|
-
if (argv._.length === 0 && !argv.subcmd) {
|
|
64
|
-
logger.error(
|
|
65
|
-
'No one subcommand provided for exec surrounded by :'
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
process.exit(1);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return true;
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return builder;
|
|
75
|
-
},
|
|
76
|
-
handler: async ({ providers, schemaValidate, expand, ...argv }) => {
|
|
77
|
-
const results = await loadVariablesFromProviders(providers, argv);
|
|
78
|
-
|
|
79
|
-
let env = merge({ NODE_ENV: 'development' }, ...flatResults(results));
|
|
80
|
-
env = flatten(env, argv.nestingDelimiter);
|
|
81
|
-
|
|
82
|
-
if (schemaValidate) {
|
|
83
|
-
let schema = {};
|
|
84
|
-
|
|
85
|
-
for (const {
|
|
86
|
-
handler: { key }
|
|
87
|
-
} of providers) {
|
|
88
|
-
const providerSchema = argv.schema?.[key];
|
|
89
|
-
|
|
90
|
-
if (providerSchema) {
|
|
91
|
-
schema = Object.assign(
|
|
92
|
-
schema,
|
|
93
|
-
flatSchema(providerSchema, '', argv.nestingDelimiter)
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const validator = createValidator({
|
|
99
|
-
type: 'object',
|
|
100
|
-
properties: schema
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
if (!validator(env)) {
|
|
104
|
-
logger.error('schema validation failed', validator.errors);
|
|
105
|
-
|
|
106
|
-
process.exit(1);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
env = normalize(env, argv.nestingDelimiter, argv.arrayDescomposition);
|
|
111
|
-
if (expand) env = interpolate(env, env);
|
|
112
|
-
|
|
113
|
-
logger.debug('environment loaded:', env);
|
|
114
|
-
|
|
115
|
-
// loads env vars to process.env
|
|
116
|
-
process.env = {
|
|
117
|
-
...process.env,
|
|
118
|
-
...env
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
logger.info(
|
|
122
|
-
'executing command >',
|
|
123
|
-
chalk.bold.yellow(argv.subcmd.join(' '))
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
spawn(argv.subcmd[0], argv.subcmd.slice(1), {
|
|
127
|
-
stdio: 'inherit',
|
|
128
|
-
shell: true
|
|
129
|
-
}).on('exit', (code) => {
|
|
130
|
-
if (code === 0) {
|
|
131
|
-
logger.info('process finished successfully');
|
|
132
|
-
} else {
|
|
133
|
-
logger.error('process finished with error');
|
|
134
|
-
|
|
135
|
-
process.exit(1);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
};
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import merge from 'merge-deep';
|
|
2
|
-
import { CommandModule } from 'yargs';
|
|
3
|
-
import { CommandArguments } from '../arguments';
|
|
4
|
-
import {
|
|
5
|
-
flatAndValidateResults,
|
|
6
|
-
flatten,
|
|
7
|
-
interpolate,
|
|
8
|
-
loadVariablesFromProviders,
|
|
9
|
-
logger,
|
|
10
|
-
normalize,
|
|
11
|
-
writeEnvFromJson,
|
|
12
|
-
writeJson
|
|
13
|
-
} from '../utils';
|
|
14
|
-
|
|
15
|
-
export interface ExportCommandArguments extends CommandArguments {
|
|
16
|
-
format: 'json' | 'dotenv';
|
|
17
|
-
|
|
18
|
-
uri: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Export command.
|
|
23
|
-
* Export environment variables to a file.
|
|
24
|
-
*
|
|
25
|
-
* @example [>_]: env export -e dev -m build
|
|
26
|
-
*/
|
|
27
|
-
export const exportCommand: CommandModule<any, ExportCommandArguments> = {
|
|
28
|
-
command: 'export [options..]',
|
|
29
|
-
describe: 'Export unified environment variables to a file from providers',
|
|
30
|
-
builder: (builder) => {
|
|
31
|
-
builder
|
|
32
|
-
.options({
|
|
33
|
-
uri: {
|
|
34
|
-
alias: ['u', 'p', 'path'],
|
|
35
|
-
type: 'string',
|
|
36
|
-
default: '.env',
|
|
37
|
-
describe: 'Uri for export file with variables'
|
|
38
|
-
},
|
|
39
|
-
format: {
|
|
40
|
-
alias: 'f',
|
|
41
|
-
type: 'string',
|
|
42
|
-
default: 'dotenv',
|
|
43
|
-
choices: ['json', 'dotenv'],
|
|
44
|
-
describe: 'Format for export variables'
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
.example(
|
|
48
|
-
'env export -e dev -m build',
|
|
49
|
-
'Exports "dev" variables to a dotenv file at root as ".env"'
|
|
50
|
-
)
|
|
51
|
-
.example(
|
|
52
|
-
'env export -e prod -m build -f json --uri [[env]].env.json',
|
|
53
|
-
'Exports "prod" variables to a json file at root as "prod.env.json"'
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
return builder;
|
|
57
|
-
},
|
|
58
|
-
handler: async ({ providers, expand, ...argv }) => {
|
|
59
|
-
const results = await loadVariablesFromProviders(providers, argv);
|
|
60
|
-
|
|
61
|
-
let env = merge(
|
|
62
|
-
{ NODE_ENV: 'development' },
|
|
63
|
-
...flatAndValidateResults(results, argv)
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
// results normalization merging
|
|
67
|
-
env = flatten(env, argv.nestingDelimiter);
|
|
68
|
-
env = normalize(env, argv.nestingDelimiter, argv.arrayDescomposition);
|
|
69
|
-
if (expand) env = interpolate(env, env);
|
|
70
|
-
|
|
71
|
-
logger.debug('environment loaded:', env);
|
|
72
|
-
|
|
73
|
-
const { format, uri } = argv;
|
|
74
|
-
|
|
75
|
-
switch (format) {
|
|
76
|
-
case 'dotenv':
|
|
77
|
-
await writeEnvFromJson(uri, env, true);
|
|
78
|
-
break;
|
|
79
|
-
|
|
80
|
-
case 'json':
|
|
81
|
-
await writeJson(uri, env, true);
|
|
82
|
-
break;
|
|
83
|
-
|
|
84
|
-
default:
|
|
85
|
-
logger.error(`format ${format} not recognized`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
};
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { CommandModule } from 'yargs';
|
|
3
|
-
import { CommandArguments } from '../arguments';
|
|
4
|
-
import { logger } from '../utils';
|
|
5
|
-
|
|
6
|
-
export interface PullCommandArguments extends CommandArguments {
|
|
7
|
-
// whether variables should be overwritten in already exists
|
|
8
|
-
overwrite: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Pulls environment variables from providers.
|
|
13
|
-
*
|
|
14
|
-
* @example [>_]: env pull -e dev
|
|
15
|
-
*/
|
|
16
|
-
export const pullCommand: CommandModule<any, PullCommandArguments> = {
|
|
17
|
-
command: 'pull [options..]',
|
|
18
|
-
describe: 'Pulls environment variables from providers',
|
|
19
|
-
builder: (builder) => {
|
|
20
|
-
builder
|
|
21
|
-
.options({
|
|
22
|
-
overwrite: {
|
|
23
|
-
alias: 'o',
|
|
24
|
-
type: 'boolean',
|
|
25
|
-
default: false,
|
|
26
|
-
describe: 'Overwrite local variables'
|
|
27
|
-
}
|
|
28
|
-
})
|
|
29
|
-
.example('env pull -e dev', 'Download "dev" environment secrets')
|
|
30
|
-
.example(
|
|
31
|
-
'env pull -e dev -o',
|
|
32
|
-
'Download and overwrite (if any exists) "dev" environment secrets'
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
return builder;
|
|
36
|
-
},
|
|
37
|
-
handler: async ({ providers, ...argv }) => {
|
|
38
|
-
const promises = await Promise.all(
|
|
39
|
-
providers
|
|
40
|
-
.filter(({ handler: { pull } }) => !!pull)
|
|
41
|
-
.map(({ handler: { key, pull }, config }) => {
|
|
42
|
-
logger.silly(`pulling from ${chalk.yellow(key)} provider`);
|
|
43
|
-
|
|
44
|
-
return pull!(argv, config);
|
|
45
|
-
})
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
if (promises.length > 0)
|
|
49
|
-
logger.info('environment variables pulled successfully');
|
|
50
|
-
else logger.warn('no providers for pull variables');
|
|
51
|
-
}
|
|
52
|
-
};
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { CommandModule } from 'yargs';
|
|
3
|
-
import { CommandArguments } from '../arguments';
|
|
4
|
-
import { logger } from '../utils';
|
|
5
|
-
|
|
6
|
-
export interface PushCommandArguments extends CommandArguments {
|
|
7
|
-
// forces to push in case of conflict
|
|
8
|
-
force: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Pushes environment variables to providers store.
|
|
13
|
-
*
|
|
14
|
-
* @example [>_]: env push -e dev
|
|
15
|
-
*/
|
|
16
|
-
export const pushCommand: CommandModule<any, PushCommandArguments> = {
|
|
17
|
-
command: 'push [options..]',
|
|
18
|
-
describe: 'Pushes environment variables to providers store',
|
|
19
|
-
builder: (builder) => {
|
|
20
|
-
builder
|
|
21
|
-
.options({
|
|
22
|
-
force: {
|
|
23
|
-
alias: 'f',
|
|
24
|
-
type: 'boolean',
|
|
25
|
-
default: false,
|
|
26
|
-
describe: 'Force push for secrets'
|
|
27
|
-
}
|
|
28
|
-
})
|
|
29
|
-
.example('env push -e dev', 'Download "dev" environment secrets');
|
|
30
|
-
|
|
31
|
-
return builder;
|
|
32
|
-
},
|
|
33
|
-
handler: async ({ providers, ...argv }) => {
|
|
34
|
-
const promises = await Promise.all(
|
|
35
|
-
providers
|
|
36
|
-
.filter(({ handler: { push } }) => !!push)
|
|
37
|
-
.map(({ handler: { key, push }, config }) => {
|
|
38
|
-
logger.debug(`pushing to ${chalk.yellow(key)} provider`);
|
|
39
|
-
|
|
40
|
-
return push!(argv, config);
|
|
41
|
-
})
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
if (promises.length > 0)
|
|
45
|
-
logger.info('environment variables pushed successfully');
|
|
46
|
-
else logger.warn('no providers for push variables');
|
|
47
|
-
}
|
|
48
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { CommandModule } from 'yargs';
|
|
2
|
-
import { CommandArguments } from '../arguments';
|
|
3
|
-
import {
|
|
4
|
-
generateSchemaFrom,
|
|
5
|
-
loadVariablesFromProviders,
|
|
6
|
-
logger
|
|
7
|
-
} from '../utils';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Generates validation schema from providers environment variables.
|
|
11
|
-
*
|
|
12
|
-
* @example [>_]: env schema -e dev -m build
|
|
13
|
-
*/
|
|
14
|
-
export const schemaCommand: CommandModule<any, CommandArguments> = {
|
|
15
|
-
command: 'schema [options..]',
|
|
16
|
-
describe: 'Generates validation schema from providers',
|
|
17
|
-
builder: (builder) => {
|
|
18
|
-
return builder.example(
|
|
19
|
-
'env schema --generate -e dev -m debug unit',
|
|
20
|
-
'Updates JSON schema'
|
|
21
|
-
);
|
|
22
|
-
},
|
|
23
|
-
handler: async (argv) => {
|
|
24
|
-
const results = await loadVariablesFromProviders(argv.providers, argv);
|
|
25
|
-
|
|
26
|
-
const schema = await generateSchemaFrom(results, argv);
|
|
27
|
-
|
|
28
|
-
logger.silly('schema:', schema);
|
|
29
|
-
logger.info('schema updated successfully');
|
|
30
|
-
}
|
|
31
|
-
};
|
package/src/exec.ts
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import chalk from 'chalk';
|
|
4
|
-
import yargsParser from 'yargs-parser';
|
|
5
|
-
import yargs, { Arguments } from 'yargs';
|
|
6
|
-
import { IntegratedProviders } from './providers';
|
|
7
|
-
import { args, CommandArguments } from './arguments';
|
|
8
|
-
import {
|
|
9
|
-
envCommand,
|
|
10
|
-
exportCommand,
|
|
11
|
-
pullCommand,
|
|
12
|
-
pushCommand,
|
|
13
|
-
schemaCommand
|
|
14
|
-
} from './commands';
|
|
15
|
-
import {
|
|
16
|
-
getSubcommand,
|
|
17
|
-
interpolateJson,
|
|
18
|
-
loadConfigFile,
|
|
19
|
-
loadProjectInfo,
|
|
20
|
-
loadSchemaFile,
|
|
21
|
-
logger,
|
|
22
|
-
resolvePath
|
|
23
|
-
} from './utils';
|
|
24
|
-
|
|
25
|
-
type Alias = string | string[];
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Preload basic config from command line and config file.
|
|
29
|
-
*
|
|
30
|
-
* @param {string[]} rawArgv process.argv
|
|
31
|
-
* @param {Partial<yargsParser.Configuration>} parser yargs parser config
|
|
32
|
-
* @param {[string, string]} delimiters
|
|
33
|
-
*
|
|
34
|
-
* @returns {Promise<Partial<CommandArguments>>} preloaded config
|
|
35
|
-
*/
|
|
36
|
-
async function preloadConfig(
|
|
37
|
-
rawArgv: string[],
|
|
38
|
-
parser: Partial<yargsParser.Configuration>,
|
|
39
|
-
delimiters: [string, string]
|
|
40
|
-
): Promise<Partial<CommandArguments>> {
|
|
41
|
-
// preload base config
|
|
42
|
-
const preloadedArgv = yargsParser(rawArgv, {
|
|
43
|
-
configuration: parser,
|
|
44
|
-
boolean: ['help'],
|
|
45
|
-
string: ['root', 'env', 'configFile', 'schemaFile', 'logLevel'],
|
|
46
|
-
array: ['modes', 'logMaskAnyRegEx', 'logMaskValuesOfKeys'],
|
|
47
|
-
alias: {
|
|
48
|
-
env: args.env.alias as Alias,
|
|
49
|
-
modes: args.modes.alias as Alias,
|
|
50
|
-
configFile: args.configFile.alias as Alias,
|
|
51
|
-
logLevel: args.logLevel.alias as Alias,
|
|
52
|
-
logMaskAnyRegEx: args.logMaskAnyRegEx.alias as Alias,
|
|
53
|
-
logMaskValuesOfKeys: args.logMaskValuesOfKeys.alias as Alias
|
|
54
|
-
},
|
|
55
|
-
default: {
|
|
56
|
-
root: args.root.default,
|
|
57
|
-
configFile: args.configFile.default
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// loads configuration file
|
|
62
|
-
await loadConfigFile(preloadedArgv, delimiters);
|
|
63
|
-
|
|
64
|
-
preloadedArgv.logLevel ??= args.logLevel.default;
|
|
65
|
-
preloadedArgv.logMaskAnyRegEx ??= args.logMaskAnyRegEx.default;
|
|
66
|
-
preloadedArgv.logMaskValuesOfKeys ??= args.logMaskValuesOfKeys.default;
|
|
67
|
-
preloadedArgv.providers ??= args.providers.default;
|
|
68
|
-
|
|
69
|
-
const { logLevel, logMaskAnyRegEx, logMaskValuesOfKeys } = preloadedArgv;
|
|
70
|
-
|
|
71
|
-
// logging level
|
|
72
|
-
logger.setSettings({
|
|
73
|
-
minLevel: logLevel,
|
|
74
|
-
maskAnyRegEx: logMaskAnyRegEx,
|
|
75
|
-
maskValuesOfKeys: logMaskValuesOfKeys
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return preloadedArgv;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Command preprocessing and lib info
|
|
83
|
-
* reading from package.json.
|
|
84
|
-
* Preloads config file and setup basic config.
|
|
85
|
-
*
|
|
86
|
-
* @param {string[]} rawArgv process.argv
|
|
87
|
-
*/
|
|
88
|
-
export async function exec(rawArgv: string[]) {
|
|
89
|
-
// reads some lib base config from package.json
|
|
90
|
-
const { config, version } = await import(`${__dirname}/package.json`);
|
|
91
|
-
|
|
92
|
-
// execs yargs
|
|
93
|
-
const subcommand = getSubcommand(rawArgv, config.delimiters.subcommand);
|
|
94
|
-
|
|
95
|
-
const preloadedArgv = await preloadConfig(
|
|
96
|
-
rawArgv,
|
|
97
|
-
config.parser,
|
|
98
|
-
config.delimiters.template
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
const { env, modes, providers, help } = preloadedArgv;
|
|
102
|
-
|
|
103
|
-
if (help) build(rawArgv, preloadedArgv, subcommand, config, version);
|
|
104
|
-
|
|
105
|
-
if (!Array.isArray(providers) || providers.length === 0) {
|
|
106
|
-
logger.error('no providers found');
|
|
107
|
-
|
|
108
|
-
process.exit(1);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
logger.info(
|
|
112
|
-
`loading ${chalk.bold.underline.green(env)} environment` +
|
|
113
|
-
(modes ? ` in ${chalk.bold.magenta(modes.join('+'))} mode` : '')
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
// read loaders from config
|
|
117
|
-
for (const provider of providers!) {
|
|
118
|
-
try {
|
|
119
|
-
logger.debug(`using ${chalk.yellow(provider.path)} provider`);
|
|
120
|
-
|
|
121
|
-
if (!provider.type || provider.type === 'integrated') {
|
|
122
|
-
provider.handler = IntegratedProviders[provider.path];
|
|
123
|
-
} else {
|
|
124
|
-
const { default: module } = await import(
|
|
125
|
-
provider.type === 'module'
|
|
126
|
-
? provider.path
|
|
127
|
-
: resolvePath(provider.path)
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
provider.handler = module;
|
|
131
|
-
}
|
|
132
|
-
} catch {
|
|
133
|
-
logger.error(
|
|
134
|
-
`${chalk.yellow(
|
|
135
|
-
provider.path
|
|
136
|
-
)} provider not found or not compatible`
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
process.exit(1);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
build(rawArgv, preloadedArgv, subcommand, config, version);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Builds commands and execs Yargs.
|
|
148
|
-
*
|
|
149
|
-
* @param {string[]} rawArgv process.argv.slice(2)
|
|
150
|
-
* @param {Partial<Arguments<CommandArguments>>} preloadedArgv
|
|
151
|
-
* @param {string[]} subcommand subcommand for wrap if exists
|
|
152
|
-
* @param {Record<string, any>} config lib config from package.json
|
|
153
|
-
* @param {string} version lib version from package.json
|
|
154
|
-
*/
|
|
155
|
-
function build(
|
|
156
|
-
rawArgv: string[],
|
|
157
|
-
preloadedArgv: Partial<Arguments<CommandArguments>>,
|
|
158
|
-
subcommand: string[],
|
|
159
|
-
config: Record<string, any>,
|
|
160
|
-
version = 'unknown'
|
|
161
|
-
): void {
|
|
162
|
-
const builder = yargs(rawArgv)
|
|
163
|
-
.strict()
|
|
164
|
-
.scriptName('env')
|
|
165
|
-
.version(version)
|
|
166
|
-
.detectLocale(false)
|
|
167
|
-
.showHelpOnFail(false)
|
|
168
|
-
.parserConfiguration(config.parser)
|
|
169
|
-
.usage('Usage: $0 [command] [options..] [: subcmd [:]] [options..]')
|
|
170
|
-
.options(args)
|
|
171
|
-
.middleware(async (argv): Promise<void> => {
|
|
172
|
-
// in case of subcommand argument for main
|
|
173
|
-
if (subcommand?.length > 0) argv.subcmd = subcommand;
|
|
174
|
-
|
|
175
|
-
// merges preloaded args
|
|
176
|
-
Object.assign(argv, preloadedArgv);
|
|
177
|
-
|
|
178
|
-
logger.silly(
|
|
179
|
-
'interpolating arguments surrounded by',
|
|
180
|
-
chalk.bold.yellow(
|
|
181
|
-
config.delimiters.template[0],
|
|
182
|
-
config.delimiters.template[1]
|
|
183
|
-
)
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
// applies string templating with current vars
|
|
187
|
-
interpolateJson(argv, argv, config.delimiters.template);
|
|
188
|
-
|
|
189
|
-
logger.silly('config loaded:', argv);
|
|
190
|
-
|
|
191
|
-
// loads environment JSON schema if exists
|
|
192
|
-
// and current project info from package.json
|
|
193
|
-
[argv.app, argv.schema] = await Promise.all([
|
|
194
|
-
loadProjectInfo(),
|
|
195
|
-
loadSchemaFile(argv, config.delimiters.template)
|
|
196
|
-
]);
|
|
197
|
-
|
|
198
|
-
if (argv.schemaValidate) {
|
|
199
|
-
argv.schemaValidate = !!argv.schema;
|
|
200
|
-
|
|
201
|
-
if (argv.schemaValidate)
|
|
202
|
-
logger.silly('schema loaded:', argv.schema);
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
// integrated commands builder
|
|
207
|
-
builder.command(envCommand);
|
|
208
|
-
builder.command(exportCommand);
|
|
209
|
-
builder.command(pullCommand);
|
|
210
|
-
builder.command(pushCommand);
|
|
211
|
-
builder.command(schemaCommand);
|
|
212
|
-
|
|
213
|
-
const { providers } = preloadedArgv;
|
|
214
|
-
|
|
215
|
-
// extends command from plugins
|
|
216
|
-
for (const { handler } of providers!)
|
|
217
|
-
handler?.builder && handler.builder(builder);
|
|
218
|
-
|
|
219
|
-
// executes command processing
|
|
220
|
-
builder.parse();
|
|
221
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { Arguments, Argv } from 'yargs';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Result of provider environment load.
|
|
5
|
-
*
|
|
6
|
-
* @export
|
|
7
|
-
* @type EnvResult
|
|
8
|
-
*/
|
|
9
|
-
export type EnvResult =
|
|
10
|
-
| Record<string, unknown>
|
|
11
|
-
| Record<string, unknown>[]
|
|
12
|
-
| Promise<Record<string, unknown>>
|
|
13
|
-
| Promise<Record<string, unknown>[]>;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Wrapped provider result for inject to env.
|
|
17
|
-
*
|
|
18
|
-
* @export
|
|
19
|
-
* @interface EnvProviderResult
|
|
20
|
-
*/
|
|
21
|
-
export interface EnvProviderResult {
|
|
22
|
-
key: string;
|
|
23
|
-
config?: Record<string, unknown>;
|
|
24
|
-
value: Record<string, any> | Record<string, any>[];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Provider handler.
|
|
29
|
-
*
|
|
30
|
-
* @export
|
|
31
|
-
* @interface EnvProvider
|
|
32
|
-
* @template A define arguments used by provider
|
|
33
|
-
* @template C define config used by provider
|
|
34
|
-
*/
|
|
35
|
-
export interface EnvProvider<
|
|
36
|
-
A,
|
|
37
|
-
C extends Record<string, any> | undefined = undefined
|
|
38
|
-
> {
|
|
39
|
-
// unique key
|
|
40
|
-
key: string;
|
|
41
|
-
|
|
42
|
-
// modifies command building (adds or modifies commands, options .etc)
|
|
43
|
-
builder?: (builder: Argv<unknown>) => void;
|
|
44
|
-
|
|
45
|
-
// loads environment variables.
|
|
46
|
-
load: (argv: Arguments<A>, config?: C) => EnvResult | never;
|
|
47
|
-
|
|
48
|
-
// pulls vars
|
|
49
|
-
pull?: (argv: Arguments<A>, config?: C) => void;
|
|
50
|
-
|
|
51
|
-
// push vars
|
|
52
|
-
push?: (argv: Arguments<A>, config?: C) => void;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Provider definition for config file.
|
|
57
|
-
*
|
|
58
|
-
* @export
|
|
59
|
-
* @interface EnvProviderConfig
|
|
60
|
-
*/
|
|
61
|
-
export interface EnvProviderConfig {
|
|
62
|
-
path: string;
|
|
63
|
-
type: 'integrated' | 'module' | 'script';
|
|
64
|
-
handler: EnvProvider<any, any>;
|
|
65
|
-
config?: Record<string, unknown>;
|
|
66
|
-
}
|