dongnelibrary 0.3.2 → 0.3.4

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/API.md ADDED
@@ -0,0 +1,351 @@
1
+ # DongneLibrary API Reference
2
+
3
+ A JavaScript/TypeScript library for checking book availability across 100+ Korean public library branches in Gyeonggi Province (경기도).
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install dongnelibrary
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```javascript
14
+ import dongnelibrary from "dongnelibrary";
15
+
16
+ dongnelibrary.search(
17
+ { title: "해리포터", libraryName: "판교도서관" },
18
+ (err, result) => {
19
+ if (err) return console.error(err.msg);
20
+ console.log(`Found ${result.totalBookCount} books`);
21
+ result.booklist.forEach((book) => {
22
+ console.log(`${book.title} - ${book.exist ? "대출가능" : "대출중"}`);
23
+ });
24
+ },
25
+ );
26
+ ```
27
+
28
+ ## API
29
+
30
+ ### search(options, onResult?, onComplete?)
31
+
32
+ Search for books across one or more libraries.
33
+
34
+ #### Parameters
35
+
36
+ | Parameter | Type | Required | Description |
37
+ | ------------ | ------------------------ | -------- | --------------------------------- |
38
+ | `options` | `SearchOptionsMain` | Yes | Search configuration |
39
+ | `onResult` | `SearchCallback` | No | Called for each library's results |
40
+ | `onComplete` | `SearchCompleteCallback` | No | Called when all searches complete |
41
+
42
+ #### SearchOptionsMain
43
+
44
+ | Property | Type | Required | Description |
45
+ | ------------- | -------------------- | -------- | --------------------------------------------------- |
46
+ | `title` | `string` | Yes | Book title to search (Korean or English) |
47
+ | `libraryName` | `string \| string[]` | Yes | Library name(s). Use `''` or `[]` for all libraries |
48
+ | `signal` | `AbortSignal` | No | For cancelling in-progress searches |
49
+
50
+ #### Example: Single Library
51
+
52
+ ```javascript
53
+ dongnelibrary.search(
54
+ { title: "코스모스", libraryName: "판교도서관" },
55
+ (err, result) => {
56
+ if (result) {
57
+ console.log(result.booklist);
58
+ }
59
+ },
60
+ );
61
+ ```
62
+
63
+ #### Example: Multiple Libraries
64
+
65
+ ```javascript
66
+ dongnelibrary.search(
67
+ { title: "코스모스", libraryName: ["판교", "분당"] },
68
+ (err, result) => {
69
+ // Called once per library
70
+ if (result) {
71
+ console.log(`${result.libraryName}: ${result.totalBookCount} books`);
72
+ }
73
+ },
74
+ (err, results) => {
75
+ // Called once when all searches complete
76
+ console.log(`Total libraries searched: ${results.length}`);
77
+ },
78
+ );
79
+ ```
80
+
81
+ #### Example: All Libraries
82
+
83
+ ```javascript
84
+ dongnelibrary.search({ title: "해리포터", libraryName: "" }, (err, result) => {
85
+ if (result) {
86
+ console.log(`${result.libraryName}: ${result.booklist.length} results`);
87
+ }
88
+ });
89
+ ```
90
+
91
+ #### Example: With AbortSignal
92
+
93
+ ```javascript
94
+ const controller = new AbortController();
95
+
96
+ dongnelibrary.search(
97
+ { title: "해리포터", libraryName: "", signal: controller.signal },
98
+ (err, result) => {
99
+ /* ... */
100
+ },
101
+ (err, results) => {
102
+ /* ... */
103
+ },
104
+ );
105
+
106
+ // Cancel after 5 seconds
107
+ setTimeout(() => controller.abort(), 5000);
108
+ ```
109
+
110
+ ---
111
+
112
+ ### searchAsync(options, onResult?)
113
+
114
+ Promise-based search for books across one or more libraries.
115
+
116
+ #### Parameters
117
+
118
+ | Parameter | Type | Required | Description |
119
+ | ---------- | ------------------- | -------- | --------------------------------- |
120
+ | `options` | `SearchOptionsMain` | Yes | Search configuration |
121
+ | `onResult` | `SearchCallback` | No | Called for each library's results |
122
+
123
+ #### Returns
124
+
125
+ `Promise<SearchResult[]>` - Array of search results from all libraries
126
+
127
+ #### Example: Basic Usage
128
+
129
+ ```javascript
130
+ const results = await dongnelibrary.searchAsync({
131
+ title: "해리포터",
132
+ libraryName: "판교도서관",
133
+ });
134
+
135
+ results.forEach((result) => {
136
+ console.log(`${result.libraryName}: ${result.totalBookCount} books`);
137
+ });
138
+ ```
139
+
140
+ #### Example: Search All Libraries
141
+
142
+ ```javascript
143
+ const results = await dongnelibrary.searchAsync({
144
+ title: "코스모스",
145
+ libraryName: "",
146
+ });
147
+
148
+ console.log(`Found results in ${results.length} libraries`);
149
+ ```
150
+
151
+ #### Example: With Streaming Callback
152
+
153
+ ```javascript
154
+ const results = await dongnelibrary.searchAsync(
155
+ { title: "해리포터", libraryName: "" },
156
+ (err, result) => {
157
+ // Called as each library completes
158
+ if (result) {
159
+ console.log(`${result.libraryName}: ${result.booklist.length} books`);
160
+ }
161
+ },
162
+ );
163
+
164
+ // Final results available after all searches complete
165
+ console.log(`Total: ${results.length} libraries searched`);
166
+ ```
167
+
168
+ #### Example: With AbortSignal
169
+
170
+ ```javascript
171
+ const controller = new AbortController();
172
+
173
+ // Cancel after 5 seconds
174
+ setTimeout(() => controller.abort(), 5000);
175
+
176
+ try {
177
+ const results = await dongnelibrary.searchAsync({
178
+ title: "해리포터",
179
+ libraryName: "",
180
+ signal: controller.signal,
181
+ });
182
+ } catch (err) {
183
+ console.log("Search was cancelled");
184
+ }
185
+ ```
186
+
187
+ ---
188
+
189
+ ### getLibraryNames()
190
+
191
+ Returns an array of all supported library branch names.
192
+
193
+ #### Returns
194
+
195
+ `string[]` - Array of library names (100+ branches)
196
+
197
+ #### Example
198
+
199
+ ```javascript
200
+ const libraries = dongnelibrary.getLibraryNames();
201
+ console.log(libraries);
202
+ // ['가좌도서관', '갈현도서관', '경기평생교육학습관', ...]
203
+ ```
204
+
205
+ ---
206
+
207
+ ### getModuleHomeUrls()
208
+
209
+ Returns a mapping of library system module names to their home URLs.
210
+
211
+ #### Returns
212
+
213
+ `Record<string, string>` - Object mapping module names to URLs
214
+
215
+ #### Example
216
+
217
+ ```javascript
218
+ const urls = dongnelibrary.getModuleHomeUrls();
219
+ console.log(urls);
220
+ // {
221
+ // gg: 'https://lib.goe.go.kr',
222
+ // gunpo: 'https://www.gunpolib.go.kr',
223
+ // ...
224
+ // }
225
+ ```
226
+
227
+ ---
228
+
229
+ ## Types
230
+
231
+ ### SearchResult
232
+
233
+ Returned for each library search.
234
+
235
+ ```typescript
236
+ interface SearchResult {
237
+ title?: string; // Search query
238
+ libraryName?: string; // Library branch name
239
+ homeUrl?: string; // Library website URL
240
+ totalBookCount: number | string; // Total matching books
241
+ startPage?: number; // Pagination start
242
+ booklist: Book[]; // Array of found books
243
+ }
244
+ ```
245
+
246
+ ### Book
247
+
248
+ Individual book information.
249
+
250
+ ```typescript
251
+ interface Book {
252
+ libraryName: string; // Library where book is located
253
+ title: string; // Book title
254
+ exist: boolean; // true = available, false = checked out
255
+ bookUrl?: string; // Direct link to book detail page
256
+ }
257
+ ```
258
+
259
+ ### SearchError
260
+
261
+ Error object returned on failure.
262
+
263
+ ```typescript
264
+ interface SearchError {
265
+ msg: string; // Error message
266
+ }
267
+ ```
268
+
269
+ ### Callback Types
270
+
271
+ ```typescript
272
+ // Called for each library result
273
+ type SearchCallback = (err: SearchError | null, result?: SearchResult) => void;
274
+
275
+ // Called when all searches complete
276
+ type SearchCompleteCallback = (
277
+ err: SearchError | null,
278
+ results?: SearchResult[],
279
+ ) => void;
280
+ ```
281
+
282
+ ---
283
+
284
+ ## Supported Library Systems
285
+
286
+ | Module | Library System | Region |
287
+ | -------- | ------------------ | ----------------- |
288
+ | `gg` | 경기교육통합도서관 | Gyeonggi Province |
289
+ | `gunpo` | 군포시도서관 | Gunpo City |
290
+ | `hscity` | 화성시립도서관 | Hwaseong City |
291
+ | `osan` | 오산시도서관 | Osan City |
292
+ | `snlib` | 성남시도서관 | Seongnam City |
293
+ | `suwon` | 수원시도서관 | Suwon City |
294
+ | `yjlib` | 여주시립도서관 | Yeoju City |
295
+ | `yongin` | 용인시도서관 | Yongin City |
296
+
297
+ Use `getLibraryNames()` to see all 100+ individual branch names.
298
+
299
+ ---
300
+
301
+ ## CLI Usage
302
+
303
+ ```bash
304
+ # Interactive mode
305
+ npx dongnelibrary -i
306
+
307
+ # Search specific library
308
+ npx dongnelibrary -t "해리포터" -l "판교도서관"
309
+
310
+ # Search all libraries
311
+ npx dongnelibrary -t "해리포터" -a
312
+ ```
313
+
314
+ See `dongnelibrary --help` for all options.
315
+
316
+ ---
317
+
318
+ ## TypeScript Support
319
+
320
+ The package includes TypeScript declarations. Import types directly:
321
+
322
+ ```typescript
323
+ import dongnelibrary, { SearchResult, SearchError, Book } from "dongnelibrary";
324
+ ```
325
+
326
+ ---
327
+
328
+ ## Error Handling
329
+
330
+ ```javascript
331
+ dongnelibrary.search(
332
+ { title: "책제목", libraryName: "알수없는도서관" },
333
+ (err, result) => {
334
+ if (err) {
335
+ console.error("Search failed:", err.msg);
336
+ // Common errors:
337
+ // - "Unknown library name"
338
+ // - "invalid Data response"
339
+ // - Network/timeout errors
340
+ return;
341
+ }
342
+ // Process result...
343
+ },
344
+ );
345
+ ```
346
+
347
+ ---
348
+
349
+ ## License
350
+
351
+ MIT
package/README.md CHANGED
@@ -70,6 +70,8 @@
70
70
 
71
71
  npm install dongnelibrary
72
72
 
73
+ ### Callback Style
74
+
73
75
  ```javascript
74
76
  const dl = require("dongnelibrary");
75
77
  dl.search(
@@ -89,6 +91,26 @@ dl.search(
89
91
  );
90
92
  ```
91
93
 
94
+ ### Promise Style (async/await)
95
+
96
+ ```javascript
97
+ const dl = require("dongnelibrary");
98
+
99
+ const results = await dl.searchAsync({
100
+ title: "javascript",
101
+ libraryName: ["여주", "판교"],
102
+ });
103
+
104
+ results.forEach((result) => {
105
+ console.log(result.libraryName + ' "' + result.title + '"');
106
+ result.booklist.forEach((book) => {
107
+ console.log((book.exist ? " ✓ " : " ✖ ") + " " + book.title);
108
+ });
109
+ });
110
+
111
+ console.log(results.length + " 개의 도서관을 검색했습니다.");
112
+ ```
113
+
92
114
  ## 검색 가능한 도서관
93
115
 
94
116
  - [경기교육통합도서관][gg-url] (경기중앙교육도서관,경기평택교육도서관,경기광주교육도서관,경기여주가남교육도서관,경기포천교육도서관,경기김포교육도서관,경기과천교육도서관,경기성남교육도서관,경기화성교육도서관,경기의정부교육도서관,경기평생교육학습관)
@@ -9,5 +9,6 @@ export interface SearchOptionsMain {
9
9
  signal?: AbortSignal;
10
10
  }
11
11
  export declare const search: (opt: SearchOptionsMain | undefined | null, onResult?: SearchCallback, onComplete?: SearchCompleteCallback) => void;
12
+ export declare const searchAsync: (opt: SearchOptionsMain, onResult?: SearchCallback) => Promise<SearchResult[]>;
12
13
  export type { SearchResult, SearchError, Book } from "./types";
13
14
  //# sourceMappingURL=dongnelibrary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dongnelibrary.d.ts","sourceRoot":"","sources":["../src/dongnelibrary.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAIV,WAAW,EACX,YAAY,EACb,MAAM,SAAS,CAAC;AAsCjB,eAAO,MAAM,eAAe,QAAO,MAAM,EACL,CAAC;AAErC,eAAO,MAAM,iBAAiB,QAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAGvD,CAAC;AAgFJ,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,WAAW,GAAG,IAAI,EACvB,MAAM,CAAC,EAAE,YAAY,KAClB,IAAI,CAAC;AACV,MAAM,MAAM,sBAAsB,GAAG,CACnC,GAAG,EAAE,WAAW,GAAG,IAAI,EACvB,OAAO,CAAC,EAAE,YAAY,EAAE,KACrB,IAAI,CAAC;AAEV,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,eAAO,MAAM,MAAM,GACjB,KAAK,iBAAiB,GAAG,SAAS,GAAG,IAAI,EACzC,WAAW,cAAc,EACzB,aAAa,sBAAsB,KAClC,IA0BF,CAAC;AAGF,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"dongnelibrary.d.ts","sourceRoot":"","sources":["../src/dongnelibrary.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,WAAW,EACX,YAAY,EACb,MAAM,SAAS,CAAC;AAuCjB,eAAO,MAAM,eAAe,QAAO,MAAM,EACL,CAAC;AAErC,eAAO,MAAM,iBAAiB,QAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CACiB,CAAC;AAgF5E,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,WAAW,GAAG,IAAI,EACvB,MAAM,CAAC,EAAE,YAAY,KAClB,IAAI,CAAC;AACV,MAAM,MAAM,sBAAsB,GAAG,CACnC,GAAG,EAAE,WAAW,GAAG,IAAI,EACvB,OAAO,CAAC,EAAE,YAAY,EAAE,KACrB,IAAI,CAAC;AAEV,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,eAAO,MAAM,MAAM,GACjB,KAAK,iBAAiB,GAAG,SAAS,GAAG,IAAI,EACzC,WAAW,cAAc,EACzB,aAAa,sBAAsB,KAClC,IA0BF,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,WAAW,cAAc,KACxB,OAAO,CAAC,YAAY,EAAE,CA4BxB,CAAC;AAGF,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC"}
@@ -33,13 +33,14 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.search = exports.getModuleHomeUrls = exports.getLibraryNames = void 0;
36
+ exports.searchAsync = exports.search = exports.getModuleHomeUrls = exports.getLibraryNames = void 0;
37
37
  const gg = __importStar(require("./library/gg"));
38
38
  const gunpo = __importStar(require("./library/gunpo"));
39
39
  const hscity = __importStar(require("./library/hscity"));
40
40
  const osan = __importStar(require("./library/osan"));
41
41
  const snlib = __importStar(require("./library/snlib"));
42
42
  const suwon = __importStar(require("./library/suwon"));
43
+ const yjlib = __importStar(require("./library/yjlib"));
43
44
  const yongin = __importStar(require("./library/yongin"));
44
45
  // =============================================================================
45
46
  // Configuration
@@ -51,6 +52,7 @@ const LIBRARY_MODULES = [
51
52
  osan,
52
53
  snlib,
53
54
  suwon,
55
+ yjlib,
54
56
  yongin,
55
57
  ];
56
58
  const UNKNOWN_LIBRARY_ERROR = { msg: "Unknown library name" };
@@ -145,4 +147,31 @@ const search = (opt, onResult, onComplete) => {
145
147
  });
146
148
  };
147
149
  exports.search = search;
150
+ const searchAsync = (opt, onResult) => {
151
+ return new Promise((resolve, reject) => {
152
+ if (!opt) {
153
+ reject(new Error("invalid search options"));
154
+ return;
155
+ }
156
+ const { title, libraryName, signal } = opt;
157
+ const libraries = resolveLibraries(libraryName);
158
+ const promises = libraries.map(async (lib) => {
159
+ if (signal?.aborted) {
160
+ return null;
161
+ }
162
+ const { error, result } = await searchLibrary(lib, title, signal);
163
+ if (error) {
164
+ onResult?.(error);
165
+ return null;
166
+ }
167
+ onResult?.(null, result);
168
+ return result;
169
+ });
170
+ Promise.all(promises).then((results) => {
171
+ const validResults = results.filter((r) => r !== null);
172
+ resolve(validResults);
173
+ });
174
+ });
175
+ };
176
+ exports.searchAsync = searchAsync;
148
177
  //# sourceMappingURL=dongnelibrary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dongnelibrary.js","sourceRoot":"","sources":["../src/dongnelibrary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dongnelibrary.js","sourceRoot":"","sources":["../src/dongnelibrary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC5EC\uC8FC\uC2DC\uB9BD\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://www.yjlib.go.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=yjlib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjlib.d.ts","sourceRoot":"","sources":["../../src/library/yjlib.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAqB,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE/E,eAAO,MAAM,UAAU,+CAAY,CAAC;AACpC,eAAO,MAAM,OAAO,4BAA4B,CAAC;AAsHjD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.search = exports.homeUrl = exports.moduleName = void 0;
4
+ exports.getLibraryNames = getLibraryNames;
5
+ const util_1 = require("../util");
6
+ const http_1 = require("../http");
7
+ const jsdom_1 = require("jsdom");
8
+ exports.moduleName = "여주시립도서관";
9
+ exports.homeUrl = "https://www.yjlib.go.kr";
10
+ const libraryList = [
11
+ // Public libraries (시립도서관)
12
+ { code: "MA", name: "여주도서관" },
13
+ { code: "MB", name: "세종도서관" },
14
+ { code: "ME", name: "점동도서관" },
15
+ { code: "MH", name: "여주기적의도서관" },
16
+ { code: "MI", name: "흥천도서관" },
17
+ { code: "MG", name: "금사도서관" },
18
+ { code: "MF", name: "대신도서관" },
19
+ // Small libraries (작은도서관)
20
+ { code: "MC", name: "산북작은도서관" },
21
+ { code: "MD", name: "북내작은도서관" },
22
+ // Smart libraries (스마트도서관)
23
+ { code: "SA", name: "여주역스마트도서관" },
24
+ { code: "SB", name: "이마트스마트도서관" },
25
+ ];
26
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
27
+ /**
28
+ * Search for books in Yeoju City Libraries.
29
+ */
30
+ async function searchImpl(opt) {
31
+ const { title, libraryName, signal } = opt;
32
+ (0, util_1.validateSearchOptions)(opt);
33
+ const lcode = getLibraryCode(libraryName);
34
+ const { statusCode, body } = await (0, http_1.get)("https://www.yjlib.go.kr/web/menu/10036/program/30001/searchResultList.do", {
35
+ qs: {
36
+ searchType: "SIMPLE",
37
+ searchCategory: "ALL",
38
+ searchLibraryArr: lcode,
39
+ searchField: "ALL",
40
+ searchWord: title,
41
+ searchRecordCount: 1000,
42
+ },
43
+ signal,
44
+ });
45
+ if (statusCode !== 200) {
46
+ throw new Error(`HTTP ${statusCode}`);
47
+ }
48
+ const dom = new jsdom_1.JSDOM(body);
49
+ const document = dom.window.document;
50
+ // Extract total count from "총 <strong class="highlight">15</strong> 건"
51
+ const resultText = document.querySelector(".result_box .result_screen")?.textContent ?? "";
52
+ const countMatch = resultText.match(/총\s*(\d+)\s*건/);
53
+ const count = countMatch ? countMatch[1] : "0";
54
+ const booklist = [];
55
+ const bookItems = document.querySelectorAll(".bookList .bookArea");
56
+ bookItems.forEach((item) => {
57
+ // Get title from .book_name span (remove highlight spans)
58
+ const titleElement = item.querySelector(".book_name a span");
59
+ let bookTitle = "";
60
+ if (titleElement) {
61
+ // Clone and get text content (this preserves the text without highlight spans)
62
+ bookTitle = titleElement.textContent?.trim() ?? "";
63
+ }
64
+ // Extract book URL from onclick handler
65
+ // fnSearchResultDetail(speciesKey, bookKey, publishFormCode) submits a form via POST,
66
+ // but the same endpoint accepts GET requests with speciesKey parameter
67
+ let bookUrl = "";
68
+ const titleLink = item.querySelector(".book_name a");
69
+ const onclick = titleLink?.getAttribute("onclick") ?? "";
70
+ const urlMatch = onclick.match(/fnSearchResultDetail\(['"]?(\d+)['"]?,\s*['"]?(\d+)['"]?,\s*['"]?(\w+)['"]?\)/);
71
+ if (urlMatch) {
72
+ const [, speciesKey, bookKey, publishFormCode] = urlMatch;
73
+ bookUrl = `https://www.yjlib.go.kr/web/menu/10036/program/30001/searchResultDetail.do?speciesKey=${speciesKey}&bookKey=${bookKey}&publishFormCode=${publishFormCode}`;
74
+ }
75
+ // Get library name from .book_info.info03 first strong element
76
+ let libName = "";
77
+ const info03 = item.querySelector(".book_info.info03");
78
+ if (info03) {
79
+ const firstStrong = info03.querySelector("p strong");
80
+ if (firstStrong) {
81
+ libName = firstStrong.textContent?.trim() ?? "";
82
+ }
83
+ }
84
+ // Get availability status from .bookBtnWrap
85
+ const statusEl = item.querySelector(".bookBtnWrap");
86
+ const statusText = statusEl?.textContent ?? "";
87
+ const exist = statusText.includes("대출가능");
88
+ if (bookTitle) {
89
+ booklist.push({
90
+ libraryName: libName,
91
+ title: bookTitle,
92
+ bookUrl,
93
+ maxoffset: count,
94
+ exist,
95
+ });
96
+ }
97
+ });
98
+ return {
99
+ startPage: opt.startPage,
100
+ totalBookCount: (0, util_1.extractNumber)(count),
101
+ booklist,
102
+ };
103
+ }
104
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
105
+ function getLibraryNames() {
106
+ return (0, util_1.getLibraryNames)(libraryList);
107
+ }
108
+ //# sourceMappingURL=yjlib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjlib.js","sourceRoot":"","sources":["../../src/library/yjlib.ts"],"names":[],"mappings":"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"}
package/my_stars.txt ADDED
@@ -0,0 +1,390 @@
1
+ https://github.com/exo-explore/exo
2
+ https://github.com/hesreallyhim/awesome-claude-code
3
+ https://github.com/daphnecode/TaskMate
4
+ https://github.com/whyisdifficult/jiratui
5
+ https://github.com/codecrafters-io/build-your-own-x
6
+ https://github.com/ArthurSonzogni/Diagon
7
+ https://github.com/linkarzu/dotfiles-latest
8
+ https://github.com/hedyhli/outline.nvim
9
+ https://github.com/jrmoulton/tmux-sessionizer
10
+ https://github.com/rickiepark/deep-learning-with-python-2nd
11
+ https://github.com/dstein64/nvim-scrollview
12
+ https://github.com/jtroo/kanata
13
+ https://github.com/stevearc/oil.nvim
14
+ https://github.com/hrsh7th/cmp-nvim-lsp
15
+ https://github.com/nvimtools/none-ls.nvim
16
+ https://github.com/catppuccin/nvim
17
+ https://github.com/nchudleigh/vimac
18
+ https://github.com/SortableJS/Sortable
19
+ https://github.com/placemark/placemark
20
+ https://github.com/Everduin94/better-commits
21
+ https://github.com/schedule-x/schedule-x
22
+ https://github.com/srikanth235/privy
23
+ https://github.com/dineug/erd-editor
24
+ https://github.com/CopilotKit/CopilotKit
25
+ https://github.com/wallabag/wallabag
26
+ https://github.com/Portkey-AI/gateway
27
+ https://github.com/markslides/markslides
28
+ https://github.com/YS-L/csvlens
29
+ https://github.com/tconbeer/harlequin
30
+ https://github.com/cboxdoerfer/fsearch
31
+ https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming
32
+ https://github.com/alexandrehtrb/Pororoca
33
+ https://github.com/standard-webhooks/standard-webhooks
34
+ https://github.com/joshmarinacci/node-pureimage
35
+ https://github.com/vscode-neovim/vscode-multi-cursor.nvim
36
+ https://github.com/Elevista/tswagger
37
+ https://github.com/datalab-to/marker
38
+ https://github.com/arcataroger/awesome-engineering-games
39
+ https://github.com/openinterpreter/open-interpreter
40
+ https://github.com/WegraLee/deep-learning-from-scratch
41
+ https://github.com/ekzhang/sshx
42
+ https://github.com/contour-terminal/contour
43
+ https://github.com/bensadeh/tailspin
44
+ https://github.com/Giskard-AI/giskard-oss
45
+ https://github.com/honojs/hono
46
+ https://github.com/google/zx
47
+ https://github.com/revertinc/revert
48
+ https://github.com/navorite/sessionic
49
+ https://github.com/google/typograms
50
+ https://github.com/mohamed-chs/convoviz
51
+ https://github.com/Dicklesworthstone/automatic_log_collector_and_analyzer
52
+ https://github.com/lotusdblabs/lotusdb
53
+ https://github.com/Dataherald/dataherald
54
+ https://github.com/exogee-technology/graphweaver
55
+ https://github.com/obra/Youtube2Webpage
56
+ https://github.com/YavorGIvanov/sam.cpp
57
+ https://github.com/puckeditor/puck
58
+ https://github.com/btpf/Alexandria
59
+ https://github.com/sweepai/sweep
60
+ https://github.com/lllyasviel/Fooocus
61
+ https://github.com/clockworklabs/SpacetimeDB
62
+ https://github.com/HHHMHA/django-roadmap
63
+ https://github.com/absadiki/subsai
64
+ https://github.com/langgenius/dify
65
+ https://github.com/getzep/zep
66
+ https://github.com/mquan/api2ai
67
+ https://github.com/mayooear/ai-pdf-chatbot-langchain
68
+ https://github.com/little-brother/sqlite-gui
69
+ https://github.com/vim-scripts/DrawIt
70
+ https://github.com/NomaDamas/KICE_slayer_AI_Korean
71
+ https://github.com/lucavallin/barco
72
+ https://github.com/livecycle/preevy
73
+ https://github.com/hyperonym/basaran
74
+ https://github.com/michael/editable-website
75
+ https://github.com/ankane/mapkick.js
76
+ https://github.com/RahulSChand/llama2.c-for-dummies
77
+ https://github.com/ThousandBirdsInc/chidori
78
+ https://github.com/cozodb/cozo
79
+ https://github.com/getgrav/grav
80
+ https://github.com/shroominic/codeinterpreter-api
81
+ https://github.com/novuhq/novu
82
+ https://github.com/Forethought-Technologies/AutoChain
83
+ https://github.com/dabeaz-course/python-mastery
84
+ https://github.com/GRVYDEV/S.A.T.U.R.D.A.Y
85
+ https://github.com/vitoplantamura/OnnxStream
86
+ https://github.com/highlight/highlight
87
+ https://github.com/a16z-infra/companion-app
88
+ https://github.com/Shelf-nu/shelf.nu
89
+ https://github.com/sdan/vlite
90
+ https://github.com/toeverything/AFFiNE
91
+ https://github.com/pauldreik/rdfind
92
+ https://github.com/0hq/tinyvector
93
+ https://github.com/mbzuai-oryx/XrayGPT
94
+ https://github.com/aidenybai/million
95
+ https://github.com/kkuchta/css-only-chat
96
+ https://github.com/imgly/background-removal-js
97
+ https://github.com/MihanEntalpo/cryptboard.io
98
+ https://github.com/belladoreai/llama-tokenizer-js
99
+ https://github.com/vriteio/vrite
100
+ https://github.com/binpash/try
101
+ https://github.com/xavi-/node-copy-paste
102
+ https://github.com/formkit/auto-animate
103
+ https://github.com/flowdriveai/flowpilot
104
+ https://github.com/undb-io/undb
105
+ https://github.com/AntonOsika/gpt-engineer
106
+ https://github.com/Yerbert/DingoQuadruped
107
+ https://github.com/bentoml/OpenLLM
108
+ https://github.com/s0md3v/roop
109
+ https://github.com/k1LoW/tbls
110
+ https://github.com/ajndkr/lanarky
111
+ https://github.com/algolia/autocomplete
112
+ https://github.com/reactive-python/reactpy
113
+ https://github.com/jart/blink
114
+ https://github.com/composite/awesome-jsx
115
+ https://github.com/lance-format/lance
116
+ https://github.com/kochrt/qr-designer
117
+ https://github.com/makeplane/plane
118
+ https://github.com/kreneskyp/ix
119
+ https://github.com/NotJoeMartinez/yt-fts
120
+ https://github.com/bytecodealliance/javy
121
+ https://github.com/Blazity/next-enterprise
122
+ https://github.com/superagent-ai/superagent
123
+ https://github.com/ricklamers/gpt-code-ui
124
+ https://github.com/wezterm/wezterm
125
+ https://github.com/zylon-ai/private-gpt
126
+ https://github.com/OFA-Sys/ONE-PEACE
127
+ https://github.com/FlowiseAI/Flowise
128
+ https://github.com/smol-ai/developer
129
+ https://github.com/guidance-ai/guidance
130
+ https://github.com/HeyWillow/willow
131
+ https://github.com/ray-project/llm-numbers
132
+ https://github.com/dogu-team/gamium
133
+ https://github.com/bitcoin/bitcoin
134
+ https://github.com/brexhq/prompt-engineering
135
+ https://github.com/r2d4/openlm
136
+ https://github.com/gridstack/gridstack.js
137
+ https://github.com/mlc-ai/mlc-llm
138
+ https://github.com/gmpetrov/databerry
139
+ https://github.com/openlm-research/open_llama
140
+ https://github.com/lamini-ai/lamini
141
+ https://github.com/jkfran/killport
142
+ https://github.com/BuilderIO/SSDiff
143
+ https://github.com/h2oai/h2ogpt
144
+ https://github.com/editablejs/editable
145
+ https://github.com/griptape-ai/griptape
146
+ https://github.com/ArroyoSystems/arroyo
147
+ https://github.com/antvis/S2
148
+ https://github.com/mlc-ai/web-llm
149
+ https://github.com/ravenscroftj/turbopilot
150
+ https://github.com/cowtoolz/tachyon
151
+ https://github.com/facebookresearch/AnimatedDrawings
152
+ https://github.com/grpc/grpc-web
153
+ https://github.com/hocus-dev/hocus
154
+ https://github.com/langflow-ai/langflow
155
+ https://github.com/sqshq/sampler
156
+ https://github.com/e2b-dev/E2B
157
+ https://github.com/perspective-dev/perspective
158
+ https://github.com/leetcode-mafia/cheetah
159
+ https://github.com/pandas-dev/pandas
160
+ https://github.com/stochasticai/xTuring
161
+ https://github.com/Lightning-AI/lit-llama
162
+ https://github.com/Picsart-AI-Research/Text2Video-Zero
163
+ https://github.com/ouch-org/ouch
164
+ https://github.com/cursor/cursor
165
+ https://github.com/lucaong/minisearch
166
+ https://github.com/hectorm/otpauth
167
+ https://github.com/typst/typst
168
+ https://github.com/darkroomengineering/lenis
169
+ https://github.com/sandworm-hq/sandworm-audit
170
+ https://github.com/mathesar-foundation/mathesar
171
+ https://github.com/thoughtspile/awesome-tiny-js
172
+ https://github.com/konstaui/konsta
173
+ https://github.com/pulsejet/memories
174
+ https://github.com/mukulpatnaik/researchgpt
175
+ https://github.com/zackees/transcribe-anything
176
+ https://github.com/Cvaniak/NoteSH
177
+ https://github.com/cfortuner/promptable
178
+ https://github.com/FMInference/FlexLLMGen
179
+ https://github.com/robinmoisson/staticrypt
180
+ https://github.com/keephq/keep
181
+ https://github.com/slawlor/ractor
182
+ https://github.com/sger/RustBooks
183
+ https://github.com/groundcover-com/caretta
184
+ https://github.com/Heptite/HTML
185
+ https://github.com/triggerdotdev/trigger.dev
186
+ https://github.com/pocketpy/pocketpy
187
+ https://github.com/schibsted/WAAS
188
+ https://github.com/initialcommit-com/git-sim
189
+ https://github.com/cashapp/hermit
190
+ https://github.com/automatisch/automatisch
191
+ https://github.com/fathyb/carbonyl
192
+ https://github.com/brycedrennan/imaginAIry
193
+ https://github.com/klothoplatform/klotho
194
+ https://github.com/philc/vimium
195
+ https://github.com/SpartanJ/ecode
196
+ https://github.com/Kanaries/graphic-walker
197
+ https://github.com/cheat/cheat
198
+ https://github.com/ZSWatch/ZSWatch
199
+ https://github.com/GimelStudio/GimelStudio
200
+ https://github.com/nikvdp/pbproxy
201
+ https://github.com/karpathy/nanoGPT
202
+ https://github.com/twisted/twisted
203
+ https://github.com/bigscience-workshop/petals
204
+ https://github.com/Shopify/hydrogen-v1
205
+ https://github.com/wong2/chatgpt-google-extension
206
+ https://github.com/openai/openai-cookbook
207
+ https://github.com/facebook/flow
208
+ https://github.com/skt-t1-byungi/use-simple-store
209
+ https://github.com/feathersjs/feathers
210
+ https://github.com/nvbn/thefuck
211
+ https://github.com/microsoft/typespec
212
+ https://github.com/skypilot-org/skypilot
213
+ https://github.com/alefragnani/vscode-bookmarks
214
+ https://github.com/jwilber/roughViz
215
+ https://github.com/sinclairzx81/zero
216
+ https://github.com/kognise/water.css
217
+ https://github.com/refined-github/refined-github
218
+ https://github.com/troxler/awesome-css-frameworks
219
+ https://github.com/AgnosticUI/agnosticui
220
+ https://github.com/beercss/beercss
221
+ https://github.com/winkjs/wink-nlp
222
+ https://github.com/kickstartDS/kickstartDS
223
+ https://github.com/runfinch/finch
224
+ https://github.com/peers/peerjs
225
+ https://github.com/captbaritone/webamp
226
+ https://github.com/GoogleChrome/chrome-extensions-samples
227
+ https://github.com/channy/korea-devculture
228
+ https://github.com/sindresorhus/is
229
+ https://github.com/mzur/gnome-shell-wsmatrix
230
+ https://github.com/jeffhhk/SoftwareDesignForFlexibility
231
+ https://github.com/swagger-api/swagger-codegen
232
+ https://github.com/jspreddy/node-cli-boilerplate
233
+ https://github.com/KyleAMathews/element-resize-event
234
+ https://github.com/tone-row/flowchart-fun
235
+ https://github.com/Esteban-Rocha/page-ruler-redux
236
+ https://github.com/rome/tools
237
+ https://github.com/nnethercote/perf-book
238
+ https://github.com/fureweb-com/public-google-sheets-parser
239
+ https://github.com/rainywalker/footNotes
240
+ https://github.com/dittos/diffmonster
241
+ https://github.com/welldone-software/why-did-you-render
242
+ https://github.com/preactjs/preact
243
+ https://github.com/greensock/GSAP
244
+ https://github.com/forwardemail/superagent
245
+ https://github.com/craigmulligan/js-fire
246
+ https://github.com/moleculerjs/moleculer
247
+ https://github.com/typelevel/cats
248
+ https://github.com/wtfutil/wtf
249
+ https://github.com/onury/docma
250
+ https://github.com/electron/fiddle
251
+ https://github.com/WICG/portals
252
+ https://github.com/Ulauncher/Ulauncher
253
+ https://github.com/acode/FunctionScript
254
+ https://github.com/sinedied/smoke
255
+ https://github.com/analysis-tools-dev/static-analysis
256
+ https://github.com/h2ero/XEasyMotion
257
+ https://github.com/race2infinity/The-Documentation-Compendium
258
+ https://github.com/StephenMcMillan/Dub-Dub-Do
259
+ https://github.com/agarrharr/awesome-cli-apps
260
+ https://github.com/glennrfisher/introduction-to-functional-programming
261
+ https://github.com/jroimartin/gocui
262
+ https://github.com/jesseduffield/lazydocker
263
+ https://github.com/ehmicky/gulp-execa
264
+ https://github.com/JoshMarler/react-juce
265
+ https://github.com/APIs-guru/graphql-apis
266
+ https://github.com/fanatid/jsyesql
267
+ https://github.com/dai-shi/react-tracked
268
+ https://github.com/rafaelrinaldi/hn-cli
269
+ https://github.com/sindresorhus/awesome-nodejs
270
+ https://github.com/rkoval/alfred-aws-console-services-workflow
271
+ https://github.com/egoist/bili
272
+ https://github.com/lukeed/pwa
273
+ https://github.com/you-dont-need/You-Dont-Need-JavaScript
274
+ https://github.com/neoclide/coc-snippets
275
+ https://github.com/SidOfc/dotfiles
276
+ https://github.com/BurntSushi/ripgrep
277
+ https://github.com/ranger/ranger
278
+ https://github.com/connors/photon
279
+ https://github.com/ifandelse/machina.js
280
+ https://github.com/syaning/awesome-frontend
281
+ https://github.com/1995eaton/chromium-vim
282
+ https://github.com/laravel/dusk
283
+ https://github.com/octalmage/robotjs
284
+ https://github.com/jerryscript-project/jerryscript
285
+ https://github.com/naver/fe-news
286
+ https://github.com/stereobooster/react-snap
287
+ https://github.com/codeunion/dotenv-example
288
+ https://github.com/nuxt-modules/style-resources
289
+ https://github.com/cometkim/gatsby-plugin-typegen
290
+ https://github.com/briskml/brisk
291
+ https://github.com/onivim/oni2
292
+ https://github.com/yona-projects/yona
293
+ https://github.com/shzlw/poli
294
+ https://github.com/mui/material-ui
295
+ https://github.com/mock-server/mockserver
296
+ https://github.com/oslabs-beta/protographql
297
+ https://github.com/lsongdev/node-bluetooth
298
+ https://github.com/flashphoner/flashphoner_client
299
+ https://github.com/nodejs/llhttp
300
+ https://github.com/entropic-dev/entropic
301
+ https://github.com/mdbootstrap/TW-Elements
302
+ https://github.com/joshwcomeau/guppy
303
+ https://github.com/webrtc/testrtc
304
+ https://github.com/microsoft/cascadia-code
305
+ https://github.com/skt-t1-byungi/fastcampus-downloader
306
+ https://github.com/dbalatero/VimMode.spoon
307
+ https://github.com/doczjs/docz
308
+ https://github.com/pimterry/loglevel
309
+ https://github.com/commitizen/cz-cli
310
+ https://github.com/ruffle-rs/ruffle
311
+ https://github.com/goldbergyoni/javascript-testing-best-practices
312
+ https://github.com/herebefrogs/submersible-warship-2063
313
+ https://github.com/szwacz/electron-boilerplate
314
+ https://github.com/skt-t1-byungi/use-interpolate
315
+ https://github.com/sindresorhus/awesome-electron
316
+ https://github.com/sindresorhus/generator-nm
317
+ https://github.com/kilimchoi/engineering-blogs
318
+ https://github.com/JKHeadley/rest-hapi
319
+ https://github.com/appium/appium-desktop
320
+ https://github.com/facebook/react-devtools
321
+ https://github.com/github/hotkey
322
+ https://github.com/baconjs/bacon.js
323
+ https://github.com/karatelabs/karate
324
+ https://github.com/previm/previm
325
+ https://github.com/react-cosmos/react-cosmos
326
+ https://github.com/uchangFD/tetris
327
+ https://github.com/goldenthumb/tetris-core
328
+ https://github.com/Raathigesh/dazzle
329
+ https://github.com/alex/what-happens-when
330
+ https://github.com/go-resty/resty
331
+ https://github.com/enquirer/enquirer
332
+ https://github.com/tj/commander.js
333
+ https://github.com/restify/node-restify
334
+ https://github.com/winstonjs/winston
335
+ https://github.com/adaltas/node-csv
336
+ https://github.com/validatorjs/validator.js
337
+ https://github.com/yangshun/front-end-interview-handbook
338
+ https://github.com/moncho/dry
339
+ https://github.com/skt-t1-byungi/inno-trans
340
+ https://github.com/teambit/bit
341
+ https://github.com/debauchee/barrier
342
+ https://github.com/h5bp/Front-end-Developer-Interview-Questions
343
+ https://github.com/alebcay/awesome-shell
344
+ https://github.com/herrbischoff/awesome-command-line-apps
345
+ https://github.com/trekhleb/javascript-algorithms
346
+ https://github.com/Chalarangelo/30-seconds-of-code
347
+ https://github.com/jordansissel/keynav
348
+ https://github.com/wasm-bindgen/wasm-bindgen
349
+ https://github.com/markusenglund/react-kanban
350
+ https://github.com/compat-table/compat-table
351
+ https://github.com/paperjs/paper.js
352
+ https://github.com/eligrey/FileSaver.js
353
+ https://github.com/facebook/PathPicker
354
+ https://github.com/babel/babel-eslint
355
+ https://github.com/rndme/download
356
+ https://github.com/realworld-apps/realworld
357
+ https://github.com/bnb/awesome-hyper
358
+ https://github.com/wesbos/JavaScript30
359
+ https://github.com/naugtur/xhr
360
+ https://github.com/joshbuchea/HEAD
361
+ https://github.com/jesse-blake/text-maze
362
+ https://github.com/dkraczkowski/dom.js
363
+ https://github.com/microjs/microjs.com
364
+ https://github.com/project-generator/project_generator
365
+ https://github.com/jwasham/coding-interview-university
366
+ https://github.com/impressivewebs/frontend-feeds
367
+ https://github.com/smblott-github/text-aid-too
368
+ https://github.com/hackjutsu/Lepton
369
+ https://github.com/cookiecutter/cookiecutter
370
+ https://github.com/guard/guard
371
+ https://github.com/viewvc/viewvc
372
+ https://github.com/BoostIO/BoostNote-Legacy
373
+ https://github.com/fczbkk/css-selector-generator
374
+ https://github.com/busypeoples/functional-programming-javascript
375
+ https://github.com/MostlyAdequate/mostly-adequate-guide
376
+ https://github.com/utilForever/game-developer-roadmap
377
+ https://github.com/TomasTomecek/sen
378
+ https://github.com/ericchiang/pup
379
+ https://github.com/orbitbot/chrome-extensions-examples
380
+ https://github.com/tabatkins/railroad-diagrams
381
+ https://github.com/kamranahmedse/developer-roadmap
382
+ https://github.com/Suor/funcy
383
+ https://github.com/kdeldycke/awesome-falsehood
384
+ https://github.com/sheerun/vim-polyglot
385
+ https://github.com/EbookFoundation/free-programming-books
386
+ https://github.com/plopjs/plop
387
+ https://github.com/jakesgordon/javascript-state-machine
388
+ https://github.com/reorx/httpstat
389
+ https://github.com/thednp/kute.js
390
+ https://github.com/jondot/awesome-weekly
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dongnelibrary",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "책을 빌릴 수 있는지 확인한다.",
5
5
  "engines": {
6
6
  "node": ">=22.22.0"
@@ -22,6 +22,7 @@
22
22
  "osan": "npm run build && node --test test/osan.spec.js",
23
23
  "snlib": "npm run build && node --test test/snlib.spec.js",
24
24
  "suwon": "npm run build && node --test test/suwon.spec.js",
25
+ "yjlib": "npm run build && node --test test/yjlib.spec.js",
25
26
  "yongin": "npm run build && node --test test/yongin.spec.js",
26
27
  "cli": "npm run build && node --test test/cli.spec.js"
27
28
  },
@@ -55,7 +56,7 @@
55
56
  "configstore": "^4.0.0",
56
57
  "figlet": "^1.2.1",
57
58
  "jsdom": "^21.1.1",
58
- "lodash": "^4.17.20",
59
+ "lodash": "^4.17.23",
59
60
  "undici": "^6.23.0"
60
61
  },
61
62
  "devDependencies": {