@heripo/research-radar 3.2.0 → 3.3.1

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/index.cjs CHANGED
@@ -1002,6 +1002,86 @@ function getUniqIdFromNrichMajorEvent(element) {
1002
1002
  return ((element.attr('onclick') ?? '').match(/fnViewPage\('(.*)'\)/)?.[1] ?? '');
1003
1003
  }
1004
1004
 
1005
+ const BASE_URL$1 = 'https://www.seamuse.go.kr';
1006
+ /**
1007
+ * Extracts the nttId from seamuse.go.kr detail page HTML.
1008
+ * The page contains a JS init call like: noticeFunc.infoInit(4394)
1009
+ * or og:url meta tag: https://www.seamuse.go.kr/news/notice/info/4394
1010
+ */
1011
+ const extractNttId = (html) => {
1012
+ // Try og:url meta tag first
1013
+ const ogUrlMatch = html.match(/property="og:url"\s+content="[^"]*\/info\/(\d+)"/);
1014
+ if (ogUrlMatch) {
1015
+ return ogUrlMatch[1];
1016
+ }
1017
+ // Fallback: JS init call pattern like infoInit(4394)
1018
+ const initMatch = html.match(/\.infoInit\((\d+)\)/);
1019
+ if (initMatch) {
1020
+ return initMatch[1];
1021
+ }
1022
+ return '';
1023
+ };
1024
+ /**
1025
+ * Parses the list page from seamuse.go.kr (국립해양유산연구소).
1026
+ * The site uses client-side rendering — list data is fetched from a JSON API.
1027
+ * URL pattern: /news/notice/list/1 → API: POST /news/notice/listData/1
1028
+ *
1029
+ * @param listDataPath - API path segment (e.g., "/news/notice" or "/resources/academiccultural")
1030
+ * @param infoPathPrefix - Detail page path prefix (e.g., "/news/notice/info")
1031
+ */
1032
+ const parseSeamuseList = async (_html, listDataPath, infoPathPrefix, customFetch, searchCategory) => {
1033
+ const body = searchCategory ? `searchCategory=${searchCategory}` : '';
1034
+ const response = await (customFetch ?? fetch)(`${BASE_URL$1}${listDataPath}/listData/1`, {
1035
+ method: 'POST',
1036
+ headers: {
1037
+ 'Content-Type': 'application/x-www-form-urlencoded',
1038
+ },
1039
+ body,
1040
+ });
1041
+ const data = await response.json();
1042
+ const posts = [];
1043
+ for (const item of data.resultList) {
1044
+ posts.push({
1045
+ uniqId: String(item.nttId),
1046
+ title: item.nttSj?.trim() ?? '',
1047
+ date: item.frstRegisterPnttm ?? '',
1048
+ detailUrl: `${BASE_URL$1}${infoPathPrefix}/${item.nttId}`,
1049
+ dateType: core.DateType.REGISTERED,
1050
+ });
1051
+ }
1052
+ return posts;
1053
+ };
1054
+ /**
1055
+ * Parses the detail page from seamuse.go.kr.
1056
+ * The site uses client-side rendering — detail data is fetched from a JSON API.
1057
+ * URL pattern: /news/notice/info/4394 → API: GET /news/notice/infoData/4394?nttId=4394
1058
+ *
1059
+ * @param infoDataPath - API path segment (e.g., "/news/notice")
1060
+ */
1061
+ const parseSeamuseDetail = async (html, infoDataPath, customFetch) => {
1062
+ const nttId = extractNttId(html);
1063
+ if (!nttId) {
1064
+ return {
1065
+ detailContent: '',
1066
+ hasAttachedFile: false,
1067
+ hasAttachedImage: false,
1068
+ };
1069
+ }
1070
+ const response = await (customFetch ?? fetch)(`${BASE_URL$1}${infoDataPath}/infoData/${nttId}?nttId=${nttId}`, {
1071
+ method: 'GET',
1072
+ headers: {
1073
+ 'Content-Type': 'application/json',
1074
+ },
1075
+ });
1076
+ const data = await response.json();
1077
+ const content = data.result.nttCn ?? '';
1078
+ return {
1079
+ detailContent: new TurndownService().turndown(content),
1080
+ hasAttachedFile: (data.files?.length ?? 0) > 0,
1081
+ hasAttachedImage: content.includes('<img'),
1082
+ };
1083
+ };
1084
+
1005
1085
  const LIST_API_URL = 'http://www.yngogo.or.kr/module/ntt/unity/selectNttListAjax.ink';
1006
1086
  const DETAIL_API_URL = 'http://www.yngogo.or.kr/module/ntt/unity/selectNttDetailAjax.ink';
1007
1087
  const BASE_URL = 'http://www.yngogo.or.kr';
@@ -1222,6 +1302,48 @@ function createCrawlingTargetGroups(customFetch) {
1222
1302
  parseList: parseNrichPortalList,
1223
1303
  parseDetail: parseNrichPortalDetail,
1224
1304
  },
1305
+ {
1306
+ id: '국립해양유산연구소_공지사항',
1307
+ name: '국립해양유산연구소 공지사항',
1308
+ url: 'https://www.seamuse.go.kr/news/notice/list/1',
1309
+ parseList: (html) => parseSeamuseList(html, '/news/notice', '/news/notice/info', customFetch),
1310
+ parseDetail: (html) => parseSeamuseDetail(html, '/news/notice', customFetch),
1311
+ },
1312
+ {
1313
+ id: '국립해양유산연구소_학술지',
1314
+ name: '국립해양유산연구소 학술지 해양유산연구',
1315
+ url: 'https://www.seamuse.go.kr/resources/academiccultural/list/1',
1316
+ parseList: (html) => parseSeamuseList(html, '/resources/academiccultural', '/resources/academiccultural/info', customFetch),
1317
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academiccultural', customFetch),
1318
+ },
1319
+ {
1320
+ id: '국립해양유산연구소_학술보고서_수중유산조사',
1321
+ name: '국립해양유산연구소 학술보고서 수중유산 조사',
1322
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1',
1323
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT001'),
1324
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1325
+ },
1326
+ {
1327
+ id: '국립해양유산연구소_학술보고서_수중유산보존',
1328
+ name: '국립해양유산연구소 학술보고서 수중유산 보존',
1329
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab2',
1330
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT002'),
1331
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1332
+ },
1333
+ {
1334
+ id: '국립해양유산연구소_학술보고서_전통선박',
1335
+ name: '국립해양유산연구소 학술보고서 전통 선박',
1336
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab3',
1337
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT003'),
1338
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1339
+ },
1340
+ {
1341
+ id: '국립해양유산연구소_학술보고서_해양문화역사',
1342
+ name: '국립해양유산연구소 학술보고서 해양문화역사',
1343
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab4',
1344
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT004'),
1345
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1346
+ },
1225
1347
  {
1226
1348
  id: '국립고궁박물관_공지사항',
1227
1349
  name: '국립고궁박물관 공지사항',
@@ -1727,6 +1849,26 @@ class AnalysisProvider {
1727
1849
  targetUrl: 'https://www.kaah.kr/ipcopen',
1728
1850
  minScore: 6,
1729
1851
  },
1852
+ {
1853
+ targetUrl: 'https://www.seamuse.go.kr/resources/academiccultural/list/1',
1854
+ minScore: 6,
1855
+ },
1856
+ {
1857
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1',
1858
+ minScore: 6,
1859
+ },
1860
+ {
1861
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab2',
1862
+ minScore: 6,
1863
+ },
1864
+ {
1865
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab3',
1866
+ minScore: 6,
1867
+ },
1868
+ {
1869
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab4',
1870
+ minScore: 6,
1871
+ },
1730
1872
  // Excavation report news: minimum score 2
1731
1873
  {
1732
1874
  targetUrl: 'https://www.e-minwon.go.kr/ge/ee/getListEcexmPrmsnAply.do',
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.js CHANGED
@@ -981,6 +981,86 @@ function getUniqIdFromNrichMajorEvent(element) {
981
981
  return ((element.attr('onclick') ?? '').match(/fnViewPage\('(.*)'\)/)?.[1] ?? '');
982
982
  }
983
983
 
984
+ const BASE_URL$1 = 'https://www.seamuse.go.kr';
985
+ /**
986
+ * Extracts the nttId from seamuse.go.kr detail page HTML.
987
+ * The page contains a JS init call like: noticeFunc.infoInit(4394)
988
+ * or og:url meta tag: https://www.seamuse.go.kr/news/notice/info/4394
989
+ */
990
+ const extractNttId = (html) => {
991
+ // Try og:url meta tag first
992
+ const ogUrlMatch = html.match(/property="og:url"\s+content="[^"]*\/info\/(\d+)"/);
993
+ if (ogUrlMatch) {
994
+ return ogUrlMatch[1];
995
+ }
996
+ // Fallback: JS init call pattern like infoInit(4394)
997
+ const initMatch = html.match(/\.infoInit\((\d+)\)/);
998
+ if (initMatch) {
999
+ return initMatch[1];
1000
+ }
1001
+ return '';
1002
+ };
1003
+ /**
1004
+ * Parses the list page from seamuse.go.kr (국립해양유산연구소).
1005
+ * The site uses client-side rendering — list data is fetched from a JSON API.
1006
+ * URL pattern: /news/notice/list/1 → API: POST /news/notice/listData/1
1007
+ *
1008
+ * @param listDataPath - API path segment (e.g., "/news/notice" or "/resources/academiccultural")
1009
+ * @param infoPathPrefix - Detail page path prefix (e.g., "/news/notice/info")
1010
+ */
1011
+ const parseSeamuseList = async (_html, listDataPath, infoPathPrefix, customFetch, searchCategory) => {
1012
+ const body = searchCategory ? `searchCategory=${searchCategory}` : '';
1013
+ const response = await (customFetch ?? fetch)(`${BASE_URL$1}${listDataPath}/listData/1`, {
1014
+ method: 'POST',
1015
+ headers: {
1016
+ 'Content-Type': 'application/x-www-form-urlencoded',
1017
+ },
1018
+ body,
1019
+ });
1020
+ const data = await response.json();
1021
+ const posts = [];
1022
+ for (const item of data.resultList) {
1023
+ posts.push({
1024
+ uniqId: String(item.nttId),
1025
+ title: item.nttSj?.trim() ?? '',
1026
+ date: item.frstRegisterPnttm ?? '',
1027
+ detailUrl: `${BASE_URL$1}${infoPathPrefix}/${item.nttId}`,
1028
+ dateType: DateType.REGISTERED,
1029
+ });
1030
+ }
1031
+ return posts;
1032
+ };
1033
+ /**
1034
+ * Parses the detail page from seamuse.go.kr.
1035
+ * The site uses client-side rendering — detail data is fetched from a JSON API.
1036
+ * URL pattern: /news/notice/info/4394 → API: GET /news/notice/infoData/4394?nttId=4394
1037
+ *
1038
+ * @param infoDataPath - API path segment (e.g., "/news/notice")
1039
+ */
1040
+ const parseSeamuseDetail = async (html, infoDataPath, customFetch) => {
1041
+ const nttId = extractNttId(html);
1042
+ if (!nttId) {
1043
+ return {
1044
+ detailContent: '',
1045
+ hasAttachedFile: false,
1046
+ hasAttachedImage: false,
1047
+ };
1048
+ }
1049
+ const response = await (customFetch ?? fetch)(`${BASE_URL$1}${infoDataPath}/infoData/${nttId}?nttId=${nttId}`, {
1050
+ method: 'GET',
1051
+ headers: {
1052
+ 'Content-Type': 'application/json',
1053
+ },
1054
+ });
1055
+ const data = await response.json();
1056
+ const content = data.result.nttCn ?? '';
1057
+ return {
1058
+ detailContent: new TurndownService().turndown(content),
1059
+ hasAttachedFile: (data.files?.length ?? 0) > 0,
1060
+ hasAttachedImage: content.includes('<img'),
1061
+ };
1062
+ };
1063
+
984
1064
  const LIST_API_URL = 'http://www.yngogo.or.kr/module/ntt/unity/selectNttListAjax.ink';
985
1065
  const DETAIL_API_URL = 'http://www.yngogo.or.kr/module/ntt/unity/selectNttDetailAjax.ink';
986
1066
  const BASE_URL = 'http://www.yngogo.or.kr';
@@ -1201,6 +1281,48 @@ function createCrawlingTargetGroups(customFetch) {
1201
1281
  parseList: parseNrichPortalList,
1202
1282
  parseDetail: parseNrichPortalDetail,
1203
1283
  },
1284
+ {
1285
+ id: '국립해양유산연구소_공지사항',
1286
+ name: '국립해양유산연구소 공지사항',
1287
+ url: 'https://www.seamuse.go.kr/news/notice/list/1',
1288
+ parseList: (html) => parseSeamuseList(html, '/news/notice', '/news/notice/info', customFetch),
1289
+ parseDetail: (html) => parseSeamuseDetail(html, '/news/notice', customFetch),
1290
+ },
1291
+ {
1292
+ id: '국립해양유산연구소_학술지',
1293
+ name: '국립해양유산연구소 학술지 해양유산연구',
1294
+ url: 'https://www.seamuse.go.kr/resources/academiccultural/list/1',
1295
+ parseList: (html) => parseSeamuseList(html, '/resources/academiccultural', '/resources/academiccultural/info', customFetch),
1296
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academiccultural', customFetch),
1297
+ },
1298
+ {
1299
+ id: '국립해양유산연구소_학술보고서_수중유산조사',
1300
+ name: '국립해양유산연구소 학술보고서 수중유산 조사',
1301
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1',
1302
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT001'),
1303
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1304
+ },
1305
+ {
1306
+ id: '국립해양유산연구소_학술보고서_수중유산보존',
1307
+ name: '국립해양유산연구소 학술보고서 수중유산 보존',
1308
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab2',
1309
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT002'),
1310
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1311
+ },
1312
+ {
1313
+ id: '국립해양유산연구소_학술보고서_전통선박',
1314
+ name: '국립해양유산연구소 학술보고서 전통 선박',
1315
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab3',
1316
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT003'),
1317
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1318
+ },
1319
+ {
1320
+ id: '국립해양유산연구소_학술보고서_해양문화역사',
1321
+ name: '국립해양유산연구소 학술보고서 해양문화역사',
1322
+ url: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab4',
1323
+ parseList: (html) => parseSeamuseList(html, '/resources/academicreport', '/resources/academicreport/info', customFetch, 'ACARPT004'),
1324
+ parseDetail: (html) => parseSeamuseDetail(html, '/resources/academicreport', customFetch),
1325
+ },
1204
1326
  {
1205
1327
  id: '국립고궁박물관_공지사항',
1206
1328
  name: '국립고궁박물관 공지사항',
@@ -1706,6 +1828,26 @@ class AnalysisProvider {
1706
1828
  targetUrl: 'https://www.kaah.kr/ipcopen',
1707
1829
  minScore: 6,
1708
1830
  },
1831
+ {
1832
+ targetUrl: 'https://www.seamuse.go.kr/resources/academiccultural/list/1',
1833
+ minScore: 6,
1834
+ },
1835
+ {
1836
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1',
1837
+ minScore: 6,
1838
+ },
1839
+ {
1840
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab2',
1841
+ minScore: 6,
1842
+ },
1843
+ {
1844
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab3',
1845
+ minScore: 6,
1846
+ },
1847
+ {
1848
+ targetUrl: 'https://www.seamuse.go.kr/resources/academicreport/list/1#tab4',
1849
+ minScore: 6,
1850
+ },
1709
1851
  // Excavation report news: minimum score 2
1710
1852
  {
1711
1853
  targetUrl: 'https://www.e-minwon.go.kr/ge/ee/getListEcexmPrmsnAply.do',
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@heripo/research-radar",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "3.2.0",
5
+ "version": "3.3.1",
6
6
  "description": "AI-driven intelligence for Korean cultural heritage. This package serves as both a ready-to-use newsletter service and a practical implementation example for the LLM-Newsletter-Kit.",
7
7
  "main": "dist/index.cjs",
8
8
  "module": "dist/index.js",
@@ -47,12 +47,12 @@
47
47
  "author": "kimhongyeon",
48
48
  "license": "Apache-2.0",
49
49
  "dependencies": {
50
- "@ai-sdk/anthropic": "^3.0.58",
51
- "@ai-sdk/google": "^3.0.43",
52
- "@ai-sdk/openai": "^3.0.41",
50
+ "@ai-sdk/anthropic": "^3.0.63",
51
+ "@ai-sdk/google": "^3.0.52",
52
+ "@ai-sdk/openai": "^3.0.47",
53
53
  "cheerio": "^1.2.0",
54
54
  "dompurify": "^3.3.3",
55
- "jsdom": "^29.0.0",
55
+ "jsdom": "^29.0.1",
56
56
  "juice": "^11.1.1",
57
57
  "safe-markdown2html": "^1.0.1",
58
58
  "turndown": "^7.2.2"
@@ -62,19 +62,19 @@
62
62
  },
63
63
  "devDependencies": {
64
64
  "@eslint/js": "^10.0.1",
65
- "@llm-newsletter-kit/core": "^1.3.7",
65
+ "@llm-newsletter-kit/core": "^1.3.8",
66
66
  "@trivago/prettier-plugin-sort-imports": "^6.0.2",
67
67
  "@types/express": "^5.0.6",
68
- "@types/jsdom": "^28.0.0",
68
+ "@types/jsdom": "^28.0.1",
69
69
  "@types/node": "^25.5.0",
70
70
  "@types/turndown": "^5.0.6",
71
- "eslint": "^10.0.3",
71
+ "eslint": "^10.1.0",
72
72
  "eslint-plugin-unused-imports": "^4.4.1",
73
73
  "express": "^5.2.1",
74
74
  "prettier": "^3.8.1",
75
75
  "rimraf": "^6.1.3",
76
- "rollup": "^4.59.0",
77
- "rollup-plugin-dts": "^6.4.0",
76
+ "rollup": "^4.60.0",
77
+ "rollup-plugin-dts": "^6.4.1",
78
78
  "rollup-plugin-typescript2": "^0.36.0",
79
79
  "tsx": "^4.21.0",
80
80
  "typescript": "^5.9.3",