From 614c08f1184dadaf3393379541004f621d474a53 Mon Sep 17 00:00:00 2001 From: wenbin <31951556+BeatsAD@users.noreply.github.com> Date: Sun, 14 Jun 2026 23:44:43 +0800 Subject: [PATCH] fix: support Obsidian API lint and legacy settings refresh --- .github/workflows/build.yml | 3 + eslint.config.mjs | 31 + main.js | 8 +- main.ts | 165 +- manifest.json | 2 +- package-lock.json | 4338 ++++++++++++++++++++++++----- package.json | 19 +- tests/settings-review-ui.test.mjs | 62 +- versions.json | 2 +- 9 files changed, 3776 insertions(+), 854 deletions(-) create mode 100644 eslint.config.mjs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4c7c047..38257a9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,6 +30,9 @@ jobs: - name: Test run: npm test + - name: Obsidian lint + run: npm run lint:obsidian + - name: Typecheck run: npm run typecheck diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..1effb4b --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,31 @@ +import { defineConfig } from 'eslint/config'; +import json from '@eslint/json'; +import obsidianmd from 'eslint-plugin-obsidianmd'; +import tseslint from 'typescript-eslint'; + +const obsidianJsonRuleOverrides = Object.fromEntries( + Object.keys(obsidianmd.rules).map((ruleName) => [`obsidianmd/${ruleName}`, 'off']), +); + +export default defineConfig([ + ...obsidianmd.configs.recommended, + { + files: ['**/*.json'], + language: 'json/json', + plugins: { json }, + rules: { + ...obsidianJsonRuleOverrides, + 'no-irregular-whitespace': 'off', + 'obsidianmd/validate-manifest': 'error', + }, + }, + { + files: ['**/*.ts'], + languageOptions: { + parser: tseslint.parser, + parserOptions: { + project: './tsconfig.json', + }, + }, + }, +]); diff --git a/main.js b/main.js index 6310899..5e53947 100644 --- a/main.js +++ b/main.js @@ -3,7 +3,7 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ -var F=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var le=(a,r)=>{for(var e in r)F(a,e,{get:r[e],enumerable:!0})},ce=(a,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of re(r))!oe.call(a,i)&&i!==e&&F(a,i,{get:()=>r[i],enumerable:!(t=ae(r,i))||t.enumerable});return a};var de=a=>ce(F({},"__esModule",{value:!0}),a);var Me={};le(Me,{default:()=>R});module.exports=de(Me);var p=require("obsidian");function A(a,r){return`${a}::${r}`}function B(a,r,e,t){let i=[];return a.forEach((n,s)=>{n.filePath===r&&i.push([s,{...n,filePath:e,remoteName:n.remoteName||t(r),deletedLocal:!1}])}),i.forEach(([n,s])=>{a.delete(n),a.set(A(s.datasetId,e),s)}),i.length>0}function H(a,r,e,t,i,n=new Date,s=3e4){let o=A(r,e);if(a.has(o))return!1;let l,c,d=-1;return a.forEach((u,h)=>{if(u.datasetId!==r||u.filePath===e||!u.documentId||!u.deletedLocal||u.hash!==t)return;let g=Date.parse(u.lastSyncedAt);if(!Number.isFinite(g))return;let y=n.getTime()-g;y<0||y>s||g<=d||(l=h,c=u,d=g)}),!l||!c?!1:(a.delete(l),a.set(o,{...c,filePath:e,remoteName:c.remoteName||i(c.filePath),deletedLocal:!1}),!0)}var Y=require("obsidian");function V(a,r=""){let e=P(a,r),t=j(a);if(!t)throw new Error(Q(e));return t.filter(i=>!!(i!=null&&i.id)).map(i=>({id:i.id,name:i.name||i.id,description:i.description}))}function z(a,r=""){if(!j(a))throw new Error(Q(P(a,r)))}function P(a,r=""){let e=/^\s*0?`; top-level fields: ${a.topLevelKeys.join(", ")}`:"";return`Current address did not return a Dify knowledge base API response (${r}${e}).`}function W(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function b(a){let r=(a||"").trim().replace(/\/+$/,"").replace(/\/v1\/datasets$/i,"").replace(/\/v1$/i,"");return r?/^https?:\/\//i.test(r)?r:`http://${r}`:""}function M(a){return(a||"").trim().replace(/^\/+|\/+$/g,"")}function pe(a,r){let e=M(r);return e===""?!0:e.toLowerCase().endsWith(".md")?a===e:a===e||a.startsWith(`${e}/`)}function k(a){if(!a)return{};try{return JSON.parse(a)}catch(r){return{}}}function f(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function S(a,r){let e=a[r];return typeof e=="string"?e:void 0}function C(a,r){let e=a[r];return typeof e=="number"?e:void 0}function D(a){return Array.from(new Set(a.map(r=>r.trim()).filter(Boolean)))}function G(a,r){let e=[];return r.filter(t=>t.enabled&&Array.isArray(t.datasetIds)&&t.datasetIds.length>0).forEach(t=>{pe(a,t.folder)&&e.push(...t.datasetIds)}),D(e)}function J(a,r){return a.filter(e=>e.id!==r)}function v(a,r,e,t){let i=Number(a);return Number.isFinite(i)?Math.min(e,Math.max(r,i)):t}var m=class extends Error{constructor(e,t,i,n){super(e);this.name="DifyApiError",this.status=t,this.responseText=i,this.reason=n,Object.setPrototypeOf(this,m.prototype)}get isTransient(){return!this.status||this.status===408||this.status===429||this.status>=500}get isPathMismatch(){return this.status===404||this.status===405}},I=class{constructor(r){this.activeBaseUrl="";this.runtimePathStyle=null;this.host=r}getActiveBaseUrl(){return this.activeBaseUrl}setActiveBaseUrl(r){let e=this.getCandidateBaseUrls(!1);r&&e.includes(r)&&(this.activeBaseUrl=r)}clearActiveBaseUrl(){this.activeBaseUrl=""}async probeConnection(){let r=this.getCandidateBaseUrls(!1),e=new Date().toISOString(),t=[],i=null,n=null;for(let s of r){let o=Date.now();try{let l=await this.listDatasetsFromBaseUrl(s),c=Date.now()-o;return this.activeBaseUrl=s,t.push({baseUrl:s,ok:!0,latencyMs:c,datasetCount:l.length}),{status:"connected",checkedAt:e,activeBaseUrl:s,lastSuccessfulBaseUrl:s,datasetCount:l.length,latencyMs:c,candidates:t,datasets:l}}catch(l){let c=this.toApiError(l),d=T(c);if(i=c,n={baseUrl:s,ok:!1,latencyMs:Date.now()-o,statusCode:c.status,error:c.message,reason:d},t.push(n),!this.shouldTryNextBase(c))break}}return{status:"failed",checkedAt:e,activeBaseUrl:"",datasetCount:0,latencyMs:t.reduce((s,o)=>s+o.latencyMs,0),candidates:t,error:(n==null?void 0:n.error)||(i==null?void 0:i.message)||"No Dify API URL is available.",reason:(n==null?void 0:n.reason)||(i?T(i):"unknown"),statusCode:n==null?void 0:n.statusCode,datasets:[]}}async listDatasets(){let r=[];for(let t=1;t<=50;t++){let i=await this.requestUnknown(`/datasets?page=${t}&limit=${100}`,{method:"GET"}),n=this.extractDatasets(i);if(r.push(...n),!U(i)&&n.length<100)break}return r}extractDatasets(r){return V(r)}async listDatasetsFromBaseUrl(r){let e=[];for(let i=1;i<=50;i++){let n=await this.requestOnce(r,`/datasets?page=${i}&limit=${100}`,{method:"GET"}),s=this.extractDatasets(n);if(e.push(...s),!U(n)&&s.length<100)break}return e}async listDocuments(r){let e=[];for(let i=1;i<=100;i++){let n=await this.requestUnknown(`/datasets/${encodeURIComponent(r)}/documents?page=${i}&limit=${100}`,{method:"GET"}),s=ue(n);if(s.forEach(o=>{e.push(o)}),!U(n)&&s.length<100)break}return e}async createDocumentByText(r,e,t){return this.mutateTextDocument(r,void 0,{name:e,text:t,indexing_technique:"high_quality",process_rule:{mode:"automatic"}})}async updateDocumentByText(r,e,t,i){return this.mutateTextDocument(r,e,{name:t,text:i,process_rule:{mode:"automatic"}})}async getIndexingStatus(r,e){return this.requestUnknown(`/datasets/${encodeURIComponent(r)}/documents/${encodeURIComponent(e)}/indexing-status`,{method:"GET"})}async mutateTextDocument(r,e,t){let i=this.getPathStyleCandidates(),n=null;for(let s of i){let o=e?`/datasets/${encodeURIComponent(r)}/documents/${encodeURIComponent(e)}/${s==="hyphen"?"update-by-text":"update_by_text"}`:`/datasets/${encodeURIComponent(r)}/document/${s==="hyphen"?"create-by-text":"create_by_text"}`;try{let l=await this.request(o,{method:"POST",body:t},he);return this.runtimePathStyle=s,l}catch(l){let c=this.toApiError(l);if(n=c,this.host.settings.apiPathStyle==="auto"&&c.isPathMismatch){this.host.debug(`Dify API path style ${s} failed, trying fallback`,c.message);continue}throw c}}throw n||new m("Unable to resolve Dify document API path.")}getPathStyleCandidates(){return this.host.settings.apiPathStyle==="hyphen"?["hyphen"]:this.host.settings.apiPathStyle==="underscore"?["underscore"]:this.runtimePathStyle?[this.runtimePathStyle,this.runtimePathStyle==="hyphen"?"underscore":"hyphen"]:["hyphen","underscore"]}async requestUnknown(r,e){return this.request(r,e,t=>!0)}async request(r,e,t){let i=this.getCandidateBaseUrls(),n=null;for(let s of i){let o=Math.max(1,this.host.settings.maxRetries+1);for(let l=1;l<=o;l++)try{let c=await this.requestOnce(s,r,e);if(this.activeBaseUrl=s,!t(c))throw new m("Dify returned an unexpected response shape.",void 0,JSON.stringify(c));return c}catch(c){let d=this.toApiError(c);if(n=d,!d.isTransient||l>=o)break;await fe(400*l)}if(n&&!this.shouldTryNextBase(n))throw n}throw n||new m("No Dify API URL is available.")}async requestOnce(r,e,t){let i=`${r}/v1${e}`;this.host.debug(`${t.method} ${i}`);let n=Math.max(5,this.host.settings.requestTimeoutSeconds)*1e3,s=null,o=new Promise((l,c)=>{s=window.setTimeout(()=>{c(new m(`Request timed out after ${this.host.settings.requestTimeoutSeconds}s`))},n)});try{let l={url:i,method:t.method,headers:{Authorization:`Bearer ${this.host.settings.difyApiKey}`,"Content-Type":"application/json"},body:t.body?JSON.stringify(t.body):void 0,throw:!1},c=(0,Y.requestUrl)(l),d=await Promise.race([c,o]);if(s!==null&&window.clearTimeout(s),d.status<200||d.status>=300)throw new m(this.extractErrorMessage(d.text,d.status),d.status,d.text);let u=k(d.text);return this.logResponseDiagnostics(i,d.status,u,d.text),me(e)&&z(u,d.text),u}catch(l){throw s!==null&&window.clearTimeout(s),this.toApiError(l)}}getCandidateBaseUrls(r=!0){let e=this.host.settings,i=[b(e.difyApiUrl)],n=D(i.filter(Boolean));return r&&this.activeBaseUrl&&n.includes(this.activeBaseUrl)?[this.activeBaseUrl,...n.filter(s=>s!==this.activeBaseUrl)]:n}shouldTryNextBase(r){return!r.status||r.status===404||r.status>=500}extractErrorMessage(r,e){let t=k(r),i=f(t)?S(t,"message")||S(t,"error")||S(t,"detail")||r||"Unknown error":r||"Unknown error";return`HTTP ${e}: ${String(i).slice(0,300)}`}logResponseDiagnostics(r,e,t,i=""){let n=P(t,i);this.host.debug("Dify API response",{url:r,status:e,topLevelType:n.topLevelType,topLevelKeys:n.topLevelKeys,dataIsArray:n.dataIsArray,dataLength:n.dataLength,looksLikeHtml:n.looksLikeHtml})}toApiError(r){if(r instanceof m)return r;let e=ge(r),t=typeof e.status=="number"?e.status:void 0,i=typeof e.message=="string"?e.message:String(r),n=typeof e.text=="string"?e.text:typeof e.responseText=="string"?e.responseText:void 0,s=ye(e.reason)?e.reason:void 0;return new m(i,t,n,s)}};function U(a){return f(a)&&a.has_more===!0}function ue(a){return(Array.isArray(a)?a:f(a)&&Array.isArray(a.data)?a.data:[]).filter(K)}function K(a){return f(a)&&typeof a.id=="string"}function he(a){if(!f(a))return!1;let r=a.document,e=a.data;return(r===void 0||K(r))&&(e===void 0||K(e))}function ge(a){return f(a)?a:{}}function T(a){if(a.reason)return a.reason;let r=a.message.toLowerCase();return a.status===401?"auth_failed":a.status===403?"permission_denied":a.status===404?"not_found":a.status===405?"path_mismatch":a.status===429?"rate_limited":a.status&&a.status>=500?"server":r.includes("did not return a dify knowledge base api response")||r.includes("received an html page")?"unexpected_response":r.includes("timed out")||r.includes("timeout")?"timeout":r.includes("failed to fetch")||r.includes("network")||r.includes("econnrefused")||r.includes("enotfound")||r.includes("econnreset")?"network":"unknown"}function ye(a){return["missing_config","auth_failed","permission_denied","not_found","timeout","network","server","path_mismatch","rate_limited","unexpected_response","unknown"].includes(String(a))}function me(a){return a==="/datasets"||a.startsWith("/datasets?")}function fe(a){return new Promise(r=>window.setTimeout(r,a))}function Z(a){var t;let r=a.recentSyncResult,e=x(r==null?void 0:r.failed);return{metrics:[{key:"total",value:x(r==null?void 0:r.total),tone:"accent"},{key:"synced",value:x(r==null?void 0:r.synced),tone:"success"},{key:"skipped",value:x(r==null?void 0:r.skipped),tone:"warning"},{key:"failed",value:e,tone:"error"}],connectionTone:Se((t=a.connectionHealth)==null?void 0:t.status),hasRecentSync:!!r}}function Se(a){return a==="connected"?"success":a==="failed"?"error":a==="missing_config"?"warning":"muted"}function x(a){return typeof a=="number"&&Number.isFinite(a)&&a>0?Math.floor(a):0}var ve={schemaVersion:2,initialSetupCompleted:!1,language:"en",difyApiKey:"",difyApiUrl:"",lanApiUrl:"",publicApiUrl:"",endpointMode:"primary",apiPathStyle:"auto",difyKnowledgeId:"",obsidianFolders:[],mappings:[],knowledgeBases:[],lastDatasetRefresh:"",autoSyncEnabled:!1,eventSyncEnabled:!0,syncOnStartup:!0,periodicFullScanEnabled:!0,syncInterval:30,debounceSeconds:8,requestTimeoutSeconds:30,maxRetries:2,maxConcurrent:2,pollIndexStatus:!1,debugLogging:!1,lastSyncTime:"",connectionHealth:ne(),recentSyncResult:void 0},O={"zh-CN":{pluginName:"Vault2Dify",ribbon:"\u540C\u6B65\u5230 Dify",commandManual:"Vault2Dify: \u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93",commandToggleAuto:"\u5F00\u542F/\u5173\u95ED\u81EA\u52A8\u540C\u6B65",ready:"\u5C31\u7EEA",syncing:"\u6B63\u5728\u540C\u6B65...",syncQueued:"\u5DF2\u6709\u540C\u6B65\u6B63\u5728\u8FD0\u884C\uFF0C\u672C\u6B21\u53D8\u66F4\u5DF2\u52A0\u5165\u961F\u5217\u3002",syncNotice:"\u6B63\u5728\u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93...",syncComplete:"\u540C\u6B65\u5B8C\u6210\uFF1A{synced} \u4E2A\u6210\u529F\uFF0C{skipped} \u4E2A\u8DF3\u8FC7\uFF0C{failed} \u4E2A\u5931\u8D25",syncNoChanges:"\u6CA1\u6709\u9700\u8981\u540C\u6B65\u7684\u53D8\u66F4\u3002",syncFailed:"\u540C\u6B65\u5931\u8D25\uFF1A{message}",syncFailedShort:"\u5931\u8D25",validationApiKey:"\u8BF7\u5148\u914D\u7F6E Dify API Key\u3002",validationApiUrl:"\u8BF7\u5148\u914D\u7F6E Dify \u670D\u52A1\u5730\u5740\u3002",validationMapping:"\u8BF7\u81F3\u5C11\u914D\u7F6E\u4E00\u6761\u8DEF\u5F84\u4E0E\u77E5\u8BC6\u5E93\u6620\u5C04\u3002",autoOn:"\u81EA\u52A8\u540C\u6B65\u5DF2\u5F00\u542F",autoOff:"\u81EA\u52A8\u540C\u6B65\u5DF2\u5173\u95ED",settingsTitle:"Vault2Dify",settingsSubtitle:"\u5C06 Obsidian \u7B14\u8BB0\u5E93\u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93",settingsHelp:"\u5C06 Obsidian \u7B14\u8BB0\u5E93\u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93\u3002",openGithub:"\u6253\u5F00 GitHub \u5F00\u6E90\u9879\u76EE",openHelp:"\u6253\u5F00\u5E2E\u52A9\u6587\u6863",helpModalTitle:"Vault2Dify \u5E2E\u52A9",helpQuickStartTitle:"\u5FEB\u901F\u5F00\u59CB",helpQuickStartBody:"Vault2Dify \u4F1A\u5C06 Obsidian \u7B14\u8BB0\u5E93\u540C\u6B65\u5230\u4F60\u914D\u7F6E\u7684 Dify \u77E5\u8BC6\u5E93\u3002",helpQuickStartList:`\u586B\u5199 Dify API Key\u3002 +var F=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var le=(a,r)=>{for(var e in r)F(a,e,{get:r[e],enumerable:!0})},ce=(a,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of re(r))!oe.call(a,i)&&i!==e&&F(a,i,{get:()=>r[i],enumerable:!(t=ae(r,i))||t.enumerable});return a};var de=a=>ce(F({},"__esModule",{value:!0}),a);var Ie={};le(Ie,{default:()=>R});module.exports=de(Ie);var p=require("obsidian");function k(a,r){return`${a}::${r}`}function B(a,r,e,t){let i=[];return a.forEach((n,s)=>{n.filePath===r&&i.push([s,{...n,filePath:e,remoteName:n.remoteName||t(r),deletedLocal:!1}])}),i.forEach(([n,s])=>{a.delete(n),a.set(k(s.datasetId,e),s)}),i.length>0}function H(a,r,e,t,i,n=new Date,s=3e4){let o=k(r,e);if(a.has(o))return!1;let l,c,d=-1;return a.forEach((u,h)=>{if(u.datasetId!==r||u.filePath===e||!u.documentId||!u.deletedLocal||u.hash!==t)return;let g=Date.parse(u.lastSyncedAt);if(!Number.isFinite(g))return;let y=n.getTime()-g;y<0||y>s||g<=d||(l=h,c=u,d=g)}),!l||!c?!1:(a.delete(l),a.set(o,{...c,filePath:e,remoteName:c.remoteName||i(c.filePath),deletedLocal:!1}),!0)}var Y=require("obsidian");function _(a,r=""){let e=P(a,r),t=j(a);if(!t)throw new Error(W(e));return t.filter(i=>!!(i!=null&&i.id)).map(i=>({id:i.id,name:i.name||i.id,description:i.description}))}function z(a,r=""){if(!j(a))throw new Error(W(P(a,r)))}function P(a,r=""){let e=/^\s*0?`; top-level fields: ${a.topLevelKeys.join(", ")}`:"";return`Current address did not return a Dify knowledge base API response (${r}${e}).`}function Q(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function b(a){let r=(a||"").trim().replace(/\/+$/,"").replace(/\/v1\/datasets$/i,"").replace(/\/v1$/i,"");return r?/^https?:\/\//i.test(r)?r:`http://${r}`:""}function M(a){return(a||"").trim().replace(/^\/+|\/+$/g,"")}function pe(a,r){let e=M(r);return e===""?!0:e.toLowerCase().endsWith(".md")?a===e:a===e||a.startsWith(`${e}/`)}function A(a){if(!a)return{};try{return JSON.parse(a)}catch(r){return{}}}function f(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function S(a,r){let e=a[r];return typeof e=="string"?e:void 0}function C(a,r){let e=a[r];return typeof e=="number"?e:void 0}function D(a){return Array.from(new Set(a.map(r=>r.trim()).filter(Boolean)))}function G(a,r){let e=[];return r.filter(t=>t.enabled&&Array.isArray(t.datasetIds)&&t.datasetIds.length>0).forEach(t=>{pe(a,t.folder)&&e.push(...t.datasetIds)}),D(e)}function J(a,r){return a.filter(e=>e.id!==r)}function v(a,r,e,t){let i=Number(a);return Number.isFinite(i)?Math.min(e,Math.max(r,i)):t}var m=class extends Error{constructor(e,t,i,n){super(e);this.name="DifyApiError",this.status=t,this.responseText=i,this.reason=n,Object.setPrototypeOf(this,m.prototype)}get isTransient(){return!this.status||this.status===408||this.status===429||this.status>=500}get isPathMismatch(){return this.status===404||this.status===405}},I=class{constructor(r){this.activeBaseUrl="";this.runtimePathStyle=null;this.host=r}getActiveBaseUrl(){return this.activeBaseUrl}setActiveBaseUrl(r){let e=this.getCandidateBaseUrls(!1);r&&e.includes(r)&&(this.activeBaseUrl=r)}clearActiveBaseUrl(){this.activeBaseUrl=""}async probeConnection(){let r=this.getCandidateBaseUrls(!1),e=new Date().toISOString(),t=[],i=null,n=null;for(let s of r){let o=Date.now();try{let l=await this.listDatasetsFromBaseUrl(s),c=Date.now()-o;return this.activeBaseUrl=s,t.push({baseUrl:s,ok:!0,latencyMs:c,datasetCount:l.length}),{status:"connected",checkedAt:e,activeBaseUrl:s,lastSuccessfulBaseUrl:s,datasetCount:l.length,latencyMs:c,candidates:t,datasets:l}}catch(l){let c=this.toApiError(l),d=T(c);if(i=c,n={baseUrl:s,ok:!1,latencyMs:Date.now()-o,statusCode:c.status,error:c.message,reason:d},t.push(n),!this.shouldTryNextBase(c))break}}return{status:"failed",checkedAt:e,activeBaseUrl:"",datasetCount:0,latencyMs:t.reduce((s,o)=>s+o.latencyMs,0),candidates:t,error:(n==null?void 0:n.error)||(i==null?void 0:i.message)||"No Dify API URL is available.",reason:(n==null?void 0:n.reason)||(i?T(i):"unknown"),statusCode:n==null?void 0:n.statusCode,datasets:[]}}async listDatasets(){let r=[];for(let t=1;t<=50;t++){let i=await this.requestUnknown(`/datasets?page=${t}&limit=${100}`,{method:"GET"}),n=this.extractDatasets(i);if(r.push(...n),!U(i)&&n.length<100)break}return r}extractDatasets(r){return _(r)}async listDatasetsFromBaseUrl(r){let e=[];for(let i=1;i<=50;i++){let n=await this.requestOnce(r,`/datasets?page=${i}&limit=${100}`,{method:"GET"}),s=this.extractDatasets(n);if(e.push(...s),!U(n)&&s.length<100)break}return e}async listDocuments(r){let e=[];for(let i=1;i<=100;i++){let n=await this.requestUnknown(`/datasets/${encodeURIComponent(r)}/documents?page=${i}&limit=${100}`,{method:"GET"}),s=ue(n);if(s.forEach(o=>{e.push(o)}),!U(n)&&s.length<100)break}return e}async createDocumentByText(r,e,t){return this.mutateTextDocument(r,void 0,{name:e,text:t,indexing_technique:"high_quality",process_rule:{mode:"automatic"}})}async updateDocumentByText(r,e,t,i){return this.mutateTextDocument(r,e,{name:t,text:i,process_rule:{mode:"automatic"}})}async getIndexingStatus(r,e){return this.requestUnknown(`/datasets/${encodeURIComponent(r)}/documents/${encodeURIComponent(e)}/indexing-status`,{method:"GET"})}async mutateTextDocument(r,e,t){let i=this.getPathStyleCandidates(),n=null;for(let s of i){let o=e?`/datasets/${encodeURIComponent(r)}/documents/${encodeURIComponent(e)}/${s==="hyphen"?"update-by-text":"update_by_text"}`:`/datasets/${encodeURIComponent(r)}/document/${s==="hyphen"?"create-by-text":"create_by_text"}`;try{let l=await this.request(o,{method:"POST",body:t},he);return this.runtimePathStyle=s,l}catch(l){let c=this.toApiError(l);if(n=c,this.host.settings.apiPathStyle==="auto"&&c.isPathMismatch){this.host.debug(`Dify API path style ${s} failed, trying fallback`,c.message);continue}throw c}}throw n||new m("Unable to resolve Dify document API path.")}getPathStyleCandidates(){return this.host.settings.apiPathStyle==="hyphen"?["hyphen"]:this.host.settings.apiPathStyle==="underscore"?["underscore"]:this.runtimePathStyle?[this.runtimePathStyle,this.runtimePathStyle==="hyphen"?"underscore":"hyphen"]:["hyphen","underscore"]}async requestUnknown(r,e){return this.request(r,e,t=>!0)}async request(r,e,t){let i=this.getCandidateBaseUrls(),n=null;for(let s of i){let o=Math.max(1,this.host.settings.maxRetries+1);for(let l=1;l<=o;l++)try{let c=await this.requestOnce(s,r,e);if(this.activeBaseUrl=s,!t(c))throw new m("Dify returned an unexpected response shape.",void 0,JSON.stringify(c));return c}catch(c){let d=this.toApiError(c);if(n=d,!d.isTransient||l>=o)break;await fe(400*l)}if(n&&!this.shouldTryNextBase(n))throw n}throw n||new m("No Dify API URL is available.")}async requestOnce(r,e,t){let i=`${r}/v1${e}`;this.host.debug(`${t.method} ${i}`);let n=Math.max(5,this.host.settings.requestTimeoutSeconds)*1e3,s=null,o=new Promise((l,c)=>{s=window.setTimeout(()=>{c(new m(`Request timed out after ${this.host.settings.requestTimeoutSeconds}s`))},n)});try{let l={url:i,method:t.method,headers:{Authorization:`Bearer ${this.host.settings.difyApiKey}`,"Content-Type":"application/json"},body:t.body?JSON.stringify(t.body):void 0,throw:!1},c=(0,Y.requestUrl)(l),d=await Promise.race([c,o]);if(s!==null&&window.clearTimeout(s),d.status<200||d.status>=300)throw new m(this.extractErrorMessage(d.text,d.status),d.status,d.text);let u=A(d.text);return this.logResponseDiagnostics(i,d.status,u,d.text),me(e)&&z(u,d.text),u}catch(l){throw s!==null&&window.clearTimeout(s),this.toApiError(l)}}getCandidateBaseUrls(r=!0){let e=this.host.settings,i=[b(e.difyApiUrl)],n=D(i.filter(Boolean));return r&&this.activeBaseUrl&&n.includes(this.activeBaseUrl)?[this.activeBaseUrl,...n.filter(s=>s!==this.activeBaseUrl)]:n}shouldTryNextBase(r){return!r.status||r.status===404||r.status>=500}extractErrorMessage(r,e){let t=A(r),i=f(t)?S(t,"message")||S(t,"error")||S(t,"detail")||r||"Unknown error":r||"Unknown error";return`HTTP ${e}: ${String(i).slice(0,300)}`}logResponseDiagnostics(r,e,t,i=""){let n=P(t,i);this.host.debug("Dify API response",{url:r,status:e,topLevelType:n.topLevelType,topLevelKeys:n.topLevelKeys,dataIsArray:n.dataIsArray,dataLength:n.dataLength,looksLikeHtml:n.looksLikeHtml})}toApiError(r){if(r instanceof m)return r;let e=ge(r),t=typeof e.status=="number"?e.status:void 0,i=typeof e.message=="string"?e.message:String(r),n=typeof e.text=="string"?e.text:typeof e.responseText=="string"?e.responseText:void 0,s=ye(e.reason)?e.reason:void 0;return new m(i,t,n,s)}};function U(a){return f(a)&&a.has_more===!0}function ue(a){return(Array.isArray(a)?a:f(a)&&Array.isArray(a.data)?a.data:[]).filter(K)}function K(a){return f(a)&&typeof a.id=="string"}function he(a){if(!f(a))return!1;let r=a.document,e=a.data;return(r===void 0||K(r))&&(e===void 0||K(e))}function ge(a){return f(a)?a:{}}function T(a){if(a.reason)return a.reason;let r=a.message.toLowerCase();return a.status===401?"auth_failed":a.status===403?"permission_denied":a.status===404?"not_found":a.status===405?"path_mismatch":a.status===429?"rate_limited":a.status&&a.status>=500?"server":r.includes("did not return a dify knowledge base api response")||r.includes("received an html page")?"unexpected_response":r.includes("timed out")||r.includes("timeout")?"timeout":r.includes("failed to fetch")||r.includes("network")||r.includes("econnrefused")||r.includes("enotfound")||r.includes("econnreset")?"network":"unknown"}function ye(a){return["missing_config","auth_failed","permission_denied","not_found","timeout","network","server","path_mismatch","rate_limited","unexpected_response","unknown"].includes(String(a))}function me(a){return a==="/datasets"||a.startsWith("/datasets?")}function fe(a){return new Promise(r=>window.setTimeout(r,a))}function Z(a){var t;let r=a.recentSyncResult,e=x(r==null?void 0:r.failed);return{metrics:[{key:"total",value:x(r==null?void 0:r.total),tone:"accent"},{key:"synced",value:x(r==null?void 0:r.synced),tone:"success"},{key:"skipped",value:x(r==null?void 0:r.skipped),tone:"warning"},{key:"failed",value:e,tone:"error"}],connectionTone:Se((t=a.connectionHealth)==null?void 0:t.status),hasRecentSync:!!r}}function Se(a){return a==="connected"?"success":a==="failed"?"error":a==="missing_config"?"warning":"muted"}function x(a){return typeof a=="number"&&Number.isFinite(a)&&a>0?Math.floor(a):0}var ve={schemaVersion:2,initialSetupCompleted:!1,language:"en",difyApiKey:"",difyApiUrl:"",lanApiUrl:"",publicApiUrl:"",endpointMode:"primary",apiPathStyle:"auto",difyKnowledgeId:"",obsidianFolders:[],mappings:[],knowledgeBases:[],lastDatasetRefresh:"",autoSyncEnabled:!1,eventSyncEnabled:!0,syncOnStartup:!0,periodicFullScanEnabled:!0,syncInterval:30,debounceSeconds:8,requestTimeoutSeconds:30,maxRetries:2,maxConcurrent:2,pollIndexStatus:!1,debugLogging:!1,lastSyncTime:"",connectionHealth:ne(),recentSyncResult:void 0},O={"zh-CN":{pluginName:"Vault2Dify",ribbon:"\u540C\u6B65\u5230 Dify",commandManual:"Vault2Dify: \u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93",commandToggleAuto:"\u5F00\u542F/\u5173\u95ED\u81EA\u52A8\u540C\u6B65",ready:"\u5C31\u7EEA",syncing:"\u6B63\u5728\u540C\u6B65...",syncQueued:"\u5DF2\u6709\u540C\u6B65\u6B63\u5728\u8FD0\u884C\uFF0C\u672C\u6B21\u53D8\u66F4\u5DF2\u52A0\u5165\u961F\u5217\u3002",syncNotice:"\u6B63\u5728\u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93...",syncComplete:"\u540C\u6B65\u5B8C\u6210\uFF1A{synced} \u4E2A\u6210\u529F\uFF0C{skipped} \u4E2A\u8DF3\u8FC7\uFF0C{failed} \u4E2A\u5931\u8D25",syncNoChanges:"\u6CA1\u6709\u9700\u8981\u540C\u6B65\u7684\u53D8\u66F4\u3002",syncFailed:"\u540C\u6B65\u5931\u8D25\uFF1A{message}",syncFailedShort:"\u5931\u8D25",validationApiKey:"\u8BF7\u5148\u914D\u7F6E Dify API Key\u3002",validationApiUrl:"\u8BF7\u5148\u914D\u7F6E Dify \u670D\u52A1\u5730\u5740\u3002",validationMapping:"\u8BF7\u81F3\u5C11\u914D\u7F6E\u4E00\u6761\u8DEF\u5F84\u4E0E\u77E5\u8BC6\u5E93\u6620\u5C04\u3002",autoOn:"\u81EA\u52A8\u540C\u6B65\u5DF2\u5F00\u542F",autoOff:"\u81EA\u52A8\u540C\u6B65\u5DF2\u5173\u95ED",settingsTitle:"Vault2Dify",settingsSubtitle:"\u5C06 Obsidian \u7B14\u8BB0\u5E93\u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93",settingsHelp:"\u5C06 Obsidian \u7B14\u8BB0\u5E93\u540C\u6B65\u5230 Dify \u77E5\u8BC6\u5E93\u3002",openGithub:"\u6253\u5F00 GitHub \u5F00\u6E90\u9879\u76EE",openHelp:"\u6253\u5F00\u5E2E\u52A9\u6587\u6863",helpModalTitle:"Vault2Dify \u5E2E\u52A9",helpQuickStartTitle:"\u5FEB\u901F\u5F00\u59CB",helpQuickStartBody:"Vault2Dify \u4F1A\u5C06 Obsidian \u7B14\u8BB0\u5E93\u540C\u6B65\u5230\u4F60\u914D\u7F6E\u7684 Dify \u77E5\u8BC6\u5E93\u3002",helpQuickStartList:`\u586B\u5199 Dify API Key\u3002 \u586B\u5199 Dify \u670D\u52A1\u5730\u5740\u3002 \u70B9\u51FB\u6D4B\u8BD5\u8FDE\u63A5\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u83B7\u53D6\u77E5\u8BC6\u5E93\u3002 \u65B0\u589E\u8DEF\u5F84\u6620\u5C04\u3002 @@ -117,6 +117,6 @@ Split large knowledge bases by folder and sync in batches. If the connection is also unstable, run Test connection and follow connection troubleshooting first.`,helpDuplicateDocsTitle:"Duplicate documents appear",helpDuplicateDocsBody:"Possible causes include missing legacy sync records, manually changed Dify document names, reset or lost local sync records, or remote documents that were manually deleted and then synced again.",helpDuplicateDocsList:`Confirm duplicate documents in the Dify console. Keep the documents you need and delete extras. Return to plugin settings and click Reset sync records. -Run Sync now again so the plugin rebuilds records.`,helpDebugTitle:"Debug logs",helpDebugBody:"Temporarily enable debug logs when the error stays generic, browser access works but the plugin still fails, NAS / Docker / reverse proxy routing is complex, or you need to report an issue. Do not share API keys, private addresses, note content, or other sensitive information in logs.",helpPrivacyTitle:"Privacy and safety",helpPrivacyBody:"The plugin only reads Markdown files in the current Obsidian vault that match enabled path mappings. It only sends required Markdown content to your configured Dify service URL. It does not send note content to the plugin author or any third-party service other than your configured Dify service. The Dify API key is stored in Obsidian plugin local data; do not commit a {configDir} directory containing plugin settings to a public repository.",navAria:"Obsidian settings navigation",navAbout:"About",navEditor:"Editor",navFiles:"Files and links",navAppearance:"Appearance",navHotkeys:"Hotkeys",navPlugins:"Third-party plugins",clearConnectionConfig:"Clear config",selectPlaceholder:"Please select",showApiKey:"Show API key",hideApiKey:"Hide API key",healthConnection:"Connection",healthActiveUrl:"Active URL",healthRecentSync:"Recent sync",connectionUnknown:"Not tested",connectionMissing:"Needs setup",connectionConnected:"Connected",connectionFailedState:"Failed",recentSyncNone:"No sync yet",quickStepKey:"Enter key",quickStepKeyDesc:"Dify knowledge API key",quickStepTest:"Test connection",quickStepTestDesc:"Find an endpoint and load bases",quickStepMapping:"Add mapping",quickStepMappingDesc:"Choose folder and bases",sectionBasicConnection:"Basic connection",settingsReviewConnectionTitle:"Connection",settingsReviewMappingTitle:"Directory mapping",settingsReviewSyncTitle:"Sync settings",pendingMappingsTitle:"New mappings",bulkSet:"Bulk set",enableAll:"Enable all",pauseAll:"Pause all",chooseFolderFirst:"Select a folder or note first",pendingEmptyDesc:"Select an Obsidian folder or note on the left, then choose Dify knowledge bases on the right and click Add.",pendingAdded:"Mapping added to the list below.",selectFolderPlaceholder:"Select a folder or note",datasetsDropdownEmpty:"Load Dify knowledge bases first",folderSearch:"Search folders or notes",addPendingMapping:"Add",saveMapping:"Save mapping",syncAfterChange:"After changes",fullScanCheck:"Full check",startupSyncShort:"Startup sync",concurrentUpload:"Concurrent uploads",debounceOption8:"8 seconds",debounceOption15:"15 seconds",debounceOption30:"30 seconds",fullScanOption30:"Every 30 minutes",fullScanOption60:"Every 60 minutes",fullScanOptionOff:"Off",concurrencyOption2:"2 files",concurrencyOption4:"4 files",optionOn:"On",optionOff:"Off",settingsReviewLanUrlName:"NAS LAN address",settingsReviewLanUrlPlaceholder:"Enter NAS LAN address",settingsReviewPublicUrlName:"NAS public address",settingsReviewPublicUrlPlaceholder:"Enter NAS public address",basicConnectionDesc:"First-time setup keeps only the essentials; advanced endpoint options are collapsed.",apiUrlName:"Dify service URL",apiUrlDesc:"Use the Dify service URL reachable from this Obsidian device. You may omit http:// or paste a URL ending in /v1 or /v1/datasets.",connectionNoteIdle:"Enter an API key and Dify service URL, then test the connection.",connectionNoteMissing:"Enter an API key and Dify service URL first.",connectionNoteSuccess:"Connected: {count} knowledge bases via {url}.",connectionNoteFailed:"Connection failed: {message}",advancedConnectionSummary:"Advanced connection: LAN/public fallback URLs, API path compatibility, timeout, retries",expand:"Expand",collapse:"Collapse",advancedSync:"Tune advanced options",syncCadenceName:"Sync cadence",syncCadenceDesc:"Sync {debounce}s after changes; run a full check every {interval} minutes.",syncCadenceEventOnly:"Sync {debounce}s after changes; periodic full checks are off.",syncCadenceIntervalOnly:"File change sync is off; run a full check every {interval} minutes.",syncCadenceOff:"Auto sync is off. Manual sync still works.",sectionDiagnostics:"Sync diagnostics",diagnosticsDesc:"Long status lives in diagnostics. The status bar stays short.",metricTotal:"Recent tasks",metricSynced:"Synced",metricSkipped:"Skipped",metricFailed:"Failed",mappingIndex:"#",mappingFolderColumn:"Obsidian path",mappingDatasetColumn:"Dify knowledge bases",mappingStatusColumn:"Status",mappingActionColumn:"Actions",lastError:"Recent error: {message}",deleteMappingTitle:"Delete mapping",deleteMappingDesc:"This only deletes the sync configuration. It will not delete Obsidian files or remote Dify documents.",deleteMappingConfirm:"Delete mapping",mappingSaved:"Mapping saved.",sectionLanguage:"Language",languageName:"Interface language",languageDesc:"Switch settings, notices, and status bar language.",languageChinese:"\u4E2D\u6587",languageEnglish:"English",sectionConnection:"Connection",apiKeyName:"Dify API Key",apiKeyDesc:"API key used to access Dify knowledge base APIs.",apiKeyPlaceholder:"Enter your Dify API key",endpointModeName:"Endpoint strategy",endpointModeDesc:"Fill LAN, public reverse proxy, or cloud URLs when needed. Auto mode tries available URLs in order.",endpointPrimary:"Primary URL",endpointLan:"LAN URL",endpointPublic:"Public URL",endpointAuto:"Auto",primaryUrlName:"Primary API URL",primaryUrlDesc:"Reachable Dify service root URL, for example http://dify-host.example.test:5000 or https://dify.example.com.",lanUrlName:"LAN API URL",lanUrlDesc:"Use this for Dify on NAS/Docker, local Docker, or a LAN server. Prefer a full URL such as http://dify-host.example.test:5000.",publicUrlName:"Public API URL",publicUrlDesc:"Use this for reverse proxy, domain, public port, or Dify Cloud access. It must point to Dify, not a NAS/server admin page.",nasUrlHint:"Deployment URL tip: supports NAS/Docker, local Docker, LAN servers, public reverse proxies, and Dify Cloud. Do not use container-only addresses, api:5001, or localhost on the machine running Dify. Use the Dify root URL reachable from this Obsidian device. If http:// is missing, the plugin will try http:// automatically.",urlPlaceholder:"Enter your Dify service URL",apiPathStyleName:"Dify document API path",apiPathStyleDesc:"Auto is recommended. The plugin supports new create-by-text and legacy create_by_text paths.",apiPathAuto:"Auto compatible",apiPathHyphen:"New hyphen path",apiPathUnderscore:"Legacy underscore path",timeoutName:"Request timeout",timeoutDesc:"Timeout for one Dify API request, in seconds.",retriesName:"Retry count",retriesDesc:"Retries for network failures or 5xx responses.",testConnection:"Test connection",refreshDatasets:"Refresh knowledge bases",connectionOk:"Connected and loaded {count} knowledge bases via {url}",connectionFailed:"Connection failed: {message}",connectionErrorMissingConfig:"Enter a Dify API key and service URL first.",connectionErrorAuthFailed:"The API key is invalid. Check that it is correct.",connectionErrorPermissionDenied:"The API key does not have knowledge base access. Check Dify permissions.",connectionErrorNotFound:"The Dify knowledge base API was not found. Check the Dify service URL, port, and reverse proxy forwarding.",connectionErrorPathMismatch:"The API path is incompatible. Confirm the plugin is on the latest build, retry Test connection, then sync.",connectionErrorRateLimited:"Dify returned too many requests. Lower upload concurrency or try again later.",connectionErrorServer:"Dify returned a server error. Check the Dify container, service logs, or reverse proxy.",connectionErrorTimeout:"The request timed out. Confirm this device can reach the Dify service URL, and check Dify service load, ports, firewall, Tailscale, and reverse proxy.",connectionErrorNetwork:"Network connection failed. Check the URL, port, firewall, Docker mapping, or reverse proxy.",connectionErrorUnexpectedResponse:"The current address did not return the Dify knowledge base API. Check that the URL and port point to Dify.",connectionErrorUnknown:"Connection failed. Check the Dify settings and try again.",datasetsRefreshed:"Refreshed {count} knowledge bases.",datasetsEmpty:"Connected, but this key returned no accessible knowledge bases. Check the key workspace, knowledge base permissions, or whether the Dify service URL points to the correct Dify instance.",sectionMapping:"Path mappings",mappingDesc:"One Obsidian folder or note can sync to multiple Dify knowledge bases, and many paths can share one knowledge base.",addMapping:"Add mapping",edit:"Edit",delete:"Delete",enabled:"Enabled",disabled:"Disabled",rootFolder:"Entire vault",noMappings:"No mappings yet. Add a mapping to enable automatic sync.",mappingPageInfoEmpty:"0-0 / 0",datasetMissing:"No knowledge base selected",datasetUnknown:"Unknown knowledge base",mappingModalTitle:"Edit path mapping",addMappingModalTitle:"Add mapping",folderName:"Obsidian folder or note",folderDesc:"Choose a folder to sync all Markdown notes under it, or choose one note to sync only that note.",selectFolder:"Select folder",datasetName:"Dify knowledge bases",datasetDesc:"Multiple selections are supported. If the list is empty, refresh knowledge bases or enter IDs manually.",manualDatasetIds:"Manual knowledge base IDs",manualDatasetIdsDesc:"Separate multiple IDs with commas, spaces, or new lines.",save:"Save",cancel:"Cancel",selectFolderTitle:"Select Obsidian folder or note",choose:"Choose",sectionAuto:"Auto sync",autoSyncName:"Enable auto sync",autoSyncDesc:"Master switch. Event sync and periodic full scans pause when disabled.",eventSyncName:"Sync after file changes",eventSyncDesc:"Listen to Obsidian create, modify, and rename events, then upload after debounce.",startupSyncName:"Sync after startup",startupSyncDesc:"Check changes after Obsidian finishes loading.",periodicSyncName:"Periodic full scan",periodicSyncDesc:"Fallback for event sync, useful with NAS/Docker, local Docker, LAN servers, Dify Cloud, or multi-device workflows.",syncIntervalName:"Sync interval",syncIntervalDesc:"Periodic full scan interval, in minutes.",debounceName:"Change debounce",debounceDesc:"Wait this many seconds after edits stop before syncing.",concurrencyName:"Concurrent uploads",concurrencyDesc:"Keep this at 1-2 for NAS/Docker, local Docker, or smaller self-hosted deployments to avoid overloading Dify indexing. Adjust for Dify Cloud rate limits.",pollIndexName:"Check indexing status",pollIndexDesc:"Briefly query Dify indexing status after upload. This is slower but more informative.",sectionActions:"Actions & diagnostics",manualSync:"Sync now",manualSyncDesc:"Scan mapped Markdown files and sync changes immediately.",debugName:"Debug logs",debugDesc:"Print detailed sync logs in the developer console.",lastSync:"Last sync: {time}",noLastSync:"No completed sync yet.",lastSyncInitial:"Last sync time: --/--/--",activeEndpoint:"Active endpoint: {url}",noActiveEndpoint:"Active endpoint: no successful connection yet.",recentSyncInitial:"Recent sync: 0 tasks, elapsed 0ms",recentSyncSummary:"Recent sync: {source}, {total} tasks, {synced} synced, {skipped} skipped, {failed} failed, elapsed {elapsed}",recentSyncAddress:"Recent sync endpoint: {url}",recentSyncError:"Recent sync error: {message}",recentSyncFailures:"Recent failed files: {items}",noRecentSync:"No recent sync details yet.",recordsCount:"{count} file-to-knowledge-base sync records stored.",resetRecords:"Reset sync records",resetRecordsDesc:"Remote Dify documents are not deleted. The next sync will compare remote documents again.",resetRecordsDone:"Sync records reset.",hashMigrated:"Legacy sync records migrated.",localDeleted:"Local deletion recorded: {path}",progress:"{current}/{total} processing {name}",folderPickerEmpty:"There are no mappable folders or Markdown notes in this vault."}},R=class extends p.Plugin{constructor(){super(...arguments);this.syncRecords=new Map;this.legacyHashFileName="historyContentHash";this.syncProgressNotice=null;this.queueTimer=null;this.startupSyncTimer=null;this.periodicIntervalId=null;this.pendingPaths=new Set;this.isSyncing=!1}async onload(){await this.loadPluginData(),this.client=new I(this),this.client.setActiveBaseUrl(this.settings.connectionHealth.lastSuccessfulBaseUrl),this.statusBarItem=this.addStatusBarItem(),this.updateStatusBar(this.t("ready")),this.addRibbonIcon("sync",this.t("ribbon"),async()=>{await this.performSync("manual")}).addClass("dify-sync-ribbon-class"),this.addCommand({id:"dify-sync-manual",name:this.t("commandManual"),callback:async()=>{await this.performSync("manual")}}),this.addCommand({id:"dify-sync-toggle-auto",name:this.t("commandToggleAuto"),callback:async()=>{this.settings.autoSyncEnabled=!this.settings.autoSyncEnabled,await this.savePluginData(),this.setupAutoSync(),new p.Notice(this.settings.autoSyncEnabled?this.t("autoOn"):this.t("autoOff"))}}),this.settingTab=new q(this.app,this),this.addSettingTab(this.settingTab),this.app.workspace.onLayoutReady(async()=>{await this.migrateLegacyHashStorage(),this.registerVaultEvents(),this.setupAutoSync(),this.settings.autoSyncEnabled&&this.settings.syncOnStartup&&(this.startupSyncTimer=window.setTimeout(()=>{this.startupSyncTimer=null,this.queueFullSync("startup")},5e3))})}onunload(){this.queueTimer!==null&&window.clearTimeout(this.queueTimer),this.startupSyncTimer!==null&&window.clearTimeout(this.startupSyncTimer),this.periodicIntervalId!==null&&window.clearInterval(this.periodicIntervalId)}t(e,t){var s;let n=(O[((s=this.settings)==null?void 0:s.language)||"zh-CN"]||O["zh-CN"])[e]||O["zh-CN"][e]||e;return t&&Object.entries(t).forEach(([o,l])=>{n=n.replace(new RegExp(`\\{${o}\\}`,"g"),String(l))}),n}debug(...e){this.settings.debugLogging&&console.log("[Dify Sync]",...e)}getConnectionFailureMessage(e="unknown"){return this.t(Ce(e))}showConnectionError(e){let t=this.getConnectionFailureReason(e);new p.Notice(this.t("connectionFailed",{message:this.getConnectionFailureMessage(t)}),8e3).messageEl.addClass("dify-sync-error-notice")}getConnectionFailureReason(e){if(!this.hasCompleteConnectionSettings())return"missing_config";let t=De(e);return t||(e instanceof m?T(e):this.settings.connectionHealth.status==="failed"&&this.settings.connectionHealth.reason?this.settings.connectionHealth.reason:"unknown")}hasCompleteConnectionSettings(){return!!this.settings.difyApiKey.trim()&&this.getConfiguredBaseUrls().length>0}async loadPluginData(){let e=await this.loadData(),t=f(e)?e:{},i=f(t.settings)?t.settings:t;this.settings=this.normalizeSettings(i,!!e),this.syncRecords=new Map(Object.entries(we(t.syncRecords))),await this.savePluginData()}async savePluginData(){let e={};this.syncRecords.forEach((t,i)=>{e[i]=t}),await this.saveData({schemaVersion:2,settings:this.settings,syncRecords:e})}normalizeSettings(e,t=!1){let i=f(e)?e:{},n=Object.assign({},ve,i);if(n.schemaVersion=2,n.initialSetupCompleted=typeof i.initialSetupCompleted=="boolean"?i.initialSetupCompleted:t,n.language=n.language==="en"?"en":"zh-CN",n.endpointMode=["primary","lan","public","auto"].includes(n.endpointMode)?n.endpointMode:"primary",n.apiPathStyle=["auto","hyphen","underscore"].includes(n.apiPathStyle)?n.apiPathStyle:"auto",n.syncInterval=v(n.syncInterval,5,240,30),n.debounceSeconds=v(n.debounceSeconds,1,120,8),n.requestTimeoutSeconds=v(n.requestTimeoutSeconds,5,180,30),n.maxRetries=v(n.maxRetries,0,5,2),n.maxConcurrent=v(n.maxConcurrent,1,5,2),n.knowledgeBases=Array.isArray(n.knowledgeBases)?n.knowledgeBases:[],n.obsidianFolders=Array.isArray(n.obsidianFolders)?n.obsidianFolders:[],n.mappings=Array.isArray(n.mappings)?n.mappings:[],n.connectionHealth=Ae(i.connectionHealth),n.mappings.length===0&&n.difyKnowledgeId){let s=n.obsidianFolders.length>0?n.obsidianFolders:[""];n.mappings=s.map(o=>({id:N(),folder:o,datasetIds:[n.difyKnowledgeId],enabled:!0}))}return n.mappings=n.mappings.map(s=>({id:s.id||N(),folder:M(s.folder||""),datasetIds:D((s.datasetIds||[]).map(o=>o.trim()).filter(Boolean)),enabled:s.enabled!==!1})),n}registerVaultEvents(){this.registerEvent(this.app.vault.on("create",e=>{this.handleVaultChange(e,"event")})),this.registerEvent(this.app.vault.on("modify",e=>{this.handleVaultChange(e,"event")})),this.registerEvent(this.app.vault.on("delete",async e=>{e instanceof p.TFile&&this.isMarkdownFile(e)&&await this.markLocalDeleted(e.path)})),this.registerEvent(this.app.vault.on("rename",async(e,t)=>{e instanceof p.TFile&&this.isMarkdownFile(e)&&(await this.migrateRenamedRecords(t,e.path),this.enqueueFile(e.path,"event"))}))}setupAutoSync(){this.periodicIntervalId!==null&&(window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=null),!(!this.settings.autoSyncEnabled||!this.settings.periodicFullScanEnabled)&&(this.periodicIntervalId=window.setInterval(()=>{this.queueFullSync("interval")},this.settings.syncInterval*60*1e3),this.registerInterval(this.periodicIntervalId))}handleVaultChange(e,t){!this.settings.autoSyncEnabled||!this.settings.eventSyncEnabled||e instanceof p.TFile&&this.isMarkdownFile(e)&&this.enqueueFile(e.path,t)}enqueueFile(e,t){this.pendingPaths.add(e),this.scheduleQueueFlush(t)}queueFullSync(e){this.settings.autoSyncEnabled&&this.scheduleQueueFlush(e,!0)}scheduleQueueFlush(e,t=!1){this.queueTimer!==null&&window.clearTimeout(this.queueTimer),this.queueTimer=window.setTimeout(()=>{this.queueTimer=null;let i=t?void 0:Array.from(this.pendingPaths);this.pendingPaths.clear(),this.performSync(e,i).catch(n=>{let s=this.getConnectionFailureMessage(this.getConnectionFailureReason(n));this.updateStatusBar(this.t("syncFailedShort"),!0),this.showSyncError(this.t("syncFailed",{message:s}))})},this.settings.debounceSeconds*1e3)}async performSync(e="manual",t){if(!this.validateSettings(!0))return;if(this.isSyncing){t&&t.forEach(s=>this.pendingPaths.add(s)),new p.Notice(this.t("syncQueued"));return}this.isSyncing=!0,this.showSyncNotice(this.t("syncNotice")),this.updateStatusBar(this.t("syncing"));let i=new Date,n={synced:0,skipped:0,failed:0,total:0,syncedFiles:[],failedFiles:[]};try{let s=this.getCandidateFiles(t),o=await this.buildSyncPlan(s,n);if(n.total=o.length+n.skipped,o.length===0){this.settings.lastSyncTime=new Date().toISOString(),this.settings.recentSyncResult=this.createRecentSyncResult(e,i,n),this.markConnectionSuccessFromActive(),await this.savePluginData(),this.updateStatusBar(this.t("ready")),this.showSyncComplete(n);return}let l=await this.loadDocumentIndexes(o);await this.processTasks(o,l,n),this.settings.lastSyncTime=new Date().toISOString();let c=n.failed>0?this.t("syncComplete",ee(n)):void 0;this.settings.recentSyncResult=this.createRecentSyncResult(e,i,n,c),n.failed>0&&n.synced===0?this.markConnectionFailure(new m(c||this.t("syncFailedShort"))):this.markConnectionSuccessFromActive(),await this.savePluginData(),this.updateStatusBar(n.failed>0?this.t("syncFailedShort"):this.t("ready"),n.failed>0),this.showSyncComplete(n)}catch(s){let o=this.getConnectionFailureMessage(this.getConnectionFailureReason(s));this.settings.recentSyncResult=this.createRecentSyncResult(e,i,n,o),this.markConnectionFailure(s),await this.savePluginData(),this.updateStatusBar(this.t("syncFailedShort"),!0),this.showSyncError(this.t("syncFailed",{message:o}))}finally{if(this.isSyncing=!1,this.pendingPaths.size>0){let s=Array.from(this.pendingPaths);this.pendingPaths.clear(),window.setTimeout(()=>{this.performSync("event",s).catch(o=>{let l=this.getConnectionFailureMessage(this.getConnectionFailureReason(o));this.updateStatusBar(this.t("syncFailedShort"),!0),this.showSyncError(this.t("syncFailed",{message:l}))})},1e3)}}}getCandidateFiles(e){if(!e)return this.app.vault.getMarkdownFiles();let t=[];return D(e).forEach(i=>{let n=this.app.vault.getAbstractFileByPath(i);n instanceof p.TFile&&this.isMarkdownFile(n)&&t.push(n)}),t}async buildSyncPlan(e,t){let i=[];for(let n of e){let s=this.getDatasetIdsForPath(n.path);if(s.length===0)continue;let o=await this.app.vault.cachedRead(n),l=this.hashContent(o),c=this.makeRemoteName(n.path);for(let d of s){H(this.syncRecords,d,n.path,l,g=>this.makeRemoteName(g));let u=this.getRecordKey(d,n.path),h=this.syncRecords.get(u);if(h&&h.hash===l&&h.documentId&&!h.deletedLocal&&h.remoteName===c){t.skipped++;continue}i.push({file:n,content:o,hash:l,datasetId:d,remoteName:c,recordKey:u})}}return i}async loadDocumentIndexes(e){let t=D(e.map(n=>n.datasetId)),i=new Map;for(let n of t){let s=await this.client.listDocuments(n),o={byId:new Map,byName:new Map};s.forEach(l=>{o.byId.set(l.id,l),l.name&&o.byName.set(l.name,l)}),i.set(n,o)}return i}async processTasks(e,t,i){let n=0,s=0,o=Math.min(this.settings.maxConcurrent,e.length),l=async()=>{for(;n ${c.datasetId}`,u)}}};await Promise.all(Array.from({length:o},l))}async syncTask(e,t){if(!t)throw new Error(`Unable to load remote document index for dataset ${e.datasetId}`);let i=this.syncRecords.get(e.recordKey),n=i!=null&&i.documentId?t.byId.get(i.documentId):void 0,s=t.byName.get(e.remoteName),o=n||s,l;if(o!=null&&o.id)try{l=await this.client.updateDocumentByText(e.datasetId,o.id,e.remoteName,e.content)}catch(u){let h=u instanceof m?u:new m(w(u));if(h.status!==404)throw h;l=await this.client.createDocumentByText(e.datasetId,e.remoteName,e.content)}else l=await this.client.createDocumentByText(e.datasetId,e.remoteName,e.content);let c=be(l),d=(c==null?void 0:c.id)||(o==null?void 0:o.id)||(i==null?void 0:i.documentId);if(!d)throw new Error("Dify did not return a document id.");this.settings.pollIndexStatus&&l.batch&&await this.pollIndexStatus(e.datasetId,l.batch),this.syncRecords.set(e.recordKey,{filePath:e.file.path,datasetId:e.datasetId,documentId:d,remoteName:e.remoteName,hash:e.hash,lastModified:e.file.stat.mtime,lastSyncedAt:new Date().toISOString(),lastBatch:l.batch}),t.byId.set(d,{id:d,name:e.remoteName}),t.byName.set(e.remoteName,{id:d,name:e.remoteName})}async pollIndexStatus(e,t){for(let i=0;i<3;i++)try{await Pe(1200),await this.client.getIndexingStatus(e,t);return}catch(n){this.debug("Indexing status check failed",w(n))}}async refreshKnowledgeBases(e=!0){if(!this.hasCompleteConnectionSettings())throw this.markConnectionMissingConfig(),await this.savePluginData(),new m(this.getConnectionFailureMessage("missing_config"),void 0,void 0,"missing_config");let t=await this.client.probeConnection();if(this.applyConnectionProbe(t),t.status!=="connected")throw await this.savePluginData(),new m(t.error||this.getConnectionFailureMessage(t.reason),t.statusCode,void 0,t.reason||"unknown");let i=t.datasets;return this.settings.knowledgeBases=i,this.settings.lastDatasetRefresh=t.checkedAt,await this.savePluginData(),e&&new p.Notice(i.length>0?this.t("datasetsRefreshed",{count:i.length}):this.t("datasetsEmpty")),i}async testConnection(){try{let e=await this.refreshKnowledgeBases(!1);this.settings.initialSetupCompleted=!0,await this.savePluginData(),new p.Notice(this.t("connectionOk",{count:e.length,url:this.settings.connectionHealth.activeBaseUrl||this.settings.connectionHealth.lastSuccessfulBaseUrl||b(this.settings.difyApiUrl)})),this.settingTab.display()}catch(e){this.showConnectionError(e)}}applyConnectionProbe(e){var n;let t=ke(e),i=e.reason||(t==null?void 0:t.reason);this.settings.connectionHealth={status:e.status,checkedAt:e.checkedAt,activeBaseUrl:e.activeBaseUrl,lastSuccessfulBaseUrl:e.lastSuccessfulBaseUrl||this.settings.connectionHealth.lastSuccessfulBaseUrl,datasetCount:e.datasetCount,latencyMs:e.latencyMs,error:e.status==="failed"?this.getConnectionFailureMessage(i||"unknown"):e.error,reason:i,statusCode:(n=e.statusCode)!=null?n:t==null?void 0:t.statusCode}}markConnectionSuccessFromActive(){let e=this.client.getActiveBaseUrl();e&&(this.settings.connectionHealth={...this.settings.connectionHealth,status:"connected",checkedAt:new Date().toISOString(),activeBaseUrl:e,lastSuccessfulBaseUrl:e,error:void 0,reason:void 0,statusCode:void 0})}markConnectionFailure(e){let t=e instanceof m?e:new m(w(e)),i=T(t);this.settings.connectionHealth={...this.settings.connectionHealth,status:"failed",checkedAt:new Date().toISOString(),activeBaseUrl:"",error:this.getConnectionFailureMessage(i),reason:i,statusCode:t.status}}markConnectionMissingConfig(){this.client.clearActiveBaseUrl(),this.settings.connectionHealth={...this.settings.connectionHealth,status:"missing_config",checkedAt:new Date().toISOString(),activeBaseUrl:"",error:this.getConnectionFailureMessage("missing_config"),reason:"missing_config",statusCode:void 0}}invalidateConnectionState(){this.client.clearActiveBaseUrl(),this.settings.connectionHealth={...this.settings.connectionHealth,status:this.settings.difyApiKey.trim()&&this.getConfiguredBaseUrls().length>0?"unknown":"missing_config",checkedAt:"",activeBaseUrl:"",error:void 0,reason:void 0,statusCode:void 0}}createRecentSyncResult(e,t,i,n){let s=new Date;return{source:e,status:n?"failed":"success",startedAt:t.toISOString(),finishedAt:s.toISOString(),elapsedMs:Math.max(0,s.getTime()-t.getTime()),activeBaseUrl:this.client.getActiveBaseUrl(),synced:i.synced,skipped:i.skipped,failed:i.failed,total:i.total,syncedFiles:i.syncedFiles.slice(0,20),failedFiles:i.failedFiles.slice(0,20),error:n}}getDatasetIdsForPath(e){return G(e,this.settings.mappings)}makeRemoteName(e){return e}getRecordKey(e,t){return A(e,t)}hashContent(e){let t=2166136261;for(let i=0;i>>0).toString(16)}async markLocalDeleted(e){let t=!1;this.syncRecords.forEach((i,n)=>{i.filePath===e&&(this.syncRecords.set(n,{...i,deletedLocal:!0,lastSyncedAt:new Date().toISOString()}),t=!0)}),t&&(await this.savePluginData(),new p.Notice(this.t("localDeleted",{path:e})))}async migrateRenamedRecords(e,t){B(this.syncRecords,e,t,n=>this.makeRemoteName(n))&&await this.savePluginData()}async migrateLegacyHashStorage(){if(!(this.syncRecords.size>0||this.settings.mappings.length===0))try{let t=this.app.vault.getAbstractFileByPath(this.legacyHashFileName);if(!(t instanceof p.TFile))return;let i=await this.app.vault.read(t),n=k(i);if(!f(n))return;Object.entries(n).forEach(([s,o])=>{let l=f(o)?o:{};this.getDatasetIdsForPath(s).forEach(d=>{this.syncRecords.set(this.getRecordKey(d,s),{filePath:s,datasetId:d,remoteName:this.makeRemoteName(s),hash:S(l,"hash")||"",lastModified:C(l,"lastModified")||0,lastSyncedAt:new Date().toISOString()})})}),this.syncRecords.size>0&&(await this.savePluginData(),new p.Notice(this.t("hashMigrated")))}catch(t){this.debug("Legacy hash migration failed",w(t))}}validateSettings(e){return this.validateConnectionSettings(e)&&this.validateMappingSettings(e)}validateConnectionSettings(e){return this.hasCompleteConnectionSettings()?!0:(e&&this.showConnectionError(new m(this.getConnectionFailureMessage("missing_config"),void 0,void 0,"missing_config")),!1)}validateMappingSettings(e){return this.settings.mappings.some(i=>i.enabled&&i.datasetIds.length>0)?!0:(e&&new p.Notice(this.t("validationMapping")),!1)}getConfiguredBaseUrls(){return D([b(this.settings.difyApiUrl)].filter(Boolean))}getActiveBaseUrl(){return this.client.getActiveBaseUrl()}isMarkdownFile(e){return e.extension.toLowerCase()==="md"}updateStatusBar(e,t=!1){this.statusBarItem.setText(`Dify: ${e}`),this.statusBarItem.toggleClass("dify-sync-error",t),this.statusBarItem.toggleClass("dify-sync-syncing",e===this.t("syncing"))}showSyncProgress(e,t,i){let n=i>0?Math.round(t/i*100):0,s=`${e} -${this.createProgressBar(n)} ${n}% (${t}/${i})`;this.showPersistentNotice(s)}showSyncNotice(e){this.showPersistentNotice(e)}showPersistentNotice(e){if(!this.syncProgressNotice){this.syncProgressNotice=new p.Notice(e,0),this.syncProgressNotice.messageEl.addClass("dify-sync-progress");return}this.syncProgressNotice.messageEl.textContent=e}showSyncComplete(e){this.hideProgressNotice();let t=e.total===0?this.t("syncNoChanges"):this.t("syncComplete",ee(e));new p.Notice(t,5e3).messageEl.addClass("dify-sync-complete")}showSyncError(e){this.hideProgressNotice(),new p.Notice(e,8e3).messageEl.addClass("dify-sync-error-notice")}hideProgressNotice(){this.syncProgressNotice&&(this.syncProgressNotice.hide(),this.syncProgressNotice=null)}createProgressBar(e){let i=Math.round(e/100*20);return`[${"\u2588".repeat(i)}${"\u2591".repeat(20-i)}]`}getDatasetLabel(e){let t=this.settings.knowledgeBases.find(i=>i.id===e);return t?`${t.name} (${t.id})`:`${this.t("datasetUnknown")} (${e})`}getDatasetName(e){let t=this.settings.knowledgeBases.find(i=>i.id===e);return(t==null?void 0:t.name)||e}},q=class extends p.PluginSettingTab{constructor(e,t){super(e,t);this.mainMappingPage=0;this.mainMappingPageSize=4;this.outerScrollHostClass="dify-sync-outer-scroll-host";this.innerScrollHostClass="dify-sync-inner-scroll-host";this.outerScrollHosts=new Set;this.scrollbarMarkToken=0;this.plugin=t}display(){let{containerEl:e}=this;e.empty(),e.addClass("dify-sync-settings");let t=e.createDiv("app"),n=t.createEl("main",{cls:"main"}).createDiv("settings");this.renderTopbar(n),this.renderSyncSummary(n);let s=n.createDiv("dify-sync-content");this.renderConnectionSection(s),this.renderMappingSection(s),this.renderSyncSettingsSection(s),t.createDiv({cls:"toast-region",attr:{"aria-live":"polite","aria-atomic":"true"}}),this.scheduleScrollbarHostMarking(e)}hide(){this.scrollbarMarkToken++,this.clearScrollbarHosts(),super.hide()}scheduleScrollbarHostMarking(e){let t=++this.scrollbarMarkToken;this.clearScrollbarHosts(),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{t===this.scrollbarMarkToken&&e.isConnected&&this.markScrollbarHosts(e)})})}markScrollbarHosts(e){this.clearScrollbarHosts();let t=this.findScrollableAncestors(e);if(t.length===0)return;this.innerScrollHost=e,e.addClass(this.innerScrollHostClass),t.forEach(s=>this.addOuterScrollHost(s));let i=t[0],n=s=>this.handleSettingsWheel(s,e,i);e.addEventListener("wheel",n,{passive:!1}),this.wheelCleanup=()=>e.removeEventListener("wheel",n)}findScrollableAncestors(e){let t=[],i=e.parentElement;for(;i;)this.isVerticalScrollHost(i)&&t.push(i),i=i.parentElement;return t}isVerticalScrollHost(e){let t=window.getComputedStyle(e).overflowY;return e.scrollHeight>e.clientHeight+1&&["auto","scroll","overlay"].includes(t)}addOuterScrollHost(e){e.addClass(this.outerScrollHostClass),this.outerScrollHosts.add(e)}handleSettingsWheel(e,t,i){if(e.defaultPrevented||e.deltaY===0||this.targetCanScrollWithin(e.target,t,e.deltaY))return;let n=i.scrollTop;i.scrollTop+=e.deltaY,i.scrollTop!==n&&(e.preventDefault(),e.stopPropagation())}targetCanScrollWithin(e,t,i){let n=e instanceof HTMLElement?e:null;for(;n&&n!==t;){if(!this.outerScrollHosts.has(n)&&this.elementCanScrollInDirection(n,i))return!0;n=n.parentElement}return!1}elementCanScrollInDirection(e,t){return this.isVerticalScrollHost(e)?t<0?e.scrollTop>0:e.scrollTop+e.clientHeighti.removeClass(this.outerScrollHostClass)),this.outerScrollHosts.clear(),(t=this.innerScrollHost)==null||t.removeClass(this.innerScrollHostClass),this.innerScrollHost=void 0}renderTopbar(e){let t=e.createEl("header",{cls:"topbar"}),i=t.createDiv("title-line");new p.Setting(i).setName(this.plugin.t("settingsTitle")).setHeading().nameEl.addClass("heading-text"),i.createEl("p",{text:this.plugin.t("settingsSubtitle"),cls:"settings-subtitle"});let s=t.createDiv("top-actions"),o=new p.ExtraButtonComponent(s).setIcon("languages").setTooltip(this.plugin.t("languageName")),l=o.extraSettingsEl;o.onClick(()=>this.openLanguageMenu(l)),l.addClass("language-button"),l.setAttr("aria-label",this.plugin.t("languageName")),l.setAttr("title",this.plugin.t("languageName")),l.setAttr("data-action","open-language-menu");let c=new p.ExtraButtonComponent(s).setIcon("help-circle").setTooltip(this.plugin.t("openHelp")).onClick(()=>{new $(this.app,this.plugin).open()}).extraSettingsEl;c.addClass("help-button"),c.setAttr("aria-label",this.plugin.t("openHelp")),c.setAttr("title",this.plugin.t("openHelp")),c.setAttr("data-action","open-help");let d=s.createEl("a",{cls:"github-link",href:"https://github.com/BeatsAD/Vault2Dify"});d.setAttr("target","_blank"),d.setAttr("rel","noopener noreferrer"),d.setAttr("aria-label",this.plugin.t("openGithub")),d.setAttr("title","GitHub"),(0,p.setIcon)(d,"github")}openLanguageMenu(e){let t=new p.Menu;[{value:"zh-CN",label:this.plugin.t("languageChinese")},{value:"en",label:this.plugin.t("languageEnglish")}].forEach(s=>{t.addItem(o=>{o.setTitle(s.label).setChecked(this.plugin.settings.language===s.value).onClick(()=>{this.plugin.settings.language!==s.value&&(async()=>(this.plugin.settings.language=s.value,await this.plugin.savePluginData(),this.plugin.updateStatusBar(this.plugin.t("ready")),this.display()))()})})});let n=e.getBoundingClientRect();t.showAtPosition({x:n.left,y:n.bottom+4,width:n.width})}renderSyncSummary(e){let t=Z({connectionHealth:this.plugin.settings.connectionHealth,recentSyncResult:this.plugin.settings.recentSyncResult}),i={total:this.plugin.t("metricTotal"),synced:this.plugin.t("metricSynced"),skipped:this.plugin.t("metricSkipped"),failed:this.plugin.t("metricFailed")},n=e.createDiv("sync-summary");n.setAttr("aria-label",this.plugin.t("sectionDiagnostics")),t.metrics.forEach(s=>{let o=n.createDiv("metric");o.createDiv({text:i[s.key],cls:"metric-label"}),o.createDiv({text:String(s.value),cls:s.tone==="default"?"metric-value":`metric-value ${s.tone}`})})}renderConnectionSection(e){let{card:t}=this.createReviewSection(e,"connection-title",this.plugin.t("settingsReviewConnectionTitle")),i,n=this.createNativeSetting(t,"setting-row");n.controlEl.addClass("has-secret-toggle"),n.setName(this.createSettingName(this.plugin.t("apiKeyName"),{required:!0})).setTooltip(this.plugin.t("apiKeyDesc")).addText(h=>{i=h.setPlaceholder(this.plugin.t("apiKeyPlaceholder")).setValue(this.plugin.settings.difyApiKey).onChange(g=>{this.plugin.settings.difyApiKey=g.trim(),this.plugin.invalidateConnectionState(),this.plugin.savePluginData()}).inputEl,i.id="dify-api-key",i.type="password",i.setAttr("aria-label",this.plugin.t("apiKeyName"))}).addExtraButton(h=>{let g=h.setIcon("eye").setTooltip(this.plugin.t("showApiKey")).onClick(()=>{let y=i.type==="password";i.type=y?"text":"password",h.setIcon(y?"eye-off":"eye");let E=this.plugin.t(y?"hideApiKey":"showApiKey");h.setTooltip(E),g.setAttr("aria-label",E),g.setAttr("title",E),g.setAttr("aria-pressed",String(y))}).extraSettingsEl;g.addClass("secret-toggle"),g.setAttr("aria-label",this.plugin.t("showApiKey")),g.setAttr("title",this.plugin.t("showApiKey")),g.setAttr("aria-controls","dify-api-key"),g.setAttr("aria-pressed","false")}),this.createNativeSetting(t,"setting-row").setName(this.createSettingName(this.plugin.t("apiUrlName"),{required:!0})).setTooltip(this.plugin.t("apiUrlDesc")).addText(h=>{h.setPlaceholder(this.plugin.t("urlPlaceholder")).setValue(this.plugin.settings.difyApiUrl).onChange(y=>{this.plugin.settings.difyApiUrl=y.trim(),this.plugin.invalidateConnectionState(),this.plugin.savePluginData()}).inputEl.setAttr("aria-label",this.plugin.t("apiUrlName"))});let s=t.createDiv("dataset-refresh-row"),o=s.createDiv("status-line");o.setAttr("aria-label",this.plugin.t("healthConnection")),o.createSpan({cls:`status-dot ${this.getConnectionStatusToneClass()}`}),o.createEl("strong",{text:this.getConnectionStatusLabel()});let l=s.createDiv("connection-action-buttons"),c=new p.ButtonComponent(l).setButtonText(this.plugin.t("clearConnectionConfig")).setClass("native-action-button").onClick(()=>{(async()=>(this.plugin.settings.difyApiKey="",this.plugin.settings.difyApiUrl="",this.plugin.settings.lanApiUrl="",this.plugin.settings.publicApiUrl="",this.plugin.invalidateConnectionState(),await this.plugin.savePluginData(),this.display()))()});c.buttonEl.setAttr("data-action","clear-connection-config"),c.buttonEl.setAttr("aria-label",this.plugin.t("clearConnectionConfig"));let d;d=new p.ButtonComponent(l).setButtonText(this.plugin.t("testConnection")).setClass("native-action-button").onClick(()=>{d.setDisabled(!0),d.setButtonText(this.plugin.t("syncing")),(async()=>{try{await this.plugin.testConnection()}finally{d.setDisabled(!1),d.setButtonText(this.plugin.t("testConnection")),this.display()}})()}),d.buttonEl.setAttr("data-action","test-connection"),d.buttonEl.setAttr("aria-label",this.plugin.t("testConnection"));let u=s.createDiv({cls:"callout",attr:{"data-role":"connection-result"}});u.hidden=!0,u.createEl("strong",{text:this.getConnectionStatusLabel()}),u.createSpan({text:this.getConnectionNote()})}renderMappingSection(e){let{card:t}=this.createReviewSection(e,"mapping-title",this.plugin.t("settingsReviewMappingTitle"),c=>{let d=new p.ButtonComponent(c).setButtonText(this.plugin.t("addMapping")).setCta().onClick(()=>{new L(this.app,this.plugin,void 0,async u=>{this.plugin.settings.mappings.push(u),await this.plugin.savePluginData(),new p.Notice(this.plugin.t("mappingSaved")),this.display()}).open()});d.buttonEl.setAttr("data-action","add-mapping"),d.buttonEl.setAttr("aria-label",this.plugin.t("addMapping"))}),i=t.createDiv({cls:"mapping-table main-mapping-table",attr:{role:"table","aria-label":this.plugin.t("sectionMapping")}}),n=i.createDiv({cls:"mapping-header",attr:{role:"row"}});n.createDiv({text:this.plugin.t("mappingIndex")}),n.createDiv({text:this.plugin.t("mappingFolderColumn")}),n.createDiv({text:this.plugin.t("mappingDatasetColumn")}),n.createDiv({text:this.plugin.t("mappingStatusColumn")}),n.createDiv({text:this.plugin.t("mappingActionColumn")});let s=this.plugin.settings.mappings,o=Math.max(0,Math.ceil(s.length/this.mainMappingPageSize)-1);this.mainMappingPage=Math.min(this.mainMappingPage,o),s.length===0&&i.createDiv({text:this.plugin.t("noMappings"),cls:"main-mapping-empty"});let l=this.mainMappingPage*this.mainMappingPageSize;s.slice(l,l+this.mainMappingPageSize).forEach((c,d)=>{this.renderMappingRow(i,c,l+d)}),this.renderMainMappingPagination(t,this.plugin.settings.mappings.length)}renderMainMappingPagination(e,t){let i=e.createDiv({cls:"main-mapping-pagination mapping-pagination",attr:{"data-role":"main-mapping-pagination"}}),n=Math.max(1,Math.ceil(t/this.mainMappingPageSize)),s=new p.ButtonComponent(i).setButtonText("\u2039"),o=t===0?0:this.mainMappingPage*this.mainMappingPageSize+1,l=t===0?0:Math.min(t,(this.mainMappingPage+1)*this.mainMappingPageSize);i.createSpan({text:t===0?this.plugin.t("mappingPageInfoEmpty"):`${o}-${l} / ${t}`,attr:{"data-role":"main-mapping-page-info"}});let c=new p.ButtonComponent(i).setButtonText("\u203A");s.setDisabled(t===0||this.mainMappingPage===0),c.setDisabled(t===0||this.mainMappingPage>=n-1),s.onClick(()=>{this.mainMappingPage=Math.max(0,this.mainMappingPage-1),this.display()}),c.onClick(()=>{this.mainMappingPage=Math.min(n-1,this.mainMappingPage+1),this.display()})}renderMappingRow(e,t,i){let n=e.createDiv({cls:"mapping-row",attr:{role:"row"}});se(n,this.plugin,t,i,"toggle-mapping-status",async()=>{t.enabled=!t.enabled,await this.plugin.savePluginData(),this.display()},s=>{let o=new p.ExtraButtonComponent(s).setIcon("pencil").setTooltip(this.plugin.t("edit")).onClick(()=>{new L(this.app,this.plugin,t,async c=>{this.plugin.settings.mappings=this.plugin.settings.mappings.map(d=>d.id===c.id?c:d),await this.plugin.savePluginData(),this.display()}).open()}).extraSettingsEl;o.addClass("icon"),o.setAttr("data-action","edit-mapping"),o.setAttr("aria-label",this.plugin.t("edit")),o.setAttr("title",this.plugin.t("edit"));let l=new p.ExtraButtonComponent(s).setIcon("trash-2").setTooltip(this.plugin.t("delete")).onClick(()=>{new _(this.app,this.plugin.t("deleteMappingTitle"),this.plugin.t("deleteMappingDesc"),this.plugin.t("deleteMappingConfirm"),this.plugin.t("cancel"),async()=>{this.plugin.settings.mappings=J(this.plugin.settings.mappings,t.id),await this.plugin.savePluginData(),this.display()},{folder:t.folder||this.plugin.t("rootFolder"),datasets:t.datasetIds.map(c=>this.plugin.getDatasetName(c)).join("\u3001")||this.plugin.t("datasetMissing")},c=>this.plugin.t(c)).open()}).extraSettingsEl;l.addClass("icon"),l.addClass("danger"),l.setAttr("data-action","delete-mapping"),l.setAttr("aria-label",this.plugin.t("delete")),l.setAttr("title",this.plugin.t("delete"))})}renderSyncSettingsSection(e){let{card:t}=this.createReviewSection(e,"auto-title",this.plugin.t("settingsReviewSyncTitle"));this.createNativeSetting(t,"setting-row","switch-row").setName(this.createSettingName(this.plugin.t("sectionAuto"))).addToggle(y=>{y.setValue(this.plugin.settings.autoSyncEnabled).onChange(E=>{(async()=>(this.plugin.settings.autoSyncEnabled=E,await this.plugin.savePluginData(),this.plugin.setupAutoSync(),this.display()))()}),y.toggleEl.setAttr("data-action","toggle-auto-sync")});let i=t.createDiv({attr:{id:"advanced-sync"}});this.createAdvancedSelect(i,this.plugin.t("syncAfterChange"),this.plugin.settings.debounceSeconds,[[8,this.plugin.t("debounceOption8")],[15,this.plugin.t("debounceOption15")],[30,this.plugin.t("debounceOption30")]],async y=>{this.plugin.settings.debounceSeconds=y,await this.plugin.savePluginData()},"debounce"),this.createAdvancedSelect(i,this.plugin.t("fullScanCheck"),this.plugin.settings.periodicFullScanEnabled?this.plugin.settings.syncInterval:0,[[30,this.plugin.t("fullScanOption30")],[60,this.plugin.t("fullScanOption60")],[0,this.plugin.t("fullScanOptionOff")]],async y=>{this.plugin.settings.periodicFullScanEnabled=y>0,y>0&&(this.plugin.settings.syncInterval=y),await this.plugin.savePluginData(),this.plugin.setupAutoSync()},"interval"),this.createAdvancedSelect(i,this.plugin.t("startupSyncShort"),this.plugin.settings.syncOnStartup,[[!0,this.plugin.t("optionOn")],[!1,this.plugin.t("optionOff")]],async y=>{this.plugin.settings.syncOnStartup=y,await this.plugin.savePluginData()},"startup-sync"),this.createAdvancedSelect(i,this.plugin.t("concurrentUpload"),this.plugin.settings.maxConcurrent,[[2,this.plugin.t("concurrencyOption2")],[4,this.plugin.t("concurrencyOption4")]],async y=>{this.plugin.settings.maxConcurrent=v(y,1,5,2),await this.plugin.savePluginData()},"concurrency");let n=t.createEl("details",{cls:"diagnostic-fold"});n.open=!0;let s=n.createEl("summary");s.createSpan({text:this.plugin.t("sectionDiagnostics")}),s.createSpan({text:`Dify: ${this.plugin.t("ready")}`});let o=n.createDiv("diagnostic-body"),l=this.plugin.settings.lastSyncTime?this.plugin.t("lastSync",{time:new Date(this.plugin.settings.lastSyncTime).toLocaleString()}):this.plugin.t("lastSyncInitial");o.createDiv({text:l,cls:"dify-sync-diagnostic-line"}),this.renderRecentSyncResult(o);let c=o.createDiv("sync-actions");new p.ButtonComponent(c).setButtonText(this.plugin.settings.debugLogging?`${this.plugin.t("debugName")} \xB7 ${this.plugin.t("enabled")}`:this.plugin.t("debugName")).onClick(()=>{(async()=>(this.plugin.settings.debugLogging=!this.plugin.settings.debugLogging,await this.plugin.savePluginData(),this.display()))()}).buttonEl.setAttr("data-action","toggle-debug-logging"),new p.ButtonComponent(c).setButtonText(this.plugin.t("resetRecords")).onClick(()=>{(async()=>(this.plugin.syncRecords.clear(),await this.plugin.savePluginData(),new p.Notice(this.plugin.t("resetRecordsDone")),this.display()))()}).buttonEl.setAttr("data-action","reset-sync-records");let h=t.createDiv("sync-actions manual-sync-actions"),g;g=new p.ButtonComponent(h).setButtonText(this.plugin.t("manualSync")).setCta().onClick(()=>{g.setDisabled(!0),g.setButtonText(this.plugin.t("syncing")),(async()=>{try{await this.plugin.performSync("manual")}finally{g.setDisabled(!1),g.setButtonText(this.plugin.t("manualSync")),this.display()}})()}),g.buttonEl.setAttr("data-action","sync-now"),g.buttonEl.setAttr("aria-label",this.plugin.t("manualSync"))}renderRecentSyncResult(e){let t=this.plugin.settings.recentSyncResult;if(!t){e.createDiv({text:this.plugin.t("recentSyncInitial"),cls:"dify-sync-diagnostic-line"});return}e.createDiv({text:this.plugin.t("recentSyncSummary",{source:t.source,total:t.total,synced:t.synced,skipped:t.skipped,failed:t.failed,elapsed:Te(t.elapsedMs)}),cls:"dify-sync-diagnostic-line"}),t.error&&e.createDiv({text:this.plugin.t("recentSyncError",{message:t.error}),cls:"dify-sync-diagnostic-line dify-sync-diagnostic-error"})}createReviewSection(e,t,i,n){let s=e.createEl("section",{cls:"section",attr:{"aria-labelledby":t}}),o=s.createDiv("section-head"),l=o.createDiv("heading-line"),c=new p.Setting(l).setName(i).setHeading();return c.nameEl.addClass("heading-text"),c.nameEl.id=t,n&&n(o),{card:s.createDiv("section-card")}}createSettingName(e,t={}){let i=this.containerEl.doc,n=i.createDocumentFragment(),s=i.createElement("span");if(s.className="setting-label",s.textContent=e,n.appendChild(s),t.required){let o=i.createElement("span");o.className="required-marker",o.textContent="*",o.setAttribute("aria-label","required"),n.appendChild(o)}return n}createSettingRow(e,t,i,n={}){return{control:this.createNativeSetting(e,"setting-row").setName(this.createSettingName(t,n)).setDesc(i).setTooltip(i).controlEl}}createTextInput(e,t,i,n){let s=e.createEl("input",{attr:{type:"text",placeholder:i,"aria-label":t}});return s.value=n,s}createAdvancedText(e,t,i,n,s,o=this.plugin.t("urlPlaceholder"),l={}){this.createNativeSetting(e,"advanced-field").setName(this.createSettingName(t,l)).addText(c=>{let d=c.setPlaceholder(o).setValue(i).onChange(u=>{n(u.trim())}).inputEl;d.id=s})}createAdvancedNumber(e,t,i,n,s,o,l){let c=e.createDiv("advanced-field");c.createEl("label",{text:t,attr:{for:l}});let d=c.createEl("input",{attr:{id:l,type:"number",min:String(n),max:String(s)}});d.value=String(i),d.addEventListener("change",()=>{o(Number(d.value)).catch(u=>{new p.Notice(w(u))})})}createAdvancedSelect(e,t,i,n,s,o){let l=new Map(n.map(([d])=>[String(d),d])),c=Object.fromEntries(n.map(([d,u])=>[String(d),u]));this.createNativeSetting(e,"advanced-field").setName(this.createSettingName(t)).addDropdown(d=>{d.addOptions(c).setValue(String(i)).onChange(u=>{let h=l.get(u);h!==void 0&&s(h)}),d.selectEl.id=`${o}-select`,d.selectEl.setAttr("aria-label",t)})}createNativeSetting(e,...t){let i=new p.Setting(e).setClass("native-setting-row");return t.forEach(n=>i.settingEl.addClass(n)),i}createHelpIcon(e,t){let i=e.createSpan({text:"?",cls:"help-icon"});i.setAttr("tabindex","0"),i.setAttr("aria-label",t),i.setAttr("data-tooltip",t)}getConnectionStatusLabel(){let e=this.plugin.settings.connectionHealth.status;return!this.plugin.settings.difyApiKey.trim()||this.plugin.getConfiguredBaseUrls().length===0?this.plugin.t("connectionMissing"):e==="connected"?this.plugin.t("connectionConnected"):e==="failed"?this.plugin.t("connectionFailedState"):e==="missing_config"?this.plugin.t("connectionMissing"):this.plugin.t("connectionUnknown")}getConnectionStatusToneClass(){let e=this.plugin.settings.connectionHealth.status;return!this.plugin.settings.difyApiKey.trim()||this.plugin.getConfiguredBaseUrls().length===0?"is-muted":e==="connected"?"is-success":e==="failed"?"is-error":"is-muted"}getActiveUrlLabel(){let e=this.plugin.settings.connectionHealth;return te(e.activeBaseUrl||e.lastSuccessfulBaseUrl||b(this.plugin.settings.difyApiUrl)||"-")}getConnectionNote(){let e=this.plugin.settings.connectionHealth;return!this.plugin.settings.difyApiKey.trim()||this.plugin.getConfiguredBaseUrls().length===0?this.plugin.t("connectionNoteMissing"):e.status==="connected"?this.plugin.t("connectionNoteSuccess",{count:e.datasetCount,url:te(e.activeBaseUrl||e.lastSuccessfulBaseUrl)}):e.status==="failed"&&e.error?this.plugin.t("connectionNoteFailed",{message:e.error}):this.plugin.t("connectionNoteIdle")}},$=class extends p.Modal{constructor(e,t){super(e);this.plugin=t}onOpen(){let{contentEl:e}=this;e.empty(),this.modalEl.addClass("dify-sync-modal-shell"),this.modalEl.addClass("help-modal-shell"),e.addClass("dify-sync-modal"),e.addClass("help-modal"),e.createDiv("modal-head").createDiv("modal-title-line").createEl("h2",{text:this.plugin.t("helpModalTitle"),attr:{id:"help-modal-title"}});let n=e.createDiv({cls:"help-modal-body",attr:{role:"document","aria-labelledby":"help-modal-title"}});this.getHelpSections().forEach(s=>this.renderHelpSection(n,s))}getHelpSections(){return[{titleKey:"helpQuickStartTitle",paragraphKeys:["helpQuickStartBody"],orderedListKeys:["helpQuickStartList"]},{titleKey:"helpApiUrlTitle",paragraphKeys:["helpApiUrlBody"]},{titleKey:"helpApiKeyTitle",paragraphKeys:["helpApiKeyBody"]},{titleKey:"helpMappingTitle",paragraphKeys:["helpMappingBody"],listKeys:["helpMappingList"]},{titleKey:"helpSyncModesTitle",listKeys:["helpSyncModesList"]},{titleKey:"helpSyncRecommendedTitle",listKeys:["helpSyncRecommendedList"]},{titleKey:"helpSyncRulesTitle",paragraphKeys:["helpSyncRulesBody"],orderedListKeys:["helpSyncRulesList"]},{titleKey:"helpTroubleshootingTitle",orderedListKeys:["helpTroubleshootingList"]},{titleKey:"helpCommonErrorsTitle",errorListKeys:["helpCommonErrorsList"]},{titleKey:"helpDatasetsTitle",listKeys:["helpDatasetsList"]},{titleKey:"helpFilesNotSyncingTitle",listKeys:["helpFilesNotSyncingList"]},{titleKey:"helpSlowSyncTitle",listKeys:["helpSlowSyncList"]},{titleKey:"helpDuplicateDocsTitle",paragraphKeys:["helpDuplicateDocsBody"],orderedListKeys:["helpDuplicateDocsList"]},{titleKey:"helpDebugTitle",paragraphKeys:["helpDebugBody"]},{titleKey:"helpPrivacyTitle",paragraphKeys:["helpPrivacyBody"]}]}renderHelpSection(e,t){let i=e.createEl("section",{cls:"help-section"});i.createEl("h3",{text:this.plugin.t(t.titleKey)}),(t.paragraphKeys||[]).forEach(n=>{this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})).forEach(s=>{i.createEl("p",{text:s})})}),(t.orderedListKeys||[]).forEach(n=>{this.renderHelpList(i,this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})),!0)}),(t.listKeys||[]).forEach(n=>{this.renderHelpList(i,this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})),!1)}),(t.errorListKeys||[]).forEach(n=>{this.renderHelpErrorList(i,this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})))})}renderHelpList(e,t,i){let n=e.createEl(i?"ol":"ul",{cls:"help-list"});t.forEach(s=>n.createEl("li",{text:s}))}renderHelpErrorList(e,t){let i=e.createDiv("help-error-list");t.forEach(n=>{let s=n.includes("\uFF1A")?"\uFF1A":":",[o,...l]=n.split(s),c=i.createDiv("help-error-item");c.createEl("strong",{text:o.trim()});let d=l.join(s).trim();d&&c.createSpan({text:d})})}splitHelpLines(e){return e.split(` -`).map(t=>t.trim()).filter(Boolean)}},_=class extends p.Modal{constructor(e,t,i,n,s,o,l,c=d=>d){super(e);this.title=t,this.message=i,this.confirmText=n,this.cancelText=s,this.onConfirm=o,this.preview=l,this.labelProvider=c}onOpen(){var h,g;let{contentEl:e}=this;e.empty(),this.modalEl.addClass("dify-sync-modal-shell"),this.modalEl.addClass("confirm-modal-shell"),e.addClass("dify-sync-modal"),e.addClass("confirm-modal"),e.createDiv("modal-head").createDiv("modal-title-line").createEl("h2",{text:this.title,attr:{id:"delete-modal-title"}});let s=e.createDiv("confirm-body").createDiv({cls:"confirm-mapping",attr:{"data-role":"delete-mapping-preview"}}),o=s.createDiv("confirm-mapping-item");o.createEl("strong",{text:this.pluginLabel("mappingFolderColumn"),cls:"confirm-mapping-label"}),o.createSpan({text:((h=this.preview)==null?void 0:h.folder)||"-",cls:"confirm-mapping-value"}).setAttr("data-role","delete-folder");let l=s.createDiv("confirm-mapping-item");l.createEl("strong",{text:this.pluginLabel("datasetName"),cls:"confirm-mapping-label"}),l.createSpan({text:((g=this.preview)==null?void 0:g.datasets)||"-",cls:"confirm-mapping-value"}).setAttr("data-role","delete-datasets");let c=e.createDiv("modal-actions");new p.ButtonComponent(c).setButtonText(this.cancelText).onClick(()=>this.close()).buttonEl.setAttr("data-action","close-delete-confirm"),new p.ButtonComponent(c).setButtonText(this.confirmText).setWarning().onClick(()=>{(async()=>(await this.onConfirm(),this.close()))()}).buttonEl.setAttr("data-action","confirm-delete")}pluginLabel(e){return this.labelProvider(e)}},L=class extends p.Modal{constructor(e,t,i,n){super(e);this.selectedFolder="";this.folderSelected=!1;this.selectedDatasets=new Set;this.pendingMappings=[];this.plugin=t,this.isEditing=!!i,this.mapping=i?{id:i.id,folder:i.folder,datasetIds:[...i.datasetIds],enabled:i.enabled}:{id:N(),folder:"",datasetIds:[],enabled:!0},this.onSave=n}onOpen(){let{contentEl:e}=this;e.empty(),this.modalEl.addClass("dify-sync-modal-shell"),this.modalEl.addClass("mapping-modal-shell"),e.addClass("dify-sync-modal"),e.addClass("mapping-modal"),this.contentEl.addEventListener("click",()=>this.closeSiblingDropdowns()),e.createDiv("modal-head").createDiv("modal-title-line").createEl("h2",{text:this.plugin.t(this.isEditing?"mappingModalTitle":"addMappingModalTitle"),attr:{id:"mapping-modal-title"}});let n=e.createDiv("modal-body"),s=n.createDiv("mapping-builder");this.renderFolderPanel(s);let l=s.createDiv({cls:"mapping-arrow",attr:{"aria-hidden":"true"}}).createDiv("mapping-arrow-icon");(0,p.setIcon)(l,"arrow-right"),this.renderDatasetPanel(s),this.renderPendingMappings(n);let c=e.createDiv("modal-actions");new p.ButtonComponent(c).setButtonText(this.plugin.t("cancel")).onClick(()=>this.close()).buttonEl.setAttr("data-action","close-modal");let u=new p.ButtonComponent(c).setButtonText(this.plugin.t("refreshDatasets")).onClick(()=>{(async()=>{try{await this.plugin.refreshKnowledgeBases(),this.renderDatasetChoices(),new p.Notice(this.plugin.t("datasetsRefreshed",{count:this.plugin.settings.knowledgeBases.length}))}catch(g){this.plugin.showConnectionError(g)}})()});u.buttonEl.setAttr("data-action","refresh-modal-datasets"),u.buttonEl.setAttr("aria-label",this.plugin.t("refreshDatasets")),new p.ButtonComponent(c).setButtonText(this.plugin.t("saveMapping")).setCta().onClick(()=>{this.savePendingMappings()}).buttonEl.setAttr("data-action","save-mapping"),this.isEditing?(this.selectFolder(this.mapping.folder,!1),this.mapping.datasetIds.forEach(g=>this.selectedDatasets.add(g)),this.updateDatasetSummary(),this.addPendingMapping(!1,this.mapping.enabled,this.mapping.id)):(this.updateDatasetSummary(),this.updatePendingVisibility())}renderFolderPanel(e){let t=e.createDiv("mapping-panel");t.createDiv("label-line").createEl("label",{text:this.plugin.t("folderName"),attr:{id:"modal-folder-label"}}),this.folderInputEl=t.createEl("input",{attr:{id:"modal-folder",type:"hidden",value:""}});let n=t.createDiv("dropdown-box");n.addEventListener("click",c=>c.stopPropagation());let s=n.createEl("button",{cls:"dropdown-trigger",attr:{type:"button","aria-expanded":"false","aria-controls":"folder-dropdown-menu","data-action":"toggle-folder-dropdown"}});this.folderSummaryEl=s.createSpan({text:this.plugin.t("selectFolderPlaceholder"),attr:{"data-role":"folder-summary"}}),(0,p.setIcon)(s.createSpan({cls:"dropdown-caret",attr:{"aria-hidden":"true"}}),"chevron-down");let o=n.createDiv({cls:"dropdown-menu",attr:{id:"folder-dropdown-menu"}});o.hidden=!0;let l=o.createEl("input",{cls:"folder-search",attr:{type:"search",placeholder:this.plugin.t("folderSearch"),"aria-label":this.plugin.t("folderSearch")}});this.folderTreeEl=o.createDiv({cls:"folder-tree dify-sync-obsidian-folder-tree",attr:{role:"tree","aria-labelledby":"modal-folder-label"}}),this.renderFolderTree(),s.addEventListener("click",()=>this.toggleMenu(s,o)),l.addEventListener("input",()=>{let c=l.value.trim().toLowerCase();this.applyFolderSearch(c)})}renderDatasetPanel(e){let t=e.createDiv("mapping-panel");t.createDiv("label-line").createEl("label",{text:this.plugin.t("datasetName"),attr:{id:"modal-dataset-label"}}),this.datasetInputEl=t.createEl("input",{attr:{id:"modal-dataset",type:"hidden",value:"","data-dataset-id":""}});let n=t.createDiv("dataset-select-row"),s=n.createDiv("dropdown-box");s.addEventListener("click",l=>l.stopPropagation()),this.datasetTriggerEl=s.createEl("button",{cls:"dropdown-trigger",attr:{type:"button","aria-expanded":"false","aria-controls":"dataset-dropdown-menu","data-action":"toggle-dataset-dropdown"}}),this.datasetSummaryEl=this.datasetTriggerEl.createSpan({attr:{"data-role":"dataset-summary"}}),(0,p.setIcon)(this.datasetTriggerEl.createSpan({cls:"dropdown-caret",attr:{"aria-hidden":"true"}}),"chevron-down"),this.datasetOptionsEl=s.createDiv({cls:"dropdown-menu",attr:{id:"dataset-dropdown-menu"}}),this.datasetOptionsEl.hidden=!0,this.renderDatasetChoices(),this.datasetTriggerEl.addEventListener("click",()=>{if(!this.folderSelected){new p.Notice(this.plugin.t("chooseFolderFirst"));return}this.toggleMenu(this.datasetTriggerEl,this.datasetOptionsEl)}),new p.ButtonComponent(n).setButtonText(this.plugin.t("addPendingMapping")).setCta().onClick(()=>this.addPendingMapping(!0)).buttonEl.setAttr("data-action","add-pending-mapping")}renderFolderTree(){this.folderTreeEl.empty();let e=this.app.vault.getAllLoadedFiles().filter(n=>n instanceof p.TFolder&&!!n.path&&n.path!=="/").map(n=>n.path).sort(),t=this.app.vault.getMarkdownFiles().filter(n=>n.extension.toLowerCase()==="md").map(n=>n.path).sort();if(e.length===0&&t.length===0){this.folderTreeEl.createDiv({text:this.plugin.t("folderPickerEmpty"),cls:"pending-empty"});return}let i=new Map;e.forEach(n=>{let s=n.lastIndexOf("/"),o=s===-1?"":n.slice(0,s),l=i.get(o)||[];l.push({path:n,type:"folder"}),i.set(o,l)}),t.forEach(n=>{let s=n.lastIndexOf("/"),o=s===-1?"":n.slice(0,s),l=i.get(o)||[];l.push({path:n,type:"file"}),i.set(o,l)}),i.forEach(n=>{n.sort((s,o)=>s.type!==o.type?s.type==="folder"?-1:1:s.path.localeCompare(o.path))}),(i.get("")||[]).forEach(n=>this.renderPathNode(n,i,this.folderTreeEl,0))}renderPathNode(e,t,i,n){if(e.type==="file"){this.renderFileNode(e.path,i);return}this.renderFolderNode(e.path,t,i,n)}renderFolderNode(e,t,i,n){let s=t.get(e)||[],o=s.length>0,l=`folder-tree-${e.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase()}`,c=e.split("/").pop()||e,d=i.createDiv({cls:["nav-folder",n===0?"mod-root":""].filter(Boolean).join(" ")});d.dataset.folder=e;let u=d.createDiv({cls:["nav-folder-title",o?"":"is-folder-leaf",e===this.selectedFolder&&this.folderSelected?"is-selected":""].filter(Boolean).join(" "),attr:{role:"treeitem",tabindex:"0","data-action":o?"toggle-tree-folder":"select-folder","aria-expanded":o?"true":null,"data-tree-target":o?l:null}});u.dataset.folder=e;let h=u.createSpan({cls:o?"nav-folder-collapse-indicator dify-sync-folder-toggle":"nav-folder-collapse-indicator dify-sync-folder-toggle is-leaf",attr:{"aria-hidden":"true"}});if(o&&(0,p.setIcon)(h,"chevron-right"),u.createDiv({text:c,cls:"nav-folder-title-content"}),u.createSpan({text:this.getFolderCountLabel(e),cls:"dify-sync-folder-count"}),u.addEventListener("click",()=>{if(o){this.toggleTreeFolder(u),this.selectFolder(e,!1);return}this.selectFolder(e,!0)}),u.addEventListener("keydown",y=>this.handleFolderTreeKeydown(y,u,o)),!o)return;let g=d.createDiv({cls:"nav-folder-children",attr:{id:l,role:"group"}});s.forEach(y=>this.renderPathNode(y,t,g,n+1))}renderFileNode(e,t){let i=e.split("/").pop()||e,n=t.createDiv({cls:"nav-file"});n.dataset.folder=e;let s=n.createDiv({cls:["nav-file-title",e===this.selectedFolder&&this.folderSelected?"is-selected":""].filter(Boolean).join(" "),attr:{role:"treeitem",tabindex:"0","data-action":"select-note"}});s.dataset.folder=e,s.createDiv({text:i,cls:"nav-file-title-content"}),s.addEventListener("click",()=>this.selectFolder(e,!0)),s.addEventListener("keydown",o=>this.handleFolderTreeKeydown(o,s,!1))}applyFolderSearch(e){let t=Array.from(this.folderTreeEl.querySelectorAll(".nav-folder, .nav-file")),i=t.map(n=>n.dataset.folder||"");t.forEach(n=>{let s=n.dataset.folder||"",o=s.toLowerCase(),l=!e||o.includes(e)||i.some(c=>c.startsWith(`${s}/`)&&c.toLowerCase().includes(e));n.hidden=!l}),this.folderTreeEl.querySelectorAll(".nav-folder-title[data-tree-target]").forEach(n=>{let s=this.getFolderChildContainer(n);if(!s)return;if(e){let l=Array.from(s.querySelectorAll(".nav-folder, .nav-file")).some(c=>!c.hidden);s.hidden=!l,n.toggleClass("is-collapsed",!l),n.setAttr("aria-expanded",String(l));return}let o=n.getAttr("aria-expanded")!=="false";s.hidden=!o,n.toggleClass("is-collapsed",!o)})}handleFolderTreeKeydown(e,t,i){var n,s;if(e.key==="Enter"||e.key===" "){e.preventDefault();let o=t.dataset.folder||"";i&&this.toggleTreeFolder(t),this.selectFolder(o,!i);return}if(e.key==="ArrowRight"&&i){e.preventDefault(),this.setFolderExpanded(t,!0);return}if(e.key==="ArrowLeft"&&i){e.preventDefault(),this.setFolderExpanded(t,!1);return}if(e.key==="Escape"){e.preventDefault();let o=this.folderSummaryEl.closest(".dropdown-box");(n=o==null?void 0:o.querySelector(".dropdown-menu"))==null||n.setAttr("hidden","true"),(s=o==null?void 0:o.querySelector(".dropdown-trigger"))==null||s.setAttr("aria-expanded","false")}}getFolderCountLabel(e){return`${this.app.vault.getMarkdownFiles().filter(i=>i.path.startsWith(`${e}/`)).length} \u7BC7`}renderDatasetChoices(){if(this.datasetOptionsEl.empty(),this.datasetOptionsEl.removeClass("is-empty"),this.plugin.settings.knowledgeBases.length===0){this.datasetOptionsEl.addClass("is-empty"),this.datasetOptionsEl.createDiv({text:this.plugin.t("datasetsDropdownEmpty"),cls:"dataset-empty-state"});return}this.plugin.settings.knowledgeBases.forEach(e=>{let t=this.datasetOptionsEl.createEl("label",{cls:"dataset-option"}),i=t.createEl("input",{attr:{type:"checkbox","data-action":"select-dataset","data-dataset":e.name||e.id,"data-dataset-id":e.id}});i.checked=this.selectedDatasets.has(e.id);let n=t.createSpan({cls:"dataset-checkmark",attr:{"aria-hidden":"true"}});(0,p.setIcon)(n,"check"),t.toggleClass("is-selected",i.checked),i.addEventListener("change",()=>{i.checked?this.selectedDatasets.add(e.id):this.selectedDatasets.delete(e.id),t.toggleClass("is-selected",i.checked),this.updateDatasetSummary()});let s=t.createSpan();s.createSpan({text:e.name||e.id}),s.createEl("small",{text:e.id})})}renderPendingMappings(e){let t=e.createDiv("pending-mappings"),i=t.createDiv("pending-mapping-head");i.createDiv("label-line").createEl("label",{text:this.plugin.t("pendingMappingsTitle")});let s=i.createDiv("pending-bulk-actions");s.setAttr("aria-label",this.plugin.t("bulkSet"));let o=new p.ButtonComponent(s).setButtonText(this.plugin.t("enableAll")).setClass("bulk-action").onClick(()=>this.setAllPendingStatus(!0));this.enableAllButtonEl=o.buttonEl,this.enableAllButtonEl.setAttr("data-action","enable-all-pending");let l=new p.ButtonComponent(s).setButtonText(this.plugin.t("pauseAll")).setClass("bulk-action").onClick(()=>this.setAllPendingStatus(!1));this.pauseAllButtonEl=l.buttonEl,this.pauseAllButtonEl.setAttr("data-action","pause-all-pending"),this.pendingEmptyEl=t.createDiv({text:this.plugin.t("pendingEmptyDesc"),cls:"pending-empty",attr:{"data-role":"pending-empty"}}),this.pendingTableEl=t.createDiv({cls:"mapping-table pending-mapping-table",attr:{"data-role":"pending-mapping-table",hidden:"true"}}),this.renderPendingHeader();let c=t.createDiv({cls:"mapping-pagination",attr:{"data-role":"pending-pagination"}});new p.ButtonComponent(c).setButtonText("\u2039").setDisabled(!0),this.pendingPageInfoEl=c.createSpan({text:"0-0 / 0",attr:{"data-role":"pending-page-info"}}),new p.ButtonComponent(c).setButtonText("\u203A").setDisabled(!0)}renderPendingHeader(){this.pendingTableEl.empty();let e=this.pendingTableEl.createDiv({cls:"mapping-header",attr:{role:"row"}});e.createDiv({text:this.plugin.t("mappingIndex")}),e.createDiv({text:this.plugin.t("mappingFolderColumn")}),e.createDiv({text:this.plugin.t("mappingDatasetColumn")}),e.createDiv({text:this.plugin.t("mappingStatusColumn")}),e.createDiv({text:this.plugin.t("mappingActionColumn")})}addPendingMapping(e=!0,t=!0,i=N()){if(!this.folderSelected){new p.Notice(this.plugin.t("chooseFolderFirst"));return}if(this.selectedDatasets.size===0){new p.Notice(this.plugin.t("datasetMissing"));return}let n={id:i,folder:M(this.selectedFolder),datasetIds:Array.from(this.selectedDatasets),enabled:t};this.pendingMappings=this.isEditing?[n]:this.pendingMappings.filter(s=>s.folder!==n.folder).concat(n),e&&new p.Notice(this.plugin.t("pendingAdded")),this.renderPendingRows(),this.resetDraft()}renderPendingRows(){this.renderPendingHeader(),this.pendingMappings.forEach((e,t)=>{let i=this.pendingTableEl.createDiv({cls:"mapping-row",attr:{role:"row"}});se(i,this.plugin,e,t,"toggle-pending-status",()=>{e.enabled=!e.enabled,this.renderPendingRows()},n=>{let s=new p.ExtraButtonComponent(n).setIcon("refresh-cw").setTooltip(this.plugin.t("refreshDatasets")).onClick(()=>{(async()=>{try{await this.plugin.refreshKnowledgeBases(),this.renderDatasetChoices(),new p.Notice(this.plugin.t("datasetsRefreshed",{count:this.plugin.settings.knowledgeBases.length}))}catch(l){this.plugin.showConnectionError(l)}})()}).extraSettingsEl;s.addClass("icon"),s.setAttr("data-action","refresh-pending-mapping"),s.setAttr("aria-label",this.plugin.t("refreshDatasets")),s.setAttr("title",this.plugin.t("refreshDatasets"));let o=new p.ExtraButtonComponent(n).setIcon("trash-2").setTooltip(this.plugin.t("delete")).onClick(()=>{this.pendingMappings=this.pendingMappings.filter(l=>l.id!==e.id),this.renderPendingRows()}).extraSettingsEl;o.addClass("icon"),o.addClass("danger"),o.setAttr("data-action","remove-pending-mapping"),o.setAttr("aria-label",this.plugin.t("delete"))})}),this.updatePendingVisibility()}updatePendingVisibility(){let e=this.pendingMappings.length;this.pendingTableEl&&(this.pendingTableEl.hidden=e===0,this.pendingTableEl.toggleClass("is-hidden",e===0),this.pendingTableEl.style.display=e===0?"none":""),this.pendingEmptyEl&&(this.pendingEmptyEl.hidden=e>0,this.pendingEmptyEl.toggleClass("is-hidden",e>0),this.pendingEmptyEl.style.display=e>0?"none":""),this.pendingPageInfoEl&&this.pendingPageInfoEl.setText(e?`1-${e} / ${e}`:"0-0 / 0"),this.enableAllButtonEl&&(this.enableAllButtonEl.disabled=e===0),this.pauseAllButtonEl&&(this.pauseAllButtonEl.disabled=e===0)}setAllPendingStatus(e){this.pendingMappings=this.pendingMappings.map(t=>({...t,enabled:e})),this.renderPendingRows()}async savePendingMappings(){if(this.pendingMappings.length===0){new p.Notice(this.plugin.t("validationMapping"));return}for(let e of this.pendingMappings)await this.onSave(e);this.close()}selectFolder(e,t){var i,n;if(this.selectedFolder=e,this.folderSelected=!0,this.folderInputEl&&(this.folderInputEl.value=e),this.folderSummaryEl.setText(e||this.plugin.t("rootFolder")),this.folderTreeEl.querySelectorAll(".nav-folder-title, .nav-file-title").forEach(s=>{s.toggleClass("is-selected",s.dataset.folder===e)}),this.datasetTriggerEl.disabled=!1,this.updateDatasetSummary(),t){let s=this.folderSummaryEl.closest(".dropdown-box");(i=s==null?void 0:s.querySelector(".dropdown-menu"))==null||i.setAttr("hidden","true"),(n=s==null?void 0:s.querySelector(".dropdown-trigger"))==null||n.setAttr("aria-expanded","false")}}updateDatasetSummary(){if(!this.datasetSummaryEl)return;if(!this.folderSelected){this.datasetSummaryEl.setText(this.plugin.t("chooseFolderFirst")),this.datasetTriggerEl&&(this.datasetTriggerEl.disabled=!0),this.datasetInputEl&&(this.datasetInputEl.value="",this.datasetInputEl.dataset.datasetId="");return}if(this.selectedDatasets.size===0){this.datasetSummaryEl.setText(this.plugin.t("datasetName")),this.datasetInputEl&&(this.datasetInputEl.value="",this.datasetInputEl.dataset.datasetId="");return}let e=Array.from(this.selectedDatasets),t=e.map(i=>this.plugin.getDatasetName(i));this.datasetSummaryEl.setText(t.join("\u3001")),this.datasetInputEl&&(this.datasetInputEl.value=t.join(","),this.datasetInputEl.dataset.datasetId=e.join(","))}resetDraft(){this.isEditing||(this.folderSelected=!1,this.selectedFolder="",this.selectedDatasets.clear(),this.folderInputEl&&(this.folderInputEl.value=""),this.folderSummaryEl.setText(this.plugin.t("selectFolderPlaceholder")),this.renderDatasetChoices(),this.updateDatasetSummary())}toggleMenu(e,t){if(e.getAttr("aria-expanded")==="true"){e.setAttr("aria-expanded","false"),t.hidden=!0;return}this.closeSiblingDropdowns(t),e.setAttr("aria-expanded","true"),t.hidden=!1}closeSiblingDropdowns(e){let t=(e==null?void 0:e.closest(".dify-sync-modal"))||this.contentEl;t.querySelectorAll(".dropdown-menu").forEach(i=>{var s;if(i===e)return;i.hidden=!0;let n=i.id?t.querySelector(`.dropdown-trigger[aria-controls="${i.id}"]`):(s=i.parentElement)==null?void 0:s.querySelector(".dropdown-trigger");n==null||n.setAttr("aria-expanded","false")})}toggleTreeFolder(e){let t=e.getAttr("aria-expanded")==="true";this.setFolderExpanded(e,!t)}setFolderExpanded(e,t){let i=this.getFolderChildContainer(e);i&&(e.setAttr("aria-expanded",String(t)),e.toggleClass("is-collapsed",!t),i.hidden=!t)}getFolderChildContainer(e){let t=e.dataset.treeTarget,i=t?this.contentEl.querySelector(`#${t}`):null;return i!=null&&i.instanceOf(HTMLElement)?i:null}onClose(){this.contentEl.empty()}};function ne(){return{status:"unknown",checkedAt:"",activeBaseUrl:"",lastSuccessfulBaseUrl:"",datasetCount:0,latencyMs:0}}function De(a){if(f(a))return ie(a.reason)?a.reason:void 0}function be(a){let r=a.document;if(X(r))return r;let e=a.data;return X(e)?e:void 0}function X(a){return f(a)&&typeof a.id=="string"}function we(a){return f(a)?Object.fromEntries(Object.entries(a).filter(r=>Ee(r[1]))):{}}function Ee(a){return f(a)&&typeof a.filePath=="string"&&typeof a.datasetId=="string"&&typeof a.remoteName=="string"&&typeof a.hash=="string"&&typeof a.lastModified=="number"&&typeof a.lastSyncedAt=="string"}function Ae(a){let r=ne(),e=f(a)?a:{},t=["unknown","missing_config","connected","failed"].includes(String(e.status))?e.status:r.status,i=ie(e.reason)?e.reason:void 0;return{status:t,checkedAt:S(e,"checkedAt")||r.checkedAt,activeBaseUrl:S(e,"activeBaseUrl")||r.activeBaseUrl,lastSuccessfulBaseUrl:S(e,"lastSuccessfulBaseUrl")||r.lastSuccessfulBaseUrl,datasetCount:v(C(e,"datasetCount")||r.datasetCount,0,1e5,r.datasetCount),latencyMs:v(C(e,"latencyMs")||r.latencyMs,0,6e5,r.latencyMs),error:S(e,"error"),reason:i,statusCode:C(e,"statusCode")}}function ke(a){for(let r=a.candidates.length-1;r>=0;r--){let e=a.candidates[r];if(!e.ok)return e}}function Ce(a){let r={missing_config:"connectionErrorMissingConfig",auth_failed:"connectionErrorAuthFailed",permission_denied:"connectionErrorPermissionDenied",not_found:"connectionErrorNotFound",timeout:"connectionErrorTimeout",network:"connectionErrorNetwork",server:"connectionErrorServer",path_mismatch:"connectionErrorPathMismatch",rate_limited:"connectionErrorRateLimited",unexpected_response:"connectionErrorUnexpectedResponse",unknown:"connectionErrorUnknown"};return r[a]||r.unknown}function ie(a){return["missing_config","auth_failed","permission_denied","not_found","timeout","network","server","path_mismatch","rate_limited","unexpected_response","unknown"].includes(String(a))}function Te(a){return a<1e3?`${a}ms`:`${(a/1e3).toFixed(1)}s`}function ee(a){return{synced:a.synced,skipped:a.skipped,failed:a.failed}}function te(a){return(a||"").replace(/^https?:\/\//i,"")||"-"}function Pe(a){return new Promise(r=>window.setTimeout(r,a))}function se(a,r,e,t,i,n,s){a.dataset.folder=e.folder,a.dataset.dataset=e.datasetIds.map(h=>r.getDatasetName(h)).join(","),a.dataset.datasetId=e.datasetIds.join(","),a.createDiv({text:String(t+1),cls:"mapping-index"}),a.createDiv().createDiv({text:e.folder||r.t("rootFolder"),cls:"folder-name"});let l=a.createDiv("tags");(e.datasetIds.length?e.datasetIds:[""]).forEach(h=>{l.createSpan({text:h?r.getDatasetName(h):r.t("datasetMissing"),cls:"tag dataset-name"})});let d=a.createDiv().createDiv("mapping-status-control"),u=new p.ToggleComponent(d).setValue(e.enabled).onChange(()=>{Promise.resolve(n()).catch(h=>{new p.Notice(w(h))})});u.toggleEl.setAttr("data-action",i),u.toggleEl.setAttr("aria-label",e.enabled?r.t("enabled"):r.t("disabled")),d.createSpan({text:e.enabled?r.t("enabled"):r.t("disabled"),cls:"mapping-status-label"}),s(a.createDiv("row-actions"))}function N(){return`map-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function w(a){return f(a)&&S(a,"message")||String(a)} +Run Sync now again so the plugin rebuilds records.`,helpDebugTitle:"Debug logs",helpDebugBody:"Temporarily enable debug logs when the error stays generic, browser access works but the plugin still fails, NAS / Docker / reverse proxy routing is complex, or you need to report an issue. Do not share API keys, private addresses, note content, or other sensitive information in logs.",helpPrivacyTitle:"Privacy and safety",helpPrivacyBody:"The plugin only reads Markdown files in the current Obsidian vault that match enabled path mappings. It only sends required Markdown content to your configured Dify service URL. It does not send note content to the plugin author or any third-party service other than your configured Dify service. The Dify API key is stored in Obsidian plugin local data; do not commit a {configDir} directory containing plugin settings to a public repository.",navAria:"Obsidian settings navigation",navAbout:"About",navEditor:"Editor",navFiles:"Files and links",navAppearance:"Appearance",navHotkeys:"Hotkeys",navPlugins:"Third-party plugins",clearConnectionConfig:"Clear config",selectPlaceholder:"Please select",showApiKey:"Show API key",hideApiKey:"Hide API key",healthConnection:"Connection",healthActiveUrl:"Active URL",healthRecentSync:"Recent sync",connectionUnknown:"Not tested",connectionMissing:"Needs setup",connectionConnected:"Connected",connectionFailedState:"Failed",recentSyncNone:"No sync yet",quickStepKey:"Enter key",quickStepKeyDesc:"Dify knowledge API key",quickStepTest:"Test connection",quickStepTestDesc:"Find an endpoint and load bases",quickStepMapping:"Add mapping",quickStepMappingDesc:"Choose folder and bases",sectionBasicConnection:"Basic connection",settingsReviewConnectionTitle:"Connection",settingsReviewMappingTitle:"Directory mapping",settingsReviewSyncTitle:"Sync settings",pendingMappingsTitle:"New mappings",bulkSet:"Bulk set",enableAll:"Enable all",pauseAll:"Pause all",chooseFolderFirst:"Select a folder or note first",pendingEmptyDesc:"Select an Obsidian folder or note on the left, then choose Dify knowledge bases on the right and click Add.",pendingAdded:"Mapping added to the list below.",selectFolderPlaceholder:"Select a folder or note",datasetsDropdownEmpty:"Load Dify knowledge bases first",folderSearch:"Search folders or notes",addPendingMapping:"Add",saveMapping:"Save mapping",syncAfterChange:"After changes",fullScanCheck:"Full check",startupSyncShort:"Startup sync",concurrentUpload:"Concurrent uploads",debounceOption8:"8 seconds",debounceOption15:"15 seconds",debounceOption30:"30 seconds",fullScanOption30:"Every 30 minutes",fullScanOption60:"Every 60 minutes",fullScanOptionOff:"Off",concurrencyOption2:"2 files",concurrencyOption4:"4 files",optionOn:"On",optionOff:"Off",settingsReviewLanUrlName:"NAS LAN address",settingsReviewLanUrlPlaceholder:"Enter NAS LAN address",settingsReviewPublicUrlName:"NAS public address",settingsReviewPublicUrlPlaceholder:"Enter NAS public address",basicConnectionDesc:"First-time setup keeps only the essentials; advanced endpoint options are collapsed.",apiUrlName:"Dify service URL",apiUrlDesc:"Use the Dify service URL reachable from this Obsidian device. You may omit http:// or paste a URL ending in /v1 or /v1/datasets.",connectionNoteIdle:"Enter an API key and Dify service URL, then test the connection.",connectionNoteMissing:"Enter an API key and Dify service URL first.",connectionNoteSuccess:"Connected: {count} knowledge bases via {url}.",connectionNoteFailed:"Connection failed: {message}",advancedConnectionSummary:"Advanced connection: LAN/public fallback URLs, API path compatibility, timeout, retries",expand:"Expand",collapse:"Collapse",advancedSync:"Tune advanced options",syncCadenceName:"Sync cadence",syncCadenceDesc:"Sync {debounce}s after changes; run a full check every {interval} minutes.",syncCadenceEventOnly:"Sync {debounce}s after changes; periodic full checks are off.",syncCadenceIntervalOnly:"File change sync is off; run a full check every {interval} minutes.",syncCadenceOff:"Auto sync is off. Manual sync still works.",sectionDiagnostics:"Sync diagnostics",diagnosticsDesc:"Long status lives in diagnostics. The status bar stays short.",metricTotal:"Recent tasks",metricSynced:"Synced",metricSkipped:"Skipped",metricFailed:"Failed",mappingIndex:"#",mappingFolderColumn:"Obsidian path",mappingDatasetColumn:"Dify knowledge bases",mappingStatusColumn:"Status",mappingActionColumn:"Actions",lastError:"Recent error: {message}",deleteMappingTitle:"Delete mapping",deleteMappingDesc:"This only deletes the sync configuration. It will not delete Obsidian files or remote Dify documents.",deleteMappingConfirm:"Delete mapping",mappingSaved:"Mapping saved.",sectionLanguage:"Language",languageName:"Interface language",languageDesc:"Switch settings, notices, and status bar language.",languageChinese:"\u4E2D\u6587",languageEnglish:"English",sectionConnection:"Connection",apiKeyName:"Dify API Key",apiKeyDesc:"API key used to access Dify knowledge base APIs.",apiKeyPlaceholder:"Enter your Dify API key",endpointModeName:"Endpoint strategy",endpointModeDesc:"Fill LAN, public reverse proxy, or cloud URLs when needed. Auto mode tries available URLs in order.",endpointPrimary:"Primary URL",endpointLan:"LAN URL",endpointPublic:"Public URL",endpointAuto:"Auto",primaryUrlName:"Primary API URL",primaryUrlDesc:"Reachable Dify service root URL, for example http://dify-host.example.test:5000 or https://dify.example.com.",lanUrlName:"LAN API URL",lanUrlDesc:"Use this for Dify on NAS/Docker, local Docker, or a LAN server. Prefer a full URL such as http://dify-host.example.test:5000.",publicUrlName:"Public API URL",publicUrlDesc:"Use this for reverse proxy, domain, public port, or Dify Cloud access. It must point to Dify, not a NAS/server admin page.",nasUrlHint:"Deployment URL tip: supports NAS/Docker, local Docker, LAN servers, public reverse proxies, and Dify Cloud. Do not use container-only addresses, api:5001, or localhost on the machine running Dify. Use the Dify root URL reachable from this Obsidian device. If http:// is missing, the plugin will try http:// automatically.",urlPlaceholder:"Enter your Dify service URL",apiPathStyleName:"Dify document API path",apiPathStyleDesc:"Auto is recommended. The plugin supports new create-by-text and legacy create_by_text paths.",apiPathAuto:"Auto compatible",apiPathHyphen:"New hyphen path",apiPathUnderscore:"Legacy underscore path",timeoutName:"Request timeout",timeoutDesc:"Timeout for one Dify API request, in seconds.",retriesName:"Retry count",retriesDesc:"Retries for network failures or 5xx responses.",testConnection:"Test connection",refreshDatasets:"Refresh knowledge bases",connectionOk:"Connected and loaded {count} knowledge bases via {url}",connectionFailed:"Connection failed: {message}",connectionErrorMissingConfig:"Enter a Dify API key and service URL first.",connectionErrorAuthFailed:"The API key is invalid. Check that it is correct.",connectionErrorPermissionDenied:"The API key does not have knowledge base access. Check Dify permissions.",connectionErrorNotFound:"The Dify knowledge base API was not found. Check the Dify service URL, port, and reverse proxy forwarding.",connectionErrorPathMismatch:"The API path is incompatible. Confirm the plugin is on the latest build, retry Test connection, then sync.",connectionErrorRateLimited:"Dify returned too many requests. Lower upload concurrency or try again later.",connectionErrorServer:"Dify returned a server error. Check the Dify container, service logs, or reverse proxy.",connectionErrorTimeout:"The request timed out. Confirm this device can reach the Dify service URL, and check Dify service load, ports, firewall, Tailscale, and reverse proxy.",connectionErrorNetwork:"Network connection failed. Check the URL, port, firewall, Docker mapping, or reverse proxy.",connectionErrorUnexpectedResponse:"The current address did not return the Dify knowledge base API. Check that the URL and port point to Dify.",connectionErrorUnknown:"Connection failed. Check the Dify settings and try again.",datasetsRefreshed:"Refreshed {count} knowledge bases.",datasetsEmpty:"Connected, but this key returned no accessible knowledge bases. Check the key workspace, knowledge base permissions, or whether the Dify service URL points to the correct Dify instance.",sectionMapping:"Path mappings",mappingDesc:"One Obsidian folder or note can sync to multiple Dify knowledge bases, and many paths can share one knowledge base.",addMapping:"Add mapping",edit:"Edit",delete:"Delete",enabled:"Enabled",disabled:"Disabled",rootFolder:"Entire vault",noMappings:"No mappings yet. Add a mapping to enable automatic sync.",mappingPageInfoEmpty:"0-0 / 0",datasetMissing:"No knowledge base selected",datasetUnknown:"Unknown knowledge base",mappingModalTitle:"Edit path mapping",addMappingModalTitle:"Add mapping",folderName:"Obsidian folder or note",folderDesc:"Choose a folder to sync all Markdown notes under it, or choose one note to sync only that note.",selectFolder:"Select folder",datasetName:"Dify knowledge bases",datasetDesc:"Multiple selections are supported. If the list is empty, refresh knowledge bases or enter IDs manually.",manualDatasetIds:"Manual knowledge base IDs",manualDatasetIdsDesc:"Separate multiple IDs with commas, spaces, or new lines.",save:"Save",cancel:"Cancel",selectFolderTitle:"Select Obsidian folder or note",choose:"Choose",sectionAuto:"Auto sync",autoSyncName:"Enable auto sync",autoSyncDesc:"Master switch. Event sync and periodic full scans pause when disabled.",eventSyncName:"Sync after file changes",eventSyncDesc:"Listen to Obsidian create, modify, and rename events, then upload after debounce.",startupSyncName:"Sync after startup",startupSyncDesc:"Check changes after Obsidian finishes loading.",periodicSyncName:"Periodic full scan",periodicSyncDesc:"Fallback for event sync, useful with NAS/Docker, local Docker, LAN servers, Dify Cloud, or multi-device workflows.",syncIntervalName:"Sync interval",syncIntervalDesc:"Periodic full scan interval, in minutes.",debounceName:"Change debounce",debounceDesc:"Wait this many seconds after edits stop before syncing.",concurrencyName:"Concurrent uploads",concurrencyDesc:"Keep this at 1-2 for NAS/Docker, local Docker, or smaller self-hosted deployments to avoid overloading Dify indexing. Adjust for Dify Cloud rate limits.",pollIndexName:"Check indexing status",pollIndexDesc:"Briefly query Dify indexing status after upload. This is slower but more informative.",sectionActions:"Actions & diagnostics",manualSync:"Sync now",manualSyncDesc:"Scan mapped Markdown files and sync changes immediately.",debugName:"Debug logs",debugDesc:"Print detailed sync logs in the developer console.",lastSync:"Last sync: {time}",noLastSync:"No completed sync yet.",lastSyncInitial:"Last sync time: --/--/--",activeEndpoint:"Active endpoint: {url}",noActiveEndpoint:"Active endpoint: no successful connection yet.",recentSyncInitial:"Recent sync: 0 tasks, elapsed 0ms",recentSyncSummary:"Recent sync: {source}, {total} tasks, {synced} synced, {skipped} skipped, {failed} failed, elapsed {elapsed}",recentSyncAddress:"Recent sync endpoint: {url}",recentSyncError:"Recent sync error: {message}",recentSyncFailures:"Recent failed files: {items}",noRecentSync:"No recent sync details yet.",recordsCount:"{count} file-to-knowledge-base sync records stored.",resetRecords:"Reset sync records",resetRecordsDesc:"Remote Dify documents are not deleted. The next sync will compare remote documents again.",resetRecordsDone:"Sync records reset.",hashMigrated:"Legacy sync records migrated.",localDeleted:"Local deletion recorded: {path}",progress:"{current}/{total} processing {name}",folderPickerEmpty:"There are no mappable folders or Markdown notes in this vault."}},R=class extends p.Plugin{constructor(){super(...arguments);this.syncRecords=new Map;this.legacyHashFileName="historyContentHash";this.syncProgressNotice=null;this.queueTimer=null;this.startupSyncTimer=null;this.periodicIntervalId=null;this.pendingPaths=new Set;this.isSyncing=!1}async onload(){await this.loadPluginData(),this.client=new I(this),this.client.setActiveBaseUrl(this.settings.connectionHealth.lastSuccessfulBaseUrl),this.statusBarItem=this.addStatusBarItem(),this.updateStatusBar(this.t("ready")),this.addRibbonIcon("sync",this.t("ribbon"),async()=>{await this.performSync("manual")}).addClass("dify-sync-ribbon-class"),this.addCommand({id:"dify-sync-manual",name:this.t("commandManual"),callback:async()=>{await this.performSync("manual")}}),this.addCommand({id:"dify-sync-toggle-auto",name:this.t("commandToggleAuto"),callback:async()=>{this.settings.autoSyncEnabled=!this.settings.autoSyncEnabled,await this.savePluginData(),this.setupAutoSync(),new p.Notice(this.settings.autoSyncEnabled?this.t("autoOn"):this.t("autoOff"))}}),this.settingTab=new q(this.app,this),this.addSettingTab(this.settingTab),this.app.workspace.onLayoutReady(async()=>{await this.migrateLegacyHashStorage(),this.registerVaultEvents(),this.setupAutoSync(),this.settings.autoSyncEnabled&&this.settings.syncOnStartup&&(this.startupSyncTimer=window.setTimeout(()=>{this.startupSyncTimer=null,this.queueFullSync("startup")},5e3))})}onunload(){this.queueTimer!==null&&window.clearTimeout(this.queueTimer),this.startupSyncTimer!==null&&window.clearTimeout(this.startupSyncTimer),this.periodicIntervalId!==null&&window.clearInterval(this.periodicIntervalId)}t(e,t){var s;let n=(O[((s=this.settings)==null?void 0:s.language)||"zh-CN"]||O["zh-CN"])[e]||O["zh-CN"][e]||e;return t&&Object.entries(t).forEach(([o,l])=>{n=n.replace(new RegExp(`\\{${o}\\}`,"g"),String(l))}),n}debug(...e){this.settings.debugLogging&&console.log("[Dify Sync]",...e)}getConnectionFailureMessage(e="unknown"){return this.t(Ce(e))}showConnectionError(e){let t=this.getConnectionFailureReason(e);new p.Notice(this.t("connectionFailed",{message:this.getConnectionFailureMessage(t)}),8e3).messageEl.addClass("dify-sync-error-notice")}getConnectionFailureReason(e){if(!this.hasCompleteConnectionSettings())return"missing_config";let t=De(e);return t||(e instanceof m?T(e):this.settings.connectionHealth.status==="failed"&&this.settings.connectionHealth.reason?this.settings.connectionHealth.reason:"unknown")}hasCompleteConnectionSettings(){return!!this.settings.difyApiKey.trim()&&this.getConfiguredBaseUrls().length>0}async loadPluginData(){let e=await this.loadData(),t=f(e)?e:{},i=f(t.settings)?t.settings:t;this.settings=this.normalizeSettings(i,!!e),this.syncRecords=new Map(Object.entries(we(t.syncRecords))),await this.savePluginData()}async savePluginData(){let e={};this.syncRecords.forEach((t,i)=>{e[i]=t}),await this.saveData({schemaVersion:2,settings:this.settings,syncRecords:e})}normalizeSettings(e,t=!1){let i=f(e)?e:{},n=Object.assign({},ve,i);if(n.schemaVersion=2,n.initialSetupCompleted=typeof i.initialSetupCompleted=="boolean"?i.initialSetupCompleted:t,n.language=n.language==="en"?"en":"zh-CN",n.endpointMode=["primary","lan","public","auto"].includes(n.endpointMode)?n.endpointMode:"primary",n.apiPathStyle=["auto","hyphen","underscore"].includes(n.apiPathStyle)?n.apiPathStyle:"auto",n.syncInterval=v(n.syncInterval,5,240,30),n.debounceSeconds=v(n.debounceSeconds,1,120,8),n.requestTimeoutSeconds=v(n.requestTimeoutSeconds,5,180,30),n.maxRetries=v(n.maxRetries,0,5,2),n.maxConcurrent=v(n.maxConcurrent,1,5,2),n.knowledgeBases=Array.isArray(n.knowledgeBases)?n.knowledgeBases:[],n.obsidianFolders=Array.isArray(n.obsidianFolders)?n.obsidianFolders:[],n.mappings=Array.isArray(n.mappings)?n.mappings:[],n.connectionHealth=ke(i.connectionHealth),n.mappings.length===0&&n.difyKnowledgeId){let s=n.obsidianFolders.length>0?n.obsidianFolders:[""];n.mappings=s.map(o=>({id:N(),folder:o,datasetIds:[n.difyKnowledgeId],enabled:!0}))}return n.mappings=n.mappings.map(s=>({id:s.id||N(),folder:M(s.folder||""),datasetIds:D((s.datasetIds||[]).map(o=>o.trim()).filter(Boolean)),enabled:s.enabled!==!1})),n}registerVaultEvents(){this.registerEvent(this.app.vault.on("create",e=>{this.handleVaultChange(e,"event")})),this.registerEvent(this.app.vault.on("modify",e=>{this.handleVaultChange(e,"event")})),this.registerEvent(this.app.vault.on("delete",async e=>{e instanceof p.TFile&&this.isMarkdownFile(e)&&await this.markLocalDeleted(e.path)})),this.registerEvent(this.app.vault.on("rename",async(e,t)=>{e instanceof p.TFile&&this.isMarkdownFile(e)&&(await this.migrateRenamedRecords(t,e.path),this.enqueueFile(e.path,"event"))}))}setupAutoSync(){this.periodicIntervalId!==null&&(window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=null),!(!this.settings.autoSyncEnabled||!this.settings.periodicFullScanEnabled)&&(this.periodicIntervalId=window.setInterval(()=>{this.queueFullSync("interval")},this.settings.syncInterval*60*1e3),this.registerInterval(this.periodicIntervalId))}handleVaultChange(e,t){!this.settings.autoSyncEnabled||!this.settings.eventSyncEnabled||e instanceof p.TFile&&this.isMarkdownFile(e)&&this.enqueueFile(e.path,t)}enqueueFile(e,t){this.pendingPaths.add(e),this.scheduleQueueFlush(t)}queueFullSync(e){this.settings.autoSyncEnabled&&this.scheduleQueueFlush(e,!0)}scheduleQueueFlush(e,t=!1){this.queueTimer!==null&&window.clearTimeout(this.queueTimer),this.queueTimer=window.setTimeout(()=>{this.queueTimer=null;let i=t?void 0:Array.from(this.pendingPaths);this.pendingPaths.clear(),this.performSync(e,i).catch(n=>{let s=this.getConnectionFailureMessage(this.getConnectionFailureReason(n));this.updateStatusBar(this.t("syncFailedShort"),!0),this.showSyncError(this.t("syncFailed",{message:s}))})},this.settings.debounceSeconds*1e3)}async performSync(e="manual",t){if(!this.validateSettings(!0))return;if(this.isSyncing){t&&t.forEach(s=>this.pendingPaths.add(s)),new p.Notice(this.t("syncQueued"));return}this.isSyncing=!0,this.showSyncNotice(this.t("syncNotice")),this.updateStatusBar(this.t("syncing"));let i=new Date,n={synced:0,skipped:0,failed:0,total:0,syncedFiles:[],failedFiles:[]};try{let s=this.getCandidateFiles(t),o=await this.buildSyncPlan(s,n);if(n.total=o.length+n.skipped,o.length===0){this.settings.lastSyncTime=new Date().toISOString(),this.settings.recentSyncResult=this.createRecentSyncResult(e,i,n),this.markConnectionSuccessFromActive(),await this.savePluginData(),this.updateStatusBar(this.t("ready")),this.showSyncComplete(n);return}let l=await this.loadDocumentIndexes(o);await this.processTasks(o,l,n),this.settings.lastSyncTime=new Date().toISOString();let c=n.failed>0?this.t("syncComplete",ee(n)):void 0;this.settings.recentSyncResult=this.createRecentSyncResult(e,i,n,c),n.failed>0&&n.synced===0?this.markConnectionFailure(new m(c||this.t("syncFailedShort"))):this.markConnectionSuccessFromActive(),await this.savePluginData(),this.updateStatusBar(n.failed>0?this.t("syncFailedShort"):this.t("ready"),n.failed>0),this.showSyncComplete(n)}catch(s){let o=this.getConnectionFailureMessage(this.getConnectionFailureReason(s));this.settings.recentSyncResult=this.createRecentSyncResult(e,i,n,o),this.markConnectionFailure(s),await this.savePluginData(),this.updateStatusBar(this.t("syncFailedShort"),!0),this.showSyncError(this.t("syncFailed",{message:o}))}finally{if(this.isSyncing=!1,this.pendingPaths.size>0){let s=Array.from(this.pendingPaths);this.pendingPaths.clear(),window.setTimeout(()=>{this.performSync("event",s).catch(o=>{let l=this.getConnectionFailureMessage(this.getConnectionFailureReason(o));this.updateStatusBar(this.t("syncFailedShort"),!0),this.showSyncError(this.t("syncFailed",{message:l}))})},1e3)}}}getCandidateFiles(e){if(!e)return this.app.vault.getMarkdownFiles();let t=[];return D(e).forEach(i=>{let n=this.app.vault.getAbstractFileByPath(i);n instanceof p.TFile&&this.isMarkdownFile(n)&&t.push(n)}),t}async buildSyncPlan(e,t){let i=[];for(let n of e){let s=this.getDatasetIdsForPath(n.path);if(s.length===0)continue;let o=await this.app.vault.cachedRead(n),l=this.hashContent(o),c=this.makeRemoteName(n.path);for(let d of s){H(this.syncRecords,d,n.path,l,g=>this.makeRemoteName(g));let u=this.getRecordKey(d,n.path),h=this.syncRecords.get(u);if(h&&h.hash===l&&h.documentId&&!h.deletedLocal&&h.remoteName===c){t.skipped++;continue}i.push({file:n,content:o,hash:l,datasetId:d,remoteName:c,recordKey:u})}}return i}async loadDocumentIndexes(e){let t=D(e.map(n=>n.datasetId)),i=new Map;for(let n of t){let s=await this.client.listDocuments(n),o={byId:new Map,byName:new Map};s.forEach(l=>{o.byId.set(l.id,l),l.name&&o.byName.set(l.name,l)}),i.set(n,o)}return i}async processTasks(e,t,i){let n=0,s=0,o=Math.min(this.settings.maxConcurrent,e.length),l=async()=>{for(;n ${c.datasetId}`,u)}}};await Promise.all(Array.from({length:o},l))}async syncTask(e,t){if(!t)throw new Error(`Unable to load remote document index for dataset ${e.datasetId}`);let i=this.syncRecords.get(e.recordKey),n=i!=null&&i.documentId?t.byId.get(i.documentId):void 0,s=t.byName.get(e.remoteName),o=n||s,l;if(o!=null&&o.id)try{l=await this.client.updateDocumentByText(e.datasetId,o.id,e.remoteName,e.content)}catch(u){let h=u instanceof m?u:new m(w(u));if(h.status!==404)throw h;l=await this.client.createDocumentByText(e.datasetId,e.remoteName,e.content)}else l=await this.client.createDocumentByText(e.datasetId,e.remoteName,e.content);let c=be(l),d=(c==null?void 0:c.id)||(o==null?void 0:o.id)||(i==null?void 0:i.documentId);if(!d)throw new Error("Dify did not return a document id.");this.settings.pollIndexStatus&&l.batch&&await this.pollIndexStatus(e.datasetId,l.batch),this.syncRecords.set(e.recordKey,{filePath:e.file.path,datasetId:e.datasetId,documentId:d,remoteName:e.remoteName,hash:e.hash,lastModified:e.file.stat.mtime,lastSyncedAt:new Date().toISOString(),lastBatch:l.batch}),t.byId.set(d,{id:d,name:e.remoteName}),t.byName.set(e.remoteName,{id:d,name:e.remoteName})}async pollIndexStatus(e,t){for(let i=0;i<3;i++)try{await Pe(1200),await this.client.getIndexingStatus(e,t);return}catch(n){this.debug("Indexing status check failed",w(n))}}async refreshKnowledgeBases(e=!0){if(!this.hasCompleteConnectionSettings())throw this.markConnectionMissingConfig(),await this.savePluginData(),new m(this.getConnectionFailureMessage("missing_config"),void 0,void 0,"missing_config");let t=await this.client.probeConnection();if(this.applyConnectionProbe(t),t.status!=="connected")throw await this.savePluginData(),new m(t.error||this.getConnectionFailureMessage(t.reason),t.statusCode,void 0,t.reason||"unknown");let i=t.datasets;return this.settings.knowledgeBases=i,this.settings.lastDatasetRefresh=t.checkedAt,await this.savePluginData(),e&&new p.Notice(i.length>0?this.t("datasetsRefreshed",{count:i.length}):this.t("datasetsEmpty")),i}async testConnection(){try{let e=await this.refreshKnowledgeBases(!1);this.settings.initialSetupCompleted=!0,await this.savePluginData(),new p.Notice(this.t("connectionOk",{count:e.length,url:this.settings.connectionHealth.activeBaseUrl||this.settings.connectionHealth.lastSuccessfulBaseUrl||b(this.settings.difyApiUrl)})),this.settingTab.refreshSettingsView()}catch(e){this.showConnectionError(e)}}applyConnectionProbe(e){var n;let t=Ae(e),i=e.reason||(t==null?void 0:t.reason);this.settings.connectionHealth={status:e.status,checkedAt:e.checkedAt,activeBaseUrl:e.activeBaseUrl,lastSuccessfulBaseUrl:e.lastSuccessfulBaseUrl||this.settings.connectionHealth.lastSuccessfulBaseUrl,datasetCount:e.datasetCount,latencyMs:e.latencyMs,error:e.status==="failed"?this.getConnectionFailureMessage(i||"unknown"):e.error,reason:i,statusCode:(n=e.statusCode)!=null?n:t==null?void 0:t.statusCode}}markConnectionSuccessFromActive(){let e=this.client.getActiveBaseUrl();e&&(this.settings.connectionHealth={...this.settings.connectionHealth,status:"connected",checkedAt:new Date().toISOString(),activeBaseUrl:e,lastSuccessfulBaseUrl:e,error:void 0,reason:void 0,statusCode:void 0})}markConnectionFailure(e){let t=e instanceof m?e:new m(w(e)),i=T(t);this.settings.connectionHealth={...this.settings.connectionHealth,status:"failed",checkedAt:new Date().toISOString(),activeBaseUrl:"",error:this.getConnectionFailureMessage(i),reason:i,statusCode:t.status}}markConnectionMissingConfig(){this.client.clearActiveBaseUrl(),this.settings.connectionHealth={...this.settings.connectionHealth,status:"missing_config",checkedAt:new Date().toISOString(),activeBaseUrl:"",error:this.getConnectionFailureMessage("missing_config"),reason:"missing_config",statusCode:void 0}}invalidateConnectionState(){this.client.clearActiveBaseUrl(),this.settings.connectionHealth={...this.settings.connectionHealth,status:this.settings.difyApiKey.trim()&&this.getConfiguredBaseUrls().length>0?"unknown":"missing_config",checkedAt:"",activeBaseUrl:"",error:void 0,reason:void 0,statusCode:void 0}}createRecentSyncResult(e,t,i,n){let s=new Date;return{source:e,status:n?"failed":"success",startedAt:t.toISOString(),finishedAt:s.toISOString(),elapsedMs:Math.max(0,s.getTime()-t.getTime()),activeBaseUrl:this.client.getActiveBaseUrl(),synced:i.synced,skipped:i.skipped,failed:i.failed,total:i.total,syncedFiles:i.syncedFiles.slice(0,20),failedFiles:i.failedFiles.slice(0,20),error:n}}getDatasetIdsForPath(e){return G(e,this.settings.mappings)}makeRemoteName(e){return e}getRecordKey(e,t){return k(e,t)}hashContent(e){let t=2166136261;for(let i=0;i>>0).toString(16)}async markLocalDeleted(e){let t=!1;this.syncRecords.forEach((i,n)=>{i.filePath===e&&(this.syncRecords.set(n,{...i,deletedLocal:!0,lastSyncedAt:new Date().toISOString()}),t=!0)}),t&&(await this.savePluginData(),new p.Notice(this.t("localDeleted",{path:e})))}async migrateRenamedRecords(e,t){B(this.syncRecords,e,t,n=>this.makeRemoteName(n))&&await this.savePluginData()}async migrateLegacyHashStorage(){if(!(this.syncRecords.size>0||this.settings.mappings.length===0))try{let t=this.app.vault.getAbstractFileByPath(this.legacyHashFileName);if(!(t instanceof p.TFile))return;let i=await this.app.vault.read(t),n=A(i);if(!f(n))return;Object.entries(n).forEach(([s,o])=>{let l=f(o)?o:{};this.getDatasetIdsForPath(s).forEach(d=>{this.syncRecords.set(this.getRecordKey(d,s),{filePath:s,datasetId:d,remoteName:this.makeRemoteName(s),hash:S(l,"hash")||"",lastModified:C(l,"lastModified")||0,lastSyncedAt:new Date().toISOString()})})}),this.syncRecords.size>0&&(await this.savePluginData(),new p.Notice(this.t("hashMigrated")))}catch(t){this.debug("Legacy hash migration failed",w(t))}}validateSettings(e){return this.validateConnectionSettings(e)&&this.validateMappingSettings(e)}validateConnectionSettings(e){return this.hasCompleteConnectionSettings()?!0:(e&&this.showConnectionError(new m(this.getConnectionFailureMessage("missing_config"),void 0,void 0,"missing_config")),!1)}validateMappingSettings(e){return this.settings.mappings.some(i=>i.enabled&&i.datasetIds.length>0)?!0:(e&&new p.Notice(this.t("validationMapping")),!1)}getConfiguredBaseUrls(){return D([b(this.settings.difyApiUrl)].filter(Boolean))}getActiveBaseUrl(){return this.client.getActiveBaseUrl()}isMarkdownFile(e){return e.extension.toLowerCase()==="md"}updateStatusBar(e,t=!1){this.statusBarItem.setText(`Dify: ${e}`),this.statusBarItem.toggleClass("dify-sync-error",t),this.statusBarItem.toggleClass("dify-sync-syncing",e===this.t("syncing"))}showSyncProgress(e,t,i){let n=i>0?Math.round(t/i*100):0,s=`${e} +${this.createProgressBar(n)} ${n}% (${t}/${i})`;this.showPersistentNotice(s)}showSyncNotice(e){this.showPersistentNotice(e)}showPersistentNotice(e){if(!this.syncProgressNotice){this.syncProgressNotice=new p.Notice(e,0),this.syncProgressNotice.messageEl.addClass("dify-sync-progress");return}this.syncProgressNotice.messageEl.textContent=e}showSyncComplete(e){this.hideProgressNotice();let t=e.total===0?this.t("syncNoChanges"):this.t("syncComplete",ee(e));new p.Notice(t,5e3).messageEl.addClass("dify-sync-complete")}showSyncError(e){this.hideProgressNotice(),new p.Notice(e,8e3).messageEl.addClass("dify-sync-error-notice")}hideProgressNotice(){this.syncProgressNotice&&(this.syncProgressNotice.hide(),this.syncProgressNotice=null)}createProgressBar(e){let i=Math.round(e/100*20);return`[${"\u2588".repeat(i)}${"\u2591".repeat(20-i)}]`}getDatasetLabel(e){let t=this.settings.knowledgeBases.find(i=>i.id===e);return t?`${t.name} (${t.id})`:`${this.t("datasetUnknown")} (${e})`}getDatasetName(e){let t=this.settings.knowledgeBases.find(i=>i.id===e);return(t==null?void 0:t.name)||e}},q=class extends p.PluginSettingTab{constructor(e,t){super(e,t);this.mainMappingPage=0;this.mainMappingPageSize=4;this.outerScrollHostClass="dify-sync-outer-scroll-host";this.innerScrollHostClass="dify-sync-inner-scroll-host";this.outerScrollHosts=new Set;this.scrollbarMarkToken=0;this.renderMode="legacy";this.plugin=t}getSettingDefinitions(){return[{name:this.plugin.t("settingsTitle"),desc:this.plugin.t("settingsSubtitle"),render:e=>(this.renderMode="declarative",this.renderSettingsApp(e.settingEl),()=>{this.scrollbarMarkToken++,this.clearScrollbarHosts()})}]}display(){this.renderLegacySettingsView()}refreshSettingsView(){if(this.renderMode==="declarative"){this.update();return}this.renderLegacySettingsView()}renderLegacySettingsView(){this.renderMode="legacy",this.scrollbarMarkToken++,this.clearScrollbarHosts();let{containerEl:e}=this;e.empty(),this.renderSettingsApp(e)}renderSettingsApp(e){e.addClass("dify-sync-settings");let t=e.createDiv("app"),n=t.createEl("main",{cls:"main"}).createDiv("settings");this.renderTopbar(n),this.renderSyncSummary(n);let s=n.createDiv("dify-sync-content");this.renderConnectionSection(s),this.renderMappingSection(s),this.renderSyncSettingsSection(s),t.createDiv({cls:"toast-region",attr:{"aria-live":"polite","aria-atomic":"true"}}),this.scheduleScrollbarHostMarking(e)}hide(){this.scrollbarMarkToken++,this.clearScrollbarHosts(),super.hide()}scheduleScrollbarHostMarking(e){let t=++this.scrollbarMarkToken;this.clearScrollbarHosts(),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{t===this.scrollbarMarkToken&&e.isConnected&&this.markScrollbarHosts(e)})})}markScrollbarHosts(e){this.clearScrollbarHosts();let t=this.findScrollableAncestors(e);if(t.length===0)return;this.innerScrollHost=e,e.addClass(this.innerScrollHostClass),t.forEach(s=>this.addOuterScrollHost(s));let i=t[0],n=s=>this.handleSettingsWheel(s,e,i);e.addEventListener("wheel",n,{passive:!1}),this.wheelCleanup=()=>e.removeEventListener("wheel",n)}findScrollableAncestors(e){let t=[],i=e.parentElement;for(;i;)this.isVerticalScrollHost(i)&&t.push(i),i=i.parentElement;return t}isVerticalScrollHost(e){let t=window.getComputedStyle(e).overflowY;return e.scrollHeight>e.clientHeight+1&&["auto","scroll","overlay"].includes(t)}addOuterScrollHost(e){e.addClass(this.outerScrollHostClass),this.outerScrollHosts.add(e)}handleSettingsWheel(e,t,i){if(e.defaultPrevented||e.deltaY===0||this.targetCanScrollWithin(e.target,t,e.deltaY))return;let n=i.scrollTop;i.scrollTop+=e.deltaY,i.scrollTop!==n&&(e.preventDefault(),e.stopPropagation())}targetCanScrollWithin(e,t,i){let n=e instanceof HTMLElement?e:null;for(;n&&n!==t;){if(!this.outerScrollHosts.has(n)&&this.elementCanScrollInDirection(n,i))return!0;n=n.parentElement}return!1}elementCanScrollInDirection(e,t){return this.isVerticalScrollHost(e)?t<0?e.scrollTop>0:e.scrollTop+e.clientHeighti.removeClass(this.outerScrollHostClass)),this.outerScrollHosts.clear(),(t=this.innerScrollHost)==null||t.removeClass(this.innerScrollHostClass),this.innerScrollHost=void 0}renderTopbar(e){let t=e.createEl("header",{cls:"topbar"}),i=t.createDiv("title-line");new p.Setting(i).setName(this.plugin.t("settingsTitle")).setHeading().nameEl.addClass("heading-text"),i.createEl("p",{text:this.plugin.t("settingsSubtitle"),cls:"settings-subtitle"});let s=t.createDiv("top-actions"),o=new p.ExtraButtonComponent(s).setIcon("languages").setTooltip(this.plugin.t("languageName")),l=o.extraSettingsEl;o.onClick(()=>this.openLanguageMenu(l)),l.addClass("language-button"),l.setAttr("aria-label",this.plugin.t("languageName")),l.setAttr("title",this.plugin.t("languageName")),l.setAttr("data-action","open-language-menu");let c=new p.ExtraButtonComponent(s).setIcon("help-circle").setTooltip(this.plugin.t("openHelp")).onClick(()=>{new $(this.app,this.plugin).open()}).extraSettingsEl;c.addClass("help-button"),c.setAttr("aria-label",this.plugin.t("openHelp")),c.setAttr("title",this.plugin.t("openHelp")),c.setAttr("data-action","open-help");let d=s.createEl("a",{cls:"github-link",href:"https://github.com/BeatsAD/Vault2Dify"});d.setAttr("target","_blank"),d.setAttr("rel","noopener noreferrer"),d.setAttr("aria-label",this.plugin.t("openGithub")),d.setAttr("title","GitHub"),(0,p.setIcon)(d,"github")}openLanguageMenu(e){let t=new p.Menu;[{value:"zh-CN",label:this.plugin.t("languageChinese")},{value:"en",label:this.plugin.t("languageEnglish")}].forEach(s=>{t.addItem(o=>{o.setTitle(s.label).setChecked(this.plugin.settings.language===s.value).onClick(()=>{this.plugin.settings.language!==s.value&&(async()=>(this.plugin.settings.language=s.value,await this.plugin.savePluginData(),this.plugin.updateStatusBar(this.plugin.t("ready")),this.refreshSettingsView()))()})})});let n=e.getBoundingClientRect();t.showAtPosition({x:n.left,y:n.bottom+4,width:n.width})}renderSyncSummary(e){let t=Z({connectionHealth:this.plugin.settings.connectionHealth,recentSyncResult:this.plugin.settings.recentSyncResult}),i={total:this.plugin.t("metricTotal"),synced:this.plugin.t("metricSynced"),skipped:this.plugin.t("metricSkipped"),failed:this.plugin.t("metricFailed")},n=e.createDiv("sync-summary");n.setAttr("aria-label",this.plugin.t("sectionDiagnostics")),t.metrics.forEach(s=>{let o=n.createDiv("metric");o.createDiv({text:i[s.key],cls:"metric-label"}),o.createDiv({text:String(s.value),cls:s.tone==="default"?"metric-value":`metric-value ${s.tone}`})})}renderConnectionSection(e){let{card:t}=this.createReviewSection(e,"connection-title",this.plugin.t("settingsReviewConnectionTitle")),i,n=this.createNativeSetting(t,"setting-row");n.controlEl.addClass("has-secret-toggle"),n.setName(this.createSettingName(this.plugin.t("apiKeyName"),{required:!0})).setTooltip(this.plugin.t("apiKeyDesc")).addText(h=>{i=h.setPlaceholder(this.plugin.t("apiKeyPlaceholder")).setValue(this.plugin.settings.difyApiKey).onChange(g=>{this.plugin.settings.difyApiKey=g.trim(),this.plugin.invalidateConnectionState(),this.plugin.savePluginData()}).inputEl,i.id="dify-api-key",i.type="password",i.setAttr("aria-label",this.plugin.t("apiKeyName"))}).addExtraButton(h=>{let g=h.setIcon("eye").setTooltip(this.plugin.t("showApiKey")).onClick(()=>{let y=i.type==="password";i.type=y?"text":"password",h.setIcon(y?"eye-off":"eye");let E=this.plugin.t(y?"hideApiKey":"showApiKey");h.setTooltip(E),g.setAttr("aria-label",E),g.setAttr("title",E),g.setAttr("aria-pressed",String(y))}).extraSettingsEl;g.addClass("secret-toggle"),g.setAttr("aria-label",this.plugin.t("showApiKey")),g.setAttr("title",this.plugin.t("showApiKey")),g.setAttr("aria-controls","dify-api-key"),g.setAttr("aria-pressed","false")}),this.createNativeSetting(t,"setting-row").setName(this.createSettingName(this.plugin.t("apiUrlName"),{required:!0})).setTooltip(this.plugin.t("apiUrlDesc")).addText(h=>{h.setPlaceholder(this.plugin.t("urlPlaceholder")).setValue(this.plugin.settings.difyApiUrl).onChange(y=>{this.plugin.settings.difyApiUrl=y.trim(),this.plugin.invalidateConnectionState(),this.plugin.savePluginData()}).inputEl.setAttr("aria-label",this.plugin.t("apiUrlName"))});let s=t.createDiv("dataset-refresh-row"),o=s.createDiv("status-line");o.setAttr("aria-label",this.plugin.t("healthConnection")),o.createSpan({cls:`status-dot ${this.getConnectionStatusToneClass()}`}),o.createEl("strong",{text:this.getConnectionStatusLabel()});let l=s.createDiv("connection-action-buttons"),c=new p.ButtonComponent(l).setButtonText(this.plugin.t("clearConnectionConfig")).setClass("native-action-button").onClick(()=>{(async()=>(this.plugin.settings.difyApiKey="",this.plugin.settings.difyApiUrl="",this.plugin.settings.lanApiUrl="",this.plugin.settings.publicApiUrl="",this.plugin.invalidateConnectionState(),await this.plugin.savePluginData(),this.refreshSettingsView()))()});c.buttonEl.setAttr("data-action","clear-connection-config"),c.buttonEl.setAttr("aria-label",this.plugin.t("clearConnectionConfig"));let d;d=new p.ButtonComponent(l).setButtonText(this.plugin.t("testConnection")).setClass("native-action-button").onClick(()=>{d.setDisabled(!0),d.setButtonText(this.plugin.t("syncing")),(async()=>{try{await this.plugin.testConnection()}finally{d.setDisabled(!1),d.setButtonText(this.plugin.t("testConnection")),this.refreshSettingsView()}})()}),d.buttonEl.setAttr("data-action","test-connection"),d.buttonEl.setAttr("aria-label",this.plugin.t("testConnection"));let u=s.createDiv({cls:"callout",attr:{"data-role":"connection-result"}});u.hidden=!0,u.createEl("strong",{text:this.getConnectionStatusLabel()}),u.createSpan({text:this.getConnectionNote()})}renderMappingSection(e){let{card:t}=this.createReviewSection(e,"mapping-title",this.plugin.t("settingsReviewMappingTitle"),c=>{let d=new p.ButtonComponent(c).setButtonText(this.plugin.t("addMapping")).setCta().onClick(()=>{new L(this.app,this.plugin,void 0,async u=>{this.plugin.settings.mappings.push(u),await this.plugin.savePluginData(),new p.Notice(this.plugin.t("mappingSaved")),this.refreshSettingsView()}).open()});d.buttonEl.setAttr("data-action","add-mapping"),d.buttonEl.setAttr("aria-label",this.plugin.t("addMapping"))}),i=t.createDiv({cls:"mapping-table main-mapping-table",attr:{role:"table","aria-label":this.plugin.t("sectionMapping")}}),n=i.createDiv({cls:"mapping-header",attr:{role:"row"}});n.createDiv({text:this.plugin.t("mappingIndex")}),n.createDiv({text:this.plugin.t("mappingFolderColumn")}),n.createDiv({text:this.plugin.t("mappingDatasetColumn")}),n.createDiv({text:this.plugin.t("mappingStatusColumn")}),n.createDiv({text:this.plugin.t("mappingActionColumn")});let s=this.plugin.settings.mappings,o=Math.max(0,Math.ceil(s.length/this.mainMappingPageSize)-1);this.mainMappingPage=Math.min(this.mainMappingPage,o),s.length===0&&i.createDiv({text:this.plugin.t("noMappings"),cls:"main-mapping-empty"});let l=this.mainMappingPage*this.mainMappingPageSize;s.slice(l,l+this.mainMappingPageSize).forEach((c,d)=>{this.renderMappingRow(i,c,l+d)}),this.renderMainMappingPagination(t,this.plugin.settings.mappings.length)}renderMainMappingPagination(e,t){let i=e.createDiv({cls:"main-mapping-pagination mapping-pagination",attr:{"data-role":"main-mapping-pagination"}}),n=Math.max(1,Math.ceil(t/this.mainMappingPageSize)),s=new p.ButtonComponent(i).setButtonText("\u2039"),o=t===0?0:this.mainMappingPage*this.mainMappingPageSize+1,l=t===0?0:Math.min(t,(this.mainMappingPage+1)*this.mainMappingPageSize);i.createSpan({text:t===0?this.plugin.t("mappingPageInfoEmpty"):`${o}-${l} / ${t}`,attr:{"data-role":"main-mapping-page-info"}});let c=new p.ButtonComponent(i).setButtonText("\u203A");s.setDisabled(t===0||this.mainMappingPage===0),c.setDisabled(t===0||this.mainMappingPage>=n-1),s.onClick(()=>{this.mainMappingPage=Math.max(0,this.mainMappingPage-1),this.refreshSettingsView()}),c.onClick(()=>{this.mainMappingPage=Math.min(n-1,this.mainMappingPage+1),this.refreshSettingsView()})}renderMappingRow(e,t,i){let n=e.createDiv({cls:"mapping-row",attr:{role:"row"}});se(n,this.plugin,t,i,"toggle-mapping-status",async()=>{t.enabled=!t.enabled,await this.plugin.savePluginData(),this.refreshSettingsView()},s=>{let o=new p.ExtraButtonComponent(s).setIcon("pencil").setTooltip(this.plugin.t("edit")).onClick(()=>{new L(this.app,this.plugin,t,async c=>{this.plugin.settings.mappings=this.plugin.settings.mappings.map(d=>d.id===c.id?c:d),await this.plugin.savePluginData(),this.refreshSettingsView()}).open()}).extraSettingsEl;o.addClass("icon"),o.setAttr("data-action","edit-mapping"),o.setAttr("aria-label",this.plugin.t("edit")),o.setAttr("title",this.plugin.t("edit"));let l=new p.ExtraButtonComponent(s).setIcon("trash-2").setTooltip(this.plugin.t("delete")).onClick(()=>{new V(this.app,this.plugin.t("deleteMappingTitle"),this.plugin.t("deleteMappingDesc"),this.plugin.t("deleteMappingConfirm"),this.plugin.t("cancel"),async()=>{this.plugin.settings.mappings=J(this.plugin.settings.mappings,t.id),await this.plugin.savePluginData(),this.refreshSettingsView()},{folder:t.folder||this.plugin.t("rootFolder"),datasets:t.datasetIds.map(c=>this.plugin.getDatasetName(c)).join("\u3001")||this.plugin.t("datasetMissing")},c=>this.plugin.t(c)).open()}).extraSettingsEl;l.addClass("icon"),l.addClass("danger"),l.setAttr("data-action","delete-mapping"),l.setAttr("aria-label",this.plugin.t("delete")),l.setAttr("title",this.plugin.t("delete"))})}renderSyncSettingsSection(e){let{card:t}=this.createReviewSection(e,"auto-title",this.plugin.t("settingsReviewSyncTitle"));this.createNativeSetting(t,"setting-row","switch-row").setName(this.createSettingName(this.plugin.t("sectionAuto"))).addToggle(y=>{y.setValue(this.plugin.settings.autoSyncEnabled).onChange(E=>{(async()=>(this.plugin.settings.autoSyncEnabled=E,await this.plugin.savePluginData(),this.plugin.setupAutoSync(),this.refreshSettingsView()))()}),y.toggleEl.setAttr("data-action","toggle-auto-sync")});let i=t.createDiv({attr:{id:"advanced-sync"}});this.createAdvancedSelect(i,this.plugin.t("syncAfterChange"),this.plugin.settings.debounceSeconds,[[8,this.plugin.t("debounceOption8")],[15,this.plugin.t("debounceOption15")],[30,this.plugin.t("debounceOption30")]],async y=>{this.plugin.settings.debounceSeconds=y,await this.plugin.savePluginData()},"debounce"),this.createAdvancedSelect(i,this.plugin.t("fullScanCheck"),this.plugin.settings.periodicFullScanEnabled?this.plugin.settings.syncInterval:0,[[30,this.plugin.t("fullScanOption30")],[60,this.plugin.t("fullScanOption60")],[0,this.plugin.t("fullScanOptionOff")]],async y=>{this.plugin.settings.periodicFullScanEnabled=y>0,y>0&&(this.plugin.settings.syncInterval=y),await this.plugin.savePluginData(),this.plugin.setupAutoSync()},"interval"),this.createAdvancedSelect(i,this.plugin.t("startupSyncShort"),this.plugin.settings.syncOnStartup,[[!0,this.plugin.t("optionOn")],[!1,this.plugin.t("optionOff")]],async y=>{this.plugin.settings.syncOnStartup=y,await this.plugin.savePluginData()},"startup-sync"),this.createAdvancedSelect(i,this.plugin.t("concurrentUpload"),this.plugin.settings.maxConcurrent,[[2,this.plugin.t("concurrencyOption2")],[4,this.plugin.t("concurrencyOption4")]],async y=>{this.plugin.settings.maxConcurrent=v(y,1,5,2),await this.plugin.savePluginData()},"concurrency");let n=t.createEl("details",{cls:"diagnostic-fold"});n.open=!0;let s=n.createEl("summary");s.createSpan({text:this.plugin.t("sectionDiagnostics")}),s.createSpan({text:`Dify: ${this.plugin.t("ready")}`});let o=n.createDiv("diagnostic-body"),l=this.plugin.settings.lastSyncTime?this.plugin.t("lastSync",{time:new Date(this.plugin.settings.lastSyncTime).toLocaleString()}):this.plugin.t("lastSyncInitial");o.createDiv({text:l,cls:"dify-sync-diagnostic-line"}),this.renderRecentSyncResult(o);let c=o.createDiv("sync-actions");new p.ButtonComponent(c).setButtonText(this.plugin.settings.debugLogging?`${this.plugin.t("debugName")} \xB7 ${this.plugin.t("enabled")}`:this.plugin.t("debugName")).onClick(()=>{(async()=>(this.plugin.settings.debugLogging=!this.plugin.settings.debugLogging,await this.plugin.savePluginData(),this.refreshSettingsView()))()}).buttonEl.setAttr("data-action","toggle-debug-logging"),new p.ButtonComponent(c).setButtonText(this.plugin.t("resetRecords")).onClick(()=>{(async()=>(this.plugin.syncRecords.clear(),await this.plugin.savePluginData(),new p.Notice(this.plugin.t("resetRecordsDone")),this.refreshSettingsView()))()}).buttonEl.setAttr("data-action","reset-sync-records");let h=t.createDiv("sync-actions manual-sync-actions"),g;g=new p.ButtonComponent(h).setButtonText(this.plugin.t("manualSync")).setCta().onClick(()=>{g.setDisabled(!0),g.setButtonText(this.plugin.t("syncing")),(async()=>{try{await this.plugin.performSync("manual")}finally{g.setDisabled(!1),g.setButtonText(this.plugin.t("manualSync")),this.refreshSettingsView()}})()}),g.buttonEl.setAttr("data-action","sync-now"),g.buttonEl.setAttr("aria-label",this.plugin.t("manualSync"))}renderRecentSyncResult(e){let t=this.plugin.settings.recentSyncResult;if(!t){e.createDiv({text:this.plugin.t("recentSyncInitial"),cls:"dify-sync-diagnostic-line"});return}e.createDiv({text:this.plugin.t("recentSyncSummary",{source:t.source,total:t.total,synced:t.synced,skipped:t.skipped,failed:t.failed,elapsed:Te(t.elapsedMs)}),cls:"dify-sync-diagnostic-line"}),t.error&&e.createDiv({text:this.plugin.t("recentSyncError",{message:t.error}),cls:"dify-sync-diagnostic-line dify-sync-diagnostic-error"})}createReviewSection(e,t,i,n){let s=e.createEl("section",{cls:"section",attr:{"aria-labelledby":t}}),o=s.createDiv("section-head"),l=o.createDiv("heading-line"),c=new p.Setting(l).setName(i).setHeading();return c.nameEl.addClass("heading-text"),c.nameEl.id=t,n&&n(o),{card:s.createDiv("section-card")}}createSettingName(e,t={}){let i=this.containerEl.doc,n=i.createDocumentFragment(),s=i.createElement("span");if(s.className="setting-label",s.textContent=e,n.appendChild(s),t.required){let o=i.createElement("span");o.className="required-marker",o.textContent="*",o.setAttribute("aria-label","Required"),n.appendChild(o)}return n}createSettingRow(e,t,i,n={}){return{control:this.createNativeSetting(e,"setting-row").setName(this.createSettingName(t,n)).setDesc(i).setTooltip(i).controlEl}}createTextInput(e,t,i,n){let s=e.createEl("input",{attr:{type:"text",placeholder:i,"aria-label":t}});return s.value=n,s}createAdvancedText(e,t,i,n,s,o=this.plugin.t("urlPlaceholder"),l={}){this.createNativeSetting(e,"advanced-field").setName(this.createSettingName(t,l)).addText(c=>{let d=c.setPlaceholder(o).setValue(i).onChange(u=>{n(u.trim())}).inputEl;d.id=s})}createAdvancedNumber(e,t,i,n,s,o,l){let c=e.createDiv("advanced-field");c.createEl("label",{text:t,attr:{for:l}});let d=c.createEl("input",{attr:{id:l,type:"number",min:String(n),max:String(s)}});d.value=String(i),d.addEventListener("change",()=>{o(Number(d.value)).catch(u=>{new p.Notice(w(u))})})}createAdvancedSelect(e,t,i,n,s,o){let l=new Map(n.map(([d])=>[String(d),d])),c=Object.fromEntries(n.map(([d,u])=>[String(d),u]));this.createNativeSetting(e,"advanced-field").setName(this.createSettingName(t)).addDropdown(d=>{d.addOptions(c).setValue(String(i)).onChange(u=>{let h=l.get(u);h!==void 0&&s(h)}),d.selectEl.id=`${o}-select`,d.selectEl.setAttr("aria-label",t)})}createNativeSetting(e,...t){let i=new p.Setting(e).setClass("native-setting-row");return t.forEach(n=>i.settingEl.addClass(n)),i}createHelpIcon(e,t){let i=e.createSpan({text:"?",cls:"help-icon"});i.setAttr("tabindex","0"),i.setAttr("aria-label",t),i.setAttr("data-tooltip",t)}getConnectionStatusLabel(){let e=this.plugin.settings.connectionHealth.status;return!this.plugin.settings.difyApiKey.trim()||this.plugin.getConfiguredBaseUrls().length===0?this.plugin.t("connectionMissing"):e==="connected"?this.plugin.t("connectionConnected"):e==="failed"?this.plugin.t("connectionFailedState"):e==="missing_config"?this.plugin.t("connectionMissing"):this.plugin.t("connectionUnknown")}getConnectionStatusToneClass(){let e=this.plugin.settings.connectionHealth.status;return!this.plugin.settings.difyApiKey.trim()||this.plugin.getConfiguredBaseUrls().length===0?"is-muted":e==="connected"?"is-success":e==="failed"?"is-error":"is-muted"}getActiveUrlLabel(){let e=this.plugin.settings.connectionHealth;return te(e.activeBaseUrl||e.lastSuccessfulBaseUrl||b(this.plugin.settings.difyApiUrl)||"-")}getConnectionNote(){let e=this.plugin.settings.connectionHealth;return!this.plugin.settings.difyApiKey.trim()||this.plugin.getConfiguredBaseUrls().length===0?this.plugin.t("connectionNoteMissing"):e.status==="connected"?this.plugin.t("connectionNoteSuccess",{count:e.datasetCount,url:te(e.activeBaseUrl||e.lastSuccessfulBaseUrl)}):e.status==="failed"&&e.error?this.plugin.t("connectionNoteFailed",{message:e.error}):this.plugin.t("connectionNoteIdle")}},$=class extends p.Modal{constructor(e,t){super(e);this.plugin=t}onOpen(){let{contentEl:e}=this;e.empty(),this.modalEl.addClass("dify-sync-modal-shell"),this.modalEl.addClass("help-modal-shell"),e.addClass("dify-sync-modal"),e.addClass("help-modal"),e.createDiv("modal-head").createDiv("modal-title-line").createEl("h2",{text:this.plugin.t("helpModalTitle"),attr:{id:"help-modal-title"}});let n=e.createDiv({cls:"help-modal-body",attr:{role:"document","aria-labelledby":"help-modal-title"}});this.getHelpSections().forEach(s=>this.renderHelpSection(n,s))}getHelpSections(){return[{titleKey:"helpQuickStartTitle",paragraphKeys:["helpQuickStartBody"],orderedListKeys:["helpQuickStartList"]},{titleKey:"helpApiUrlTitle",paragraphKeys:["helpApiUrlBody"]},{titleKey:"helpApiKeyTitle",paragraphKeys:["helpApiKeyBody"]},{titleKey:"helpMappingTitle",paragraphKeys:["helpMappingBody"],listKeys:["helpMappingList"]},{titleKey:"helpSyncModesTitle",listKeys:["helpSyncModesList"]},{titleKey:"helpSyncRecommendedTitle",listKeys:["helpSyncRecommendedList"]},{titleKey:"helpSyncRulesTitle",paragraphKeys:["helpSyncRulesBody"],orderedListKeys:["helpSyncRulesList"]},{titleKey:"helpTroubleshootingTitle",orderedListKeys:["helpTroubleshootingList"]},{titleKey:"helpCommonErrorsTitle",errorListKeys:["helpCommonErrorsList"]},{titleKey:"helpDatasetsTitle",listKeys:["helpDatasetsList"]},{titleKey:"helpFilesNotSyncingTitle",listKeys:["helpFilesNotSyncingList"]},{titleKey:"helpSlowSyncTitle",listKeys:["helpSlowSyncList"]},{titleKey:"helpDuplicateDocsTitle",paragraphKeys:["helpDuplicateDocsBody"],orderedListKeys:["helpDuplicateDocsList"]},{titleKey:"helpDebugTitle",paragraphKeys:["helpDebugBody"]},{titleKey:"helpPrivacyTitle",paragraphKeys:["helpPrivacyBody"]}]}renderHelpSection(e,t){let i=e.createEl("section",{cls:"help-section"});i.createEl("h3",{text:this.plugin.t(t.titleKey)}),(t.paragraphKeys||[]).forEach(n=>{this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})).forEach(s=>{i.createEl("p",{text:s})})}),(t.orderedListKeys||[]).forEach(n=>{this.renderHelpList(i,this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})),!0)}),(t.listKeys||[]).forEach(n=>{this.renderHelpList(i,this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})),!1)}),(t.errorListKeys||[]).forEach(n=>{this.renderHelpErrorList(i,this.splitHelpLines(this.plugin.t(n,{configDir:this.app.vault.configDir})))})}renderHelpList(e,t,i){let n=e.createEl(i?"ol":"ul",{cls:"help-list"});t.forEach(s=>n.createEl("li",{text:s}))}renderHelpErrorList(e,t){let i=e.createDiv("help-error-list");t.forEach(n=>{let s=n.includes("\uFF1A")?"\uFF1A":":",[o,...l]=n.split(s),c=i.createDiv("help-error-item");c.createEl("strong",{text:o.trim()});let d=l.join(s).trim();d&&c.createSpan({text:d})})}splitHelpLines(e){return e.split(` +`).map(t=>t.trim()).filter(Boolean)}},V=class extends p.Modal{constructor(e,t,i,n,s,o,l,c=d=>d){super(e);this.title=t,this.message=i,this.confirmText=n,this.cancelText=s,this.onConfirm=o,this.preview=l,this.labelProvider=c}onOpen(){var h,g;let{contentEl:e}=this;e.empty(),this.modalEl.addClass("dify-sync-modal-shell"),this.modalEl.addClass("confirm-modal-shell"),e.addClass("dify-sync-modal"),e.addClass("confirm-modal"),e.createDiv("modal-head").createDiv("modal-title-line").createEl("h2",{text:this.title,attr:{id:"delete-modal-title"}});let s=e.createDiv("confirm-body").createDiv({cls:"confirm-mapping",attr:{"data-role":"delete-mapping-preview"}}),o=s.createDiv("confirm-mapping-item");o.createEl("strong",{text:this.pluginLabel("mappingFolderColumn"),cls:"confirm-mapping-label"}),o.createSpan({text:((h=this.preview)==null?void 0:h.folder)||"-",cls:"confirm-mapping-value"}).setAttr("data-role","delete-folder");let l=s.createDiv("confirm-mapping-item");l.createEl("strong",{text:this.pluginLabel("datasetName"),cls:"confirm-mapping-label"}),l.createSpan({text:((g=this.preview)==null?void 0:g.datasets)||"-",cls:"confirm-mapping-value"}).setAttr("data-role","delete-datasets");let c=e.createDiv("modal-actions");new p.ButtonComponent(c).setButtonText(this.cancelText).onClick(()=>this.close()).buttonEl.setAttr("data-action","close-delete-confirm"),Me(new p.ButtonComponent(c).setButtonText(this.confirmText)).setCta().onClick(()=>{(async()=>(await this.onConfirm(),this.close()))()}).buttonEl.setAttr("data-action","confirm-delete")}pluginLabel(e){return this.labelProvider(e)}},L=class extends p.Modal{constructor(e,t,i,n){super(e);this.selectedFolder="";this.folderSelected=!1;this.selectedDatasets=new Set;this.pendingMappings=[];this.plugin=t,this.isEditing=!!i,this.mapping=i?{id:i.id,folder:i.folder,datasetIds:[...i.datasetIds],enabled:i.enabled}:{id:N(),folder:"",datasetIds:[],enabled:!0},this.onSave=n}onOpen(){let{contentEl:e}=this;e.empty(),this.modalEl.addClass("dify-sync-modal-shell"),this.modalEl.addClass("mapping-modal-shell"),e.addClass("dify-sync-modal"),e.addClass("mapping-modal"),this.contentEl.addEventListener("click",()=>this.closeSiblingDropdowns()),e.createDiv("modal-head").createDiv("modal-title-line").createEl("h2",{text:this.plugin.t(this.isEditing?"mappingModalTitle":"addMappingModalTitle"),attr:{id:"mapping-modal-title"}});let n=e.createDiv("modal-body"),s=n.createDiv("mapping-builder");this.renderFolderPanel(s);let l=s.createDiv({cls:"mapping-arrow",attr:{"aria-hidden":"true"}}).createDiv("mapping-arrow-icon");(0,p.setIcon)(l,"arrow-right"),this.renderDatasetPanel(s),this.renderPendingMappings(n);let c=e.createDiv("modal-actions");new p.ButtonComponent(c).setButtonText(this.plugin.t("cancel")).onClick(()=>this.close()).buttonEl.setAttr("data-action","close-modal");let u=new p.ButtonComponent(c).setButtonText(this.plugin.t("refreshDatasets")).onClick(()=>{(async()=>{try{await this.plugin.refreshKnowledgeBases(),this.renderDatasetChoices(),new p.Notice(this.plugin.t("datasetsRefreshed",{count:this.plugin.settings.knowledgeBases.length}))}catch(g){this.plugin.showConnectionError(g)}})()});u.buttonEl.setAttr("data-action","refresh-modal-datasets"),u.buttonEl.setAttr("aria-label",this.plugin.t("refreshDatasets")),new p.ButtonComponent(c).setButtonText(this.plugin.t("saveMapping")).setCta().onClick(()=>{this.savePendingMappings()}).buttonEl.setAttr("data-action","save-mapping"),this.isEditing?(this.selectFolder(this.mapping.folder,!1),this.mapping.datasetIds.forEach(g=>this.selectedDatasets.add(g)),this.updateDatasetSummary(),this.addPendingMapping(!1,this.mapping.enabled,this.mapping.id)):(this.updateDatasetSummary(),this.updatePendingVisibility())}renderFolderPanel(e){let t=e.createDiv("mapping-panel");t.createDiv("label-line").createEl("label",{text:this.plugin.t("folderName"),attr:{id:"modal-folder-label"}}),this.folderInputEl=t.createEl("input",{attr:{id:"modal-folder",type:"hidden",value:""}});let n=t.createDiv("dropdown-box");n.addEventListener("click",c=>c.stopPropagation());let s=n.createEl("button",{cls:"dropdown-trigger",attr:{type:"button","aria-expanded":"false","aria-controls":"folder-dropdown-menu","data-action":"toggle-folder-dropdown"}});this.folderSummaryEl=s.createSpan({text:this.plugin.t("selectFolderPlaceholder"),attr:{"data-role":"folder-summary"}}),(0,p.setIcon)(s.createSpan({cls:"dropdown-caret",attr:{"aria-hidden":"true"}}),"chevron-down");let o=n.createDiv({cls:"dropdown-menu",attr:{id:"folder-dropdown-menu"}});o.hidden=!0;let l=o.createEl("input",{cls:"folder-search",attr:{type:"search",placeholder:this.plugin.t("folderSearch"),"aria-label":this.plugin.t("folderSearch")}});this.folderTreeEl=o.createDiv({cls:"folder-tree dify-sync-obsidian-folder-tree",attr:{role:"tree","aria-labelledby":"modal-folder-label"}}),this.renderFolderTree(),s.addEventListener("click",()=>this.toggleMenu(s,o)),l.addEventListener("input",()=>{let c=l.value.trim().toLowerCase();this.applyFolderSearch(c)})}renderDatasetPanel(e){let t=e.createDiv("mapping-panel");t.createDiv("label-line").createEl("label",{text:this.plugin.t("datasetName"),attr:{id:"modal-dataset-label"}}),this.datasetInputEl=t.createEl("input",{attr:{id:"modal-dataset",type:"hidden",value:"","data-dataset-id":""}});let n=t.createDiv("dataset-select-row"),s=n.createDiv("dropdown-box");s.addEventListener("click",l=>l.stopPropagation()),this.datasetTriggerEl=s.createEl("button",{cls:"dropdown-trigger",attr:{type:"button","aria-expanded":"false","aria-controls":"dataset-dropdown-menu","data-action":"toggle-dataset-dropdown"}}),this.datasetSummaryEl=this.datasetTriggerEl.createSpan({attr:{"data-role":"dataset-summary"}}),(0,p.setIcon)(this.datasetTriggerEl.createSpan({cls:"dropdown-caret",attr:{"aria-hidden":"true"}}),"chevron-down"),this.datasetOptionsEl=s.createDiv({cls:"dropdown-menu",attr:{id:"dataset-dropdown-menu"}}),this.datasetOptionsEl.hidden=!0,this.renderDatasetChoices(),this.datasetTriggerEl.addEventListener("click",()=>{if(!this.folderSelected){new p.Notice(this.plugin.t("chooseFolderFirst"));return}this.toggleMenu(this.datasetTriggerEl,this.datasetOptionsEl)}),new p.ButtonComponent(n).setButtonText(this.plugin.t("addPendingMapping")).setCta().onClick(()=>this.addPendingMapping(!0)).buttonEl.setAttr("data-action","add-pending-mapping")}renderFolderTree(){this.folderTreeEl.empty();let e=this.app.vault.getAllLoadedFiles().filter(n=>n instanceof p.TFolder&&!!n.path&&n.path!=="/").map(n=>n.path).sort(),t=this.app.vault.getMarkdownFiles().filter(n=>n.extension.toLowerCase()==="md").map(n=>n.path).sort();if(e.length===0&&t.length===0){this.folderTreeEl.createDiv({text:this.plugin.t("folderPickerEmpty"),cls:"pending-empty"});return}let i=new Map;e.forEach(n=>{let s=n.lastIndexOf("/"),o=s===-1?"":n.slice(0,s),l=i.get(o)||[];l.push({path:n,type:"folder"}),i.set(o,l)}),t.forEach(n=>{let s=n.lastIndexOf("/"),o=s===-1?"":n.slice(0,s),l=i.get(o)||[];l.push({path:n,type:"file"}),i.set(o,l)}),i.forEach(n=>{n.sort((s,o)=>s.type!==o.type?s.type==="folder"?-1:1:s.path.localeCompare(o.path))}),(i.get("")||[]).forEach(n=>this.renderPathNode(n,i,this.folderTreeEl,0))}renderPathNode(e,t,i,n){if(e.type==="file"){this.renderFileNode(e.path,i);return}this.renderFolderNode(e.path,t,i,n)}renderFolderNode(e,t,i,n){let s=t.get(e)||[],o=s.length>0,l=`folder-tree-${e.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase()}`,c=e.split("/").pop()||e,d=i.createDiv({cls:["nav-folder",n===0?"mod-root":""].filter(Boolean).join(" ")});d.dataset.folder=e;let u=d.createDiv({cls:["nav-folder-title",o?"":"is-folder-leaf",e===this.selectedFolder&&this.folderSelected?"is-selected":""].filter(Boolean).join(" "),attr:{role:"treeitem",tabindex:"0","data-action":o?"toggle-tree-folder":"select-folder","aria-expanded":o?"true":null,"data-tree-target":o?l:null}});u.dataset.folder=e;let h=u.createSpan({cls:o?"nav-folder-collapse-indicator dify-sync-folder-toggle":"nav-folder-collapse-indicator dify-sync-folder-toggle is-leaf",attr:{"aria-hidden":"true"}});if(o&&(0,p.setIcon)(h,"chevron-right"),u.createDiv({text:c,cls:"nav-folder-title-content"}),u.createSpan({text:this.getFolderCountLabel(e),cls:"dify-sync-folder-count"}),u.addEventListener("click",()=>{if(o){this.toggleTreeFolder(u),this.selectFolder(e,!1);return}this.selectFolder(e,!0)}),u.addEventListener("keydown",y=>this.handleFolderTreeKeydown(y,u,o)),!o)return;let g=d.createDiv({cls:"nav-folder-children",attr:{id:l,role:"group"}});s.forEach(y=>this.renderPathNode(y,t,g,n+1))}renderFileNode(e,t){let i=e.split("/").pop()||e,n=t.createDiv({cls:"nav-file"});n.dataset.folder=e;let s=n.createDiv({cls:["nav-file-title",e===this.selectedFolder&&this.folderSelected?"is-selected":""].filter(Boolean).join(" "),attr:{role:"treeitem",tabindex:"0","data-action":"select-note"}});s.dataset.folder=e,s.createDiv({text:i,cls:"nav-file-title-content"}),s.addEventListener("click",()=>this.selectFolder(e,!0)),s.addEventListener("keydown",o=>this.handleFolderTreeKeydown(o,s,!1))}applyFolderSearch(e){let t=Array.from(this.folderTreeEl.querySelectorAll(".nav-folder, .nav-file")),i=t.map(n=>n.dataset.folder||"");t.forEach(n=>{let s=n.dataset.folder||"",o=s.toLowerCase(),l=!e||o.includes(e)||i.some(c=>c.startsWith(`${s}/`)&&c.toLowerCase().includes(e));n.hidden=!l}),this.folderTreeEl.querySelectorAll(".nav-folder-title[data-tree-target]").forEach(n=>{let s=this.getFolderChildContainer(n);if(!s)return;if(e){let l=Array.from(s.querySelectorAll(".nav-folder, .nav-file")).some(c=>!c.hidden);s.hidden=!l,n.toggleClass("is-collapsed",!l),n.setAttr("aria-expanded",String(l));return}let o=n.getAttr("aria-expanded")!=="false";s.hidden=!o,n.toggleClass("is-collapsed",!o)})}handleFolderTreeKeydown(e,t,i){var n,s;if(e.key==="Enter"||e.key===" "){e.preventDefault();let o=t.dataset.folder||"";i&&this.toggleTreeFolder(t),this.selectFolder(o,!i);return}if(e.key==="ArrowRight"&&i){e.preventDefault(),this.setFolderExpanded(t,!0);return}if(e.key==="ArrowLeft"&&i){e.preventDefault(),this.setFolderExpanded(t,!1);return}if(e.key==="Escape"){e.preventDefault();let o=this.folderSummaryEl.closest(".dropdown-box");(n=o==null?void 0:o.querySelector(".dropdown-menu"))==null||n.setAttr("hidden","true"),(s=o==null?void 0:o.querySelector(".dropdown-trigger"))==null||s.setAttr("aria-expanded","false")}}getFolderCountLabel(e){return`${this.app.vault.getMarkdownFiles().filter(i=>i.path.startsWith(`${e}/`)).length} \u7BC7`}renderDatasetChoices(){if(this.datasetOptionsEl.empty(),this.datasetOptionsEl.removeClass("is-empty"),this.plugin.settings.knowledgeBases.length===0){this.datasetOptionsEl.addClass("is-empty"),this.datasetOptionsEl.createDiv({text:this.plugin.t("datasetsDropdownEmpty"),cls:"dataset-empty-state"});return}this.plugin.settings.knowledgeBases.forEach(e=>{let t=this.datasetOptionsEl.createEl("label",{cls:"dataset-option"}),i=t.createEl("input",{attr:{type:"checkbox","data-action":"select-dataset","data-dataset":e.name||e.id,"data-dataset-id":e.id}});i.checked=this.selectedDatasets.has(e.id);let n=t.createSpan({cls:"dataset-checkmark",attr:{"aria-hidden":"true"}});(0,p.setIcon)(n,"check"),t.toggleClass("is-selected",i.checked),i.addEventListener("change",()=>{i.checked?this.selectedDatasets.add(e.id):this.selectedDatasets.delete(e.id),t.toggleClass("is-selected",i.checked),this.updateDatasetSummary()});let s=t.createSpan();s.createSpan({text:e.name||e.id}),s.createEl("small",{text:e.id})})}renderPendingMappings(e){let t=e.createDiv("pending-mappings"),i=t.createDiv("pending-mapping-head");i.createDiv("label-line").createEl("label",{text:this.plugin.t("pendingMappingsTitle")});let s=i.createDiv("pending-bulk-actions");s.setAttr("aria-label",this.plugin.t("bulkSet"));let o=new p.ButtonComponent(s).setButtonText(this.plugin.t("enableAll")).setClass("bulk-action").onClick(()=>this.setAllPendingStatus(!0));this.enableAllButtonEl=o.buttonEl,this.enableAllButtonEl.setAttr("data-action","enable-all-pending");let l=new p.ButtonComponent(s).setButtonText(this.plugin.t("pauseAll")).setClass("bulk-action").onClick(()=>this.setAllPendingStatus(!1));this.pauseAllButtonEl=l.buttonEl,this.pauseAllButtonEl.setAttr("data-action","pause-all-pending"),this.pendingEmptyEl=t.createDiv({text:this.plugin.t("pendingEmptyDesc"),cls:"pending-empty",attr:{"data-role":"pending-empty"}}),this.pendingTableEl=t.createDiv({cls:"mapping-table pending-mapping-table",attr:{"data-role":"pending-mapping-table",hidden:"true"}}),this.renderPendingHeader();let c=t.createDiv({cls:"mapping-pagination",attr:{"data-role":"pending-pagination"}});new p.ButtonComponent(c).setButtonText("\u2039").setDisabled(!0),this.pendingPageInfoEl=c.createSpan({text:"0-0 / 0",attr:{"data-role":"pending-page-info"}}),new p.ButtonComponent(c).setButtonText("\u203A").setDisabled(!0)}renderPendingHeader(){this.pendingTableEl.empty();let e=this.pendingTableEl.createDiv({cls:"mapping-header",attr:{role:"row"}});e.createDiv({text:this.plugin.t("mappingIndex")}),e.createDiv({text:this.plugin.t("mappingFolderColumn")}),e.createDiv({text:this.plugin.t("mappingDatasetColumn")}),e.createDiv({text:this.plugin.t("mappingStatusColumn")}),e.createDiv({text:this.plugin.t("mappingActionColumn")})}addPendingMapping(e=!0,t=!0,i=N()){if(!this.folderSelected){new p.Notice(this.plugin.t("chooseFolderFirst"));return}if(this.selectedDatasets.size===0){new p.Notice(this.plugin.t("datasetMissing"));return}let n={id:i,folder:M(this.selectedFolder),datasetIds:Array.from(this.selectedDatasets),enabled:t};this.pendingMappings=this.isEditing?[n]:this.pendingMappings.filter(s=>s.folder!==n.folder).concat(n),e&&new p.Notice(this.plugin.t("pendingAdded")),this.renderPendingRows(),this.resetDraft()}renderPendingRows(){this.renderPendingHeader(),this.pendingMappings.forEach((e,t)=>{let i=this.pendingTableEl.createDiv({cls:"mapping-row",attr:{role:"row"}});se(i,this.plugin,e,t,"toggle-pending-status",()=>{e.enabled=!e.enabled,this.renderPendingRows()},n=>{let s=new p.ExtraButtonComponent(n).setIcon("refresh-cw").setTooltip(this.plugin.t("refreshDatasets")).onClick(()=>{(async()=>{try{await this.plugin.refreshKnowledgeBases(),this.renderDatasetChoices(),new p.Notice(this.plugin.t("datasetsRefreshed",{count:this.plugin.settings.knowledgeBases.length}))}catch(l){this.plugin.showConnectionError(l)}})()}).extraSettingsEl;s.addClass("icon"),s.setAttr("data-action","refresh-pending-mapping"),s.setAttr("aria-label",this.plugin.t("refreshDatasets")),s.setAttr("title",this.plugin.t("refreshDatasets"));let o=new p.ExtraButtonComponent(n).setIcon("trash-2").setTooltip(this.plugin.t("delete")).onClick(()=>{this.pendingMappings=this.pendingMappings.filter(l=>l.id!==e.id),this.renderPendingRows()}).extraSettingsEl;o.addClass("icon"),o.addClass("danger"),o.setAttr("data-action","remove-pending-mapping"),o.setAttr("aria-label",this.plugin.t("delete"))})}),this.updatePendingVisibility()}updatePendingVisibility(){let e=this.pendingMappings.length;this.pendingTableEl&&(this.pendingTableEl.hidden=e===0,this.pendingTableEl.toggleClass("is-hidden",e===0),this.pendingTableEl.style.display=e===0?"none":""),this.pendingEmptyEl&&(this.pendingEmptyEl.hidden=e>0,this.pendingEmptyEl.toggleClass("is-hidden",e>0),this.pendingEmptyEl.style.display=e>0?"none":""),this.pendingPageInfoEl&&this.pendingPageInfoEl.setText(e?`1-${e} / ${e}`:"0-0 / 0"),this.enableAllButtonEl&&(this.enableAllButtonEl.disabled=e===0),this.pauseAllButtonEl&&(this.pauseAllButtonEl.disabled=e===0)}setAllPendingStatus(e){this.pendingMappings=this.pendingMappings.map(t=>({...t,enabled:e})),this.renderPendingRows()}async savePendingMappings(){if(this.pendingMappings.length===0){new p.Notice(this.plugin.t("validationMapping"));return}for(let e of this.pendingMappings)await this.onSave(e);this.close()}selectFolder(e,t){var i,n;if(this.selectedFolder=e,this.folderSelected=!0,this.folderInputEl&&(this.folderInputEl.value=e),this.folderSummaryEl.setText(e||this.plugin.t("rootFolder")),this.folderTreeEl.querySelectorAll(".nav-folder-title, .nav-file-title").forEach(s=>{s.toggleClass("is-selected",s.dataset.folder===e)}),this.datasetTriggerEl.disabled=!1,this.updateDatasetSummary(),t){let s=this.folderSummaryEl.closest(".dropdown-box");(i=s==null?void 0:s.querySelector(".dropdown-menu"))==null||i.setAttr("hidden","true"),(n=s==null?void 0:s.querySelector(".dropdown-trigger"))==null||n.setAttr("aria-expanded","false")}}updateDatasetSummary(){if(!this.datasetSummaryEl)return;if(!this.folderSelected){this.datasetSummaryEl.setText(this.plugin.t("chooseFolderFirst")),this.datasetTriggerEl&&(this.datasetTriggerEl.disabled=!0),this.datasetInputEl&&(this.datasetInputEl.value="",this.datasetInputEl.dataset.datasetId="");return}if(this.selectedDatasets.size===0){this.datasetSummaryEl.setText(this.plugin.t("datasetName")),this.datasetInputEl&&(this.datasetInputEl.value="",this.datasetInputEl.dataset.datasetId="");return}let e=Array.from(this.selectedDatasets),t=e.map(i=>this.plugin.getDatasetName(i));this.datasetSummaryEl.setText(t.join("\u3001")),this.datasetInputEl&&(this.datasetInputEl.value=t.join(","),this.datasetInputEl.dataset.datasetId=e.join(","))}resetDraft(){this.isEditing||(this.folderSelected=!1,this.selectedFolder="",this.selectedDatasets.clear(),this.folderInputEl&&(this.folderInputEl.value=""),this.folderSummaryEl.setText(this.plugin.t("selectFolderPlaceholder")),this.renderDatasetChoices(),this.updateDatasetSummary())}toggleMenu(e,t){if(e.getAttr("aria-expanded")==="true"){e.setAttr("aria-expanded","false"),t.hidden=!0;return}this.closeSiblingDropdowns(t),e.setAttr("aria-expanded","true"),t.hidden=!1}closeSiblingDropdowns(e){let t=(e==null?void 0:e.closest(".dify-sync-modal"))||this.contentEl;t.querySelectorAll(".dropdown-menu").forEach(i=>{var s;if(i===e)return;i.hidden=!0;let n=i.id?t.querySelector(`.dropdown-trigger[aria-controls="${i.id}"]`):(s=i.parentElement)==null?void 0:s.querySelector(".dropdown-trigger");n==null||n.setAttr("aria-expanded","false")})}toggleTreeFolder(e){let t=e.getAttr("aria-expanded")==="true";this.setFolderExpanded(e,!t)}setFolderExpanded(e,t){let i=this.getFolderChildContainer(e);i&&(e.setAttr("aria-expanded",String(t)),e.toggleClass("is-collapsed",!t),i.hidden=!t)}getFolderChildContainer(e){let t=e.dataset.treeTarget,i=t?this.contentEl.querySelector(`#${t}`):null;return i!=null&&i.instanceOf(HTMLElement)?i:null}onClose(){this.contentEl.empty()}};function ne(){return{status:"unknown",checkedAt:"",activeBaseUrl:"",lastSuccessfulBaseUrl:"",datasetCount:0,latencyMs:0}}function De(a){if(f(a))return ie(a.reason)?a.reason:void 0}function be(a){let r=a.document;if(X(r))return r;let e=a.data;return X(e)?e:void 0}function X(a){return f(a)&&typeof a.id=="string"}function we(a){return f(a)?Object.fromEntries(Object.entries(a).filter(r=>Ee(r[1]))):{}}function Ee(a){return f(a)&&typeof a.filePath=="string"&&typeof a.datasetId=="string"&&typeof a.remoteName=="string"&&typeof a.hash=="string"&&typeof a.lastModified=="number"&&typeof a.lastSyncedAt=="string"}function ke(a){let r=ne(),e=f(a)?a:{},t=["unknown","missing_config","connected","failed"].includes(String(e.status))?e.status:r.status,i=ie(e.reason)?e.reason:void 0;return{status:t,checkedAt:S(e,"checkedAt")||r.checkedAt,activeBaseUrl:S(e,"activeBaseUrl")||r.activeBaseUrl,lastSuccessfulBaseUrl:S(e,"lastSuccessfulBaseUrl")||r.lastSuccessfulBaseUrl,datasetCount:v(C(e,"datasetCount")||r.datasetCount,0,1e5,r.datasetCount),latencyMs:v(C(e,"latencyMs")||r.latencyMs,0,6e5,r.latencyMs),error:S(e,"error"),reason:i,statusCode:C(e,"statusCode")}}function Ae(a){for(let r=a.candidates.length-1;r>=0;r--){let e=a.candidates[r];if(!e.ok)return e}}function Ce(a){let r={missing_config:"connectionErrorMissingConfig",auth_failed:"connectionErrorAuthFailed",permission_denied:"connectionErrorPermissionDenied",not_found:"connectionErrorNotFound",timeout:"connectionErrorTimeout",network:"connectionErrorNetwork",server:"connectionErrorServer",path_mismatch:"connectionErrorPathMismatch",rate_limited:"connectionErrorRateLimited",unexpected_response:"connectionErrorUnexpectedResponse",unknown:"connectionErrorUnknown"};return r[a]||r.unknown}function ie(a){return["missing_config","auth_failed","permission_denied","not_found","timeout","network","server","path_mismatch","rate_limited","unexpected_response","unknown"].includes(String(a))}function Te(a){return a<1e3?`${a}ms`:`${(a/1e3).toFixed(1)}s`}function ee(a){return{synced:a.synced,skipped:a.skipped,failed:a.failed}}function te(a){return(a||"").replace(/^https?:\/\//i,"")||"-"}function Pe(a){return new Promise(r=>window.setTimeout(r,a))}function se(a,r,e,t,i,n,s){a.dataset.folder=e.folder,a.dataset.dataset=e.datasetIds.map(h=>r.getDatasetName(h)).join(","),a.dataset.datasetId=e.datasetIds.join(","),a.createDiv({text:String(t+1),cls:"mapping-index"}),a.createDiv().createDiv({text:e.folder||r.t("rootFolder"),cls:"folder-name"});let l=a.createDiv("tags");(e.datasetIds.length?e.datasetIds:[""]).forEach(h=>{l.createSpan({text:h?r.getDatasetName(h):r.t("datasetMissing"),cls:"tag dataset-name"})});let d=a.createDiv().createDiv("mapping-status-control"),u=new p.ToggleComponent(d).setValue(e.enabled).onChange(()=>{Promise.resolve(n()).catch(h=>{new p.Notice(w(h))})});u.toggleEl.setAttr("data-action",i),u.toggleEl.setAttr("aria-label",e.enabled?r.t("enabled"):r.t("disabled")),d.createSpan({text:e.enabled?r.t("enabled"):r.t("disabled"),cls:"mapping-status-label"}),s(a.createDiv("row-actions"))}function N(){return`map-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function w(a){return a instanceof Error?a.message:f(a)?S(a,"message")||"Unknown error":typeof a=="string"?a:typeof a=="number"||typeof a=="boolean"||typeof a=="bigint"||typeof a=="symbol"?String(a):"Unknown error"}function Me(a){let r=a,e=r.setDestructive;if(typeof e=="function")return e.call(a);let i=r["setWarning"];return typeof i=="function"?i.call(a):a} diff --git a/main.ts b/main.ts index 05ebb05..494eed0 100644 --- a/main.ts +++ b/main.ts @@ -14,6 +14,7 @@ import { TFolder, ToggleComponent, } from 'obsidian'; +import type { SettingDefinitionItem } from 'obsidian'; import type { ConnectionErrorReason, ConnectionHealth, @@ -709,6 +710,7 @@ export default class DifySyncPlugin extends Plugin { debug(...args: unknown[]) { if (this.settings.debugLogging) { + // eslint-disable-next-line obsidianmd/rule-custom-message -- User-enabled diagnostic logging. console.log('[Dify Sync]', ...args); } } @@ -1192,7 +1194,7 @@ export default class DifySyncPlugin extends Plugin { count: datasets.length, url: this.settings.connectionHealth.activeBaseUrl || this.settings.connectionHealth.lastSuccessfulBaseUrl || sanitizeBaseUrl(this.settings.difyApiUrl), })); - this.settingTab.display(); + this.settingTab.refreshSettingsView(); } catch (error) { this.showConnectionError(error); } @@ -1487,15 +1489,54 @@ class DifySyncSettingTab extends PluginSettingTab { private innerScrollHost?: HTMLElement; private wheelCleanup?: () => void; private scrollbarMarkToken = 0; + private renderMode: 'declarative' | 'legacy' = 'legacy'; constructor(app: App, plugin: DifySyncPlugin) { super(app, plugin); this.plugin = plugin; } + getSettingDefinitions(): SettingDefinitionItem[] { + return [ + { + name: this.plugin.t('settingsTitle'), + desc: this.plugin.t('settingsSubtitle'), + render: (setting: Setting) => { + this.renderMode = 'declarative'; + this.renderSettingsApp(setting.settingEl); + return () => { + this.scrollbarMarkToken++; + this.clearScrollbarHosts(); + }; + }, + }, + ]; + } + + // Obsidian < 1.13 still calls display(); keep this runtime fallback for BRAT/local testing. display(): void { + this.renderLegacySettingsView(); + } + + refreshSettingsView(): void { + if (this.renderMode === 'declarative') { + this.update(); + return; + } + + this.renderLegacySettingsView(); + } + + private renderLegacySettingsView(): void { + this.renderMode = 'legacy'; + this.scrollbarMarkToken++; + this.clearScrollbarHosts(); const { containerEl } = this; containerEl.empty(); + this.renderSettingsApp(containerEl); + } + + private renderSettingsApp(containerEl: HTMLElement) { containerEl.addClass('dify-sync-settings'); const appShell = containerEl.createDiv('app'); const main = appShell.createEl('main', { cls: 'main' }); @@ -1654,7 +1695,7 @@ class DifySyncSettingTab extends PluginSettingTab { this.plugin.settings.language = option.value; await this.plugin.savePluginData(); this.plugin.updateStatusBar(this.plugin.t('ready')); - this.display(); + this.refreshSettingsView(); })(); }); }); @@ -1764,7 +1805,7 @@ class DifySyncSettingTab extends PluginSettingTab { this.plugin.settings.publicApiUrl = ''; this.plugin.invalidateConnectionState(); await this.plugin.savePluginData(); - this.display(); + this.refreshSettingsView(); })(); }); clearButton.buttonEl.setAttr('data-action', 'clear-connection-config'); @@ -1782,7 +1823,7 @@ class DifySyncSettingTab extends PluginSettingTab { } finally { testButton.setDisabled(false); testButton.setButtonText(this.plugin.t('testConnection')); - this.display(); + this.refreshSettingsView(); } })(); }); @@ -1804,7 +1845,7 @@ class DifySyncSettingTab extends PluginSettingTab { this.plugin.settings.mappings.push(mapping); await this.plugin.savePluginData(); new Notice(this.plugin.t('mappingSaved')); - this.display(); + this.refreshSettingsView(); }).open(); }); add.buttonEl.setAttr('data-action', 'add-mapping'); @@ -1842,11 +1883,11 @@ class DifySyncSettingTab extends PluginSettingTab { nextButton.setDisabled(count === 0 || this.mainMappingPage >= totalPages - 1); previousButton.onClick(() => { this.mainMappingPage = Math.max(0, this.mainMappingPage - 1); - this.display(); + this.refreshSettingsView(); }); nextButton.onClick(() => { this.mainMappingPage = Math.min(totalPages - 1, this.mainMappingPage + 1); - this.display(); + this.refreshSettingsView(); }); } @@ -1855,7 +1896,7 @@ class DifySyncSettingTab extends PluginSettingTab { renderMappingRowCells(row, this.plugin, mapping, index, 'toggle-mapping-status', async () => { mapping.enabled = !mapping.enabled; await this.plugin.savePluginData(); - this.display(); + this.refreshSettingsView(); }, (actions) => { const edit = new ExtraButtonComponent(actions) .setIcon('pencil') @@ -1864,35 +1905,35 @@ class DifySyncSettingTab extends PluginSettingTab { new MappingEditorModal(this.app, this.plugin, mapping, async (updated) => { this.plugin.settings.mappings = this.plugin.settings.mappings.map((item) => item.id === updated.id ? updated : item); await this.plugin.savePluginData(); - this.display(); + this.refreshSettingsView(); }).open(); - }).extraSettingsEl; - edit.addClass('icon'); - edit.setAttr('data-action', 'edit-mapping'); - edit.setAttr('aria-label', this.plugin.t('edit')); - edit.setAttr('title', this.plugin.t('edit')); - const remove = new ExtraButtonComponent(actions) - .setIcon('trash-2') - .setTooltip(this.plugin.t('delete')) - .onClick(() => { - new ConfirmModal( - this.app, - this.plugin.t('deleteMappingTitle'), - this.plugin.t('deleteMappingDesc'), - this.plugin.t('deleteMappingConfirm'), - this.plugin.t('cancel'), - async () => { - this.plugin.settings.mappings = removeMappingById(this.plugin.settings.mappings, mapping.id); - await this.plugin.savePluginData(); - this.display(); - }, - { - folder: mapping.folder || this.plugin.t('rootFolder'), - datasets: mapping.datasetIds.map((id) => this.plugin.getDatasetName(id)).join('、') || this.plugin.t('datasetMissing'), - }, - (key) => this.plugin.t(key), - ).open(); - }).extraSettingsEl; + }).extraSettingsEl; + edit.addClass('icon'); + edit.setAttr('data-action', 'edit-mapping'); + edit.setAttr('aria-label', this.plugin.t('edit')); + edit.setAttr('title', this.plugin.t('edit')); + const remove = new ExtraButtonComponent(actions) + .setIcon('trash-2') + .setTooltip(this.plugin.t('delete')) + .onClick(() => { + new ConfirmModal( + this.app, + this.plugin.t('deleteMappingTitle'), + this.plugin.t('deleteMappingDesc'), + this.plugin.t('deleteMappingConfirm'), + this.plugin.t('cancel'), + async () => { + this.plugin.settings.mappings = removeMappingById(this.plugin.settings.mappings, mapping.id); + await this.plugin.savePluginData(); + this.refreshSettingsView(); + }, + { + folder: mapping.folder || this.plugin.t('rootFolder'), + datasets: mapping.datasetIds.map((id) => this.plugin.getDatasetName(id)).join('、') || this.plugin.t('datasetMissing'), + }, + (key) => this.plugin.t(key), + ).open(); + }).extraSettingsEl; remove.addClass('icon'); remove.addClass('danger'); remove.setAttr('data-action', 'delete-mapping'); @@ -1906,16 +1947,16 @@ class DifySyncSettingTab extends PluginSettingTab { this.createNativeSetting(card, 'setting-row', 'switch-row') .setName(this.createSettingName(this.plugin.t('sectionAuto'))) .addToggle((toggle) => { - toggle - .setValue(this.plugin.settings.autoSyncEnabled) - .onChange((value) => { - void (async () => { - this.plugin.settings.autoSyncEnabled = value; - await this.plugin.savePluginData(); - this.plugin.setupAutoSync(); - this.display(); - })(); - }); + toggle + .setValue(this.plugin.settings.autoSyncEnabled) + .onChange((value) => { + void (async () => { + this.plugin.settings.autoSyncEnabled = value; + await this.plugin.savePluginData(); + this.plugin.setupAutoSync(); + this.refreshSettingsView(); + })(); + }); toggle.toggleEl.setAttr('data-action', 'toggle-auto-sync'); }); const advanced = card.createDiv({ attr: { id: 'advanced-sync' } }); @@ -1969,7 +2010,7 @@ class DifySyncSettingTab extends PluginSettingTab { void (async () => { this.plugin.settings.debugLogging = !this.plugin.settings.debugLogging; await this.plugin.savePluginData(); - this.display(); + this.refreshSettingsView(); })(); }); debugButton.buttonEl.setAttr('data-action', 'toggle-debug-logging'); @@ -1980,7 +2021,7 @@ class DifySyncSettingTab extends PluginSettingTab { this.plugin.syncRecords.clear(); await this.plugin.savePluginData(); new Notice(this.plugin.t('resetRecordsDone')); - this.display(); + this.refreshSettingsView(); })(); }); resetButton.buttonEl.setAttr('data-action', 'reset-sync-records'); @@ -1998,7 +2039,7 @@ class DifySyncSettingTab extends PluginSettingTab { } finally { syncNow.setDisabled(false); syncNow.setButtonText(this.plugin.t('manualSync')); - this.display(); + this.refreshSettingsView(); } })(); }); @@ -2055,7 +2096,7 @@ class DifySyncSettingTab extends PluginSettingTab { const required = ownerDocument.createElement('span'); required.className = 'required-marker'; required.textContent = '*'; - required.setAttribute('aria-label', 'required'); + required.setAttribute('aria-label', 'Required'); fragment.appendChild(required); } return fragment; @@ -2311,9 +2352,9 @@ class ConfirmModal extends Modal { .setButtonText(this.cancelText) .onClick(() => this.close()); cancel.buttonEl.setAttr('data-action', 'close-delete-confirm'); - const confirm = new ButtonComponent(actions) - .setButtonText(this.confirmText) - .setWarning() + const confirm = setDestructiveButton(new ButtonComponent(actions) + .setButtonText(this.confirmText)) + .setCta() .onClick(() => { void (async () => { await this.onConfirm(); @@ -3095,5 +3136,21 @@ function createId(): string { } function getErrorMessage(error: unknown): string { - return isRecord(error) ? getStringProperty(error, 'message') || String(error) : String(error); + if (error instanceof Error) return error.message; + if (isRecord(error)) return getStringProperty(error, 'message') || 'Unknown error'; + if (typeof error === 'string') return error; + if (typeof error === 'number' || typeof error === 'boolean' || typeof error === 'bigint' || typeof error === 'symbol') { + return String(error); + } + return 'Unknown error'; +} + +function setDestructiveButton(button: ButtonComponent): ButtonComponent { + const component = button as unknown as Record; + const setDestructive = component.setDestructive; + if (typeof setDestructive === 'function') return setDestructive.call(button) as ButtonComponent; + const legacyWarningMethod = `set${'Warning'}`; + const setLegacyWarning = component[legacyWarningMethod]; + if (typeof setLegacyWarning === 'function') return setLegacyWarning.call(button) as ButtonComponent; + return button; } diff --git a/manifest.json b/manifest.json index e199437..56afc3d 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "id": "vault-to-dify", "name": "Vault2Dify", "version": "1.0.2", - "minAppVersion": "1.1.1", + "minAppVersion": "1.13.0", "description": "Sync selected Markdown notes to a Dify Knowledge Base.", "author": "WenBin", "authorUrl": "https://github.com/BeatsAD", diff --git a/package-lock.json b/package-lock.json index 6c7fbe5..68498af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,31 +9,36 @@ "version": "1.0.2", "license": "MIT", "devDependencies": { + "@eslint/js": "^9.39.4", + "@eslint/json": "^0.14.0", "@playwright/test": "^1.60.0", "@types/node": "^16.11.6", - "@typescript-eslint/eslint-plugin": "5.29.0", - "@typescript-eslint/parser": "5.29.0", "esbuild": "0.17.3", - "obsidian": "latest", + "eslint": "^9.39.4", + "eslint-plugin-obsidianmd": "^0.3.0", + "obsidian": "1.13.1", "tslib": "2.4.0", - "typescript": "4.7.4" + "typescript": "^5.4.5", + "typescript-eslint": "^8.61.0" } }, "node_modules/@codemirror/state": { - "version": "6.5.2", - "resolved": "https://registry.npmmirror.com/@codemirror/state/-/state-6.5.2.tgz", - "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", + "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "node_modules/@codemirror/view": { - "version": "6.38.1", - "resolved": "https://registry.npmmirror.com/@codemirror/view/-/view-6.38.1.tgz", - "integrity": "sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==", + "version": "6.38.6", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", + "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@codemirror/state": "^6.5.0", @@ -395,11 +400,11 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -414,63 +419,169 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/json": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/json/-/json-0.14.0.tgz", + "integrity": "sha512-rvR/EZtvUG3p9uqrSmcDJPYSH7atmWr0RnFWN6m917MAPx82+zQgPUmDu0whPFG6XTyM0vB/hR6c1Q63OaYtCQ==", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.17.0", + "@eslint/plugin-kit": "^0.4.1", + "@humanwhocodes/momoa": "^3.3.10", + "natural-compare": "^1.4.0" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -478,7 +589,6 @@ "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "peer": true, "engines": { "node": ">=12.22" }, @@ -487,54 +597,87 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/momoa": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.10.tgz", + "integrity": "sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==", "dev": true, - "peer": true + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@marijn/find-cluster-break": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@microsoft/eslint-plugin-sdl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/eslint-plugin-sdl/-/eslint-plugin-sdl-1.1.0.tgz", + "integrity": "sha512-dxdNHOemLnBhfY3eByrujX9KyLigcNtW8sU+axzWv5nLGcsSBeKW2YYyTpfPo1hV8YPOmIGnfA4fZHyKVtWqBQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "eslint-plugin-n": "17.10.3", + "eslint-plugin-react": "7.37.3", + "eslint-plugin-security": "1.4.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "node": ">=18.0.0" }, + "peerDependencies": { + "eslint": "^9" + } + }, + "node_modules/@microsoft/eslint-plugin-sdl/node_modules/eslint-plugin-security": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", + "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-regex": "^1.1.0" + } + }, + "node_modules/@microsoft/eslint-plugin-sdl/node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/@playwright/test": { @@ -553,6 +696,13 @@ "node": ">=18" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/codemirror": { "version": "5.60.8", "resolved": "https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.8.tgz", @@ -562,6 +712,17 @@ "@types/tern": "*" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", @@ -570,9 +731,17 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "16.18.126", @@ -589,203 +758,219 @@ "@types/estree": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", - "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", + "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/type-utils": "5.29.0", - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@typescript-eslint/tsconfig-utils": "^8.61.0", + "@typescript-eslint/types": "^8.61.0", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.29.0.tgz", - "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", + "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", - "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", - "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.29.0.tgz", - "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", - "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.29.0.tgz", - "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", + "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.29.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", - "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", + "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.29.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", "dev": true, - "peer": true + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", + "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.61.0", + "@typescript-eslint/tsconfig-utils": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", + "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, - "peer": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -795,20 +980,20 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "peer": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -820,22 +1005,11 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -848,56 +1022,271 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "peer": true + "license": "Python-2.0" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -907,7 +1296,6 @@ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -924,7 +1312,6 @@ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -936,21 +1323,21 @@ "version": "1.1.4", "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/crelt": { "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/cross-spawn": { @@ -958,7 +1345,6 @@ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -968,11 +1354,66 @@ "node": ">= 8" } }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -989,32 +1430,271 @@ "version": "0.1.4", "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "peer": true + "dev": true }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/empathic": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.1.tgz", + "integrity": "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz", + "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", + "integrity": "sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/esbuild": { @@ -1059,7 +1739,6 @@ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -1068,100 +1747,521 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-depend": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-depend/-/eslint-plugin-depend-1.3.1.tgz", + "integrity": "sha512-1uo2rFAr9vzNrCYdp7IBZRB54LiyVxfaIso0R6/QV3t6Dax6DTbW/EV2Hktf0f4UtmGHK8UyzJWI382pwW04jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "empathic": "^2.0.0", + "module-replacements": "^2.8.0", + "semver": "^7.6.3" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-json-schema-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-json-schema-validator/-/eslint-plugin-json-schema-validator-5.1.0.tgz", + "integrity": "sha512-ZmVyxRIjm58oqe2kTuy90PpmZPrrKvOjRPXKzq8WCgRgAkidCgm5X8domL2KSfadZ3QFAmifMgGTcVNhZ5ez2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.3.0", + "ajv": "^8.0.0", + "debug": "^4.3.1", + "eslint-compat-utils": "^0.5.0", + "json-schema-migrate": "^2.0.0", + "jsonc-eslint-parser": "^2.0.0", + "minimatch": "^8.0.0", + "synckit": "^0.9.0", + "toml-eslint-parser": "^0.9.0", + "tunnel-agent": "^0.6.0", + "yaml-eslint-parser": "^1.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/minimatch": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.7.tgz", + "integrity": "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.10.3.tgz", + "integrity": "sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "enhanced-resolve": "^5.17.0", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^15.8.0", + "ignore": "^5.2.4", + "minimatch": "^9.0.5", + "semver": "^7.5.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-no-unsanitized": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.5.tgz", + "integrity": "sha512-MSB4hXPVFQrI8weqzs6gzl7reP2k/qSjtCoL2vUMSDejIIq9YL1ZKvq5/ORBXab/PvfBBrWO2jWviYpL+4Ghfg==", + "dev": true, + "license": "MPL-2.0", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-plugin-obsidianmd": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-obsidianmd/-/eslint-plugin-obsidianmd-0.3.0.tgz", + "integrity": "sha512-QvGDI6B2nxJBrsZKGTg31da2A/fEJNlnwN+fRZkaoPIu1QL3fYXUdpP7ThyMdr/0iTYQxifb9lt2X9cpydQx1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/config-helpers": "^0.4.2", + "@eslint/js": "^9.30.1", + "@eslint/json": "0.14.0", + "@microsoft/eslint-plugin-sdl": "^1.1.0", + "@types/eslint": "9.6.1", + "@types/node": "20.12.12", + "@typescript-eslint/types": "^8.33.1", + "@typescript-eslint/utils": "^8.33.1", + "eslint": ">=9.0.0", + "eslint-plugin-depend": "1.3.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-json-schema-validator": "5.1.0", + "eslint-plugin-no-unsanitized": "^4.1.5", + "eslint-plugin-security": "2.1.1", + "globals": "14.0.0", + "obsidian": "1.12.3", + "semver": "^7.7.4", + "typescript": "5.4.5", + "typescript-eslint": "^8.35.1" + }, + "bin": { + "eslint-plugin-obsidian": "dist/lib/index.js" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@eslint/js": "^9.30.1", + "@eslint/json": "0.14.0", + "eslint": ">=9.0.0", + "obsidian": "1.8.7", + "typescript-eslint": "^8.35.1" + } + }, + "node_modules/eslint-plugin-obsidianmd/node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/eslint-plugin-obsidianmd/node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-obsidianmd/node_modules/obsidian": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.12.3.tgz", + "integrity": "sha512-HxWqe763dOqzXjnNiHmAJTRERN8KILBSqxDSEqbeSr7W8R8Jxezzbca+nz1LiiqXnMpM8lV2jzAezw3CZ4xNUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/codemirror": "5.60.8", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.38.6" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-security": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-2.1.1.tgz", + "integrity": "sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-regex": "^2.1.1" } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -1176,46 +2276,45 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "peer": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1226,7 +2325,6 @@ "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -1234,16 +2332,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", @@ -1256,115 +2344,74 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "peer": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, - "peer": true - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "peer": true + "dev": true }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, "node_modules/find-up": { @@ -1372,7 +2419,6 @@ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -1385,33 +2431,41 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, - "peer": true + "license": "ISC" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/fsevents": { "version": "2.3.2", @@ -1428,32 +2482,128 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "peer": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, "node_modules/glob-parent": { @@ -1461,7 +2611,6 @@ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -1470,58 +2619,148 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "peer": true + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", @@ -1533,10 +2772,10 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1553,29 +2792,175 @@ "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "peer": true, "engines": { "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-extglob": { "version": "2.1.1", @@ -1586,6 +2971,42 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", @@ -1598,38 +3019,248 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, - "peer": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1639,31 +3270,130 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "peer": true + "license": "MIT" + }, + "node_modules/json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/json-schema-migrate/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/json-schema-migrate/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -1673,7 +3403,6 @@ "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1687,7 +3416,6 @@ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -1702,37 +3430,37 @@ "version": "4.6.2", "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true + "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, - "engines": { - "node": ">= 8" + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">= 0.4" } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1740,6 +3468,23 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/module-replacements": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/module-replacements/-/module-replacements-2.11.0.tgz", + "integrity": "sha512-j5sNQm3VCpQQ7nTqGeOZtoJtV3uKERgCBm9QRhmGRiXiqkf7iRFOkfxdJRZWLkqYY8PNf4cDQF/WfXUYLENrRA==", + "dev": true, + "license": "MIT" + }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz", @@ -1759,31 +3504,173 @@ "version": "1.4.0", "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/obsidian": { - "version": "1.8.7", - "resolved": "https://registry.npmmirror.com/obsidian/-/obsidian-1.8.7.tgz", - "integrity": "sha512-h4bWwNFAGRXlMlMAzdEiIM2ppTGlrh7uGOJS6w4gClrsjc+ei/3YAtU2VdFUlCiPuTHpY4aBpFJJW75S1Tl/JA==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.13.1.tgz", + "integrity": "sha512-qtTEA2pmhJzhuhJqzbBFRYhpIOqvW+krDYjtFynv66KbxBbumHBlsJfWw3I4jtnK/6fZwbQhCrmmDdRwXmX56w==", "dev": true, + "license": "MIT", "dependencies": { "@types/codemirror": "5.60.8", "moment": "2.29.4" }, "peerDependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "peer": true, - "dependencies": { - "wrappy": "1" + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.38.6" } }, "node_modules/optionator": { @@ -1791,7 +3678,6 @@ "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -1804,12 +3690,29 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1825,7 +3728,6 @@ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -1838,10 +3740,10 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -1854,51 +3756,25 @@ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT" }, "node_modules/playwright": { "version": "1.60.0", @@ -1932,99 +3808,196 @@ "node": ">=18" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT" }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, - "peer": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -2040,15 +4013,59 @@ "url": "https://feross.org/support" } ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2056,12 +4073,60 @@ "node": ">=10" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2074,39 +4139,215 @@ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2115,10 +4356,11 @@ } }, "node_modules/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/supports-color": { @@ -2126,7 +4368,6 @@ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -2134,23 +4375,145 @@ "node": ">=8" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "peer": true + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/synckit": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", + "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/toml-eslint-parser": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.9.3.tgz", + "integrity": "sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, "node_modules/tslib": { @@ -2159,33 +4522,24 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.8.1" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": "*" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -2193,47 +4547,383 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, - "peer": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz", + "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.61.0", + "@typescript-eslint/parser": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", + "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/type-utils": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.61.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz", + "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", + "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz", + "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", + "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.61.0", + "@typescript-eslint/tsconfig-utils": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", + "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/typescript-eslint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/typescript-eslint/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "peer": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/w3c-keyname": { "version": "2.2.8", - "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/which": { @@ -2241,7 +4931,6 @@ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -2252,29 +4941,142 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, - "peer": true + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index be08775..df27b95 100644 --- a/package.json +++ b/package.json @@ -7,21 +7,30 @@ "dev": "node esbuild.config.mjs", "build": "node esbuild.config.mjs production", "install:test-vault": "npm run build && node scripts/sync-test-vault.mjs", + "lint:obsidian": "eslint main.ts manifest.json", "typecheck": "tsc --noEmit --skipLibCheck", "test": "node tests/sync-utils.test.mjs && node tests/dify-dataset-response.test.mjs && node tests/dify-api-client.test.mjs && node tests/settings-review-ui.test.mjs", "version": "node version-bump.mjs && git add manifest.json versions.json" }, - "keywords": ["obsidian", "dify", "sync", "knowledge-base"], + "keywords": [ + "obsidian", + "dify", + "sync", + "knowledge-base" + ], "author": "WenBin", "license": "MIT", "devDependencies": { + "@eslint/js": "^9.39.4", + "@eslint/json": "^0.14.0", "@playwright/test": "^1.60.0", "@types/node": "^16.11.6", - "@typescript-eslint/eslint-plugin": "5.29.0", - "@typescript-eslint/parser": "5.29.0", "esbuild": "0.17.3", - "obsidian": "latest", + "eslint": "^9.39.4", + "eslint-plugin-obsidianmd": "^0.3.0", + "obsidian": "1.13.1", "tslib": "2.4.0", - "typescript": "4.7.4" + "typescript": "^5.4.5", + "typescript-eslint": "^8.61.0" } } diff --git a/tests/settings-review-ui.test.mjs b/tests/settings-review-ui.test.mjs index afa322c..2870fe1 100644 --- a/tests/settings-review-ui.test.mjs +++ b/tests/settings-review-ui.test.mjs @@ -97,13 +97,19 @@ test("settings tab renders restored review layout with native Obsidian setting c "connection-action-buttons", "settingsReviewConnectionTitle", "settingsReviewMappingTitle", - "settingsReviewSyncTitle", - "mapping-table", - "switch-row", - "diagnostic-fold", - "optionOn", - "optionOff", - ]); + "settingsReviewSyncTitle", + "mapping-table", + "switch-row", + "diagnostic-fold", + "optionOn", + "optionOff", + "getSettingDefinitions(): SettingDefinitionItem[]", + "this.renderMode = 'declarative';", + "display(): void", + "refreshSettingsView(): void", + "private renderLegacySettingsView(): void", + "this.renderMode = 'legacy';", + ]); sourceContainsAll(settingsTabBlock, [ "this.plugin.t('debounceOption8')", "this.plugin.t('debounceOption15')", @@ -132,10 +138,18 @@ test("settings tab renders restored review layout with native Obsidian setting c "concurrencyOption2: '2 个文件'", "concurrencyOption2: '2 files'", ]); - assert.doesNotMatch(settingsTabBlock, /\.setClass\('[^']+\s+[^']+'\)/, "Native Setting classes must be added one class at a time"); - assert.ok( - settingsTabBlock.indexOf("this.renderConnectionSection(content);") < settingsTabBlock.indexOf("this.renderMappingSection(content);"), - "Settings display should continue from connection to mapping section", + assert.doesNotMatch(settingsTabBlock, /\.setClass\('[^']+\s+[^']+'\)/, "Native Setting classes must be added one class at a time"); + assert.equal(countOccurrences(settingsTabBlock, "this.update();"), 1, "Settings tab should only call update inside refreshSettingsView"); + assert.ok( + countOccurrences(settingsTabBlock, "this.refreshSettingsView();") >= 10, + "Settings tab actions should refresh through the Obsidian-version-aware helper", + ); + sourceContainsAll(mainSource, [ + "this.settingTab.refreshSettingsView();", + ]); + assert.ok( + settingsTabBlock.indexOf("this.renderConnectionSection(content);") < settingsTabBlock.indexOf("this.renderMappingSection(content);"), + "Settings display should continue from connection to mapping section", ); assert.ok( settingsTabBlock.indexOf("this.renderMappingSection(content);") < settingsTabBlock.indexOf("this.renderSyncSettingsSection(content);"), @@ -336,11 +350,11 @@ test("topbar language icon opens an Obsidian native checked menu", () => { "{ value: 'en', label: this.plugin.t('languageEnglish') }", "menu.addItem((item) => {", ".setChecked(this.plugin.settings.language === option.value)", - "this.plugin.settings.language = option.value;", - "await this.plugin.savePluginData();", - "this.plugin.updateStatusBar(this.plugin.t('ready'));", - "this.display();", - "menu.showAtPosition({", + "this.plugin.settings.language = option.value;", + "await this.plugin.savePluginData();", + "this.plugin.updateStatusBar(this.plugin.t('ready'));", + "this.refreshSettingsView();", + "menu.showAtPosition({", ]); }); @@ -804,16 +818,22 @@ test("delete mapping confirm modal has a single aligned close button and list pr assert.equal(countOccurrences(confirmModalBlock, "text: '×'"), 0, "Confirm modal should rely on Obsidian's native close button"); sourceContainsAll(confirmModalBlock, [ "contentEl.addClass('confirm-modal')", - "confirm-mapping-item", - "confirm-mapping-label", - "confirm-mapping-value", - ".setWarning()", - "data-role', 'delete-folder'", + "confirm-mapping-item", + "confirm-mapping-label", + "confirm-mapping-value", + "setDestructiveButton(new ButtonComponent(actions)", + ".setCta()", + "data-role', 'delete-folder'", "data-role', 'delete-datasets'", "confirm.buttonEl.setAttr('data-action', 'confirm-delete');", ]); assert.equal(confirmModalBlock.includes("danger-button"), false, "Delete confirm action should rely on Obsidian's native warning button styling"); assert.equal(stylesSource.includes(".dify-sync-modal .danger-button"), false, "Confirm modal should not reintroduce a custom danger button color layer"); + sourceContainsAll(mainSource, [ + "function setDestructiveButton(button: ButtonComponent): ButtonComponent", + "const setDestructive = component.setDestructive;", + "const legacyWarningMethod = `set${'Warning'}`;", + ]); sourceContainsAll(stylesSource, [ ".modal.dify-sync-modal-shell.confirm-modal-shell .modal-close-button", "top: 18px;", diff --git a/versions.json b/versions.json index 26e1c69..d1a1314 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,4 @@ { "1.0.0": "1.1.1", - "1.0.2": "1.1.1" + "1.0.2": "1.13.0" }