gongdata 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 +236 -0
- package/dist/index.cjs +663 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +509 -0
- package/dist/index.d.ts +509 -0
- package/dist/index.js +650 -0
- package/dist/index.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/error.ts","../src/core/parser.ts","../src/core/http.ts","../src/core/response.ts","../src/services/base.ts","../src/services/qualification/transformers.ts","../src/services/qualification/response.ts","../src/services/qualification/service.ts","../src/services/qualification/constants.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 공공데이터포털 API 응답 코드\n * @see https://www.data.go.kr\n */\nexport const ResultCode = {\n /** 정상 */\n SUCCESS: '00',\n\n // === 공공데이터포털 공통 에러 ===\n /** 어플리케이션 에러 */\n APPLICATION_ERROR: '1',\n /** 잘못된 요청 파라미터 */\n INVALID_REQUEST_PARAMETER: '10',\n /** 해당 오픈API 서비스 없음 또는 폐기 */\n NO_OPENAPI_SERVICE: '12',\n /** 서비스 접근 거부 */\n SERVICE_ACCESS_DENIED: '20',\n /** 서비스 요청 제한 횟수 초과 */\n REQUEST_LIMIT_EXCEEDED: '22',\n /** 등록되지 않은 서비스키 */\n UNREGISTERED_SERVICE_KEY: '30',\n /** 서비스키 기한 만료 */\n EXPIRED_SERVICE_KEY: '31',\n /** 등록되지 않은 IP */\n UNREGISTERED_IP: '32',\n /** 기타 에러 */\n UNKNOWN_ERROR: '99',\n\n // === SDK 내부 에러 ===\n /** HTTP 에러 */\n HTTP_ERROR: 'HTTP_ERROR',\n /** 서비스 타임아웃 */\n SERVICE_TIMEOUT: 'SERVICE_TIMEOUT',\n\n // === HRDK(한국산업인력공단) 자체 에러 ===\n /** 게이트웨이 인증 오류 */\n GATEWAY_AUTH_ERROR: '900',\n /** 필수 파라미터 누락 */\n MISSING_REQUIRED_PARAMETER: '910',\n /** 잘못된 dataFormat (json/xml만 가능) */\n INVALID_DATA_FORMAT: '920',\n /** 최대 목록 수 초과 */\n MAX_ROWS_EXCEEDED: '930',\n /** 잘못된 토큰 파라미터 */\n INVALID_TOKEN: '940',\n /** 토큰 유효기한 만료 (1시간) */\n TOKEN_EXPIRED: '941',\n /** 파일을 찾을 수 없음 */\n FILE_NOT_FOUND: '950',\n /** HRDK 서버 에러 */\n HRDK_SERVER_ERROR: '990',\n} as const;\n\nexport type ResultCodeType = (typeof ResultCode)[keyof typeof ResultCode];\n\nconst RESULT_MESSAGES: Readonly<Record<ResultCodeType, string>> = {\n [ResultCode.SUCCESS]: '정상',\n [ResultCode.APPLICATION_ERROR]: '어플리케이션 에러',\n [ResultCode.INVALID_REQUEST_PARAMETER]: '잘못된 요청 파라미터',\n [ResultCode.NO_OPENAPI_SERVICE]: '해당 오픈API 서비스 없음',\n [ResultCode.SERVICE_ACCESS_DENIED]: '서비스 접근 거부',\n [ResultCode.REQUEST_LIMIT_EXCEEDED]: '서비스 요청 제한 횟수 초과',\n [ResultCode.UNREGISTERED_SERVICE_KEY]: '등록되지 않은 서비스키',\n [ResultCode.EXPIRED_SERVICE_KEY]: '서비스키 기한 만료',\n [ResultCode.UNREGISTERED_IP]: '등록되지 않은 IP',\n [ResultCode.UNKNOWN_ERROR]: '기타 에러',\n [ResultCode.HTTP_ERROR]: 'HTTP 에러',\n [ResultCode.SERVICE_TIMEOUT]: '서비스 타임아웃',\n [ResultCode.GATEWAY_AUTH_ERROR]: '게이트웨이 인증 오류',\n [ResultCode.MISSING_REQUIRED_PARAMETER]: '필수 파라미터 누락',\n [ResultCode.INVALID_DATA_FORMAT]: '잘못된 dataFormat (json/xml만 가능)',\n [ResultCode.MAX_ROWS_EXCEEDED]: '최대 목록 수 초과',\n [ResultCode.INVALID_TOKEN]: '잘못된 토큰 파라미터',\n [ResultCode.TOKEN_EXPIRED]: '토큰 유효기한 만료',\n [ResultCode.FILE_NOT_FOUND]: '파일을 찾을 수 없음',\n [ResultCode.HRDK_SERVER_ERROR]: 'HRDK 서버 에러',\n};\n\nexport class GongdataError extends Error {\n readonly code: ResultCodeType | string;\n readonly originalResponse?: unknown;\n\n constructor(code: ResultCodeType | string, message?: string, originalResponse?: unknown) {\n const errorMessage =\n message ?? RESULT_MESSAGES[code as ResultCodeType] ?? `Unknown error: ${code}`;\n super(errorMessage);\n this.name = 'GongdataError';\n this.code = code;\n this.originalResponse = originalResponse;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, GongdataError);\n }\n }\n\n static isGongdataError(error: unknown): error is GongdataError {\n return error instanceof GongdataError;\n }\n\n static fromResponse(\n header: { readonly resultCode: string; readonly resultMsg: string },\n originalResponse?: unknown\n ): GongdataError {\n return new GongdataError(header.resultCode, header.resultMsg, originalResponse);\n }\n}\n","import { XMLParser } from 'fast-xml-parser';\nimport type { DataGoKrResponse, DataGoKrXmlResponse, XmlItemsWrapper } from './types.js';\nimport { ResultCode, GongdataError } from './error.js';\n\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n textNodeName: '#text',\n parseTagValue: false, // '00' 같은 값을 숫자로 변환하지 않음\n trimValues: true,\n});\n\n/**\n * XML 문자열을 JSON으로 파싱\n */\nexport function parseXml<T>(xml: string): T {\n return xmlParser.parse(xml) as T;\n}\n\n/**\n * API 응답이 JSON인지 확인\n */\nexport function isJsonResponse(contentType: string | null): boolean {\n return contentType?.includes('application/json') ?? false;\n}\n\n/**\n * API 응답이 XML인지 확인\n */\nexport function isXmlResponse(contentType: string | null): boolean {\n return contentType?.includes('application/xml') ?? contentType?.includes('text/xml') ?? false;\n}\n\n/**\n * 응답 헤더 검증 및 에러 처리\n */\nexport function validateResponse(header: { resultCode: string; resultMsg: string }): void {\n const { resultCode, resultMsg } = header;\n\n if (resultCode !== ResultCode.SUCCESS) {\n throw GongdataError.fromResponse({ resultCode, resultMsg });\n }\n}\n\n/**\n * XML items.item을 배열로 정규화\n */\nexport function normalizeXmlItems<T>(items: XmlItemsWrapper<T> | ''): readonly T[] {\n if (items === '' || items === null || items === undefined) {\n return [];\n }\n\n const { item } = items;\n\n if (item === null || item === undefined) {\n return [];\n }\n\n if (Array.isArray(item)) {\n return item as readonly T[];\n }\n\n return [item as T];\n}\n\n/**\n * JSON items를 배열로 정규화\n */\nexport function normalizeJsonItems<T>(items: readonly T[] | ''): readonly T[] {\n if (items === '' || items === null || items === undefined) {\n return [];\n }\n\n if (Array.isArray(items)) {\n return items;\n }\n\n return [];\n}\n\n/**\n * API 응답을 파싱하고 정규화된 데이터 반환\n */\nexport function parseResponse<T>(\n data: unknown,\n contentType: string | null\n): {\n header: { resultCode: string; resultMsg: string };\n body: { items: readonly T[]; numOfRows: number; pageNo: number; totalCount: number };\n} {\n if (typeof data === 'string') {\n if (isXmlResponse(contentType)) {\n // XML 응답 처리\n const parsed = parseXml<DataGoKrXmlResponse<T>>(data);\n validateResponse(parsed.response.header);\n\n return {\n header: parsed.response.header,\n body: {\n items: normalizeXmlItems(parsed.response.body.items),\n numOfRows: Number(parsed.response.body.numOfRows),\n pageNo: Number(parsed.response.body.pageNo),\n totalCount: Number(parsed.response.body.totalCount),\n },\n };\n } else {\n // JSON 문자열 처리\n const parsed = JSON.parse(data) as DataGoKrResponse<T>;\n validateResponse(parsed.header);\n\n return {\n header: parsed.header,\n body: {\n items: normalizeJsonItems(parsed.body.items),\n numOfRows: parsed.body.numOfRows,\n pageNo: parsed.body.pageNo,\n totalCount: parsed.body.totalCount,\n },\n };\n }\n } else {\n // 이미 파싱된 JSON 객체\n const parsed = data as DataGoKrResponse<T>;\n validateResponse(parsed.header);\n\n return {\n header: parsed.header,\n body: {\n items: normalizeJsonItems(parsed.body.items),\n numOfRows: parsed.body.numOfRows,\n pageNo: parsed.body.pageNo,\n totalCount: parsed.body.totalCount,\n },\n };\n }\n}\n","import type { GongdataConfig, RequestOptions, RawApiResult } from './types.js';\nimport { parseResponse } from './parser.js';\nimport { GongdataError, ResultCode } from './error.js';\n\nconst DEFAULT_TIMEOUT = 10000;\nconst DEFAULT_NUM_OF_ROWS = 100;\n\nexport class HttpClient {\n private readonly serviceKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly retryDelay: number;\n\n constructor(config: GongdataConfig) {\n this.serviceKey = config.serviceKey;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config.retry?.maxRetries ?? 3;\n this.retryDelay = config.retry?.delay ?? 1000;\n }\n\n /**\n * 서비스 키 반환 (일부 API에서 직접 URL 구성 시 필요)\n */\n getServiceKey(): string {\n return this.serviceKey;\n }\n\n /**\n * URL 파라미터 빌드\n */\n private buildParams(params: Record<string, string | number | undefined>): URLSearchParams {\n const searchParams = new URLSearchParams();\n searchParams.set('serviceKey', this.serviceKey);\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n searchParams.set(key, String(value));\n }\n }\n\n return searchParams;\n }\n\n /**\n * 단일 요청 실행 (재시도 포함)\n */\n async request<T>(baseUrl: string, options: RequestOptions): Promise<RawApiResult<T>> {\n const { path, params = {}, pageNo = 1, numOfRows = DEFAULT_NUM_OF_ROWS } = options;\n const url = `${baseUrl}${path}`;\n const searchParams = this.buildParams({\n ...params,\n pageNo,\n numOfRows,\n dataFormat: 'json', // 필수 파라미터\n });\n\n const fullUrl = `${url}?${searchParams.toString()}`;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(fullUrl, {\n method: 'GET',\n signal: controller.signal,\n headers: {\n Accept: 'application/json, application/xml',\n },\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new GongdataError(\n ResultCode.HTTP_ERROR,\n `HTTP ${response.status}: ${response.statusText}`\n );\n }\n\n const contentType = response.headers.get('content-type');\n const text = await response.text();\n const parsed = parseResponse<T>(text, contentType);\n\n const { body } = parsed;\n\n return {\n data: body.items,\n pagination: {\n pageNo: body.pageNo,\n numOfRows: body.numOfRows,\n totalCount: body.totalCount,\n },\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // AbortError는 타임아웃\n if (lastError.name === 'AbortError') {\n lastError = new GongdataError(ResultCode.SERVICE_TIMEOUT, 'Request timeout');\n }\n\n // 재시도 불가능한 에러\n if (GongdataError.isGongdataError(lastError)) {\n const nonRetryableCodes = [\n ResultCode.UNREGISTERED_SERVICE_KEY,\n ResultCode.EXPIRED_SERVICE_KEY,\n ResultCode.SERVICE_ACCESS_DENIED,\n ResultCode.INVALID_REQUEST_PARAMETER,\n ResultCode.UNREGISTERED_IP,\n ResultCode.MISSING_REQUIRED_PARAMETER,\n ResultCode.INVALID_DATA_FORMAT,\n ];\n\n if (nonRetryableCodes.includes(lastError.code as (typeof nonRetryableCodes)[number])) {\n throw lastError;\n }\n }\n\n // 마지막 시도가 아니면 대기 후 재시도\n if (attempt < this.maxRetries) {\n await this.sleep(this.retryDelay * (attempt + 1));\n }\n }\n }\n\n throw lastError ?? new GongdataError(ResultCode.APPLICATION_ERROR, 'Unknown error');\n }\n\n /**\n * 전체 페이지 데이터 수집\n */\n async requestAll<T>(\n baseUrl: string,\n options: RequestOptions,\n numOfRows: number = DEFAULT_NUM_OF_ROWS\n ): Promise<readonly T[]> {\n const allItems: T[] = [];\n let pageNo = 1;\n let totalCount = 0;\n\n do {\n const result = await this.request<T>(baseUrl, {\n ...options,\n pageNo,\n numOfRows,\n });\n\n allItems.push(...result.data);\n totalCount = result.pagination.totalCount;\n pageNo++;\n } while (allItems.length < totalCount);\n\n return allItems;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import type { PaginationInfo } from './types.js';\n\n/**\n * API 응답 기본 추상 클래스\n * @template TRaw - 공공 API 원본 타입\n * @template T - SDK 정규화 타입\n */\nexport abstract class DataResponse<TRaw, T> {\n /**\n * 정규화된 데이터 (SDK 보장 인터페이스)\n * @description 버전 업그레이드 시에도 인터페이스 호환성 보장\n */\n abstract getData(): readonly T[];\n\n /**\n * 원본 데이터 (공공 API 응답 그대로)\n * @description 공공 API 스펙 변경 시 같이 변경될 수 있음\n */\n abstract getRawData(): readonly TRaw[];\n\n /** 정규화된 데이터 (getter) */\n get data(): readonly T[] {\n return this.getData();\n }\n\n /** 원본 데이터 (getter) */\n get rawData(): readonly TRaw[] {\n return this.getRawData();\n }\n\n /**\n * 데이터가 비어있는지 확인\n */\n isEmpty(): boolean {\n return this.data.length === 0;\n }\n\n /**\n * 데이터 개수\n */\n count(): number {\n return this.data.length;\n }\n}\n\n/**\n * 페이지네이션이 있는 API 응답 추상 클래스\n */\nexport abstract class PaginatedResponse<TRaw, T> extends DataResponse<TRaw, T> {\n /**\n * 페이지네이션 정보\n */\n abstract getPagination(): PaginationInfo;\n\n /** 페이지네이션 정보 (getter) */\n get pagination(): PaginationInfo {\n return this.getPagination();\n }\n\n /** 전체 데이터 개수 */\n get totalCount(): number {\n return this.pagination.totalCount;\n }\n\n /** 현재 페이지 번호 */\n get pageNo(): number {\n return this.pagination.pageNo;\n }\n\n /** 페이지 당 항목 수 */\n get numOfRows(): number {\n return this.pagination.numOfRows;\n }\n\n /**\n * 다음 페이지 존재 여부\n */\n hasNextPage(): boolean {\n const { pageNo, numOfRows, totalCount } = this.pagination;\n return pageNo * numOfRows < totalCount;\n }\n}\n","import type { HttpClient, RequestOptions, RawApiResult } from '../core/index.js';\n\n/**\n * 모든 서비스의 기본 추상 클래스\n * 새 서비스 추가 시 이 클래스를 상속받아 구현\n */\nexport abstract class BaseService {\n protected readonly http: HttpClient;\n\n /** 서비스 기본 URL */\n protected abstract readonly baseUrl: string;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /**\n * 단일 페이지 요청\n */\n protected async request<T>(options: RequestOptions): Promise<RawApiResult<T>> {\n return this.http.request<T>(this.baseUrl, options);\n }\n\n /**\n * 전체 페이지 자동 수집\n */\n protected async requestAll<T>(\n options: RequestOptions,\n numOfRows?: number\n ): Promise<readonly T[]> {\n return this.http.requestAll<T>(this.baseUrl, options, numOfRows);\n }\n}\n","import type { RawExamSchedule, ExamSchedule, RawSubject, Subject, ExamPeriod } from './types.js';\n\n/**\n * YYYYMMDD → YYYY-MM-DD 변환\n */\nfunction formatDate(yyyymmdd: string): string {\n if (!yyyymmdd || yyyymmdd.length !== 8) return yyyymmdd;\n return `${yyyymmdd.slice(0, 4)}-${yyyymmdd.slice(4, 6)}-${yyyymmdd.slice(6, 8)}`;\n}\n\n/**\n * Raw 시험일정 → 정규화된 시험일정\n */\nexport function transformExamSchedule(raw: RawExamSchedule): ExamSchedule {\n const writtenExam: ExamPeriod = {\n registrationStart: formatDate(raw.docRegStartDt),\n registrationEnd: formatDate(raw.docRegEndDt),\n examStart: formatDate(raw.docExamStartDt),\n examEnd: formatDate(raw.docExamEndDt),\n resultDate: formatDate(raw.docPassDt),\n };\n\n const practicalExam: ExamPeriod = {\n registrationStart: formatDate(raw.pracRegStartDt),\n registrationEnd: formatDate(raw.pracRegEndDt),\n examStart: formatDate(raw.pracExamStartDt),\n examEnd: formatDate(raw.pracExamEndDt),\n resultDate: formatDate(raw.pracPassDt),\n };\n\n return {\n year: Number(raw.implYy),\n round: raw.implSeq,\n category: {\n code: raw.qualgbCd,\n name: raw.qualgbNm,\n },\n description: raw.description,\n writtenExam,\n practicalExam,\n };\n}\n\n/**\n * Raw 시험일정 배열 → 정규화된 시험일정 배열\n */\nexport function transformExamSchedules(\n rawList: readonly RawExamSchedule[]\n): readonly ExamSchedule[] {\n return rawList.map(transformExamSchedule);\n}\n\n/**\n * Raw 종목 → 정규화된 종목\n */\nexport function transformSubject(raw: RawSubject): Subject {\n return {\n code: raw.jmcd,\n name: raw.jmfldnm,\n category: {\n code: raw.qualgbcd,\n name: raw.qualgbnm,\n },\n series: {\n code: raw.seriescd,\n name: raw.seriesnm,\n },\n majorJobField: {\n code: raw.obligfldcd,\n name: raw.obligfldnm,\n },\n minorJobField: {\n code: raw.mdobligfldcd,\n name: raw.mdobligfldnm,\n },\n };\n}\n\n/**\n * Raw 종목 배열 → 정규화된 종목 배열\n */\nexport function transformSubjects(rawList: readonly RawSubject[]): readonly Subject[] {\n return rawList.map(transformSubject);\n}\n","import { DataResponse, PaginatedResponse } from '../../core/response.js';\nimport type { PaginationInfo } from '../../core/types.js';\nimport type { RawExamSchedule, ExamSchedule, RawSubject, Subject } from './types.js';\n\n/**\n * 시험일정 조회 결과\n */\nexport class ScheduleResponse extends PaginatedResponse<RawExamSchedule, ExamSchedule> {\n private readonly _raw: readonly RawExamSchedule[];\n private readonly _data: readonly ExamSchedule[];\n private readonly _pagination: PaginationInfo;\n\n constructor(\n raw: readonly RawExamSchedule[],\n data: readonly ExamSchedule[],\n pagination: PaginationInfo\n ) {\n super();\n this._raw = raw;\n this._data = data;\n this._pagination = pagination;\n }\n\n getData(): readonly ExamSchedule[] {\n return this._data;\n }\n\n getRawData(): readonly RawExamSchedule[] {\n return this._raw;\n }\n\n getPagination(): PaginationInfo {\n return this._pagination;\n }\n}\n\n/**\n * 시험일정 전체 조회 결과 (페이지네이션 없음)\n */\nexport class AllSchedulesResponse extends DataResponse<RawExamSchedule, ExamSchedule> {\n private readonly _raw: readonly RawExamSchedule[];\n private readonly _data: readonly ExamSchedule[];\n\n constructor(raw: readonly RawExamSchedule[], data: readonly ExamSchedule[]) {\n super();\n this._raw = raw;\n this._data = data;\n }\n\n getData(): readonly ExamSchedule[] {\n return this._data;\n }\n\n getRawData(): readonly RawExamSchedule[] {\n return this._raw;\n }\n}\n\n/**\n * 종목 목록 조회 결과\n */\nexport class SubjectResponse extends DataResponse<RawSubject, Subject> {\n private readonly _raw: readonly RawSubject[];\n private readonly _data: readonly Subject[];\n\n constructor(raw: readonly RawSubject[], data: readonly Subject[]) {\n super();\n this._raw = raw;\n this._data = data;\n }\n\n getData(): readonly Subject[] {\n return this._data;\n }\n\n getRawData(): readonly RawSubject[] {\n return this._raw;\n }\n\n /**\n * 종목코드로 찾기\n */\n findByCode(code: string): Subject | undefined {\n return this._data.find((s) => s.code === code);\n }\n\n /**\n * 종목명으로 찾기\n */\n findByName(name: string): Subject | undefined {\n return this._data.find((s) => s.name === name);\n }\n\n /**\n * 자격구분으로 필터링\n */\n filterByCategory(categoryCode: string): readonly Subject[] {\n return this._data.filter((s) => s.category.code === categoryCode);\n }\n}\n","import { BaseService } from '../base.js';\nimport { parseXml, validateResponse, normalizeXmlItems } from '../../core/parser.js';\nimport type { RawExamSchedule, RawSubject, GetSchedulesParams } from './types.js';\nimport { transformExamSchedules, transformSubjects } from './transformers.js';\nimport { ScheduleResponse, AllSchedulesResponse, SubjectResponse } from './response.js';\n\n/** 시험일정 API 베이스 URL */\nconst SCHEDULE_API_BASE_URL = 'http://apis.data.go.kr/B490007/qualExamSchd';\n\n/** 종목 목록 API 베이스 URL */\nconst SUBJECT_API_BASE_URL =\n 'http://openapi.q-net.or.kr/api/service/rest/InquiryListNationalQualifcationSVC';\n\n/** 종목 목록 API XML 응답 구조 */\ninterface SubjectXmlResponse {\n readonly response: {\n readonly header: { readonly resultCode: string; readonly resultMsg: string };\n readonly body: {\n readonly items: { readonly item: RawSubject | readonly RawSubject[] } | '';\n };\n };\n}\n\n/**\n * 자격증 시험일정 서비스\n * @see https://www.data.go.kr/data/15074408/openapi.do\n */\nexport class QualificationService extends BaseService {\n protected readonly baseUrl = SCHEDULE_API_BASE_URL;\n\n /**\n * 시험일정 목록 조회 (단일 페이지)\n *\n * @example\n * ```typescript\n * const result = await client.qualification.getSchedules({ year: 2026 });\n *\n * // 정규화된 데이터 (SDK 보장)\n * result.getData()[0].writtenExam.registrationStart // '2026-01-24'\n *\n * // 원본 데이터 (공공 API 그대로)\n * result.getRawData()[0].docRegStartDt // '20260124'\n * ```\n */\n async getSchedules(\n params: GetSchedulesParams,\n options?: { readonly pageNo?: number; readonly numOfRows?: number }\n ): Promise<ScheduleResponse> {\n const result = await this.request<RawExamSchedule>({\n path: '/getQualExamSchdList',\n params: {\n implYy: params.year,\n qualgbCd: params.category,\n jmCd: params.jmCode,\n },\n pageNo: options?.pageNo,\n numOfRows: options?.numOfRows,\n });\n\n return new ScheduleResponse(\n result.data,\n transformExamSchedules(result.data),\n result.pagination\n );\n }\n\n /**\n * 시험일정 전체 조회 (모든 페이지 자동 수집)\n */\n async getAllSchedules(params: GetSchedulesParams): Promise<AllSchedulesResponse> {\n const raw = await this.requestAll<RawExamSchedule>({\n path: '/getQualExamSchdList',\n params: {\n implYy: params.year,\n qualgbCd: params.category,\n jmCd: params.jmCode,\n },\n });\n\n return new AllSchedulesResponse(raw, transformExamSchedules(raw));\n }\n\n /**\n * 국가자격 종목 전체 목록 조회\n *\n * @example\n * ```typescript\n * const result = await client.qualification.getSubjects();\n *\n * // 정규화된 데이터\n * result.getData()[0].name // '정보처리기사'\n *\n * // 편의 메서드\n * result.findByName('정보처리기사') // Subject\n * result.filterByCategory('T') // 국가기술자격만\n * ```\n */\n async getSubjects(): Promise<SubjectResponse> {\n const url = `${SUBJECT_API_BASE_URL}/getList?serviceKey=${this.http.getServiceKey()}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { Accept: 'application/xml' },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const xml = await response.text();\n const parsed = parseXml<SubjectXmlResponse>(xml);\n\n validateResponse(parsed.response.header);\n\n const raw = normalizeXmlItems(parsed.response.body.items) as readonly RawSubject[];\n\n return new SubjectResponse(raw, transformSubjects(raw));\n }\n}\n","/**\n * 자격구분 코드\n * @see https://www.data.go.kr/data/15074408/openapi.do\n */\nexport const QualificationCategory = {\n /** 국가기술자격 */\n NATIONAL_TECHNICAL: 'T',\n /** 과정평가형자격 */\n COURSE_EVALUATION: 'C',\n /** 일학습병행자격 */\n WORK_LEARNING: 'W',\n /** 국가전문자격 */\n NATIONAL_PROFESSIONAL: 'S',\n} as const;\n\nexport type QualificationCategoryType =\n (typeof QualificationCategory)[keyof typeof QualificationCategory];\n\n/**\n * 주요 종목코드 (자주 사용되는 자격증)\n * @see https://www.data.go.kr/data/15003024/openapi.do\n * @description getSubjects()로 전체 목록 조회 가능\n */\nexport const JmCode = {\n // === 정보통신 ===\n /** 정보처리기사 */\n INFORMATION_PROCESSING_ENGINEER: '1320',\n /** 정보처리산업기사 */\n INFORMATION_PROCESSING_INDUSTRIAL_ENGINEER: '2290',\n /** 정보관리기술사 */\n INFORMATION_MANAGEMENT_PROFESSIONAL_ENGINEER: '0601',\n /** 컴퓨터시스템응용기술사 */\n COMPUTER_SYSTEM_APPLICATION_PROFESSIONAL_ENGINEER: '0622',\n\n // === 전기/전자 ===\n /** 전기기사 */\n ELECTRICAL_ENGINEER: '1150',\n /** 전기기능사 */\n ELECTRICAL_TECHNICIAN: '7780',\n /** 전기공사기사 */\n ELECTRICAL_CONSTRUCTION_ENGINEER: '1160',\n /** 전자기사 */\n ELECTRONICS_ENGINEER: '1230',\n\n // === 기계 ===\n /** 기계기사 */\n MECHANICAL_ENGINEER: '1431',\n /** 용접기사 */\n WELDING_ENGINEER: '1022',\n /** 지게차운전기능사 */\n FORKLIFT_DRIVER_TECHNICIAN: '7875',\n\n // === 건설 ===\n /** 건축기사 */\n ARCHITECTURE_ENGINEER: '1190',\n /** 토목기사 */\n CIVIL_ENGINEERING_ENGINEER: '1080',\n\n // === 조리/서비스 ===\n /** 한식조리기능사 */\n KOREAN_CUISINE_TECHNICIAN: '7910',\n /** 양식조리기능사 */\n WESTERN_CUISINE_TECHNICIAN: '7911',\n /** 미용사(일반) */\n BEAUTICIAN_GENERAL: '7937',\n} as const;\n\nexport type JmCodeType = (typeof JmCode)[keyof typeof JmCode];\n","import { HttpClient, type GongdataConfig } from './core/index.js';\nimport { QualificationService } from './services/qualification/index.js';\n\n/**\n * Gongdata 클라이언트 인터페이스\n */\nexport interface GongdataClient {\n /** 자격증 시험일정 서비스 */\n readonly qualification: QualificationService;\n}\n\n/**\n * Gongdata 클라이언트 생성\n *\n * @example\n * ```typescript\n * const client = createClient({\n * serviceKey: process.env.DATA_GO_KR_KEY!,\n * });\n *\n * const schedules = await client.qualification.getSchedules({ year: 2026 });\n * ```\n */\nexport function createClient(config: GongdataConfig): GongdataClient {\n const http = new HttpClient(config);\n\n return {\n qualification: new QualificationService(http),\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gongdata",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript SDK for Korea Public Data Portal (data.go.kr)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"require": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"test": "vitest run",
|
|
29
|
+
"test:watch": "vitest",
|
|
30
|
+
"lint": "eslint src",
|
|
31
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"prepublishOnly": "pnpm run build && pnpm run test",
|
|
34
|
+
"release": "pnpm run build && pnpm run test && npm publish",
|
|
35
|
+
"release:dry": "pnpm run build && npm publish --dry-run"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"korea",
|
|
39
|
+
"korean",
|
|
40
|
+
"public-data",
|
|
41
|
+
"data.go.kr",
|
|
42
|
+
"openapi",
|
|
43
|
+
"sdk",
|
|
44
|
+
"typescript",
|
|
45
|
+
"qualification",
|
|
46
|
+
"공공데이터"
|
|
47
|
+
],
|
|
48
|
+
"author": "SangHee Son",
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/Higangssh/gongdata.git"
|
|
53
|
+
},
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/Higangssh/gongdata/issues"
|
|
56
|
+
},
|
|
57
|
+
"homepage": "https://github.com/Higangssh/gongdata#readme",
|
|
58
|
+
"engines": {
|
|
59
|
+
"node": ">=18.0.0"
|
|
60
|
+
},
|
|
61
|
+
"packageManager": "pnpm@10.19.0",
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@eslint/js": "^9.39.2",
|
|
64
|
+
"@types/node": "^25.0.6",
|
|
65
|
+
"dotenv": "^17.2.3",
|
|
66
|
+
"eslint": "^9.39.2",
|
|
67
|
+
"prettier": "^3.7.4",
|
|
68
|
+
"tsup": "^8.5.1",
|
|
69
|
+
"typescript": "^5.9.3",
|
|
70
|
+
"typescript-eslint": "^8.52.0",
|
|
71
|
+
"vitest": "^4.0.16"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"fast-xml-parser": "^5.3.3"
|
|
75
|
+
}
|
|
76
|
+
}
|