@bolta-io/cli 0.0.16 → 0.0.17
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 +19 -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/invoice/amend.d.ts.map +1 -1
- package/dist/src/commands/invoice/amend.js +5 -18
- package/dist/src/commands/invoice/amend.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 +2 -2
- package/dist/src/types/api.d.ts.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/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @bolta-io/cli
|
|
2
2
|
|
|
3
|
+
## 0.0.17
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 215ec16: supplierKey 관련 진단성을 개선했습니다.
|
|
8
|
+
|
|
9
|
+
- `config test`가 서버의 403(존재하지 않는 supplierKey) 응답을 인증 실패로 오판하던 버그를 고쳤습니다. 이제 401만 인증 실패로 보고, 설정된 supplierKey가 이 API 키로 유효한지까지 함께 점검합니다.
|
|
10
|
+
- apiKey/supplierKey/baseUrl 저장·조회 시 앞뒤 공백·개행을 제거해 헤더 오염을 방지합니다.
|
|
11
|
+
- supplierKey를 실은 요청이 403을 받으면, 원인(키 불일치·환경변수 덮어쓰기)과 해결법(`bolta supplier get`, `env | grep BOLTA`, `bolta config test`)을 안내하고 마스킹된 supplierKey와 그 소스(env/config)를 에러에 노출합니다.
|
|
12
|
+
- `bolta --verbose` 실행 시 어떤 supplierKey가 어느 소스에서 전송되는지 로깅합니다.
|
|
13
|
+
- `config set supplier-key`에 공백·비정상 형식 경고를 추가했습니다.
|
|
14
|
+
|
|
15
|
+
업데이트 알림의 버전 기준과 캐시 처리를 개선했습니다.
|
|
16
|
+
|
|
17
|
+
- Homebrew 설치 환경에서는 실제 formula 버전을 기준으로 업데이트 알림과 `bolta update check` 결과를 계산해, 아직 `brew upgrade bolta`로 설치할 수 없는 버전을 안내하지 않습니다.
|
|
18
|
+
- 업데이트 확인 결과를 별도 캐시 파일에 저장하고, 일반 명령 실행 중에는 네트워크 요청 없이 캐시된 정보만으로 새 버전 알림을 표시합니다.
|
|
19
|
+
- 캐시 저장이나 백그라운드 갱신 실행에 실패해도 원래 명령 실행을 막지 않도록 했습니다.
|
|
20
|
+
- 설치 방식별 업데이트 명령 안내를 한곳에서 계산해 `bolta update`, `brew upgrade bolta`, `npm update -g @bolta-io/cli` 안내가 일관되게 표시됩니다.
|
|
21
|
+
|
|
3
22
|
## 0.0.16
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/bin/bolta.js
CHANGED
|
@@ -7,9 +7,10 @@ import { registerConfigCommands } from '../src/commands/config/index.js';
|
|
|
7
7
|
import { registerExamplesCommand } from '../src/commands/examples/index.js';
|
|
8
8
|
import { registerSchemaCommand } from '../src/commands/schema/index.js';
|
|
9
9
|
import { registerUpdateCommands } from '../src/commands/update/index.js';
|
|
10
|
+
import { maybeNudgeUpdate, refreshUpdateCache, UPDATE_CACHE_COMMAND, } from '../src/commands/update/nudge.js';
|
|
10
11
|
import { registerGuideCommand } from '../src/commands/guide/index.js';
|
|
11
12
|
import { outputError, deprecationWarning } from '../src/utils/output.js';
|
|
12
|
-
import { getCurrentVersion
|
|
13
|
+
import { getCurrentVersion } from '../src/utils/version.js';
|
|
13
14
|
import { loadConfig, saveConfig } from '../src/config/config-manager.js';
|
|
14
15
|
const program = new Command();
|
|
15
16
|
program
|
|
@@ -26,9 +27,13 @@ program
|
|
|
26
27
|
if (opts.verbose) {
|
|
27
28
|
process.env.BOLTA_VERBOSE = '1';
|
|
28
29
|
}
|
|
30
|
+
// 백그라운드 캐시 갱신 자식 프로세스: 힌트/넛지 없이 본연의 작업만 (재귀 spawn 방지)
|
|
31
|
+
if (actionCommand.name() === UPDATE_CACHE_COMMAND)
|
|
32
|
+
return;
|
|
29
33
|
warnDeprecatedUsage();
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
const config = loadConfig();
|
|
35
|
+
checkFirstRun(actionCommand, config);
|
|
36
|
+
checkForUpdate(actionCommand, config);
|
|
32
37
|
});
|
|
33
38
|
registerSupplierCommands(program);
|
|
34
39
|
registerCertificateCommands(program);
|
|
@@ -60,7 +65,7 @@ function warnDeprecatedUsage() {
|
|
|
60
65
|
break;
|
|
61
66
|
}
|
|
62
67
|
}
|
|
63
|
-
function checkFirstRun(actionCommand) {
|
|
68
|
+
function checkFirstRun(actionCommand, config) {
|
|
64
69
|
const commandName = actionCommand.name();
|
|
65
70
|
const parentName = actionCommand.parent?.name();
|
|
66
71
|
// guide, config, update 커맨드에서는 힌트 미표시
|
|
@@ -70,42 +75,25 @@ function checkFirstRun(actionCommand) {
|
|
|
70
75
|
return;
|
|
71
76
|
if (commandName === 'update' || parentName === 'update')
|
|
72
77
|
return;
|
|
73
|
-
const config = loadConfig();
|
|
74
78
|
if (config.guideShown)
|
|
75
79
|
return;
|
|
76
80
|
console.error("[bolta] 처음 사용하시나요? 'bolta guide'로 주요 개념과 사용법을 확인하세요.\n");
|
|
77
81
|
config.guideShown = true;
|
|
78
82
|
saveConfig(config);
|
|
79
83
|
}
|
|
80
|
-
|
|
81
|
-
function checkForUpdateInBackground(actionCommand) {
|
|
84
|
+
function checkForUpdate(actionCommand, config) {
|
|
82
85
|
// update 커맨드 자체에서는 중복 확인 안 함
|
|
83
86
|
if (actionCommand.name() === 'update' || actionCommand.parent?.name() === 'update')
|
|
84
87
|
return;
|
|
85
|
-
|
|
86
|
-
const now = Date.now();
|
|
87
|
-
const lastCheck = config.lastUpdateCheck || 0;
|
|
88
|
-
// 캐시된 결과가 있고 24시간 이내이면 캐시 사용
|
|
89
|
-
if (now - lastCheck < ONE_DAY_MS) {
|
|
90
|
-
if (config.latestKnownVersion && isUpdateAvailable(getCurrentVersion(), config.latestKnownVersion)) {
|
|
91
|
-
console.error(`\n[bolta] 새 버전 v${config.latestKnownVersion}이 있습니다. 'bolta update'로 업데이트하세요.\n`);
|
|
92
|
-
}
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
// 비동기로 최신 버전 확인 (fire-and-forget)
|
|
96
|
-
fetchLatestVersion()
|
|
97
|
-
.then((latest) => {
|
|
98
|
-
config.lastUpdateCheck = now;
|
|
99
|
-
config.latestKnownVersion = latest.version;
|
|
100
|
-
saveConfig(config);
|
|
101
|
-
if (isUpdateAvailable(getCurrentVersion(), latest.version)) {
|
|
102
|
-
console.error(`\n[bolta] 새 버전 v${latest.version}이 있습니다. 'bolta update'로 업데이트하세요.\n`);
|
|
103
|
-
}
|
|
104
|
-
})
|
|
105
|
-
.catch(() => {
|
|
106
|
-
// 네트워크 실패는 무시
|
|
107
|
-
});
|
|
88
|
+
maybeNudgeUpdate(config);
|
|
108
89
|
}
|
|
90
|
+
// 내부용 숨김 커맨드: 백그라운드에서 최신 버전을 확인해 캐시 파일에 기록
|
|
91
|
+
program
|
|
92
|
+
.command(UPDATE_CACHE_COMMAND, { hidden: true })
|
|
93
|
+
.description('내부용: 업데이트 캐시 갱신')
|
|
94
|
+
.action(async () => {
|
|
95
|
+
await refreshUpdateCache();
|
|
96
|
+
});
|
|
109
97
|
program.parseAsync(process.argv).catch((err) => {
|
|
110
98
|
outputError(err);
|
|
111
99
|
});
|
package/dist/bin/bolta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bolta.js","sourceRoot":"","sources":["../../bin/bolta.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"bolta.js","sourceRoot":"","sources":["../../bin/bolta.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ interface ClientConfig {
|
|
|
3
3
|
apiKey: string;
|
|
4
4
|
baseUrl: string;
|
|
5
5
|
supplierKey?: string;
|
|
6
|
+
/** supplierKey를 어느 소스에서 가져왔는지(env/config 등). 진단 로그·에러에 노출된다. */
|
|
7
|
+
supplierKeySource?: string;
|
|
6
8
|
timeout?: number;
|
|
7
9
|
maxRetries?: number;
|
|
8
10
|
}
|
|
@@ -10,6 +12,7 @@ export declare class BoltaClient {
|
|
|
10
12
|
private readonly baseUrl;
|
|
11
13
|
private readonly encodedApiKey;
|
|
12
14
|
private readonly supplierKey?;
|
|
15
|
+
private readonly supplierKeySource;
|
|
13
16
|
private readonly timeout;
|
|
14
17
|
private readonly maxRetries;
|
|
15
18
|
constructor(config: ClientConfig);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bolta-client.d.ts","sourceRoot":"","sources":["../../../src/client/bolta-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAOzB,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"bolta-client.d.ts","sourceRoot":"","sources":["../../../src/client/bolta-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAOzB,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,YAAY;IAiB1B,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAItE,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQjE,kDAAkD;IAC5C,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAIlF,+CAA+C;IACzC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAWjE,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAOvE,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3D,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW5D,eAAe,CACnB,IAAI,EAAE,uBAAuB,EAC7B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,gBAAgB,CAAC;IAUtB,sBAAsB,CAC1B,IAAI,EAAE,uBAAuB,EAC7B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,gBAAgB,CAAC;IAUtB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAO7D,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAOvE,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC;IAStB,qBAAqB,CACzB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,4BAA4B,EAClC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC;IAStB,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC;IAY5B,OAAO,CAAC,eAAe;YAQT,OAAO;CA6HtB"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { BoltaApiError, BoltaAuthError, BoltaNetworkError } from '../utils/errors.js';
|
|
2
|
-
import { deprecationWarning, verbose } from '../utils/output.js';
|
|
2
|
+
import { deprecationWarning, verbose, maskSecret } from '../utils/output.js';
|
|
3
3
|
import { getCurrentVersion } from '../utils/version.js';
|
|
4
4
|
const DEPRECATED_CUSTOMER_KEY_PREFIX = 'CustomerKey_';
|
|
5
5
|
export class BoltaClient {
|
|
6
6
|
baseUrl;
|
|
7
7
|
encodedApiKey;
|
|
8
8
|
supplierKey;
|
|
9
|
+
supplierKeySource;
|
|
9
10
|
timeout;
|
|
10
11
|
maxRetries;
|
|
11
12
|
constructor(config) {
|
|
@@ -15,6 +16,7 @@ export class BoltaClient {
|
|
|
15
16
|
this.baseUrl = config.baseUrl.replace(/\/+$/, '');
|
|
16
17
|
this.encodedApiKey = Buffer.from(`${config.apiKey}:`).toString('base64');
|
|
17
18
|
this.supplierKey = config.supplierKey;
|
|
19
|
+
this.supplierKeySource = config.supplierKeySource ?? 'unknown';
|
|
18
20
|
this.timeout = config.timeout ?? 30_000;
|
|
19
21
|
this.maxRetries = config.maxRetries ?? 3;
|
|
20
22
|
}
|
|
@@ -135,11 +137,22 @@ export class BoltaClient {
|
|
|
135
137
|
'User-Agent': `bolta-cli/${getCurrentVersion()}`,
|
|
136
138
|
};
|
|
137
139
|
const sk = options.supplierKey || this.supplierKey;
|
|
138
|
-
|
|
140
|
+
const supplierKeySource = options.supplierKey && options.supplierKey !== this.supplierKey
|
|
141
|
+
? 'argument'
|
|
142
|
+
: this.supplierKeySource;
|
|
143
|
+
const maskedSupplierKey = sk ? maskSecret(sk, 8, 4) : undefined;
|
|
144
|
+
if (sk) {
|
|
139
145
|
headers['Supplier-Key'] = sk;
|
|
146
|
+
verbose('Supplier-Key 사용', { supplierKey: maskedSupplierKey, source: supplierKeySource });
|
|
147
|
+
}
|
|
140
148
|
if (options.referenceId) {
|
|
141
149
|
headers['Bolta-Client-Reference-Id'] = options.referenceId;
|
|
142
150
|
}
|
|
151
|
+
// supplierKey 관련 4xx(특히 403)일 때 "무엇을·어디서 보냈는지"를 에러에 노출한다.
|
|
152
|
+
const supplierKeyDetails = sk
|
|
153
|
+
? { supplierKey: maskedSupplierKey, supplierKeySource }
|
|
154
|
+
: undefined;
|
|
155
|
+
const makeApiError = (status, code, message) => new BoltaApiError(message, code, status, getSuggestion(status, code, { hasSupplierKey: Boolean(sk) }), status === 403 ? supplierKeyDetails : undefined);
|
|
143
156
|
let lastError = null;
|
|
144
157
|
for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
|
|
145
158
|
try {
|
|
@@ -176,7 +189,7 @@ export class BoltaClient {
|
|
|
176
189
|
const message = errBody.message || response.statusText || '알 수 없는 오류';
|
|
177
190
|
// Don't retry 4xx (except 429)
|
|
178
191
|
if (response.status >= 400 && response.status < 500 && response.status !== 429) {
|
|
179
|
-
throw
|
|
192
|
+
throw makeApiError(response.status, code, message);
|
|
180
193
|
}
|
|
181
194
|
// 429: respect Retry-After
|
|
182
195
|
if (response.status === 429) {
|
|
@@ -196,7 +209,7 @@ export class BoltaClient {
|
|
|
196
209
|
await sleep(delay);
|
|
197
210
|
continue;
|
|
198
211
|
}
|
|
199
|
-
throw
|
|
212
|
+
throw makeApiError(response.status, code, message);
|
|
200
213
|
}
|
|
201
214
|
catch (error) {
|
|
202
215
|
if (error instanceof BoltaApiError)
|
|
@@ -226,13 +239,18 @@ function backoff(attempt) {
|
|
|
226
239
|
function sleep(ms) {
|
|
227
240
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
228
241
|
}
|
|
229
|
-
function getSuggestion(status, code) {
|
|
242
|
+
function getSuggestion(status, code, ctx) {
|
|
230
243
|
if (status === 401)
|
|
231
244
|
return "API 키가 올바른지 확인하세요. 'bolta config test'로 인증을 테스트할 수 있습니다.";
|
|
232
245
|
if (status === 402)
|
|
233
246
|
return "포인트 잔액이 부족합니다. Bolta API는 사전 충전 포인트 차감 방식입니다. https://developers.bolta.io 개발자센터에서 포인트를 충전하세요. 'bolta guide payment'로 요금 정보를 확인할 수 있습니다.";
|
|
234
|
-
if (status === 403)
|
|
247
|
+
if (status === 403) {
|
|
248
|
+
// 요청에 Supplier-Key가 실렸다면 supplierKey ↔ apiKey 불일치가 가장 흔한 원인이다.
|
|
249
|
+
if (ctx?.hasSupplierKey) {
|
|
250
|
+
return "이 API 키에 유효한 supplierKey인지 확인하세요. ① supplierKey는 test_/live_ 및 API 키마다 다릅니다(상호 호환 안 됨) ② 'bolta supplier get <supplierKey>'로 조회 ③ 환경변수 BOLTA_SUPPLIER_KEY/BOLTA_CUSTOMER_KEY가 config를 덮고 있지 않은지 'env | grep BOLTA'로 확인 ④ 'bolta config test'로 일괄 점검하세요.";
|
|
251
|
+
}
|
|
235
252
|
return '해당 작업에 대한 권한이 없습니다. API 키의 권한을 확인하세요.';
|
|
253
|
+
}
|
|
236
254
|
if (status === 404)
|
|
237
255
|
return '요청한 리소스를 찾을 수 없습니다. ID/키를 확인하세요.';
|
|
238
256
|
if (status === 429)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bolta-client.js","sourceRoot":"","sources":["../../../src/client/bolta-client.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"bolta-client.js","sourceRoot":"","sources":["../../../src/client/bolta-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4I7D"}
|
|
@@ -1,52 +1,61 @@
|
|
|
1
|
-
import { loadConfig, saveConfig, resolveApiKey, resolveBaseUrl, maskApiKey,
|
|
2
|
-
import { outputSuccess, outputError, deprecationWarning } from '../../utils/output.js';
|
|
1
|
+
import { loadConfig, saveConfig, resolveApiKey, resolveBaseUrl, maskApiKey, resolveSupplierKeyWithSource, supplierKeySourceLabel, } from '../../config/config-manager.js';
|
|
2
|
+
import { outputSuccess, outputError, deprecationWarning, warning } from '../../utils/output.js';
|
|
3
3
|
import { BoltaClient } from '../../client/bolta-client.js';
|
|
4
4
|
import { BoltaError, BoltaApiError } from '../../utils/errors.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return 'config';
|
|
16
|
-
return 'none';
|
|
5
|
+
/** config set 시 supplierKey 값이 의심스러우면 stderr로 경고한다(하드 차단 아님). */
|
|
6
|
+
function warnIfSuspiciousSupplierKey(value) {
|
|
7
|
+
if (!value)
|
|
8
|
+
return;
|
|
9
|
+
if (/\s/.test(value)) {
|
|
10
|
+
warning('supplierKey에 공백이 포함되어 있습니다. 복사 과정에서 섞이지 않았는지 확인하세요.');
|
|
11
|
+
}
|
|
12
|
+
if (!value.startsWith('SupplierKey_') && !value.startsWith('CustomerKey_')) {
|
|
13
|
+
warning("supplierKey는 보통 'SupplierKey_'로 시작합니다. 올바른 값인지 확인하세요.");
|
|
14
|
+
}
|
|
17
15
|
}
|
|
18
16
|
export function registerConfigCommands(program) {
|
|
19
17
|
const config = program.command('config').description('CLI 설정 관리');
|
|
20
18
|
config
|
|
21
19
|
.command('set <key> <value>')
|
|
22
|
-
.description('설정값 저장 (api-key, supplier-key, base-url)')
|
|
20
|
+
.description('설정값 저장 (api-key, supplier-key, base-url, update-check)')
|
|
23
21
|
.addHelpText('after', `
|
|
24
22
|
Examples:
|
|
25
23
|
bolta config set api-key test_your_key_here
|
|
26
24
|
bolta config set supplier-key SupplierKey_abc123
|
|
27
|
-
bolta config set base-url https://xapi.bolta.io/v1
|
|
25
|
+
bolta config set base-url https://xapi.bolta.io/v1
|
|
26
|
+
bolta config set update-check false`)
|
|
28
27
|
.action(async (key, value) => {
|
|
29
28
|
try {
|
|
29
|
+
// 헤더 오염(후행 개행/공백)을 원천 차단하기 위해 저장 전 정규화한다.
|
|
30
|
+
const trimmedValue = value.trim();
|
|
30
31
|
const current = loadConfig();
|
|
31
32
|
switch (key) {
|
|
32
33
|
case 'api-key':
|
|
33
|
-
current.apiKey =
|
|
34
|
+
current.apiKey = trimmedValue;
|
|
34
35
|
break;
|
|
35
36
|
case 'supplier-key':
|
|
36
|
-
|
|
37
|
+
warnIfSuspiciousSupplierKey(trimmedValue);
|
|
38
|
+
current.supplierKey = trimmedValue;
|
|
37
39
|
// 구 필드가 남아있으면 정리
|
|
38
40
|
delete current.customerKey;
|
|
39
41
|
break;
|
|
40
42
|
case 'customer-key':
|
|
41
43
|
deprecationWarning("config의 'customer-key'는 'supplier-key'로 변경되었습니다.");
|
|
42
|
-
|
|
44
|
+
warnIfSuspiciousSupplierKey(trimmedValue);
|
|
45
|
+
current.supplierKey = trimmedValue;
|
|
43
46
|
delete current.customerKey;
|
|
44
47
|
break;
|
|
45
48
|
case 'base-url':
|
|
46
|
-
current.baseUrl =
|
|
49
|
+
current.baseUrl = trimmedValue;
|
|
50
|
+
break;
|
|
51
|
+
case 'update-check':
|
|
52
|
+
if (value !== 'true' && value !== 'false') {
|
|
53
|
+
throw new BoltaError(`update-check 값이 올바르지 않습니다: ${value}`, 'CONFIG_ERROR', 'true 또는 false를 사용하세요.');
|
|
54
|
+
}
|
|
55
|
+
current.updateCheck = value === 'true';
|
|
47
56
|
break;
|
|
48
57
|
default:
|
|
49
|
-
throw new BoltaError(`알 수 없는 설정 키: ${key}`, 'CONFIG_ERROR', 'api-key, supplier-key, base-url 중 하나를 사용하세요.');
|
|
58
|
+
throw new BoltaError(`알 수 없는 설정 키: ${key}`, 'CONFIG_ERROR', 'api-key, supplier-key, base-url, update-check 중 하나를 사용하세요.');
|
|
50
59
|
}
|
|
51
60
|
saveConfig(current);
|
|
52
61
|
outputSuccess({ key, message: '설정이 저장되었습니다.' });
|
|
@@ -61,16 +70,17 @@ Examples:
|
|
|
61
70
|
.action(() => {
|
|
62
71
|
try {
|
|
63
72
|
const apiKey = resolveApiKey();
|
|
64
|
-
const
|
|
73
|
+
const supplier = resolveSupplierKeyWithSource();
|
|
65
74
|
const baseUrl = resolveBaseUrl();
|
|
66
75
|
const savedConfig = loadConfig();
|
|
67
76
|
outputSuccess({
|
|
68
77
|
apiKey: apiKey ? maskApiKey(apiKey) : '(미설정)',
|
|
69
|
-
supplierKey:
|
|
78
|
+
supplierKey: supplier.value ? maskApiKey(supplier.value) : '(미설정)',
|
|
70
79
|
baseUrl,
|
|
80
|
+
updateCheck: savedConfig.updateCheck !== false,
|
|
71
81
|
source: {
|
|
72
82
|
apiKey: apiKey ? (process.env.BOLTA_API_KEY ? 'env' : 'config') : 'none',
|
|
73
|
-
supplierKey:
|
|
83
|
+
supplierKey: supplierKeySourceLabel(supplier.source),
|
|
74
84
|
},
|
|
75
85
|
});
|
|
76
86
|
}
|
|
@@ -88,23 +98,53 @@ Examples:
|
|
|
88
98
|
throw new BoltaError('API 키가 설정되지 않았습니다.', 'AUTH_ERROR', "BOLTA_API_KEY 환경변수를 설정하거나 'bolta config set api-key <key>'를 실행하세요.");
|
|
89
99
|
}
|
|
90
100
|
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl() });
|
|
91
|
-
//
|
|
92
|
-
//
|
|
101
|
+
// 1) apiKey 인증 점검: 더미 supplierKey를 조회한다.
|
|
102
|
+
// 서버는 존재하지 않는 supplierKey에 404 또는 403(유효하지 않은 supplierKey)을 반환하므로,
|
|
103
|
+
// 인증 실패를 뜻하는 401은 AUTH_ERROR로, 403/404는 "인증됨"으로 판정한다.
|
|
93
104
|
try {
|
|
94
|
-
await client.getSupplier('
|
|
95
|
-
outputSuccess({ authenticated: true, message: 'API 연결이 정상입니다.' });
|
|
105
|
+
await client.getSupplier('__auth_probe__');
|
|
96
106
|
}
|
|
97
107
|
catch (err) {
|
|
98
|
-
if (err instanceof BoltaApiError && err.statusCode ===
|
|
99
|
-
outputSuccess({ authenticated: true, message: 'API 인증이 정상입니다.' });
|
|
100
|
-
}
|
|
101
|
-
else if (err instanceof BoltaApiError && err.statusCode === 401) {
|
|
108
|
+
if (err instanceof BoltaApiError && err.statusCode === 401) {
|
|
102
109
|
throw new BoltaError('API 키가 유효하지 않습니다.', 'AUTH_ERROR', 'API 키를 확인하세요. test_ 또는 live_ 접두사가 있어야 합니다.');
|
|
103
110
|
}
|
|
104
|
-
|
|
111
|
+
// 403/404만 인증 통과로 간주하고, 429/5xx 등은 그대로 전파한다.
|
|
112
|
+
if (!(err instanceof BoltaApiError) || (err.statusCode !== 403 && err.statusCode !== 404)) {
|
|
105
113
|
throw err;
|
|
106
114
|
}
|
|
107
115
|
}
|
|
116
|
+
// 2) supplierKey가 설정돼 있으면 이 API 키로 유효한지 실제 조회한다.
|
|
117
|
+
const supplier = resolveSupplierKeyWithSource();
|
|
118
|
+
let supplierKeyResult;
|
|
119
|
+
if (!supplier.value) {
|
|
120
|
+
supplierKeyResult = { configured: false };
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const source = supplierKeySourceLabel(supplier.source);
|
|
124
|
+
try {
|
|
125
|
+
await client.getSupplier(supplier.value);
|
|
126
|
+
supplierKeyResult = { configured: true, source, valid: true, message: 'supplierKey가 유효합니다.' };
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (err instanceof BoltaApiError && (err.statusCode === 403 || err.statusCode === 404)) {
|
|
130
|
+
supplierKeyResult = {
|
|
131
|
+
configured: true,
|
|
132
|
+
source,
|
|
133
|
+
valid: false,
|
|
134
|
+
message: '이 API 키로는 존재하지 않거나 사용할 수 없는 supplierKey입니다. supplierKey는 test_/live_ 및 API 키마다 다릅니다. ' +
|
|
135
|
+
'환경변수 BOLTA_SUPPLIER_KEY/BOLTA_CUSTOMER_KEY가 config를 덮고 있지 않은지 확인하세요.',
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
outputSuccess({
|
|
144
|
+
authenticated: true,
|
|
145
|
+
message: 'API 인증이 정상입니다.',
|
|
146
|
+
supplierKey: supplierKeyResult,
|
|
147
|
+
});
|
|
108
148
|
}
|
|
109
149
|
catch (err) {
|
|
110
150
|
outputError(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/config/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amend.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/amend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"amend.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/amend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgI5D"}
|
|
@@ -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
|
}
|
|
@@ -72,10 +67,6 @@ Example:
|
|
|
72
67
|
.action(async (issuanceKey, options, command) => {
|
|
73
68
|
try {
|
|
74
69
|
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
70
|
const raw = await resolveInput(options);
|
|
80
71
|
let validated;
|
|
81
72
|
try {
|
|
@@ -96,8 +87,8 @@ Example:
|
|
|
96
87
|
});
|
|
97
88
|
return;
|
|
98
89
|
}
|
|
99
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
100
90
|
verbose('수정발행 (공급가액 변동) 요청', { issuanceKey });
|
|
91
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
101
92
|
const result = await client.amendChangeSupplyCost(issuanceKey, validated, supplierKey);
|
|
102
93
|
outputSuccess(result);
|
|
103
94
|
}
|
|
@@ -117,10 +108,6 @@ Example:
|
|
|
117
108
|
.action(async (issuanceKey, options, command) => {
|
|
118
109
|
try {
|
|
119
110
|
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
111
|
if (globalOpts.dryRun) {
|
|
125
112
|
outputSuccess({
|
|
126
113
|
dryRun: true,
|
|
@@ -129,8 +116,8 @@ Example:
|
|
|
129
116
|
});
|
|
130
117
|
return;
|
|
131
118
|
}
|
|
132
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
133
119
|
verbose('수정발행 (착오에 의한 이중발급) 요청', { issuanceKey });
|
|
120
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
134
121
|
const result = await client.amendDoubleIssuance(issuanceKey, supplierKey);
|
|
135
122
|
outputSuccess(result);
|
|
136
123
|
}
|
|
@@ -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":"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"}
|