pal-crawl 2.2.0 → 2.3.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/dist/likms.js CHANGED
@@ -33,11 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.LikmsCrawler = void 0;
36
+ exports.LikmsStateCrawler = exports.LikmsCrawler = void 0;
37
37
  const url_1 = require("url");
38
38
  const cheerio = __importStar(require("cheerio"));
39
39
  const config_1 = require("./config");
40
40
  const http_client_1 = require("./http-client");
41
+ const parser_1 = require("./parser");
41
42
  /**
42
43
  * 국회 의안정보시스템(likms.assembly.go.kr) 크롤러.
43
44
  *
@@ -62,6 +63,39 @@ class LikmsCrawler {
62
63
  retryCount: config?.retryCount ?? 3,
63
64
  customHeaders: config?.customHeaders ?? {},
64
65
  });
66
+ this.detailParser = new parser_1.LikmsDetailParser();
67
+ }
68
+ /**
69
+ * 의안번호(예: `2221883`)로 billId를 조회합니다 (`/bi/common/findBillDetail.do`).
70
+ * 의안상세 페이지는 billId만 받으므로, 목록의 의안번호밖에 없을 때 사용합니다.
71
+ * 존재하지 않거나 응답이 JSON이 아니면 `null`을 반환합니다(네트워크 오류는 전파).
72
+ */
73
+ async resolveBillId(billNo) {
74
+ const normalized = billNo.trim();
75
+ if (!normalized) {
76
+ return null;
77
+ }
78
+ const url = new url_1.URL(config_1.Config.LIKMS_FIND_BILL_URL, config_1.Config.LIKMS_DOMAIN);
79
+ url.searchParams.set('billNo', normalized);
80
+ let parsed;
81
+ try {
82
+ parsed = JSON.parse(await this.httpClient.get(url));
83
+ }
84
+ catch (error) {
85
+ if (error instanceof SyntaxError) {
86
+ return null;
87
+ }
88
+ throw error;
89
+ }
90
+ if (typeof parsed !== 'object' || parsed === null) {
91
+ return null;
92
+ }
93
+ const data = parsed.data;
94
+ if (typeof data !== 'object' || data === null) {
95
+ return null;
96
+ }
97
+ const billId = data.billId;
98
+ return typeof billId === 'string' && billId.trim() ? billId.trim() : null;
65
99
  }
66
100
  buildDetailPageUrl(billId) {
67
101
  const url = new url_1.URL(config_1.Config.LIKMS_DETAIL_PAGE_URL, config_1.Config.LIKMS_DOMAIN);
@@ -102,26 +136,7 @@ class LikmsCrawler {
102
136
  }
103
137
  /** 심사정보 탭 조각 HTML에서 제안이유 및 주요내용을 파싱하여 반환합니다. */
104
138
  parseProposalReason(fragmentHtml) {
105
- const $ = cheerio.load(fragmentHtml);
106
- const pre = $('#prntSummary').first();
107
- if (!pre.length) {
108
- return null;
109
- }
110
- const clone = pre.clone();
111
- clone.find('br').replaceWith('\n');
112
- const lines = clone
113
- .text()
114
- .replace(/\u00a0/g, ' ')
115
- .replace(/\r/g, '')
116
- .split('\n')
117
- .map((line) => line.replace(/\s+/g, ' ').trim())
118
- .filter(Boolean);
119
- // 첫 줄이 섹션 제목("제안이유 및 주요내용")을 반복하는 경우 제거
120
- if (lines[0]?.replace(/\s+/g, '') === '제안이유및주요내용') {
121
- lines.shift();
122
- }
123
- const text = lines.join('\n');
124
- return text || null;
139
+ return this.detailParser.parseProposalReason(fragmentHtml);
125
140
  }
126
141
  /**
127
142
  * billId(PAL contentId와 동일)로 제안이유 및 주요내용을 조회합니다.
@@ -148,4 +163,377 @@ class LikmsCrawler {
148
163
  }
149
164
  }
150
165
  exports.LikmsCrawler = LikmsCrawler;
166
+ /**
167
+ * 국회 의안정보시스템(likms.assembly.go.kr) 의안현황 > 계류의안 크롤러.
168
+ *
169
+ * 국민참여입법센터(NsmLmSts)의 계류 법안 조회를 대체할 수 있으며, 동일한
170
+ * `search` / `getPage` / `getAllPages` 구조를 제공합니다.
171
+ *
172
+ * 실제 흐름 (billState.js, biInit.js 기준):
173
+ * 1. GET /bill/bi/bill/state/mooringBillPage.do?stateId=mooring
174
+ * → 세션 쿠키(JSESSIONID)와 <meta name="_csrf"> 토큰, #form 숨김 필드 확보
175
+ * 2. POST /bill/bi/bill/state/searchBillStatePaging.do
176
+ * → 헤더 X-CSRF-TOKEN: <토큰>, 본문은 1에서 얻은 숨김 필드 + 요청 조건
177
+ * 3. 응답은 <div id="state-list"> 목록 조각 HTML (JSON 아님)
178
+ * - 총 건수/페이지: #pager_count_text, #pager_pages_text 숨김 input
179
+ *
180
+ * CSRF 토큰은 페이지 로드 시 한 번 발급되어 세션 동안 유지되므로, 첫 요청에서만
181
+ * 페이지를 조회해 토큰·폼 필드를 캐시합니다(만료 시 1회 자동 재발급).
182
+ *
183
+ * 본문을 페이지 숨김 필드로 시작하는 이유: 브라우저가 폼을 직렬화해 보내는 방식과
184
+ * 같아야 발의자(`representId`) 필터가 동작한다. 최소 파라미터만 보내면
185
+ * 서버가 발의자 조건을 조용히 무시한다.
186
+ *
187
+ * 발의자 **이름**은 서버도 크롤러도 해석하지 않는다(이름만으로는 어느 의원인지
188
+ * 확정할 수 없다). 이름밖에 없으면 `findRepresentCandidates()`로 사이트가 제시하는
189
+ * 후보를 보고 호출부가 `membId`를 고르는 것이 유일한 경로다.
190
+ */
191
+ class LikmsStateCrawler {
192
+ constructor(config) {
193
+ /** 제안이유 보정 기본 동시 요청 수 (1 = 순차) */
194
+ this.hydrateConcurrency = 1;
195
+ /** 제안이유 보정 기본 요청 간 지연(ms) — 대상 사이트 부하 방지 */
196
+ this.hydrateDelayMs = 500;
197
+ this.session = null;
198
+ this.httpClient = new http_client_1.HttpClient({
199
+ userAgent: config?.userAgent ?? config_1.Config.UserAgent,
200
+ timeout: config?.timeout ?? 10000,
201
+ retryCount: config?.retryCount ?? 3,
202
+ customHeaders: config?.customHeaders ?? {},
203
+ });
204
+ this.parser = new parser_1.LikmsStateParser();
205
+ this.detailCrawler = new LikmsCrawler({
206
+ userAgent: config?.userAgent ?? config_1.Config.UserAgent,
207
+ timeout: config?.timeout ?? 10000,
208
+ retryCount: config?.retryCount ?? 3,
209
+ customHeaders: config?.customHeaders ?? {},
210
+ });
211
+ this.hydrateProposalReason = config?.hydrateProposalReason ?? false;
212
+ }
213
+ buildStatePageUrl(stateId) {
214
+ const url = new url_1.URL(config_1.Config.LIKMS_STATE_PAGE_URL, config_1.Config.LIKMS_DOMAIN);
215
+ url.searchParams.set('stateId', stateId);
216
+ return url;
217
+ }
218
+ /**
219
+ * 계류의안 페이지 HTML을 반환합니다.
220
+ * 세션 쿠키와 CSRF 토큰을 확보하는 진입점으로 사용됩니다.
221
+ */
222
+ async getStatePageHTML(stateId = 'mooring') {
223
+ return this.httpClient.get(this.buildStatePageUrl(stateId));
224
+ }
225
+ /** 페이지의 <meta name="_csrf"> 값에서 CSRF 토큰을 추출합니다. */
226
+ extractCsrfToken(html) {
227
+ const $ = cheerio.load(html);
228
+ const token = $('meta[name="_csrf"]').attr('content')?.trim();
229
+ return token || null;
230
+ }
231
+ /**
232
+ * 페이지 `#form`의 숨김 필드를 객체로 추출합니다(CSRF 토큰 제외).
233
+ * 검색 AJAX 본문의 기본값으로 쓰이며, 브라우저가 폼을 직렬화해 보내는 것과 같습니다.
234
+ */
235
+ parseStateFormParams(html) {
236
+ const $ = cheerio.load(html);
237
+ const params = {};
238
+ $('#form input[type="hidden"]').each((_, el) => {
239
+ const name = $(el).attr('name');
240
+ if (!name || name === '_csrf') {
241
+ return;
242
+ }
243
+ params[name] = $(el).attr('value') ?? '';
244
+ });
245
+ return params;
246
+ }
247
+ /**
248
+ * 캐시된 세션(CSRF 토큰·폼 숨김 필드)을 버려 다음 요청에서 다시 발급받도록 합니다.
249
+ */
250
+ clearSession() {
251
+ this.session = null;
252
+ }
253
+ async ensureSession(stateId) {
254
+ if (this.session) {
255
+ return this.session;
256
+ }
257
+ const html = await this.getStatePageHTML(stateId);
258
+ const token = this.extractCsrfToken(html);
259
+ if (!token) {
260
+ throw new Error('CSRF token is missing on state page');
261
+ }
262
+ this.session = { token, formParams: this.parseStateFormParams(html) };
263
+ return this.session;
264
+ }
265
+ buildSearchBody(query, formParams = {}) {
266
+ const params = new URLSearchParams();
267
+ // 브라우저처럼 페이지 폼의 숨김 필드를 먼저 깔고, 아래에서 요청 값으로 덮어쓴다.
268
+ for (const [key, value] of Object.entries(formParams)) {
269
+ params.set(key, value);
270
+ }
271
+ params.set('page', String(query.pageIndex ?? 1));
272
+ params.set('stateId', query.stateId ?? 'mooring');
273
+ params.set('stateDtlDivCd', query.stateDtlDivCd ?? 'all');
274
+ const entries = [
275
+ ['rows', query.pageSize],
276
+ ['billNm', query.billNm],
277
+ ['billNo', query.billNo],
278
+ // 발의자 필터는 ID와 발의구분이 셋트여야 서버가 적용한다(ID만 보내면 무시됨).
279
+ [
280
+ 'representKindCd',
281
+ query.representKindCd ?? (query.representId ? '전체' : undefined),
282
+ ],
283
+ ['proposerKind', query.proposerKind],
284
+ ['representId', query.representId],
285
+ ['ageCmtId', query.ageCmtId],
286
+ ['cmtResultCd', query.cmtResultCd],
287
+ ['jntPrpslYn', query.jntPrpslYn],
288
+ ['ageFrom', query.ageFrom],
289
+ ['ageTo', query.ageTo],
290
+ ['billKind', query.billKind],
291
+ ['listOrd', query.listOrd],
292
+ ['ordCd', query.ordCd],
293
+ ['fromPropDt', query.fromPropDt],
294
+ ['toPropDt', query.toPropDt],
295
+ ['nmReSchText', query.nmReSchText],
296
+ ];
297
+ for (const [key, value] of entries) {
298
+ if (value !== undefined && value !== null && value !== '') {
299
+ params.set(key, String(value));
300
+ }
301
+ }
302
+ return params.toString();
303
+ }
304
+ /**
305
+ * 발의자명으로 **후보 목록**을 조회합니다 (`/bi/popup/selSameNmMemb.do`).
306
+ *
307
+ * 서버 검색 필터는 의원 ID(`representId`)만 받으므로, 이름밖에 모를 때 이 메서드로
308
+ * 사이트가 제시하는 후보(의원 ID·대수·한자명·정당명)를 보고 호출부가 고른다.
309
+ * 이름 하나를 ID로 자동 확정하지 않는다 — 같은 이름이 여러 대수에 있거나
310
+ * **같은 대수에** 둘 이상일 수 있어(예: 21대 이수진 2인) 크롤러가 정할 수 없다.
311
+ *
312
+ * - 명단에 없으면 빈 배열
313
+ * - `ageFrom`/`ageTo`는 서버가 필수로 받는다(없으면 400) → 기본값은 전체 범위(`01`–`99`)
314
+ * - GET이라 CSRF 토큰·세션이 필요 없다(실측: 쿠키 없이도 200)
315
+ *
316
+ * - 명단에 없으면 빈 배열
317
+ * - `ageFrom`/`ageTo`는 서버가 필수로 받는다(없으면 400) → 기본값은 전체 범위(`01`–`99`)
318
+ * - GET이라 CSRF 토큰·세션이 필요 없다(실측: 쿠키 없이도 200)
319
+ *
320
+ * @param name 의원명 (목록의 발의자 표기와 같은 한글 이름)
321
+ * @param ageFrom 대수 시작 (기본값 `01`)
322
+ * @param ageTo 대수 끝 (기본값 `99`)
323
+ */
324
+ async findRepresentCandidates(name, ageFrom, ageTo) {
325
+ const normalized = name.trim();
326
+ if (!normalized) {
327
+ throw new Error('represent name is required');
328
+ }
329
+ const url = new url_1.URL(config_1.Config.LIKMS_SAME_NM_POPUP_URL, config_1.Config.LIKMS_DOMAIN);
330
+ url.searchParams.set('memName', normalized);
331
+ url.searchParams.set('ageFrom', String(ageFrom ?? '01'));
332
+ url.searchParams.set('ageTo', String(ageTo ?? '99'));
333
+ url.searchParams.set('classId', 'bill');
334
+ const html = await this.httpClient.get(url);
335
+ return this.parser.parseSameNameCandidates(html);
336
+ }
337
+ /**
338
+ * 대수 범위의 **소관위원회 목록**을 조회합니다 (`/bi/bill/sch/findAgeCmt.do`).
339
+ *
340
+ * 검색 파라미터 `ageCmtId`는 이름이 아니라 코드를 받으므로, 이름밖에 모를 때
341
+ * 이 메서드로 코드를 확인한다. 위원회 구성은 대수마다 달라지므로 범위를 좁혀
342
+ * 조회한다(실측: `ageFrom=22&ageTo=22` → 22대 25건). 범위를 주지 않으면 전체
343
+ * 대수를 합친 목록을 주며, 이때는 같은 이름이 코드별로 나뉘어
344
+ * `보건복지위원회(18대~22대)`처럼 대수 꼬리표가 붙는다.
345
+ *
346
+ * - `ageFrom`/`ageTo`는 **둘 다** 줘야 범위가 적용된다(한 쪽만 주면 서버가 무시하므로 예외).
347
+ * - 브라우저와 같은 GET이며 CSRF 토큰·세션이 필요 없다(실측: 쿠키 없이 200).
348
+ * - 응답이 JSON이 아니면 빈 배열(예외 없음), 네트워크 오류는 전파한다.
349
+ */
350
+ async findCommittees(ageFrom, ageTo) {
351
+ const from = ageFrom === undefined ? '' : String(ageFrom).trim();
352
+ const to = ageTo === undefined ? '' : String(ageTo).trim();
353
+ if ((from && !to) || (!from && to)) {
354
+ throw new Error('ageFrom and ageTo are required together');
355
+ }
356
+ const url = new url_1.URL(config_1.Config.LIKMS_FIND_AGE_CMT_URL, config_1.Config.LIKMS_DOMAIN);
357
+ if (from && to) {
358
+ url.searchParams.set('ageFrom', from);
359
+ url.searchParams.set('ageTo', to);
360
+ }
361
+ return this.parser.parseCommittees(await this.httpClient.get(url));
362
+ }
363
+ /**
364
+ * 계류의안 목록 조각 HTML을 AJAX(POST)로 반환합니다.
365
+ *
366
+ * 브라우저와 동일하게 세션 페이지의 숨김 폼 필드를 본문 기본값으로 보내고,
367
+ * CSRF 토큰을 `X-CSRF-TOKEN` 헤더로 전송합니다. 토큰이 만료된 경우
368
+ * 세션을 다시 발급받아 1회 재시도합니다.
369
+ */
370
+ async getStateListHTML(query = {}) {
371
+ const stateId = query.stateId ?? 'mooring';
372
+ const url = new url_1.URL(config_1.Config.LIKMS_STATE_SEARCH_URL, config_1.Config.LIKMS_DOMAIN);
373
+ const hadSession = this.session !== null;
374
+ const run = async () => {
375
+ const session = await this.ensureSession(stateId);
376
+ return this.httpClient.post(url, this.buildSearchBody(query, session.formParams), { [config_1.Config.LIKMS_CSRF_HEADER]: session.token });
377
+ };
378
+ try {
379
+ return await run();
380
+ }
381
+ catch (error) {
382
+ // 세션/CSRF 토큰이 거부된 경우에만 새로 발급받아 1회 재시도한다.
383
+ // (네트워크 장애로 실패했을 때 불필요한 추가 요청을 만들지 않는다.)
384
+ if (!hadSession || !this.isSessionRejection(error)) {
385
+ throw error;
386
+ }
387
+ this.session = null;
388
+ return run();
389
+ }
390
+ }
391
+ /** HttpClient가 세션/CSRF 거부(401·403)로 실패했는지 판별합니다. */
392
+ isSessionRejection(error) {
393
+ const message = error instanceof Error ? error.message : '';
394
+ return /\b(401|403)\b/.test(message);
395
+ }
396
+ /** 목록 조각 HTML에서 계류의안 검색 결과를 파싱하여 반환합니다. */
397
+ parseList(html) {
398
+ return this.parser.parseList(html);
399
+ }
400
+ /**
401
+ * `hasProposalReason`인 법안의 제안이유를 의안상세에서 조회해 `proposalReason`에 채웁니다.
402
+ *
403
+ * 목록 HTML에는 제안이유 본문이 없어 건마다 2회(상세 페이지 + `billInfo.do`) 요청이 든다.
404
+ * `hasProposalReason`가 false인 건은 조회하지 않고, 조회·파싱에 실패한 건은 기존 값
405
+ * (`null`)을 유지하며 예외를 던지지 않는다.
406
+ *
407
+ * @param items 보정할 목록 (입력 배열은 변경하지 않는다)
408
+ * @param options `delayMs`(기본 500)·`concurrency`(기본 1)로 요청 속도를 조절한다.
409
+ * @returns 보정된 복사본 배열
410
+ */
411
+ async hydrateProposalReasons(items, options) {
412
+ const hydrated = items.map((item) => ({ ...item }));
413
+ const targets = hydrated.filter((item) => item.hasProposalReason);
414
+ if (targets.length === 0) {
415
+ return hydrated;
416
+ }
417
+ const delayMs = Math.max(0, options?.delayMs ?? this.hydrateDelayMs);
418
+ const concurrency = Math.max(1, options?.concurrency ?? this.hydrateConcurrency);
419
+ for (let start = 0; start < targets.length; start += concurrency) {
420
+ if (start > 0 && delayMs > 0) {
421
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
422
+ }
423
+ const chunk = targets.slice(start, start + concurrency);
424
+ await Promise.all(chunk.map(async (item) => {
425
+ if (!item.billId) {
426
+ return;
427
+ }
428
+ try {
429
+ const proposalReason = await this.detailCrawler.getProposalReason(item.billId);
430
+ if (proposalReason) {
431
+ item.proposalReason = proposalReason;
432
+ }
433
+ }
434
+ catch {
435
+ // 보정 실패 시 기존 값(null) 유지
436
+ }
437
+ }));
438
+ }
439
+ return hydrated;
440
+ }
441
+ /**
442
+ * 계류의안을 검색합니다. 필터를 지정하지 않으면 1페이지를 반환합니다.
443
+ * `hydrateProposalReason`이 켜져 있으면 `hasProposalReason` 건의 제안이유도 채웁니다.
444
+ */
445
+ async search(query = {}) {
446
+ const html = await this.getStateListHTML(query);
447
+ const result = this.parser.parseList(html);
448
+ if (!this.hydrateProposalReason) {
449
+ return result;
450
+ }
451
+ return {
452
+ ...result,
453
+ items: await this.hydrateProposalReasons(result.items),
454
+ };
455
+ }
456
+ /** 특정 페이지의 계류의안 목록을 반환합니다. */
457
+ async getPage(pageIndex, query = {}) {
458
+ const result = await this.search({ ...query, pageIndex });
459
+ return result.items;
460
+ }
461
+ async *_getAllPagesImpl(query, options) {
462
+ const delayMs = options.delayMs ?? 500;
463
+ const concurrency = Math.max(1, options.concurrency ?? 1);
464
+ const first = await this.search({ ...query, pageIndex: 1 });
465
+ yield first;
466
+ if (first.totalPages <= 1 || first.items.length === 0)
467
+ return;
468
+ const maxPages = Math.min(first.totalPages, options.maxPages ?? first.totalPages);
469
+ for (let start = 2; start <= maxPages; start += concurrency) {
470
+ if (delayMs > 0) {
471
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
472
+ }
473
+ const end = Math.min(start + concurrency - 1, maxPages);
474
+ const pageNums = Array.from({ length: end - start + 1 }, (_, i) => start + i);
475
+ const results = await Promise.all(pageNums.map((p) => this.search({ ...query, pageIndex: p })));
476
+ for (const result of results) {
477
+ yield result;
478
+ if (result.items.length === 0)
479
+ return;
480
+ }
481
+ }
482
+ }
483
+ /**
484
+ * 계류의안 전체 페이지를 순차적으로 yield하는 async generator.
485
+ * `IBulkOptions`로 딜레이·동시성·최대 페이지를 조절할 수 있습니다.
486
+ */
487
+ getAllPages(query, options) {
488
+ return this._getAllPagesImpl(query ?? {}, options ?? {});
489
+ }
490
+ /**
491
+ * 심사진행단계가 '접수'(위원회 회부 이전)인 항목만 남깁니다.
492
+ *
493
+ * 국민참여입법센터 `searchPending`(`rslRsltNmL=900101` '발의')에 대응하는 판정이다.
494
+ * 실측(2026-10-13)에서 likms 계류의안의 '접수' 항목과 NSM '발의' 결과가 같은
495
+ * 부분집합임을 확인했다(표본 13건 중 12건 일치).
496
+ */
497
+ filterPending(items) {
498
+ return items.filter((item) => item.progressStatus === config_1.Config.LIKMS_PENDING_PROGRESS_STATUS);
499
+ }
500
+ /**
501
+ * 접수(위원회 회부 이전) 법안을 페이지 단위로 순차적으로 yield합니다.
502
+ *
503
+ * likms 서버에는 심사진행상태를 좁히는 **유효한** 필터가 없다(파라미터 `srngPrgrsSttsCd`는
504
+ * 존재하지만 값을 알 수 없다 — `agent_memories/findings` 참조). 그래서 목록을 앞에서부터
505
+ * 스캔하며 클라이언트에서 걸러낸다. 따라서:
506
+ * - 접수 항목이 없는 페이지는 건너뛰므로 `currentPage`는 원본 페이지 번호가 아니다.
507
+ * - `items`는 접수 항목만이고, `total`/`totalPages`는 전체(접수 포함) 기준 원본 값이다.
508
+ *
509
+ * 스캔 기본 페이지 크기는 100건(사이트 지원 값)이라 `pageSize`를 주지 않으면 요청 수가 준다.
510
+ * 스캔 범위는 `options.maxPages`로 제한한다.
511
+ */
512
+ async *getAllPendingPages(query = {}, options = {}) {
513
+ for await (const page of this.getAllPages({ ...query, pageSize: query.pageSize ?? 100 }, options)) {
514
+ const items = this.filterPending(page.items);
515
+ if (items.length === 0) {
516
+ continue;
517
+ }
518
+ yield { ...page, items };
519
+ }
520
+ }
521
+ /**
522
+ * 접수(위원회 회부 이전) 법안이 있는 첫 페이지를 반환합니다.
523
+ *
524
+ * 서버 필터가 없어 앞에서부터 스캔하며, `options.maxPages`(기본 10) 안에서 찾지 못하면
525
+ * 빈 결과(`items: []`)를 반환한다. `searchPending`을 페이지 단위로 순회하려면
526
+ * `getAllPendingPages`를 쓴다(페이지 번호가 원본과 다르므로 `pageIndex`로 건너뛸 수 없다).
527
+ */
528
+ async searchPending(query = {}, options = {}) {
529
+ for await (const page of this.getAllPendingPages(query, {
530
+ ...options,
531
+ maxPages: options.maxPages ?? 10,
532
+ })) {
533
+ return page;
534
+ }
535
+ return { total: 0, totalPages: 0, currentPage: 1, items: [] };
536
+ }
537
+ }
538
+ exports.LikmsStateCrawler = LikmsStateCrawler;
151
539
  //# sourceMappingURL=likms.js.map
package/dist/likms.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"likms.js","sourceRoot":"","sources":["../src/likms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"likms.js","sourceRoot":"","sources":["../src/likms.ts"],"names":[],"mappings":"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"}