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 +351 -0
- package/README.md +22 -0
- package/dist/dongnelibrary.d.ts +1 -0
- package/dist/dongnelibrary.d.ts.map +1 -1
- package/dist/dongnelibrary.js +30 -1
- package/dist/dongnelibrary.js.map +1 -1
- package/dist/library/yjlib.d.ts +6 -0
- package/dist/library/yjlib.d.ts.map +1 -0
- package/dist/library/yjlib.js +108 -0
- package/dist/library/yjlib.js.map +1 -0
- package/my_stars.txt +390 -0
- package/package.json +3 -2
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] (경기중앙교육도서관,경기평택교육도서관,경기광주교육도서관,경기여주가남교육도서관,경기포천교육도서관,경기김포교육도서관,경기과천교육도서관,경기성남교육도서관,경기화성교육도서관,경기의정부교육도서관,경기평생교육학습관)
|
package/dist/dongnelibrary.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/dongnelibrary.js
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AACnC,uDAAyC;AACzC,yDAA2C;AAC3C,qDAAuC;AACvC,uDAAyC;AACzC,uDAAyC;AACzC,yDAA2C;AAU3C,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,MAAM,eAAe,GAAoB;IACvC,EAAE;IACF,KAAK;IACL,MAAM;IACN,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;CACP,CAAC;AAEF,MAAM,qBAAqB,GAAgB,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC;AAE3E,MAAM,eAAe,GAAyB;IAC5C,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAC/B,QAAQ,EAAE,CAAC,qBAAqB,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,MAAM,WAAW,GAA2B,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7E,MAAM,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI;IACJ,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,OAAO;CACxB,CAAC,CAAC,CACJ,CAAC;AAEK,MAAM,eAAe,GAAG,GAAa,EAAE,CAC5C,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AADxB,QAAA,eAAe,mBACS;AAE9B,MAAM,iBAAiB,GAAG,GAA2B,EAAE,CAC5D,MAAM,CAAC,WAAW,
|
|
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.
|
|
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.
|
|
59
|
+
"lodash": "^4.17.23",
|
|
59
60
|
"undici": "^6.23.0"
|
|
60
61
|
},
|
|
61
62
|
"devDependencies": {
|