diff --git a/components/search/onesearch/handleNLUResult.ts b/components/search/onesearch/handleNLUResult.ts new file mode 100644 index 0000000..0feaeeb --- /dev/null +++ b/components/search/onesearch/handleNLUResult.ts @@ -0,0 +1,42 @@ +import { suggestionItem } from "@/global"; +import { findClosestDateIndex } from "@/lib/weather/getCurrentWeather"; +import { getLocationNative } from "@/lib/weather/getLocation"; +import { getWeather } from "@/lib/weather/getWeather"; +import { WMOCodeTable } from "@/lib/weather/wmocode"; + +type UpdateSuggestionFunction = (data: suggestionItem[]) => void; + +export function handleNLUResult(result: any, updateSuggestion: UpdateSuggestionFunction){ + if (result.intent == "weather.summary") { + getLocationNative((data: GeolocationCoordinates | GeolocationPositionError) => { + console.log(data); + if (data instanceof GeolocationCoordinates) { + getWeather(data.latitude, data.longitude).then((weather) => { + console.log(weather["hourly"]); + let hourIndex = findClosestDateIndex( + weather["hourly"]["time"], + weather["utc_offset_seconds"] + ); + let temp = weather["hourly"]["apparent_temperature"][hourIndex]; + let weatherCode = weather["hourly"]["weather_code"][hourIndex]; + console.log(temp, weatherCode, hourIndex); + updateSuggestion([ + { + type: "text", + suggestion: `Weather: ${temp}${weather["hourly_units"]["apparent_temperature"]}, ${WMOCodeTable[weatherCode]["day"].description}`, + relevance: 3000 * result.score + } + ]); + }); + } + }); + } else if (result.intent !== "None") { + updateSuggestion([ + { + type: "text", + suggestion: result.intent, + relevance: 2200 * result.score + } + ]); + } +} \ No newline at end of file diff --git a/components/search/onesearch/onesearch.tsx b/components/search/onesearch/onesearch.tsx index 2ebaa8c..1326e80 100644 --- a/components/search/onesearch/onesearch.tsx +++ b/components/search/onesearch/onesearch.tsx @@ -11,12 +11,19 @@ import validLink from "@/lib/url/validLink"; import Link from "./link"; import { selectedSuggestionState } from "@/components/state/suggestionSelection"; import { settingsState } from "@/components/state/settings"; -import { base64NLP } from "@/lib/onesearch/baseCheck"; import PlainText from "./plainText"; import { sendError } from "@/lib/telemetering/sendError"; +import { NLU } from "@/lib/nlp/load"; +import { getLocationNative } from "@/lib/weather/getLocation"; +import { getWeather } from "@/lib/weather/getWeather"; +import { findClosestDateIndex, getClosestHourTimestamp } from "@/lib/weather/getCurrentWeather"; +import { WMOCodeTable } from "@/lib/weather/wmocode"; +import { handleNLUResult } from "./handleNLUResult"; export default function () { const [suggestion, setFinalSuggetsion] = useRecoilState(suggestionsState); + const [location, setLocation] = useState(null); + const [manager, setManager] = useState(null); const lastRequestTimeRef = useRef(0); const selected = useRecoilValue(selectedSuggestionState); const settings = useRecoilValue(settingsState); @@ -78,6 +85,15 @@ export default function () { }); } + const NLUModel = new NLU(); + + useEffect(() => { + NLUModel.init().then((nlu) => { + setManager(nlu.manager); + console.log(nlu.manager); + }); + }, []); + useEffect(() => { cleanSuggestion("default-link", "default", "text"); if (validLink(query)) { @@ -94,9 +110,13 @@ export default function () { } ]); } - const b64 = base64NLP(query); - if (b64.suggestion !== null) { - updateSuggestion([b64 as suggestionItem]); + + if (manager != null) { + // @ts-ignore + manager.process(query).then((result) => { + console.log(result); + handleNLUResult(result, updateSuggestion); + }); } }, [query, engineName]); diff --git a/lib/nlp/base.ts b/lib/nlp/base.ts index c8abaf2..5e38b79 100644 --- a/lib/nlp/base.ts +++ b/lib/nlp/base.ts @@ -1,19 +1,32 @@ import { NLPResult } from "../onesearch/NLPResult"; import { stopwords } from "./stopwords"; -class NLP { +export class NLP { result: NLPResult; constructor( public query: String, - public task: String + public task: String, + public intentionKeywords?: String[], ) { this.result = new NLPResult(); } - public removeStopwords(str: string, extraStopwords: string[] = [], disableDefault: boolean = false){ + public removeStopwords(extraStopwords: string[] = [], disableDefault: boolean = false){ const list = disableDefault ? extraStopwords : stopwords.concat(extraStopwords); - for (let word of list){ - str = str.replace(new RegExp(`\\b${word}\\b`, 'gi'), ''); + if (list.includes(this.query.trim())) { + this.query = ""; } - return str; + for (let word of list){ + this.query = this.query.replace(new RegExp(`\\b${word}\\b`, 'gi'), ''); + } + } + public extractSlots(str: string, useNER = false): string[]{ + const slots: string[] = []; + + return slots; + } + public trim() { + this.query = this.query.trim(); + const wordList = this.query.split(" ").filter(word => word !== ""); + this.query = wordList.join(" "); } } \ No newline at end of file diff --git a/lib/nlp/data/en.json b/lib/nlp/data/en.json new file mode 100644 index 0000000..98e17dc --- /dev/null +++ b/lib/nlp/data/en.json @@ -0,0 +1,134 @@ +{ + "weather.summary": [ + "how's the weather", + "What's going on with the weather?", + "Can you give me an update on the weather?", + "How's the forecast looking today?", + "Give me a summary of the current weather.", + "Can you tell me the current weather?", + "What is the weather situation at the moment?", + "Could you provide a quick weather update?", + "Is it raining or sunny outside?", + "What's the weather like right now?", + "Tell me the current weather conditions.", + "How about the weather today?", + "Is it a good day to be outside?", + "What should I expect in terms of weather today?", + "Is there any severe weather to be aware of?", + "Can you summarize today's weather forecast?", + "What's the weather looking like for the next few hours?", + "Is it going to stay this way all day?", + "Could you give me a brief overview of the weather?", + "What's the general weather situation in our area?", + "Is it cloudy or clear outside?", + "Any weather alerts I should know about?", + "How's the weather looking for outdoor activities?", + "What's the forecast saying for today's weather?", + "Is it going to be a warm day?", + "Are we expecting any storms today?", + "What's the weather condition outside my window?", + "Is it a typical day for this season in terms of weather?", + "how's the weather now?" + ], + + "weather.temp": [ + "What's the temperature like right now?", + "Can you tell me the current temperature?", + "How hot is it outside?", + "What's the temperature supposed to be today?", + "What is the current temp outside?", + "Could you tell me the outdoor temperature?", + "Is it cold or warm outside?", + "What's the high temperature for today?", + "What's the low temperature expected tonight?", + "How does the temperature feel outside?", + "Is it going to get warmer or cooler today?", + "What's the temperature in the shade?", + "Can you provide the current temp in Celsius?", + "What's the temperature in Fahrenheit right now?", + "Is it too hot to be outside?", + "What's the temperature like in the morning?", + "How about the temperature in the evening?", + "Is it warm enough to go swimming?", + "What's the temperature in the city center?", + "Can you tell me the temp in the nearby area?", + "Is it below freezing outside?", + "What's the average temperature for today?", + "Is the temperature dropping or rising?", + "What should I wear considering the temperature?" + ], + + "base64.encode": [ + "Please encode this data with base64: %s", + "I need to encode the following data in base64: %s", + "Could you encode this string using base64? %s", + "Convert this data to b64 encoding: %s", + "I want to encode this information with base64: %s", + "Help me encode this in base64: %s", + "Can you encode this data to base64 format? %s", + "b64 encode", + "base64 encode", + "encode base64 %s" + ], + + "base64.decode": [ + "Please decode this base64 data: %s", + "I have a base64 encoded string that needs decoding: %s", + "Could you decode this base64 string for me? %s", + "Convert this base64 encoded data back to its original form: %s", + "I need to decode this base64 information: %s", + "Help me decode this base64 data: %s", + "Can you translate this base64 back to normal text? %s", + "b64 decode", + "base64 decode", + "decode base64 %s" + ], + + "url.encode": [ + "Please encode this URL: %s", + "I need to encode this URL component: %s", + "Could you encode this part of the URL? %s", + "Convert this URL to its encoded form: %s", + "I want to encode this URL for safe transmission: %s", + "Help me encode this URL segment: %s", + "Can you encode this URL data? %s" + ], + + "url.decode": [ + "Please decode this URL: %s", + "I have an encoded URL that needs decoding: %s", + "Could you decode this URL for me? %s", + "Convert this encoded URL back to its original form: %s", + "I need to decode this URL component: %s", + "Help me decode this URL segment: %s", + "Can you translate this encoded URL back to normal? %s" + ], + + "html.encode": [ + "Please encode this HTML entity: %s", + "I need to encode this text to HTML entity: %s", + "Could you encode this as an HTML entity? %s", + "Convert this text to HTML entity encoding: %s", + "I want to encode this to prevent HTML interpretation: %s", + "Help me encode this into HTML entity: %s", + "Can you encode this for HTML usage? %s" + ], + + "html.decode": [ + "Please decode this HTML entity: %s", + "I have an HTML entity that needs decoding: %s", + "Could you decode this HTML entity for me? %s", + "Convert this HTML entity back to its original text: %s", + "I need to decode this HTML entity to plain text: %s", + "Help me decode this HTML entity: %s", + "Can you translate this HTML entity back to normal text? %s" + ], + + "None": [ + "free weather api", + "js get timezone", + "how", + "how's", + "how's the" + ] +} diff --git a/lib/nlp/data/zh.json b/lib/nlp/data/zh.json new file mode 100644 index 0000000..09cdf11 --- /dev/null +++ b/lib/nlp/data/zh.json @@ -0,0 +1,124 @@ +{ + "weather.summary": [ + "天气如何", + "现在的天气", + "今天的天气预报", + "现在的天气状况", + "今天天气怎么样", + "目前是什么天气", + "今天的天气概述", + "当前天气状况如何", + "今天会下雨吗", + "今天会下雪吗", + "今天晴天吗", + "今天的天气状况如何", + "现在外面是什么天气", + "今天天气好么", + "今天适合外出吗", + "今天的天气适宜做什么", + "今天有没有雾霾", + "今天的空气质量如何", + "今天的紫外线指数是多少", + "今天有没有大风", + "今天会不会很冷", + "今天的天气会变化吗", + "今天晚上的天气如何", + "今天夜里会下雨吗", + "今天的天气对出行有影响吗", + "今天的天气对运动有影响吗", + "今天的天气对工作有影响吗", + "今天的天气对旅游有影响吗", + "今天的天气对健康有影响吗" + ], + "weather.temp": [ + "现在的温度", + "现在多少度", + "外面有多热", + "明天热不热?", + "现在的气温是多少", + "今天最高温度是多少", + "今天最低温度是多少", + "现在外面感觉冷吗", + "现在需要穿外套吗", + "现在适合穿短袖吗", + "现在的温度适合外出吗", + "现在的温度适合运动吗", + "现在的温度适合睡觉吗", + "明天会比今天热吗", + "明天会比今天冷吗", + "今天的温度变化大吗", + "现在的温度适合开空调吗", + "现在的温度适合开暖气吗", + "室外的温度是多少", + "室内的温度是多少", + "现在的温度适合种植吗", + "现在的温度适合养宠物吗", + "现在的温度对健康有影响吗", + "现在的温度是否舒适", + "现在的温度是否适合工作" + ], + "base64.encode": [ + "请将数据使用base64编码:%s", + "需要将以下数据base64编码:%s", + "请将此字符串转为base64:%s", + "将数据转为base64编码:%s", + "信息base64编码:%s", + "请帮忙编码base64:%s", + "将数据编码为base64:%s" + ], + + "base64.decode": [ + "请解码这个base64数据:%s", + "有base64编码字符串需要解码:%s", + "帮忙解码base64:%s", + "将base64编码转回原数据:%s", + "解码base64信息:%s", + "解码这个base64:%s", + "将base64转文本:%s" + ], + + "url.encode": [ + "请编码这个URL:%s", + "URL部分需要编码:%s", + "请将URL部分编码:%s", + "URL编码转换:%s", + "安全传输需编码URL:%s", + "编码URL段:%s", + "URL数据编码:%s" + ], + + "url.decode": [ + "请解码这个URL:%s", + "有URL编码需要解码:%s", + "解码这个URL:%s", + "URL编码转回原URL:%s", + "解码URL部分:%s", + "解码URL段:%s", + "URL编码转文本:%s" + ], + + "html.encode": [ + "请编码HTML实体:%s", + "文本转为HTML实体:%s", + "编码为HTML实体:%s", + "文本HTML实体编码:%s", + "预防HTML解析编码:%s", + "HTML实体编码:%s", + "文本HTML使用编码:%s" + ], + + "html.decode": [ + "请解码HTML实体:%s", + "HTML实体需要解码:%s", + "解码HTML实体:%s", + "HTML实体转回文本:%s", + "HTML实体解码:%s", + "解码HTML实体:%s", + "HTML实体转文本:%s" + ], + + "None": [ + "你好", + "为什么计算机使用二进制" + ] +} diff --git a/lib/nlp/load.ts b/lib/nlp/load.ts new file mode 100644 index 0000000..63d0517 --- /dev/null +++ b/lib/nlp/load.ts @@ -0,0 +1,55 @@ +// @ts-ignore +import { containerBootstrap } from "@nlpjs/core"; +// @ts-ignore +import { Nlp } from "@nlpjs/nlp"; +// @ts-ignore +import { NluManager, NluNeural } from "@nlpjs/nlu"; +// @ts-ignore +import { LangEn } from "@nlpjs/lang-en-min"; +// @ts-ignore +import { LangZh } from "@nlpjs/lang-zh"; +import * as fflate from 'fflate'; + +let zh: TrainData = {}; +let en: TrainData = {}; + +type TrainData = { + [key: string]: string[]; +}; + +export class NLU { + manager: any; + inited: boolean = false; + async loadIntentionModel() { + const container = await containerBootstrap(); + container.use(Nlp); + container.use(LangEn); + container.use(LangZh); + container.use(NluNeural); + const manager = new NluManager({ + container, + locales: ["en", "zh"], + nlu: { + useNoneFeature: true + } + }); + const response = await fetch("/model"); + + const responseBuf = await response.arrayBuffer(); + const compressed = new Uint8Array(responseBuf); + const decompressed = fflate.decompressSync(compressed); + const modelText = fflate.strFromU8(decompressed); + manager.fromJSON(JSON.parse(modelText)); + this.manager = manager; + // console.log(this.manager); + } + async init() { + await this.loadIntentionModel(); + this.inited = true; + return this; + } + async process(lang: string, text: string): Promise { + const actual = await this.manager.process(lang, text); + return actual; + } +} \ No newline at end of file diff --git a/lib/nlp/stopwords.ts b/lib/nlp/stopwords.ts index 0276f3a..692301a 100644 --- a/lib/nlp/stopwords.ts +++ b/lib/nlp/stopwords.ts @@ -1 +1,3 @@ -export const stopwords = ["a","about","above","after","again","against","all","am","an","and","any","are","aren't","as","at","be","because","been","before","being","below","between","both","but","by","can't","cannot","could","couldn't","did","didn't","do","does","doesn't","doing","don't","down","during","each","few","for","from","further","had","hadn't","has","hasn't","have","haven't","having","he","he'd","he'll","he's","her","here","here's","hers","herself","him","himself","his","how","how's","i","i'd","i'll","i'm","i've","if","in","into","is","isn't","it","it's","its","itself","let's","me","more","most","mustn't","my","myself","no","nor","not","of","off","on","once","only","or","other","ought","our","ours ourselves","out","over","own","same","shan't","she","she'd","she'll","she's","should","shouldn't","so","some","such","than","that","that's","the","their","theirs","them","themselves","then","there","there's","these","they","they'd","they'll","they're","they've","this","those","through","to","too","under","until","up","very","was","wasn't","we","we'd","we'll","we're","we've","were","weren't","what","what's","when","when's","where","where's","which","while","who","who's","whom","why","why's","with","won't","would","wouldn't","you","you'd","you'll","you're","you've","your","yours","yourself","yourselves"]; \ No newline at end of file +export const stopwords = ["a","about","above","after","again","against","all","am","an","and","any","are","aren't","as","at","be","because","been","before","being","below","between","both","but","by","can't","cannot","could","couldn't","did","didn't","do","does","doesn't","doing","don't","down","during","each","few","for","from","further","had","hadn't","has","hasn't","have","haven't","having","he","he'd","he'll","he's","her","here","here's","hers","herself","him","himself","his","how","how's","i","i'd","i'll","i'm","i've","if","in","into","is","isn't","it","it's","its","itself","let's","me","more","most","mustn't","my","myself","no","nor","not","of","off","on","once","only","or","other","ought","our","ours","ourselves","out","over","own","please","same","shan't","she","she'd","she'll","she's","should","shouldn't","so","some","such","than","that","that's","the","their","theirs","them","themselves","then","there","there's","these","they","they'd","they'll","they're","they've","this","those","through","to","too","under","until","up","very","was","wasn't","we","we'd","we'll","we're","we've","were","weren't","what","what's","when","when's","where","where's","which","while","who","who's","whom","why","why's","with","won't","would","wouldn't","you","you'd","you'll","you're","you've","your","yours","yourself","yourselves"]; + +export const convertStopwords = ["transform", "change", "translate", "convert"]; \ No newline at end of file diff --git a/lib/nlp/train.ts b/lib/nlp/train.ts new file mode 100644 index 0000000..21f6972 --- /dev/null +++ b/lib/nlp/train.ts @@ -0,0 +1,76 @@ +// @ts-ignore +import { containerBootstrap } from "@nlpjs/core"; +// @ts-ignore +import { Nlp } from "@nlpjs/nlp"; +// @ts-ignore +import { NluManager, NluNeural } from "@nlpjs/nlu"; +// @ts-ignore +import { LangEn } from "@nlpjs/lang-en-min"; +// @ts-ignore +import { LangZh } from "@nlpjs/lang-zh"; +import fs from "node:fs"; +import * as fflate from 'fflate'; + +let zh: TrainData = {}; +let en: TrainData = {}; + +type TrainData = { + [key: string]: string[]; +}; + +export async function trainIntentionModel() { + try { + const dataZH = fs.readFileSync("./lib/nlp/data/zh.json", "utf8"); + const dataEN = fs.readFileSync("./lib/nlp/data/en.json", "utf8"); + zh = JSON.parse(dataZH); + en = JSON.parse(dataEN); + } catch (err) { + console.error(err); + } + + const container = await containerBootstrap(); + container.use(Nlp); + container.use(LangEn); + container.use(LangZh); + container.use(NluNeural); + const manager = new NluManager({ + container, + locales: ["en", "zh"], + nlu: { + useNoneFeature: true + } + }); + // Adds the utterances and intents for the NLP + + for (const key in zh) { + for (const value of zh[key]) { + manager.add("zh", value, key); + } + } + + for (const key in en) { + for (const value of en[key]) { + manager.add("en", value, key); + } + } + + await manager.train(); + + // let actual = await manager.process("en", "base64 decode bilibili"); + // console.log(actual); + // let actualZH = await manager.process("zh", "去除百分号"); + // console.log(actualZH); + + const resultModel = manager.toJSON(); + + const buf = fflate.strToU8(JSON.stringify(resultModel)); + + const gzipped = fflate.gzipSync(buf, { + filename: 'model.json', + mtime: new Date().getTime() + }); + + fs.writeFileSync("./public/model", Buffer.from(gzipped)); +} + +trainIntentionModel(); diff --git a/lib/version.ts b/lib/version.ts index c478eac..e394c32 100644 --- a/lib/version.ts +++ b/lib/version.ts @@ -1,3 +1,3 @@ -export const SPARKHOME_VERSION="4.14.3"; -export const CLIENT_VERSION="4.14.2"; +export const SPARKHOME_VERSION="4.17.0"; +export const CLIENT_VERSION="4.17.0"; export const NEXT_API_VERSION="4.14.3"; \ No newline at end of file diff --git a/lib/weather/getCurrentWeather.ts b/lib/weather/getCurrentWeather.ts new file mode 100644 index 0000000..b762862 --- /dev/null +++ b/lib/weather/getCurrentWeather.ts @@ -0,0 +1,39 @@ +export function getClosestHourTimestamp(): string { + const now = new Date(); + now.setMinutes(0, 0, 0); // 设置分钟、秒和毫秒为0 + + // 获取本地时间的年份、月份、日期、小时 + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始 + const day = String(now.getDate()).padStart(2, '0'); + const hour = String(now.getHours()).padStart(2, '0'); + + // 拼接成所需的格式 + const localHourTimestamp = `${year}-${month}-${day}T${hour}:00`; + + return localHourTimestamp; +} + +export function findClosestDateIndex(dates: string[], utc_offset_seconds: number): number { + const now = new Date(); + const nowTimestamp = now.getTime(); + const offsetMilliseconds = utc_offset_seconds * 1000; + + let closestIndex = -1; + let closestDiff = Infinity; + + for (let i = 0; i < dates.length; i++) { + const date = new Date(dates[i]); + const adjustedTimestamp = date.getTime(); + + if (adjustedTimestamp <= nowTimestamp) { + const diff = nowTimestamp - adjustedTimestamp; + if (diff < closestDiff) { + closestDiff = diff; + closestIndex = i; + } + } + } + + return closestIndex; +} \ No newline at end of file diff --git a/lib/weather/getLocation.ts b/lib/weather/getLocation.ts new file mode 100644 index 0000000..93774cc --- /dev/null +++ b/lib/weather/getLocation.ts @@ -0,0 +1,17 @@ +const options = { + enableHighAccuracy: true, + timeout: 10000, + maximumAge: 3600 +}; + +export function getLocationNative(callback: Function) { + navigator.geolocation.getCurrentPosition( + (pos: GeolocationPosition) => { + callback(pos.coords); + }, + (err: GeolocationPositionError) => { + callback(err); + }, + options + ); +} diff --git a/lib/weather/getWeather.ts b/lib/weather/getWeather.ts new file mode 100644 index 0000000..b9cc28c --- /dev/null +++ b/lib/weather/getWeather.ts @@ -0,0 +1,23 @@ +export async function getWeather(lat: number, lon: number) { + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const cacheKey = `weather-cache-${lat.toFixed(2)}-${lon.toFixed(2)}-${timezone}`; + const localData = localStorage.getItem(cacheKey); + if (localData != null) { + console.log('Using cache'); + const parsedLocalData = JSON.parse(localData); + if (parsedLocalData["hourly"]["time"][0] != undefined && + new Date().getTime() - new Date(parsedLocalData["hourly"]["time"][0]).getTime() < 86400 * 1000 + ) { + return parsedLocalData; + } + else { + console.log('Cache expired'); + localStorage.removeItem(cacheKey); + } + } + const url = `https://api.open-meteo.com/v1/cma?latitude=${lat.toString()}&longitude=${lon.toString()}&hourly=apparent_temperature,precipitation,weather_code&timezone=${encodeURIComponent(timezone)}&forecast_days=1`; + const response = await fetch(url); + const responseJson = await response.json(); + localStorage.setItem(cacheKey, JSON.stringify(responseJson)); + return responseJson; +} \ No newline at end of file diff --git a/lib/weather/wmocode.ts b/lib/weather/wmocode.ts new file mode 100644 index 0000000..d852747 --- /dev/null +++ b/lib/weather/wmocode.ts @@ -0,0 +1,294 @@ +type WeatherInfo = { + description: string; + image: string; +}; + +type WMOCodeTable = { + [key: string]: { + day: WeatherInfo; + night: WeatherInfo; + }; +}; + +export let WMOCodeTable: WMOCodeTable = { + "0": { + day: { + description: "Sunny", + image: "http://openweathermap.org/img/wn/01d@2x.png" + }, + night: { + description: "Clear", + image: "http://openweathermap.org/img/wn/01n@2x.png" + } + }, + "1": { + day: { + description: "Mainly Sunny", + image: "http://openweathermap.org/img/wn/01d@2x.png" + }, + night: { + description: "Mainly Clear", + image: "http://openweathermap.org/img/wn/01n@2x.png" + } + }, + "2": { + day: { + description: "Partly Cloudy", + image: "http://openweathermap.org/img/wn/02d@2x.png" + }, + night: { + description: "Partly Cloudy", + image: "http://openweathermap.org/img/wn/02n@2x.png" + } + }, + "3": { + day: { + description: "Cloudy", + image: "http://openweathermap.org/img/wn/03d@2x.png" + }, + night: { + description: "Cloudy", + image: "http://openweathermap.org/img/wn/03n@2x.png" + } + }, + "45": { + day: { + description: "Foggy", + image: "http://openweathermap.org/img/wn/50d@2x.png" + }, + night: { + description: "Foggy", + image: "http://openweathermap.org/img/wn/50n@2x.png" + } + }, + "48": { + day: { + description: "Rime Fog", + image: "http://openweathermap.org/img/wn/50d@2x.png" + }, + night: { + description: "Rime Fog", + image: "http://openweathermap.org/img/wn/50n@2x.png" + } + }, + "51": { + day: { + description: "Light Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Light Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "53": { + day: { + description: "Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "55": { + day: { + description: "Heavy Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Heavy Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "56": { + day: { + description: "Light Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Light Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "57": { + day: { + description: "Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "61": { + day: { + description: "Light Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Light Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "63": { + day: { + description: "Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "65": { + day: { + description: "Heavy Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Heavy Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "66": { + day: { + description: "Light Freezing Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Light Freezing Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "67": { + day: { + description: "Freezing Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Freezing Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "71": { + day: { + description: "Light Snow", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Light Snow", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "73": { + day: { + description: "Snow", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Snow", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "75": { + day: { + description: "Heavy Snow", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Heavy Snow", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "77": { + day: { + description: "Snow Grains", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Snow Grains", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "80": { + day: { + description: "Light Showers", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Light Showers", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "81": { + day: { + description: "Showers", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Showers", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "82": { + day: { + description: "Heavy Showers", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Heavy Showers", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "85": { + day: { + description: "Light Snow Showers", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Light Snow Showers", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "86": { + day: { + description: "Snow Showers", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Snow Showers", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "95": { + day: { + description: "Thunderstorm", + image: "http://openweathermap.org/img/wn/11d@2x.png" + }, + night: { + description: "Thunderstorm", + image: "http://openweathermap.org/img/wn/11n@2x.png" + } + }, + "96": { + day: { + description: "Light Thunderstorms With Hail", + image: "http://openweathermap.org/img/wn/11d@2x.png" + }, + night: { + description: "Light Thunderstorms With Hail", + image: "http://openweathermap.org/img/wn/11n@2x.png" + } + }, + "99": { + day: { + description: "Thunderstorm With Hail", + image: "http://openweathermap.org/img/wn/11d@2x.png" + }, + night: { + description: "Thunderstorm With Hail", + image: "http://openweathermap.org/img/wn/11n@2x.png" + } + } +}; diff --git a/package.json b/package.json index 48ab966..dbe8f46 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "sparkhome", - "version": "4.10.2", + "version": "4.17.0", "private": false, "scripts": { "dev": "next dev", "build": "next build", + "build:NLP": "tsx ./lib/nlp/train.ts", "start": "next start", "lint": "next lint", "test": "jest", @@ -14,11 +15,19 @@ }, "dependencies": { "@nextui-org/react": "^2.3.6", + "@nlpjs/basic": "^4.27.0", + "@nlpjs/builtin-compromise": "^4.26.1", + "@nlpjs/core": "^4.26.1", + "@nlpjs/lang-en-min": "^4.26.1", + "@nlpjs/lang-zh": "^4.26.1", + "@nlpjs/nlp": "^4.27.0", "clsx": "^2.1.1", + "fflate": "^0.8.2", "framer-motion": "^11.1.7", "next": "14.1.4", "next-intl": "^3.12.0", "next-themes": "^0.3.0", + "openmeteo": "^1.1.4", "pino": "^9.0.0", "punycode": "^2.3.1", "react": "^18.3.0", @@ -26,7 +35,6 @@ "recoil": "^0.7.7", "search-engine-autocomplete": "^0.4.3", "tailwind-merge": "^2.3.0", - "ts-node": "^10.9.2", "unicode-encode": "^1.4.2", "valid-url": "^1.0.9", "validate-color": "^2.2.4" @@ -48,6 +56,7 @@ "postcss": "^8.4.38", "tailwindcss": "^3.4.3", "ts-jest": "^29.1.2", + "tsx": "^4.15.6", "typescript": "^5.4.5", "vitepress": "^1.2.3", "vue": "^3.4.29" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d807500..0ddf7e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,30 @@ importers: '@nextui-org/react': specifier: ^2.3.6 version: 2.3.6(@types/react@18.3.0)(framer-motion@11.1.7(react-dom@18.3.0(react@18.3.0))(react@18.3.0))(react-dom@18.3.0(react@18.3.0))(react@18.3.0)(tailwind-variants@0.2.1(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))) + '@nlpjs/basic': + specifier: ^4.27.0 + version: 4.27.0 + '@nlpjs/builtin-compromise': + specifier: ^4.26.1 + version: 4.26.1 + '@nlpjs/core': + specifier: ^4.26.1 + version: 4.26.1 + '@nlpjs/lang-en-min': + specifier: ^4.26.1 + version: 4.26.1 + '@nlpjs/lang-zh': + specifier: ^4.26.1 + version: 4.26.1 + '@nlpjs/nlp': + specifier: ^4.27.0 + version: 4.27.0 clsx: specifier: ^2.1.1 version: 2.1.1 + fflate: + specifier: ^0.8.2 + version: 0.8.2 framer-motion: specifier: ^11.1.7 version: 11.1.7(react-dom@18.3.0(react@18.3.0))(react@18.3.0) @@ -26,6 +47,9 @@ importers: next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + openmeteo: + specifier: ^1.1.4 + version: 1.1.4 pino: specifier: ^9.0.0 version: 9.0.0 @@ -47,9 +71,6 @@ importers: tailwind-merge: specifier: ^2.3.0 version: 2.3.0 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) unicode-encode: specifier: ^1.4.2 version: 1.4.2 @@ -108,6 +129,9 @@ importers: ts-jest: specifier: ^29.1.2 version: 29.1.2(@babel/core@7.24.4)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.4))(jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(typescript@5.4.5) + tsx: + specifier: ^4.15.6 + version: 4.15.6 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -1224,6 +1248,69 @@ packages: react: '>=18' react-dom: '>=18' + '@nlpjs/basic@4.27.0': + resolution: {integrity: sha512-AL03Xdf2H1leAkWfjVwjm8SqeEj9M7ZBHoKC16sSd2SGgQN24YwZFpRyySW2vvDfHLHk8LkFu0+Efw9LdADz4A==} + + '@nlpjs/builtin-compromise@4.26.1': + resolution: {integrity: sha512-wc4tN0NIyfjMyRt1qpU+A4i6hIdtg92ZlfIgzx1q67sZJ+jMp0EQU2slokqFSRK1m4+WT9jAsbd/nrUan3oWlA==} + + '@nlpjs/connector@4.26.1': + resolution: {integrity: sha512-VCNoZpuKXoaQPT9djrEnpGDRFCYs8LBCeV/f4u0waaKM2VVp6OdLDCYV9RDQ7MK+VOsZhvDfPa2kuoixRE4srA==} + + '@nlpjs/console-connector@4.26.1': + resolution: {integrity: sha512-gktzTvDVAUzq5N/JTBZ5gMa8DhG4lV9rXOONIuuivo4Ze8jP/JdcenK1WQoisV/XnI7uMjnYhVnSB4wY7IizSA==} + + '@nlpjs/core-loader@4.26.1': + resolution: {integrity: sha512-IiRtn65bdiUSQHy2kusco2fmhk39u2Mc2c5Fsm9+9EVG6BtJCmVEFU/btAzGDAmxEA/E4qKecaAT4LvcW6TPbA==} + + '@nlpjs/core@4.26.1': + resolution: {integrity: sha512-M/PeFddsi3y7Z1piFJxsLGm5/xdMhcrpOsml7s6CTEgYo8iduaT30HDd61tZxDyvvJseU6uFqlXSn7XKkAcC1g==} + + '@nlpjs/evaluator@4.26.1': + resolution: {integrity: sha512-WeUrC8qq7+V8Jhkkjc2yiXdzy9V0wbETv8/qasQmL0QmEuwBDJF+fvfl4z2vWpBb0vW07A8aNrFElKELzbpkdg==} + + '@nlpjs/lang-en-min@4.26.1': + resolution: {integrity: sha512-1sJZ7dy7ysqzbsB8IklguvB88J8EPIv4XGVkZCcwecKtOw+fp5LAsZ3TJVmEf18iK1gD4cEGr7qZg5fpPxTpWQ==} + + '@nlpjs/lang-en@4.26.1': + resolution: {integrity: sha512-GVoJpOjyk5TtBAqo/fxsiuuH7jXycyakGT0gw5f01u9lOmUnpJegvXyGff/Nb0j14pXcGHXOhmpWrcTrG2B0LQ==} + + '@nlpjs/lang-zh@4.26.1': + resolution: {integrity: sha512-kwqeqeEgMAMvucVX9HNE1p6s/2APP23ZsS8Um/lNvtswb4gL5jjYF9kyCvRfqlPBQSWWdRv7wwcnNXOvXYkxcQ==} + + '@nlpjs/language-min@4.25.0': + resolution: {integrity: sha512-g8jtbDbqtRm+dlD/1Vnb4VWfKbKteApEGVTqIMxYkk6N/HMhvLZ5J2svrxzrB98a/HZ0fb//YBfFgymnz9Oukg==} + + '@nlpjs/logger@4.26.1': + resolution: {integrity: sha512-1WaXq+lt1vm34TPxoRZQ8c6PA7cqou/V18lGDt7uZbK0L5cXsB8OuYm5lEB/J1QlbJ819Nkmb32Oax9idQODRw==} + + '@nlpjs/ner@4.27.0': + resolution: {integrity: sha512-ptwkxriJdmgHSH9TfP10JQ1jviaSl2SupSFGUvTuWkuJhobQd3hbnlSq40V6XYvJNmqh9M9zEab/AKeghxYOTA==} + + '@nlpjs/neural@4.25.0': + resolution: {integrity: sha512-Oz20denGiBe0DlQsS7lN4TNrATN1nXlHKc/HB6jJPegjVmgJVCugDaHwIGoV7qOWyA6F2fRRwOgD+quNT2gVpg==} + + '@nlpjs/nlg@4.26.1': + resolution: {integrity: sha512-PCJWiZ7464ChXXUGvjBZIFtoqkC24Oy6X63HgQrSv+63svz22Y5Cmu1MYLk77Nb+4keWv+hKhFJKDkvJoOpBVg==} + + '@nlpjs/nlp@4.27.0': + resolution: {integrity: sha512-q6X7sY6TYVnQRZJKF/6mfLFlNA5oRYLhgQ5k3i1IBqH9lbWTAZJr31w/dCf97HXaYaj+vJp3h0ucfNumme9EIw==} + + '@nlpjs/nlu@4.27.0': + resolution: {integrity: sha512-j4DUdoXS/y/Xag6ysYXx7Ve8NBmUVViUSCJhj3r49+zGyYtyVAHuVcqSej5q0tJjn0JSMT+6+ip8klON1q8ixw==} + + '@nlpjs/request@4.25.0': + resolution: {integrity: sha512-MPVYWfFZY03WyFL7GWkUkv8tw968OXsdxFSJEvjXHzhiCe/vAlPCWbvoR+VnoQTgzLHxs/KIF6sIF2s9AzsLmQ==} + + '@nlpjs/sentiment@4.26.1': + resolution: {integrity: sha512-U2WmcW3w6yDDO45+Y7v5e6DPQj8e0x+RUUePPyRu2uIZmUtIKG+qCPMWnNLMmYQZoSQEFxmMMlLcGDC7tN7o3w==} + + '@nlpjs/similarity@4.26.1': + resolution: {integrity: sha512-QutSBFGo/huNuz60PgqCjub0oBd9S8MLrjme33U5GzxuSvToQzXtn9/ynIia8qDm009D09VXV+LPeNE4h7yuSg==} + + '@nlpjs/slot@4.26.1': + resolution: {integrity: sha512-mK8EEy5O+mRGne822PIKMxHSFh8j+iC7hGJ6T31XdFsNhFEYXLI/0dmeBstZgTSKBTe27HNFgCCwuGb77u0o9w==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1236,6 +1323,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@openmeteo/sdk@1.11.7': + resolution: {integrity: sha512-qV790gksvJ+l/umb1iKt+ZRUKE5RzgmPkwTeUSmtUcnoRaAQZX9/BQLDpmEZrkcuv4g1trzcsNRwxBrBLWUnWA==} + engines: {node: '>=12.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2051,6 +2142,10 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + args@5.0.3: + resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} + engines: {node: '>= 6.0.0'} + aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -2171,6 +2266,10 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase@5.0.0: + resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} + engines: {node: '>=6'} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -2254,6 +2353,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -2262,6 +2364,21 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + compromise-dates@1.5.6: + resolution: {integrity: sha512-i51/snFZtaW+cLx16HrBMHdgqc9eB3lsT5igtm9pOw6sNsNMX64lKiJdp3/kxGtOnl0fjGbZ69DoHb6o4pGUJw==} + peerDependencies: + compromise: '>=12.0.0' + compromise-numbers: '>=1.0.0' + + compromise-numbers@1.4.0: + resolution: {integrity: sha512-3ceRpwZIWduVSMYn54ET1ELdI7bvXQk42uDwxffxiJBxgKCwcCfVbiLuTG62cI+qTHchwLDh4vp9i3WARXROFQ==} + peerDependencies: + compromise: '>=12.0.0' + + compromise@13.11.4: + resolution: {integrity: sha512-nBITcNdqIHSVDDluaG6guyFFCSNXN+Hu87fU8VlhkE5Z0PwTZN1nro2O7a8JcUH88nB5EOzrxd9zKfXLSNFqcg==} + engines: {node: '>=8.0.0'} + compute-scroll-into-view@3.1.0: resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} @@ -2312,6 +2429,9 @@ packages: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2388,9 +2508,15 @@ packages: engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + efrt-unpack@2.2.0: + resolution: {integrity: sha512-9xUSSj7qcUxz+0r4X3+bwUNttEfGfK5AH+LVa1aTpqdAfrN5VhROYCfcF+up4hp5OL7IUKcZJJrzAGipQRDoiQ==} + electron-to-chromium@1.4.749: resolution: {integrity: sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==} @@ -2404,6 +2530,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2491,12 +2620,18 @@ packages: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -2509,6 +2644,9 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true + flatbuffers@24.3.25: + resolution: {integrity: sha512-3HDgPbgiwWMI9zVB7VYBHaMrbOO7Gm0v+yD2FV/sCKj+9NDeVL7BOBYUuhWAQGKWOzBo8S9WdMvV0eixO233XQ==} + focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} @@ -2578,6 +2716,9 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2980,6 +3121,10 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3013,6 +3158,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + leven@2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -3135,6 +3284,10 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mri@1.1.4: + resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} + engines: {node: '>=4'} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -3224,6 +3377,9 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -3235,6 +3391,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + openmeteo@1.1.4: + resolution: {integrity: sha512-TalTDl0M7JJoeRTf+rWiFZ9SLvoxm7KkFLOQqcSjCiYs+bVMhax1qtryJqeZ1RF4W4Xfsgcl9x+VC1z39ULCxA==} + engines: {node: '>=12.0'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3291,12 +3451,26 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + pino-abstract-transport@1.2.0: resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + pino-pretty@7.6.1: + resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} + hasBin: true + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + pino-std-serializers@6.2.2: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + pino@9.0.0: resolution: {integrity: sha512-uI1ThkzTShNSwvsUM6b4ND8ANzWURk9zTELMztFkmnCQeR/4wkomJ+echHee5GMWGovoSfjwdeu80DsFIt7mbA==} hasBin: true @@ -3369,6 +3543,9 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} @@ -3383,6 +3560,9 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3453,6 +3633,10 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readable-stream@4.5.2: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3461,6 +3645,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -3503,6 +3691,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -3552,6 +3743,9 @@ packages: search-insights@2.14.0: resolution: {integrity: sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3601,6 +3795,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + sonic-boom@3.8.1: resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} @@ -3615,6 +3812,14 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + spacetime-holiday@0.1.0: + resolution: {integrity: sha512-rYIpSDbHnznZRstUrmYYFAaruW8e96t+1JfS0b6qMiAAQ2DrkLKc8oMotAAkB9qMTUwXXf5bIkdTHfP434uitQ==} + peerDependencies: + spacetime: ^6.3.0 + + spacetime@6.14.0: + resolution: {integrity: sha512-pz/nMIRGNSJeFfDFvhPjMHXhFU1NcrYnpydMuSS2Zsk0NEoHJc2rRKXugkmlqUv/l/fPxWVJVnj8isVS0//vbQ==} + speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} @@ -3634,6 +3839,9 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -3755,6 +3963,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} @@ -3818,6 +4029,11 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tsx@4.15.6: + resolution: {integrity: sha512-is0VQQlfNZRHEuSSTKA6m4xw74IU4AizmuB6lAYLRt9XtuyeQnyJYexhNZOPCB59SqC4JzmSzPnHGBXxf3k0hA==} + engines: {node: '>=18.0.0'} + hasBin: true + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -4403,6 +4619,7 @@ snapshots: '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + optional: true '@docsearch/css@3.6.0': {} @@ -4778,6 +4995,7 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + optional: true '@next/env@14.1.4': {} @@ -5801,6 +6019,112 @@ snapshots: react: 18.3.0 react-dom: 18.3.0(react@18.3.0) + '@nlpjs/basic@4.27.0': + dependencies: + '@nlpjs/console-connector': 4.26.1 + '@nlpjs/core-loader': 4.26.1 + '@nlpjs/evaluator': 4.26.1 + '@nlpjs/lang-en': 4.26.1 + '@nlpjs/logger': 4.26.1 + '@nlpjs/nlp': 4.27.0 + transitivePeerDependencies: + - supports-color + + '@nlpjs/builtin-compromise@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + compromise: 13.11.4 + compromise-dates: 1.5.6(compromise-numbers@1.4.0(compromise@13.11.4))(compromise@13.11.4) + compromise-numbers: 1.4.0(compromise@13.11.4) + + '@nlpjs/connector@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + + '@nlpjs/console-connector@4.26.1': + dependencies: + '@nlpjs/connector': 4.26.1 + '@nlpjs/core': 4.26.1 + + '@nlpjs/core-loader@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + '@nlpjs/request': 4.25.0 + transitivePeerDependencies: + - supports-color + + '@nlpjs/core@4.26.1': {} + + '@nlpjs/evaluator@4.26.1': + dependencies: + escodegen: 2.1.0 + esprima: 4.0.1 + + '@nlpjs/lang-en-min@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + + '@nlpjs/lang-en@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + '@nlpjs/lang-en-min': 4.26.1 + + '@nlpjs/lang-zh@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + + '@nlpjs/language-min@4.25.0': {} + + '@nlpjs/logger@4.26.1': + dependencies: + pino: 7.11.0 + pino-pretty: 7.6.1 + + '@nlpjs/ner@4.27.0': + dependencies: + '@nlpjs/core': 4.26.1 + '@nlpjs/language-min': 4.25.0 + '@nlpjs/similarity': 4.26.1 + + '@nlpjs/neural@4.25.0': {} + + '@nlpjs/nlg@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + + '@nlpjs/nlp@4.27.0': + dependencies: + '@nlpjs/core': 4.26.1 + '@nlpjs/ner': 4.27.0 + '@nlpjs/nlg': 4.26.1 + '@nlpjs/nlu': 4.27.0 + '@nlpjs/sentiment': 4.26.1 + '@nlpjs/slot': 4.26.1 + + '@nlpjs/nlu@4.27.0': + dependencies: + '@nlpjs/core': 4.26.1 + '@nlpjs/language-min': 4.25.0 + '@nlpjs/neural': 4.25.0 + '@nlpjs/similarity': 4.26.1 + + '@nlpjs/request@4.25.0': + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@nlpjs/sentiment@4.26.1': + dependencies: + '@nlpjs/core': 4.26.1 + '@nlpjs/language-min': 4.25.0 + '@nlpjs/neural': 4.25.0 + + '@nlpjs/similarity@4.26.1': {} + + '@nlpjs/slot@4.26.1': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5813,6 +6137,10 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@openmeteo/sdk@1.11.7': + dependencies: + flatbuffers: 24.3.25 + '@pkgjs/parseargs@0.11.0': optional: true @@ -6639,13 +6967,17 @@ snapshots: '@tootallnate/once@2.0.0': {} - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.11': + optional: true - '@tsconfig/node12@1.0.11': {} + '@tsconfig/node12@1.0.11': + optional: true - '@tsconfig/node14@1.0.3': {} + '@tsconfig/node14@1.0.3': + optional: true - '@tsconfig/node16@1.0.4': {} + '@tsconfig/node16@1.0.4': + optional: true '@types/aria-query@5.0.4': {} @@ -6919,7 +7251,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@4.1.3: {} + arg@4.1.3: + optional: true arg@5.0.2: {} @@ -6927,6 +7260,13 @@ snapshots: dependencies: sprintf-js: 1.0.3 + args@5.0.3: + dependencies: + camelcase: 5.0.0 + chalk: 2.4.2 + leven: 2.1.0 + mri: 1.1.4 + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 @@ -7073,6 +7413,8 @@ snapshots: camelcase-css@2.0.1: {} + camelcase@5.0.0: {} + camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -7153,12 +7495,29 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 + colorette@2.0.20: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 commander@4.1.1: {} + compromise-dates@1.5.6(compromise-numbers@1.4.0(compromise@13.11.4))(compromise@13.11.4): + dependencies: + compromise: 13.11.4 + compromise-numbers: 1.4.0(compromise@13.11.4) + spacetime: 6.14.0 + spacetime-holiday: 0.1.0(spacetime@6.14.0) + + compromise-numbers@1.4.0(compromise@13.11.4): + dependencies: + compromise: 13.11.4 + + compromise@13.11.4: + dependencies: + efrt-unpack: 2.2.0 + compute-scroll-into-view@3.1.0: {} concat-map@0.0.1: {} @@ -7184,7 +7543,8 @@ snapshots: - supports-color - ts-node - create-require@1.1.1: {} + create-require@1.1.1: + optional: true cross-spawn@7.0.3: dependencies: @@ -7212,6 +7572,8 @@ snapshots: whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 + dateformat@4.6.3: {} + debug@4.3.4: dependencies: ms: 2.1.2 @@ -7267,7 +7629,8 @@ snapshots: diff-sequences@29.6.3: {} - diff@4.0.2: {} + diff@4.0.2: + optional: true dlv@1.1.3: {} @@ -7279,8 +7642,17 @@ snapshots: dependencies: webidl-conversions: 7.0.0 + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} + efrt-unpack@2.2.0: {} + electron-to-chromium@1.4.749: {} emittery@0.13.1: {} @@ -7289,6 +7661,10 @@ snapshots: emoji-regex@9.2.2: {} + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + entities@4.5.0: {} error-ex@1.3.2: @@ -7399,6 +7775,8 @@ snapshots: fast-redact@3.5.0: {} + fast-safe-stringify@2.1.1: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -7407,6 +7785,8 @@ snapshots: dependencies: bser: 2.1.1 + fflate@0.8.2: {} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 @@ -7418,6 +7798,8 @@ snapshots: flat@5.0.2: {} + flatbuffers@24.3.25: {} + focus-trap@7.5.4: dependencies: tabbable: 6.2.0 @@ -7473,6 +7855,10 @@ snapshots: get-stream@6.0.1: {} + get-tsconfig@4.7.5: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -8069,6 +8455,8 @@ snapshots: jiti@1.21.0: {} + joycon@3.1.1: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -8117,6 +8505,8 @@ snapshots: kleur@3.0.3: {} + leven@2.1.0: {} + leven@3.1.0: {} lilconfig@2.1.0: {} @@ -8210,6 +8600,8 @@ snapshots: mitt@3.0.1: {} + mri@1.1.4: {} + ms@2.1.2: {} mz@2.7.0: @@ -8296,6 +8688,8 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 + on-exit-leak-free@0.2.0: {} + on-exit-leak-free@2.1.2: {} once@1.4.0: @@ -8306,6 +8700,11 @@ snapshots: dependencies: mimic-fn: 2.1.0 + openmeteo@1.1.4: + dependencies: + '@openmeteo/sdk': 1.11.7 + flatbuffers: 24.3.25 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -8352,13 +8751,50 @@ snapshots: pify@2.3.0: {} + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + pino-abstract-transport@1.2.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 + pino-pretty@7.6.1: + dependencies: + args: 5.0.3 + colorette: 2.0.20 + dateformat: 4.6.3 + fast-safe-stringify: 2.1.1 + joycon: 3.1.1 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pump: 3.0.0 + readable-stream: 3.6.2 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + sonic-boom: 2.8.0 + strip-json-comments: 3.1.1 + + pino-std-serializers@4.0.0: {} + pino-std-serializers@6.2.2: {} + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + pino@9.0.0: dependencies: atomic-sleep: 1.0.0 @@ -8439,6 +8875,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.0 + process-warning@1.0.0: {} + process-warning@3.0.0: {} process@0.11.10: {} @@ -8450,6 +8888,11 @@ snapshots: psl@1.9.0: {} + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -8515,6 +8958,12 @@ snapshots: dependencies: pify: 2.3.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 @@ -8527,6 +8976,8 @@ snapshots: dependencies: picomatch: 2.3.1 + real-require@0.1.0: {} + real-require@0.2.0: {} recoil@0.7.7(react-dom@18.3.0(react@18.3.0))(react@18.3.0): @@ -8560,6 +9011,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.2: {} resolve@1.22.8: @@ -8620,6 +9073,8 @@ snapshots: search-insights@2.14.0: {} + secure-json-parse@2.7.0: {} + semver@6.3.1: {} semver@7.6.0: @@ -8671,6 +9126,10 @@ snapshots: slash@3.0.0: {} + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + sonic-boom@3.8.1: dependencies: atomic-sleep: 1.0.0 @@ -8684,6 +9143,12 @@ snapshots: source-map@0.6.1: {} + spacetime-holiday@0.1.0(spacetime@6.14.0): + dependencies: + spacetime: 6.14.0 + + spacetime@6.14.0: {} + speakingurl@14.0.1: {} split2@4.2.0: {} @@ -8698,6 +9163,8 @@ snapshots: dependencies: internal-slot: 1.0.7 + stream-shift@1.0.3: {} + streamsearch@1.1.0: {} string-length@4.0.2: @@ -8835,6 +9302,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + thread-stream@2.7.0: dependencies: real-require: 0.2.0 @@ -8894,9 +9365,17 @@ snapshots: typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optional: true tslib@2.6.2: {} + tsx@4.15.6: + dependencies: + esbuild: 0.21.5 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 + type-detect@4.0.8: {} type-fest@0.21.3: {} @@ -8963,7 +9442,8 @@ snapshots: util-deprecate@1.0.2: {} - v8-compile-cache-lib@3.0.1: {} + v8-compile-cache-lib@3.0.1: + optional: true v8-to-istanbul@9.2.0: dependencies: @@ -9138,6 +9618,7 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yn@3.1.1: {} + yn@3.1.1: + optional: true yocto-queue@0.1.0: {} diff --git a/public/model b/public/model new file mode 100644 index 0000000..5c0b6b7 Binary files /dev/null and b/public/model differ diff --git a/test/NLP/removeStopwords.test.ts b/test/NLP/removeStopwords.test.ts new file mode 100644 index 0000000..63334d4 --- /dev/null +++ b/test/NLP/removeStopwords.test.ts @@ -0,0 +1,18 @@ + +import { NLP } from "@/lib/nlp/base"; +import { convertStopwords } from "@/lib/nlp/stopwords"; +import { describe, expect, test } from "@jest/globals"; + +describe("Test 1", () => { + test("basic", () => { + const nlp = new NLP("please", "remove-stopword"); + nlp.removeStopwords(); + expect(nlp.query).toBe(""); + }); + test("convert something", () => { + const nlp = new NLP("please convert 1cm to m", "remove-stopword"); + nlp.removeStopwords(convertStopwords); + nlp.trim(); + expect(nlp.query).toBe("1cm m"); + }); +});