@bolta-io/cli 0.0.18 → 0.2.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/CHANGELOG.md +18 -0
- package/CLAUDE.md +43 -24
- package/README.md +54 -22
- package/dist/bin/bolta.js +29 -30
- package/dist/bin/bolta.js.map +1 -1
- package/dist/src/client/bolta-client.d.ts +26 -19
- package/dist/src/client/bolta-client.d.ts.map +1 -1
- package/dist/src/client/bolta-client.js +71 -48
- package/dist/src/client/bolta-client.js.map +1 -1
- package/dist/src/commands/cash-receipt/cancel.d.ts +5 -0
- package/dist/src/commands/cash-receipt/cancel.d.ts.map +1 -0
- package/dist/src/commands/cash-receipt/cancel.js +27 -0
- package/dist/src/commands/cash-receipt/cancel.js.map +1 -0
- package/dist/src/commands/cash-receipt/index.d.ts +3 -0
- package/dist/src/commands/cash-receipt/index.d.ts.map +1 -0
- package/dist/src/commands/cash-receipt/index.js +63 -0
- package/dist/src/commands/cash-receipt/index.js.map +1 -0
- package/dist/src/commands/cash-receipt/issue.d.ts +8 -0
- package/dist/src/commands/cash-receipt/issue.d.ts.map +1 -0
- package/dist/src/commands/cash-receipt/issue.js +29 -0
- package/dist/src/commands/cash-receipt/issue.js.map +1 -0
- package/dist/src/commands/cash-receipt/status.d.ts +5 -0
- package/dist/src/commands/cash-receipt/status.d.ts.map +1 -0
- package/dist/src/commands/cash-receipt/status.js +17 -0
- package/dist/src/commands/cash-receipt/status.js.map +1 -0
- package/dist/src/commands/certificate/index.d.ts.map +1 -1
- package/dist/src/commands/certificate/index.js +19 -42
- package/dist/src/commands/certificate/index.js.map +1 -1
- package/dist/src/commands/config/index.d.ts.map +1 -1
- package/dist/src/commands/config/index.js +17 -54
- package/dist/src/commands/config/index.js.map +1 -1
- package/dist/src/commands/examples/index.d.ts.map +1 -1
- package/dist/src/commands/examples/index.js +73 -9
- package/dist/src/commands/examples/index.js.map +1 -1
- package/dist/src/commands/guide/index.d.ts.map +1 -1
- package/dist/src/commands/guide/index.js +71 -27
- package/dist/src/commands/guide/index.js.map +1 -1
- package/dist/src/commands/invoice/amend.d.ts.map +1 -1
- package/dist/src/commands/invoice/amend.js +9 -30
- package/dist/src/commands/invoice/amend.js.map +1 -1
- package/dist/src/commands/invoice/get.d.ts.map +1 -1
- package/dist/src/commands/invoice/get.js +2 -7
- package/dist/src/commands/invoice/get.js.map +1 -1
- package/dist/src/commands/invoice/index.js +1 -1
- package/dist/src/commands/invoice/issue-request.d.ts.map +1 -1
- package/dist/src/commands/invoice/issue-request.js +3 -15
- package/dist/src/commands/invoice/issue-request.js.map +1 -1
- package/dist/src/commands/invoice/issue.d.ts.map +1 -1
- package/dist/src/commands/invoice/issue.js +3 -15
- package/dist/src/commands/invoice/issue.js.map +1 -1
- package/dist/src/commands/invoice/status.d.ts.map +1 -1
- package/dist/src/commands/invoice/status.js +2 -7
- package/dist/src/commands/invoice/status.js.map +1 -1
- package/dist/src/commands/issuer/create.d.ts +4 -0
- package/dist/src/commands/issuer/create.d.ts.map +1 -0
- package/dist/src/commands/issuer/create.js +24 -0
- package/dist/src/commands/issuer/create.js.map +1 -0
- package/dist/src/commands/issuer/get.d.ts +3 -0
- package/dist/src/commands/issuer/get.d.ts.map +1 -0
- package/dist/src/commands/issuer/get.js +14 -0
- package/dist/src/commands/issuer/get.js.map +1 -0
- package/dist/src/commands/issuer/index.d.ts +3 -0
- package/dist/src/commands/issuer/index.d.ts.map +1 -0
- package/dist/src/commands/issuer/index.js +31 -0
- package/dist/src/commands/issuer/index.js.map +1 -0
- package/dist/src/commands/schema/index.d.ts.map +1 -1
- package/dist/src/commands/schema/index.js +4 -4
- package/dist/src/commands/schema/index.js.map +1 -1
- package/dist/src/commands/supplier/legacy.d.ts +3 -0
- package/dist/src/commands/supplier/legacy.d.ts.map +1 -0
- package/dist/src/commands/supplier/legacy.js +75 -0
- package/dist/src/commands/supplier/legacy.js.map +1 -0
- package/dist/src/config/config-manager.d.ts +7 -9
- package/dist/src/config/config-manager.d.ts.map +1 -1
- package/dist/src/config/config-manager.js +28 -48
- package/dist/src/config/config-manager.js.map +1 -1
- package/dist/src/types/api.d.ts +86 -7
- package/dist/src/types/api.d.ts.map +1 -1
- package/dist/src/utils/client.d.ts +10 -7
- package/dist/src/utils/client.d.ts.map +1 -1
- package/dist/src/utils/client.js +26 -10
- package/dist/src/utils/client.js.map +1 -1
- package/dist/src/utils/errors.d.ts +2 -2
- package/dist/src/utils/errors.d.ts.map +1 -1
- package/dist/src/utils/errors.js +4 -4
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/legacy-issuer.d.ts +28 -0
- package/dist/src/utils/legacy-issuer.d.ts.map +1 -0
- package/dist/src/utils/legacy-issuer.js +45 -0
- package/dist/src/utils/legacy-issuer.js.map +1 -0
- package/dist/src/utils/output.d.ts +7 -3
- package/dist/src/utils/output.d.ts.map +1 -1
- package/dist/src/utils/output.js +14 -4
- package/dist/src/utils/output.js.map +1 -1
- package/dist/src/validators/parse.d.ts +3 -0
- package/dist/src/validators/parse.d.ts.map +1 -0
- package/dist/src/validators/parse.js +15 -0
- package/dist/src/validators/parse.js.map +1 -0
- package/dist/src/validators/schemas.d.ts +182 -1
- package/dist/src/validators/schemas.d.ts.map +1 -1
- package/dist/src/validators/schemas.js +230 -7
- package/dist/src/validators/schemas.js.map +1 -1
- package/llms.txt +47 -34
- package/package.json +4 -2
- package/dist/src/commands/supplier/create.d.ts +0 -4
- package/dist/src/commands/supplier/create.d.ts.map +0 -1
- package/dist/src/commands/supplier/create.js +0 -40
- package/dist/src/commands/supplier/create.js.map +0 -1
- package/dist/src/commands/supplier/get.d.ts +0 -3
- package/dist/src/commands/supplier/get.d.ts.map +0 -1
- package/dist/src/commands/supplier/get.js +0 -19
- package/dist/src/commands/supplier/get.js.map +0 -1
- package/dist/src/commands/supplier/index.d.ts +0 -3
- package/dist/src/commands/supplier/index.d.ts.map +0 -1
- package/dist/src/commands/supplier/index.js +0 -56
- package/dist/src/commands/supplier/index.js.map +0 -1
- package/dist/src/commands/supplier/legacy-customer.d.ts +0 -5
- package/dist/src/commands/supplier/legacy-customer.d.ts.map +0 -1
- package/dist/src/commands/supplier/legacy-customer.js +0 -56
- package/dist/src/commands/supplier/legacy-customer.js.map +0 -1
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BoltaClient } from '../../client/bolta-client.js';
|
|
1
|
+
import { createApiKeyClient } from '../../utils/client.js';
|
|
3
2
|
import { outputSuccess, outputError } from '../../utils/output.js';
|
|
4
|
-
import { BoltaAuthError } from '../../utils/errors.js';
|
|
5
3
|
export async function getInvoiceAction(issuanceKey, options, command) {
|
|
6
4
|
try {
|
|
7
5
|
const globalOpts = command.optsWithGlobals();
|
|
8
|
-
const
|
|
9
|
-
if (!apiKey)
|
|
10
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
11
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl() });
|
|
6
|
+
const client = createApiKeyClient(globalOpts);
|
|
12
7
|
const result = await client.getTaxInvoice(issuanceKey);
|
|
13
8
|
outputSuccess(result);
|
|
14
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/invoice/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/invoice/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,OAAgC,EAAE,OAAgB;IAC5G,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -27,7 +27,7 @@ Example:
|
|
|
27
27
|
"identificationNumber": "1234567890",
|
|
28
28
|
"organizationName": "공급자 주식회사",
|
|
29
29
|
"representativeName": "김공급",
|
|
30
|
-
"manager": { "email": "
|
|
30
|
+
"manager": { "email": "seller@example.com" }
|
|
31
31
|
},
|
|
32
32
|
"supplied": {
|
|
33
33
|
"identificationNumber": "0987654321",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-request.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"issue-request.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -2,31 +2,19 @@ import { createClient } from '../../utils/client.js';
|
|
|
2
2
|
import { resolveInput } from '../../utils/input.js';
|
|
3
3
|
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
4
4
|
import { createTaxInvoiceIssueRequestSchema } from '../../validators/schemas.js';
|
|
5
|
-
import {
|
|
6
|
-
import { ZodError } from 'zod';
|
|
5
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
7
6
|
export async function issueRequestAction(options, command) {
|
|
8
7
|
try {
|
|
9
8
|
const globalOpts = command.optsWithGlobals();
|
|
10
9
|
const raw = await resolveInput(options);
|
|
11
|
-
|
|
12
|
-
try {
|
|
13
|
-
validated = createTaxInvoiceIssueRequestSchema.parse(raw);
|
|
14
|
-
}
|
|
15
|
-
catch (err) {
|
|
16
|
-
if (err instanceof ZodError) {
|
|
17
|
-
const details = Object.fromEntries(err.errors.map((e) => [e.path.join('.'), e.message]));
|
|
18
|
-
throw new BoltaValidationError('입력 데이터가 유효하지 않습니다.', details);
|
|
19
|
-
}
|
|
20
|
-
throw err;
|
|
21
|
-
}
|
|
10
|
+
const validated = parseOrThrow(createTaxInvoiceIssueRequestSchema, raw);
|
|
22
11
|
if (globalOpts.dryRun) {
|
|
23
12
|
outputSuccess({ dryRun: true, requestBody: validated, endpoint: 'POST /v1/taxInvoices/issueRequest' });
|
|
24
13
|
return;
|
|
25
14
|
}
|
|
26
15
|
verbose('세금계산서 역발행 요청');
|
|
27
|
-
const
|
|
16
|
+
const client = createClient(globalOpts);
|
|
28
17
|
const result = await client.issueRequestTaxInvoice(validated, {
|
|
29
|
-
supplierKey,
|
|
30
18
|
referenceId: options.referenceId,
|
|
31
19
|
});
|
|
32
20
|
outputSuccess(result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-request.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"issue-request.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAoD,EACpD,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;QAExE,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACvG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE;YAC5D,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QACH,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -2,31 +2,19 @@ import { createClient } from '../../utils/client.js';
|
|
|
2
2
|
import { resolveInput } from '../../utils/input.js';
|
|
3
3
|
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
4
4
|
import { createTaxInvoiceSchema } from '../../validators/schemas.js';
|
|
5
|
-
import {
|
|
6
|
-
import { ZodError } from 'zod';
|
|
5
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
7
6
|
export async function issueAction(options, command) {
|
|
8
7
|
try {
|
|
9
8
|
const globalOpts = command.optsWithGlobals();
|
|
10
9
|
const raw = await resolveInput(options);
|
|
11
|
-
|
|
12
|
-
try {
|
|
13
|
-
validated = createTaxInvoiceSchema.parse(raw);
|
|
14
|
-
}
|
|
15
|
-
catch (err) {
|
|
16
|
-
if (err instanceof ZodError) {
|
|
17
|
-
const details = Object.fromEntries(err.errors.map((e) => [e.path.join('.'), e.message]));
|
|
18
|
-
throw new BoltaValidationError('입력 데이터가 유효하지 않습니다.', details);
|
|
19
|
-
}
|
|
20
|
-
throw err;
|
|
21
|
-
}
|
|
10
|
+
const validated = parseOrThrow(createTaxInvoiceSchema, raw);
|
|
22
11
|
if (globalOpts.dryRun) {
|
|
23
12
|
outputSuccess({ dryRun: true, requestBody: validated, endpoint: 'POST /v1/taxInvoices/issue' });
|
|
24
13
|
return;
|
|
25
14
|
}
|
|
26
15
|
verbose('세금계산서 정발행 요청');
|
|
27
|
-
const
|
|
16
|
+
const client = createClient(globalOpts);
|
|
28
17
|
const result = await client.issueTaxInvoice(validated, {
|
|
29
|
-
supplierKey,
|
|
30
18
|
referenceId: options.referenceId,
|
|
31
19
|
});
|
|
32
20
|
outputSuccess(result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAoD,EACpD,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAE5D,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE;YACrD,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QACH,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CASpG"}
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BoltaClient } from '../../client/bolta-client.js';
|
|
1
|
+
import { createApiKeyClient } from '../../utils/client.js';
|
|
3
2
|
import { outputSuccess, outputError } from '../../utils/output.js';
|
|
4
|
-
import { BoltaAuthError } from '../../utils/errors.js';
|
|
5
3
|
export async function statusAction(options, command) {
|
|
6
4
|
try {
|
|
7
5
|
const globalOpts = command.optsWithGlobals();
|
|
8
|
-
const
|
|
9
|
-
if (!apiKey)
|
|
10
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
11
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl() });
|
|
6
|
+
const client = createApiKeyClient(globalOpts);
|
|
12
7
|
const result = await client.getTaxInvoiceStatus(options.referenceId);
|
|
13
8
|
outputSuccess(result);
|
|
14
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/invoice/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/invoice/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgC,EAAE,OAAgB;IACnF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/commands/issuer/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createApiKeyClient } from '../../utils/client.js';
|
|
2
|
+
import { resolveInput } from '../../utils/input.js';
|
|
3
|
+
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
4
|
+
import { createIssuerSchema } from '../../validators/schemas.js';
|
|
5
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
6
|
+
export async function createIssuerAction(options, command) {
|
|
7
|
+
try {
|
|
8
|
+
const globalOpts = command.optsWithGlobals();
|
|
9
|
+
const client = createApiKeyClient(globalOpts);
|
|
10
|
+
const raw = await resolveInput(options);
|
|
11
|
+
const validated = parseOrThrow(createIssuerSchema, raw);
|
|
12
|
+
if (globalOpts.dryRun) {
|
|
13
|
+
outputSuccess({ dryRun: true, requestBody: validated, endpoint: 'POST /v1/issuers' });
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
verbose('발급자 등록 요청', { identificationNumber: validated.identificationNumber });
|
|
17
|
+
const result = await client.createIssuer(validated);
|
|
18
|
+
outputSuccess(result);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
outputError(err);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/issuer/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAyB,EAAE,OAAgB;IAClF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAExD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,SAAS,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACpD,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/commands/issuer/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzH"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createApiKeyClient } from '../../utils/client.js';
|
|
2
|
+
import { outputSuccess, outputError } from '../../utils/output.js';
|
|
3
|
+
export async function getIssuerAction(issuerId, options, command) {
|
|
4
|
+
try {
|
|
5
|
+
const globalOpts = command.optsWithGlobals();
|
|
6
|
+
const client = createApiKeyClient(globalOpts);
|
|
7
|
+
const result = await client.getIssuer(issuerId);
|
|
8
|
+
outputSuccess(result);
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
outputError(err);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/issuer/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAgC,EAAE,OAAgB;IACxG,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/issuer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B7D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createIssuerAction } from './create.js';
|
|
2
|
+
import { getIssuerAction } from './get.js';
|
|
3
|
+
export function registerIssuerCommands(program) {
|
|
4
|
+
const issuer = program
|
|
5
|
+
.command('issuer')
|
|
6
|
+
.description('발급자 관리');
|
|
7
|
+
issuer
|
|
8
|
+
.command('create')
|
|
9
|
+
.description('발급자 등록 (POST /v1/issuers)')
|
|
10
|
+
.option('--data <json>', '인라인 JSON 데이터')
|
|
11
|
+
.option('--file <path>', 'JSON 파일 경로')
|
|
12
|
+
.option('--stdin', '표준 입력에서 읽기')
|
|
13
|
+
.addHelpText('after', `
|
|
14
|
+
Example:
|
|
15
|
+
bolta issuer create --data '{
|
|
16
|
+
"identificationNumber": "1234567890",
|
|
17
|
+
"organizationName": "주식회사 테스트",
|
|
18
|
+
"representativeName": "홍길동"
|
|
19
|
+
}'
|
|
20
|
+
|
|
21
|
+
bolta issuer create --file issuer.json`)
|
|
22
|
+
.action(createIssuerAction);
|
|
23
|
+
issuer
|
|
24
|
+
.command('get <issuerId>')
|
|
25
|
+
.description('발급자 조회 (GET /v1/issuers/{issuerId})')
|
|
26
|
+
.addHelpText('after', `
|
|
27
|
+
Example:
|
|
28
|
+
bolta issuer get issuer_bf8paz`)
|
|
29
|
+
.action(getIssuerAction);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/issuer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEzB,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,WAAW,CAAC,OAAO,EAAE;;;;;;;;yCAQe,CAAC;SACrC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE9B,MAAM;SACH,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,qCAAqC,CAAC;SAClD,WAAW,CAAC,OAAO,EAAE;;iCAEO,CAAC;SAC7B,MAAM,CAAC,eAAe,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6C5D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { outputSuccess, outputError,
|
|
1
|
+
import { outputSuccess, outputError, resolveLegacyIssuerName, LEGACY_ISSUER_CREATE_ALIASES, } from '../../utils/output.js';
|
|
2
2
|
import { jsonSchemas } from '../../validators/schemas.js';
|
|
3
3
|
import { BoltaError } from '../../utils/errors.js';
|
|
4
4
|
export function registerSchemaCommand(program) {
|
|
@@ -7,9 +7,10 @@ export function registerSchemaCommand(program) {
|
|
|
7
7
|
.description('입력 JSON 스키마 출력 (AI 에이전트용)')
|
|
8
8
|
.addHelpText('after', `
|
|
9
9
|
Available schemas:
|
|
10
|
-
|
|
10
|
+
issuer-create 발급자 등록
|
|
11
11
|
invoice-issue 세금계산서 정발행
|
|
12
12
|
invoice-issue-request 세금계산서 역발행 요청
|
|
13
|
+
cash-receipt-issue 현금영수증 발행
|
|
13
14
|
amend-termination 수정발행: 계약 해제
|
|
14
15
|
amend-change-supply-cost 수정발행: 공급가액 변동
|
|
15
16
|
amend-double-issuance 수정발행: 착오에 의한 이중발급 (입력 없음)
|
|
@@ -27,8 +28,7 @@ Examples:
|
|
|
27
28
|
outputSuccess({ availableSchemas: list });
|
|
28
29
|
return;
|
|
29
30
|
}
|
|
30
|
-
|
|
31
|
-
commandName = resolveDeprecatedName(commandName, { 'customer-create': 'supplier-create' }, '스키마');
|
|
31
|
+
commandName = resolveLegacyIssuerName(commandName, LEGACY_ISSUER_CREATE_ALIASES, '스키마');
|
|
32
32
|
const schema = jsonSchemas[commandName];
|
|
33
33
|
if (!schema) {
|
|
34
34
|
const available = Object.keys(jsonSchemas).join(', ');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/schema/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/schema/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,WAAW,EACX,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,2BAA2B,CAAC;SACxC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;qDAY2B,CAAC;SACjD,MAAM,CAAC,CAAC,WAAoB,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACnD,OAAO,EAAE,IAAI;oBACb,WAAW,EAAE,gBAAgB,IAAI,EAAE;iBACpC,CAAC,CAAC,CAAC;gBACJ,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,WAAW,GAAG,uBAAuB,CAAC,WAAW,EAAE,4BAA4B,EAAE,KAAK,CAAC,CAAC;YAExF,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtD,MAAM,IAAI,UAAU,CAClB,IAAI,WAAW,mBAAmB,EAClC,aAAa,EACb,eAAe,SAAS,EAAE,CAC3B,CAAC;YACJ,CAAC;YAED,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../../../src/commands/supplier/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBnE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createApiKeyClient } from '../../utils/client.js';
|
|
2
|
+
import { resolveInput } from '../../utils/input.js';
|
|
3
|
+
import { legacyIssuerWarning, outputError, outputSuccess, verbose } from '../../utils/output.js';
|
|
4
|
+
import { createIssuerSchema } from '../../validators/schemas.js';
|
|
5
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
6
|
+
/**
|
|
7
|
+
* 레거시 명령 실행을 경고하고 클라이언트를 만든다.
|
|
8
|
+
*
|
|
9
|
+
* 레거시 키 플래그가 있으면 bin/bolta.ts의 preAction hook이 이미 그 플래그를 경고했으므로
|
|
10
|
+
* 같은 실행에서 두 종류의 전환 경고가 겹치지 않도록 명령 경고는 생략한다.
|
|
11
|
+
*/
|
|
12
|
+
function startLegacyIssuerCommand(legacyCommand, command) {
|
|
13
|
+
const globalOpts = command.optsWithGlobals();
|
|
14
|
+
if (!globalOpts.supplierKey && !globalOpts.customerKey) {
|
|
15
|
+
legacyIssuerWarning(`'bolta ${legacyCommand}' 명령어`);
|
|
16
|
+
}
|
|
17
|
+
return { client: createApiKeyClient(globalOpts), globalOpts };
|
|
18
|
+
}
|
|
19
|
+
async function createLegacyIssuerAction(legacyCommand, options, command) {
|
|
20
|
+
try {
|
|
21
|
+
const { client, globalOpts } = startLegacyIssuerCommand(legacyCommand, command);
|
|
22
|
+
const raw = await resolveInput(options);
|
|
23
|
+
const validated = parseOrThrow(createIssuerSchema, raw);
|
|
24
|
+
if (globalOpts.dryRun) {
|
|
25
|
+
outputSuccess({
|
|
26
|
+
dryRun: true,
|
|
27
|
+
requestBody: validated,
|
|
28
|
+
endpoint: `POST /v1/${legacyCommand === 'supplier' ? 'suppliers' : 'customers'}`,
|
|
29
|
+
});
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
verbose('레거시 발급자 등록 요청', {
|
|
33
|
+
command: legacyCommand,
|
|
34
|
+
identificationNumber: validated.identificationNumber,
|
|
35
|
+
});
|
|
36
|
+
const result = legacyCommand === 'supplier'
|
|
37
|
+
? await client.createSupplier(validated)
|
|
38
|
+
: await client.createCustomer(validated);
|
|
39
|
+
outputSuccess(result);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
outputError(err);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function getLegacyIssuerAction(legacyCommand, issuerId, command) {
|
|
46
|
+
try {
|
|
47
|
+
const { client } = startLegacyIssuerCommand(legacyCommand, command);
|
|
48
|
+
const result = legacyCommand === 'supplier'
|
|
49
|
+
? await client.getSupplier(issuerId)
|
|
50
|
+
: await client.getCustomer(issuerId);
|
|
51
|
+
outputSuccess(result);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
outputError(err);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function registerLegacyIssuerCommands(program) {
|
|
58
|
+
for (const legacyCommand of ['supplier', 'customer']) {
|
|
59
|
+
const command = program
|
|
60
|
+
.command(legacyCommand, { hidden: true })
|
|
61
|
+
.description('(deprecated) 발급자 관리');
|
|
62
|
+
command
|
|
63
|
+
.command('create')
|
|
64
|
+
.description('(deprecated) 발급자 등록')
|
|
65
|
+
.option('--data <json>', '인라인 JSON 데이터')
|
|
66
|
+
.option('--file <path>', 'JSON 파일 경로')
|
|
67
|
+
.option('--stdin', '표준 입력에서 읽기')
|
|
68
|
+
.action((options, actionCommand) => createLegacyIssuerAction(legacyCommand, options, actionCommand));
|
|
69
|
+
command
|
|
70
|
+
.command('get <issuerId>')
|
|
71
|
+
.description('(deprecated) 발급자 조회')
|
|
72
|
+
.action((issuerId, _options, actionCommand) => getLegacyIssuerAction(legacyCommand, issuerId, actionCommand));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=legacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../../../src/commands/supplier/legacy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
import type { BoltaConfig } from '../types/api.js';
|
|
2
|
+
import { type LegacyIssuerKeySource } from '../utils/legacy-issuer.js';
|
|
3
|
+
export type { LegacyIssuerKeySource };
|
|
2
4
|
export declare const CONFIG_DIR: string;
|
|
3
5
|
export declare function loadConfig(): BoltaConfig;
|
|
4
6
|
export declare function saveConfig(config: BoltaConfig): void;
|
|
5
|
-
export
|
|
6
|
-
export interface ResolvedSupplierKey {
|
|
7
|
+
export interface ResolvedLegacyIssuerKey {
|
|
7
8
|
value?: string;
|
|
8
|
-
source:
|
|
9
|
+
source: LegacyIssuerKeySource;
|
|
9
10
|
}
|
|
10
11
|
export declare function resolveApiKey(cliFlag?: string): string | undefined;
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
13
|
+
* 2026-12-31까지 지원하는 레거시 발급자 헤더 값을 기존 우선순위대로 해석한다.
|
|
14
|
+
* 값이 발견되면 신규 API 키 단독 인증으로 전환하도록 경고한다.
|
|
14
15
|
*/
|
|
15
|
-
export declare function
|
|
16
|
-
export declare function resolveSupplierKey(cliFlag?: string, legacyCliFlag?: string): string | undefined;
|
|
17
|
-
/** 상세 소스를 사용자 노출용 라벨(flag/env/config/none)로 축약한다. */
|
|
18
|
-
export declare function supplierKeySourceLabel(source: SupplierKeySource): 'flag' | 'env' | 'config' | 'none';
|
|
16
|
+
export declare function resolveLegacyIssuerKeyWithSource(supplierFlag?: string, customerFlag?: string): ResolvedLegacyIssuerKey;
|
|
19
17
|
export declare function resolveBaseUrl(): string;
|
|
20
18
|
export declare function maskApiKey(key: string): string;
|
|
21
19
|
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,eAAO,MAAM,UAAU,QAA4B,CAAC;AAGpD,wBAAgB,UAAU,IAAI,WAAW,CAOxC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AASD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,GACpB,uBAAuB,CA+BzB;AAED,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
-
import {
|
|
4
|
+
import { legacyIssuerWarning, maskSecret } from '../utils/output.js';
|
|
5
|
+
import { describeLegacyIssuerKeySource, } from '../utils/legacy-issuer.js';
|
|
5
6
|
export const CONFIG_DIR = join(homedir(), '.bolta');
|
|
6
7
|
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
7
8
|
export function loadConfig() {
|
|
@@ -28,57 +29,36 @@ export function resolveApiKey(cliFlag) {
|
|
|
28
29
|
return normalize(cliFlag) || normalize(process.env.BOLTA_API_KEY) || normalize(loadConfig().apiKey);
|
|
29
30
|
}
|
|
30
31
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
32
|
+
* 2026-12-31까지 지원하는 레거시 발급자 헤더 값을 기존 우선순위대로 해석한다.
|
|
33
|
+
* 값이 발견되면 신규 API 키 단독 인증으로 전환하도록 경고한다.
|
|
33
34
|
*/
|
|
34
|
-
export function
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
export function resolveLegacyIssuerKeyWithSource(supplierFlag, customerFlag) {
|
|
36
|
+
const resolved = (value, source) => {
|
|
37
|
+
// 경고 문구의 출처 표기는 403 안내와 같은 표를 쓴다(문자열 중복 방지).
|
|
38
|
+
legacyIssuerWarning(describeLegacyIssuerKeySource(source).origin);
|
|
39
|
+
return { value, source };
|
|
40
|
+
};
|
|
41
|
+
const normalizedSupplierFlag = normalize(supplierFlag);
|
|
42
|
+
if (normalizedSupplierFlag)
|
|
43
|
+
return resolved(normalizedSupplierFlag, 'supplier-flag');
|
|
44
|
+
const normalizedCustomerFlag = normalize(customerFlag);
|
|
45
|
+
if (normalizedCustomerFlag)
|
|
46
|
+
return resolved(normalizedCustomerFlag, 'customer-flag');
|
|
43
47
|
const config = loadConfig();
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
return
|
|
47
|
-
const
|
|
48
|
-
if (
|
|
49
|
-
return
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const legacyConfig = normalize(config.customerKey);
|
|
57
|
-
if (legacyConfig) {
|
|
58
|
-
deprecationWarning("config의 'customer-key'는 'supplier-key'로 변경되었습니다. 'bolta config set supplier-key <값>'으로 갱신하세요.");
|
|
59
|
-
return { value: legacyConfig, source: 'legacy-config' };
|
|
60
|
-
}
|
|
48
|
+
const supplierEnv = normalize(process.env.BOLTA_SUPPLIER_KEY);
|
|
49
|
+
if (supplierEnv)
|
|
50
|
+
return resolved(supplierEnv, 'supplier-env');
|
|
51
|
+
const supplierConfig = normalize(config.supplierKey);
|
|
52
|
+
if (supplierConfig)
|
|
53
|
+
return resolved(supplierConfig, 'supplier-config');
|
|
54
|
+
const customerEnv = normalize(process.env.BOLTA_CUSTOMER_KEY);
|
|
55
|
+
if (customerEnv)
|
|
56
|
+
return resolved(customerEnv, 'customer-env');
|
|
57
|
+
const customerConfig = normalize(config.customerKey);
|
|
58
|
+
if (customerConfig)
|
|
59
|
+
return resolved(customerConfig, 'customer-config');
|
|
61
60
|
return { source: 'none' };
|
|
62
61
|
}
|
|
63
|
-
export function resolveSupplierKey(cliFlag, legacyCliFlag) {
|
|
64
|
-
return resolveSupplierKeyWithSource(cliFlag, legacyCliFlag).value;
|
|
65
|
-
}
|
|
66
|
-
/** 상세 소스를 사용자 노출용 라벨(flag/env/config/none)로 축약한다. */
|
|
67
|
-
export function supplierKeySourceLabel(source) {
|
|
68
|
-
switch (source) {
|
|
69
|
-
case 'flag':
|
|
70
|
-
case 'legacy-flag':
|
|
71
|
-
return 'flag';
|
|
72
|
-
case 'env':
|
|
73
|
-
case 'legacy-env':
|
|
74
|
-
return 'env';
|
|
75
|
-
case 'config':
|
|
76
|
-
case 'legacy-config':
|
|
77
|
-
return 'config';
|
|
78
|
-
default:
|
|
79
|
-
return 'none';
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
62
|
export function resolveBaseUrl() {
|
|
83
63
|
return (normalize(process.env.BOLTA_API_BASE_URL) ||
|
|
84
64
|
normalize(loadConfig().baseUrl) ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"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"}
|