@n8n/utils
Advanced tools
| const require_create_event_queue = require('./create-event-queue2.cjs'); | ||
| exports.createEventQueue = require_create_event_queue.createEventQueue; |
| import { t as createEventQueue } from "./create-event-queue2.cjs"; | ||
| export { createEventQueue }; |
| import { t as createEventQueue } from "./create-event-queue2.mjs"; | ||
| export { createEventQueue }; |
| import { t as createEventQueue } from "./create-event-queue2.mjs"; | ||
| export { createEventQueue }; |
| //#region src/create-event-queue.ts | ||
| /** | ||
| * Create an event queue that processes events sequentially. | ||
| * | ||
| * @param processEvent - Async function that processes a single event. | ||
| * @returns A function that enqueues events for processing. | ||
| */ | ||
| function createEventQueue(processEvent) { | ||
| const queue = []; | ||
| let processing = false; | ||
| /** | ||
| * Process the next event in the queue (if not already processing). | ||
| */ | ||
| async function processNext() { | ||
| if (processing || queue.length === 0) return; | ||
| processing = true; | ||
| const currentEvent = queue.shift(); | ||
| if (currentEvent !== void 0) try { | ||
| await processEvent(currentEvent); | ||
| } catch (error) { | ||
| console.error("Error processing event:", error); | ||
| } | ||
| processing = false; | ||
| await processNext(); | ||
| } | ||
| /** | ||
| * Enqueue an event and trigger processing. | ||
| * | ||
| * @param event - The event to enqueue. | ||
| */ | ||
| function enqueue(event) { | ||
| queue.push(event); | ||
| processNext(); | ||
| } | ||
| return { enqueue }; | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'createEventQueue', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return createEventQueue; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=create-event-queue2.cjs.map |
| {"version":3,"file":"create-event-queue2.cjs","names":["queue: T[]"],"sources":["../src/create-event-queue.ts"],"sourcesContent":["/**\n * Create an event queue that processes events sequentially.\n *\n * @param processEvent - Async function that processes a single event.\n * @returns A function that enqueues events for processing.\n */\nexport function createEventQueue<T>(processEvent: (event: T) => Promise<void>) {\n\t// The internal queue holding events.\n\tconst queue: T[] = [];\n\n\t// Flag to indicate whether an event is currently being processed.\n\tlet processing = false;\n\n\t/**\n\t * Process the next event in the queue (if not already processing).\n\t */\n\tasync function processNext(): Promise<void> {\n\t\tif (processing || queue.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tprocessing = true;\n\t\tconst currentEvent = queue.shift();\n\n\t\tif (currentEvent !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait processEvent(currentEvent);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error processing event:', error);\n\t\t\t}\n\t\t}\n\n\t\tprocessing = false;\n\n\t\t// Recursively process the next event.\n\t\tawait processNext();\n\t}\n\n\t/**\n\t * Enqueue an event and trigger processing.\n\t *\n\t * @param event - The event to enqueue.\n\t */\n\tfunction enqueue(event: T): void {\n\t\tqueue.push(event);\n\t\tvoid processNext();\n\t}\n\n\treturn { enqueue };\n}\n"],"mappings":";;;;;;;;AAMA,SAAgB,iBAAoB,cAA2C;CAE9E,MAAMA,QAAa,EAAE;CAGrB,IAAI,aAAa;;;;CAKjB,eAAe,cAA6B;AAC3C,MAAI,cAAc,MAAM,WAAW,EAClC;AAGD,eAAa;EACb,MAAM,eAAe,MAAM,OAAO;AAElC,MAAI,iBAAiB,OACpB,KAAI;AACH,SAAM,aAAa,aAAa;WACxB,OAAO;AACf,WAAQ,MAAM,2BAA2B,MAAM;;AAIjD,eAAa;AAGb,QAAM,aAAa;;;;;;;CAQpB,SAAS,QAAQ,OAAgB;AAChC,QAAM,KAAK,MAAM;AACjB,EAAK,aAAa;;AAGnB,QAAO,EAAE,SAAS"} |
| //#region src/create-event-queue.d.ts | ||
| declare function createEventQueue<T>(processEvent: (event: T) => Promise<void>): { | ||
| enqueue: (event: T) => void; | ||
| }; | ||
| //#endregion | ||
| export { createEventQueue as t }; | ||
| //# sourceMappingURL=create-event-queue2.d.cts.map |
| //#region src/create-event-queue.d.ts | ||
| declare function createEventQueue<T>(processEvent: (event: T) => Promise<void>): { | ||
| enqueue: (event: T) => void; | ||
| }; | ||
| //#endregion | ||
| export { createEventQueue as t }; | ||
| //# sourceMappingURL=create-event-queue2.d.mts.map |
| //#region src/create-event-queue.ts | ||
| /** | ||
| * Create an event queue that processes events sequentially. | ||
| * | ||
| * @param processEvent - Async function that processes a single event. | ||
| * @returns A function that enqueues events for processing. | ||
| */ | ||
| function createEventQueue(processEvent) { | ||
| const queue = []; | ||
| let processing = false; | ||
| /** | ||
| * Process the next event in the queue (if not already processing). | ||
| */ | ||
| async function processNext() { | ||
| if (processing || queue.length === 0) return; | ||
| processing = true; | ||
| const currentEvent = queue.shift(); | ||
| if (currentEvent !== void 0) try { | ||
| await processEvent(currentEvent); | ||
| } catch (error) { | ||
| console.error("Error processing event:", error); | ||
| } | ||
| processing = false; | ||
| await processNext(); | ||
| } | ||
| /** | ||
| * Enqueue an event and trigger processing. | ||
| * | ||
| * @param event - The event to enqueue. | ||
| */ | ||
| function enqueue(event) { | ||
| queue.push(event); | ||
| processNext(); | ||
| } | ||
| return { enqueue }; | ||
| } | ||
| //#endregion | ||
| export { createEventQueue as t }; | ||
| //# sourceMappingURL=create-event-queue2.mjs.map |
| {"version":3,"file":"create-event-queue2.mjs","names":["queue: T[]"],"sources":["../src/create-event-queue.ts"],"sourcesContent":["/**\n * Create an event queue that processes events sequentially.\n *\n * @param processEvent - Async function that processes a single event.\n * @returns A function that enqueues events for processing.\n */\nexport function createEventQueue<T>(processEvent: (event: T) => Promise<void>) {\n\t// The internal queue holding events.\n\tconst queue: T[] = [];\n\n\t// Flag to indicate whether an event is currently being processed.\n\tlet processing = false;\n\n\t/**\n\t * Process the next event in the queue (if not already processing).\n\t */\n\tasync function processNext(): Promise<void> {\n\t\tif (processing || queue.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tprocessing = true;\n\t\tconst currentEvent = queue.shift();\n\n\t\tif (currentEvent !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait processEvent(currentEvent);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error processing event:', error);\n\t\t\t}\n\t\t}\n\n\t\tprocessing = false;\n\n\t\t// Recursively process the next event.\n\t\tawait processNext();\n\t}\n\n\t/**\n\t * Enqueue an event and trigger processing.\n\t *\n\t * @param event - The event to enqueue.\n\t */\n\tfunction enqueue(event: T): void {\n\t\tqueue.push(event);\n\t\tvoid processNext();\n\t}\n\n\treturn { enqueue };\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,iBAAoB,cAA2C;CAE9E,MAAMA,QAAa,EAAE;CAGrB,IAAI,aAAa;;;;CAKjB,eAAe,cAA6B;AAC3C,MAAI,cAAc,MAAM,WAAW,EAClC;AAGD,eAAa;EACb,MAAM,eAAe,MAAM,OAAO;AAElC,MAAI,iBAAiB,OACpB,KAAI;AACH,SAAM,aAAa,aAAa;WACxB,OAAO;AACf,WAAQ,MAAM,2BAA2B,MAAM;;AAIjD,eAAa;AAGb,QAAM,aAAa;;;;;;;CAQpB,SAAS,QAAQ,OAAgB;AAChC,QAAM,KAAK,MAAM;AACjB,EAAK,aAAa;;AAGnB,QAAO,EAAE,SAAS"} |
| const require_is_windows_file_path = require('../is-windows-file-path.cjs'); | ||
| exports.isWindowsFilePath = require_is_windows_file_path.isWindowsFilePath; |
| import { t as isWindowsFilePath } from "../is-windows-file-path.cjs"; | ||
| export { isWindowsFilePath }; |
| import { t as isWindowsFilePath } from "../is-windows-file-path.mjs"; | ||
| export { isWindowsFilePath }; |
| import { t as isWindowsFilePath } from "../is-windows-file-path.mjs"; | ||
| export { isWindowsFilePath }; |
| const require_sanitize_filename = require('../sanitize-filename.cjs'); | ||
| exports.sanitizeFilename = require_sanitize_filename.sanitizeFilename; |
| import { t as sanitizeFilename } from "../sanitize-filename.cjs"; | ||
| export { sanitizeFilename }; |
| import { t as sanitizeFilename } from "../sanitize-filename.mjs"; | ||
| export { sanitizeFilename }; |
| import { t as sanitizeFilename } from "../sanitize-filename.mjs"; | ||
| export { sanitizeFilename }; |
| const require_format_pem_block = require('./format-pem-block2.cjs'); | ||
| exports.formatPemBlock = require_format_pem_block.formatPemBlock; |
| import { t as formatPemBlock } from "./format-pem-block2.cjs"; | ||
| export { formatPemBlock }; |
| import { t as formatPemBlock } from "./format-pem-block2.mjs"; | ||
| export { formatPemBlock }; |
| import { t as formatPemBlock } from "./format-pem-block2.mjs"; | ||
| export { formatPemBlock }; |
| //#region src/format-pem-block.ts | ||
| const PEM_BODY_LINE_LENGTH = 64; | ||
| function formatCompactPem(pem, isPublic) { | ||
| const trimmed = pem.trim(); | ||
| if ((trimmed.match(/-----BEGIN /g) ?? []).length !== 1) return void 0; | ||
| const labelPattern = isPublic ? "[A-Z0-9 ]*PUBLIC KEY" : "[A-Z0-9 ]*PRIVATE KEY|CERTIFICATE"; | ||
| const pemMatch = trimmed.match(/* @__PURE__ */ new RegExp(`^-----BEGIN (${labelPattern})-----([\\s\\S]*?)-----END \\1-----$`)); | ||
| if (!pemMatch) return void 0; | ||
| const [, label, body] = pemMatch; | ||
| const normalizedBody = body.replace(/\\n/g, "\n").trim(); | ||
| return `-----BEGIN ${label}-----\n${/\s/.test(normalizedBody) ? normalizedBody.replace(/:\s+/g, ":").replace(/\s+/g, "\n") : (normalizedBody.match(new RegExp(`.{1,${PEM_BODY_LINE_LENGTH}}`, "g")) ?? []).join("\n")}\n-----END ${label}-----`; | ||
| } | ||
| /** | ||
| * Normalize a single PEM-encoded block (private key, public key, or certificate) | ||
| * by collapsing whitespace and wrapping the body at 64 chars. Multi-block PEM | ||
| * chains are returned unchanged. | ||
| * | ||
| * @param pem - The PEM-encoded block to format. | ||
| * @param isPublic - When true, match `PUBLIC KEY` labels instead of the default `PRIVATE KEY` / `CERTIFICATE`. | ||
| * @returns The formatted PEM block. | ||
| */ | ||
| function formatPemBlock(pem, isPublic = false) { | ||
| let regex = /(PRIVATE KEY|CERTIFICATE)/; | ||
| if (isPublic) regex = /(PUBLIC KEY)/; | ||
| if (!pem || /\n/.test(pem)) return pem; | ||
| const compactPem = formatCompactPem(pem, isPublic); | ||
| if (compactPem !== void 0) return compactPem; | ||
| let formattedPem = ""; | ||
| pem.split("-----").filter((item) => item !== "").forEach((part) => { | ||
| if (regex.test(part)) formattedPem += `-----${part}-----`; | ||
| else if (/Proc-Type|DEK-Info/.test(part)) { | ||
| part = part.replace(/:\s+/g, ":"); | ||
| formattedPem += part.replace(/\\n/g, "\n").replace(/\s+/g, "\n"); | ||
| } else formattedPem += part.replace(/\\n/g, "\n").replace(/\s+/g, "\n"); | ||
| }); | ||
| return formattedPem; | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'formatPemBlock', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return formatPemBlock; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=format-pem-block2.cjs.map |
| {"version":3,"file":"format-pem-block2.cjs","names":[],"sources":["../src/format-pem-block.ts"],"sourcesContent":["const PEM_BODY_LINE_LENGTH = 64;\n\nfunction formatCompactPem(pem: string, isPublic: boolean): string | undefined {\n\tconst trimmed = pem.trim();\n\tif ((trimmed.match(/-----BEGIN /g) ?? []).length !== 1) return undefined;\n\n\tconst labelPattern = isPublic ? '[A-Z0-9 ]*PUBLIC KEY' : '[A-Z0-9 ]*PRIVATE KEY|CERTIFICATE';\n\tconst pemMatch = trimmed.match(\n\t\tnew RegExp(`^-----BEGIN (${labelPattern})-----([\\\\s\\\\S]*?)-----END \\\\1-----$`),\n\t);\n\n\tif (!pemMatch) return undefined;\n\n\tconst [, label, body] = pemMatch;\n\tconst normalizedBody = body.replace(/\\\\n/g, '\\n').trim();\n\tconst formattedBody = /\\s/.test(normalizedBody)\n\t\t? normalizedBody.replace(/:\\s+/g, ':').replace(/\\s+/g, '\\n')\n\t\t: (normalizedBody.match(new RegExp(`.{1,${PEM_BODY_LINE_LENGTH}}`, 'g')) ?? []).join('\\n');\n\n\treturn `-----BEGIN ${label}-----\\n${formattedBody}\\n-----END ${label}-----`;\n}\n\n/**\n * Normalize a single PEM-encoded block (private key, public key, or certificate)\n * by collapsing whitespace and wrapping the body at 64 chars. Multi-block PEM\n * chains are returned unchanged.\n *\n * @param pem - The PEM-encoded block to format.\n * @param isPublic - When true, match `PUBLIC KEY` labels instead of the default `PRIVATE KEY` / `CERTIFICATE`.\n * @returns The formatted PEM block.\n */\nexport function formatPemBlock(pem: string, isPublic = false): string {\n\tlet regex = /(PRIVATE KEY|CERTIFICATE)/;\n\tif (isPublic) {\n\t\tregex = /(PUBLIC KEY)/;\n\t}\n\tif (!pem || /\\n/.test(pem)) {\n\t\treturn pem;\n\t}\n\tconst compactPem = formatCompactPem(pem, isPublic);\n\tif (compactPem !== undefined) {\n\t\treturn compactPem;\n\t}\n\n\tlet formattedPem = '';\n\tconst parts = pem.split('-----').filter((item) => item !== '');\n\tparts.forEach((part) => {\n\t\tif (regex.test(part)) {\n\t\t\tformattedPem += `-----${part}-----`;\n\t\t} else {\n\t\t\tconst passRegex = /Proc-Type|DEK-Info/;\n\t\t\tif (passRegex.test(part)) {\n\t\t\t\tpart = part.replace(/:\\s+/g, ':');\n\t\t\t\tformattedPem += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t} else {\n\t\t\t\tformattedPem += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t}\n\t\t}\n\t});\n\treturn formattedPem;\n}\n"],"mappings":";;AAAA,MAAM,uBAAuB;AAE7B,SAAS,iBAAiB,KAAa,UAAuC;CAC7E,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAK,QAAQ,MAAM,eAAe,IAAI,EAAE,EAAE,WAAW,EAAG,QAAO;CAE/D,MAAM,eAAe,WAAW,yBAAyB;CACzD,MAAM,WAAW,QAAQ,sBACxB,IAAI,OAAO,gBAAgB,aAAa,sCAAsC,CAC9E;AAED,KAAI,CAAC,SAAU,QAAO;CAEtB,MAAM,GAAG,OAAO,QAAQ;CACxB,MAAM,iBAAiB,KAAK,QAAQ,QAAQ,KAAK,CAAC,MAAM;AAKxD,QAAO,cAAc,MAAM,SAJL,KAAK,KAAK,eAAe,GAC5C,eAAe,QAAQ,SAAS,IAAI,CAAC,QAAQ,QAAQ,KAAK,IACzD,eAAe,MAAM,IAAI,OAAO,OAAO,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,CAEzC,aAAa,MAAM;;;;;;;;;;;AAYtE,SAAgB,eAAe,KAAa,WAAW,OAAe;CACrE,IAAI,QAAQ;AACZ,KAAI,SACH,SAAQ;AAET,KAAI,CAAC,OAAO,KAAK,KAAK,IAAI,CACzB,QAAO;CAER,MAAM,aAAa,iBAAiB,KAAK,SAAS;AAClD,KAAI,eAAe,OAClB,QAAO;CAGR,IAAI,eAAe;AAEnB,CADc,IAAI,MAAM,QAAQ,CAAC,QAAQ,SAAS,SAAS,GAAG,CACxD,SAAS,SAAS;AACvB,MAAI,MAAM,KAAK,KAAK,CACnB,iBAAgB,QAAQ,KAAK;WAEX,qBACJ,KAAK,KAAK,EAAE;AACzB,UAAO,KAAK,QAAQ,SAAS,IAAI;AACjC,mBAAgB,KAAK,QAAQ,QAAQ,KAAK,CAAC,QAAQ,QAAQ,KAAK;QAEhE,iBAAgB,KAAK,QAAQ,QAAQ,KAAK,CAAC,QAAQ,QAAQ,KAAK;GAGjE;AACF,QAAO"} |
| //#region src/format-pem-block.d.ts | ||
| declare function formatPemBlock(pem: string, isPublic?: boolean): string; | ||
| //#endregion | ||
| export { formatPemBlock as t }; | ||
| //# sourceMappingURL=format-pem-block2.d.cts.map |
| //#region src/format-pem-block.d.ts | ||
| declare function formatPemBlock(pem: string, isPublic?: boolean): string; | ||
| //#endregion | ||
| export { formatPemBlock as t }; | ||
| //# sourceMappingURL=format-pem-block2.d.mts.map |
| //#region src/format-pem-block.ts | ||
| const PEM_BODY_LINE_LENGTH = 64; | ||
| function formatCompactPem(pem, isPublic) { | ||
| const trimmed = pem.trim(); | ||
| if ((trimmed.match(/-----BEGIN /g) ?? []).length !== 1) return void 0; | ||
| const labelPattern = isPublic ? "[A-Z0-9 ]*PUBLIC KEY" : "[A-Z0-9 ]*PRIVATE KEY|CERTIFICATE"; | ||
| const pemMatch = trimmed.match(/* @__PURE__ */ new RegExp(`^-----BEGIN (${labelPattern})-----([\\s\\S]*?)-----END \\1-----$`)); | ||
| if (!pemMatch) return void 0; | ||
| const [, label, body] = pemMatch; | ||
| const normalizedBody = body.replace(/\\n/g, "\n").trim(); | ||
| return `-----BEGIN ${label}-----\n${/\s/.test(normalizedBody) ? normalizedBody.replace(/:\s+/g, ":").replace(/\s+/g, "\n") : (normalizedBody.match(new RegExp(`.{1,${PEM_BODY_LINE_LENGTH}}`, "g")) ?? []).join("\n")}\n-----END ${label}-----`; | ||
| } | ||
| /** | ||
| * Normalize a single PEM-encoded block (private key, public key, or certificate) | ||
| * by collapsing whitespace and wrapping the body at 64 chars. Multi-block PEM | ||
| * chains are returned unchanged. | ||
| * | ||
| * @param pem - The PEM-encoded block to format. | ||
| * @param isPublic - When true, match `PUBLIC KEY` labels instead of the default `PRIVATE KEY` / `CERTIFICATE`. | ||
| * @returns The formatted PEM block. | ||
| */ | ||
| function formatPemBlock(pem, isPublic = false) { | ||
| let regex = /(PRIVATE KEY|CERTIFICATE)/; | ||
| if (isPublic) regex = /(PUBLIC KEY)/; | ||
| if (!pem || /\n/.test(pem)) return pem; | ||
| const compactPem = formatCompactPem(pem, isPublic); | ||
| if (compactPem !== void 0) return compactPem; | ||
| let formattedPem = ""; | ||
| pem.split("-----").filter((item) => item !== "").forEach((part) => { | ||
| if (regex.test(part)) formattedPem += `-----${part}-----`; | ||
| else if (/Proc-Type|DEK-Info/.test(part)) { | ||
| part = part.replace(/:\s+/g, ":"); | ||
| formattedPem += part.replace(/\\n/g, "\n").replace(/\s+/g, "\n"); | ||
| } else formattedPem += part.replace(/\\n/g, "\n").replace(/\s+/g, "\n"); | ||
| }); | ||
| return formattedPem; | ||
| } | ||
| //#endregion | ||
| export { formatPemBlock as t }; | ||
| //# sourceMappingURL=format-pem-block2.mjs.map |
| {"version":3,"file":"format-pem-block2.mjs","names":[],"sources":["../src/format-pem-block.ts"],"sourcesContent":["const PEM_BODY_LINE_LENGTH = 64;\n\nfunction formatCompactPem(pem: string, isPublic: boolean): string | undefined {\n\tconst trimmed = pem.trim();\n\tif ((trimmed.match(/-----BEGIN /g) ?? []).length !== 1) return undefined;\n\n\tconst labelPattern = isPublic ? '[A-Z0-9 ]*PUBLIC KEY' : '[A-Z0-9 ]*PRIVATE KEY|CERTIFICATE';\n\tconst pemMatch = trimmed.match(\n\t\tnew RegExp(`^-----BEGIN (${labelPattern})-----([\\\\s\\\\S]*?)-----END \\\\1-----$`),\n\t);\n\n\tif (!pemMatch) return undefined;\n\n\tconst [, label, body] = pemMatch;\n\tconst normalizedBody = body.replace(/\\\\n/g, '\\n').trim();\n\tconst formattedBody = /\\s/.test(normalizedBody)\n\t\t? normalizedBody.replace(/:\\s+/g, ':').replace(/\\s+/g, '\\n')\n\t\t: (normalizedBody.match(new RegExp(`.{1,${PEM_BODY_LINE_LENGTH}}`, 'g')) ?? []).join('\\n');\n\n\treturn `-----BEGIN ${label}-----\\n${formattedBody}\\n-----END ${label}-----`;\n}\n\n/**\n * Normalize a single PEM-encoded block (private key, public key, or certificate)\n * by collapsing whitespace and wrapping the body at 64 chars. Multi-block PEM\n * chains are returned unchanged.\n *\n * @param pem - The PEM-encoded block to format.\n * @param isPublic - When true, match `PUBLIC KEY` labels instead of the default `PRIVATE KEY` / `CERTIFICATE`.\n * @returns The formatted PEM block.\n */\nexport function formatPemBlock(pem: string, isPublic = false): string {\n\tlet regex = /(PRIVATE KEY|CERTIFICATE)/;\n\tif (isPublic) {\n\t\tregex = /(PUBLIC KEY)/;\n\t}\n\tif (!pem || /\\n/.test(pem)) {\n\t\treturn pem;\n\t}\n\tconst compactPem = formatCompactPem(pem, isPublic);\n\tif (compactPem !== undefined) {\n\t\treturn compactPem;\n\t}\n\n\tlet formattedPem = '';\n\tconst parts = pem.split('-----').filter((item) => item !== '');\n\tparts.forEach((part) => {\n\t\tif (regex.test(part)) {\n\t\t\tformattedPem += `-----${part}-----`;\n\t\t} else {\n\t\t\tconst passRegex = /Proc-Type|DEK-Info/;\n\t\t\tif (passRegex.test(part)) {\n\t\t\t\tpart = part.replace(/:\\s+/g, ':');\n\t\t\t\tformattedPem += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t} else {\n\t\t\t\tformattedPem += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t}\n\t\t}\n\t});\n\treturn formattedPem;\n}\n"],"mappings":";AAAA,MAAM,uBAAuB;AAE7B,SAAS,iBAAiB,KAAa,UAAuC;CAC7E,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAK,QAAQ,MAAM,eAAe,IAAI,EAAE,EAAE,WAAW,EAAG,QAAO;CAE/D,MAAM,eAAe,WAAW,yBAAyB;CACzD,MAAM,WAAW,QAAQ,sBACxB,IAAI,OAAO,gBAAgB,aAAa,sCAAsC,CAC9E;AAED,KAAI,CAAC,SAAU,QAAO;CAEtB,MAAM,GAAG,OAAO,QAAQ;CACxB,MAAM,iBAAiB,KAAK,QAAQ,QAAQ,KAAK,CAAC,MAAM;AAKxD,QAAO,cAAc,MAAM,SAJL,KAAK,KAAK,eAAe,GAC5C,eAAe,QAAQ,SAAS,IAAI,CAAC,QAAQ,QAAQ,KAAK,IACzD,eAAe,MAAM,IAAI,OAAO,OAAO,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,CAEzC,aAAa,MAAM;;;;;;;;;;;AAYtE,SAAgB,eAAe,KAAa,WAAW,OAAe;CACrE,IAAI,QAAQ;AACZ,KAAI,SACH,SAAQ;AAET,KAAI,CAAC,OAAO,KAAK,KAAK,IAAI,CACzB,QAAO;CAER,MAAM,aAAa,iBAAiB,KAAK,SAAS;AAClD,KAAI,eAAe,OAClB,QAAO;CAGR,IAAI,eAAe;AAEnB,CADc,IAAI,MAAM,QAAQ,CAAC,QAAQ,SAAS,SAAS,GAAG,CACxD,SAAS,SAAS;AACvB,MAAI,MAAM,KAAK,KAAK,CACnB,iBAAgB,QAAQ,KAAK;WAEX,qBACJ,KAAK,KAAK,EAAE;AACzB,UAAO,KAAK,QAAQ,SAAS,IAAI;AACjC,mBAAgB,KAAK,QAAQ,QAAQ,KAAK,CAAC,QAAQ,QAAQ,KAAK;QAEhE,iBAAgB,KAAK,QAAQ,QAAQ,KAAK,CAAC,QAAQ,QAAQ,KAAK;GAGjE;AACF,QAAO"} |
| const require_generate_nano_id = require('./generate-nano-id2.cjs'); | ||
| exports.generateNanoId = require_generate_nano_id.generateNanoId; |
| import { t as generateNanoId } from "./generate-nano-id2.cjs"; | ||
| export { generateNanoId }; |
| import { t as generateNanoId } from "./generate-nano-id2.mjs"; | ||
| export { generateNanoId }; |
| import { t as generateNanoId } from "./generate-nano-id2.mjs"; | ||
| export { generateNanoId }; |
| let __n8n_constants = require("@n8n/constants"); | ||
| let nanoid = require("nanoid"); | ||
| //#region src/generate-nano-id.ts | ||
| /** | ||
| * Generates a unique 16-character nanoid. | ||
| * | ||
| * This is the canonical ID generator used across the entire n8n codebase for: | ||
| * - Workflow IDs | ||
| * - Project IDs | ||
| * - Variable IDs | ||
| * - API Key IDs | ||
| * - And other entity IDs | ||
| * | ||
| * Both frontend and backend MUST use this function to ensure consistency. | ||
| * | ||
| * @returns A 16-character ID | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const id = generateNanoId(); | ||
| * // => 'aBcDeFgHiJkLmNoP' (16 characters) | ||
| * ``` | ||
| */ | ||
| const generateNanoId = (0, nanoid.customAlphabet)(__n8n_constants.NANOID_ALPHABET, 16); | ||
| //#endregion | ||
| Object.defineProperty(exports, 'generateNanoId', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return generateNanoId; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=generate-nano-id2.cjs.map |
| {"version":3,"file":"generate-nano-id2.cjs","names":["NANOID_ALPHABET"],"sources":["../src/generate-nano-id.ts"],"sourcesContent":["import { NANOID_ALPHABET } from '@n8n/constants';\nimport { customAlphabet } from 'nanoid';\n\n/**\n * Generates a unique 16-character nanoid.\n *\n * This is the canonical ID generator used across the entire n8n codebase for:\n * - Workflow IDs\n * - Project IDs\n * - Variable IDs\n * - API Key IDs\n * - And other entity IDs\n *\n * Both frontend and backend MUST use this function to ensure consistency.\n *\n * @returns A 16-character ID\n *\n * @example\n * ```ts\n * const id = generateNanoId();\n * // => 'aBcDeFgHiJkLmNoP' (16 characters)\n * ```\n */\nexport const generateNanoId = customAlphabet(NANOID_ALPHABET, 16);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,4CAAgCA,iCAAiB,GAAG"} |
| //#region src/generate-nano-id.d.ts | ||
| declare const generateNanoId: (size?: number) => string; | ||
| //#endregion | ||
| export { generateNanoId as t }; | ||
| //# sourceMappingURL=generate-nano-id2.d.cts.map |
| //#region src/generate-nano-id.d.ts | ||
| declare const generateNanoId: (size?: number) => string; | ||
| //#endregion | ||
| export { generateNanoId as t }; | ||
| //# sourceMappingURL=generate-nano-id2.d.mts.map |
| import { NANOID_ALPHABET } from "@n8n/constants"; | ||
| import { customAlphabet } from "nanoid"; | ||
| //#region src/generate-nano-id.ts | ||
| /** | ||
| * Generates a unique 16-character nanoid. | ||
| * | ||
| * This is the canonical ID generator used across the entire n8n codebase for: | ||
| * - Workflow IDs | ||
| * - Project IDs | ||
| * - Variable IDs | ||
| * - API Key IDs | ||
| * - And other entity IDs | ||
| * | ||
| * Both frontend and backend MUST use this function to ensure consistency. | ||
| * | ||
| * @returns A 16-character ID | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const id = generateNanoId(); | ||
| * // => 'aBcDeFgHiJkLmNoP' (16 characters) | ||
| * ``` | ||
| */ | ||
| const generateNanoId = customAlphabet(NANOID_ALPHABET, 16); | ||
| //#endregion | ||
| export { generateNanoId as t }; | ||
| //# sourceMappingURL=generate-nano-id2.mjs.map |
| {"version":3,"file":"generate-nano-id2.mjs","names":[],"sources":["../src/generate-nano-id.ts"],"sourcesContent":["import { NANOID_ALPHABET } from '@n8n/constants';\nimport { customAlphabet } from 'nanoid';\n\n/**\n * Generates a unique 16-character nanoid.\n *\n * This is the canonical ID generator used across the entire n8n codebase for:\n * - Workflow IDs\n * - Project IDs\n * - Variable IDs\n * - API Key IDs\n * - And other entity IDs\n *\n * Both frontend and backend MUST use this function to ensure consistency.\n *\n * @returns A 16-character ID\n *\n * @example\n * ```ts\n * const id = generateNanoId();\n * // => 'aBcDeFgHiJkLmNoP' (16 characters)\n * ```\n */\nexport const generateNanoId = customAlphabet(NANOID_ALPHABET, 16);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,iBAAiB,eAAe,iBAAiB,GAAG"} |
| const require_get_jwt_expiry = require('./get-jwt-expiry2.cjs'); | ||
| exports.getJwtExpiry = require_get_jwt_expiry.getJwtExpiry; |
| import { t as getJwtExpiry } from "./get-jwt-expiry2.cjs"; | ||
| export { getJwtExpiry }; |
| import { t as getJwtExpiry } from "./get-jwt-expiry2.mjs"; | ||
| export { getJwtExpiry }; |
| import { t as getJwtExpiry } from "./get-jwt-expiry2.mjs"; | ||
| export { getJwtExpiry }; |
| //#region src/get-jwt-expiry.ts | ||
| /** | ||
| * Decode the payload of a JWT without verifying the signature. | ||
| * Returns the `exp` claim (seconds since epoch) or undefined. | ||
| * | ||
| * Use only for trusted tokens (e.g. ones we just received from our own proxy) | ||
| * where the goal is scheduling refresh, not authenticating the issuer. | ||
| */ | ||
| function getJwtExpiry(jwt) { | ||
| const parts = jwt.split("."); | ||
| if (parts.length !== 3) return void 0; | ||
| try { | ||
| const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString()); | ||
| return typeof payload.exp === "number" ? payload.exp : void 0; | ||
| } catch { | ||
| return; | ||
| } | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'getJwtExpiry', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return getJwtExpiry; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=get-jwt-expiry2.cjs.map |
| {"version":3,"file":"get-jwt-expiry2.cjs","names":[],"sources":["../src/get-jwt-expiry.ts"],"sourcesContent":["/**\n * Decode the payload of a JWT without verifying the signature.\n * Returns the `exp` claim (seconds since epoch) or undefined.\n *\n * Use only for trusted tokens (e.g. ones we just received from our own proxy)\n * where the goal is scheduling refresh, not authenticating the issuer.\n */\nexport function getJwtExpiry(jwt: string): number | undefined {\n\tconst parts = jwt.split('.');\n\tif (parts.length !== 3) return undefined;\n\ttry {\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString()) as {\n\t\t\texp?: number;\n\t\t};\n\t\treturn typeof payload.exp === 'number' ? payload.exp : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"],"mappings":";;;;;;;;;AAOA,SAAgB,aAAa,KAAiC;CAC7D,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,KAAI;EACH,MAAM,UAAU,KAAK,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC;AAGzE,SAAO,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;SAChD;AACP"} |
| //#region src/get-jwt-expiry.d.ts | ||
| declare function getJwtExpiry(jwt: string): number | undefined; | ||
| //#endregion | ||
| export { getJwtExpiry as t }; | ||
| //# sourceMappingURL=get-jwt-expiry2.d.cts.map |
| //#region src/get-jwt-expiry.d.ts | ||
| declare function getJwtExpiry(jwt: string): number | undefined; | ||
| //#endregion | ||
| export { getJwtExpiry as t }; | ||
| //# sourceMappingURL=get-jwt-expiry2.d.mts.map |
| //#region src/get-jwt-expiry.ts | ||
| /** | ||
| * Decode the payload of a JWT without verifying the signature. | ||
| * Returns the `exp` claim (seconds since epoch) or undefined. | ||
| * | ||
| * Use only for trusted tokens (e.g. ones we just received from our own proxy) | ||
| * where the goal is scheduling refresh, not authenticating the issuer. | ||
| */ | ||
| function getJwtExpiry(jwt) { | ||
| const parts = jwt.split("."); | ||
| if (parts.length !== 3) return void 0; | ||
| try { | ||
| const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString()); | ||
| return typeof payload.exp === "number" ? payload.exp : void 0; | ||
| } catch { | ||
| return; | ||
| } | ||
| } | ||
| //#endregion | ||
| export { getJwtExpiry as t }; | ||
| //# sourceMappingURL=get-jwt-expiry2.mjs.map |
| {"version":3,"file":"get-jwt-expiry2.mjs","names":[],"sources":["../src/get-jwt-expiry.ts"],"sourcesContent":["/**\n * Decode the payload of a JWT without verifying the signature.\n * Returns the `exp` claim (seconds since epoch) or undefined.\n *\n * Use only for trusted tokens (e.g. ones we just received from our own proxy)\n * where the goal is scheduling refresh, not authenticating the issuer.\n */\nexport function getJwtExpiry(jwt: string): number | undefined {\n\tconst parts = jwt.split('.');\n\tif (parts.length !== 3) return undefined;\n\ttry {\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString()) as {\n\t\t\texp?: number;\n\t\t};\n\t\treturn typeof payload.exp === 'number' ? payload.exp : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,aAAa,KAAiC;CAC7D,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,KAAI;EACH,MAAM,UAAU,KAAK,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC;AAGzE,SAAO,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;SAChD;AACP"} |
| const require_is_record = require('./is-record2.cjs'); | ||
| exports.isRecord = require_is_record.isRecord; |
| import { t as isRecord } from "./is-record2.cjs"; | ||
| export { isRecord }; |
| import { t as isRecord } from "./is-record2.mjs"; | ||
| export { isRecord }; |
| import { t as isRecord } from "./is-record2.mjs"; | ||
| export { isRecord }; |
| //#region src/is-record.ts | ||
| function isRecord(value) { | ||
| return typeof value === "object" && value !== null && !Array.isArray(value); | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'isRecord', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return isRecord; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=is-record2.cjs.map |
| {"version":3,"file":"is-record2.cjs","names":[],"sources":["../src/is-record.ts"],"sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;AAAA,SAAgB,SAAS,OAAkD;AAC1E,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM"} |
| //#region src/is-record.d.ts | ||
| declare function isRecord(value: unknown): value is Record<string, unknown>; | ||
| //#endregion | ||
| export { isRecord as t }; | ||
| //# sourceMappingURL=is-record2.d.cts.map |
| //#region src/is-record.d.ts | ||
| declare function isRecord(value: unknown): value is Record<string, unknown>; | ||
| //#endregion | ||
| export { isRecord as t }; | ||
| //# sourceMappingURL=is-record2.d.mts.map |
| //#region src/is-record.ts | ||
| function isRecord(value) { | ||
| return typeof value === "object" && value !== null && !Array.isArray(value); | ||
| } | ||
| //#endregion | ||
| export { isRecord as t }; | ||
| //# sourceMappingURL=is-record2.mjs.map |
| {"version":3,"file":"is-record2.mjs","names":[],"sources":["../src/is-record.ts"],"sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";AAAA,SAAgB,SAAS,OAAkD;AAC1E,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM"} |
| //#region src/files/is-windows-file-path.ts | ||
| /** | ||
| * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\' | ||
| */ | ||
| function isWindowsFilePath(str) { | ||
| return /^[a-zA-Z]:[\\/]/.test(str); | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'isWindowsFilePath', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return isWindowsFilePath; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=is-windows-file-path.cjs.map |
| {"version":3,"file":"is-windows-file-path.cjs","names":[],"sources":["../src/files/is-windows-file-path.ts"],"sourcesContent":["/**\n * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\\\'\n */\nexport function isWindowsFilePath(str: string) {\n\treturn /^[a-zA-Z]:[\\\\/]/.test(str);\n}\n"],"mappings":";;;;;AAGA,SAAgB,kBAAkB,KAAa;AAC9C,QAAO,kBAAkB,KAAK,IAAI"} |
| //#region src/files/is-windows-file-path.d.ts | ||
| declare function isWindowsFilePath(str: string): boolean; | ||
| //#endregion | ||
| export { isWindowsFilePath as t }; | ||
| //# sourceMappingURL=is-windows-file-path.d.cts.map |
| //#region src/files/is-windows-file-path.d.ts | ||
| declare function isWindowsFilePath(str: string): boolean; | ||
| //#endregion | ||
| export { isWindowsFilePath as t }; | ||
| //# sourceMappingURL=is-windows-file-path.d.mts.map |
| //#region src/files/is-windows-file-path.ts | ||
| /** | ||
| * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\' | ||
| */ | ||
| function isWindowsFilePath(str) { | ||
| return /^[a-zA-Z]:[\\/]/.test(str); | ||
| } | ||
| //#endregion | ||
| export { isWindowsFilePath as t }; | ||
| //# sourceMappingURL=is-windows-file-path.mjs.map |
| {"version":3,"file":"is-windows-file-path.mjs","names":[],"sources":["../src/files/is-windows-file-path.ts"],"sourcesContent":["/**\n * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\\\'\n */\nexport function isWindowsFilePath(str: string) {\n\treturn /^[a-zA-Z]:[\\\\/]/.test(str);\n}\n"],"mappings":";;;;AAGA,SAAgB,kBAAkB,KAAa;AAC9C,QAAO,kBAAkB,KAAK,IAAI"} |
| const require_smart_decimal = require('../smart-decimal.cjs'); | ||
| exports.smartDecimal = require_smart_decimal.smartDecimal; |
| import { t as smartDecimal } from "../smart-decimal.cjs"; | ||
| export { smartDecimal }; |
| import { t as smartDecimal } from "../smart-decimal.mjs"; | ||
| export { smartDecimal }; |
| import { t as smartDecimal } from "../smart-decimal.mjs"; | ||
| export { smartDecimal }; |
| //#region src/search/re-rank-search-results.ts | ||
| function reRankSearchResults(searchResults, additionalFactors) { | ||
| return searchResults.map(({ score, item }) => { | ||
| return { | ||
| score: score + Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => { | ||
| const factorScore = factorScores[item.key]; | ||
| if (factorScore) return acc + factorScore; | ||
| return acc; | ||
| }, 0), | ||
| item | ||
| }; | ||
| }).sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'reRankSearchResults', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return reRankSearchResults; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=re-rank-search-results.cjs.map |
| {"version":3,"file":"re-rank-search-results.cjs","names":[],"sources":["../src/search/re-rank-search-results.ts"],"sourcesContent":["export function reRankSearchResults<T extends { key: string }>(\n\tsearchResults: Array<{ score: number; item: T }>,\n\tadditionalFactors: Record<string, Record<string, number>>,\n): Array<{ score: number; item: T }> {\n\treturn searchResults\n\t\t.map(({ score, item }) => {\n\t\t\t// For each additional factor, we check if it exists for the item and type,\n\t\t\t// and if so, we add the score to the item's score.\n\t\t\tconst additionalScore = Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => {\n\t\t\t\tconst factorScore = factorScores[item.key];\n\t\t\t\tif (factorScore) {\n\t\t\t\t\treturn acc + factorScore;\n\t\t\t\t}\n\n\t\t\t\treturn acc;\n\t\t\t}, 0);\n\n\t\t\treturn {\n\t\t\t\tscore: score + additionalScore,\n\t\t\t\titem,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\treturn b.score - a.score;\n\t\t});\n}\n"],"mappings":";;AAAA,SAAgB,oBACf,eACA,mBACoC;AACpC,QAAO,cACL,KAAK,EAAE,OAAO,WAAW;AAYzB,SAAO;GACN,OAAO,QAVgB,OAAO,QAAQ,kBAAkB,CAAC,QAAQ,KAAK,CAAC,GAAG,kBAAkB;IAC5F,MAAM,cAAc,aAAa,KAAK;AACtC,QAAI,YACH,QAAO,MAAM;AAGd,WAAO;MACL,EAAE;GAIJ;GACA;GACA,CACD,MAAM,GAAG,MAAM;AACf,SAAO,EAAE,QAAQ,EAAE;GAClB"} |
| //#region src/search/re-rank-search-results.d.ts | ||
| declare function reRankSearchResults<T extends { | ||
| key: string; | ||
| }>(searchResults: Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>, additionalFactors: Record<string, Record<string, number>>): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { reRankSearchResults as t }; | ||
| //# sourceMappingURL=re-rank-search-results.d.cts.map |
| //#region src/search/re-rank-search-results.d.ts | ||
| declare function reRankSearchResults<T extends { | ||
| key: string; | ||
| }>(searchResults: Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>, additionalFactors: Record<string, Record<string, number>>): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { reRankSearchResults as t }; | ||
| //# sourceMappingURL=re-rank-search-results.d.mts.map |
| //#region src/search/re-rank-search-results.ts | ||
| function reRankSearchResults(searchResults, additionalFactors) { | ||
| return searchResults.map(({ score, item }) => { | ||
| return { | ||
| score: score + Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => { | ||
| const factorScore = factorScores[item.key]; | ||
| if (factorScore) return acc + factorScore; | ||
| return acc; | ||
| }, 0), | ||
| item | ||
| }; | ||
| }).sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| } | ||
| //#endregion | ||
| export { reRankSearchResults as t }; | ||
| //# sourceMappingURL=re-rank-search-results.mjs.map |
| {"version":3,"file":"re-rank-search-results.mjs","names":[],"sources":["../src/search/re-rank-search-results.ts"],"sourcesContent":["export function reRankSearchResults<T extends { key: string }>(\n\tsearchResults: Array<{ score: number; item: T }>,\n\tadditionalFactors: Record<string, Record<string, number>>,\n): Array<{ score: number; item: T }> {\n\treturn searchResults\n\t\t.map(({ score, item }) => {\n\t\t\t// For each additional factor, we check if it exists for the item and type,\n\t\t\t// and if so, we add the score to the item's score.\n\t\t\tconst additionalScore = Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => {\n\t\t\t\tconst factorScore = factorScores[item.key];\n\t\t\t\tif (factorScore) {\n\t\t\t\t\treturn acc + factorScore;\n\t\t\t\t}\n\n\t\t\t\treturn acc;\n\t\t\t}, 0);\n\n\t\t\treturn {\n\t\t\t\tscore: score + additionalScore,\n\t\t\t\titem,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\treturn b.score - a.score;\n\t\t});\n}\n"],"mappings":";AAAA,SAAgB,oBACf,eACA,mBACoC;AACpC,QAAO,cACL,KAAK,EAAE,OAAO,WAAW;AAYzB,SAAO;GACN,OAAO,QAVgB,OAAO,QAAQ,kBAAkB,CAAC,QAAQ,KAAK,CAAC,GAAG,kBAAkB;IAC5F,MAAM,cAAc,aAAa,KAAK;AACtC,QAAI,YACH,QAAO,MAAM;AAGd,WAAO;MACL,EAAE;GAIJ;GACA;GACA,CACD,MAAM,GAAG,MAAM;AACf,SAAO,EAAE,QAAQ,EAAE;GAClB"} |
| //#region src/files/sanitize-filename.ts | ||
| const INVALID_CHARS_REGEX = /[<>:"/\\|?*\u0000-\u001F\u007F-\u009F]/g; | ||
| const ZERO_WIDTH_CHARS_REGEX = /[\u200B-\u200D\u2060\uFEFF]/g; | ||
| const UNICODE_SPACES_REGEX = /[\u00A0\u2000-\u200A]/g; | ||
| const LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\s.]+|[\s.]+$/g; | ||
| const WINDOWS_RESERVED_NAMES = new Set([ | ||
| "CON", | ||
| "PRN", | ||
| "AUX", | ||
| "NUL", | ||
| "COM1", | ||
| "COM2", | ||
| "COM3", | ||
| "COM4", | ||
| "COM5", | ||
| "COM6", | ||
| "COM7", | ||
| "COM8", | ||
| "COM9", | ||
| "LPT1", | ||
| "LPT2", | ||
| "LPT3", | ||
| "LPT4", | ||
| "LPT5", | ||
| "LPT6", | ||
| "LPT7", | ||
| "LPT8", | ||
| "LPT9" | ||
| ]); | ||
| const DEFAULT_FALLBACK_NAME = "untitled"; | ||
| const MAX_FILENAME_LENGTH = 200; | ||
| /** | ||
| * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems | ||
| * | ||
| * Main features: | ||
| * - Replace invalid characters (e.g. ":" in hello:world) | ||
| * - Handle Windows reserved names | ||
| * - Limit filename length | ||
| * - Normalize Unicode characters | ||
| * | ||
| * @param filename - The filename to sanitize (without extension) | ||
| * @param maxLength - Maximum filename length (default: 200) | ||
| * @returns A sanitized filename (without extension) | ||
| * | ||
| * @example | ||
| * sanitizeFilename('hello:world') // returns 'hello_world' | ||
| * sanitizeFilename('CON') // returns '_CON' | ||
| * sanitizeFilename('') // returns 'untitled' | ||
| */ | ||
| const sanitizeFilename = (filename, maxLength = MAX_FILENAME_LENGTH) => { | ||
| if (!filename) return DEFAULT_FALLBACK_NAME; | ||
| let baseName = filename.trim().replace(INVALID_CHARS_REGEX, "_").replace(ZERO_WIDTH_CHARS_REGEX, "").replace(UNICODE_SPACES_REGEX, " ").replace(LEADING_TRAILING_DOTS_SPACES_REGEX, ""); | ||
| if (!baseName) baseName = DEFAULT_FALLBACK_NAME; | ||
| if (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) baseName = `_${baseName}`; | ||
| if (baseName.length > maxLength) baseName = baseName.slice(0, maxLength); | ||
| return baseName; | ||
| }; | ||
| //#endregion | ||
| Object.defineProperty(exports, 'sanitizeFilename', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return sanitizeFilename; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=sanitize-filename.cjs.map |
| {"version":3,"file":"sanitize-filename.cjs","names":[],"sources":["../src/files/sanitize-filename.ts"],"sourcesContent":["// Constants definition\n/* eslint-disable no-control-regex */\nconst INVALID_CHARS_REGEX = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u007F-\\u009F]/g;\nconst ZERO_WIDTH_CHARS_REGEX = /[\\u200B-\\u200D\\u2060\\uFEFF]/g;\nconst UNICODE_SPACES_REGEX = /[\\u00A0\\u2000-\\u200A]/g;\nconst LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\\s.]+|[\\s.]+$/g;\n/* eslint-enable no-control-regex */\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n\t'CON',\n\t'PRN',\n\t'AUX',\n\t'NUL',\n\t'COM1',\n\t'COM2',\n\t'COM3',\n\t'COM4',\n\t'COM5',\n\t'COM6',\n\t'COM7',\n\t'COM8',\n\t'COM9',\n\t'LPT1',\n\t'LPT2',\n\t'LPT3',\n\t'LPT4',\n\t'LPT5',\n\t'LPT6',\n\t'LPT7',\n\t'LPT8',\n\t'LPT9',\n]);\n\nconst DEFAULT_FALLBACK_NAME = 'untitled';\nconst MAX_FILENAME_LENGTH = 200;\n\n/**\n * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems\n *\n * Main features:\n * - Replace invalid characters (e.g. \":\" in hello:world)\n * - Handle Windows reserved names\n * - Limit filename length\n * - Normalize Unicode characters\n *\n * @param filename - The filename to sanitize (without extension)\n * @param maxLength - Maximum filename length (default: 200)\n * @returns A sanitized filename (without extension)\n *\n * @example\n * sanitizeFilename('hello:world') // returns 'hello_world'\n * sanitizeFilename('CON') // returns '_CON'\n * sanitizeFilename('') // returns 'untitled'\n */\nexport const sanitizeFilename = (\n\tfilename: string,\n\tmaxLength: number = MAX_FILENAME_LENGTH,\n): string => {\n\t// Input validation\n\tif (!filename) {\n\t\treturn DEFAULT_FALLBACK_NAME;\n\t}\n\n\tlet baseName = filename\n\t\t.trim()\n\t\t.replace(INVALID_CHARS_REGEX, '_')\n\t\t.replace(ZERO_WIDTH_CHARS_REGEX, '')\n\t\t.replace(UNICODE_SPACES_REGEX, ' ')\n\t\t.replace(LEADING_TRAILING_DOTS_SPACES_REGEX, '');\n\n\t// Handle empty or invalid filenames after cleaning\n\tif (!baseName) {\n\t\tbaseName = DEFAULT_FALLBACK_NAME;\n\t}\n\n\t// Handle Windows reserved names\n\tif (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) {\n\t\tbaseName = `_${baseName}`;\n\t}\n\n\t// Truncate if too long\n\tif (baseName.length > maxLength) {\n\t\tbaseName = baseName.slice(0, maxLength);\n\t}\n\n\treturn baseName;\n};\n"],"mappings":";;AAEA,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,qCAAqC;AAG3C,MAAM,yBAAyB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,MAAa,oBACZ,UACA,YAAoB,wBACR;AAEZ,KAAI,CAAC,SACJ,QAAO;CAGR,IAAI,WAAW,SACb,MAAM,CACN,QAAQ,qBAAqB,IAAI,CACjC,QAAQ,wBAAwB,GAAG,CACnC,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oCAAoC,GAAG;AAGjD,KAAI,CAAC,SACJ,YAAW;AAIZ,KAAI,uBAAuB,IAAI,SAAS,aAAa,CAAC,CACrD,YAAW,IAAI;AAIhB,KAAI,SAAS,SAAS,UACrB,YAAW,SAAS,MAAM,GAAG,UAAU;AAGxC,QAAO"} |
| //#region src/files/sanitize-filename.d.ts | ||
| declare const sanitizeFilename: (filename: string, maxLength?: number) => string; | ||
| //#endregion | ||
| export { sanitizeFilename as t }; | ||
| //# sourceMappingURL=sanitize-filename.d.cts.map |
| //#region src/files/sanitize-filename.d.ts | ||
| declare const sanitizeFilename: (filename: string, maxLength?: number) => string; | ||
| //#endregion | ||
| export { sanitizeFilename as t }; | ||
| //# sourceMappingURL=sanitize-filename.d.mts.map |
| //#region src/files/sanitize-filename.ts | ||
| const INVALID_CHARS_REGEX = /[<>:"/\\|?*\u0000-\u001F\u007F-\u009F]/g; | ||
| const ZERO_WIDTH_CHARS_REGEX = /[\u200B-\u200D\u2060\uFEFF]/g; | ||
| const UNICODE_SPACES_REGEX = /[\u00A0\u2000-\u200A]/g; | ||
| const LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\s.]+|[\s.]+$/g; | ||
| const WINDOWS_RESERVED_NAMES = new Set([ | ||
| "CON", | ||
| "PRN", | ||
| "AUX", | ||
| "NUL", | ||
| "COM1", | ||
| "COM2", | ||
| "COM3", | ||
| "COM4", | ||
| "COM5", | ||
| "COM6", | ||
| "COM7", | ||
| "COM8", | ||
| "COM9", | ||
| "LPT1", | ||
| "LPT2", | ||
| "LPT3", | ||
| "LPT4", | ||
| "LPT5", | ||
| "LPT6", | ||
| "LPT7", | ||
| "LPT8", | ||
| "LPT9" | ||
| ]); | ||
| const DEFAULT_FALLBACK_NAME = "untitled"; | ||
| const MAX_FILENAME_LENGTH = 200; | ||
| /** | ||
| * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems | ||
| * | ||
| * Main features: | ||
| * - Replace invalid characters (e.g. ":" in hello:world) | ||
| * - Handle Windows reserved names | ||
| * - Limit filename length | ||
| * - Normalize Unicode characters | ||
| * | ||
| * @param filename - The filename to sanitize (without extension) | ||
| * @param maxLength - Maximum filename length (default: 200) | ||
| * @returns A sanitized filename (without extension) | ||
| * | ||
| * @example | ||
| * sanitizeFilename('hello:world') // returns 'hello_world' | ||
| * sanitizeFilename('CON') // returns '_CON' | ||
| * sanitizeFilename('') // returns 'untitled' | ||
| */ | ||
| const sanitizeFilename = (filename, maxLength = MAX_FILENAME_LENGTH) => { | ||
| if (!filename) return DEFAULT_FALLBACK_NAME; | ||
| let baseName = filename.trim().replace(INVALID_CHARS_REGEX, "_").replace(ZERO_WIDTH_CHARS_REGEX, "").replace(UNICODE_SPACES_REGEX, " ").replace(LEADING_TRAILING_DOTS_SPACES_REGEX, ""); | ||
| if (!baseName) baseName = DEFAULT_FALLBACK_NAME; | ||
| if (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) baseName = `_${baseName}`; | ||
| if (baseName.length > maxLength) baseName = baseName.slice(0, maxLength); | ||
| return baseName; | ||
| }; | ||
| //#endregion | ||
| export { sanitizeFilename as t }; | ||
| //# sourceMappingURL=sanitize-filename.mjs.map |
| {"version":3,"file":"sanitize-filename.mjs","names":[],"sources":["../src/files/sanitize-filename.ts"],"sourcesContent":["// Constants definition\n/* eslint-disable no-control-regex */\nconst INVALID_CHARS_REGEX = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u007F-\\u009F]/g;\nconst ZERO_WIDTH_CHARS_REGEX = /[\\u200B-\\u200D\\u2060\\uFEFF]/g;\nconst UNICODE_SPACES_REGEX = /[\\u00A0\\u2000-\\u200A]/g;\nconst LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\\s.]+|[\\s.]+$/g;\n/* eslint-enable no-control-regex */\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n\t'CON',\n\t'PRN',\n\t'AUX',\n\t'NUL',\n\t'COM1',\n\t'COM2',\n\t'COM3',\n\t'COM4',\n\t'COM5',\n\t'COM6',\n\t'COM7',\n\t'COM8',\n\t'COM9',\n\t'LPT1',\n\t'LPT2',\n\t'LPT3',\n\t'LPT4',\n\t'LPT5',\n\t'LPT6',\n\t'LPT7',\n\t'LPT8',\n\t'LPT9',\n]);\n\nconst DEFAULT_FALLBACK_NAME = 'untitled';\nconst MAX_FILENAME_LENGTH = 200;\n\n/**\n * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems\n *\n * Main features:\n * - Replace invalid characters (e.g. \":\" in hello:world)\n * - Handle Windows reserved names\n * - Limit filename length\n * - Normalize Unicode characters\n *\n * @param filename - The filename to sanitize (without extension)\n * @param maxLength - Maximum filename length (default: 200)\n * @returns A sanitized filename (without extension)\n *\n * @example\n * sanitizeFilename('hello:world') // returns 'hello_world'\n * sanitizeFilename('CON') // returns '_CON'\n * sanitizeFilename('') // returns 'untitled'\n */\nexport const sanitizeFilename = (\n\tfilename: string,\n\tmaxLength: number = MAX_FILENAME_LENGTH,\n): string => {\n\t// Input validation\n\tif (!filename) {\n\t\treturn DEFAULT_FALLBACK_NAME;\n\t}\n\n\tlet baseName = filename\n\t\t.trim()\n\t\t.replace(INVALID_CHARS_REGEX, '_')\n\t\t.replace(ZERO_WIDTH_CHARS_REGEX, '')\n\t\t.replace(UNICODE_SPACES_REGEX, ' ')\n\t\t.replace(LEADING_TRAILING_DOTS_SPACES_REGEX, '');\n\n\t// Handle empty or invalid filenames after cleaning\n\tif (!baseName) {\n\t\tbaseName = DEFAULT_FALLBACK_NAME;\n\t}\n\n\t// Handle Windows reserved names\n\tif (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) {\n\t\tbaseName = `_${baseName}`;\n\t}\n\n\t// Truncate if too long\n\tif (baseName.length > maxLength) {\n\t\tbaseName = baseName.slice(0, maxLength);\n\t}\n\n\treturn baseName;\n};\n"],"mappings":";AAEA,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,qCAAqC;AAG3C,MAAM,yBAAyB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,MAAa,oBACZ,UACA,YAAoB,wBACR;AAEZ,KAAI,CAAC,SACJ,QAAO;CAGR,IAAI,WAAW,SACb,MAAM,CACN,QAAQ,qBAAqB,IAAI,CACjC,QAAQ,wBAAwB,GAAG,CACnC,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oCAAoC,GAAG;AAGjD,KAAI,CAAC,SACJ,YAAW;AAIZ,KAAI,uBAAuB,IAAI,SAAS,aAAa,CAAC,CACrD,YAAW,IAAI;AAIhB,KAAI,SAAS,SAAS,UACrB,YAAW,SAAS,MAAM,GAAG,UAAU;AAGxC,QAAO"} |
| const require_re_rank_search_results = require('../re-rank-search-results.cjs'); | ||
| exports.reRankSearchResults = require_re_rank_search_results.reRankSearchResults; |
| import { t as reRankSearchResults } from "../re-rank-search-results.cjs"; | ||
| export { reRankSearchResults }; |
| import { t as reRankSearchResults } from "../re-rank-search-results.mjs"; | ||
| export { reRankSearchResults }; |
| import { t as reRankSearchResults } from "../re-rank-search-results.mjs"; | ||
| export { reRankSearchResults }; |
| const require_sublime_search = require('../sublime-search.cjs'); | ||
| exports.DEFAULT_KEYS = require_sublime_search.DEFAULT_KEYS; | ||
| exports.sublimeSearch = require_sublime_search.sublimeSearch; |
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "../sublime-search.cjs"; | ||
| export { DEFAULT_KEYS, sublimeSearch }; |
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "../sublime-search.mjs"; | ||
| export { DEFAULT_KEYS, sublimeSearch }; |
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "../sublime-search.mjs"; | ||
| export { DEFAULT_KEYS, sublimeSearch }; |
| //#region src/number/smart-decimal.ts | ||
| const smartDecimal = (value, decimals = 2) => { | ||
| if (Number.isInteger(value)) return value; | ||
| if (value.toString().split(".")[1].length <= decimals) return value; | ||
| return Number(value.toFixed(decimals)); | ||
| }; | ||
| //#endregion | ||
| Object.defineProperty(exports, 'smartDecimal', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return smartDecimal; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=smart-decimal.cjs.map |
| {"version":3,"file":"smart-decimal.cjs","names":[],"sources":["../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";;AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;AAEpE,KAAI,OAAO,UAAU,MAAM,CAC1B,QAAO;AAIR,KAAI,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,SAC5C,QAAO;AAGR,QAAO,OAAO,MAAM,QAAQ,SAAS,CAAC"} |
| //#region src/number/smart-decimal.d.ts | ||
| declare const smartDecimal: (value: number, decimals?: number) => number; | ||
| //#endregion | ||
| export { smartDecimal as t }; | ||
| //# sourceMappingURL=smart-decimal.d.cts.map |
| //#region src/number/smart-decimal.d.ts | ||
| declare const smartDecimal: (value: number, decimals?: number) => number; | ||
| //#endregion | ||
| export { smartDecimal as t }; | ||
| //# sourceMappingURL=smart-decimal.d.mts.map |
| //#region src/number/smart-decimal.ts | ||
| const smartDecimal = (value, decimals = 2) => { | ||
| if (Number.isInteger(value)) return value; | ||
| if (value.toString().split(".")[1].length <= decimals) return value; | ||
| return Number(value.toFixed(decimals)); | ||
| }; | ||
| //#endregion | ||
| export { smartDecimal as t }; | ||
| //# sourceMappingURL=smart-decimal.mjs.map |
| {"version":3,"file":"smart-decimal.mjs","names":[],"sources":["../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;AAEpE,KAAI,OAAO,UAAU,MAAM,CAC1B,QAAO;AAIR,KAAI,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,SAC5C,QAAO;AAGR,QAAO,OAAO,MAAM,QAAQ,SAAS,CAAC"} |
| //#region src/sort/sort-by-property.ts | ||
| const sortByProperty = (property, arr, order = "asc") => arr.sort((a, b) => { | ||
| const result = String(a[property]).localeCompare(String(b[property]), void 0, { | ||
| numeric: true, | ||
| sensitivity: "base" | ||
| }); | ||
| return order === "asc" ? result : -result; | ||
| }); | ||
| //#endregion | ||
| Object.defineProperty(exports, 'sortByProperty', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return sortByProperty; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=sort-by-property.cjs.map |
| {"version":3,"file":"sort-by-property.cjs","names":[],"sources":["../src/sort/sort-by-property.ts"],"sourcesContent":["export const sortByProperty = <T>(\n\tproperty: keyof T,\n\tarr: T[],\n\torder: 'asc' | 'desc' = 'asc',\n): T[] =>\n\tarr.sort((a, b) => {\n\t\tconst result = String(a[property]).localeCompare(String(b[property]), undefined, {\n\t\t\tnumeric: true,\n\t\t\tsensitivity: 'base',\n\t\t});\n\t\treturn order === 'asc' ? result : -result;\n\t});\n"],"mappings":";;AAAA,MAAa,kBACZ,UACA,KACA,QAAwB,UAExB,IAAI,MAAM,GAAG,MAAM;CAClB,MAAM,SAAS,OAAO,EAAE,UAAU,CAAC,cAAc,OAAO,EAAE,UAAU,EAAE,QAAW;EAChF,SAAS;EACT,aAAa;EACb,CAAC;AACF,QAAO,UAAU,QAAQ,SAAS,CAAC;EAClC"} |
| //#region src/sort/sort-by-property.d.ts | ||
| declare const sortByProperty: <T>(property: keyof T, arr: T[], order?: "asc" | "desc") => T[]; | ||
| //#endregion | ||
| export { sortByProperty as t }; | ||
| //# sourceMappingURL=sort-by-property.d.cts.map |
| //#region src/sort/sort-by-property.d.ts | ||
| declare const sortByProperty: <T>(property: keyof T, arr: T[], order?: "asc" | "desc") => T[]; | ||
| //#endregion | ||
| export { sortByProperty as t }; | ||
| //# sourceMappingURL=sort-by-property.d.mts.map |
| //#region src/sort/sort-by-property.ts | ||
| const sortByProperty = (property, arr, order = "asc") => arr.sort((a, b) => { | ||
| const result = String(a[property]).localeCompare(String(b[property]), void 0, { | ||
| numeric: true, | ||
| sensitivity: "base" | ||
| }); | ||
| return order === "asc" ? result : -result; | ||
| }); | ||
| //#endregion | ||
| export { sortByProperty as t }; | ||
| //# sourceMappingURL=sort-by-property.mjs.map |
| {"version":3,"file":"sort-by-property.mjs","names":[],"sources":["../src/sort/sort-by-property.ts"],"sourcesContent":["export const sortByProperty = <T>(\n\tproperty: keyof T,\n\tarr: T[],\n\torder: 'asc' | 'desc' = 'asc',\n): T[] =>\n\tarr.sort((a, b) => {\n\t\tconst result = String(a[property]).localeCompare(String(b[property]), undefined, {\n\t\t\tnumeric: true,\n\t\t\tsensitivity: 'base',\n\t\t});\n\t\treturn order === 'asc' ? result : -result;\n\t});\n"],"mappings":";AAAA,MAAa,kBACZ,UACA,KACA,QAAwB,UAExB,IAAI,MAAM,GAAG,MAAM;CAClB,MAAM,SAAS,OAAO,EAAE,UAAU,CAAC,cAAc,OAAO,EAAE,UAAU,EAAE,QAAW;EAChF,SAAS;EACT,aAAa;EACb,CAAC;AACF,QAAO,UAAU,QAAQ,SAAS,CAAC;EAClC"} |
| const require_sort_by_property = require('../sort-by-property.cjs'); | ||
| exports.sortByProperty = require_sort_by_property.sortByProperty; |
| import { t as sortByProperty } from "../sort-by-property.cjs"; | ||
| export { sortByProperty }; |
| import { t as sortByProperty } from "../sort-by-property.mjs"; | ||
| export { sortByProperty }; |
| import { t as sortByProperty } from "../sort-by-property.mjs"; | ||
| export { sortByProperty }; |
| //#region src/search/sublime-search.ts | ||
| const SEQUENTIAL_BONUS = 60; | ||
| const SEPARATOR_BONUS = 38; | ||
| const CAMEL_BONUS = 30; | ||
| const FIRST_LETTER_BONUS = 15; | ||
| const LEADING_LETTER_PENALTY = -20; | ||
| const MAX_LEADING_LETTER_PENALTY = -200; | ||
| const UNMATCHED_LETTER_PENALTY = -2.5; | ||
| const DEFAULT_KEYS = [{ | ||
| key: "properties.displayName", | ||
| weight: 1.3 | ||
| }, { | ||
| key: "properties.codex.alias", | ||
| weight: 1 | ||
| }]; | ||
| /** | ||
| * Returns true if each character in pattern is found sequentially within target | ||
| * @param {*} pattern string | ||
| * @param {*} target string | ||
| */ | ||
| function fuzzyMatchSimple(pattern, target) { | ||
| let patternIdx = 0; | ||
| let strIdx = 0; | ||
| while (patternIdx < pattern.length && strIdx < target.length) { | ||
| if (pattern.charAt(patternIdx).toLowerCase() === target.charAt(strIdx).toLowerCase()) patternIdx++; | ||
| ++strIdx; | ||
| } | ||
| return pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length; | ||
| } | ||
| function fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex, targetMatches, matches, maxMatches, nextMatch, recursionCount, recursionLimit) { | ||
| let outScore = 0; | ||
| if (++recursionCount >= recursionLimit) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (patternCurIndex === pattern.length || targetCurrIndex === target.length) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| let recursiveMatch = false; | ||
| let bestRecursiveMatches = []; | ||
| let bestRecursiveScore = 0; | ||
| let firstMatch = true; | ||
| while (patternCurIndex < pattern.length && targetCurrIndex < target.length) { | ||
| if (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) { | ||
| if (nextMatch >= maxMatches) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (firstMatch && targetMatches) { | ||
| matches = [...targetMatches]; | ||
| firstMatch = false; | ||
| } | ||
| const recursiveMatches = []; | ||
| const recursiveResult = fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex + 1, matches, recursiveMatches, maxMatches, nextMatch, recursionCount, recursionLimit); | ||
| const recursiveScore = recursiveResult.outScore; | ||
| if (recursiveResult.matched) { | ||
| if (!recursiveMatch || recursiveScore > bestRecursiveScore) { | ||
| bestRecursiveMatches = [...recursiveMatches]; | ||
| bestRecursiveScore = recursiveScore; | ||
| } | ||
| recursiveMatch = true; | ||
| } | ||
| matches[nextMatch++] = targetCurrIndex; | ||
| ++patternCurIndex; | ||
| } | ||
| ++targetCurrIndex; | ||
| } | ||
| const matched = patternCurIndex === pattern.length; | ||
| if (matched) { | ||
| outScore = 100; | ||
| if (!target.toLowerCase().startsWith("n8n")) { | ||
| let penalty = LEADING_LETTER_PENALTY * matches[0]; | ||
| penalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty; | ||
| outScore += penalty; | ||
| } | ||
| const unmatched = target.length - nextMatch; | ||
| outScore += UNMATCHED_LETTER_PENALTY * unmatched; | ||
| for (let i = 0; i < nextMatch; i++) { | ||
| const currIdx = matches[i]; | ||
| if (i > 0) { | ||
| if (currIdx === matches[i - 1] + 1) outScore += SEQUENTIAL_BONUS; | ||
| } | ||
| if (currIdx > 0) { | ||
| const neighbor = target[currIdx - 1]; | ||
| const curr = target[currIdx]; | ||
| if (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) outScore += CAMEL_BONUS; | ||
| if (neighbor === "_" || neighbor === " ") outScore += SEPARATOR_BONUS; | ||
| } else outScore += FIRST_LETTER_BONUS; | ||
| } | ||
| if (recursiveMatch && (!matched || bestRecursiveScore > outScore)) { | ||
| matches = [...bestRecursiveMatches]; | ||
| outScore = bestRecursiveScore; | ||
| return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| } else if (matched) return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| else return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| /** | ||
| * Does a fuzzy search to find pattern inside a string. | ||
| * @param {*} pattern string pattern to search for | ||
| * @param {*} target string string which is being searched | ||
| * @returns [boolean, number] a boolean which tells if pattern was | ||
| * found or not and a search score | ||
| */ | ||
| function fuzzyMatch(pattern, target) { | ||
| return fuzzyMatchRecursive(pattern, target, 0, 0, null, [], 256, 0, 0, 5); | ||
| } | ||
| function getValue(obj, prop) { | ||
| if (obj.hasOwnProperty(prop)) return obj[prop]; | ||
| const segments = prop.split("."); | ||
| let result = obj; | ||
| let i = 0; | ||
| while (result && i < segments.length) { | ||
| const key = segments[i]; | ||
| result = result[key]; | ||
| i++; | ||
| } | ||
| return result; | ||
| } | ||
| function scoreSearchValue(filter, value, weight) { | ||
| if (!fuzzyMatchSimple(filter, value)) return void 0; | ||
| const match = fuzzyMatch(filter, value); | ||
| if (!match.matched) return void 0; | ||
| return match.outScore * weight; | ||
| } | ||
| function sublimeSearch(filter, data, keys = DEFAULT_KEYS, limit) { | ||
| const results = []; | ||
| for (const item of data) { | ||
| let itemMatchScore; | ||
| for (const { key, weight } of keys) { | ||
| const value = getValue(item, key); | ||
| if (Array.isArray(value)) for (const entry of value) { | ||
| if (typeof entry !== "string") continue; | ||
| const score = scoreSearchValue(filter, entry, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| else if (typeof value === "string") { | ||
| const score = scoreSearchValue(filter, value, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| } | ||
| if (itemMatchScore !== void 0) { | ||
| const result = { | ||
| score: itemMatchScore, | ||
| item | ||
| }; | ||
| if (limit === void 0 || results.length < limit) results.push(result); | ||
| else { | ||
| let lowestIndex = 0; | ||
| let lowestScore = results[0].score; | ||
| for (let i = 1; i < results.length; i++) if (results[i].score < lowestScore) { | ||
| lowestIndex = i; | ||
| lowestScore = results[i].score; | ||
| } | ||
| if (result.score > lowestScore) results[lowestIndex] = result; | ||
| } | ||
| } | ||
| } | ||
| results.sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| return results; | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'DEFAULT_KEYS', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return DEFAULT_KEYS; | ||
| } | ||
| }); | ||
| Object.defineProperty(exports, 'sublimeSearch', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return sublimeSearch; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=sublime-search.cjs.map |
| {"version":3,"file":"sublime-search.cjs","names":["bestRecursiveMatches: number[]","recursiveMatches: number[]","results: Array<{ score: number; item: T }>","itemMatchScore: number | undefined","result: { score: number; item: T }"],"sources":["../src/search/sublime-search.ts"],"sourcesContent":["/*\n * Constants and utility functions used for searching for node types in node creator component\n * based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n */\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 38; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -2.5;\n\nexport const DEFAULT_KEYS = [\n\t{ key: 'properties.displayName', weight: 1.3 },\n\t{ key: 'properties.codex.alias', weight: 1 },\n];\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty (if not n8n-prefixed)\n\t\tif (!target.toLowerCase().startsWith('n8n')) {\n\t\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\t\toutScore += penalty;\n\t\t}\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nfunction scoreSearchValue(filter: string, value: string, weight: number): number | undefined {\n\tif (!fuzzyMatchSimple(filter, value)) return undefined;\n\n\tconst match = fuzzyMatch(filter, value);\n\tif (!match.matched) return undefined;\n\n\treturn match.outScore * weight;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: readonly T[],\n\tkeys: Array<{ key: string; weight: number }> = DEFAULT_KEYS,\n\tlimit?: number,\n): Array<{ score: number; item: T }> {\n\tconst results: Array<{ score: number; item: T }> = [];\n\n\tfor (const item of data) {\n\t\tlet itemMatchScore: number | undefined;\n\n\t\tfor (const { key, weight } of keys) {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const entry of value) {\n\t\t\t\t\tif (typeof entry !== 'string') continue;\n\n\t\t\t\t\tconst score = scoreSearchValue(filter, entry, weight);\n\t\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\t\titemMatchScore = score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tconst score = scoreSearchValue(filter, value, weight);\n\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\titemMatchScore = score;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (itemMatchScore !== undefined) {\n\t\t\tconst result: { score: number; item: T } = {\n\t\t\t\tscore: itemMatchScore,\n\t\t\t\titem,\n\t\t\t};\n\n\t\t\tif (limit === undefined || results.length < limit) {\n\t\t\t\tresults.push(result);\n\t\t\t} else {\n\t\t\t\tlet lowestIndex = 0;\n\t\t\t\tlet lowestScore = results[0].score;\n\t\t\t\tfor (let i = 1; i < results.length; i++) {\n\t\t\t\t\tif (results[i].score < lowestScore) {\n\t\t\t\t\t\tlowestIndex = i;\n\t\t\t\t\t\tlowestScore = results[i].score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (result.score > lowestScore) {\n\t\t\t\t\tresults[lowestIndex] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n"],"mappings":"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"} |
| //#region src/search/sublime-search.d.ts | ||
| declare const DEFAULT_KEYS: { | ||
| key: string; | ||
| weight: number; | ||
| }[]; | ||
| declare function sublimeSearch<T extends object>(filter: string, data: readonly T[], keys?: Array<{ | ||
| key: string; | ||
| weight: number; | ||
| }>, limit?: number): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { sublimeSearch as n, DEFAULT_KEYS as t }; | ||
| //# sourceMappingURL=sublime-search.d.cts.map |
| //#region src/search/sublime-search.d.ts | ||
| declare const DEFAULT_KEYS: { | ||
| key: string; | ||
| weight: number; | ||
| }[]; | ||
| declare function sublimeSearch<T extends object>(filter: string, data: readonly T[], keys?: Array<{ | ||
| key: string; | ||
| weight: number; | ||
| }>, limit?: number): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { sublimeSearch as n, DEFAULT_KEYS as t }; | ||
| //# sourceMappingURL=sublime-search.d.mts.map |
| //#region src/search/sublime-search.ts | ||
| const SEQUENTIAL_BONUS = 60; | ||
| const SEPARATOR_BONUS = 38; | ||
| const CAMEL_BONUS = 30; | ||
| const FIRST_LETTER_BONUS = 15; | ||
| const LEADING_LETTER_PENALTY = -20; | ||
| const MAX_LEADING_LETTER_PENALTY = -200; | ||
| const UNMATCHED_LETTER_PENALTY = -2.5; | ||
| const DEFAULT_KEYS = [{ | ||
| key: "properties.displayName", | ||
| weight: 1.3 | ||
| }, { | ||
| key: "properties.codex.alias", | ||
| weight: 1 | ||
| }]; | ||
| /** | ||
| * Returns true if each character in pattern is found sequentially within target | ||
| * @param {*} pattern string | ||
| * @param {*} target string | ||
| */ | ||
| function fuzzyMatchSimple(pattern, target) { | ||
| let patternIdx = 0; | ||
| let strIdx = 0; | ||
| while (patternIdx < pattern.length && strIdx < target.length) { | ||
| if (pattern.charAt(patternIdx).toLowerCase() === target.charAt(strIdx).toLowerCase()) patternIdx++; | ||
| ++strIdx; | ||
| } | ||
| return pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length; | ||
| } | ||
| function fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex, targetMatches, matches, maxMatches, nextMatch, recursionCount, recursionLimit) { | ||
| let outScore = 0; | ||
| if (++recursionCount >= recursionLimit) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (patternCurIndex === pattern.length || targetCurrIndex === target.length) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| let recursiveMatch = false; | ||
| let bestRecursiveMatches = []; | ||
| let bestRecursiveScore = 0; | ||
| let firstMatch = true; | ||
| while (patternCurIndex < pattern.length && targetCurrIndex < target.length) { | ||
| if (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) { | ||
| if (nextMatch >= maxMatches) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (firstMatch && targetMatches) { | ||
| matches = [...targetMatches]; | ||
| firstMatch = false; | ||
| } | ||
| const recursiveMatches = []; | ||
| const recursiveResult = fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex + 1, matches, recursiveMatches, maxMatches, nextMatch, recursionCount, recursionLimit); | ||
| const recursiveScore = recursiveResult.outScore; | ||
| if (recursiveResult.matched) { | ||
| if (!recursiveMatch || recursiveScore > bestRecursiveScore) { | ||
| bestRecursiveMatches = [...recursiveMatches]; | ||
| bestRecursiveScore = recursiveScore; | ||
| } | ||
| recursiveMatch = true; | ||
| } | ||
| matches[nextMatch++] = targetCurrIndex; | ||
| ++patternCurIndex; | ||
| } | ||
| ++targetCurrIndex; | ||
| } | ||
| const matched = patternCurIndex === pattern.length; | ||
| if (matched) { | ||
| outScore = 100; | ||
| if (!target.toLowerCase().startsWith("n8n")) { | ||
| let penalty = LEADING_LETTER_PENALTY * matches[0]; | ||
| penalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty; | ||
| outScore += penalty; | ||
| } | ||
| const unmatched = target.length - nextMatch; | ||
| outScore += UNMATCHED_LETTER_PENALTY * unmatched; | ||
| for (let i = 0; i < nextMatch; i++) { | ||
| const currIdx = matches[i]; | ||
| if (i > 0) { | ||
| if (currIdx === matches[i - 1] + 1) outScore += SEQUENTIAL_BONUS; | ||
| } | ||
| if (currIdx > 0) { | ||
| const neighbor = target[currIdx - 1]; | ||
| const curr = target[currIdx]; | ||
| if (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) outScore += CAMEL_BONUS; | ||
| if (neighbor === "_" || neighbor === " ") outScore += SEPARATOR_BONUS; | ||
| } else outScore += FIRST_LETTER_BONUS; | ||
| } | ||
| if (recursiveMatch && (!matched || bestRecursiveScore > outScore)) { | ||
| matches = [...bestRecursiveMatches]; | ||
| outScore = bestRecursiveScore; | ||
| return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| } else if (matched) return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| else return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| /** | ||
| * Does a fuzzy search to find pattern inside a string. | ||
| * @param {*} pattern string pattern to search for | ||
| * @param {*} target string string which is being searched | ||
| * @returns [boolean, number] a boolean which tells if pattern was | ||
| * found or not and a search score | ||
| */ | ||
| function fuzzyMatch(pattern, target) { | ||
| return fuzzyMatchRecursive(pattern, target, 0, 0, null, [], 256, 0, 0, 5); | ||
| } | ||
| function getValue(obj, prop) { | ||
| if (obj.hasOwnProperty(prop)) return obj[prop]; | ||
| const segments = prop.split("."); | ||
| let result = obj; | ||
| let i = 0; | ||
| while (result && i < segments.length) { | ||
| const key = segments[i]; | ||
| result = result[key]; | ||
| i++; | ||
| } | ||
| return result; | ||
| } | ||
| function scoreSearchValue(filter, value, weight) { | ||
| if (!fuzzyMatchSimple(filter, value)) return void 0; | ||
| const match = fuzzyMatch(filter, value); | ||
| if (!match.matched) return void 0; | ||
| return match.outScore * weight; | ||
| } | ||
| function sublimeSearch(filter, data, keys = DEFAULT_KEYS, limit) { | ||
| const results = []; | ||
| for (const item of data) { | ||
| let itemMatchScore; | ||
| for (const { key, weight } of keys) { | ||
| const value = getValue(item, key); | ||
| if (Array.isArray(value)) for (const entry of value) { | ||
| if (typeof entry !== "string") continue; | ||
| const score = scoreSearchValue(filter, entry, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| else if (typeof value === "string") { | ||
| const score = scoreSearchValue(filter, value, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| } | ||
| if (itemMatchScore !== void 0) { | ||
| const result = { | ||
| score: itemMatchScore, | ||
| item | ||
| }; | ||
| if (limit === void 0 || results.length < limit) results.push(result); | ||
| else { | ||
| let lowestIndex = 0; | ||
| let lowestScore = results[0].score; | ||
| for (let i = 1; i < results.length; i++) if (results[i].score < lowestScore) { | ||
| lowestIndex = i; | ||
| lowestScore = results[i].score; | ||
| } | ||
| if (result.score > lowestScore) results[lowestIndex] = result; | ||
| } | ||
| } | ||
| } | ||
| results.sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| return results; | ||
| } | ||
| //#endregion | ||
| export { sublimeSearch as n, DEFAULT_KEYS as t }; | ||
| //# sourceMappingURL=sublime-search.mjs.map |
| {"version":3,"file":"sublime-search.mjs","names":["bestRecursiveMatches: number[]","recursiveMatches: number[]","results: Array<{ score: number; item: T }>","itemMatchScore: number | undefined","result: { score: number; item: T }"],"sources":["../src/search/sublime-search.ts"],"sourcesContent":["/*\n * Constants and utility functions used for searching for node types in node creator component\n * based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n */\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 38; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -2.5;\n\nexport const DEFAULT_KEYS = [\n\t{ key: 'properties.displayName', weight: 1.3 },\n\t{ key: 'properties.codex.alias', weight: 1 },\n];\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty (if not n8n-prefixed)\n\t\tif (!target.toLowerCase().startsWith('n8n')) {\n\t\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\t\toutScore += penalty;\n\t\t}\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nfunction scoreSearchValue(filter: string, value: string, weight: number): number | undefined {\n\tif (!fuzzyMatchSimple(filter, value)) return undefined;\n\n\tconst match = fuzzyMatch(filter, value);\n\tif (!match.matched) return undefined;\n\n\treturn match.outScore * weight;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: readonly T[],\n\tkeys: Array<{ key: string; weight: number }> = DEFAULT_KEYS,\n\tlimit?: number,\n): Array<{ score: number; item: T }> {\n\tconst results: Array<{ score: number; item: T }> = [];\n\n\tfor (const item of data) {\n\t\tlet itemMatchScore: number | undefined;\n\n\t\tfor (const { key, weight } of keys) {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const entry of value) {\n\t\t\t\t\tif (typeof entry !== 'string') continue;\n\n\t\t\t\t\tconst score = scoreSearchValue(filter, entry, weight);\n\t\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\t\titemMatchScore = score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tconst score = scoreSearchValue(filter, value, weight);\n\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\titemMatchScore = score;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (itemMatchScore !== undefined) {\n\t\t\tconst result: { score: number; item: T } = {\n\t\t\t\tscore: itemMatchScore,\n\t\t\t\titem,\n\t\t\t};\n\n\t\t\tif (limit === undefined || results.length < limit) {\n\t\t\t\tresults.push(result);\n\t\t\t} else {\n\t\t\t\tlet lowestIndex = 0;\n\t\t\t\tlet lowestScore = results[0].score;\n\t\t\t\tfor (let i = 1; i < results.length; i++) {\n\t\t\t\t\tif (results[i].score < lowestScore) {\n\t\t\t\t\t\tlowestIndex = i;\n\t\t\t\t\t\tlowestScore = results[i].score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (result.score > lowestScore) {\n\t\t\t\t\tresults[lowestIndex] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n"],"mappings":";AAKA,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,cAAc;AACpB,MAAM,qBAAqB;AAE3B,MAAM,yBAAyB;AAC/B,MAAM,6BAA6B;AACnC,MAAM,2BAA2B;AAEjC,MAAa,eAAe,CAC3B;CAAE,KAAK;CAA0B,QAAQ;CAAK,EAC9C;CAAE,KAAK;CAA0B,QAAQ;CAAG,CAC5C;;;;;;AAOD,SAAS,iBAAiB,SAAiB,QAAyB;CACnE,IAAI,aAAa;CACjB,IAAI,SAAS;AAEb,QAAO,aAAa,QAAQ,UAAU,SAAS,OAAO,QAAQ;AAG7D,MAFoB,QAAQ,OAAO,WAAW,CAAC,aAAa,KACzC,OAAO,OAAO,OAAO,CAAC,aAAa,CAErD;AAED,IAAE;;AAGH,QAAO,QAAQ,WAAW,KAAK,OAAO,WAAW,KAAK,eAAe,QAAQ;;AAG9E,SAAS,oBACR,SACA,QACA,iBACA,iBACA,eACA,SACA,YACA,WACA,gBACA,gBACyC;CACzC,IAAI,WAAW;AAGf,KAAI,EAAE,kBAAkB,eACvB,QAAO;EAAE,SAAS;EAAO;EAAU;AAIpC,KAAI,oBAAoB,QAAQ,UAAU,oBAAoB,OAAO,OACpE,QAAO;EAAE,SAAS;EAAO;EAAU;CAIpC,IAAI,iBAAiB;CACrB,IAAIA,uBAAiC,EAAE;CACvC,IAAI,qBAAqB;CAGzB,IAAI,aAAa;AACjB,QAAO,kBAAkB,QAAQ,UAAU,kBAAkB,OAAO,QAAQ;AAE3E,MAAI,QAAQ,iBAAiB,aAAa,KAAK,OAAO,iBAAiB,aAAa,EAAE;AACrF,OAAI,aAAa,WAChB,QAAO;IAAE,SAAS;IAAO;IAAU;AAGpC,OAAI,cAAc,eAAe;AAChC,cAAU,CAAC,GAAG,cAAc;AAC5B,iBAAa;;GAGd,MAAMC,mBAA6B,EAAE;GACrC,MAAM,kBAAkB,oBACvB,SACA,QACA,iBACA,kBAAkB,GAClB,SACA,kBACA,YACA,WACA,gBACA,eACA;GAED,MAAM,iBAAiB,gBAAgB;AACvC,OAAI,gBAAgB,SAAS;AAE5B,QAAI,CAAC,kBAAkB,iBAAiB,oBAAoB;AAC3D,4BAAuB,CAAC,GAAG,iBAAiB;AAC5C,0BAAqB;;AAEtB,qBAAiB;;AAGlB,WAAQ,eAAe;AACvB,KAAE;;AAEH,IAAE;;CAGH,MAAM,UAAU,oBAAoB,QAAQ;AAE5C,KAAI,SAAS;AACZ,aAAW;AAGX,MAAI,CAAC,OAAO,aAAa,CAAC,WAAW,MAAM,EAAE;GAC5C,IAAI,UAAU,yBAAyB,QAAQ;AAC/C,aAAU,UAAU,6BAA6B,6BAA6B;AAC9E,eAAY;;EAIb,MAAM,YAAY,OAAO,SAAS;AAClC,cAAY,2BAA2B;AAGvC,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;GACnC,MAAM,UAAU,QAAQ;AAExB,OAAI,IAAI,GAEP;QAAI,YADY,QAAQ,IAAI,KACF,EACzB,aAAY;;AAKd,OAAI,UAAU,GAAG;IAEhB,MAAM,WAAW,OAAO,UAAU;IAClC,MAAM,OAAO,OAAO;AACpB,QAAI,aAAa,SAAS,aAAa,IAAI,SAAS,KAAK,aAAa,CACrE,aAAY;AAGb,QAD6B,aAAa,OAAO,aAAa,IAE7D,aAAY;SAIb,aAAY;;AAKd,MAAI,mBAAmB,CAAC,WAAW,qBAAqB,WAAW;AAElE,aAAU,CAAC,GAAG,qBAAqB;AACnC,cAAW;AACX,UAAO;IAAE,SAAS;IAAM;IAAU;aACxB,QAEV,QAAO;GAAE,SAAS;GAAM;GAAU;MAElC,QAAO;GAAE,SAAS;GAAO;GAAU;;AAGrC,QAAO;EAAE,SAAS;EAAO;EAAU;;;;;;;;;AAUpC,SAAS,WAAW,SAAiB,QAAwD;AAM5F,QAAO,oBACN,SACA,QACA,GACA,GACA,MARyB,EAAE,EACT,KAUlB,GAbsB,GACA,EAetB;;AAMF,SAAS,SAA2B,KAAQ,MAAuB;AAClE,KAAI,IAAI,eAAe,KAAK,CAC3B,QAAO,IAAI;CAGZ,MAAM,WAAW,KAAK,MAAM,IAAI;CAEhC,IAAI,SAAS;CACb,IAAI,IAAI;AACR,QAAO,UAAU,IAAI,SAAS,QAAQ;EACrC,MAAM,MAAM,SAAS;AACrB,WAAS,OAAO;AAChB;;AAED,QAAO;;AAGR,SAAS,iBAAiB,QAAgB,OAAe,QAAoC;AAC5F,KAAI,CAAC,iBAAiB,QAAQ,MAAM,CAAE,QAAO;CAE7C,MAAM,QAAQ,WAAW,QAAQ,MAAM;AACvC,KAAI,CAAC,MAAM,QAAS,QAAO;AAE3B,QAAO,MAAM,WAAW;;AAGzB,SAAgB,cACf,QACA,MACA,OAA+C,cAC/C,OACoC;CACpC,MAAMC,UAA6C,EAAE;AAErD,MAAK,MAAM,QAAQ,MAAM;EACxB,IAAIC;AAEJ,OAAK,MAAM,EAAE,KAAK,YAAY,MAAM;GACnC,MAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,OAAI,MAAM,QAAQ,MAAM,CACvB,MAAK,MAAM,SAAS,OAAO;AAC1B,QAAI,OAAO,UAAU,SAAU;IAE/B,MAAM,QAAQ,iBAAiB,QAAQ,OAAO,OAAO;AACrD,QAAI,UAAU,WAAc,mBAAmB,UAAa,QAAQ,gBACnE,kBAAiB;;YAGT,OAAO,UAAU,UAAU;IACrC,MAAM,QAAQ,iBAAiB,QAAQ,OAAO,OAAO;AACrD,QAAI,UAAU,WAAc,mBAAmB,UAAa,QAAQ,gBACnE,kBAAiB;;;AAKpB,MAAI,mBAAmB,QAAW;GACjC,MAAMC,SAAqC;IAC1C,OAAO;IACP;IACA;AAED,OAAI,UAAU,UAAa,QAAQ,SAAS,MAC3C,SAAQ,KAAK,OAAO;QACd;IACN,IAAI,cAAc;IAClB,IAAI,cAAc,QAAQ,GAAG;AAC7B,SAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IACnC,KAAI,QAAQ,GAAG,QAAQ,aAAa;AACnC,mBAAc;AACd,mBAAc,QAAQ,GAAG;;AAG3B,QAAI,OAAO,QAAQ,YAClB,SAAQ,eAAe;;;;AAM3B,SAAQ,MAAM,GAAG,MAAM;AACtB,SAAO,EAAE,QAAQ,EAAE;GAClB;AAEF,QAAO"} |
+23
-21
| const require_assert = require('./assert2.cjs'); | ||
| const require_create_event_queue = require('./create-event-queue2.cjs'); | ||
| const require_event_bus = require('./event-bus2.cjs'); | ||
| const require_event_queue = require('./event-queue2.cjs'); | ||
| const require_format_pem_block = require('./format-pem-block2.cjs'); | ||
| const require_generate_nano_id = require('./generate-nano-id2.cjs'); | ||
| const require_get_jwt_expiry = require('./get-jwt-expiry2.cjs'); | ||
| const require_retry = require('./retry2.cjs'); | ||
| const require_workflowId = require('./workflowId2.cjs'); | ||
| const require_smartDecimal = require('./smartDecimal.cjs'); | ||
| const require_reRankSearchResults = require('./reRankSearchResults.cjs'); | ||
| const require_sublimeSearch = require('./sublimeSearch.cjs'); | ||
| const require_sortByProperty = require('./sortByProperty.cjs'); | ||
| const require_smart_decimal = require('./smart-decimal.cjs'); | ||
| const require_re_rank_search_results = require('./re-rank-search-results.cjs'); | ||
| const require_sublime_search = require('./sublime-search.cjs'); | ||
| const require_sort_by_property = require('./sort-by-property.cjs'); | ||
| const require_truncate = require('./truncate.cjs'); | ||
| const require_sanitize = require('./sanitize.cjs'); | ||
| const require_path = require('./path.cjs'); | ||
| const require_sanitize_filename = require('./sanitize-filename.cjs'); | ||
| const require_is_windows_file_path = require('./is-windows-file-path.cjs'); | ||
| const require_placeholder = require('./placeholder2.cjs'); | ||
| const require_jwt = require('./jwt2.cjs'); | ||
| const require_scrub_secrets = require('./scrub-secrets2.cjs'); | ||
| const require_validation = require('./validation2.cjs'); | ||
| const require_is_record = require('./is-record2.cjs'); | ||
| exports.DEFAULT_KEYS = require_sublimeSearch.DEFAULT_KEYS; | ||
| exports.DEFAULT_KEYS = require_sublime_search.DEFAULT_KEYS; | ||
| exports.SECRET_KEYS = require_scrub_secrets.SECRET_KEYS; | ||
@@ -23,21 +24,22 @@ exports.SECRET_VALUE_PATTERNS = require_scrub_secrets.SECRET_VALUE_PATTERNS; | ||
| exports.createEventBus = require_event_bus.createEventBus; | ||
| exports.createEventQueue = require_event_queue.createEventQueue; | ||
| exports.createEventQueue = require_create_event_queue.createEventQueue; | ||
| exports.extractPlaceholderLabels = require_placeholder.extractPlaceholderLabels; | ||
| exports.findPlaceholderDetails = require_placeholder.findPlaceholderDetails; | ||
| exports.formatPemBlock = require_format_pem_block.formatPemBlock; | ||
| exports.formatPlaceholderPath = require_placeholder.formatPlaceholderPath; | ||
| exports.generateNanoId = require_workflowId.generateNanoId; | ||
| exports.getJwtExpiry = require_jwt.getJwtExpiry; | ||
| exports.generateNanoId = require_generate_nano_id.generateNanoId; | ||
| exports.getJwtExpiry = require_get_jwt_expiry.getJwtExpiry; | ||
| exports.hasPlaceholderDeep = require_placeholder.hasPlaceholderDeep; | ||
| exports.isPlaceholderString = require_placeholder.isPlaceholderString; | ||
| exports.isPlaceholderValue = require_placeholder.isPlaceholderValue; | ||
| exports.isRecord = require_validation.isRecord; | ||
| exports.isWindowsFilePath = require_path.isWindowsFilePath; | ||
| exports.reRankSearchResults = require_reRankSearchResults.reRankSearchResults; | ||
| exports.isRecord = require_is_record.isRecord; | ||
| exports.isWindowsFilePath = require_is_windows_file_path.isWindowsFilePath; | ||
| exports.reRankSearchResults = require_re_rank_search_results.reRankSearchResults; | ||
| exports.retry = require_retry.retry; | ||
| exports.sanitizeFilename = require_sanitize.sanitizeFilename; | ||
| exports.sanitizeFilename = require_sanitize_filename.sanitizeFilename; | ||
| exports.scrubSecretsInText = require_scrub_secrets.scrubSecretsInText; | ||
| exports.smartDecimal = require_smartDecimal.smartDecimal; | ||
| exports.sortByProperty = require_sortByProperty.sortByProperty; | ||
| exports.sublimeSearch = require_sublimeSearch.sublimeSearch; | ||
| exports.smartDecimal = require_smart_decimal.smartDecimal; | ||
| exports.sortByProperty = require_sort_by_property.sortByProperty; | ||
| exports.sublimeSearch = require_sublime_search.sublimeSearch; | ||
| exports.truncate = require_truncate.truncate; | ||
| exports.truncateBeforeLast = require_truncate.truncateBeforeLast; |
+12
-11
| import { t as assert } from "./assert2.cjs"; | ||
| import { t as createEventQueue } from "./create-event-queue2.cjs"; | ||
| import { n as EventBus, r as createEventBus, t as CallbackFn } from "./event-bus2.cjs"; | ||
| import { t as createEventQueue } from "./event-queue2.cjs"; | ||
| import { t as isWindowsFilePath } from "./path.cjs"; | ||
| import { t as sanitizeFilename } from "./sanitize.cjs"; | ||
| import { t as isWindowsFilePath } from "./is-windows-file-path.cjs"; | ||
| import { t as sanitizeFilename } from "./sanitize-filename.cjs"; | ||
| import { t as formatPemBlock } from "./format-pem-block2.cjs"; | ||
| import { t as generateNanoId } from "./generate-nano-id2.cjs"; | ||
| import { t as getJwtExpiry } from "./get-jwt-expiry2.cjs"; | ||
| import { t as retry } from "./retry2.cjs"; | ||
| import { t as generateNanoId } from "./workflowId2.cjs"; | ||
| import { t as smartDecimal } from "./smartDecimal.cjs"; | ||
| import { t as reRankSearchResults } from "./reRankSearchResults.cjs"; | ||
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "./sublimeSearch.cjs"; | ||
| import { t as sortByProperty } from "./sortByProperty.cjs"; | ||
| import { t as smartDecimal } from "./smart-decimal.cjs"; | ||
| import { t as reRankSearchResults } from "./re-rank-search-results.cjs"; | ||
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "./sublime-search.cjs"; | ||
| import { t as sortByProperty } from "./sort-by-property.cjs"; | ||
| import { n as truncateBeforeLast, t as truncate } from "./truncate.cjs"; | ||
| import { a as hasPlaceholderDeep, i as formatPlaceholderPath, n as extractPlaceholderLabels, o as isPlaceholderString, r as findPlaceholderDetails, s as isPlaceholderValue, t as PlaceholderDetail } from "./placeholder2.cjs"; | ||
| import { t as getJwtExpiry } from "./jwt2.cjs"; | ||
| import { n as SECRET_VALUE_PATTERNS, r as scrubSecretsInText, t as SECRET_KEYS } from "./scrub-secrets2.cjs"; | ||
| import { t as DistributiveOmit } from "./types2.cjs"; | ||
| import { t as isRecord } from "./validation2.cjs"; | ||
| export { CallbackFn, DEFAULT_KEYS, DistributiveOmit, EventBus, PlaceholderDetail, SECRET_KEYS, SECRET_VALUE_PATTERNS, assert, createEventBus, createEventQueue, extractPlaceholderLabels, findPlaceholderDetails, formatPlaceholderPath, generateNanoId, getJwtExpiry, hasPlaceholderDeep, isPlaceholderString, isPlaceholderValue, isRecord, isWindowsFilePath, reRankSearchResults, retry, sanitizeFilename, scrubSecretsInText, smartDecimal, sortByProperty, sublimeSearch, truncate, truncateBeforeLast }; | ||
| import { t as isRecord } from "./is-record2.cjs"; | ||
| export { CallbackFn, DEFAULT_KEYS, DistributiveOmit, EventBus, PlaceholderDetail, SECRET_KEYS, SECRET_VALUE_PATTERNS, assert, createEventBus, createEventQueue, extractPlaceholderLabels, findPlaceholderDetails, formatPemBlock, formatPlaceholderPath, generateNanoId, getJwtExpiry, hasPlaceholderDeep, isPlaceholderString, isPlaceholderValue, isRecord, isWindowsFilePath, reRankSearchResults, retry, sanitizeFilename, scrubSecretsInText, smartDecimal, sortByProperty, sublimeSearch, truncate, truncateBeforeLast }; |
+12
-11
| import { t as assert } from "./assert2.mjs"; | ||
| import { t as createEventQueue } from "./create-event-queue2.mjs"; | ||
| import { n as EventBus, r as createEventBus, t as CallbackFn } from "./event-bus2.mjs"; | ||
| import { t as createEventQueue } from "./event-queue2.mjs"; | ||
| import { t as isWindowsFilePath } from "./path.mjs"; | ||
| import { t as sanitizeFilename } from "./sanitize.mjs"; | ||
| import { t as isWindowsFilePath } from "./is-windows-file-path.mjs"; | ||
| import { t as sanitizeFilename } from "./sanitize-filename.mjs"; | ||
| import { t as formatPemBlock } from "./format-pem-block2.mjs"; | ||
| import { t as generateNanoId } from "./generate-nano-id2.mjs"; | ||
| import { t as getJwtExpiry } from "./get-jwt-expiry2.mjs"; | ||
| import { t as retry } from "./retry2.mjs"; | ||
| import { t as generateNanoId } from "./workflowId2.mjs"; | ||
| import { t as smartDecimal } from "./smartDecimal.mjs"; | ||
| import { t as reRankSearchResults } from "./reRankSearchResults.mjs"; | ||
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "./sublimeSearch.mjs"; | ||
| import { t as sortByProperty } from "./sortByProperty.mjs"; | ||
| import { t as smartDecimal } from "./smart-decimal.mjs"; | ||
| import { t as reRankSearchResults } from "./re-rank-search-results.mjs"; | ||
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "./sublime-search.mjs"; | ||
| import { t as sortByProperty } from "./sort-by-property.mjs"; | ||
| import { n as truncateBeforeLast, t as truncate } from "./truncate.mjs"; | ||
| import { a as hasPlaceholderDeep, i as formatPlaceholderPath, n as extractPlaceholderLabels, o as isPlaceholderString, r as findPlaceholderDetails, s as isPlaceholderValue, t as PlaceholderDetail } from "./placeholder2.mjs"; | ||
| import { t as getJwtExpiry } from "./jwt2.mjs"; | ||
| import { n as SECRET_VALUE_PATTERNS, r as scrubSecretsInText, t as SECRET_KEYS } from "./scrub-secrets2.mjs"; | ||
| import { t as DistributiveOmit } from "./types2.mjs"; | ||
| import { t as isRecord } from "./validation2.mjs"; | ||
| export { CallbackFn, DEFAULT_KEYS, DistributiveOmit, EventBus, PlaceholderDetail, SECRET_KEYS, SECRET_VALUE_PATTERNS, assert, createEventBus, createEventQueue, extractPlaceholderLabels, findPlaceholderDetails, formatPlaceholderPath, generateNanoId, getJwtExpiry, hasPlaceholderDeep, isPlaceholderString, isPlaceholderValue, isRecord, isWindowsFilePath, reRankSearchResults, retry, sanitizeFilename, scrubSecretsInText, smartDecimal, sortByProperty, sublimeSearch, truncate, truncateBeforeLast }; | ||
| import { t as isRecord } from "./is-record2.mjs"; | ||
| export { CallbackFn, DEFAULT_KEYS, DistributiveOmit, EventBus, PlaceholderDetail, SECRET_KEYS, SECRET_VALUE_PATTERNS, assert, createEventBus, createEventQueue, extractPlaceholderLabels, findPlaceholderDetails, formatPemBlock, formatPlaceholderPath, generateNanoId, getJwtExpiry, hasPlaceholderDeep, isPlaceholderString, isPlaceholderValue, isRecord, isWindowsFilePath, reRankSearchResults, retry, sanitizeFilename, scrubSecretsInText, smartDecimal, sortByProperty, sublimeSearch, truncate, truncateBeforeLast }; |
+12
-11
| import { t as assert } from "./assert2.mjs"; | ||
| import { t as createEventQueue } from "./create-event-queue2.mjs"; | ||
| import { t as createEventBus } from "./event-bus2.mjs"; | ||
| import { t as createEventQueue } from "./event-queue2.mjs"; | ||
| import { t as formatPemBlock } from "./format-pem-block2.mjs"; | ||
| import { t as generateNanoId } from "./generate-nano-id2.mjs"; | ||
| import { t as getJwtExpiry } from "./get-jwt-expiry2.mjs"; | ||
| import { t as retry } from "./retry2.mjs"; | ||
| import { t as generateNanoId } from "./workflowId2.mjs"; | ||
| import { t as smartDecimal } from "./smartDecimal.mjs"; | ||
| import { t as reRankSearchResults } from "./reRankSearchResults.mjs"; | ||
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "./sublimeSearch.mjs"; | ||
| import { t as sortByProperty } from "./sortByProperty.mjs"; | ||
| import { t as smartDecimal } from "./smart-decimal.mjs"; | ||
| import { t as reRankSearchResults } from "./re-rank-search-results.mjs"; | ||
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "./sublime-search.mjs"; | ||
| import { t as sortByProperty } from "./sort-by-property.mjs"; | ||
| import { n as truncateBeforeLast, t as truncate } from "./truncate.mjs"; | ||
| import { t as sanitizeFilename } from "./sanitize.mjs"; | ||
| import { t as isWindowsFilePath } from "./path.mjs"; | ||
| import { t as sanitizeFilename } from "./sanitize-filename.mjs"; | ||
| import { t as isWindowsFilePath } from "./is-windows-file-path.mjs"; | ||
| import { a as isPlaceholderString, i as hasPlaceholderDeep, n as findPlaceholderDetails, o as isPlaceholderValue, r as formatPlaceholderPath, t as extractPlaceholderLabels } from "./placeholder2.mjs"; | ||
| import { t as getJwtExpiry } from "./jwt2.mjs"; | ||
| import { n as SECRET_VALUE_PATTERNS, r as scrubSecretsInText, t as SECRET_KEYS } from "./scrub-secrets2.mjs"; | ||
| import { t as isRecord } from "./validation2.mjs"; | ||
| import { t as isRecord } from "./is-record2.mjs"; | ||
| export { DEFAULT_KEYS, SECRET_KEYS, SECRET_VALUE_PATTERNS, assert, createEventBus, createEventQueue, extractPlaceholderLabels, findPlaceholderDetails, formatPlaceholderPath, generateNanoId, getJwtExpiry, hasPlaceholderDeep, isPlaceholderString, isPlaceholderValue, isRecord, isWindowsFilePath, reRankSearchResults, retry, sanitizeFilename, scrubSecretsInText, smartDecimal, sortByProperty, sublimeSearch, truncate, truncateBeforeLast }; | ||
| export { DEFAULT_KEYS, SECRET_KEYS, SECRET_VALUE_PATTERNS, assert, createEventBus, createEventQueue, extractPlaceholderLabels, findPlaceholderDetails, formatPemBlock, formatPlaceholderPath, generateNanoId, getJwtExpiry, hasPlaceholderDeep, isPlaceholderString, isPlaceholderValue, isRecord, isWindowsFilePath, reRankSearchResults, retry, sanitizeFilename, scrubSecretsInText, smartDecimal, sortByProperty, sublimeSearch, truncate, truncateBeforeLast }; |
+8
-8
| { | ||
| "name": "@n8n/utils", | ||
| "type": "module", | ||
| "version": "1.36.0", | ||
| "version": "1.37.0", | ||
| "files": [ | ||
| "dist", | ||
| "LICENSE_EE.md", | ||
| "LICENSE.md" | ||
| "LICENSE.md", | ||
| "LICENSE_EE.md" | ||
| ], | ||
@@ -32,3 +32,3 @@ "main": "./dist/index.cjs", | ||
| "nanoid": "3.3.8", | ||
| "@n8n/constants": "0.28.0" | ||
| "@n8n/constants": "0.29.0" | ||
| }, | ||
@@ -41,6 +41,6 @@ "devDependencies": { | ||
| "vite": "^8.0.2", | ||
| "vitest": "^4.1.1", | ||
| "@n8n/typescript-config": "1.6.0", | ||
| "@n8n/eslint-config": "0.0.1", | ||
| "@n8n/vitest-config": "1.15.0" | ||
| "vitest": "^4.1.9", | ||
| "@n8n/typescript-config": "1.7.0", | ||
| "@n8n/vitest-config": "1.16.0", | ||
| "@n8n/eslint-config": "0.0.1" | ||
| }, | ||
@@ -47,0 +47,0 @@ "license": "SEE LICENSE IN LICENSE.md", |
| const require_event_queue = require('./event-queue2.cjs'); | ||
| exports.createEventQueue = require_event_queue.createEventQueue; |
| import { t as createEventQueue } from "./event-queue2.cjs"; | ||
| export { createEventQueue }; |
| import { t as createEventQueue } from "./event-queue2.mjs"; | ||
| export { createEventQueue }; |
| import { t as createEventQueue } from "./event-queue2.mjs"; | ||
| export { createEventQueue }; |
| //#region src/event-queue.ts | ||
| /** | ||
| * Create an event queue that processes events sequentially. | ||
| * | ||
| * @param processEvent - Async function that processes a single event. | ||
| * @returns A function that enqueues events for processing. | ||
| */ | ||
| function createEventQueue(processEvent) { | ||
| const queue = []; | ||
| let processing = false; | ||
| /** | ||
| * Process the next event in the queue (if not already processing). | ||
| */ | ||
| async function processNext() { | ||
| if (processing || queue.length === 0) return; | ||
| processing = true; | ||
| const currentEvent = queue.shift(); | ||
| if (currentEvent !== void 0) try { | ||
| await processEvent(currentEvent); | ||
| } catch (error) { | ||
| console.error("Error processing event:", error); | ||
| } | ||
| processing = false; | ||
| await processNext(); | ||
| } | ||
| /** | ||
| * Enqueue an event and trigger processing. | ||
| * | ||
| * @param event - The event to enqueue. | ||
| */ | ||
| function enqueue(event) { | ||
| queue.push(event); | ||
| processNext(); | ||
| } | ||
| return { enqueue }; | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'createEventQueue', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return createEventQueue; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=event-queue2.cjs.map |
| {"version":3,"file":"event-queue2.cjs","names":["queue: T[]"],"sources":["../src/event-queue.ts"],"sourcesContent":["/**\n * Create an event queue that processes events sequentially.\n *\n * @param processEvent - Async function that processes a single event.\n * @returns A function that enqueues events for processing.\n */\nexport function createEventQueue<T>(processEvent: (event: T) => Promise<void>) {\n\t// The internal queue holding events.\n\tconst queue: T[] = [];\n\n\t// Flag to indicate whether an event is currently being processed.\n\tlet processing = false;\n\n\t/**\n\t * Process the next event in the queue (if not already processing).\n\t */\n\tasync function processNext(): Promise<void> {\n\t\tif (processing || queue.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tprocessing = true;\n\t\tconst currentEvent = queue.shift();\n\n\t\tif (currentEvent !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait processEvent(currentEvent);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error processing event:', error);\n\t\t\t}\n\t\t}\n\n\t\tprocessing = false;\n\n\t\t// Recursively process the next event.\n\t\tawait processNext();\n\t}\n\n\t/**\n\t * Enqueue an event and trigger processing.\n\t *\n\t * @param event - The event to enqueue.\n\t */\n\tfunction enqueue(event: T): void {\n\t\tqueue.push(event);\n\t\tvoid processNext();\n\t}\n\n\treturn { enqueue };\n}\n"],"mappings":";;;;;;;;AAMA,SAAgB,iBAAoB,cAA2C;CAE9E,MAAMA,QAAa,EAAE;CAGrB,IAAI,aAAa;;;;CAKjB,eAAe,cAA6B;AAC3C,MAAI,cAAc,MAAM,WAAW,EAClC;AAGD,eAAa;EACb,MAAM,eAAe,MAAM,OAAO;AAElC,MAAI,iBAAiB,OACpB,KAAI;AACH,SAAM,aAAa,aAAa;WACxB,OAAO;AACf,WAAQ,MAAM,2BAA2B,MAAM;;AAIjD,eAAa;AAGb,QAAM,aAAa;;;;;;;CAQpB,SAAS,QAAQ,OAAgB;AAChC,QAAM,KAAK,MAAM;AACjB,EAAK,aAAa;;AAGnB,QAAO,EAAE,SAAS"} |
| //#region src/event-queue.d.ts | ||
| declare function createEventQueue<T>(processEvent: (event: T) => Promise<void>): { | ||
| enqueue: (event: T) => void; | ||
| }; | ||
| //#endregion | ||
| export { createEventQueue as t }; | ||
| //# sourceMappingURL=event-queue2.d.cts.map |
| //#region src/event-queue.d.ts | ||
| declare function createEventQueue<T>(processEvent: (event: T) => Promise<void>): { | ||
| enqueue: (event: T) => void; | ||
| }; | ||
| //#endregion | ||
| export { createEventQueue as t }; | ||
| //# sourceMappingURL=event-queue2.d.mts.map |
| //#region src/event-queue.ts | ||
| /** | ||
| * Create an event queue that processes events sequentially. | ||
| * | ||
| * @param processEvent - Async function that processes a single event. | ||
| * @returns A function that enqueues events for processing. | ||
| */ | ||
| function createEventQueue(processEvent) { | ||
| const queue = []; | ||
| let processing = false; | ||
| /** | ||
| * Process the next event in the queue (if not already processing). | ||
| */ | ||
| async function processNext() { | ||
| if (processing || queue.length === 0) return; | ||
| processing = true; | ||
| const currentEvent = queue.shift(); | ||
| if (currentEvent !== void 0) try { | ||
| await processEvent(currentEvent); | ||
| } catch (error) { | ||
| console.error("Error processing event:", error); | ||
| } | ||
| processing = false; | ||
| await processNext(); | ||
| } | ||
| /** | ||
| * Enqueue an event and trigger processing. | ||
| * | ||
| * @param event - The event to enqueue. | ||
| */ | ||
| function enqueue(event) { | ||
| queue.push(event); | ||
| processNext(); | ||
| } | ||
| return { enqueue }; | ||
| } | ||
| //#endregion | ||
| export { createEventQueue as t }; | ||
| //# sourceMappingURL=event-queue2.mjs.map |
| {"version":3,"file":"event-queue2.mjs","names":["queue: T[]"],"sources":["../src/event-queue.ts"],"sourcesContent":["/**\n * Create an event queue that processes events sequentially.\n *\n * @param processEvent - Async function that processes a single event.\n * @returns A function that enqueues events for processing.\n */\nexport function createEventQueue<T>(processEvent: (event: T) => Promise<void>) {\n\t// The internal queue holding events.\n\tconst queue: T[] = [];\n\n\t// Flag to indicate whether an event is currently being processed.\n\tlet processing = false;\n\n\t/**\n\t * Process the next event in the queue (if not already processing).\n\t */\n\tasync function processNext(): Promise<void> {\n\t\tif (processing || queue.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tprocessing = true;\n\t\tconst currentEvent = queue.shift();\n\n\t\tif (currentEvent !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait processEvent(currentEvent);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error processing event:', error);\n\t\t\t}\n\t\t}\n\n\t\tprocessing = false;\n\n\t\t// Recursively process the next event.\n\t\tawait processNext();\n\t}\n\n\t/**\n\t * Enqueue an event and trigger processing.\n\t *\n\t * @param event - The event to enqueue.\n\t */\n\tfunction enqueue(event: T): void {\n\t\tqueue.push(event);\n\t\tvoid processNext();\n\t}\n\n\treturn { enqueue };\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,iBAAoB,cAA2C;CAE9E,MAAMA,QAAa,EAAE;CAGrB,IAAI,aAAa;;;;CAKjB,eAAe,cAA6B;AAC3C,MAAI,cAAc,MAAM,WAAW,EAClC;AAGD,eAAa;EACb,MAAM,eAAe,MAAM,OAAO;AAElC,MAAI,iBAAiB,OACpB,KAAI;AACH,SAAM,aAAa,aAAa;WACxB,OAAO;AACf,WAAQ,MAAM,2BAA2B,MAAM;;AAIjD,eAAa;AAGb,QAAM,aAAa;;;;;;;CAQpB,SAAS,QAAQ,OAAgB;AAChC,QAAM,KAAK,MAAM;AACjB,EAAK,aAAa;;AAGnB,QAAO,EAAE,SAAS"} |
| const require_path = require('../path.cjs'); | ||
| exports.isWindowsFilePath = require_path.isWindowsFilePath; |
| import { t as isWindowsFilePath } from "../path.cjs"; | ||
| export { isWindowsFilePath }; |
| import { t as isWindowsFilePath } from "../path.mjs"; | ||
| export { isWindowsFilePath }; |
| import { t as isWindowsFilePath } from "../path.mjs"; | ||
| export { isWindowsFilePath }; |
| const require_sanitize = require('../sanitize.cjs'); | ||
| exports.sanitizeFilename = require_sanitize.sanitizeFilename; |
| import { t as sanitizeFilename } from "../sanitize.cjs"; | ||
| export { sanitizeFilename }; |
| import { t as sanitizeFilename } from "../sanitize.mjs"; | ||
| export { sanitizeFilename }; |
| import { t as sanitizeFilename } from "../sanitize.mjs"; | ||
| export { sanitizeFilename }; |
| const require_jwt = require('./jwt2.cjs'); | ||
| exports.getJwtExpiry = require_jwt.getJwtExpiry; |
| import { t as getJwtExpiry } from "./jwt2.cjs"; | ||
| export { getJwtExpiry }; |
| import { t as getJwtExpiry } from "./jwt2.mjs"; | ||
| export { getJwtExpiry }; |
| import { t as getJwtExpiry } from "./jwt2.mjs"; | ||
| export { getJwtExpiry }; |
| //#region src/jwt.ts | ||
| /** | ||
| * Decode the payload of a JWT without verifying the signature. | ||
| * Returns the `exp` claim (seconds since epoch) or undefined. | ||
| * | ||
| * Use only for trusted tokens (e.g. ones we just received from our own proxy) | ||
| * where the goal is scheduling refresh, not authenticating the issuer. | ||
| */ | ||
| function getJwtExpiry(jwt) { | ||
| const parts = jwt.split("."); | ||
| if (parts.length !== 3) return void 0; | ||
| try { | ||
| const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString()); | ||
| return typeof payload.exp === "number" ? payload.exp : void 0; | ||
| } catch { | ||
| return; | ||
| } | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'getJwtExpiry', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return getJwtExpiry; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=jwt2.cjs.map |
| {"version":3,"file":"jwt2.cjs","names":[],"sources":["../src/jwt.ts"],"sourcesContent":["/**\n * Decode the payload of a JWT without verifying the signature.\n * Returns the `exp` claim (seconds since epoch) or undefined.\n *\n * Use only for trusted tokens (e.g. ones we just received from our own proxy)\n * where the goal is scheduling refresh, not authenticating the issuer.\n */\nexport function getJwtExpiry(jwt: string): number | undefined {\n\tconst parts = jwt.split('.');\n\tif (parts.length !== 3) return undefined;\n\ttry {\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString()) as {\n\t\t\texp?: number;\n\t\t};\n\t\treturn typeof payload.exp === 'number' ? payload.exp : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"],"mappings":";;;;;;;;;AAOA,SAAgB,aAAa,KAAiC;CAC7D,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,KAAI;EACH,MAAM,UAAU,KAAK,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC;AAGzE,SAAO,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;SAChD;AACP"} |
| //#region src/jwt.d.ts | ||
| declare function getJwtExpiry(jwt: string): number | undefined; | ||
| //#endregion | ||
| export { getJwtExpiry as t }; | ||
| //# sourceMappingURL=jwt2.d.cts.map |
| //#region src/jwt.d.ts | ||
| declare function getJwtExpiry(jwt: string): number | undefined; | ||
| //#endregion | ||
| export { getJwtExpiry as t }; | ||
| //# sourceMappingURL=jwt2.d.mts.map |
| //#region src/jwt.ts | ||
| /** | ||
| * Decode the payload of a JWT without verifying the signature. | ||
| * Returns the `exp` claim (seconds since epoch) or undefined. | ||
| * | ||
| * Use only for trusted tokens (e.g. ones we just received from our own proxy) | ||
| * where the goal is scheduling refresh, not authenticating the issuer. | ||
| */ | ||
| function getJwtExpiry(jwt) { | ||
| const parts = jwt.split("."); | ||
| if (parts.length !== 3) return void 0; | ||
| try { | ||
| const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString()); | ||
| return typeof payload.exp === "number" ? payload.exp : void 0; | ||
| } catch { | ||
| return; | ||
| } | ||
| } | ||
| //#endregion | ||
| export { getJwtExpiry as t }; | ||
| //# sourceMappingURL=jwt2.mjs.map |
| {"version":3,"file":"jwt2.mjs","names":[],"sources":["../src/jwt.ts"],"sourcesContent":["/**\n * Decode the payload of a JWT without verifying the signature.\n * Returns the `exp` claim (seconds since epoch) or undefined.\n *\n * Use only for trusted tokens (e.g. ones we just received from our own proxy)\n * where the goal is scheduling refresh, not authenticating the issuer.\n */\nexport function getJwtExpiry(jwt: string): number | undefined {\n\tconst parts = jwt.split('.');\n\tif (parts.length !== 3) return undefined;\n\ttry {\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString()) as {\n\t\t\texp?: number;\n\t\t};\n\t\treturn typeof payload.exp === 'number' ? payload.exp : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,aAAa,KAAiC;CAC7D,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,KAAI;EACH,MAAM,UAAU,KAAK,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC;AAGzE,SAAO,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;SAChD;AACP"} |
| const require_smartDecimal = require('../smartDecimal.cjs'); | ||
| exports.smartDecimal = require_smartDecimal.smartDecimal; |
| import { t as smartDecimal } from "../smartDecimal.cjs"; | ||
| export { smartDecimal }; |
| import { t as smartDecimal } from "../smartDecimal.mjs"; | ||
| export { smartDecimal }; |
| import { t as smartDecimal } from "../smartDecimal.mjs"; | ||
| export { smartDecimal }; |
| //#region src/files/path.ts | ||
| /** | ||
| * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\' | ||
| */ | ||
| function isWindowsFilePath(str) { | ||
| return /^[a-zA-Z]:[\\/]/.test(str); | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'isWindowsFilePath', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return isWindowsFilePath; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=path.cjs.map |
| {"version":3,"file":"path.cjs","names":[],"sources":["../src/files/path.ts"],"sourcesContent":["/**\n * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\\\'\n */\nexport function isWindowsFilePath(str: string) {\n\treturn /^[a-zA-Z]:[\\\\/]/.test(str);\n}\n"],"mappings":";;;;;AAGA,SAAgB,kBAAkB,KAAa;AAC9C,QAAO,kBAAkB,KAAK,IAAI"} |
| //#region src/files/path.d.ts | ||
| declare function isWindowsFilePath(str: string): boolean; | ||
| //#endregion | ||
| export { isWindowsFilePath as t }; | ||
| //# sourceMappingURL=path.d.cts.map |
| //#region src/files/path.d.ts | ||
| declare function isWindowsFilePath(str: string): boolean; | ||
| //#endregion | ||
| export { isWindowsFilePath as t }; | ||
| //# sourceMappingURL=path.d.mts.map |
| //#region src/files/path.ts | ||
| /** | ||
| * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\' | ||
| */ | ||
| function isWindowsFilePath(str) { | ||
| return /^[a-zA-Z]:[\\/]/.test(str); | ||
| } | ||
| //#endregion | ||
| export { isWindowsFilePath as t }; | ||
| //# sourceMappingURL=path.mjs.map |
| {"version":3,"file":"path.mjs","names":[],"sources":["../src/files/path.ts"],"sourcesContent":["/**\n * Fast check if file path starts with a windows drive letter, e.g. 'C:/' or 'C:\\\\'\n */\nexport function isWindowsFilePath(str: string) {\n\treturn /^[a-zA-Z]:[\\\\/]/.test(str);\n}\n"],"mappings":";;;;AAGA,SAAgB,kBAAkB,KAAa;AAC9C,QAAO,kBAAkB,KAAK,IAAI"} |
| //#region src/search/reRankSearchResults.ts | ||
| function reRankSearchResults(searchResults, additionalFactors) { | ||
| return searchResults.map(({ score, item }) => { | ||
| return { | ||
| score: score + Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => { | ||
| const factorScore = factorScores[item.key]; | ||
| if (factorScore) return acc + factorScore; | ||
| return acc; | ||
| }, 0), | ||
| item | ||
| }; | ||
| }).sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'reRankSearchResults', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return reRankSearchResults; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=reRankSearchResults.cjs.map |
| {"version":3,"file":"reRankSearchResults.cjs","names":[],"sources":["../src/search/reRankSearchResults.ts"],"sourcesContent":["export function reRankSearchResults<T extends { key: string }>(\n\tsearchResults: Array<{ score: number; item: T }>,\n\tadditionalFactors: Record<string, Record<string, number>>,\n): Array<{ score: number; item: T }> {\n\treturn searchResults\n\t\t.map(({ score, item }) => {\n\t\t\t// For each additional factor, we check if it exists for the item and type,\n\t\t\t// and if so, we add the score to the item's score.\n\t\t\tconst additionalScore = Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => {\n\t\t\t\tconst factorScore = factorScores[item.key];\n\t\t\t\tif (factorScore) {\n\t\t\t\t\treturn acc + factorScore;\n\t\t\t\t}\n\n\t\t\t\treturn acc;\n\t\t\t}, 0);\n\n\t\t\treturn {\n\t\t\t\tscore: score + additionalScore,\n\t\t\t\titem,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\treturn b.score - a.score;\n\t\t});\n}\n"],"mappings":";;AAAA,SAAgB,oBACf,eACA,mBACoC;AACpC,QAAO,cACL,KAAK,EAAE,OAAO,WAAW;AAYzB,SAAO;GACN,OAAO,QAVgB,OAAO,QAAQ,kBAAkB,CAAC,QAAQ,KAAK,CAAC,GAAG,kBAAkB;IAC5F,MAAM,cAAc,aAAa,KAAK;AACtC,QAAI,YACH,QAAO,MAAM;AAGd,WAAO;MACL,EAAE;GAIJ;GACA;GACA,CACD,MAAM,GAAG,MAAM;AACf,SAAO,EAAE,QAAQ,EAAE;GAClB"} |
| //#region src/search/reRankSearchResults.d.ts | ||
| declare function reRankSearchResults<T extends { | ||
| key: string; | ||
| }>(searchResults: Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>, additionalFactors: Record<string, Record<string, number>>): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { reRankSearchResults as t }; | ||
| //# sourceMappingURL=reRankSearchResults.d.cts.map |
| //#region src/search/reRankSearchResults.d.ts | ||
| declare function reRankSearchResults<T extends { | ||
| key: string; | ||
| }>(searchResults: Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>, additionalFactors: Record<string, Record<string, number>>): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { reRankSearchResults as t }; | ||
| //# sourceMappingURL=reRankSearchResults.d.mts.map |
| //#region src/search/reRankSearchResults.ts | ||
| function reRankSearchResults(searchResults, additionalFactors) { | ||
| return searchResults.map(({ score, item }) => { | ||
| return { | ||
| score: score + Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => { | ||
| const factorScore = factorScores[item.key]; | ||
| if (factorScore) return acc + factorScore; | ||
| return acc; | ||
| }, 0), | ||
| item | ||
| }; | ||
| }).sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| } | ||
| //#endregion | ||
| export { reRankSearchResults as t }; | ||
| //# sourceMappingURL=reRankSearchResults.mjs.map |
| {"version":3,"file":"reRankSearchResults.mjs","names":[],"sources":["../src/search/reRankSearchResults.ts"],"sourcesContent":["export function reRankSearchResults<T extends { key: string }>(\n\tsearchResults: Array<{ score: number; item: T }>,\n\tadditionalFactors: Record<string, Record<string, number>>,\n): Array<{ score: number; item: T }> {\n\treturn searchResults\n\t\t.map(({ score, item }) => {\n\t\t\t// For each additional factor, we check if it exists for the item and type,\n\t\t\t// and if so, we add the score to the item's score.\n\t\t\tconst additionalScore = Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => {\n\t\t\t\tconst factorScore = factorScores[item.key];\n\t\t\t\tif (factorScore) {\n\t\t\t\t\treturn acc + factorScore;\n\t\t\t\t}\n\n\t\t\t\treturn acc;\n\t\t\t}, 0);\n\n\t\t\treturn {\n\t\t\t\tscore: score + additionalScore,\n\t\t\t\titem,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\treturn b.score - a.score;\n\t\t});\n}\n"],"mappings":";AAAA,SAAgB,oBACf,eACA,mBACoC;AACpC,QAAO,cACL,KAAK,EAAE,OAAO,WAAW;AAYzB,SAAO;GACN,OAAO,QAVgB,OAAO,QAAQ,kBAAkB,CAAC,QAAQ,KAAK,CAAC,GAAG,kBAAkB;IAC5F,MAAM,cAAc,aAAa,KAAK;AACtC,QAAI,YACH,QAAO,MAAM;AAGd,WAAO;MACL,EAAE;GAIJ;GACA;GACA,CACD,MAAM,GAAG,MAAM;AACf,SAAO,EAAE,QAAQ,EAAE;GAClB"} |
| //#region src/files/sanitize.ts | ||
| const INVALID_CHARS_REGEX = /[<>:"/\\|?*\u0000-\u001F\u007F-\u009F]/g; | ||
| const ZERO_WIDTH_CHARS_REGEX = /[\u200B-\u200D\u2060\uFEFF]/g; | ||
| const UNICODE_SPACES_REGEX = /[\u00A0\u2000-\u200A]/g; | ||
| const LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\s.]+|[\s.]+$/g; | ||
| const WINDOWS_RESERVED_NAMES = new Set([ | ||
| "CON", | ||
| "PRN", | ||
| "AUX", | ||
| "NUL", | ||
| "COM1", | ||
| "COM2", | ||
| "COM3", | ||
| "COM4", | ||
| "COM5", | ||
| "COM6", | ||
| "COM7", | ||
| "COM8", | ||
| "COM9", | ||
| "LPT1", | ||
| "LPT2", | ||
| "LPT3", | ||
| "LPT4", | ||
| "LPT5", | ||
| "LPT6", | ||
| "LPT7", | ||
| "LPT8", | ||
| "LPT9" | ||
| ]); | ||
| const DEFAULT_FALLBACK_NAME = "untitled"; | ||
| const MAX_FILENAME_LENGTH = 200; | ||
| /** | ||
| * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems | ||
| * | ||
| * Main features: | ||
| * - Replace invalid characters (e.g. ":" in hello:world) | ||
| * - Handle Windows reserved names | ||
| * - Limit filename length | ||
| * - Normalize Unicode characters | ||
| * | ||
| * @param filename - The filename to sanitize (without extension) | ||
| * @param maxLength - Maximum filename length (default: 200) | ||
| * @returns A sanitized filename (without extension) | ||
| * | ||
| * @example | ||
| * sanitizeFilename('hello:world') // returns 'hello_world' | ||
| * sanitizeFilename('CON') // returns '_CON' | ||
| * sanitizeFilename('') // returns 'untitled' | ||
| */ | ||
| const sanitizeFilename = (filename, maxLength = MAX_FILENAME_LENGTH) => { | ||
| if (!filename) return DEFAULT_FALLBACK_NAME; | ||
| let baseName = filename.trim().replace(INVALID_CHARS_REGEX, "_").replace(ZERO_WIDTH_CHARS_REGEX, "").replace(UNICODE_SPACES_REGEX, " ").replace(LEADING_TRAILING_DOTS_SPACES_REGEX, ""); | ||
| if (!baseName) baseName = DEFAULT_FALLBACK_NAME; | ||
| if (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) baseName = `_${baseName}`; | ||
| if (baseName.length > maxLength) baseName = baseName.slice(0, maxLength); | ||
| return baseName; | ||
| }; | ||
| //#endregion | ||
| Object.defineProperty(exports, 'sanitizeFilename', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return sanitizeFilename; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=sanitize.cjs.map |
| {"version":3,"file":"sanitize.cjs","names":[],"sources":["../src/files/sanitize.ts"],"sourcesContent":["// Constants definition\n/* eslint-disable no-control-regex */\nconst INVALID_CHARS_REGEX = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u007F-\\u009F]/g;\nconst ZERO_WIDTH_CHARS_REGEX = /[\\u200B-\\u200D\\u2060\\uFEFF]/g;\nconst UNICODE_SPACES_REGEX = /[\\u00A0\\u2000-\\u200A]/g;\nconst LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\\s.]+|[\\s.]+$/g;\n/* eslint-enable no-control-regex */\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n\t'CON',\n\t'PRN',\n\t'AUX',\n\t'NUL',\n\t'COM1',\n\t'COM2',\n\t'COM3',\n\t'COM4',\n\t'COM5',\n\t'COM6',\n\t'COM7',\n\t'COM8',\n\t'COM9',\n\t'LPT1',\n\t'LPT2',\n\t'LPT3',\n\t'LPT4',\n\t'LPT5',\n\t'LPT6',\n\t'LPT7',\n\t'LPT8',\n\t'LPT9',\n]);\n\nconst DEFAULT_FALLBACK_NAME = 'untitled';\nconst MAX_FILENAME_LENGTH = 200;\n\n/**\n * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems\n *\n * Main features:\n * - Replace invalid characters (e.g. \":\" in hello:world)\n * - Handle Windows reserved names\n * - Limit filename length\n * - Normalize Unicode characters\n *\n * @param filename - The filename to sanitize (without extension)\n * @param maxLength - Maximum filename length (default: 200)\n * @returns A sanitized filename (without extension)\n *\n * @example\n * sanitizeFilename('hello:world') // returns 'hello_world'\n * sanitizeFilename('CON') // returns '_CON'\n * sanitizeFilename('') // returns 'untitled'\n */\nexport const sanitizeFilename = (\n\tfilename: string,\n\tmaxLength: number = MAX_FILENAME_LENGTH,\n): string => {\n\t// Input validation\n\tif (!filename) {\n\t\treturn DEFAULT_FALLBACK_NAME;\n\t}\n\n\tlet baseName = filename\n\t\t.trim()\n\t\t.replace(INVALID_CHARS_REGEX, '_')\n\t\t.replace(ZERO_WIDTH_CHARS_REGEX, '')\n\t\t.replace(UNICODE_SPACES_REGEX, ' ')\n\t\t.replace(LEADING_TRAILING_DOTS_SPACES_REGEX, '');\n\n\t// Handle empty or invalid filenames after cleaning\n\tif (!baseName) {\n\t\tbaseName = DEFAULT_FALLBACK_NAME;\n\t}\n\n\t// Handle Windows reserved names\n\tif (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) {\n\t\tbaseName = `_${baseName}`;\n\t}\n\n\t// Truncate if too long\n\tif (baseName.length > maxLength) {\n\t\tbaseName = baseName.slice(0, maxLength);\n\t}\n\n\treturn baseName;\n};\n"],"mappings":";;AAEA,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,qCAAqC;AAG3C,MAAM,yBAAyB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,MAAa,oBACZ,UACA,YAAoB,wBACR;AAEZ,KAAI,CAAC,SACJ,QAAO;CAGR,IAAI,WAAW,SACb,MAAM,CACN,QAAQ,qBAAqB,IAAI,CACjC,QAAQ,wBAAwB,GAAG,CACnC,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oCAAoC,GAAG;AAGjD,KAAI,CAAC,SACJ,YAAW;AAIZ,KAAI,uBAAuB,IAAI,SAAS,aAAa,CAAC,CACrD,YAAW,IAAI;AAIhB,KAAI,SAAS,SAAS,UACrB,YAAW,SAAS,MAAM,GAAG,UAAU;AAGxC,QAAO"} |
| //#region src/files/sanitize.d.ts | ||
| declare const sanitizeFilename: (filename: string, maxLength?: number) => string; | ||
| //#endregion | ||
| export { sanitizeFilename as t }; | ||
| //# sourceMappingURL=sanitize.d.cts.map |
| //#region src/files/sanitize.d.ts | ||
| declare const sanitizeFilename: (filename: string, maxLength?: number) => string; | ||
| //#endregion | ||
| export { sanitizeFilename as t }; | ||
| //# sourceMappingURL=sanitize.d.mts.map |
| //#region src/files/sanitize.ts | ||
| const INVALID_CHARS_REGEX = /[<>:"/\\|?*\u0000-\u001F\u007F-\u009F]/g; | ||
| const ZERO_WIDTH_CHARS_REGEX = /[\u200B-\u200D\u2060\uFEFF]/g; | ||
| const UNICODE_SPACES_REGEX = /[\u00A0\u2000-\u200A]/g; | ||
| const LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\s.]+|[\s.]+$/g; | ||
| const WINDOWS_RESERVED_NAMES = new Set([ | ||
| "CON", | ||
| "PRN", | ||
| "AUX", | ||
| "NUL", | ||
| "COM1", | ||
| "COM2", | ||
| "COM3", | ||
| "COM4", | ||
| "COM5", | ||
| "COM6", | ||
| "COM7", | ||
| "COM8", | ||
| "COM9", | ||
| "LPT1", | ||
| "LPT2", | ||
| "LPT3", | ||
| "LPT4", | ||
| "LPT5", | ||
| "LPT6", | ||
| "LPT7", | ||
| "LPT8", | ||
| "LPT9" | ||
| ]); | ||
| const DEFAULT_FALLBACK_NAME = "untitled"; | ||
| const MAX_FILENAME_LENGTH = 200; | ||
| /** | ||
| * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems | ||
| * | ||
| * Main features: | ||
| * - Replace invalid characters (e.g. ":" in hello:world) | ||
| * - Handle Windows reserved names | ||
| * - Limit filename length | ||
| * - Normalize Unicode characters | ||
| * | ||
| * @param filename - The filename to sanitize (without extension) | ||
| * @param maxLength - Maximum filename length (default: 200) | ||
| * @returns A sanitized filename (without extension) | ||
| * | ||
| * @example | ||
| * sanitizeFilename('hello:world') // returns 'hello_world' | ||
| * sanitizeFilename('CON') // returns '_CON' | ||
| * sanitizeFilename('') // returns 'untitled' | ||
| */ | ||
| const sanitizeFilename = (filename, maxLength = MAX_FILENAME_LENGTH) => { | ||
| if (!filename) return DEFAULT_FALLBACK_NAME; | ||
| let baseName = filename.trim().replace(INVALID_CHARS_REGEX, "_").replace(ZERO_WIDTH_CHARS_REGEX, "").replace(UNICODE_SPACES_REGEX, " ").replace(LEADING_TRAILING_DOTS_SPACES_REGEX, ""); | ||
| if (!baseName) baseName = DEFAULT_FALLBACK_NAME; | ||
| if (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) baseName = `_${baseName}`; | ||
| if (baseName.length > maxLength) baseName = baseName.slice(0, maxLength); | ||
| return baseName; | ||
| }; | ||
| //#endregion | ||
| export { sanitizeFilename as t }; | ||
| //# sourceMappingURL=sanitize.mjs.map |
| {"version":3,"file":"sanitize.mjs","names":[],"sources":["../src/files/sanitize.ts"],"sourcesContent":["// Constants definition\n/* eslint-disable no-control-regex */\nconst INVALID_CHARS_REGEX = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u007F-\\u009F]/g;\nconst ZERO_WIDTH_CHARS_REGEX = /[\\u200B-\\u200D\\u2060\\uFEFF]/g;\nconst UNICODE_SPACES_REGEX = /[\\u00A0\\u2000-\\u200A]/g;\nconst LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\\s.]+|[\\s.]+$/g;\n/* eslint-enable no-control-regex */\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n\t'CON',\n\t'PRN',\n\t'AUX',\n\t'NUL',\n\t'COM1',\n\t'COM2',\n\t'COM3',\n\t'COM4',\n\t'COM5',\n\t'COM6',\n\t'COM7',\n\t'COM8',\n\t'COM9',\n\t'LPT1',\n\t'LPT2',\n\t'LPT3',\n\t'LPT4',\n\t'LPT5',\n\t'LPT6',\n\t'LPT7',\n\t'LPT8',\n\t'LPT9',\n]);\n\nconst DEFAULT_FALLBACK_NAME = 'untitled';\nconst MAX_FILENAME_LENGTH = 200;\n\n/**\n * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems\n *\n * Main features:\n * - Replace invalid characters (e.g. \":\" in hello:world)\n * - Handle Windows reserved names\n * - Limit filename length\n * - Normalize Unicode characters\n *\n * @param filename - The filename to sanitize (without extension)\n * @param maxLength - Maximum filename length (default: 200)\n * @returns A sanitized filename (without extension)\n *\n * @example\n * sanitizeFilename('hello:world') // returns 'hello_world'\n * sanitizeFilename('CON') // returns '_CON'\n * sanitizeFilename('') // returns 'untitled'\n */\nexport const sanitizeFilename = (\n\tfilename: string,\n\tmaxLength: number = MAX_FILENAME_LENGTH,\n): string => {\n\t// Input validation\n\tif (!filename) {\n\t\treturn DEFAULT_FALLBACK_NAME;\n\t}\n\n\tlet baseName = filename\n\t\t.trim()\n\t\t.replace(INVALID_CHARS_REGEX, '_')\n\t\t.replace(ZERO_WIDTH_CHARS_REGEX, '')\n\t\t.replace(UNICODE_SPACES_REGEX, ' ')\n\t\t.replace(LEADING_TRAILING_DOTS_SPACES_REGEX, '');\n\n\t// Handle empty or invalid filenames after cleaning\n\tif (!baseName) {\n\t\tbaseName = DEFAULT_FALLBACK_NAME;\n\t}\n\n\t// Handle Windows reserved names\n\tif (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) {\n\t\tbaseName = `_${baseName}`;\n\t}\n\n\t// Truncate if too long\n\tif (baseName.length > maxLength) {\n\t\tbaseName = baseName.slice(0, maxLength);\n\t}\n\n\treturn baseName;\n};\n"],"mappings":";AAEA,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,qCAAqC;AAG3C,MAAM,yBAAyB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,MAAa,oBACZ,UACA,YAAoB,wBACR;AAEZ,KAAI,CAAC,SACJ,QAAO;CAGR,IAAI,WAAW,SACb,MAAM,CACN,QAAQ,qBAAqB,IAAI,CACjC,QAAQ,wBAAwB,GAAG,CACnC,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oCAAoC,GAAG;AAGjD,KAAI,CAAC,SACJ,YAAW;AAIZ,KAAI,uBAAuB,IAAI,SAAS,aAAa,CAAC,CACrD,YAAW,IAAI;AAIhB,KAAI,SAAS,SAAS,UACrB,YAAW,SAAS,MAAM,GAAG,UAAU;AAGxC,QAAO"} |
| const require_reRankSearchResults = require('../reRankSearchResults.cjs'); | ||
| exports.reRankSearchResults = require_reRankSearchResults.reRankSearchResults; |
| import { t as reRankSearchResults } from "../reRankSearchResults.cjs"; | ||
| export { reRankSearchResults }; |
| import { t as reRankSearchResults } from "../reRankSearchResults.mjs"; | ||
| export { reRankSearchResults }; |
| import { t as reRankSearchResults } from "../reRankSearchResults.mjs"; | ||
| export { reRankSearchResults }; |
| const require_sublimeSearch = require('../sublimeSearch.cjs'); | ||
| exports.DEFAULT_KEYS = require_sublimeSearch.DEFAULT_KEYS; | ||
| exports.sublimeSearch = require_sublimeSearch.sublimeSearch; |
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "../sublimeSearch.cjs"; | ||
| export { DEFAULT_KEYS, sublimeSearch }; |
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "../sublimeSearch.mjs"; | ||
| export { DEFAULT_KEYS, sublimeSearch }; |
| import { n as sublimeSearch, t as DEFAULT_KEYS } from "../sublimeSearch.mjs"; | ||
| export { DEFAULT_KEYS, sublimeSearch }; |
| //#region src/number/smartDecimal.ts | ||
| const smartDecimal = (value, decimals = 2) => { | ||
| if (Number.isInteger(value)) return value; | ||
| if (value.toString().split(".")[1].length <= decimals) return value; | ||
| return Number(value.toFixed(decimals)); | ||
| }; | ||
| //#endregion | ||
| Object.defineProperty(exports, 'smartDecimal', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return smartDecimal; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=smartDecimal.cjs.map |
| {"version":3,"file":"smartDecimal.cjs","names":[],"sources":["../src/number/smartDecimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";;AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;AAEpE,KAAI,OAAO,UAAU,MAAM,CAC1B,QAAO;AAIR,KAAI,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,SAC5C,QAAO;AAGR,QAAO,OAAO,MAAM,QAAQ,SAAS,CAAC"} |
| //#region src/number/smartDecimal.d.ts | ||
| declare const smartDecimal: (value: number, decimals?: number) => number; | ||
| //#endregion | ||
| export { smartDecimal as t }; | ||
| //# sourceMappingURL=smartDecimal.d.cts.map |
| //#region src/number/smartDecimal.d.ts | ||
| declare const smartDecimal: (value: number, decimals?: number) => number; | ||
| //#endregion | ||
| export { smartDecimal as t }; | ||
| //# sourceMappingURL=smartDecimal.d.mts.map |
| //#region src/number/smartDecimal.ts | ||
| const smartDecimal = (value, decimals = 2) => { | ||
| if (Number.isInteger(value)) return value; | ||
| if (value.toString().split(".")[1].length <= decimals) return value; | ||
| return Number(value.toFixed(decimals)); | ||
| }; | ||
| //#endregion | ||
| export { smartDecimal as t }; | ||
| //# sourceMappingURL=smartDecimal.mjs.map |
| {"version":3,"file":"smartDecimal.mjs","names":[],"sources":["../src/number/smartDecimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;AAEpE,KAAI,OAAO,UAAU,MAAM,CAC1B,QAAO;AAIR,KAAI,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,SAC5C,QAAO;AAGR,QAAO,OAAO,MAAM,QAAQ,SAAS,CAAC"} |
| const require_sortByProperty = require('../sortByProperty.cjs'); | ||
| exports.sortByProperty = require_sortByProperty.sortByProperty; |
| import { t as sortByProperty } from "../sortByProperty.cjs"; | ||
| export { sortByProperty }; |
| import { t as sortByProperty } from "../sortByProperty.mjs"; | ||
| export { sortByProperty }; |
| import { t as sortByProperty } from "../sortByProperty.mjs"; | ||
| export { sortByProperty }; |
| //#region src/sort/sortByProperty.ts | ||
| const sortByProperty = (property, arr, order = "asc") => arr.sort((a, b) => { | ||
| const result = String(a[property]).localeCompare(String(b[property]), void 0, { | ||
| numeric: true, | ||
| sensitivity: "base" | ||
| }); | ||
| return order === "asc" ? result : -result; | ||
| }); | ||
| //#endregion | ||
| Object.defineProperty(exports, 'sortByProperty', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return sortByProperty; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=sortByProperty.cjs.map |
| {"version":3,"file":"sortByProperty.cjs","names":[],"sources":["../src/sort/sortByProperty.ts"],"sourcesContent":["export const sortByProperty = <T>(\n\tproperty: keyof T,\n\tarr: T[],\n\torder: 'asc' | 'desc' = 'asc',\n): T[] =>\n\tarr.sort((a, b) => {\n\t\tconst result = String(a[property]).localeCompare(String(b[property]), undefined, {\n\t\t\tnumeric: true,\n\t\t\tsensitivity: 'base',\n\t\t});\n\t\treturn order === 'asc' ? result : -result;\n\t});\n"],"mappings":";;AAAA,MAAa,kBACZ,UACA,KACA,QAAwB,UAExB,IAAI,MAAM,GAAG,MAAM;CAClB,MAAM,SAAS,OAAO,EAAE,UAAU,CAAC,cAAc,OAAO,EAAE,UAAU,EAAE,QAAW;EAChF,SAAS;EACT,aAAa;EACb,CAAC;AACF,QAAO,UAAU,QAAQ,SAAS,CAAC;EAClC"} |
| //#region src/sort/sortByProperty.d.ts | ||
| declare const sortByProperty: <T>(property: keyof T, arr: T[], order?: "asc" | "desc") => T[]; | ||
| //#endregion | ||
| export { sortByProperty as t }; | ||
| //# sourceMappingURL=sortByProperty.d.cts.map |
| //#region src/sort/sortByProperty.d.ts | ||
| declare const sortByProperty: <T>(property: keyof T, arr: T[], order?: "asc" | "desc") => T[]; | ||
| //#endregion | ||
| export { sortByProperty as t }; | ||
| //# sourceMappingURL=sortByProperty.d.mts.map |
| //#region src/sort/sortByProperty.ts | ||
| const sortByProperty = (property, arr, order = "asc") => arr.sort((a, b) => { | ||
| const result = String(a[property]).localeCompare(String(b[property]), void 0, { | ||
| numeric: true, | ||
| sensitivity: "base" | ||
| }); | ||
| return order === "asc" ? result : -result; | ||
| }); | ||
| //#endregion | ||
| export { sortByProperty as t }; | ||
| //# sourceMappingURL=sortByProperty.mjs.map |
| {"version":3,"file":"sortByProperty.mjs","names":[],"sources":["../src/sort/sortByProperty.ts"],"sourcesContent":["export const sortByProperty = <T>(\n\tproperty: keyof T,\n\tarr: T[],\n\torder: 'asc' | 'desc' = 'asc',\n): T[] =>\n\tarr.sort((a, b) => {\n\t\tconst result = String(a[property]).localeCompare(String(b[property]), undefined, {\n\t\t\tnumeric: true,\n\t\t\tsensitivity: 'base',\n\t\t});\n\t\treturn order === 'asc' ? result : -result;\n\t});\n"],"mappings":";AAAA,MAAa,kBACZ,UACA,KACA,QAAwB,UAExB,IAAI,MAAM,GAAG,MAAM;CAClB,MAAM,SAAS,OAAO,EAAE,UAAU,CAAC,cAAc,OAAO,EAAE,UAAU,EAAE,QAAW;EAChF,SAAS;EACT,aAAa;EACb,CAAC;AACF,QAAO,UAAU,QAAQ,SAAS,CAAC;EAClC"} |
| //#region src/search/sublimeSearch.ts | ||
| const SEQUENTIAL_BONUS = 60; | ||
| const SEPARATOR_BONUS = 38; | ||
| const CAMEL_BONUS = 30; | ||
| const FIRST_LETTER_BONUS = 15; | ||
| const LEADING_LETTER_PENALTY = -20; | ||
| const MAX_LEADING_LETTER_PENALTY = -200; | ||
| const UNMATCHED_LETTER_PENALTY = -2.5; | ||
| const DEFAULT_KEYS = [{ | ||
| key: "properties.displayName", | ||
| weight: 1.3 | ||
| }, { | ||
| key: "properties.codex.alias", | ||
| weight: 1 | ||
| }]; | ||
| /** | ||
| * Returns true if each character in pattern is found sequentially within target | ||
| * @param {*} pattern string | ||
| * @param {*} target string | ||
| */ | ||
| function fuzzyMatchSimple(pattern, target) { | ||
| let patternIdx = 0; | ||
| let strIdx = 0; | ||
| while (patternIdx < pattern.length && strIdx < target.length) { | ||
| if (pattern.charAt(patternIdx).toLowerCase() === target.charAt(strIdx).toLowerCase()) patternIdx++; | ||
| ++strIdx; | ||
| } | ||
| return pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length; | ||
| } | ||
| function fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex, targetMatches, matches, maxMatches, nextMatch, recursionCount, recursionLimit) { | ||
| let outScore = 0; | ||
| if (++recursionCount >= recursionLimit) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (patternCurIndex === pattern.length || targetCurrIndex === target.length) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| let recursiveMatch = false; | ||
| let bestRecursiveMatches = []; | ||
| let bestRecursiveScore = 0; | ||
| let firstMatch = true; | ||
| while (patternCurIndex < pattern.length && targetCurrIndex < target.length) { | ||
| if (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) { | ||
| if (nextMatch >= maxMatches) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (firstMatch && targetMatches) { | ||
| matches = [...targetMatches]; | ||
| firstMatch = false; | ||
| } | ||
| const recursiveMatches = []; | ||
| const recursiveResult = fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex + 1, matches, recursiveMatches, maxMatches, nextMatch, recursionCount, recursionLimit); | ||
| const recursiveScore = recursiveResult.outScore; | ||
| if (recursiveResult.matched) { | ||
| if (!recursiveMatch || recursiveScore > bestRecursiveScore) { | ||
| bestRecursiveMatches = [...recursiveMatches]; | ||
| bestRecursiveScore = recursiveScore; | ||
| } | ||
| recursiveMatch = true; | ||
| } | ||
| matches[nextMatch++] = targetCurrIndex; | ||
| ++patternCurIndex; | ||
| } | ||
| ++targetCurrIndex; | ||
| } | ||
| const matched = patternCurIndex === pattern.length; | ||
| if (matched) { | ||
| outScore = 100; | ||
| if (!target.toLowerCase().startsWith("n8n")) { | ||
| let penalty = LEADING_LETTER_PENALTY * matches[0]; | ||
| penalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty; | ||
| outScore += penalty; | ||
| } | ||
| const unmatched = target.length - nextMatch; | ||
| outScore += UNMATCHED_LETTER_PENALTY * unmatched; | ||
| for (let i = 0; i < nextMatch; i++) { | ||
| const currIdx = matches[i]; | ||
| if (i > 0) { | ||
| if (currIdx === matches[i - 1] + 1) outScore += SEQUENTIAL_BONUS; | ||
| } | ||
| if (currIdx > 0) { | ||
| const neighbor = target[currIdx - 1]; | ||
| const curr = target[currIdx]; | ||
| if (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) outScore += CAMEL_BONUS; | ||
| if (neighbor === "_" || neighbor === " ") outScore += SEPARATOR_BONUS; | ||
| } else outScore += FIRST_LETTER_BONUS; | ||
| } | ||
| if (recursiveMatch && (!matched || bestRecursiveScore > outScore)) { | ||
| matches = [...bestRecursiveMatches]; | ||
| outScore = bestRecursiveScore; | ||
| return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| } else if (matched) return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| else return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| /** | ||
| * Does a fuzzy search to find pattern inside a string. | ||
| * @param {*} pattern string pattern to search for | ||
| * @param {*} target string string which is being searched | ||
| * @returns [boolean, number] a boolean which tells if pattern was | ||
| * found or not and a search score | ||
| */ | ||
| function fuzzyMatch(pattern, target) { | ||
| return fuzzyMatchRecursive(pattern, target, 0, 0, null, [], 256, 0, 0, 5); | ||
| } | ||
| function getValue(obj, prop) { | ||
| if (obj.hasOwnProperty(prop)) return obj[prop]; | ||
| const segments = prop.split("."); | ||
| let result = obj; | ||
| let i = 0; | ||
| while (result && i < segments.length) { | ||
| const key = segments[i]; | ||
| result = result[key]; | ||
| i++; | ||
| } | ||
| return result; | ||
| } | ||
| function scoreSearchValue(filter, value, weight) { | ||
| if (!fuzzyMatchSimple(filter, value)) return void 0; | ||
| const match = fuzzyMatch(filter, value); | ||
| if (!match.matched) return void 0; | ||
| return match.outScore * weight; | ||
| } | ||
| function sublimeSearch(filter, data, keys = DEFAULT_KEYS, limit) { | ||
| const results = []; | ||
| for (const item of data) { | ||
| let itemMatchScore; | ||
| for (const { key, weight } of keys) { | ||
| const value = getValue(item, key); | ||
| if (Array.isArray(value)) for (const entry of value) { | ||
| if (typeof entry !== "string") continue; | ||
| const score = scoreSearchValue(filter, entry, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| else if (typeof value === "string") { | ||
| const score = scoreSearchValue(filter, value, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| } | ||
| if (itemMatchScore !== void 0) { | ||
| const result = { | ||
| score: itemMatchScore, | ||
| item | ||
| }; | ||
| if (limit === void 0 || results.length < limit) results.push(result); | ||
| else { | ||
| let lowestIndex = 0; | ||
| let lowestScore = results[0].score; | ||
| for (let i = 1; i < results.length; i++) if (results[i].score < lowestScore) { | ||
| lowestIndex = i; | ||
| lowestScore = results[i].score; | ||
| } | ||
| if (result.score > lowestScore) results[lowestIndex] = result; | ||
| } | ||
| } | ||
| } | ||
| results.sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| return results; | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'DEFAULT_KEYS', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return DEFAULT_KEYS; | ||
| } | ||
| }); | ||
| Object.defineProperty(exports, 'sublimeSearch', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return sublimeSearch; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=sublimeSearch.cjs.map |
| {"version":3,"file":"sublimeSearch.cjs","names":["bestRecursiveMatches: number[]","recursiveMatches: number[]","results: Array<{ score: number; item: T }>","itemMatchScore: number | undefined","result: { score: number; item: T }"],"sources":["../src/search/sublimeSearch.ts"],"sourcesContent":["/*\n * Constants and utility functions used for searching for node types in node creator component\n * based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n */\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 38; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -2.5;\n\nexport const DEFAULT_KEYS = [\n\t{ key: 'properties.displayName', weight: 1.3 },\n\t{ key: 'properties.codex.alias', weight: 1 },\n];\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty (if not n8n-prefixed)\n\t\tif (!target.toLowerCase().startsWith('n8n')) {\n\t\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\t\toutScore += penalty;\n\t\t}\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nfunction scoreSearchValue(filter: string, value: string, weight: number): number | undefined {\n\tif (!fuzzyMatchSimple(filter, value)) return undefined;\n\n\tconst match = fuzzyMatch(filter, value);\n\tif (!match.matched) return undefined;\n\n\treturn match.outScore * weight;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: readonly T[],\n\tkeys: Array<{ key: string; weight: number }> = DEFAULT_KEYS,\n\tlimit?: number,\n): Array<{ score: number; item: T }> {\n\tconst results: Array<{ score: number; item: T }> = [];\n\n\tfor (const item of data) {\n\t\tlet itemMatchScore: number | undefined;\n\n\t\tfor (const { key, weight } of keys) {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const entry of value) {\n\t\t\t\t\tif (typeof entry !== 'string') continue;\n\n\t\t\t\t\tconst score = scoreSearchValue(filter, entry, weight);\n\t\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\t\titemMatchScore = score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tconst score = scoreSearchValue(filter, value, weight);\n\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\titemMatchScore = score;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (itemMatchScore !== undefined) {\n\t\t\tconst result: { score: number; item: T } = {\n\t\t\t\tscore: itemMatchScore,\n\t\t\t\titem,\n\t\t\t};\n\n\t\t\tif (limit === undefined || results.length < limit) {\n\t\t\t\tresults.push(result);\n\t\t\t} else {\n\t\t\t\tlet lowestIndex = 0;\n\t\t\t\tlet lowestScore = results[0].score;\n\t\t\t\tfor (let i = 1; i < results.length; i++) {\n\t\t\t\t\tif (results[i].score < lowestScore) {\n\t\t\t\t\t\tlowestIndex = i;\n\t\t\t\t\t\tlowestScore = results[i].score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (result.score > lowestScore) {\n\t\t\t\t\tresults[lowestIndex] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n"],"mappings":"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"} |
| //#region src/search/sublimeSearch.d.ts | ||
| declare const DEFAULT_KEYS: { | ||
| key: string; | ||
| weight: number; | ||
| }[]; | ||
| declare function sublimeSearch<T extends object>(filter: string, data: readonly T[], keys?: Array<{ | ||
| key: string; | ||
| weight: number; | ||
| }>, limit?: number): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { sublimeSearch as n, DEFAULT_KEYS as t }; | ||
| //# sourceMappingURL=sublimeSearch.d.cts.map |
| //#region src/search/sublimeSearch.d.ts | ||
| declare const DEFAULT_KEYS: { | ||
| key: string; | ||
| weight: number; | ||
| }[]; | ||
| declare function sublimeSearch<T extends object>(filter: string, data: readonly T[], keys?: Array<{ | ||
| key: string; | ||
| weight: number; | ||
| }>, limit?: number): Array<{ | ||
| score: number; | ||
| item: T; | ||
| }>; | ||
| //#endregion | ||
| export { sublimeSearch as n, DEFAULT_KEYS as t }; | ||
| //# sourceMappingURL=sublimeSearch.d.mts.map |
| //#region src/search/sublimeSearch.ts | ||
| const SEQUENTIAL_BONUS = 60; | ||
| const SEPARATOR_BONUS = 38; | ||
| const CAMEL_BONUS = 30; | ||
| const FIRST_LETTER_BONUS = 15; | ||
| const LEADING_LETTER_PENALTY = -20; | ||
| const MAX_LEADING_LETTER_PENALTY = -200; | ||
| const UNMATCHED_LETTER_PENALTY = -2.5; | ||
| const DEFAULT_KEYS = [{ | ||
| key: "properties.displayName", | ||
| weight: 1.3 | ||
| }, { | ||
| key: "properties.codex.alias", | ||
| weight: 1 | ||
| }]; | ||
| /** | ||
| * Returns true if each character in pattern is found sequentially within target | ||
| * @param {*} pattern string | ||
| * @param {*} target string | ||
| */ | ||
| function fuzzyMatchSimple(pattern, target) { | ||
| let patternIdx = 0; | ||
| let strIdx = 0; | ||
| while (patternIdx < pattern.length && strIdx < target.length) { | ||
| if (pattern.charAt(patternIdx).toLowerCase() === target.charAt(strIdx).toLowerCase()) patternIdx++; | ||
| ++strIdx; | ||
| } | ||
| return pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length; | ||
| } | ||
| function fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex, targetMatches, matches, maxMatches, nextMatch, recursionCount, recursionLimit) { | ||
| let outScore = 0; | ||
| if (++recursionCount >= recursionLimit) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (patternCurIndex === pattern.length || targetCurrIndex === target.length) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| let recursiveMatch = false; | ||
| let bestRecursiveMatches = []; | ||
| let bestRecursiveScore = 0; | ||
| let firstMatch = true; | ||
| while (patternCurIndex < pattern.length && targetCurrIndex < target.length) { | ||
| if (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) { | ||
| if (nextMatch >= maxMatches) return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| if (firstMatch && targetMatches) { | ||
| matches = [...targetMatches]; | ||
| firstMatch = false; | ||
| } | ||
| const recursiveMatches = []; | ||
| const recursiveResult = fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex + 1, matches, recursiveMatches, maxMatches, nextMatch, recursionCount, recursionLimit); | ||
| const recursiveScore = recursiveResult.outScore; | ||
| if (recursiveResult.matched) { | ||
| if (!recursiveMatch || recursiveScore > bestRecursiveScore) { | ||
| bestRecursiveMatches = [...recursiveMatches]; | ||
| bestRecursiveScore = recursiveScore; | ||
| } | ||
| recursiveMatch = true; | ||
| } | ||
| matches[nextMatch++] = targetCurrIndex; | ||
| ++patternCurIndex; | ||
| } | ||
| ++targetCurrIndex; | ||
| } | ||
| const matched = patternCurIndex === pattern.length; | ||
| if (matched) { | ||
| outScore = 100; | ||
| if (!target.toLowerCase().startsWith("n8n")) { | ||
| let penalty = LEADING_LETTER_PENALTY * matches[0]; | ||
| penalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty; | ||
| outScore += penalty; | ||
| } | ||
| const unmatched = target.length - nextMatch; | ||
| outScore += UNMATCHED_LETTER_PENALTY * unmatched; | ||
| for (let i = 0; i < nextMatch; i++) { | ||
| const currIdx = matches[i]; | ||
| if (i > 0) { | ||
| if (currIdx === matches[i - 1] + 1) outScore += SEQUENTIAL_BONUS; | ||
| } | ||
| if (currIdx > 0) { | ||
| const neighbor = target[currIdx - 1]; | ||
| const curr = target[currIdx]; | ||
| if (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) outScore += CAMEL_BONUS; | ||
| if (neighbor === "_" || neighbor === " ") outScore += SEPARATOR_BONUS; | ||
| } else outScore += FIRST_LETTER_BONUS; | ||
| } | ||
| if (recursiveMatch && (!matched || bestRecursiveScore > outScore)) { | ||
| matches = [...bestRecursiveMatches]; | ||
| outScore = bestRecursiveScore; | ||
| return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| } else if (matched) return { | ||
| matched: true, | ||
| outScore | ||
| }; | ||
| else return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| return { | ||
| matched: false, | ||
| outScore | ||
| }; | ||
| } | ||
| /** | ||
| * Does a fuzzy search to find pattern inside a string. | ||
| * @param {*} pattern string pattern to search for | ||
| * @param {*} target string string which is being searched | ||
| * @returns [boolean, number] a boolean which tells if pattern was | ||
| * found or not and a search score | ||
| */ | ||
| function fuzzyMatch(pattern, target) { | ||
| return fuzzyMatchRecursive(pattern, target, 0, 0, null, [], 256, 0, 0, 5); | ||
| } | ||
| function getValue(obj, prop) { | ||
| if (obj.hasOwnProperty(prop)) return obj[prop]; | ||
| const segments = prop.split("."); | ||
| let result = obj; | ||
| let i = 0; | ||
| while (result && i < segments.length) { | ||
| const key = segments[i]; | ||
| result = result[key]; | ||
| i++; | ||
| } | ||
| return result; | ||
| } | ||
| function scoreSearchValue(filter, value, weight) { | ||
| if (!fuzzyMatchSimple(filter, value)) return void 0; | ||
| const match = fuzzyMatch(filter, value); | ||
| if (!match.matched) return void 0; | ||
| return match.outScore * weight; | ||
| } | ||
| function sublimeSearch(filter, data, keys = DEFAULT_KEYS, limit) { | ||
| const results = []; | ||
| for (const item of data) { | ||
| let itemMatchScore; | ||
| for (const { key, weight } of keys) { | ||
| const value = getValue(item, key); | ||
| if (Array.isArray(value)) for (const entry of value) { | ||
| if (typeof entry !== "string") continue; | ||
| const score = scoreSearchValue(filter, entry, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| else if (typeof value === "string") { | ||
| const score = scoreSearchValue(filter, value, weight); | ||
| if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score; | ||
| } | ||
| } | ||
| if (itemMatchScore !== void 0) { | ||
| const result = { | ||
| score: itemMatchScore, | ||
| item | ||
| }; | ||
| if (limit === void 0 || results.length < limit) results.push(result); | ||
| else { | ||
| let lowestIndex = 0; | ||
| let lowestScore = results[0].score; | ||
| for (let i = 1; i < results.length; i++) if (results[i].score < lowestScore) { | ||
| lowestIndex = i; | ||
| lowestScore = results[i].score; | ||
| } | ||
| if (result.score > lowestScore) results[lowestIndex] = result; | ||
| } | ||
| } | ||
| } | ||
| results.sort((a, b) => { | ||
| return b.score - a.score; | ||
| }); | ||
| return results; | ||
| } | ||
| //#endregion | ||
| export { sublimeSearch as n, DEFAULT_KEYS as t }; | ||
| //# sourceMappingURL=sublimeSearch.mjs.map |
| {"version":3,"file":"sublimeSearch.mjs","names":["bestRecursiveMatches: number[]","recursiveMatches: number[]","results: Array<{ score: number; item: T }>","itemMatchScore: number | undefined","result: { score: number; item: T }"],"sources":["../src/search/sublimeSearch.ts"],"sourcesContent":["/*\n * Constants and utility functions used for searching for node types in node creator component\n * based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n */\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 38; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -2.5;\n\nexport const DEFAULT_KEYS = [\n\t{ key: 'properties.displayName', weight: 1.3 },\n\t{ key: 'properties.codex.alias', weight: 1 },\n];\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty (if not n8n-prefixed)\n\t\tif (!target.toLowerCase().startsWith('n8n')) {\n\t\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\t\toutScore += penalty;\n\t\t}\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nfunction scoreSearchValue(filter: string, value: string, weight: number): number | undefined {\n\tif (!fuzzyMatchSimple(filter, value)) return undefined;\n\n\tconst match = fuzzyMatch(filter, value);\n\tif (!match.matched) return undefined;\n\n\treturn match.outScore * weight;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: readonly T[],\n\tkeys: Array<{ key: string; weight: number }> = DEFAULT_KEYS,\n\tlimit?: number,\n): Array<{ score: number; item: T }> {\n\tconst results: Array<{ score: number; item: T }> = [];\n\n\tfor (const item of data) {\n\t\tlet itemMatchScore: number | undefined;\n\n\t\tfor (const { key, weight } of keys) {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const entry of value) {\n\t\t\t\t\tif (typeof entry !== 'string') continue;\n\n\t\t\t\t\tconst score = scoreSearchValue(filter, entry, weight);\n\t\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\t\titemMatchScore = score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tconst score = scoreSearchValue(filter, value, weight);\n\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\titemMatchScore = score;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (itemMatchScore !== undefined) {\n\t\t\tconst result: { score: number; item: T } = {\n\t\t\t\tscore: itemMatchScore,\n\t\t\t\titem,\n\t\t\t};\n\n\t\t\tif (limit === undefined || results.length < limit) {\n\t\t\t\tresults.push(result);\n\t\t\t} else {\n\t\t\t\tlet lowestIndex = 0;\n\t\t\t\tlet lowestScore = results[0].score;\n\t\t\t\tfor (let i = 1; i < results.length; i++) {\n\t\t\t\t\tif (results[i].score < lowestScore) {\n\t\t\t\t\t\tlowestIndex = i;\n\t\t\t\t\t\tlowestScore = results[i].score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (result.score > lowestScore) {\n\t\t\t\t\tresults[lowestIndex] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n"],"mappings":"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"} |
| const require_validation = require('./validation2.cjs'); | ||
| exports.isRecord = require_validation.isRecord; |
| import { t as isRecord } from "./validation2.cjs"; | ||
| export { isRecord }; |
| import { t as isRecord } from "./validation2.mjs"; | ||
| export { isRecord }; |
| import { t as isRecord } from "./validation2.mjs"; | ||
| export { isRecord }; |
| //#region src/validation.ts | ||
| function isRecord(value) { | ||
| return typeof value === "object" && value !== null && !Array.isArray(value); | ||
| } | ||
| //#endregion | ||
| Object.defineProperty(exports, 'isRecord', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return isRecord; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=validation2.cjs.map |
| {"version":3,"file":"validation2.cjs","names":[],"sources":["../src/validation.ts"],"sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;AAAA,SAAgB,SAAS,OAAkD;AAC1E,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM"} |
| //#region src/validation.d.ts | ||
| declare function isRecord(value: unknown): value is Record<string, unknown>; | ||
| //#endregion | ||
| export { isRecord as t }; | ||
| //# sourceMappingURL=validation2.d.cts.map |
| //#region src/validation.d.ts | ||
| declare function isRecord(value: unknown): value is Record<string, unknown>; | ||
| //#endregion | ||
| export { isRecord as t }; | ||
| //# sourceMappingURL=validation2.d.mts.map |
| //#region src/validation.ts | ||
| function isRecord(value) { | ||
| return typeof value === "object" && value !== null && !Array.isArray(value); | ||
| } | ||
| //#endregion | ||
| export { isRecord as t }; | ||
| //# sourceMappingURL=validation2.mjs.map |
| {"version":3,"file":"validation2.mjs","names":[],"sources":["../src/validation.ts"],"sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";AAAA,SAAgB,SAAS,OAAkD;AAC1E,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM"} |
| const require_workflowId = require('./workflowId2.cjs'); | ||
| exports.generateNanoId = require_workflowId.generateNanoId; |
| import { t as generateNanoId } from "./workflowId2.cjs"; | ||
| export { generateNanoId }; |
| import { t as generateNanoId } from "./workflowId2.mjs"; | ||
| export { generateNanoId }; |
| import { t as generateNanoId } from "./workflowId2.mjs"; | ||
| export { generateNanoId }; |
| let __n8n_constants = require("@n8n/constants"); | ||
| let nanoid = require("nanoid"); | ||
| //#region src/workflowId.ts | ||
| /** | ||
| * Generates a unique 16-character nanoid. | ||
| * | ||
| * This is the canonical ID generator used across the entire n8n codebase for: | ||
| * - Workflow IDs | ||
| * - Project IDs | ||
| * - Variable IDs | ||
| * - API Key IDs | ||
| * - And other entity IDs | ||
| * | ||
| * Both frontend and backend MUST use this function to ensure consistency. | ||
| * | ||
| * @returns A 16-character ID | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const id = generateNanoId(); | ||
| * // => 'aBcDeFgHiJkLmNoP' (16 characters) | ||
| * ``` | ||
| */ | ||
| const generateNanoId = (0, nanoid.customAlphabet)(__n8n_constants.NANOID_ALPHABET, 16); | ||
| //#endregion | ||
| Object.defineProperty(exports, 'generateNanoId', { | ||
| enumerable: true, | ||
| get: function () { | ||
| return generateNanoId; | ||
| } | ||
| }); | ||
| //# sourceMappingURL=workflowId2.cjs.map |
| {"version":3,"file":"workflowId2.cjs","names":["NANOID_ALPHABET"],"sources":["../src/workflowId.ts"],"sourcesContent":["import { NANOID_ALPHABET } from '@n8n/constants';\nimport { customAlphabet } from 'nanoid';\n\n/**\n * Generates a unique 16-character nanoid.\n *\n * This is the canonical ID generator used across the entire n8n codebase for:\n * - Workflow IDs\n * - Project IDs\n * - Variable IDs\n * - API Key IDs\n * - And other entity IDs\n *\n * Both frontend and backend MUST use this function to ensure consistency.\n *\n * @returns A 16-character ID\n *\n * @example\n * ```ts\n * const id = generateNanoId();\n * // => 'aBcDeFgHiJkLmNoP' (16 characters)\n * ```\n */\nexport const generateNanoId = customAlphabet(NANOID_ALPHABET, 16);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,4CAAgCA,iCAAiB,GAAG"} |
| //#region src/workflowId.d.ts | ||
| declare const generateNanoId: (size?: number) => string; | ||
| //#endregion | ||
| export { generateNanoId as t }; | ||
| //# sourceMappingURL=workflowId2.d.cts.map |
| //#region src/workflowId.d.ts | ||
| declare const generateNanoId: (size?: number) => string; | ||
| //#endregion | ||
| export { generateNanoId as t }; | ||
| //# sourceMappingURL=workflowId2.d.mts.map |
| import { NANOID_ALPHABET } from "@n8n/constants"; | ||
| import { customAlphabet } from "nanoid"; | ||
| //#region src/workflowId.ts | ||
| /** | ||
| * Generates a unique 16-character nanoid. | ||
| * | ||
| * This is the canonical ID generator used across the entire n8n codebase for: | ||
| * - Workflow IDs | ||
| * - Project IDs | ||
| * - Variable IDs | ||
| * - API Key IDs | ||
| * - And other entity IDs | ||
| * | ||
| * Both frontend and backend MUST use this function to ensure consistency. | ||
| * | ||
| * @returns A 16-character ID | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const id = generateNanoId(); | ||
| * // => 'aBcDeFgHiJkLmNoP' (16 characters) | ||
| * ``` | ||
| */ | ||
| const generateNanoId = customAlphabet(NANOID_ALPHABET, 16); | ||
| //#endregion | ||
| export { generateNanoId as t }; | ||
| //# sourceMappingURL=workflowId2.mjs.map |
| {"version":3,"file":"workflowId2.mjs","names":[],"sources":["../src/workflowId.ts"],"sourcesContent":["import { NANOID_ALPHABET } from '@n8n/constants';\nimport { customAlphabet } from 'nanoid';\n\n/**\n * Generates a unique 16-character nanoid.\n *\n * This is the canonical ID generator used across the entire n8n codebase for:\n * - Workflow IDs\n * - Project IDs\n * - Variable IDs\n * - API Key IDs\n * - And other entity IDs\n *\n * Both frontend and backend MUST use this function to ensure consistency.\n *\n * @returns A 16-character ID\n *\n * @example\n * ```ts\n * const id = generateNanoId();\n * // => 'aBcDeFgHiJkLmNoP' (16 characters)\n * ```\n */\nexport const generateNanoId = customAlphabet(NANOID_ALPHABET, 16);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,iBAAiB,eAAe,iBAAiB,GAAG"} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
173941
8.25%184
5.75%1519
6.15%1
Infinity%+ Added
- Removed
Updated