@karmaniverous/get-dotenv 6.0.0-0 → 6.0.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/README.md +86 -334
- package/dist/cli.d.ts +569 -0
- package/dist/cli.mjs +18788 -0
- package/dist/cliHost.d.ts +548 -253
- package/dist/cliHost.mjs +1990 -1458
- package/dist/config.d.ts +192 -14
- package/dist/config.mjs +256 -81
- package/dist/env-overlay.d.ts +226 -18
- package/dist/env-overlay.mjs +181 -22
- package/dist/getdotenv.cli.mjs +18166 -3437
- package/dist/index.d.ts +729 -136
- package/dist/index.mjs +18207 -3457
- package/dist/plugins-aws.d.ts +289 -104
- package/dist/plugins-aws.mjs +2462 -350
- package/dist/plugins-batch.d.ts +355 -105
- package/dist/plugins-batch.mjs +2595 -420
- package/dist/plugins-cmd.d.ts +287 -118
- package/dist/plugins-cmd.mjs +2661 -839
- package/dist/plugins-init.d.ts +272 -100
- package/dist/plugins-init.mjs +2152 -37
- package/dist/plugins.d.ts +323 -140
- package/dist/plugins.mjs +18006 -2025
- package/dist/templates/cli/index.ts +26 -0
- package/dist/templates/cli/plugins/hello.ts +43 -0
- package/dist/templates/config/js/getdotenv.config.js +20 -0
- package/dist/templates/config/json/local/getdotenv.config.local.json +7 -0
- package/dist/templates/config/json/public/getdotenv.config.json +9 -0
- package/dist/templates/config/public/getdotenv.config.json +8 -0
- package/dist/templates/config/ts/getdotenv.config.ts +28 -0
- package/dist/templates/config/yaml/local/getdotenv.config.local.yaml +7 -0
- package/dist/templates/config/yaml/public/getdotenv.config.yaml +7 -0
- package/dist/templates/getdotenv.config.js +20 -0
- package/dist/templates/getdotenv.config.json +9 -0
- package/dist/templates/getdotenv.config.local.json +7 -0
- package/dist/templates/getdotenv.config.local.yaml +7 -0
- package/dist/templates/getdotenv.config.ts +28 -0
- package/dist/templates/getdotenv.config.yaml +7 -0
- package/dist/templates/hello.ts +43 -0
- package/dist/templates/index.ts +26 -0
- package/dist/templates/js/getdotenv.config.js +20 -0
- package/dist/templates/json/local/getdotenv.config.local.json +7 -0
- package/dist/templates/json/public/getdotenv.config.json +9 -0
- package/dist/templates/local/getdotenv.config.local.json +7 -0
- package/dist/templates/local/getdotenv.config.local.yaml +7 -0
- package/dist/templates/plugins/hello.ts +43 -0
- package/dist/templates/public/getdotenv.config.json +9 -0
- package/dist/templates/public/getdotenv.config.yaml +7 -0
- package/dist/templates/ts/getdotenv.config.ts +28 -0
- package/dist/templates/yaml/local/getdotenv.config.local.yaml +7 -0
- package/dist/templates/yaml/public/getdotenv.config.yaml +7 -0
- package/getdotenv.config.json +1 -19
- package/package.json +52 -89
- package/templates/cli/index.ts +26 -0
- package/templates/cli/plugins/hello.ts +43 -0
- package/templates/config/js/getdotenv.config.js +9 -4
- package/templates/config/json/public/getdotenv.config.json +0 -3
- package/templates/config/public/getdotenv.config.json +0 -5
- package/templates/config/ts/getdotenv.config.ts +17 -5
- package/templates/config/yaml/public/getdotenv.config.yaml +0 -3
- package/dist/cliHost.cjs +0 -2078
- package/dist/cliHost.d.cts +0 -451
- package/dist/cliHost.d.mts +0 -451
- package/dist/config.cjs +0 -252
- package/dist/config.d.cts +0 -55
- package/dist/config.d.mts +0 -55
- package/dist/env-overlay.cjs +0 -163
- package/dist/env-overlay.d.cts +0 -50
- package/dist/env-overlay.d.mts +0 -50
- package/dist/index.cjs +0 -4077
- package/dist/index.d.cts +0 -318
- package/dist/index.d.mts +0 -318
- package/dist/plugins-aws.cjs +0 -666
- package/dist/plugins-aws.d.cts +0 -158
- package/dist/plugins-aws.d.mts +0 -158
- package/dist/plugins-batch.cjs +0 -658
- package/dist/plugins-batch.d.cts +0 -181
- package/dist/plugins-batch.d.mts +0 -181
- package/dist/plugins-cmd.cjs +0 -1112
- package/dist/plugins-cmd.d.cts +0 -178
- package/dist/plugins-cmd.d.mts +0 -178
- package/dist/plugins-demo.cjs +0 -352
- package/dist/plugins-demo.d.cts +0 -158
- package/dist/plugins-demo.d.mts +0 -158
- package/dist/plugins-demo.d.ts +0 -158
- package/dist/plugins-demo.mjs +0 -350
- package/dist/plugins-init.cjs +0 -289
- package/dist/plugins-init.d.cts +0 -162
- package/dist/plugins-init.d.mts +0 -162
- package/dist/plugins.cjs +0 -2327
- package/dist/plugins.d.cts +0 -211
- package/dist/plugins.d.mts +0 -211
- package/templates/cli/ts/index.ts +0 -9
- package/templates/cli/ts/plugins/hello.ts +0 -17
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createCli } from '@karmaniverous/get-dotenv/cli';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
awsPlugin,
|
|
7
|
+
awsWhoamiPlugin,
|
|
8
|
+
batchPlugin,
|
|
9
|
+
cmdPlugin,
|
|
10
|
+
initPlugin,
|
|
11
|
+
} from '@/src/plugins';
|
|
12
|
+
|
|
13
|
+
import { helloPlugin } from './plugins/hello';
|
|
14
|
+
|
|
15
|
+
await createCli({
|
|
16
|
+
alias: 'mycli',
|
|
17
|
+
compose: (program) =>
|
|
18
|
+
program
|
|
19
|
+
.use(
|
|
20
|
+
cmdPlugin({ asDefault: true, optionAlias: '-c, --cmd <command...>' }),
|
|
21
|
+
)
|
|
22
|
+
.use(batchPlugin())
|
|
23
|
+
.use(awsPlugin().use(awsWhoamiPlugin()))
|
|
24
|
+
.use(initPlugin())
|
|
25
|
+
.use(helloPlugin()),
|
|
26
|
+
})();
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePlugin,
|
|
3
|
+
getRootCommand,
|
|
4
|
+
} from '@karmaniverous/get-dotenv/cliHost';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
|
|
7
|
+
const HelloConfigSchema = z.object({
|
|
8
|
+
loud: z.boolean().optional().default(false),
|
|
9
|
+
color: z.string().optional(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const helloPlugin = () => {
|
|
13
|
+
const plugin = definePlugin({
|
|
14
|
+
ns: 'hello',
|
|
15
|
+
configSchema: HelloConfigSchema,
|
|
16
|
+
setup(cli) {
|
|
17
|
+
cli
|
|
18
|
+
.ns('hello')
|
|
19
|
+
.description('Say hello with current dotenv context')
|
|
20
|
+
.addOption(
|
|
21
|
+
plugin.createPluginDynamicOption(
|
|
22
|
+
cli,
|
|
23
|
+
'--loud',
|
|
24
|
+
(_bag, cfg) =>
|
|
25
|
+
`print greeting in ALL CAPS${cfg.loud ? ' (default)' : ''}`,
|
|
26
|
+
),
|
|
27
|
+
)
|
|
28
|
+
.action(() => {
|
|
29
|
+
const ctx = cli.getCtx();
|
|
30
|
+
// Derive CLI name from the true root command using a typed helper.
|
|
31
|
+
const rootName = getRootCommand(cli).name();
|
|
32
|
+
|
|
33
|
+
const cfg = plugin.readConfig(cli);
|
|
34
|
+
const keys = Object.keys(ctx.dotenv);
|
|
35
|
+
const label = cfg.loud
|
|
36
|
+
? `[${rootName}] DOTENV KEYS (${String(keys.length)}):`
|
|
37
|
+
: `[${rootName}] dotenv keys (${String(keys.length)}):`;
|
|
38
|
+
console.log(label, keys.join(', '));
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return plugin;
|
|
43
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
// Help-time root defaults (example):
|
|
3
|
+
// rootOptionDefaults: {
|
|
4
|
+
// redact: true,
|
|
5
|
+
// // redactPatterns: ['API_KEY', 'SECRET'],
|
|
6
|
+
// },
|
|
7
|
+
// Help-time visibility (example): hide selected root flags in -h
|
|
8
|
+
// rootOptionVisibility: { capture: false },
|
|
9
|
+
|
|
10
|
+
vars: { APP_SETTING: 'app_value' },
|
|
11
|
+
envVars: { dev: { ENV_SETTING: 'dev_value' } },
|
|
12
|
+
dynamic: {
|
|
13
|
+
GREETING: ({ APP_SETTING = '' }) => `Hello ${APP_SETTING}`,
|
|
14
|
+
// Example: env-aware dynamic value. The second argument receives the
|
|
15
|
+
// selected environment (if any); tailor behavior per environment.
|
|
16
|
+
// For example, with env='dev' this yields "for-dev"; when env is not
|
|
17
|
+
// provided, this returns an empty string.
|
|
18
|
+
ENV_TAG: (_vars, env) => (env ? `for-${env}` : ''),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineGetDotenvConfig } from '@karmaniverous/get-dotenv/core';
|
|
2
|
+
|
|
3
|
+
type Vars = {
|
|
4
|
+
APP_SETTING?: string;
|
|
5
|
+
ENV_SETTING?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default defineGetDotenvConfig<Vars>({
|
|
9
|
+
// Help-time root defaults (example):
|
|
10
|
+
// rootOptionDefaults: {
|
|
11
|
+
// redact: true,
|
|
12
|
+
// // redactPatterns: ['API_KEY', 'SECRET'],
|
|
13
|
+
// },
|
|
14
|
+
// Help-time visibility (example): hide selected root flags in -h
|
|
15
|
+
// rootOptionVisibility: { capture: false },
|
|
16
|
+
|
|
17
|
+
vars: { APP_SETTING: 'app_value' },
|
|
18
|
+
envVars: { dev: { ENV_SETTING: 'dev_value' } },
|
|
19
|
+
dynamic: {
|
|
20
|
+
GREETING: ({ APP_SETTING = '' }) => `${APP_SETTING}-ts`,
|
|
21
|
+
// Example: env-aware dynamic value. The second argument receives the
|
|
22
|
+
// selected environment (if any); tailor behavior per environment.
|
|
23
|
+
// For example, with env='dev' this yields "for-dev"; when env is not
|
|
24
|
+
// provided, this returns an empty string.
|
|
25
|
+
ENV_TAG: (_vars: Record<string, string | undefined>, env?: string) =>
|
|
26
|
+
env ? `for-${env}` : '',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
// Help-time root defaults (example):
|
|
3
|
+
// rootOptionDefaults: {
|
|
4
|
+
// redact: true,
|
|
5
|
+
// // redactPatterns: ['API_KEY', 'SECRET'],
|
|
6
|
+
// },
|
|
7
|
+
// Help-time visibility (example): hide selected root flags in -h
|
|
8
|
+
// rootOptionVisibility: { capture: false },
|
|
9
|
+
|
|
10
|
+
vars: { APP_SETTING: 'app_value' },
|
|
11
|
+
envVars: { dev: { ENV_SETTING: 'dev_value' } },
|
|
12
|
+
dynamic: {
|
|
13
|
+
GREETING: ({ APP_SETTING = '' }) => `Hello ${APP_SETTING}`,
|
|
14
|
+
// Example: env-aware dynamic value. The second argument receives the
|
|
15
|
+
// selected environment (if any); tailor behavior per environment.
|
|
16
|
+
// For example, with env='dev' this yields "for-dev"; when env is not
|
|
17
|
+
// provided, this returns an empty string.
|
|
18
|
+
ENV_TAG: (_vars, env) => (env ? `for-${env}` : ''),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineGetDotenvConfig } from '@karmaniverous/get-dotenv/core';
|
|
2
|
+
|
|
3
|
+
type Vars = {
|
|
4
|
+
APP_SETTING?: string;
|
|
5
|
+
ENV_SETTING?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default defineGetDotenvConfig<Vars>({
|
|
9
|
+
// Help-time root defaults (example):
|
|
10
|
+
// rootOptionDefaults: {
|
|
11
|
+
// redact: true,
|
|
12
|
+
// // redactPatterns: ['API_KEY', 'SECRET'],
|
|
13
|
+
// },
|
|
14
|
+
// Help-time visibility (example): hide selected root flags in -h
|
|
15
|
+
// rootOptionVisibility: { capture: false },
|
|
16
|
+
|
|
17
|
+
vars: { APP_SETTING: 'app_value' },
|
|
18
|
+
envVars: { dev: { ENV_SETTING: 'dev_value' } },
|
|
19
|
+
dynamic: {
|
|
20
|
+
GREETING: ({ APP_SETTING = '' }) => `${APP_SETTING}-ts`,
|
|
21
|
+
// Example: env-aware dynamic value. The second argument receives the
|
|
22
|
+
// selected environment (if any); tailor behavior per environment.
|
|
23
|
+
// For example, with env='dev' this yields "for-dev"; when env is not
|
|
24
|
+
// provided, this returns an empty string.
|
|
25
|
+
ENV_TAG: (_vars: Record<string, string | undefined>, env?: string) =>
|
|
26
|
+
env ? `for-${env}` : '',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePlugin,
|
|
3
|
+
getRootCommand,
|
|
4
|
+
} from '@karmaniverous/get-dotenv/cliHost';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
|
|
7
|
+
const HelloConfigSchema = z.object({
|
|
8
|
+
loud: z.boolean().optional().default(false),
|
|
9
|
+
color: z.string().optional(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const helloPlugin = () => {
|
|
13
|
+
const plugin = definePlugin({
|
|
14
|
+
ns: 'hello',
|
|
15
|
+
configSchema: HelloConfigSchema,
|
|
16
|
+
setup(cli) {
|
|
17
|
+
cli
|
|
18
|
+
.ns('hello')
|
|
19
|
+
.description('Say hello with current dotenv context')
|
|
20
|
+
.addOption(
|
|
21
|
+
plugin.createPluginDynamicOption(
|
|
22
|
+
cli,
|
|
23
|
+
'--loud',
|
|
24
|
+
(_bag, cfg) =>
|
|
25
|
+
`print greeting in ALL CAPS${cfg.loud ? ' (default)' : ''}`,
|
|
26
|
+
),
|
|
27
|
+
)
|
|
28
|
+
.action(() => {
|
|
29
|
+
const ctx = cli.getCtx();
|
|
30
|
+
// Derive CLI name from the true root command using a typed helper.
|
|
31
|
+
const rootName = getRootCommand(cli).name();
|
|
32
|
+
|
|
33
|
+
const cfg = plugin.readConfig(cli);
|
|
34
|
+
const keys = Object.keys(ctx.dotenv);
|
|
35
|
+
const label = cfg.loud
|
|
36
|
+
? `[${rootName}] DOTENV KEYS (${String(keys.length)}):`
|
|
37
|
+
: `[${rootName}] dotenv keys (${String(keys.length)}):`;
|
|
38
|
+
console.log(label, keys.join(', '));
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return plugin;
|
|
43
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createCli } from '@karmaniverous/get-dotenv/cli';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
awsPlugin,
|
|
7
|
+
awsWhoamiPlugin,
|
|
8
|
+
batchPlugin,
|
|
9
|
+
cmdPlugin,
|
|
10
|
+
initPlugin,
|
|
11
|
+
} from '@/src/plugins';
|
|
12
|
+
|
|
13
|
+
import { helloPlugin } from './plugins/hello';
|
|
14
|
+
|
|
15
|
+
await createCli({
|
|
16
|
+
alias: 'mycli',
|
|
17
|
+
compose: (program) =>
|
|
18
|
+
program
|
|
19
|
+
.use(
|
|
20
|
+
cmdPlugin({ asDefault: true, optionAlias: '-c, --cmd <command...>' }),
|
|
21
|
+
)
|
|
22
|
+
.use(batchPlugin())
|
|
23
|
+
.use(awsPlugin().use(awsWhoamiPlugin()))
|
|
24
|
+
.use(initPlugin())
|
|
25
|
+
.use(helloPlugin()),
|
|
26
|
+
})();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
// Help-time root defaults (example):
|
|
3
|
+
// rootOptionDefaults: {
|
|
4
|
+
// redact: true,
|
|
5
|
+
// // redactPatterns: ['API_KEY', 'SECRET'],
|
|
6
|
+
// },
|
|
7
|
+
// Help-time visibility (example): hide selected root flags in -h
|
|
8
|
+
// rootOptionVisibility: { capture: false },
|
|
9
|
+
|
|
10
|
+
vars: { APP_SETTING: 'app_value' },
|
|
11
|
+
envVars: { dev: { ENV_SETTING: 'dev_value' } },
|
|
12
|
+
dynamic: {
|
|
13
|
+
GREETING: ({ APP_SETTING = '' }) => `Hello ${APP_SETTING}`,
|
|
14
|
+
// Example: env-aware dynamic value. The second argument receives the
|
|
15
|
+
// selected environment (if any); tailor behavior per environment.
|
|
16
|
+
// For example, with env='dev' this yields "for-dev"; when env is not
|
|
17
|
+
// provided, this returns an empty string.
|
|
18
|
+
ENV_TAG: (_vars, env) => (env ? `for-${env}` : ''),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePlugin,
|
|
3
|
+
getRootCommand,
|
|
4
|
+
} from '@karmaniverous/get-dotenv/cliHost';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
|
|
7
|
+
const HelloConfigSchema = z.object({
|
|
8
|
+
loud: z.boolean().optional().default(false),
|
|
9
|
+
color: z.string().optional(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const helloPlugin = () => {
|
|
13
|
+
const plugin = definePlugin({
|
|
14
|
+
ns: 'hello',
|
|
15
|
+
configSchema: HelloConfigSchema,
|
|
16
|
+
setup(cli) {
|
|
17
|
+
cli
|
|
18
|
+
.ns('hello')
|
|
19
|
+
.description('Say hello with current dotenv context')
|
|
20
|
+
.addOption(
|
|
21
|
+
plugin.createPluginDynamicOption(
|
|
22
|
+
cli,
|
|
23
|
+
'--loud',
|
|
24
|
+
(_bag, cfg) =>
|
|
25
|
+
`print greeting in ALL CAPS${cfg.loud ? ' (default)' : ''}`,
|
|
26
|
+
),
|
|
27
|
+
)
|
|
28
|
+
.action(() => {
|
|
29
|
+
const ctx = cli.getCtx();
|
|
30
|
+
// Derive CLI name from the true root command using a typed helper.
|
|
31
|
+
const rootName = getRootCommand(cli).name();
|
|
32
|
+
|
|
33
|
+
const cfg = plugin.readConfig(cli);
|
|
34
|
+
const keys = Object.keys(ctx.dotenv);
|
|
35
|
+
const label = cfg.loud
|
|
36
|
+
? `[${rootName}] DOTENV KEYS (${String(keys.length)}):`
|
|
37
|
+
: `[${rootName}] dotenv keys (${String(keys.length)}):`;
|
|
38
|
+
console.log(label, keys.join(', '));
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return plugin;
|
|
43
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineGetDotenvConfig } from '@karmaniverous/get-dotenv/core';
|
|
2
|
+
|
|
3
|
+
type Vars = {
|
|
4
|
+
APP_SETTING?: string;
|
|
5
|
+
ENV_SETTING?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default defineGetDotenvConfig<Vars>({
|
|
9
|
+
// Help-time root defaults (example):
|
|
10
|
+
// rootOptionDefaults: {
|
|
11
|
+
// redact: true,
|
|
12
|
+
// // redactPatterns: ['API_KEY', 'SECRET'],
|
|
13
|
+
// },
|
|
14
|
+
// Help-time visibility (example): hide selected root flags in -h
|
|
15
|
+
// rootOptionVisibility: { capture: false },
|
|
16
|
+
|
|
17
|
+
vars: { APP_SETTING: 'app_value' },
|
|
18
|
+
envVars: { dev: { ENV_SETTING: 'dev_value' } },
|
|
19
|
+
dynamic: {
|
|
20
|
+
GREETING: ({ APP_SETTING = '' }) => `${APP_SETTING}-ts`,
|
|
21
|
+
// Example: env-aware dynamic value. The second argument receives the
|
|
22
|
+
// selected environment (if any); tailor behavior per environment.
|
|
23
|
+
// For example, with env='dev' this yields "for-dev"; when env is not
|
|
24
|
+
// provided, this returns an empty string.
|
|
25
|
+
ENV_TAG: (_vars: Record<string, string | undefined>, env?: string) =>
|
|
26
|
+
env ? `for-${env}` : '',
|
|
27
|
+
},
|
|
28
|
+
});
|
package/getdotenv.config.json
CHANGED
|
@@ -1,19 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"//": "Packaged root defaults for get-dotenv (lowest precedence).",
|
|
3
|
-
"dotenvToken": ".env",
|
|
4
|
-
"privateToken": "local",
|
|
5
|
-
"paths": "./",
|
|
6
|
-
"loadProcess": true,
|
|
7
|
-
"shell": true,
|
|
8
|
-
"scripts": {
|
|
9
|
-
"git-status": {
|
|
10
|
-
"cmd": "git branch --show-current && git status -s -u",
|
|
11
|
-
"shell": true
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
"excludeDynamic": false,
|
|
15
|
-
"excludeEnv": false,
|
|
16
|
-
"excludeGlobal": false,
|
|
17
|
-
"excludePrivate": false,
|
|
18
|
-
"excludePublic": false
|
|
19
|
-
}
|
|
1
|
+
{}
|