@gaonjs/config 0.15.2 → 0.16.1
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/dist/testkit.js +9 -2
- package/dist/wire.js +8 -2
- package/package.json +6 -6
package/dist/testkit.js
CHANGED
|
@@ -13,7 +13,7 @@ import { loadGaonConfig } from './load.js';
|
|
|
13
13
|
import { configureNonDbBatteries } from './wire.js';
|
|
14
14
|
import { resetStorage } from '@gaonjs/storage';
|
|
15
15
|
import { resetI18n } from '@gaonjs/i18n';
|
|
16
|
-
import { connectNats, configureJobs, configureEvents, configureBroadcast, resetJobs, resetEvents, resetBroadcast, outboxServiceTxWrapper, ensureOutboxTable, } from '@gaonjs/async';
|
|
16
|
+
import { connectNats, configureJobs, configureEvents, configureBroadcast, resetJobs, resetEvents, resetBroadcast, outboxServiceTxWrapper, ensureOutboxTable, relayOutboxBatch, setOutboxDrainer, } from '@gaonjs/async';
|
|
17
17
|
import { createDb, registerConnection, deriveTestDatabaseConfig, destroyAllConnections, setServiceTxWrapper, getConnection, hasConnection, } from '@gaonjs/data';
|
|
18
18
|
/**
|
|
19
19
|
* 테스트용 DB 커넥션 + DB 외 배터리(mail·storage·i18n)를 배선한다(결정 111·136).
|
|
@@ -49,8 +49,13 @@ export async function connectTestDatabase(cwd = process.cwd()) {
|
|
|
49
49
|
// currentOutbox() 없이 즉시발행 경로를 타, "롤백 시 미발행" 보장이 표준 하네스에서
|
|
50
50
|
// 공허하게 통과했다(13차 프로브 실측 · 결정 143 은 넣었는데 144 는 빠진 비대칭).
|
|
51
51
|
setServiceTxWrapper(outboxServiceTxWrapper());
|
|
52
|
-
if (hasConnection('main'))
|
|
52
|
+
if (hasConnection('main')) {
|
|
53
53
|
await ensureOutboxTable(getConnection('main'));
|
|
54
|
+
// 결정 215(13차 W3): service() 경유 emit 은 _gaon_outbox 로 스테이징된다(결정 144). 운영의
|
|
55
|
+
// gaon work 릴레이가 테스트엔 없으므로, expectEventProcessed 가 trigger 뒤 자동 드레인할
|
|
56
|
+
// 드레이너를 main 커넥션으로 배선한다 — 안 하면 service emit 이벤트가 리스너에 영영 안 닿는다.
|
|
57
|
+
setOutboxDrainer(() => relayOutboxBatch(getConnection('main')));
|
|
58
|
+
}
|
|
54
59
|
}
|
|
55
60
|
return {
|
|
56
61
|
close: async () => {
|
|
@@ -63,6 +68,8 @@ export async function connectTestDatabase(cwd = process.cwd()) {
|
|
|
63
68
|
resetBroadcast();
|
|
64
69
|
// 결정 144: 서비스 트랜잭션 래퍼 해제(다음 테스트 파일로 누출 방지 · wireGaon close 대칭).
|
|
65
70
|
setServiceTxWrapper(undefined);
|
|
71
|
+
// 결정 215: 아웃박스 드레이너 해제 — 커넥션이 닫힌 뒤 다음 파일이 stale 핸들로 드레인하지 않게.
|
|
72
|
+
setOutboxDrainer(undefined);
|
|
66
73
|
if (nats)
|
|
67
74
|
await nats.close();
|
|
68
75
|
},
|
package/dist/wire.js
CHANGED
|
@@ -11,8 +11,8 @@ import { createDb, registerConnection, destroyAllConnections, getConnection, has
|
|
|
11
11
|
import { connectNats, configureJobs, configureEvents, outboxServiceTxWrapper, ensureOutboxTable, setLockBackend, redisLockBackend, memoryLockBackend, } from '@gaonjs/async';
|
|
12
12
|
import { configureMailer, smtpTransport } from '@gaonjs/mail';
|
|
13
13
|
import { configureStorage, localDisk, s3Disk, resetStorage } from '@gaonjs/storage';
|
|
14
|
-
import { configureI18n, loadLocales, resetI18n, detectLanguage, enterLanguage, languages, t, } from '@gaonjs/i18n';
|
|
15
|
-
import { createApp, redisSessionStore, setValidationMessageResolver, } from '@gaonjs/web';
|
|
14
|
+
import { configureI18n, loadLocales, resetI18n, detectLanguage, enterLanguage, currentLanguage, languages, t, } from '@gaonjs/i18n';
|
|
15
|
+
import { createApp, redisSessionStore, setValidationMessageResolver, setLocaleResolver, } from '@gaonjs/web';
|
|
16
16
|
import { resolveApps, toAppSpec } from './apps.js';
|
|
17
17
|
import { existsSync } from 'node:fs';
|
|
18
18
|
import { resolve as resolvePath, join } from 'node:path';
|
|
@@ -128,6 +128,10 @@ export async function configureNonDbBatteries(config, cwd = process.cwd(), opts
|
|
|
128
128
|
// 키가 없으면 defaultValue(web 내장 fallback)로 떨어져 거동이 보존된다. t() 는
|
|
129
129
|
// 요청 ALS 로케일을 따르므로 검증 시점(dispatch)에 요청 언어로 번역된다.
|
|
130
130
|
setValidationMessageResolver((code, params, fallback) => t(`validation.${code}`, { ...params, defaultValue: fallback }));
|
|
131
|
+
// 결정 214(13차 W2): 문서 셸 <html lang> 을 요청 협상 로케일로 맞춘다. onRequest 훅이
|
|
132
|
+
// detectLanguage → enterLanguage 로 ALS 에 심은 로케일을 currentLanguage() 로 읽어
|
|
133
|
+
// renderInertia 가 셸에 반영한다(web→i18n 하드 의존 회피 · setValidationMessageResolver 동형).
|
|
134
|
+
setLocaleResolver(() => currentLanguage());
|
|
131
135
|
}
|
|
132
136
|
}
|
|
133
137
|
/**
|
|
@@ -268,6 +272,8 @@ export async function wireGaon(config, cwd = process.cwd()) {
|
|
|
268
272
|
await nats.close();
|
|
269
273
|
// 결정 144: 서비스 트랜잭션 래퍼 배선 해제(다음 wireGaon 인스턴스로 누출 방지).
|
|
270
274
|
setServiceTxWrapper(undefined);
|
|
275
|
+
// 결정 214: 로케일 리졸버 해제 — 다음 인스턴스(비-i18n 일 수 있음)로 stale 로케일 누출 방지.
|
|
276
|
+
setLocaleResolver(undefined);
|
|
271
277
|
// 결정 202: 락·캐시 백엔드 해제 + redis 종료는 closeDomain 이 소유한다(serve·work 공통 ·
|
|
272
278
|
// wireDomain 이 배선했으므로 해제도 거기서). serve 는 여기서 중복 해제하지 않는다.
|
|
273
279
|
await domain.closeDomain();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gaonjs/config",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.1",
|
|
4
4
|
"description": "Gaon 루트 설정 로더·자동 배선 (gaon.config.ts)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"ioredis": "^5.4.1",
|
|
28
|
-
"@gaonjs/async": "0.12.0",
|
|
29
|
-
"@gaonjs/i18n": "0.2.1",
|
|
30
|
-
"@gaonjs/storage": "0.1.3",
|
|
31
28
|
"@gaonjs/core": "0.2.2",
|
|
32
|
-
"@gaonjs/
|
|
29
|
+
"@gaonjs/async": "0.13.0",
|
|
30
|
+
"@gaonjs/data": "0.16.3",
|
|
33
31
|
"@gaonjs/mail": "0.2.1",
|
|
34
|
-
"@gaonjs/
|
|
32
|
+
"@gaonjs/storage": "0.1.3",
|
|
33
|
+
"@gaonjs/i18n": "0.2.1",
|
|
34
|
+
"@gaonjs/web": "0.19.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"fastify": "^5.0.0"
|