bjd-code 0.0.1 → 0.1.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/LICENSE +21 -0
- package/README.md +116 -2
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +114 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/download.d.ts +12 -0
- package/dist/core/download.d.ts.map +1 -0
- package/dist/core/download.js +34 -0
- package/dist/core/download.js.map +1 -0
- package/dist/core/filter.d.ts +14 -0
- package/dist/core/filter.d.ts.map +1 -0
- package/dist/core/filter.js +30 -0
- package/dist/core/filter.js.map +1 -0
- package/dist/core/parser.d.ts +5 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +70 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/tree.d.ts +15 -0
- package/dist/core/tree.d.ts.map +1 -0
- package/dist/core/tree.js +95 -0
- package/dist/core/tree.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +70 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/code.d.ts +34 -0
- package/dist/utils/code.d.ts.map +1 -0
- package/dist/utils/code.js +68 -0
- package/dist/utils/code.js.map +1 -0
- package/dist/utils/normalize.d.ts +4 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js +21 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/utils/paths.d.ts +13 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +24 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/worker/csv-worker.d.ts +2 -0
- package/dist/worker/csv-worker.d.ts.map +1 -0
- package/dist/worker/csv-worker.js +33 -0
- package/dist/worker/csv-worker.js.map +1 -0
- package/package.json +39 -9
- package/.env.example +0 -0
- package/.idea/bjd-code.iml +0 -12
- package/.idea/jsLibraryMappings.xml +0 -6
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/index.ts +0 -122
- package/tsconfig.json +0 -100
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Code utilities
|
|
2
|
+
export { extractSidoCode, extractSigunguCode, extractEupmyeondongCode, extractRiCode, determineLevel, isValidCode, getParentCode, } from './utils/code.js';
|
|
3
|
+
// Parser
|
|
4
|
+
export { parseCSV, normalizeRow } from './core/parser.js';
|
|
5
|
+
// Filters
|
|
6
|
+
export { filterSido, filterSigungu, filterEupmyeondong, filterRi, filterByLevel, searchByName, } from './core/filter.js';
|
|
7
|
+
// Tree
|
|
8
|
+
export { buildTree, buildSubTree, flattenTree } from './core/tree.js';
|
|
9
|
+
// Download
|
|
10
|
+
export { downloadCSV } from './core/download.js';
|
|
11
|
+
// Paths
|
|
12
|
+
export { DEFAULT_CSV_PATH, hasDefaultData, resolveDataPath } from './utils/paths.js';
|
|
13
|
+
import { parseCSV } from './core/parser.js';
|
|
14
|
+
import { filterByLevel, searchByName } from './core/filter.js';
|
|
15
|
+
import { buildTree } from './core/tree.js';
|
|
16
|
+
/** parse + buildTree 편의 함수 */
|
|
17
|
+
export async function loadTree(options) {
|
|
18
|
+
const records = await parseCSV(options);
|
|
19
|
+
const active = records.filter((r) => r.isActive);
|
|
20
|
+
return buildTree(active);
|
|
21
|
+
}
|
|
22
|
+
/** parse + filter 편의 함수 */
|
|
23
|
+
export async function loadFiltered(options) {
|
|
24
|
+
const records = await parseCSV(options);
|
|
25
|
+
const filterOpts = { includeInactive: options?.includeInactive };
|
|
26
|
+
if (options?.query) {
|
|
27
|
+
return searchByName(records, options.query, filterOpts);
|
|
28
|
+
}
|
|
29
|
+
if (options?.level) {
|
|
30
|
+
return filterByLevel(records, options.level, filterOpts);
|
|
31
|
+
}
|
|
32
|
+
if (!options?.includeInactive) {
|
|
33
|
+
return records.filter((r) => r.isActive);
|
|
34
|
+
}
|
|
35
|
+
return records;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,iBAAiB;AACjB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,UAAU;AACV,OAAO,EACL,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO;AACP,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEtE,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIrF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAsB;IACnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA6E;IAE7E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAkB,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAEhF,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,OAAO,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** CSV 원본 행 (한글 컬럼명) */
|
|
2
|
+
export interface RawBjdRow {
|
|
3
|
+
법정동코드: string;
|
|
4
|
+
법정동명: string;
|
|
5
|
+
폐지여부: string;
|
|
6
|
+
}
|
|
7
|
+
/** 법정동 레벨 */
|
|
8
|
+
export type BjdLevel = 'sido' | 'sigungu' | 'eupmyeondong' | 'ri';
|
|
9
|
+
/** 정규화된 법정동 레코드 */
|
|
10
|
+
export interface BjdRecord {
|
|
11
|
+
/** 전체 10자리 코드 */
|
|
12
|
+
code: string;
|
|
13
|
+
/** 시도 코드 (1-2자리) */
|
|
14
|
+
sidoCode: string;
|
|
15
|
+
/** 시군구 코드 (3-5자리) */
|
|
16
|
+
sigunguCode: string;
|
|
17
|
+
/** 읍면동 코드 (6-8자리) */
|
|
18
|
+
eupmyeondongCode: string;
|
|
19
|
+
/** 리 코드 (9-10자리) */
|
|
20
|
+
riCode: string;
|
|
21
|
+
/** 법정동명 (전체) */
|
|
22
|
+
name: string;
|
|
23
|
+
/** 공백 분리된 이름 배열 */
|
|
24
|
+
names: string[];
|
|
25
|
+
/** 행정 레벨 */
|
|
26
|
+
level: BjdLevel;
|
|
27
|
+
/** 현행 사용 여부 */
|
|
28
|
+
isActive: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** 트리 노드 */
|
|
31
|
+
export interface BjdTreeNode {
|
|
32
|
+
/** 해당 레벨의 코드 조각 */
|
|
33
|
+
code: string;
|
|
34
|
+
/** 전체 10자리 코드 */
|
|
35
|
+
fullCode: string;
|
|
36
|
+
/** 이름 */
|
|
37
|
+
name: string;
|
|
38
|
+
/** 행정 레벨 */
|
|
39
|
+
level: BjdLevel;
|
|
40
|
+
/** 하위 노드 */
|
|
41
|
+
children: BjdTreeNode[];
|
|
42
|
+
}
|
|
43
|
+
/** 필터 옵션 */
|
|
44
|
+
export interface FilterOptions {
|
|
45
|
+
/** 폐지된 코드 포함 여부 (기본 false) */
|
|
46
|
+
includeInactive?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** 파싱 옵션 */
|
|
49
|
+
export interface ParseOptions {
|
|
50
|
+
/** CSV 파일 경로 (미지정 시 ~/.bjd-code/data.csv 사용) */
|
|
51
|
+
filePath?: string;
|
|
52
|
+
/** 인코딩 (기본 'euc-kr') */
|
|
53
|
+
encoding?: string;
|
|
54
|
+
/** worker_threads 사용 여부 (기본 true) */
|
|
55
|
+
useWorker?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** Worker → 메인 메시지 */
|
|
58
|
+
export type WorkerMessage = {
|
|
59
|
+
type: 'result';
|
|
60
|
+
data: BjdRecord[];
|
|
61
|
+
} | {
|
|
62
|
+
type: 'error';
|
|
63
|
+
message: string;
|
|
64
|
+
};
|
|
65
|
+
/** 메인 → Worker 데이터 */
|
|
66
|
+
export interface WorkerData {
|
|
67
|
+
filePath: string;
|
|
68
|
+
encoding: string;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,aAAa;AACb,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAAC;AAElE,mBAAmB;AACnB,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY;IACZ,KAAK,EAAE,QAAQ,CAAC;IAChB,eAAe;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,YAAY;AACZ,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY;IACZ,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,YAAY;AACZ,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,YAAY;AACZ,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,sBAAsB;AACtB,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,SAAS,EAAE,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,sBAAsB;AACtB,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { BjdLevel } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 10자리 코드에서 시도 코드(1-2자리) 추출
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractSidoCode(code: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* 10자리 코드에서 시군구 코드(3-5자리) 추출
|
|
8
|
+
*/
|
|
9
|
+
export declare function extractSigunguCode(code: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* 10자리 코드에서 읍면동 코드(6-8자리) 추출
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractEupmyeondongCode(code: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* 10자리 코드에서 리 코드(9-10자리) 추출
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractRiCode(code: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* 뒷자리 0 패턴으로 행정 레벨 판단
|
|
20
|
+
* - 시도: XX00000000 (3~10자리 모두 0)
|
|
21
|
+
* - 시군구: XXXXX00000 (6~10자리 모두 0)
|
|
22
|
+
* - 읍면동: XXXXXXXX00 (9~10자리 모두 0)
|
|
23
|
+
* - 리: XXXXXXXXXX (0이 아닌 9~10자리)
|
|
24
|
+
*/
|
|
25
|
+
export declare function determineLevel(code: string): BjdLevel;
|
|
26
|
+
/**
|
|
27
|
+
* 코드 유효성 검증 (10자리 숫자)
|
|
28
|
+
*/
|
|
29
|
+
export declare function isValidCode(code: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 부모 코드 계산 (상위 레벨의 전체 10자리 코드)
|
|
32
|
+
*/
|
|
33
|
+
export declare function getParentCode(code: string, level: BjdLevel): string | null;
|
|
34
|
+
//# sourceMappingURL=code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/utils/code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAerD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAW1E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 10자리 코드에서 시도 코드(1-2자리) 추출
|
|
3
|
+
*/
|
|
4
|
+
export function extractSidoCode(code) {
|
|
5
|
+
return code.substring(0, 2);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 10자리 코드에서 시군구 코드(3-5자리) 추출
|
|
9
|
+
*/
|
|
10
|
+
export function extractSigunguCode(code) {
|
|
11
|
+
return code.substring(2, 5);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 10자리 코드에서 읍면동 코드(6-8자리) 추출
|
|
15
|
+
*/
|
|
16
|
+
export function extractEupmyeondongCode(code) {
|
|
17
|
+
return code.substring(5, 8);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 10자리 코드에서 리 코드(9-10자리) 추출
|
|
21
|
+
*/
|
|
22
|
+
export function extractRiCode(code) {
|
|
23
|
+
return code.substring(8, 10);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 뒷자리 0 패턴으로 행정 레벨 판단
|
|
27
|
+
* - 시도: XX00000000 (3~10자리 모두 0)
|
|
28
|
+
* - 시군구: XXXXX00000 (6~10자리 모두 0)
|
|
29
|
+
* - 읍면동: XXXXXXXX00 (9~10자리 모두 0)
|
|
30
|
+
* - 리: XXXXXXXXXX (0이 아닌 9~10자리)
|
|
31
|
+
*/
|
|
32
|
+
export function determineLevel(code) {
|
|
33
|
+
const sigungu = code.substring(2, 5);
|
|
34
|
+
const eupmyeondong = code.substring(5, 8);
|
|
35
|
+
const ri = code.substring(8, 10);
|
|
36
|
+
if (sigungu === '000' && eupmyeondong === '000' && ri === '00') {
|
|
37
|
+
return 'sido';
|
|
38
|
+
}
|
|
39
|
+
if (eupmyeondong === '000' && ri === '00') {
|
|
40
|
+
return 'sigungu';
|
|
41
|
+
}
|
|
42
|
+
if (ri === '00') {
|
|
43
|
+
return 'eupmyeondong';
|
|
44
|
+
}
|
|
45
|
+
return 'ri';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 코드 유효성 검증 (10자리 숫자)
|
|
49
|
+
*/
|
|
50
|
+
export function isValidCode(code) {
|
|
51
|
+
return /^\d{10}$/.test(code);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 부모 코드 계산 (상위 레벨의 전체 10자리 코드)
|
|
55
|
+
*/
|
|
56
|
+
export function getParentCode(code, level) {
|
|
57
|
+
switch (level) {
|
|
58
|
+
case 'sido':
|
|
59
|
+
return null;
|
|
60
|
+
case 'sigungu':
|
|
61
|
+
return code.substring(0, 2) + '00000000';
|
|
62
|
+
case 'eupmyeondong':
|
|
63
|
+
return code.substring(0, 5) + '00000';
|
|
64
|
+
case 'ri':
|
|
65
|
+
return code.substring(0, 8) + '00';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/utils/code.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjC,IAAI,OAAO,KAAK,KAAK,IAAI,YAAY,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,YAAY,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAe;IACzD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC;QAC3C,KAAK,cAAc;YACjB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;QACxC,KAAK,IAAI;YACP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAU9D,+BAA+B;AAC/B,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAkB7D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { extractSidoCode, extractSigunguCode, extractEupmyeondongCode, extractRiCode, determineLevel, isValidCode, } from './code.js';
|
|
2
|
+
/** RawBjdRow → BjdRecord 변환 */
|
|
3
|
+
export function normalizeRow(row) {
|
|
4
|
+
const code = row.법정동코드.trim();
|
|
5
|
+
if (!isValidCode(code))
|
|
6
|
+
return null;
|
|
7
|
+
const name = row.법정동명.trim();
|
|
8
|
+
const names = name.split(/\s+/).filter(Boolean);
|
|
9
|
+
return {
|
|
10
|
+
code,
|
|
11
|
+
sidoCode: extractSidoCode(code),
|
|
12
|
+
sigunguCode: extractSigunguCode(code),
|
|
13
|
+
eupmyeondongCode: extractEupmyeondongCode(code),
|
|
14
|
+
riCode: extractRiCode(code),
|
|
15
|
+
name,
|
|
16
|
+
names,
|
|
17
|
+
level: determineLevel(code),
|
|
18
|
+
isActive: row.폐지여부.trim() === '존재',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,WAAW,CAAC;AAEnB,+BAA+B;AAC/B,MAAM,UAAU,YAAY,CAAC,GAAc;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhD,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC;QACrC,gBAAgB,EAAE,uBAAuB,CAAC,IAAI,CAAC;QAC/C,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;QAC3B,IAAI;QACJ,KAAK;QACL,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC;QAC3B,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** 기본 데이터 디렉토리 (~/.bjd-code/) */
|
|
2
|
+
export declare const DATA_DIR: string;
|
|
3
|
+
/** 기본 CSV 파일 경로 */
|
|
4
|
+
export declare const DEFAULT_CSV_PATH: string;
|
|
5
|
+
/** 기본 CSV 파일이 존재하는지 확인 */
|
|
6
|
+
export declare function hasDefaultData(): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* 파일 경로를 결정한다.
|
|
9
|
+
* 명시적 경로가 있으면 그대로 사용, 없으면 기본 경로 사용.
|
|
10
|
+
* 기본 경로에 파일이 없으면 에러.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveDataPath(filePath?: string): string;
|
|
13
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAIA,iCAAiC;AACjC,eAAO,MAAM,QAAQ,QAA+B,CAAC;AAErD,mBAAmB;AACnB,eAAO,MAAM,gBAAgB,QAA6B,CAAC;AAE3D,0BAA0B;AAC1B,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAMzD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
/** 기본 데이터 디렉토리 (~/.bjd-code/) */
|
|
5
|
+
export const DATA_DIR = join(homedir(), '.bjd-code');
|
|
6
|
+
/** 기본 CSV 파일 경로 */
|
|
7
|
+
export const DEFAULT_CSV_PATH = join(DATA_DIR, 'data.csv');
|
|
8
|
+
/** 기본 CSV 파일이 존재하는지 확인 */
|
|
9
|
+
export function hasDefaultData() {
|
|
10
|
+
return existsSync(DEFAULT_CSV_PATH);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 파일 경로를 결정한다.
|
|
14
|
+
* 명시적 경로가 있으면 그대로 사용, 없으면 기본 경로 사용.
|
|
15
|
+
* 기본 경로에 파일이 없으면 에러.
|
|
16
|
+
*/
|
|
17
|
+
export function resolveDataPath(filePath) {
|
|
18
|
+
if (filePath)
|
|
19
|
+
return filePath;
|
|
20
|
+
if (hasDefaultData())
|
|
21
|
+
return DEFAULT_CSV_PATH;
|
|
22
|
+
throw new Error('데이터 파일을 찾을 수 없습니다. 먼저 `bjd download`를 실행하거나 CSV 파일 경로를 지정하세요.');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,iCAAiC;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAErD,mBAAmB;AACnB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAE3D,0BAA0B;AAC1B,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,cAAc,EAAE;QAAE,OAAO,gBAAgB,CAAC;IAC9C,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv-worker.d.ts","sourceRoot":"","sources":["../../src/worker/csv-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { parentPort, workerData } from 'node:worker_threads';
|
|
2
|
+
import { createReadStream } from 'node:fs';
|
|
3
|
+
import { parse } from 'csv-parse';
|
|
4
|
+
import iconv from 'iconv-lite';
|
|
5
|
+
import { normalizeRow } from '../utils/normalize.js';
|
|
6
|
+
const { filePath, encoding } = workerData;
|
|
7
|
+
const records = [];
|
|
8
|
+
const fileStream = createReadStream(filePath);
|
|
9
|
+
const decoder = encoding.toLowerCase() === 'utf-8' || encoding.toLowerCase() === 'utf8'
|
|
10
|
+
? fileStream
|
|
11
|
+
: fileStream.pipe(iconv.decodeStream(encoding));
|
|
12
|
+
const parser = parse({
|
|
13
|
+
columns: true,
|
|
14
|
+
skip_empty_lines: true,
|
|
15
|
+
trim: true,
|
|
16
|
+
bom: true,
|
|
17
|
+
});
|
|
18
|
+
decoder.pipe(parser);
|
|
19
|
+
parser.on('data', (row) => {
|
|
20
|
+
const record = normalizeRow(row);
|
|
21
|
+
if (record) {
|
|
22
|
+
records.push(record);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
parser.on('end', () => {
|
|
26
|
+
const msg = { type: 'result', data: records };
|
|
27
|
+
parentPort.postMessage(msg);
|
|
28
|
+
});
|
|
29
|
+
parser.on('error', (err) => {
|
|
30
|
+
const msg = { type: 'error', message: err.message };
|
|
31
|
+
parentPort.postMessage(msg);
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=csv-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv-worker.js","sourceRoot":"","sources":["../../src/worker/csv-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAwB,CAAC;AAExD,MAAM,OAAO,GAAgB,EAAE,CAAC;AAEhC,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM;IACrF,CAAC,CAAC,UAAU;IACZ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AAElD,MAAM,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,IAAI;IACtB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,IAAI;CACV,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAc,EAAE,EAAE;IACnC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;IACpB,MAAM,GAAG,GAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7D,UAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;IAChC,MAAM,GAAG,GAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACnE,UAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bjd-code",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "법정동 코드
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "법정동 코드 파싱, 필터링, 트리 구조화 라이브러리",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"bjd": "./dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p tsconfig.build.json",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"prepublishOnly": "npm run build"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"법정동",
|
|
28
|
+
"bjd",
|
|
29
|
+
"korea",
|
|
30
|
+
"address",
|
|
31
|
+
"administrative-district"
|
|
32
|
+
],
|
|
8
33
|
"license": "MIT",
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=24.0.0"
|
|
36
|
+
},
|
|
9
37
|
"dependencies": {
|
|
10
|
-
"
|
|
38
|
+
"commander": "^12.1.0",
|
|
39
|
+
"csv-parse": "^5.6.0",
|
|
40
|
+
"iconv-lite": "^0.6.3"
|
|
11
41
|
},
|
|
12
|
-
"type": "module",
|
|
13
42
|
"devDependencies": {
|
|
14
|
-
"@types/node": "^
|
|
15
|
-
"
|
|
43
|
+
"@types/node": "^20.17.0",
|
|
44
|
+
"typescript": "^5.6.0",
|
|
45
|
+
"vitest": "^2.1.0"
|
|
16
46
|
}
|
|
17
47
|
}
|
package/.env.example
DELETED
|
File without changes
|
package/.idea/bjd-code.iml
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="WEB_MODULE" version="4">
|
|
3
|
-
<component name="NewModuleRootManager">
|
|
4
|
-
<content url="file://$MODULE_DIR$">
|
|
5
|
-
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
|
6
|
-
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
|
7
|
-
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
|
8
|
-
</content>
|
|
9
|
-
<orderEntry type="inheritedJdk" />
|
|
10
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
11
|
-
</component>
|
|
12
|
-
</module>
|
package/.idea/misc.xml
DELETED
package/.idea/modules.xml
DELETED
package/.idea/vcs.xml
DELETED
package/index.ts
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import {Worker} from 'worker_threads'
|
|
2
|
-
import {getData} from "./helper";
|
|
3
|
-
//
|
|
4
|
-
import * as path from 'path';
|
|
5
|
-
const __dirname = path.resolve();
|
|
6
|
-
// const envInfo = require('./worker.js');
|
|
7
|
-
|
|
8
|
-
const workerPath = path.join(__dirname, './worker.js');
|
|
9
|
-
// let resultArr = new Array(envInfo.numThreads + 1);
|
|
10
|
-
// const perPage = 10000;
|
|
11
|
-
var nStart = new Date().getTime(); //시작시간 체크(단위 ms)
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
currentCount: 10,
|
|
15
|
-
data: [
|
|
16
|
-
{
|
|
17
|
-
'과거법정동코드': '13131607',
|
|
18
|
-
'리명': '신리',
|
|
19
|
-
'법정동코드': '4175045027',
|
|
20
|
-
'삭제일자': '2001-03-21',
|
|
21
|
-
'생성일자': '1988-04-23',
|
|
22
|
-
'순위': '0',
|
|
23
|
-
'시군구명': '화성군',
|
|
24
|
-
'시도명': '경기도',
|
|
25
|
-
'읍면동명': '동탄면'
|
|
26
|
-
}]
|
|
27
|
-
matchCount: 46203,
|
|
28
|
-
page: 1,
|
|
29
|
-
perPage: 10,
|
|
30
|
-
totalCount: 46203
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
const data = await getData(1, 1);
|
|
34
|
-
console.log(data.totalCount);
|
|
35
|
-
const {totalCount} = data;
|
|
36
|
-
|
|
37
|
-
const perPage = 5000;
|
|
38
|
-
const threadSize = Math.floor(totalCount / perPage) + 1;
|
|
39
|
-
const totalData: any[] = [];
|
|
40
|
-
// for (let i = 1; i<= threadSize; i++) {
|
|
41
|
-
// totalData.push(...(await getData(i, perPage)).data);
|
|
42
|
-
// }
|
|
43
|
-
// console.log(totalData.length)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// if (envInfo.useThread) {
|
|
47
|
-
|
|
48
|
-
// if (isMainThread) {
|
|
49
|
-
// const worker = new Worker(__filename);
|
|
50
|
-
// worker.once('message', (message) => {
|
|
51
|
-
// console.log(message); // Prints 'Hello, world!'.
|
|
52
|
-
// });
|
|
53
|
-
// worker.postMessage('Hello, world!');
|
|
54
|
-
// } else {
|
|
55
|
-
// // When a message from the parent thread is received, send it back:
|
|
56
|
-
// parentPort.once('message', (message) => {
|
|
57
|
-
// parentPort.postMessage(message);
|
|
58
|
-
// });
|
|
59
|
-
// }
|
|
60
|
-
var mySet = new Set();
|
|
61
|
-
var myMap = new Map();
|
|
62
|
-
|
|
63
|
-
/*
|
|
64
|
-
법정동 코드 (10자리) : 실제주소
|
|
65
|
-
|
|
66
|
-
시도(2)+시군구(3)+읍면동(3)+리(2)
|
|
67
|
-
|
|
68
|
-
ex> 경기도(41) + 화성시(590) + 향남면(390) + 수직리(32)
|
|
69
|
-
|
|
70
|
-
경기도(41) + 화성시(590) + 동탄면(420) + 석우리(24)
|
|
71
|
-
*/
|
|
72
|
-
const d = async () => {
|
|
73
|
-
let count = 0;
|
|
74
|
-
for (let i = 1; i <= threadSize; i++) {
|
|
75
|
-
let myWorker = new Worker(workerPath);
|
|
76
|
-
myWorker.postMessage(i);
|
|
77
|
-
//INFO: 스레드로부터 데이터를 받음
|
|
78
|
-
myWorker.on('message', result => {
|
|
79
|
-
console.log(`${myWorker.threadId}`);
|
|
80
|
-
totalData.push(...result.data);
|
|
81
|
-
result.data.filter(res => res['삭제일자'] === '').forEach(res => {
|
|
82
|
-
mySet.add(res['시도명'])
|
|
83
|
-
myMap.set(res['법정동코드'].substr(0, 2), res['시도명'])
|
|
84
|
-
})
|
|
85
|
-
count++;
|
|
86
|
-
|
|
87
|
-
if (count === threadSize) {
|
|
88
|
-
var nEnd = new Date().getTime(); //종료시간 체크(단위 ms)
|
|
89
|
-
|
|
90
|
-
var nDiff = nEnd - nStart; //두 시간차 계산(단위 ms)
|
|
91
|
-
console.log(nDiff + "ms");
|
|
92
|
-
|
|
93
|
-
console.log(totalData)
|
|
94
|
-
console.log(mySet)
|
|
95
|
-
console.log(myMap)
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
await d();
|
|
102
|
-
console.log('dd')
|
|
103
|
-
|
|
104
|
-
// } else {
|
|
105
|
-
// console.time('main');
|
|
106
|
-
// for (let i = 0; i < envInfo.numThreads; i++) {
|
|
107
|
-
// resultArr[i] = doSomething();
|
|
108
|
-
// }
|
|
109
|
-
// console.timeEnd('main');
|
|
110
|
-
//
|
|
111
|
-
// for (let i = 0; i < envInfo.numThreads; i++) {
|
|
112
|
-
// console.log(`result : ${resultArr[i]}`);
|
|
113
|
-
// }
|
|
114
|
-
// }
|
|
115
|
-
//
|
|
116
|
-
// function doSomething() {
|
|
117
|
-
// let data = 0;
|
|
118
|
-
// for (let i = 0; i < envInfo.jobSize; i++) {
|
|
119
|
-
// data += i;
|
|
120
|
-
// }
|
|
121
|
-
// return data;
|
|
122
|
-
// }
|