@n8n/utils 1.17.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assert.cjs +2 -9
- package/dist/assert.d.cts +2 -3
- package/dist/assert.d.mts +2 -0
- package/dist/assert.mjs +3 -0
- package/dist/assert2.cjs +17 -0
- package/dist/assert2.cjs.map +1 -0
- package/dist/assert2.d.cts +5 -0
- package/dist/assert2.d.mts +5 -0
- package/dist/assert2.mjs +11 -0
- package/dist/assert2.mjs.map +1 -0
- package/dist/event-bus.cjs +2 -39
- package/dist/event-bus.d.cts +2 -14
- package/dist/event-bus.d.mts +2 -0
- package/dist/event-bus.mjs +3 -0
- package/dist/event-bus2.cjs +49 -0
- package/dist/event-bus2.cjs.map +1 -0
- package/dist/event-bus2.d.cts +14 -0
- package/dist/event-bus2.d.mts +14 -0
- package/dist/event-bus2.mjs +43 -0
- package/dist/event-bus2.mjs.map +1 -0
- package/dist/event-queue.cjs +2 -29
- package/dist/event-queue.d.cts +2 -5
- package/dist/event-queue.d.mts +2 -0
- package/dist/event-queue.mjs +3 -0
- package/dist/event-queue2.cjs +46 -0
- package/dist/event-queue2.cjs.map +1 -0
- package/dist/event-queue2.d.cts +7 -0
- package/dist/event-queue2.d.mts +7 -0
- package/dist/event-queue2.mjs +40 -0
- package/dist/event-queue2.mjs.map +1 -0
- package/dist/index.cjs +21 -0
- package/dist/index.d.cts +10 -0
- package/dist/index.d.mts +10 -0
- package/dist/index.mjs +11 -0
- package/dist/number/smartDecimal.cjs +2 -13
- package/dist/number/smartDecimal.d.cts +2 -3
- package/dist/number/smartDecimal.d.mts +2 -0
- package/dist/number/smartDecimal.mjs +3 -0
- package/dist/reRankSearchResults.cjs +25 -0
- package/dist/reRankSearchResults.cjs.map +1 -0
- package/dist/reRankSearchResults.d.cts +13 -0
- package/dist/reRankSearchResults.d.mts +13 -0
- package/dist/reRankSearchResults.mjs +19 -0
- package/dist/reRankSearchResults.mjs.map +1 -0
- package/dist/retry.cjs +2 -30
- package/dist/retry.d.cts +2 -4
- package/dist/retry.d.mts +2 -0
- package/dist/retry.mjs +3 -0
- package/dist/retry2.cjs +45 -0
- package/dist/retry2.cjs.map +1 -0
- package/dist/{retry.d.ts → retry2.d.cts} +4 -2
- package/dist/retry2.d.mts +6 -0
- package/dist/retry2.mjs +39 -0
- package/dist/retry2.mjs.map +1 -0
- package/dist/search/reRankSearchResults.cjs +2 -21
- package/dist/search/reRankSearchResults.d.cts +2 -11
- package/dist/search/reRankSearchResults.d.mts +2 -0
- package/dist/search/reRankSearchResults.mjs +3 -0
- package/dist/search/sublimeSearch.cjs +3 -197
- package/dist/search/sublimeSearch.d.cts +2 -13
- package/dist/search/sublimeSearch.d.mts +2 -0
- package/dist/search/sublimeSearch.mjs +3 -0
- package/dist/smartDecimal.cjs +16 -0
- package/dist/smartDecimal.cjs.map +1 -0
- package/dist/smartDecimal.d.cts +5 -0
- package/dist/smartDecimal.d.mts +5 -0
- package/dist/smartDecimal.mjs +10 -0
- package/dist/smartDecimal.mjs.map +1 -0
- package/dist/sort/sortByProperty.cjs +2 -11
- package/dist/sort/sortByProperty.d.cts +2 -3
- package/dist/sort/sortByProperty.d.mts +2 -0
- package/dist/sort/sortByProperty.mjs +3 -0
- package/dist/sortByProperty.cjs +18 -0
- package/dist/sortByProperty.cjs.map +1 -0
- package/dist/sortByProperty.d.cts +5 -0
- package/dist/sortByProperty.d.mts +5 -0
- package/dist/sortByProperty.mjs +12 -0
- package/dist/sortByProperty.mjs.map +1 -0
- package/dist/string/truncate.cjs +3 -30
- package/dist/string/truncate.d.cts +2 -4
- package/dist/string/truncate.d.mts +2 -0
- package/dist/string/truncate.mjs +3 -0
- package/dist/sublimeSearch.cjs +183 -0
- package/dist/sublimeSearch.cjs.map +1 -0
- package/dist/sublimeSearch.d.cts +15 -0
- package/dist/sublimeSearch.d.mts +15 -0
- package/dist/sublimeSearch.mjs +171 -0
- package/dist/sublimeSearch.mjs.map +1 -0
- package/dist/truncate.cjs +41 -0
- package/dist/truncate.cjs.map +1 -0
- package/dist/{string/truncate.d.ts → truncate.d.cts} +4 -2
- package/dist/truncate.d.mts +6 -0
- package/dist/truncate.mjs +29 -0
- package/dist/truncate.mjs.map +1 -0
- package/package.json +20 -12
- package/dist/assert.cjs.map +0 -1
- package/dist/assert.d.ts +0 -3
- package/dist/assert.js +0 -10
- package/dist/assert.js.map +0 -1
- package/dist/event-bus.cjs.map +0 -1
- package/dist/event-bus.d.ts +0 -14
- package/dist/event-bus.js +0 -40
- package/dist/event-bus.js.map +0 -1
- package/dist/event-queue.cjs.map +0 -1
- package/dist/event-queue.d.ts +0 -5
- package/dist/event-queue.js +0 -30
- package/dist/event-queue.js.map +0 -1
- package/dist/number/smartDecimal.cjs.map +0 -1
- package/dist/number/smartDecimal.d.ts +0 -3
- package/dist/number/smartDecimal.js +0 -14
- package/dist/number/smartDecimal.js.map +0 -1
- package/dist/retry.cjs.map +0 -1
- package/dist/retry.js +0 -31
- package/dist/retry.js.map +0 -1
- package/dist/search/reRankSearchResults.cjs.map +0 -1
- package/dist/search/reRankSearchResults.d.ts +0 -11
- package/dist/search/reRankSearchResults.js +0 -22
- package/dist/search/reRankSearchResults.js.map +0 -1
- package/dist/search/sublimeSearch.cjs.map +0 -1
- package/dist/search/sublimeSearch.d.ts +0 -13
- package/dist/search/sublimeSearch.js +0 -198
- package/dist/search/sublimeSearch.js.map +0 -1
- package/dist/sort/sortByProperty.cjs.map +0 -1
- package/dist/sort/sortByProperty.d.ts +0 -3
- package/dist/sort/sortByProperty.js +0 -12
- package/dist/sort/sortByProperty.js.map +0 -1
- package/dist/string/truncate.cjs.map +0 -1
- package/dist/string/truncate.js +0 -31
- package/dist/string/truncate.js.map +0 -1
package/dist/event-bus.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
type CallbackFn = (...args: any[]) => any;
|
|
2
|
-
type Payloads<ListenerMap> = {
|
|
3
|
-
[E in keyof ListenerMap]: unknown;
|
|
4
|
-
};
|
|
5
|
-
type Listener<Payload> = (payload: Payload) => void;
|
|
6
|
-
interface EventBus<ListenerMap extends Payloads<ListenerMap> = Record<string, any>> {
|
|
7
|
-
on<EventName extends keyof ListenerMap & string>(eventName: EventName, fn: Listener<ListenerMap[EventName]>): void;
|
|
8
|
-
once<EventName extends keyof ListenerMap & string>(eventName: EventName, fn: Listener<ListenerMap[EventName]>): void;
|
|
9
|
-
off<EventName extends keyof ListenerMap & string>(eventName: EventName, fn: Listener<ListenerMap[EventName]>): void;
|
|
10
|
-
emit<EventName extends keyof ListenerMap & string>(eventName: EventName, event?: ListenerMap[EventName]): void;
|
|
11
|
-
}
|
|
12
|
-
declare function createEventBus<ListenerMap extends Payloads<ListenerMap> = Record<string, any>>(): EventBus<ListenerMap>;
|
|
13
|
-
|
|
14
|
-
export { type CallbackFn, type EventBus, createEventBus };
|
package/dist/event-bus.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// src/event-bus.ts
|
|
2
|
-
function createEventBus() {
|
|
3
|
-
const handlers = /* @__PURE__ */ new Map();
|
|
4
|
-
return {
|
|
5
|
-
on(eventName, fn) {
|
|
6
|
-
let eventFns = handlers.get(eventName);
|
|
7
|
-
if (!eventFns) {
|
|
8
|
-
eventFns = [fn];
|
|
9
|
-
} else {
|
|
10
|
-
eventFns.push(fn);
|
|
11
|
-
}
|
|
12
|
-
handlers.set(eventName, eventFns);
|
|
13
|
-
},
|
|
14
|
-
once(eventName, fn) {
|
|
15
|
-
const handler = (payload) => {
|
|
16
|
-
this.off(eventName, handler);
|
|
17
|
-
fn(payload);
|
|
18
|
-
};
|
|
19
|
-
this.on(eventName, handler);
|
|
20
|
-
},
|
|
21
|
-
off(eventName, fn) {
|
|
22
|
-
const eventFns = handlers.get(eventName);
|
|
23
|
-
if (eventFns) {
|
|
24
|
-
eventFns.splice(eventFns.indexOf(fn) >>> 0, 1);
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
emit(eventName, event) {
|
|
28
|
-
const eventFns = handlers.get(eventName);
|
|
29
|
-
if (eventFns) {
|
|
30
|
-
eventFns.slice().forEach((handler) => {
|
|
31
|
-
handler(event);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
export {
|
|
38
|
-
createEventBus
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=event-bus.js.map
|
package/dist/event-bus.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-bus.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type CallbackFn = (...args: any[]) => any;\n\ntype Payloads<ListenerMap> = {\n\t[E in keyof ListenerMap]: unknown;\n};\n\ntype Listener<Payload> = (payload: Payload) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface EventBus<ListenerMap extends Payloads<ListenerMap> = Record<string, any>> {\n\ton<EventName extends keyof ListenerMap & string>(\n\t\teventName: EventName,\n\t\tfn: Listener<ListenerMap[EventName]>,\n\t): void;\n\n\tonce<EventName extends keyof ListenerMap & string>(\n\t\teventName: EventName,\n\t\tfn: Listener<ListenerMap[EventName]>,\n\t): void;\n\n\toff<EventName extends keyof ListenerMap & string>(\n\t\teventName: EventName,\n\t\tfn: Listener<ListenerMap[EventName]>,\n\t): void;\n\n\temit<EventName extends keyof ListenerMap & string>(\n\t\teventName: EventName,\n\t\tevent?: ListenerMap[EventName],\n\t): void;\n}\n\n/**\n * Creates an event bus with the given listener map.\n *\n * @example\n * ```ts\n * const eventBus = createEventBus<{\n * 'user-logged-in': { username: string };\n * 'user-logged-out': never;\n * }>();\n */\nexport function createEventBus<\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tListenerMap extends Payloads<ListenerMap> = Record<string, any>,\n>(): EventBus<ListenerMap> {\n\tconst handlers = new Map<string, CallbackFn[]>();\n\n\treturn {\n\t\ton(eventName, fn) {\n\t\t\tlet eventFns = handlers.get(eventName);\n\t\t\tif (!eventFns) {\n\t\t\t\teventFns = [fn];\n\t\t\t} else {\n\t\t\t\teventFns.push(fn);\n\t\t\t}\n\t\t\thandlers.set(eventName, eventFns);\n\t\t},\n\n\t\tonce(eventName, fn) {\n\t\t\tconst handler: typeof fn = (payload) => {\n\t\t\t\tthis.off(eventName, handler);\n\t\t\t\tfn(payload);\n\t\t\t};\n\t\t\tthis.on(eventName, handler);\n\t\t},\n\n\t\toff(eventName, fn) {\n\t\t\tconst eventFns = handlers.get(eventName);\n\t\t\tif (eventFns) {\n\t\t\t\teventFns.splice(eventFns.indexOf(fn) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\temit(eventName, event) {\n\t\t\tconst eventFns = handlers.get(eventName);\n\t\t\tif (eventFns) {\n\t\t\t\teventFns.slice().forEach((handler) => {\n\t\t\t\t\thandler(event);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":";AA0CO,SAAS,iBAGW;AAC1B,QAAM,WAAW,oBAAI,IAA0B;AAE/C,SAAO;AAAA,IACN,GAAG,WAAW,IAAI;AACjB,UAAI,WAAW,SAAS,IAAI,SAAS;AACrC,UAAI,CAAC,UAAU;AACd,mBAAW,CAAC,EAAE;AAAA,MACf,OAAO;AACN,iBAAS,KAAK,EAAE;AAAA,MACjB;AACA,eAAS,IAAI,WAAW,QAAQ;AAAA,IACjC;AAAA,IAEA,KAAK,WAAW,IAAI;AACnB,YAAM,UAAqB,CAAC,YAAY;AACvC,aAAK,IAAI,WAAW,OAAO;AAC3B,WAAG,OAAO;AAAA,MACX;AACA,WAAK,GAAG,WAAW,OAAO;AAAA,IAC3B;AAAA,IAEA,IAAI,WAAW,IAAI;AAClB,YAAM,WAAW,SAAS,IAAI,SAAS;AACvC,UAAI,UAAU;AACb,iBAAS,OAAO,SAAS,QAAQ,EAAE,MAAM,GAAG,CAAC;AAAA,MAC9C;AAAA,IACD;AAAA,IAEA,KAAK,WAAW,OAAO;AACtB,YAAM,WAAW,SAAS,IAAI,SAAS;AACvC,UAAI,UAAU;AACb,iBAAS,MAAM,EAAE,QAAQ,CAAC,YAAY;AACrC,kBAAQ,KAAK;AAAA,QACd,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AACD;","names":[]}
|
package/dist/event-queue.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/event-queue.cjs","../src/event-queue.ts"],"names":[],"mappings":"AAAA;ACMO,SAAS,gBAAA,CAAoB,YAAA,EAA2C;AAE9E,EAAA,MAAM,MAAA,EAAa,CAAC,CAAA;AAGpB,EAAA,IAAI,WAAA,EAAa,KAAA;AAKjB,EAAA,MAAA,SAAe,WAAA,CAAA,EAA6B;AAC3C,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA,CAAM,OAAA,IAAW,CAAA,EAAG;AACrC,MAAA,MAAA;AAAA,IACD;AAEA,IAAA,WAAA,EAAa,IAAA;AACb,IAAA,MAAM,aAAA,EAAe,KAAA,CAAM,KAAA,CAAM,CAAA;AAEjC,IAAA,GAAA,CAAI,aAAA,IAAiB,KAAA,CAAA,EAAW;AAC/B,MAAA,IAAI;AACH,QAAA,MAAM,YAAA,CAAa,YAAY,CAAA;AAAA,MAChC,EAAA,MAAA,CAAS,KAAA,EAAO;AACf,QAAA,OAAA,CAAQ,KAAA,CAAM,yBAAA,EAA2B,KAAK,CAAA;AAAA,MAC/C;AAAA,IACD;AAEA,IAAA,WAAA,EAAa,KAAA;AAGb,IAAA,MAAM,WAAA,CAAY,CAAA;AAAA,EACnB;AAOA,EAAA,SAAS,OAAA,CAAQ,KAAA,EAAgB;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAChB,IAAA,KAAK,WAAA,CAAY,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,EAAE,QAAQ,CAAA;AAClB;ADvBA;AACE;AACF,4CAAC","file":"/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/event-queue.cjs","sourcesContent":[null,"/**\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"]}
|
package/dist/event-queue.d.ts
DELETED
package/dist/event-queue.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// src/event-queue.ts
|
|
2
|
-
function createEventQueue(processEvent) {
|
|
3
|
-
const queue = [];
|
|
4
|
-
let processing = false;
|
|
5
|
-
async function processNext() {
|
|
6
|
-
if (processing || queue.length === 0) {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
processing = true;
|
|
10
|
-
const currentEvent = queue.shift();
|
|
11
|
-
if (currentEvent !== void 0) {
|
|
12
|
-
try {
|
|
13
|
-
await processEvent(currentEvent);
|
|
14
|
-
} catch (error) {
|
|
15
|
-
console.error("Error processing event:", error);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
processing = false;
|
|
19
|
-
await processNext();
|
|
20
|
-
}
|
|
21
|
-
function enqueue(event) {
|
|
22
|
-
queue.push(event);
|
|
23
|
-
void processNext();
|
|
24
|
-
}
|
|
25
|
-
return { enqueue };
|
|
26
|
-
}
|
|
27
|
-
export {
|
|
28
|
-
createEventQueue
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=event-queue.js.map
|
package/dist/event-queue.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"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":";AAMO,SAAS,iBAAoB,cAA2C;AAE9E,QAAM,QAAa,CAAC;AAGpB,MAAI,aAAa;AAKjB,iBAAe,cAA6B;AAC3C,QAAI,cAAc,MAAM,WAAW,GAAG;AACrC;AAAA,IACD;AAEA,iBAAa;AACb,UAAM,eAAe,MAAM,MAAM;AAEjC,QAAI,iBAAiB,QAAW;AAC/B,UAAI;AACH,cAAM,aAAa,YAAY;AAAA,MAChC,SAAS,OAAO;AACf,gBAAQ,MAAM,2BAA2B,KAAK;AAAA,MAC/C;AAAA,IACD;AAEA,iBAAa;AAGb,UAAM,YAAY;AAAA,EACnB;AAOA,WAAS,QAAQ,OAAgB;AAChC,UAAM,KAAK,KAAK;AAChB,SAAK,YAAY;AAAA,EAClB;AAEA,SAAO,EAAE,QAAQ;AAClB;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/number/smartDecimal.cjs","../../src/number/smartDecimal.ts"],"names":[],"mappings":"AAAA;ACAO,IAAM,aAAA,EAAe,CAAC,KAAA,EAAe,SAAA,EAAW,CAAA,EAAA,GAAc;AAEpE,EAAA,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,KAAA;AAAA,EACR;AAGA,EAAA,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,GAAU,QAAA,EAAU;AACtD,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACtC,CAAA;ADFA;AACE;AACF,oCAAC","file":"/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/number/smartDecimal.cjs","sourcesContent":[null,"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"]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// src/number/smartDecimal.ts
|
|
2
|
-
var smartDecimal = (value, decimals = 2) => {
|
|
3
|
-
if (Number.isInteger(value)) {
|
|
4
|
-
return value;
|
|
5
|
-
}
|
|
6
|
-
if (value.toString().split(".")[1].length <= decimals) {
|
|
7
|
-
return value;
|
|
8
|
-
}
|
|
9
|
-
return Number(value.toFixed(decimals));
|
|
10
|
-
};
|
|
11
|
-
export {
|
|
12
|
-
smartDecimal
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=smartDecimal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"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":";AAAO,IAAM,eAAe,CAAC,OAAe,WAAW,MAAc;AAEpE,MAAI,OAAO,UAAU,KAAK,GAAG;AAC5B,WAAO;AAAA,EACR;AAGA,MAAI,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,UAAU;AACtD,WAAO;AAAA,EACR;AAEA,SAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AACtC;","names":[]}
|
package/dist/retry.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/retry.cjs","../src/retry.ts"],"names":[],"mappings":"AAAA;ACcA,MAAA,SAAsB,KAAA,CACrB,EAAA,EACA,SAAA,EAAmB,GAAA,EACnB,WAAA,EAAqB,CAAA,EACrB,QAAA,EAA2C,QAAA,EACxB;AACnB,EAAA,IAAI,QAAA,EAAU,CAAA;AAEd,EAAA,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY;AAC5B,IAAA,OAAA,EAAA;AACA,IAAA,IAAI;AACH,MAAA,MAAM,OAAA,EAAS,MAAM,EAAA,CAAG,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACR;AAAA,IACD,EAAA,MAAA,CAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAA,EAAuB,KAAK,CAAA;AAC1C,MAAA,MAAM,KAAA;AAAA,IACP;AAGA,IAAA,GAAA,CAAI,QAAA,EAAU,UAAA,EAAY;AACzB,MAAA,IAAI,iBAAA,EAAmB,QAAA;AAEvB,MAAA,GAAA,CAAI,QAAA,IAAY,QAAA,EAAU;AACzB,QAAA,iBAAA,EAAmB,SAAA,EAAW,OAAA;AAAA,MAC/B,EAAA,KAAA,GAAA,CAAW,QAAA,IAAY,aAAA,EAAe;AACrC,QAAA,iBAAA,EAAmB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,EAAU,CAAC,EAAA,EAAI,QAAA;AAC9C,QAAA,iBAAA,EAAmB,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,GAAK,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAA,GAAY,UAAA,CAAW,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAAA,IAC3E;AAAA,EACD;AAEA,EAAA,OAAO,KAAA;AACR;ADvBA;AACE;AACF,sBAAC","file":"/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/retry.cjs","sourcesContent":[null,"type RetryFn = () => boolean | Promise<boolean>;\n\n/**\n * A utility that retries a function every `interval` milliseconds\n * until the function returns true or the maximum number of retries is reached.\n *\n * @param fn - A function that returns a boolean or a Promise resolving to a boolean.\n * @param interval - The time interval (in milliseconds) between each retry. Defaults to 1000.\n * @param maxRetries - The maximum number of retry attempts. Defaults to 3.\n * @param backoff - The backoff strategy to use: 'linear', 'exponential', or null.\n * @returns {Promise<boolean>} - A promise that resolves to:\n * - true: If the function returns true before reaching maxRetries.\n * - false: If the function never returns true or if an error occurs.\n */\nexport async function retry(\n\tfn: RetryFn,\n\tinterval: number = 1000,\n\tmaxRetries: number = 3,\n\tbackoff: 'exponential' | 'linear' | null = 'linear',\n): Promise<boolean> {\n\tlet attempt = 0;\n\n\twhile (attempt < maxRetries) {\n\t\tattempt++;\n\t\ttry {\n\t\t\tconst result = await fn();\n\t\t\tif (result) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Error during retry:', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\t// Wait for the specified interval before the next attempt, if any attempts remain.\n\t\tif (attempt < maxRetries) {\n\t\t\tlet computedInterval = interval;\n\n\t\t\tif (backoff === 'linear') {\n\t\t\t\tcomputedInterval = interval * attempt;\n\t\t\t} else if (backoff === 'exponential') {\n\t\t\t\tcomputedInterval = Math.pow(2, attempt - 1) * interval;\n\t\t\t\tcomputedInterval = Math.min(computedInterval, 30000); // Cap the maximum interval to 30 seconds\n\t\t\t}\n\n\t\t\tawait new Promise<void>((resolve) => setTimeout(resolve, computedInterval));\n\t\t}\n\t}\n\n\treturn false;\n}\n"]}
|
package/dist/retry.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// src/retry.ts
|
|
2
|
-
async function retry(fn, interval = 1e3, maxRetries = 3, backoff = "linear") {
|
|
3
|
-
let attempt = 0;
|
|
4
|
-
while (attempt < maxRetries) {
|
|
5
|
-
attempt++;
|
|
6
|
-
try {
|
|
7
|
-
const result = await fn();
|
|
8
|
-
if (result) {
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
} catch (error) {
|
|
12
|
-
console.error("Error during retry:", error);
|
|
13
|
-
throw error;
|
|
14
|
-
}
|
|
15
|
-
if (attempt < maxRetries) {
|
|
16
|
-
let computedInterval = interval;
|
|
17
|
-
if (backoff === "linear") {
|
|
18
|
-
computedInterval = interval * attempt;
|
|
19
|
-
} else if (backoff === "exponential") {
|
|
20
|
-
computedInterval = Math.pow(2, attempt - 1) * interval;
|
|
21
|
-
computedInterval = Math.min(computedInterval, 3e4);
|
|
22
|
-
}
|
|
23
|
-
await new Promise((resolve) => setTimeout(resolve, computedInterval));
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
export {
|
|
29
|
-
retry
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=retry.js.map
|
package/dist/retry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/retry.ts"],"sourcesContent":["type RetryFn = () => boolean | Promise<boolean>;\n\n/**\n * A utility that retries a function every `interval` milliseconds\n * until the function returns true or the maximum number of retries is reached.\n *\n * @param fn - A function that returns a boolean or a Promise resolving to a boolean.\n * @param interval - The time interval (in milliseconds) between each retry. Defaults to 1000.\n * @param maxRetries - The maximum number of retry attempts. Defaults to 3.\n * @param backoff - The backoff strategy to use: 'linear', 'exponential', or null.\n * @returns {Promise<boolean>} - A promise that resolves to:\n * - true: If the function returns true before reaching maxRetries.\n * - false: If the function never returns true or if an error occurs.\n */\nexport async function retry(\n\tfn: RetryFn,\n\tinterval: number = 1000,\n\tmaxRetries: number = 3,\n\tbackoff: 'exponential' | 'linear' | null = 'linear',\n): Promise<boolean> {\n\tlet attempt = 0;\n\n\twhile (attempt < maxRetries) {\n\t\tattempt++;\n\t\ttry {\n\t\t\tconst result = await fn();\n\t\t\tif (result) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Error during retry:', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\t// Wait for the specified interval before the next attempt, if any attempts remain.\n\t\tif (attempt < maxRetries) {\n\t\t\tlet computedInterval = interval;\n\n\t\t\tif (backoff === 'linear') {\n\t\t\t\tcomputedInterval = interval * attempt;\n\t\t\t} else if (backoff === 'exponential') {\n\t\t\t\tcomputedInterval = Math.pow(2, attempt - 1) * interval;\n\t\t\t\tcomputedInterval = Math.min(computedInterval, 30000); // Cap the maximum interval to 30 seconds\n\t\t\t}\n\n\t\t\tawait new Promise<void>((resolve) => setTimeout(resolve, computedInterval));\n\t\t}\n\t}\n\n\treturn false;\n}\n"],"mappings":";AAcA,eAAsB,MACrB,IACA,WAAmB,KACnB,aAAqB,GACrB,UAA2C,UACxB;AACnB,MAAI,UAAU;AAEd,SAAO,UAAU,YAAY;AAC5B;AACA,QAAI;AACH,YAAM,SAAS,MAAM,GAAG;AACxB,UAAI,QAAQ;AACX,eAAO;AAAA,MACR;AAAA,IACD,SAAS,OAAO;AACf,cAAQ,MAAM,uBAAuB,KAAK;AAC1C,YAAM;AAAA,IACP;AAGA,QAAI,UAAU,YAAY;AACzB,UAAI,mBAAmB;AAEvB,UAAI,YAAY,UAAU;AACzB,2BAAmB,WAAW;AAAA,MAC/B,WAAW,YAAY,eAAe;AACrC,2BAAmB,KAAK,IAAI,GAAG,UAAU,CAAC,IAAI;AAC9C,2BAAmB,KAAK,IAAI,kBAAkB,GAAK;AAAA,MACpD;AAEA,YAAM,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,gBAAgB,CAAC;AAAA,IAC3E;AAAA,EACD;AAEA,SAAO;AACR;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/search/reRankSearchResults.cjs","../../src/search/reRankSearchResults.ts"],"names":[],"mappings":"AAAA;ACAO,SAAS,mBAAA,CACf,aAAA,EACA,iBAAA,EACoC;AACpC,EAAA,OAAO,aAAA,CACL,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,KAAK,CAAA,EAAA,GAAM;AAGzB,IAAA,MAAM,gBAAA,EAAkB,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAC,CAAA,EAAG,YAAY,CAAA,EAAA,GAAM;AAC5F,MAAA,MAAM,YAAA,EAAc,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AACzC,MAAA,GAAA,CAAI,WAAA,EAAa;AAChB,QAAA,OAAO,IAAA,EAAM,WAAA;AAAA,MACd;AAEA,MAAA,OAAO,GAAA;AAAA,IACR,CAAA,EAAG,CAAC,CAAA;AAEJ,IAAA,OAAO;AAAA,MACN,KAAA,EAAO,MAAA,EAAQ,eAAA;AAAA,MACf;AAAA,IACD,CAAA;AAAA,EACD,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAA,GAAM;AACf,IAAA,OAAO,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,KAAA;AAAA,EACpB,CAAC,CAAA;AACH;ADPA;AACE;AACF,kDAAC","file":"/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/search/reRankSearchResults.cjs","sourcesContent":[null,"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"]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
declare function reRankSearchResults<T extends {
|
|
2
|
-
key: string;
|
|
3
|
-
}>(searchResults: Array<{
|
|
4
|
-
score: number;
|
|
5
|
-
item: T;
|
|
6
|
-
}>, additionalFactors: Record<string, Record<string, number>>): Array<{
|
|
7
|
-
score: number;
|
|
8
|
-
item: T;
|
|
9
|
-
}>;
|
|
10
|
-
|
|
11
|
-
export { reRankSearchResults };
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// src/search/reRankSearchResults.ts
|
|
2
|
-
function reRankSearchResults(searchResults, additionalFactors) {
|
|
3
|
-
return searchResults.map(({ score, item }) => {
|
|
4
|
-
const additionalScore = Object.entries(additionalFactors).reduce((acc, [_, factorScores]) => {
|
|
5
|
-
const factorScore = factorScores[item.key];
|
|
6
|
-
if (factorScore) {
|
|
7
|
-
return acc + factorScore;
|
|
8
|
-
}
|
|
9
|
-
return acc;
|
|
10
|
-
}, 0);
|
|
11
|
-
return {
|
|
12
|
-
score: score + additionalScore,
|
|
13
|
-
item
|
|
14
|
-
};
|
|
15
|
-
}).sort((a, b) => {
|
|
16
|
-
return b.score - a.score;
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
export {
|
|
20
|
-
reRankSearchResults
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=reRankSearchResults.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"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":";AAAO,SAAS,oBACf,eACA,mBACoC;AACpC,SAAO,cACL,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM;AAGzB,UAAM,kBAAkB,OAAO,QAAQ,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,MAAM;AAC5F,YAAM,cAAc,aAAa,KAAK,GAAG;AACzC,UAAI,aAAa;AAChB,eAAO,MAAM;AAAA,MACd;AAEA,aAAO;AAAA,IACR,GAAG,CAAC;AAEJ,WAAO;AAAA,MACN,OAAO,QAAQ;AAAA,MACf;AAAA,IACD;AAAA,EACD,CAAC,EACA,KAAK,CAAC,GAAG,MAAM;AACf,WAAO,EAAE,QAAQ,EAAE;AAAA,EACpB,CAAC;AACH;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/search/sublimeSearch.cjs","../../src/search/sublimeSearch.ts"],"names":[],"mappings":"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","file":"/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/search/sublimeSearch.cjs","sourcesContent":[null,"/*\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 = -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\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: readonly T[],\n\tkeys: Array<{ key: string; weight: number }> = DEFAULT_KEYS,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\tresult: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!result && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && result && outScore > result.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\n\t}, []);\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
declare const DEFAULT_KEYS: {
|
|
2
|
-
key: string;
|
|
3
|
-
weight: number;
|
|
4
|
-
}[];
|
|
5
|
-
declare function sublimeSearch<T extends object>(filter: string, data: readonly T[], keys?: Array<{
|
|
6
|
-
key: string;
|
|
7
|
-
weight: number;
|
|
8
|
-
}>): Array<{
|
|
9
|
-
score: number;
|
|
10
|
-
item: T;
|
|
11
|
-
}>;
|
|
12
|
-
|
|
13
|
-
export { DEFAULT_KEYS, sublimeSearch };
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
// src/search/sublimeSearch.ts
|
|
2
|
-
var SEQUENTIAL_BONUS = 60;
|
|
3
|
-
var SEPARATOR_BONUS = 38;
|
|
4
|
-
var CAMEL_BONUS = 30;
|
|
5
|
-
var FIRST_LETTER_BONUS = 15;
|
|
6
|
-
var LEADING_LETTER_PENALTY = -20;
|
|
7
|
-
var MAX_LEADING_LETTER_PENALTY = -200;
|
|
8
|
-
var UNMATCHED_LETTER_PENALTY = -5;
|
|
9
|
-
var DEFAULT_KEYS = [
|
|
10
|
-
{ key: "properties.displayName", weight: 1.3 },
|
|
11
|
-
{ key: "properties.codex.alias", weight: 1 }
|
|
12
|
-
];
|
|
13
|
-
function fuzzyMatchSimple(pattern, target) {
|
|
14
|
-
let patternIdx = 0;
|
|
15
|
-
let strIdx = 0;
|
|
16
|
-
while (patternIdx < pattern.length && strIdx < target.length) {
|
|
17
|
-
const patternChar = pattern.charAt(patternIdx).toLowerCase();
|
|
18
|
-
const targetChar = target.charAt(strIdx).toLowerCase();
|
|
19
|
-
if (patternChar === targetChar) {
|
|
20
|
-
patternIdx++;
|
|
21
|
-
}
|
|
22
|
-
++strIdx;
|
|
23
|
-
}
|
|
24
|
-
return pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;
|
|
25
|
-
}
|
|
26
|
-
function fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex, targetMatches, matches, maxMatches, nextMatch, recursionCount, recursionLimit) {
|
|
27
|
-
let outScore = 0;
|
|
28
|
-
if (++recursionCount >= recursionLimit) {
|
|
29
|
-
return { matched: false, outScore };
|
|
30
|
-
}
|
|
31
|
-
if (patternCurIndex === pattern.length || targetCurrIndex === target.length) {
|
|
32
|
-
return { matched: false, outScore };
|
|
33
|
-
}
|
|
34
|
-
let recursiveMatch = false;
|
|
35
|
-
let bestRecursiveMatches = [];
|
|
36
|
-
let bestRecursiveScore = 0;
|
|
37
|
-
let firstMatch = true;
|
|
38
|
-
while (patternCurIndex < pattern.length && targetCurrIndex < target.length) {
|
|
39
|
-
if (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {
|
|
40
|
-
if (nextMatch >= maxMatches) {
|
|
41
|
-
return { matched: false, outScore };
|
|
42
|
-
}
|
|
43
|
-
if (firstMatch && targetMatches) {
|
|
44
|
-
matches = [...targetMatches];
|
|
45
|
-
firstMatch = false;
|
|
46
|
-
}
|
|
47
|
-
const recursiveMatches = [];
|
|
48
|
-
const recursiveResult = fuzzyMatchRecursive(
|
|
49
|
-
pattern,
|
|
50
|
-
target,
|
|
51
|
-
patternCurIndex,
|
|
52
|
-
targetCurrIndex + 1,
|
|
53
|
-
matches,
|
|
54
|
-
recursiveMatches,
|
|
55
|
-
maxMatches,
|
|
56
|
-
nextMatch,
|
|
57
|
-
recursionCount,
|
|
58
|
-
recursionLimit
|
|
59
|
-
);
|
|
60
|
-
const recursiveScore = recursiveResult.outScore;
|
|
61
|
-
if (recursiveResult.matched) {
|
|
62
|
-
if (!recursiveMatch || recursiveScore > bestRecursiveScore) {
|
|
63
|
-
bestRecursiveMatches = [...recursiveMatches];
|
|
64
|
-
bestRecursiveScore = recursiveScore;
|
|
65
|
-
}
|
|
66
|
-
recursiveMatch = true;
|
|
67
|
-
}
|
|
68
|
-
matches[nextMatch++] = targetCurrIndex;
|
|
69
|
-
++patternCurIndex;
|
|
70
|
-
}
|
|
71
|
-
++targetCurrIndex;
|
|
72
|
-
}
|
|
73
|
-
const matched = patternCurIndex === pattern.length;
|
|
74
|
-
if (matched) {
|
|
75
|
-
outScore = 100;
|
|
76
|
-
if (!target.toLowerCase().startsWith("n8n")) {
|
|
77
|
-
let penalty = LEADING_LETTER_PENALTY * matches[0];
|
|
78
|
-
penalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;
|
|
79
|
-
outScore += penalty;
|
|
80
|
-
}
|
|
81
|
-
const unmatched = target.length - nextMatch;
|
|
82
|
-
outScore += UNMATCHED_LETTER_PENALTY * unmatched;
|
|
83
|
-
for (let i = 0; i < nextMatch; i++) {
|
|
84
|
-
const currIdx = matches[i];
|
|
85
|
-
if (i > 0) {
|
|
86
|
-
const prevIdx = matches[i - 1];
|
|
87
|
-
if (currIdx === prevIdx + 1) {
|
|
88
|
-
outScore += SEQUENTIAL_BONUS;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (currIdx > 0) {
|
|
92
|
-
const neighbor = target[currIdx - 1];
|
|
93
|
-
const curr = target[currIdx];
|
|
94
|
-
if (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {
|
|
95
|
-
outScore += CAMEL_BONUS;
|
|
96
|
-
}
|
|
97
|
-
const isNeighbourSeparator = neighbor === "_" || neighbor === " ";
|
|
98
|
-
if (isNeighbourSeparator) {
|
|
99
|
-
outScore += SEPARATOR_BONUS;
|
|
100
|
-
}
|
|
101
|
-
} else {
|
|
102
|
-
outScore += FIRST_LETTER_BONUS;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
if (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {
|
|
106
|
-
matches = [...bestRecursiveMatches];
|
|
107
|
-
outScore = bestRecursiveScore;
|
|
108
|
-
return { matched: true, outScore };
|
|
109
|
-
} else if (matched) {
|
|
110
|
-
return { matched: true, outScore };
|
|
111
|
-
} else {
|
|
112
|
-
return { matched: false, outScore };
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return { matched: false, outScore };
|
|
116
|
-
}
|
|
117
|
-
function fuzzyMatch(pattern, target) {
|
|
118
|
-
const recursionCount = 0;
|
|
119
|
-
const recursionLimit = 5;
|
|
120
|
-
const matches = [];
|
|
121
|
-
const maxMatches = 256;
|
|
122
|
-
return fuzzyMatchRecursive(
|
|
123
|
-
pattern,
|
|
124
|
-
target,
|
|
125
|
-
0,
|
|
126
|
-
0,
|
|
127
|
-
null,
|
|
128
|
-
matches,
|
|
129
|
-
maxMatches,
|
|
130
|
-
0,
|
|
131
|
-
recursionCount,
|
|
132
|
-
recursionLimit
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
function getValue(obj, prop) {
|
|
136
|
-
if (obj.hasOwnProperty(prop)) {
|
|
137
|
-
return obj[prop];
|
|
138
|
-
}
|
|
139
|
-
const segments = prop.split(".");
|
|
140
|
-
let result = obj;
|
|
141
|
-
let i = 0;
|
|
142
|
-
while (result && i < segments.length) {
|
|
143
|
-
const key = segments[i];
|
|
144
|
-
result = result[key];
|
|
145
|
-
i++;
|
|
146
|
-
}
|
|
147
|
-
return result;
|
|
148
|
-
}
|
|
149
|
-
function sublimeSearch(filter, data, keys = DEFAULT_KEYS) {
|
|
150
|
-
const results = data.reduce((accu, item) => {
|
|
151
|
-
let values = [];
|
|
152
|
-
keys.forEach(({ key, weight }) => {
|
|
153
|
-
const value = getValue(item, key);
|
|
154
|
-
if (Array.isArray(value)) {
|
|
155
|
-
values = values.concat(value.map((v) => ({ value: v, weight })));
|
|
156
|
-
} else if (typeof value === "string") {
|
|
157
|
-
values.push({
|
|
158
|
-
value,
|
|
159
|
-
weight
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
const itemMatch = values.reduce(
|
|
164
|
-
(result, { value, weight }) => {
|
|
165
|
-
if (!fuzzyMatchSimple(filter, value)) {
|
|
166
|
-
return result;
|
|
167
|
-
}
|
|
168
|
-
const match = fuzzyMatch(filter, value);
|
|
169
|
-
match.outScore *= weight;
|
|
170
|
-
const { matched, outScore } = match;
|
|
171
|
-
if (!result && matched) {
|
|
172
|
-
return match;
|
|
173
|
-
}
|
|
174
|
-
if (matched && result && outScore > result.outScore) {
|
|
175
|
-
return match;
|
|
176
|
-
}
|
|
177
|
-
return result;
|
|
178
|
-
},
|
|
179
|
-
null
|
|
180
|
-
);
|
|
181
|
-
if (itemMatch) {
|
|
182
|
-
accu.push({
|
|
183
|
-
score: itemMatch.outScore,
|
|
184
|
-
item
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
return accu;
|
|
188
|
-
}, []);
|
|
189
|
-
results.sort((a, b) => {
|
|
190
|
-
return b.score - a.score;
|
|
191
|
-
});
|
|
192
|
-
return results;
|
|
193
|
-
}
|
|
194
|
-
export {
|
|
195
|
-
DEFAULT_KEYS,
|
|
196
|
-
sublimeSearch
|
|
197
|
-
};
|
|
198
|
-
//# sourceMappingURL=sublimeSearch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"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 = -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\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: readonly T[],\n\tkeys: Array<{ key: string; weight: number }> = DEFAULT_KEYS,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\tresult: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!result && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && result && outScore > result.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\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,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,cAAc;AACpB,IAAM,qBAAqB;AAE3B,IAAM,yBAAyB;AAC/B,IAAM,6BAA6B;AACnC,IAAM,2BAA2B;AAE1B,IAAM,eAAe;AAAA,EAC3B,EAAE,KAAK,0BAA0B,QAAQ,IAAI;AAAA,EAC7C,EAAE,KAAK,0BAA0B,QAAQ,EAAE;AAC5C;AAOA,SAAS,iBAAiB,SAAiB,QAAyB;AACnE,MAAI,aAAa;AACjB,MAAI,SAAS;AAEb,SAAO,aAAa,QAAQ,UAAU,SAAS,OAAO,QAAQ;AAC7D,UAAM,cAAc,QAAQ,OAAO,UAAU,EAAE,YAAY;AAC3D,UAAM,aAAa,OAAO,OAAO,MAAM,EAAE,YAAY;AACrD,QAAI,gBAAgB,YAAY;AAC/B;AAAA,IACD;AACA,MAAE;AAAA,EACH;AAEA,SAAO,QAAQ,WAAW,KAAK,OAAO,WAAW,KAAK,eAAe,QAAQ;AAC9E;AAEA,SAAS,oBACR,SACA,QACA,iBACA,iBACA,eACA,SACA,YACA,WACA,gBACA,gBACyC;AACzC,MAAI,WAAW;AAGf,MAAI,EAAE,kBAAkB,gBAAgB;AACvC,WAAO,EAAE,SAAS,OAAO,SAAS;AAAA,EACnC;AAGA,MAAI,oBAAoB,QAAQ,UAAU,oBAAoB,OAAO,QAAQ;AAC5E,WAAO,EAAE,SAAS,OAAO,SAAS;AAAA,EACnC;AAGA,MAAI,iBAAiB;AACrB,MAAI,uBAAiC,CAAC;AACtC,MAAI,qBAAqB;AAGzB,MAAI,aAAa;AACjB,SAAO,kBAAkB,QAAQ,UAAU,kBAAkB,OAAO,QAAQ;AAE3E,QAAI,QAAQ,eAAe,EAAE,YAAY,MAAM,OAAO,eAAe,EAAE,YAAY,GAAG;AACrF,UAAI,aAAa,YAAY;AAC5B,eAAO,EAAE,SAAS,OAAO,SAAS;AAAA,MACnC;AAEA,UAAI,cAAc,eAAe;AAChC,kBAAU,CAAC,GAAG,aAAa;AAC3B,qBAAa;AAAA,MACd;AAEA,YAAM,mBAA6B,CAAC;AACpC,YAAM,kBAAkB;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA,YAAM,iBAAiB,gBAAgB;AACvC,UAAI,gBAAgB,SAAS;AAE5B,YAAI,CAAC,kBAAkB,iBAAiB,oBAAoB;AAC3D,iCAAuB,CAAC,GAAG,gBAAgB;AAC3C,+BAAqB;AAAA,QACtB;AACA,yBAAiB;AAAA,MAClB;AAEA,cAAQ,WAAW,IAAI;AACvB,QAAE;AAAA,IACH;AACA,MAAE;AAAA,EACH;AAEA,QAAM,UAAU,oBAAoB,QAAQ;AAE5C,MAAI,SAAS;AACZ,eAAW;AAGX,QAAI,CAAC,OAAO,YAAY,EAAE,WAAW,KAAK,GAAG;AAC5C,UAAI,UAAU,yBAAyB,QAAQ,CAAC;AAChD,gBAAU,UAAU,6BAA6B,6BAA6B;AAC9E,kBAAY;AAAA,IACb;AAGA,UAAM,YAAY,OAAO,SAAS;AAClC,gBAAY,2BAA2B;AAGvC,aAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AACnC,YAAM,UAAU,QAAQ,CAAC;AAEzB,UAAI,IAAI,GAAG;AACV,cAAM,UAAU,QAAQ,IAAI,CAAC;AAC7B,YAAI,YAAY,UAAU,GAAG;AAC5B,sBAAY;AAAA,QACb;AAAA,MACD;AAGA,UAAI,UAAU,GAAG;AAEhB,cAAM,WAAW,OAAO,UAAU,CAAC;AACnC,cAAM,OAAO,OAAO,OAAO;AAC3B,YAAI,aAAa,SAAS,YAAY,KAAK,SAAS,KAAK,YAAY,GAAG;AACvE,sBAAY;AAAA,QACb;AACA,cAAM,uBAAuB,aAAa,OAAO,aAAa;AAC9D,YAAI,sBAAsB;AACzB,sBAAY;AAAA,QACb;AAAA,MACD,OAAO;AAEN,oBAAY;AAAA,MACb;AAAA,IACD;AAGA,QAAI,mBAAmB,CAAC,WAAW,qBAAqB,WAAW;AAElE,gBAAU,CAAC,GAAG,oBAAoB;AAClC,iBAAW;AACX,aAAO,EAAE,SAAS,MAAM,SAAS;AAAA,IAClC,WAAW,SAAS;AAEnB,aAAO,EAAE,SAAS,MAAM,SAAS;AAAA,IAClC,OAAO;AACN,aAAO,EAAE,SAAS,OAAO,SAAS;AAAA,IACnC;AAAA,EACD;AACA,SAAO,EAAE,SAAS,OAAO,SAAS;AACnC;AASA,SAAS,WAAW,SAAiB,QAAwD;AAC5F,QAAM,iBAAiB;AACvB,QAAM,iBAAiB;AACvB,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAa;AAEnB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAKA,SAAS,SAA2B,KAAQ,MAAuB;AAClE,MAAI,IAAI,eAAe,IAAI,GAAG;AAC7B,WAAO,IAAI,IAAe;AAAA,EAC3B;AAEA,QAAM,WAAW,KAAK,MAAM,GAAG;AAE/B,MAAI,SAAS;AACb,MAAI,IAAI;AACR,SAAO,UAAU,IAAI,SAAS,QAAQ;AACrC,UAAM,MAAM,SAAS,CAAC;AACtB,aAAS,OAAO,GAAG;AACnB;AAAA,EACD;AACA,SAAO;AACR;AAEO,SAAS,cACf,QACA,MACA,OAA+C,cACX;AACpC,QAAM,UAAU,KAAK,OAAO,CAAC,MAAyC,SAAY;AACjF,QAAI,SAAmD,CAAC;AACxD,SAAK,QAAQ,CAAC,EAAE,KAAK,OAAO,MAAM;AACjC,YAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAI,MAAM,QAAQ,KAAK,GAAG;AAEzB,iBAAS,OAAO,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;AAAA,MAChE,WAAW,OAAO,UAAU,UAAU;AACrC,eAAO,KAAK;AAAA,UACX;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AAGD,UAAM,YAAY,OAAO;AAAA,MACxB,CACC,QACA,EAAE,OAAO,OAAO,MACZ;AACJ,YAAI,CAAC,iBAAiB,QAAQ,KAAK,GAAG;AACrC,iBAAO;AAAA,QACR;AAEA,cAAM,QAAQ,WAAW,QAAQ,KAAK;AACtC,cAAM,YAAY;AAElB,cAAM,EAAE,SAAS,SAAS,IAAI;AAC9B,YAAI,CAAC,UAAU,SAAS;AACvB,iBAAO;AAAA,QACR;AACA,YAAI,WAAW,UAAU,WAAW,OAAO,UAAU;AACpD,iBAAO;AAAA,QACR;AACA,eAAO;AAAA,MACR;AAAA,MACA;AAAA,IACD;AAEA,QAAI,WAAW;AACd,WAAK,KAAK;AAAA,QACT,OAAO,UAAU;AAAA,QACjB;AAAA,MACD,CAAC;AAAA,IACF;AAEA,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,UAAQ,KAAK,CAAC,GAAG,MAAM;AACtB,WAAO,EAAE,QAAQ,EAAE;AAAA,EACpB,CAAC;AAED,SAAO;AACR;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/sort/sortByProperty.cjs","../../src/sort/sortByProperty.ts"],"names":[],"mappings":"AAAA;ACAO,IAAM,eAAA,EAAiB,CAC7B,QAAA,EACA,GAAA,EACA,MAAA,EAAwB,KAAA,EAAA,GAExB,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAA,GAAM;AAClB,EAAA,MAAM,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,aAAA,CAAc,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,KAAA,CAAA,EAAW;AAAA,IAChF,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,EACd,CAAC,CAAA;AACD,EAAA,OAAO,MAAA,IAAU,MAAA,EAAQ,OAAA,EAAS,CAAC,MAAA;AACpC,CAAC,CAAA;ADHF;AACE;AACF,wCAAC","file":"/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/sort/sortByProperty.cjs","sourcesContent":[null,"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"]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// src/sort/sortByProperty.ts
|
|
2
|
-
var sortByProperty = (property, arr, order = "asc") => arr.sort((a, b) => {
|
|
3
|
-
const result = String(a[property]).localeCompare(String(b[property]), void 0, {
|
|
4
|
-
numeric: true,
|
|
5
|
-
sensitivity: "base"
|
|
6
|
-
});
|
|
7
|
-
return order === "asc" ? result : -result;
|
|
8
|
-
});
|
|
9
|
-
export {
|
|
10
|
-
sortByProperty
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=sortByProperty.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"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":";AAAO,IAAM,iBAAiB,CAC7B,UACA,KACA,QAAwB,UAExB,IAAI,KAAK,CAAC,GAAG,MAAM;AAClB,QAAM,SAAS,OAAO,EAAE,QAAQ,CAAC,EAAE,cAAc,OAAO,EAAE,QAAQ,CAAC,GAAG,QAAW;AAAA,IAChF,SAAS;AAAA,IACT,aAAa;AAAA,EACd,CAAC;AACD,SAAO,UAAU,QAAQ,SAAS,CAAC;AACpC,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/string/truncate.cjs","../../src/string/truncate.ts"],"names":[],"mappings":"AAAA;ACAO,IAAM,SAAA,EAAW,CAAC,IAAA,EAAc,OAAA,EAAS,EAAA,EAAA,GAC/C,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,MAAM,EAAA,EAAI,MAAA,EAAQ,IAAA;AAQjD,SAAS,kBAAA,CAAmB,IAAA,EAAc,SAAA,EAA2B;AAC3E,EAAA,MAAM,MAAA,EAAkB,CAAC,CAAA;AAEzB,EAAA,MAAM,UAAA,EAAY,IAAI,IAAA,CAAK,SAAA,CAAU,KAAA,CAAA,EAAW,EAAE,WAAA,EAAa,WAAW,CAAC,CAAA;AAE3E,EAAA,IAAA,CAAA,MAAW,EAAE,QAAQ,EAAA,GAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AAClD,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,EACnB;AAEA,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,IAAA;AAAA,EACR;AAEA,EAAA,MAAM,oBAAA,EAAsB,KAAA,CAAM,aAAA,CAAc,CAAC,EAAA,EAAA,GAAO,EAAA,CAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AACzE,EAAA,MAAM,cAAA,EAAgB,oBAAA,EAAsB,CAAA;AAC5C,EAAA,MAAM,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA;AAC1C,EAAA,MAAM,SAAA,EAAW,QAAA;AACjB,EAAA,MAAM,eAAA,EAAiB,QAAA,CAAS,MAAA;AAEhC,EAAA,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,EAAA,EAAI;AACzB,IAAA,MAAM,cAAA,EAAgB,KAAA,CAAM,OAAA,EAAS,UAAA,EAAY,cAAA;AACjD,IAAA,MAAM,oBAAA,EAAsB,aAAA;AAC5B,IAAA,MAAM,WAAA,EAAa,oBAAA,EAAsB,aAAA;AAEzC,IAAA,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AACnB,MAAA,OACC,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,CAAE,IAAA,CAAK,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,mBAAmB,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,IAE3F;AAAA,EACD;AAEA,EAAA,OACC,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,UAAA,EAAY,EAAA,EAAI,cAAc,CAAA,CAAE,IAAA,CAAK,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAE9F;ADjBA;AACE;AACA;AACF,6EAAC","file":"/home/runner/work/n8n/n8n/packages/@n8n/utils/dist/string/truncate.cjs","sourcesContent":[null,"export const truncate = (text: string, length = 30): string =>\n\ttext.length > length ? text.slice(0, length) + '...' : text;\n\n/**\n * Replace part of given text with ellipsis following the rules below:\n *\n * - Remove chars just before the last word, as long as the last word is under 15 chars\n * - Otherwise preserve the last 5 chars of the name and remove chars before that\n */\nexport function truncateBeforeLast(text: string, maxLength: number): string {\n\tconst chars: string[] = [];\n\n\tconst segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\n\tfor (const { segment } of segmenter.segment(text)) {\n\t\tchars.push(segment);\n\t}\n\n\tif (chars.length <= maxLength) {\n\t\treturn text;\n\t}\n\n\tconst lastWhitespaceIndex = chars.findLastIndex((ch) => ch.match(/^\\s+$/));\n\tconst lastWordIndex = lastWhitespaceIndex + 1;\n\tconst lastWord = chars.slice(lastWordIndex);\n\tconst ellipsis = '…';\n\tconst ellipsisLength = ellipsis.length;\n\n\tif (lastWord.length < 15) {\n\t\tconst charsToRemove = chars.length - maxLength + ellipsisLength;\n\t\tconst indexBeforeLastWord = lastWordIndex;\n\t\tconst keepLength = indexBeforeLastWord - charsToRemove;\n\n\t\tif (keepLength > 0) {\n\t\t\treturn (\n\t\t\t\tchars.slice(0, keepLength).join('') + ellipsis + chars.slice(indexBeforeLastWord).join('')\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\tchars.slice(0, maxLength - 5 - ellipsisLength).join('') + ellipsis + chars.slice(-5).join('')\n\t);\n}\n"]}
|
package/dist/string/truncate.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// src/string/truncate.ts
|
|
2
|
-
var truncate = (text, length = 30) => text.length > length ? text.slice(0, length) + "..." : text;
|
|
3
|
-
function truncateBeforeLast(text, maxLength) {
|
|
4
|
-
const chars = [];
|
|
5
|
-
const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
6
|
-
for (const { segment } of segmenter.segment(text)) {
|
|
7
|
-
chars.push(segment);
|
|
8
|
-
}
|
|
9
|
-
if (chars.length <= maxLength) {
|
|
10
|
-
return text;
|
|
11
|
-
}
|
|
12
|
-
const lastWhitespaceIndex = chars.findLastIndex((ch) => ch.match(/^\s+$/));
|
|
13
|
-
const lastWordIndex = lastWhitespaceIndex + 1;
|
|
14
|
-
const lastWord = chars.slice(lastWordIndex);
|
|
15
|
-
const ellipsis = "\u2026";
|
|
16
|
-
const ellipsisLength = ellipsis.length;
|
|
17
|
-
if (lastWord.length < 15) {
|
|
18
|
-
const charsToRemove = chars.length - maxLength + ellipsisLength;
|
|
19
|
-
const indexBeforeLastWord = lastWordIndex;
|
|
20
|
-
const keepLength = indexBeforeLastWord - charsToRemove;
|
|
21
|
-
if (keepLength > 0) {
|
|
22
|
-
return chars.slice(0, keepLength).join("") + ellipsis + chars.slice(indexBeforeLastWord).join("");
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return chars.slice(0, maxLength - 5 - ellipsisLength).join("") + ellipsis + chars.slice(-5).join("");
|
|
26
|
-
}
|
|
27
|
-
export {
|
|
28
|
-
truncate,
|
|
29
|
-
truncateBeforeLast
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=truncate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/string/truncate.ts"],"sourcesContent":["export const truncate = (text: string, length = 30): string =>\n\ttext.length > length ? text.slice(0, length) + '...' : text;\n\n/**\n * Replace part of given text with ellipsis following the rules below:\n *\n * - Remove chars just before the last word, as long as the last word is under 15 chars\n * - Otherwise preserve the last 5 chars of the name and remove chars before that\n */\nexport function truncateBeforeLast(text: string, maxLength: number): string {\n\tconst chars: string[] = [];\n\n\tconst segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\n\tfor (const { segment } of segmenter.segment(text)) {\n\t\tchars.push(segment);\n\t}\n\n\tif (chars.length <= maxLength) {\n\t\treturn text;\n\t}\n\n\tconst lastWhitespaceIndex = chars.findLastIndex((ch) => ch.match(/^\\s+$/));\n\tconst lastWordIndex = lastWhitespaceIndex + 1;\n\tconst lastWord = chars.slice(lastWordIndex);\n\tconst ellipsis = '…';\n\tconst ellipsisLength = ellipsis.length;\n\n\tif (lastWord.length < 15) {\n\t\tconst charsToRemove = chars.length - maxLength + ellipsisLength;\n\t\tconst indexBeforeLastWord = lastWordIndex;\n\t\tconst keepLength = indexBeforeLastWord - charsToRemove;\n\n\t\tif (keepLength > 0) {\n\t\t\treturn (\n\t\t\t\tchars.slice(0, keepLength).join('') + ellipsis + chars.slice(indexBeforeLastWord).join('')\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\tchars.slice(0, maxLength - 5 - ellipsisLength).join('') + ellipsis + chars.slice(-5).join('')\n\t);\n}\n"],"mappings":";AAAO,IAAM,WAAW,CAAC,MAAc,SAAS,OAC/C,KAAK,SAAS,SAAS,KAAK,MAAM,GAAG,MAAM,IAAI,QAAQ;AAQjD,SAAS,mBAAmB,MAAc,WAA2B;AAC3E,QAAM,QAAkB,CAAC;AAEzB,QAAM,YAAY,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,WAAW,CAAC;AAE3E,aAAW,EAAE,QAAQ,KAAK,UAAU,QAAQ,IAAI,GAAG;AAClD,UAAM,KAAK,OAAO;AAAA,EACnB;AAEA,MAAI,MAAM,UAAU,WAAW;AAC9B,WAAO;AAAA,EACR;AAEA,QAAM,sBAAsB,MAAM,cAAc,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC;AACzE,QAAM,gBAAgB,sBAAsB;AAC5C,QAAM,WAAW,MAAM,MAAM,aAAa;AAC1C,QAAM,WAAW;AACjB,QAAM,iBAAiB,SAAS;AAEhC,MAAI,SAAS,SAAS,IAAI;AACzB,UAAM,gBAAgB,MAAM,SAAS,YAAY;AACjD,UAAM,sBAAsB;AAC5B,UAAM,aAAa,sBAAsB;AAEzC,QAAI,aAAa,GAAG;AACnB,aACC,MAAM,MAAM,GAAG,UAAU,EAAE,KAAK,EAAE,IAAI,WAAW,MAAM,MAAM,mBAAmB,EAAE,KAAK,EAAE;AAAA,IAE3F;AAAA,EACD;AAEA,SACC,MAAM,MAAM,GAAG,YAAY,IAAI,cAAc,EAAE,KAAK,EAAE,IAAI,WAAW,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE;AAE9F;","names":[]}
|