@bolta-io/cli 0.1.1 → 0.3.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 +12 -0
- package/CLAUDE.md +35 -31
- package/README.md +26 -27
- package/dist/bin/bolta.js +14 -29
- package/dist/bin/bolta.js.map +1 -1
- package/dist/src/client/bolta-client.d.ts +24 -27
- package/dist/src/client/bolta-client.d.ts.map +1 -1
- package/dist/src/client/bolta-client.js +106 -84
- package/dist/src/client/bolta-client.js.map +1 -1
- package/dist/src/commands/cash-receipt/cancel.js +3 -3
- package/dist/src/commands/cash-receipt/cancel.js.map +1 -1
- package/dist/src/commands/cash-receipt/issue.js +3 -3
- package/dist/src/commands/cash-receipt/issue.js.map +1 -1
- package/dist/src/commands/cash-receipt/status.d.ts.map +1 -1
- package/dist/src/commands/cash-receipt/status.js +3 -8
- package/dist/src/commands/cash-receipt/status.js.map +1 -1
- 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 +8 -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 +35 -29
- 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 +25 -33
- 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.d.ts.map +1 -1
- package/dist/src/commands/invoice/index.js +10 -6
- package/dist/src/commands/invoice/index.js.map +1 -1
- package/dist/src/commands/invoice/issue-request.d.ts.map +1 -1
- package/dist/src/commands/invoice/issue-request.js +6 -16
- 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 +6 -16
- package/dist/src/commands/invoice/issue.js.map +1 -1
- package/dist/src/commands/invoice/reference-id.d.ts +2 -0
- package/dist/src/commands/invoice/reference-id.d.ts.map +1 -0
- package/dist/src/commands/invoice/reference-id.js +8 -0
- package/dist/src/commands/invoice/reference-id.js.map +1 -0
- package/dist/src/commands/invoice/status.d.ts.map +1 -1
- package/dist/src/commands/invoice/status.js +6 -8
- 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 +3 -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 +40 -7
- package/dist/src/types/api.d.ts.map +1 -1
- package/dist/src/utils/client.d.ts +10 -15
- package/dist/src/utils/client.d.ts.map +1 -1
- package/dist/src/utils/client.js +26 -8
- package/dist/src/utils/client.js.map +1 -1
- package/dist/src/utils/errors.d.ts +1 -1
- package/dist/src/utils/errors.d.ts.map +1 -1
- package/dist/src/utils/errors.js +2 -2
- 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/{commands/cash-receipt/validation.d.ts → validators/parse.d.ts} +1 -1
- package/dist/src/validators/parse.d.ts.map +1 -0
- package/dist/src/{commands/cash-receipt/validation.js → validators/parse.js} +2 -2
- package/dist/src/validators/parse.js.map +1 -0
- package/dist/src/validators/schemas.d.ts +2 -1
- package/dist/src/validators/schemas.d.ts.map +1 -1
- package/dist/src/validators/schemas.js +28 -11
- package/dist/src/validators/schemas.js.map +1 -1
- package/llms.txt +38 -36
- package/package.json +1 -1
- package/dist/src/commands/cash-receipt/validation.d.ts.map +0 -1
- package/dist/src/commands/cash-receipt/validation.js.map +0 -1
- 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
|
@@ -11,15 +11,17 @@ export function registerInvoiceCommands(program) {
|
|
|
11
11
|
.option('--data <json>', '인라인 JSON 데이터')
|
|
12
12
|
.option('--file <path>', 'JSON 파일 경로')
|
|
13
13
|
.option('--stdin', '표준 입력에서 읽기')
|
|
14
|
-
.option('--reference-id <id>', '
|
|
14
|
+
.option('--reference-id <id>', '선택형 요청자 관리번호 (앞뒤 공백 없는 출력 가능한 ASCII 1~255자)')
|
|
15
15
|
.addHelpText('after', `
|
|
16
16
|
Notes:
|
|
17
|
+
- 같은 API 키의 세금계산서 발행 요청에서 reference-id를 재사용할 수 없습니다.
|
|
18
|
+
- 응답을 받지 못했거나 본문을 읽지 못했다면 재전송하지 말고 invoice status로 접수 여부를 확인하세요.
|
|
17
19
|
- 정발행은 공급받는자 외국인등록번호를 지원합니다.
|
|
18
20
|
- 외국인등록번호 공급받는자는 최상위 description 없이 요청하세요. 여권번호는 지원하지 않습니다.
|
|
19
21
|
- taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
|
|
20
22
|
|
|
21
23
|
Example:
|
|
22
|
-
bolta invoice issue --data '{
|
|
24
|
+
bolta invoice issue --reference-id inv-2026-001 --data '{
|
|
23
25
|
"date": "2026-03-25",
|
|
24
26
|
"purpose": "CLAIM",
|
|
25
27
|
"taxType": "TAXABLE",
|
|
@@ -27,7 +29,7 @@ Example:
|
|
|
27
29
|
"identificationNumber": "1234567890",
|
|
28
30
|
"organizationName": "공급자 주식회사",
|
|
29
31
|
"representativeName": "김공급",
|
|
30
|
-
"manager": { "email": "
|
|
32
|
+
"manager": { "email": "seller@example.com" }
|
|
31
33
|
},
|
|
32
34
|
"supplied": {
|
|
33
35
|
"identificationNumber": "0987654321",
|
|
@@ -49,14 +51,16 @@ Example:
|
|
|
49
51
|
.option('--data <json>', '인라인 JSON 데이터')
|
|
50
52
|
.option('--file <path>', 'JSON 파일 경로')
|
|
51
53
|
.option('--stdin', '표준 입력에서 읽기')
|
|
52
|
-
.option('--reference-id <id>', '
|
|
54
|
+
.option('--reference-id <id>', '선택형 요청자 관리번호 (앞뒤 공백 없는 출력 가능한 ASCII 1~255자)')
|
|
53
55
|
.addHelpText('after', `
|
|
54
56
|
Note:
|
|
57
|
+
같은 API 키의 세금계산서 발행 요청에서 reference-id를 재사용할 수 없습니다.
|
|
58
|
+
응답을 받지 못했거나 본문을 읽지 못했다면 재전송하지 말고 invoice status로 접수 여부를 확인하세요.
|
|
55
59
|
역발행은 supplied.identificationNumber에 사업자등록번호(10자리)만 허용합니다.
|
|
56
60
|
taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
|
|
57
61
|
|
|
58
62
|
Example:
|
|
59
|
-
bolta invoice issue-request --data '{...}'`)
|
|
63
|
+
bolta invoice issue-request --reference-id inv-2026-002 --data '{...}'`)
|
|
60
64
|
.action(issueRequestAction);
|
|
61
65
|
invoice
|
|
62
66
|
.command('get <issuanceKey>')
|
|
@@ -68,7 +72,7 @@ Example:
|
|
|
68
72
|
invoice
|
|
69
73
|
.command('status')
|
|
70
74
|
.description('세금계산서 상태 조회 (GET /v1/taxInvoices/issue/status)')
|
|
71
|
-
.requiredOption('--reference-id <id>', '요청 시 사용한
|
|
75
|
+
.requiredOption('--reference-id <id>', '요청 시 사용한 앞뒤 공백 없는 출력 가능한 ASCII 1~255자의 요청자 관리번호')
|
|
72
76
|
.addHelpText('after', `
|
|
73
77
|
Example:
|
|
74
78
|
bolta invoice status --reference-id inv-2026-001`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAE3E,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAE3E,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,CAAC;SAC5E,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+BrB,CAAC;SACD,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,CAAC;SAC5E,WAAW,CAAC,OAAO,EAAE;;;;;;;;yEAQ+C,CAAC;SACrE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE9B,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,8CAA8C,CAAC;SAC3D,WAAW,CAAC,OAAO,EAAE;;qDAE2B,CAAC;SACjD,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,qBAAqB,EAAE,iDAAiD,CAAC;SACxF,WAAW,CAAC,OAAO,EAAE;;mDAEyB,CAAC;SAC/C,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -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;AAG3D,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAqBf"}
|
|
@@ -2,32 +2,22 @@ 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 {
|
|
5
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
6
|
+
import { parseOptionalTaxInvoiceReferenceId } from './reference-id.js';
|
|
7
7
|
export async function issueRequestAction(options, command) {
|
|
8
8
|
try {
|
|
9
9
|
const globalOpts = command.optsWithGlobals();
|
|
10
|
+
const referenceId = parseOptionalTaxInvoiceReferenceId(options.referenceId);
|
|
10
11
|
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
|
-
}
|
|
12
|
+
const validated = parseOrThrow(createTaxInvoiceIssueRequestSchema, raw);
|
|
22
13
|
if (globalOpts.dryRun) {
|
|
23
14
|
outputSuccess({ dryRun: true, requestBody: validated, endpoint: 'POST /v1/taxInvoices/issueRequest' });
|
|
24
15
|
return;
|
|
25
16
|
}
|
|
26
17
|
verbose('세금계산서 역발행 요청');
|
|
27
|
-
const
|
|
18
|
+
const client = createClient(globalOpts);
|
|
28
19
|
const result = await client.issueRequestTaxInvoice(validated, {
|
|
29
|
-
|
|
30
|
-
referenceId: options.referenceId,
|
|
20
|
+
referenceId,
|
|
31
21
|
});
|
|
32
22
|
outputSuccess(result);
|
|
33
23
|
}
|
|
@@ -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;AAEzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAoD,EACpD,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,kCAAkC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5E,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;SACZ,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;AAG3D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAqBf"}
|
|
@@ -2,32 +2,22 @@ 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 {
|
|
5
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
6
|
+
import { parseOptionalTaxInvoiceReferenceId } from './reference-id.js';
|
|
7
7
|
export async function issueAction(options, command) {
|
|
8
8
|
try {
|
|
9
9
|
const globalOpts = command.optsWithGlobals();
|
|
10
|
+
const referenceId = parseOptionalTaxInvoiceReferenceId(options.referenceId);
|
|
10
11
|
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
|
-
}
|
|
12
|
+
const validated = parseOrThrow(createTaxInvoiceSchema, raw);
|
|
22
13
|
if (globalOpts.dryRun) {
|
|
23
14
|
outputSuccess({ dryRun: true, requestBody: validated, endpoint: 'POST /v1/taxInvoices/issue' });
|
|
24
15
|
return;
|
|
25
16
|
}
|
|
26
17
|
verbose('세금계산서 정발행 요청');
|
|
27
|
-
const
|
|
18
|
+
const client = createClient(globalOpts);
|
|
28
19
|
const result = await client.issueTaxInvoice(validated, {
|
|
29
|
-
|
|
30
|
-
referenceId: options.referenceId,
|
|
20
|
+
referenceId,
|
|
31
21
|
});
|
|
32
22
|
outputSuccess(result);
|
|
33
23
|
}
|
|
@@ -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;AAEzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAoD,EACpD,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,kCAAkC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5E,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;SACZ,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-id.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/reference-id.ts"],"names":[],"mappings":"AAGA,wBAAgB,kCAAkC,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI3F"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
2
|
+
import { taxInvoiceClientReferenceIdSchema } from '../../validators/schemas.js';
|
|
3
|
+
export function parseOptionalTaxInvoiceReferenceId(referenceId) {
|
|
4
|
+
return referenceId === undefined
|
|
5
|
+
? undefined
|
|
6
|
+
: parseOrThrow(taxInvoiceClientReferenceIdSchema, referenceId);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=reference-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-id.js","sourceRoot":"","sources":["../../../../src/commands/invoice/reference-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAC;AAEhF,MAAM,UAAU,kCAAkC,CAAC,WAAoB;IACrE,OAAO,WAAW,KAAK,SAAS;QAC9B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,YAAY,CAAC,iCAAiC,EAAE,WAAW,CAAC,CAAC;AACnE,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;AAMpC,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,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;AAMpC,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpG"}
|
|
@@ -1,15 +1,13 @@
|
|
|
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 {
|
|
3
|
+
import { parseOrThrow } from '../../validators/parse.js';
|
|
4
|
+
import { taxInvoiceClientReferenceIdSchema } from '../../validators/schemas.js';
|
|
5
5
|
export async function statusAction(options, command) {
|
|
6
6
|
try {
|
|
7
7
|
const globalOpts = command.optsWithGlobals();
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl() });
|
|
12
|
-
const result = await client.getTaxInvoiceStatus(options.referenceId);
|
|
8
|
+
const referenceId = parseOrThrow(taxInvoiceClientReferenceIdSchema, options.referenceId);
|
|
9
|
+
const client = createApiKeyClient(globalOpts);
|
|
10
|
+
const result = await client.getTaxInvoiceStatus(referenceId);
|
|
13
11
|
outputSuccess(result);
|
|
14
12
|
}
|
|
15
13
|
catch (err) {
|
|
@@ -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;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgC,EAAE,OAAgB;IACnF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,iCAAiC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC7D,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,7 +7,7 @@ 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
13
|
cash-receipt-issue 현금영수증 발행
|
|
@@ -28,8 +28,7 @@ Examples:
|
|
|
28
28
|
outputSuccess({ availableSchemas: list });
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
commandName = resolveDeprecatedName(commandName, { 'customer-create': 'supplier-create' }, '스키마');
|
|
31
|
+
commandName = resolveLegacyIssuerName(commandName, LEGACY_ISSUER_CREATE_ALIASES, '스키마');
|
|
33
32
|
const schema = jsonSchemas[commandName];
|
|
34
33
|
if (!schema) {
|
|
35
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"}
|