@bolta-io/cli 0.0.16 → 0.0.18
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 +25 -0
- package/CLAUDE.md +3 -1
- package/README.md +3 -0
- package/dist/bin/bolta.js +18 -30
- package/dist/bin/bolta.js.map +1 -1
- package/dist/src/client/bolta-client.d.ts +3 -0
- package/dist/src/client/bolta-client.d.ts.map +1 -1
- package/dist/src/client/bolta-client.js +24 -6
- package/dist/src/client/bolta-client.js.map +1 -1
- package/dist/src/commands/config/index.d.ts.map +1 -1
- package/dist/src/commands/config/index.js +73 -33
- 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 +4 -0
- package/dist/src/commands/examples/index.js.map +1 -1
- package/dist/src/commands/invoice/amend.d.ts.map +1 -1
- package/dist/src/commands/invoice/amend.js +9 -18
- package/dist/src/commands/invoice/amend.js.map +1 -1
- package/dist/src/commands/invoice/index.d.ts.map +1 -1
- package/dist/src/commands/invoice/index.js +3 -0
- 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 +3 -8
- 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 -8
- package/dist/src/commands/invoice/issue.js.map +1 -1
- package/dist/src/commands/update/nudge.d.ts +12 -0
- package/dist/src/commands/update/nudge.d.ts.map +1 -0
- package/dist/src/commands/update/nudge.js +104 -0
- package/dist/src/commands/update/nudge.js.map +1 -0
- package/dist/src/commands/update/updater.d.ts.map +1 -1
- package/dist/src/commands/update/updater.js +15 -28
- package/dist/src/commands/update/updater.js.map +1 -1
- package/dist/src/config/config-manager.d.ts +13 -0
- package/dist/src/config/config-manager.d.ts.map +1 -1
- package/dist/src/config/config-manager.js +57 -21
- package/dist/src/config/config-manager.js.map +1 -1
- package/dist/src/config/update-check-cache.d.ts +12 -0
- package/dist/src/config/update-check-cache.d.ts.map +1 -0
- package/dist/src/config/update-check-cache.js +45 -0
- package/dist/src/config/update-check-cache.js.map +1 -0
- package/dist/src/types/api.d.ts +6 -2
- package/dist/src/types/api.d.ts.map +1 -1
- package/dist/src/types/api.js +4 -1
- package/dist/src/types/api.js.map +1 -1
- package/dist/src/utils/client.d.ts +17 -0
- package/dist/src/utils/client.d.ts.map +1 -0
- package/dist/src/utils/client.js +17 -0
- package/dist/src/utils/client.js.map +1 -0
- package/dist/src/utils/output.d.ts +10 -2
- package/dist/src/utils/output.d.ts.map +1 -1
- package/dist/src/utils/output.js +17 -3
- package/dist/src/utils/output.js.map +1 -1
- package/dist/src/utils/platform.d.ts +1 -0
- package/dist/src/utils/platform.d.ts.map +1 -1
- package/dist/src/utils/platform.js +36 -9
- package/dist/src/utils/platform.js.map +1 -1
- package/dist/src/utils/version.d.ts +3 -0
- package/dist/src/utils/version.d.ts.map +1 -1
- package/dist/src/utils/version.js +24 -0
- package/dist/src/utils/version.js.map +1 -1
- package/dist/src/validators/schemas.d.ts +41 -1
- package/dist/src/validators/schemas.d.ts.map +1 -1
- package/dist/src/validators/schemas.js +68 -6
- package/dist/src/validators/schemas.js.map +1 -1
- package/llms.txt +4 -2
- package/package.json +1 -1
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BoltaClient } from '../../client/bolta-client.js';
|
|
1
|
+
import { createClient } from '../../utils/client.js';
|
|
3
2
|
import { resolveInput } from '../../utils/input.js';
|
|
4
3
|
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
5
4
|
import { amendTerminationSchema, amendChangeSupplyCostSchema } from '../../validators/schemas.js';
|
|
6
|
-
import { BoltaValidationError
|
|
5
|
+
import { BoltaValidationError } from '../../utils/errors.js';
|
|
7
6
|
import { ZodError } from 'zod';
|
|
8
7
|
export function registerAmendCommands(invoice) {
|
|
9
8
|
const amend = invoice.command('amend').description('세금계산서 수정 발행');
|
|
@@ -20,10 +19,6 @@ Example:
|
|
|
20
19
|
.action(async (issuanceKey, options, command) => {
|
|
21
20
|
try {
|
|
22
21
|
const globalOpts = command.optsWithGlobals();
|
|
23
|
-
const apiKey = resolveApiKey(globalOpts.apiKey);
|
|
24
|
-
if (!apiKey)
|
|
25
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
26
|
-
const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
|
|
27
22
|
let validated;
|
|
28
23
|
try {
|
|
29
24
|
validated = amendTerminationSchema.parse({ date: options.date });
|
|
@@ -43,8 +38,8 @@ Example:
|
|
|
43
38
|
});
|
|
44
39
|
return;
|
|
45
40
|
}
|
|
46
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
47
41
|
verbose('수정발행 (계약 해제) 요청', { issuanceKey });
|
|
42
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
48
43
|
const result = await client.amendTermination(issuanceKey, validated, supplierKey);
|
|
49
44
|
outputSuccess(result);
|
|
50
45
|
}
|
|
@@ -59,9 +54,13 @@ Example:
|
|
|
59
54
|
.option('--file <path>', 'JSON 파일 경로')
|
|
60
55
|
.option('--stdin', '표준 입력에서 읽기')
|
|
61
56
|
.addHelpText('after', `
|
|
57
|
+
Note:
|
|
58
|
+
taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
|
|
59
|
+
|
|
62
60
|
Example:
|
|
63
61
|
bolta invoice amend change-supply-cost 8D529FAD3EBAE050 --data '{
|
|
64
62
|
"date": "2026-03-25",
|
|
63
|
+
"taxType": "TAXABLE",
|
|
65
64
|
"items": [{
|
|
66
65
|
"date": "2026-03-25",
|
|
67
66
|
"name": "개발 용역 (수정)",
|
|
@@ -72,10 +71,6 @@ Example:
|
|
|
72
71
|
.action(async (issuanceKey, options, command) => {
|
|
73
72
|
try {
|
|
74
73
|
const globalOpts = command.optsWithGlobals();
|
|
75
|
-
const apiKey = resolveApiKey(globalOpts.apiKey);
|
|
76
|
-
if (!apiKey)
|
|
77
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
78
|
-
const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
|
|
79
74
|
const raw = await resolveInput(options);
|
|
80
75
|
let validated;
|
|
81
76
|
try {
|
|
@@ -96,8 +91,8 @@ Example:
|
|
|
96
91
|
});
|
|
97
92
|
return;
|
|
98
93
|
}
|
|
99
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
100
94
|
verbose('수정발행 (공급가액 변동) 요청', { issuanceKey });
|
|
95
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
101
96
|
const result = await client.amendChangeSupplyCost(issuanceKey, validated, supplierKey);
|
|
102
97
|
outputSuccess(result);
|
|
103
98
|
}
|
|
@@ -117,10 +112,6 @@ Example:
|
|
|
117
112
|
.action(async (issuanceKey, options, command) => {
|
|
118
113
|
try {
|
|
119
114
|
const globalOpts = command.optsWithGlobals();
|
|
120
|
-
const apiKey = resolveApiKey(globalOpts.apiKey);
|
|
121
|
-
if (!apiKey)
|
|
122
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
123
|
-
const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
|
|
124
115
|
if (globalOpts.dryRun) {
|
|
125
116
|
outputSuccess({
|
|
126
117
|
dryRun: true,
|
|
@@ -129,8 +120,8 @@ Example:
|
|
|
129
120
|
});
|
|
130
121
|
return;
|
|
131
122
|
}
|
|
132
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
133
123
|
verbose('수정발행 (착오에 의한 이중발급) 요청', { issuanceKey });
|
|
124
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
134
125
|
const result = await client.amendDoubleIssuance(issuanceKey, supplierKey);
|
|
135
126
|
outputSuccess(result);
|
|
136
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amend.js","sourceRoot":"","sources":["../../../../src/commands/invoice/amend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"amend.js","sourceRoot":"","sources":["../../../../src/commands/invoice/amend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E9D"}
|
|
@@ -16,11 +16,13 @@ export function registerInvoiceCommands(program) {
|
|
|
16
16
|
Notes:
|
|
17
17
|
- 정발행은 공급받는자 외국인등록번호를 지원합니다.
|
|
18
18
|
- 외국인등록번호 공급받는자는 최상위 description 없이 요청하세요. 여권번호는 지원하지 않습니다.
|
|
19
|
+
- taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
|
|
19
20
|
|
|
20
21
|
Example:
|
|
21
22
|
bolta invoice issue --data '{
|
|
22
23
|
"date": "2026-03-25",
|
|
23
24
|
"purpose": "CLAIM",
|
|
25
|
+
"taxType": "TAXABLE",
|
|
24
26
|
"supplier": {
|
|
25
27
|
"identificationNumber": "1234567890",
|
|
26
28
|
"organizationName": "공급자 주식회사",
|
|
@@ -51,6 +53,7 @@ Example:
|
|
|
51
53
|
.addHelpText('after', `
|
|
52
54
|
Note:
|
|
53
55
|
역발행은 supplied.identificationNumber에 사업자등록번호(10자리)만 허용합니다.
|
|
56
|
+
taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
|
|
54
57
|
|
|
55
58
|
Example:
|
|
56
59
|
bolta invoice issue-request --data '{...}'`)
|
|
@@ -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,mCAAmC,CAAC;SAClE,WAAW,CAAC,OAAO,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,mCAAmC,CAAC;SAClE,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6BrB,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,mCAAmC,CAAC;SAClE,WAAW,CAAC,OAAO,EAAE;;;;;;6CAMmB,CAAC;SACzC,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,8BAA8B,CAAC;SACrE,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;AAOpC,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,CA+Bf"}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BoltaClient } from '../../client/bolta-client.js';
|
|
1
|
+
import { createClient } from '../../utils/client.js';
|
|
3
2
|
import { resolveInput } from '../../utils/input.js';
|
|
4
3
|
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
5
4
|
import { createTaxInvoiceIssueRequestSchema } from '../../validators/schemas.js';
|
|
6
|
-
import { BoltaValidationError
|
|
5
|
+
import { BoltaValidationError } from '../../utils/errors.js';
|
|
7
6
|
import { ZodError } from 'zod';
|
|
8
7
|
export async function issueRequestAction(options, command) {
|
|
9
8
|
try {
|
|
10
9
|
const globalOpts = command.optsWithGlobals();
|
|
11
|
-
const apiKey = resolveApiKey(globalOpts.apiKey);
|
|
12
|
-
if (!apiKey)
|
|
13
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
14
|
-
const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
|
|
15
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
16
10
|
const raw = await resolveInput(options);
|
|
17
11
|
let validated;
|
|
18
12
|
try {
|
|
@@ -30,6 +24,7 @@ export async function issueRequestAction(options, command) {
|
|
|
30
24
|
return;
|
|
31
25
|
}
|
|
32
26
|
verbose('세금계산서 역발행 요청');
|
|
27
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
33
28
|
const result = await client.issueRequestTaxInvoice(validated, {
|
|
34
29
|
supplierKey,
|
|
35
30
|
referenceId: options.referenceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-request.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AACA,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,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAG/B,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;QAExC,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,kCAAkC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzF,MAAM,IAAI,oBAAoB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,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,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE;YAC5D,WAAW;YACX,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;AAOpC,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,CA+Bf"}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BoltaClient } from '../../client/bolta-client.js';
|
|
1
|
+
import { createClient } from '../../utils/client.js';
|
|
3
2
|
import { resolveInput } from '../../utils/input.js';
|
|
4
3
|
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
5
4
|
import { createTaxInvoiceSchema } from '../../validators/schemas.js';
|
|
6
|
-
import { BoltaValidationError
|
|
5
|
+
import { BoltaValidationError } from '../../utils/errors.js';
|
|
7
6
|
import { ZodError } from 'zod';
|
|
8
7
|
export async function issueAction(options, command) {
|
|
9
8
|
try {
|
|
10
9
|
const globalOpts = command.optsWithGlobals();
|
|
11
|
-
const apiKey = resolveApiKey(globalOpts.apiKey);
|
|
12
|
-
if (!apiKey)
|
|
13
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
14
|
-
const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
|
|
15
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
16
10
|
const raw = await resolveInput(options);
|
|
17
11
|
let validated;
|
|
18
12
|
try {
|
|
@@ -30,6 +24,7 @@ export async function issueAction(options, command) {
|
|
|
30
24
|
return;
|
|
31
25
|
}
|
|
32
26
|
verbose('세금계산서 정발행 요청');
|
|
27
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
33
28
|
const result = await client.issueTaxInvoice(validated, {
|
|
34
29
|
supplierKey,
|
|
35
30
|
referenceId: options.referenceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AACA,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,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAG/B,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;QAExC,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzF,MAAM,IAAI,oBAAoB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,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,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE;YACrD,WAAW;YACX,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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BoltaConfig } from '../../types/api.js';
|
|
2
|
+
import { type InstallMethod } from '../../utils/platform.js';
|
|
3
|
+
/** 백그라운드 캐시 갱신용 숨김 커맨드 이름 */
|
|
4
|
+
export declare const UPDATE_CACHE_COMMAND = "__update-cache";
|
|
5
|
+
export declare function isUpdateCheckDisabled(config: BoltaConfig): boolean;
|
|
6
|
+
export declare function maybeNudgeUpdate(config: BoltaConfig): void;
|
|
7
|
+
export declare function resolveSelfInvocation(installMethod: InstallMethod, execPath?: string, scriptPath?: string): {
|
|
8
|
+
command: string;
|
|
9
|
+
args: string[];
|
|
10
|
+
} | undefined;
|
|
11
|
+
export declare function refreshUpdateCache(): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=nudge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nudge.d.ts","sourceRoot":"","sources":["../../../../src/commands/update/nudge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAKjC,6BAA6B;AAC7B,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAIrD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAElE;AAaD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAiB1D;AAMD,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,aAAa,EAC5B,QAAQ,GAAE,MAAyB,EACnC,UAAU,GAAE,MAA8B,GACzC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAajD;AAkCD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAexD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { realpathSync } from 'node:fs';
|
|
3
|
+
import { loadUpdateCheckCache, saveUpdateCheckCache, } from '../../config/update-check-cache.js';
|
|
4
|
+
import { detectInstallMethod, getUpdateCommand, } from '../../utils/platform.js';
|
|
5
|
+
import { getCurrentVersion, fetchNudgeVersion, isUpdateAvailable } from '../../utils/version.js';
|
|
6
|
+
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
|
|
7
|
+
/** 백그라운드 캐시 갱신용 숨김 커맨드 이름 */
|
|
8
|
+
export const UPDATE_CACHE_COMMAND = '__update-cache';
|
|
9
|
+
// 넛지 비활성화 여부: env, config, CI 셋 중 하나라도 켜지면 비활성화.
|
|
10
|
+
// config 읽기 비용을 피하도록 env 체크를 먼저 수행한다.
|
|
11
|
+
export function isUpdateCheckDisabled(config) {
|
|
12
|
+
return Boolean(process.env.BOLTA_NO_UPDATE_CHECK || process.env.CI || config.updateCheck === false);
|
|
13
|
+
}
|
|
14
|
+
// 설치 방식이 바뀌었으면(재설치) 캐시된 버전은 다른 소스 기준이므로 신뢰하지 않음
|
|
15
|
+
function trustedVersion(cache, installMethod) {
|
|
16
|
+
return cache?.installMethod === installMethod ? cache.latestVersion : undefined;
|
|
17
|
+
}
|
|
18
|
+
// preAction에서 호출. 캐시 파일만 읽어 넛지를 출력하고(네트워크 없음),
|
|
19
|
+
// 캐시가 오래됐으면 detached 자식으로 갱신을 위임해 프로세스 종료를 지연시키지 않는다.
|
|
20
|
+
// 새 버전 배너는 캐시가 갱신된 다음 실행부터 표시된다 (codex CLI와 동일한 모델).
|
|
21
|
+
export function maybeNudgeUpdate(config) {
|
|
22
|
+
if (isUpdateCheckDisabled(config))
|
|
23
|
+
return;
|
|
24
|
+
const cache = loadUpdateCheckCache();
|
|
25
|
+
const installMethod = detectInstallMethod();
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const latestVersion = trustedVersion(cache, installMethod);
|
|
28
|
+
if (latestVersion && isUpdateAvailable(getCurrentVersion(), latestVersion)) {
|
|
29
|
+
printUpdateNotice(latestVersion, installMethod);
|
|
30
|
+
}
|
|
31
|
+
if (!cache || cache.installMethod !== installMethod || now - cache.lastCheckedAt >= ONE_DAY_MS) {
|
|
32
|
+
// spawn 전에 시도 시각을 기록: 자식이 죽거나 오프라인이어도 24시간 내 재시도 없음
|
|
33
|
+
const saved = saveUpdateCheckCache({ latestVersion, lastCheckedAt: now, installMethod });
|
|
34
|
+
if (saved)
|
|
35
|
+
spawnBackgroundRefresh(installMethod);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 자기 자신을 detached로 재실행할 커맨드. 이미 감지된 설치 방식으로 분기:
|
|
39
|
+
// - sea/homebrew: execPath 자체가 bolta 바이너리
|
|
40
|
+
// - npm: node + 전역 bin의 JS 스크립트 (tsx 개발 모드는 .ts라서 제외됨)
|
|
41
|
+
// - unknown: 백그라운드 갱신 생략
|
|
42
|
+
export function resolveSelfInvocation(installMethod, execPath = process.execPath, scriptPath = process.argv[1] || '') {
|
|
43
|
+
if (installMethod === 'sea' || installMethod === 'homebrew') {
|
|
44
|
+
return { command: execPath, args: [] };
|
|
45
|
+
}
|
|
46
|
+
if (installMethod === 'npm') {
|
|
47
|
+
const runnableScriptPath = resolveRunnableNpmScriptPath(scriptPath);
|
|
48
|
+
if (runnableScriptPath) {
|
|
49
|
+
return { command: execPath, args: [runnableScriptPath] };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function resolveRunnableNpmScriptPath(scriptPath) {
|
|
55
|
+
if (isJavaScriptPath(scriptPath))
|
|
56
|
+
return scriptPath;
|
|
57
|
+
try {
|
|
58
|
+
const realPath = realpathSync(scriptPath);
|
|
59
|
+
return isJavaScriptPath(realPath) ? realPath : undefined;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function isJavaScriptPath(scriptPath) {
|
|
66
|
+
return /\.(c|m)?js$/i.test(scriptPath);
|
|
67
|
+
}
|
|
68
|
+
function spawnBackgroundRefresh(installMethod) {
|
|
69
|
+
const self = resolveSelfInvocation(installMethod);
|
|
70
|
+
if (!self)
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
spawn(self.command, [...self.args, UPDATE_CACHE_COMMAND], {
|
|
74
|
+
detached: true,
|
|
75
|
+
stdio: 'ignore',
|
|
76
|
+
windowsHide: true,
|
|
77
|
+
}).unref();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// spawn 실패는 무시 (다음 24시간 주기에 재시도)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 숨김 커맨드(__update-cache)의 액션. 성공/실패 모두 lastCheckedAt을 갱신하고,
|
|
84
|
+
// 실패 시에는 기존에 알던 버전을 보존한다.
|
|
85
|
+
export async function refreshUpdateCache() {
|
|
86
|
+
const installMethod = detectInstallMethod();
|
|
87
|
+
const cache = {
|
|
88
|
+
lastCheckedAt: Date.now(),
|
|
89
|
+
latestVersion: trustedVersion(loadUpdateCheckCache(), installMethod),
|
|
90
|
+
installMethod,
|
|
91
|
+
};
|
|
92
|
+
try {
|
|
93
|
+
cache.latestVersion = await fetchNudgeVersion(installMethod);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// 네트워크 실패: 시도 시각만 기록
|
|
97
|
+
}
|
|
98
|
+
saveUpdateCheckCache(cache);
|
|
99
|
+
}
|
|
100
|
+
function printUpdateNotice(version, installMethod) {
|
|
101
|
+
const updateCommand = getUpdateCommand(installMethod);
|
|
102
|
+
console.error(`\n[bolta] 새 버전 v${version}이 있습니다. '${updateCommand}'로 업데이트하세요.\n`);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=nudge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nudge.js","sourceRoot":"","sources":["../../../../src/commands/update/nudge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAmBxD;AAED,wBAAsB,aAAa,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAyFjF"}
|
|
@@ -6,49 +6,36 @@ import { execSync } from 'node:child_process';
|
|
|
6
6
|
import { pipeline } from 'node:stream/promises';
|
|
7
7
|
import { createWriteStream } from 'node:fs';
|
|
8
8
|
import { Readable } from 'node:stream';
|
|
9
|
-
import { detectInstallMethod, detectPlatform } from '../../utils/platform.js';
|
|
10
|
-
import { fetchLatestVersion, getCurrentVersion, isUpdateAvailable, } from '../../utils/version.js';
|
|
9
|
+
import { detectInstallMethod, detectPlatform, getUpdateCommand } from '../../utils/platform.js';
|
|
10
|
+
import { fetchLatestVersion, fetchNudgeVersion, getCurrentVersion, isUpdateAvailable, } from '../../utils/version.js';
|
|
11
|
+
import { saveUpdateCheckCache } from '../../config/update-check-cache.js';
|
|
11
12
|
import { BoltaUpdateError } from '../../utils/errors.js';
|
|
12
13
|
import { verbose } from '../../utils/output.js';
|
|
13
14
|
export async function checkUpdate() {
|
|
14
15
|
const currentVersion = getCurrentVersion();
|
|
15
16
|
const installMethod = detectInstallMethod();
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
updateCommand = 'brew upgrade bolta';
|
|
22
|
-
break;
|
|
23
|
-
case 'npm':
|
|
24
|
-
updateCommand = 'npm update -g @bolta-io/cli';
|
|
25
|
-
break;
|
|
26
|
-
case 'sea':
|
|
27
|
-
updateCommand = 'bolta update';
|
|
28
|
-
break;
|
|
29
|
-
default:
|
|
30
|
-
updateCommand = 'npm update -g @bolta-io/cli 또는 brew upgrade bolta';
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
17
|
+
// 넛지와 같은 소스 사용: homebrew는 formula 버전 기준 (조기 안내 방지)
|
|
18
|
+
const latestVersion = await fetchNudgeVersion(installMethod);
|
|
19
|
+
// 명시적 확인 결과를 넛지 캐시에도 반영해 두 경로가 같은 버전을 말하게 함
|
|
20
|
+
saveUpdateCheckCache({ lastCheckedAt: Date.now(), latestVersion, installMethod });
|
|
21
|
+
const updateAvailable = isUpdateAvailable(currentVersion, latestVersion);
|
|
33
22
|
return {
|
|
34
23
|
currentVersion,
|
|
35
|
-
latestVersion
|
|
24
|
+
latestVersion,
|
|
36
25
|
updateAvailable,
|
|
37
26
|
installMethod,
|
|
38
|
-
updateCommand,
|
|
39
|
-
changelog:
|
|
27
|
+
updateCommand: getUpdateCommand(installMethod),
|
|
28
|
+
changelog: `https://github.com/bolta-io/bolta-cli/releases/tag/v${latestVersion}`,
|
|
40
29
|
};
|
|
41
30
|
}
|
|
42
31
|
export async function performUpdate(force = false) {
|
|
43
32
|
const installMethod = detectInstallMethod();
|
|
44
33
|
// SEA 바이너리만 자체 업데이트 허용 (허용리스트 방식)
|
|
45
34
|
if (installMethod !== 'sea') {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
};
|
|
51
|
-
throw new BoltaUpdateError(`${installMethod} 환경에서는 직접 업데이트할 수 없습니다.`, suggestions[installMethod] || suggestions.unknown);
|
|
35
|
+
const suggestion = installMethod === 'unknown'
|
|
36
|
+
? '설치 방식을 감지할 수 없습니다. npm이나 Homebrew로 재설치하세요.'
|
|
37
|
+
: `'${getUpdateCommand(installMethod)}' 명령을 사용하세요.`;
|
|
38
|
+
throw new BoltaUpdateError(`${installMethod} 환경에서는 직접 업데이트할 수 없습니다.`, suggestion);
|
|
52
39
|
}
|
|
53
40
|
const currentVersion = getCurrentVersion();
|
|
54
41
|
const latest = await fetchLatestVersion();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,MAAM,EACN,UAAU,GAEX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAY,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import type { BoltaConfig } from '../types/api.js';
|
|
2
|
+
export declare const CONFIG_DIR: string;
|
|
2
3
|
export declare function loadConfig(): BoltaConfig;
|
|
3
4
|
export declare function saveConfig(config: BoltaConfig): void;
|
|
5
|
+
export type SupplierKeySource = 'flag' | 'legacy-flag' | 'env' | 'config' | 'legacy-env' | 'legacy-config' | 'none';
|
|
6
|
+
export interface ResolvedSupplierKey {
|
|
7
|
+
value?: string;
|
|
8
|
+
source: SupplierKeySource;
|
|
9
|
+
}
|
|
4
10
|
export declare function resolveApiKey(cliFlag?: string): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* supplierKey를 우선순위대로 해석하고, 어느 소스에서 왔는지 함께 반환한다.
|
|
13
|
+
* 모든 값은 앞뒤 공백/개행을 제거한다(헤더 오염 방지).
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveSupplierKeyWithSource(cliFlag?: string, legacyCliFlag?: string): ResolvedSupplierKey;
|
|
5
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';
|
|
6
19
|
export declare function resolveBaseUrl(): string;
|
|
7
20
|
export declare function maskApiKey(key: string): string;
|
|
8
21
|
//# 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;AAGnD,eAAO,MAAM,UAAU,QAA4B,CAAC;AAGpD,wBAAgB,UAAU,IAAI,WAAW,CAOxC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,aAAa,GACb,KAAK,GACL,QAAQ,GACR,YAAY,GACZ,eAAe,GACf,MAAM,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AASD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,CAgCrB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/F;AAED,qDAAqD;AACrD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,GACxB,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAcpC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -1,8 +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 { deprecationWarning } from '../utils/output.js';
|
|
5
|
-
const CONFIG_DIR = join(homedir(), '.bolta');
|
|
4
|
+
import { deprecationWarning, maskSecret } from '../utils/output.js';
|
|
5
|
+
export const CONFIG_DIR = join(homedir(), '.bolta');
|
|
6
6
|
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
7
7
|
export function loadConfig() {
|
|
8
8
|
try {
|
|
@@ -17,38 +17,74 @@ export function saveConfig(config) {
|
|
|
17
17
|
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
18
18
|
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
19
19
|
}
|
|
20
|
+
/** 값의 앞뒤 공백/개행을 제거하고, 빈 값이면 undefined로 정규화한다. */
|
|
21
|
+
function normalize(value) {
|
|
22
|
+
if (typeof value !== 'string')
|
|
23
|
+
return undefined;
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
26
|
+
}
|
|
20
27
|
export function resolveApiKey(cliFlag) {
|
|
21
|
-
return cliFlag || process.env.BOLTA_API_KEY || loadConfig().apiKey;
|
|
28
|
+
return normalize(cliFlag) || normalize(process.env.BOLTA_API_KEY) || normalize(loadConfig().apiKey);
|
|
22
29
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
/**
|
|
31
|
+
* supplierKey를 우선순위대로 해석하고, 어느 소스에서 왔는지 함께 반환한다.
|
|
32
|
+
* 모든 값은 앞뒤 공백/개행을 제거한다(헤더 오염 방지).
|
|
33
|
+
*/
|
|
34
|
+
export function resolveSupplierKeyWithSource(cliFlag, legacyCliFlag) {
|
|
35
|
+
const flag = normalize(cliFlag);
|
|
36
|
+
if (flag)
|
|
37
|
+
return { value: flag, source: 'flag' };
|
|
38
|
+
const legacyFlag = normalize(legacyCliFlag);
|
|
39
|
+
if (legacyFlag) {
|
|
27
40
|
deprecationWarning("'--customer-key' 플래그는 '--supplier-key'로 변경되었습니다.");
|
|
28
|
-
return
|
|
41
|
+
return { value: legacyFlag, source: 'legacy-flag' };
|
|
29
42
|
}
|
|
30
43
|
const config = loadConfig();
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
44
|
+
const envKey = normalize(process.env.BOLTA_SUPPLIER_KEY);
|
|
45
|
+
if (envKey)
|
|
46
|
+
return { value: envKey, source: 'env' };
|
|
47
|
+
const configKey = normalize(config.supplierKey);
|
|
48
|
+
if (configKey)
|
|
49
|
+
return { value: configKey, source: 'config' };
|
|
35
50
|
// 하위호환 폴백: 구 환경변수 / config 필드
|
|
36
|
-
|
|
51
|
+
const legacyEnv = normalize(process.env.BOLTA_CUSTOMER_KEY);
|
|
52
|
+
if (legacyEnv) {
|
|
37
53
|
deprecationWarning("'BOLTA_CUSTOMER_KEY' 환경변수는 'BOLTA_SUPPLIER_KEY'로 변경되었습니다.");
|
|
38
|
-
return
|
|
54
|
+
return { value: legacyEnv, source: 'legacy-env' };
|
|
39
55
|
}
|
|
40
|
-
|
|
56
|
+
const legacyConfig = normalize(config.customerKey);
|
|
57
|
+
if (legacyConfig) {
|
|
41
58
|
deprecationWarning("config의 'customer-key'는 'supplier-key'로 변경되었습니다. 'bolta config set supplier-key <값>'으로 갱신하세요.");
|
|
42
|
-
return config
|
|
59
|
+
return { value: legacyConfig, source: 'legacy-config' };
|
|
60
|
+
}
|
|
61
|
+
return { source: 'none' };
|
|
62
|
+
}
|
|
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';
|
|
43
80
|
}
|
|
44
|
-
return undefined;
|
|
45
81
|
}
|
|
46
82
|
export function resolveBaseUrl() {
|
|
47
|
-
return process.env.BOLTA_API_BASE_URL
|
|
83
|
+
return (normalize(process.env.BOLTA_API_BASE_URL) ||
|
|
84
|
+
normalize(loadConfig().baseUrl) ||
|
|
85
|
+
'https://xapi.bolta.io/v1');
|
|
48
86
|
}
|
|
49
87
|
export function maskApiKey(key) {
|
|
50
|
-
|
|
51
|
-
return '***';
|
|
52
|
-
return key.slice(0, 5) + '***' + key.slice(-3);
|
|
88
|
+
return maskSecret(key, 5, 3);
|
|
53
89
|
}
|
|
54
90
|
//# sourceMappingURL=config-manager.js.map
|