@mtcute/dispatcher 0.16.0 → 0.16.7
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/README.md +2 -2
- package/cjs/callback-data-builder.d.ts +2 -2
- package/cjs/callback-data-builder.js +8 -6
- package/cjs/callback-data-builder.js.map +1 -1
- package/cjs/context/base.d.ts +2 -2
- package/cjs/context/base.js.map +1 -1
- package/cjs/context/business-message.d.ts +20 -19
- package/cjs/context/business-message.js +3 -3
- package/cjs/context/business-message.js.map +1 -1
- package/cjs/context/callback-query.d.ts +4 -3
- package/cjs/context/callback-query.js.map +1 -1
- package/cjs/context/chat-join-request.d.ts +2 -2
- package/cjs/context/chat-join-request.js.map +1 -1
- package/cjs/context/chosen-inline-result.d.ts +2 -2
- package/cjs/context/chosen-inline-result.js.map +1 -1
- package/cjs/context/inline-query.d.ts +4 -3
- package/cjs/context/inline-query.js.map +1 -1
- package/cjs/context/message.d.ts +6 -5
- package/cjs/context/message.js +3 -3
- package/cjs/context/message.js.map +1 -1
- package/cjs/context/parse.d.ts +5 -5
- package/cjs/context/parse.js +1 -2
- package/cjs/context/parse.js.map +1 -1
- package/cjs/context/pre-checkout-query.d.ts +2 -2
- package/cjs/context/pre-checkout-query.js.map +1 -1
- package/cjs/context/scene-transition.d.ts +1 -1
- package/cjs/context/scene-transition.js.map +1 -1
- package/cjs/dispatcher.d.ts +10 -9
- package/cjs/dispatcher.js +34 -31
- package/cjs/dispatcher.js.map +1 -1
- package/cjs/filters/bots.d.ts +15 -25
- package/cjs/filters/bots.js +36 -34
- package/cjs/filters/bots.js.map +1 -1
- package/cjs/filters/chat.d.ts +5 -5
- package/cjs/filters/chat.js +10 -9
- package/cjs/filters/chat.js.map +1 -1
- package/cjs/filters/group.d.ts +4 -4
- package/cjs/filters/group.js +3 -6
- package/cjs/filters/group.js.map +1 -1
- package/cjs/filters/index.js.map +1 -1
- package/cjs/filters/logic.d.ts +1 -1
- package/cjs/filters/logic.js +5 -7
- package/cjs/filters/logic.js.map +1 -1
- package/cjs/filters/message.d.ts +29 -146
- package/cjs/filters/message.js +84 -72
- package/cjs/filters/message.js.map +1 -1
- package/cjs/filters/state.d.ts +3 -3
- package/cjs/filters/state.js +5 -4
- package/cjs/filters/state.js.map +1 -1
- package/cjs/filters/text.d.ts +8 -8
- package/cjs/filters/text.js +27 -26
- package/cjs/filters/text.js.map +1 -1
- package/cjs/filters/types.d.ts +2 -2
- package/cjs/filters/types.js +0 -3
- package/cjs/filters/types.js.map +1 -1
- package/cjs/filters/updates.d.ts +2 -2
- package/cjs/filters/updates.js +7 -7
- package/cjs/filters/updates.js.map +1 -1
- package/cjs/filters/user.d.ts +4 -3
- package/cjs/filters/user.js +15 -16
- package/cjs/filters/user.js.map +1 -1
- package/cjs/handler.d.ts +5 -5
- package/cjs/handler.js.map +1 -1
- package/cjs/state/key.d.ts +3 -3
- package/cjs/state/key.js.map +1 -1
- package/cjs/state/provider.d.ts +2 -2
- package/cjs/state/provider.js.map +1 -1
- package/cjs/state/providers/memory.d.ts +4 -3
- package/cjs/state/providers/memory.js.map +1 -1
- package/cjs/state/providers/sqlite.d.ts +3 -3
- package/cjs/state/providers/sqlite.js.map +1 -1
- package/cjs/state/repository.d.ts +7 -7
- package/cjs/state/repository.js.map +1 -1
- package/cjs/state/service.d.ts +4 -3
- package/cjs/state/service.js.map +1 -1
- package/cjs/state/update-state.d.ts +1 -1
- package/cjs/state/update-state.js +3 -4
- package/cjs/state/update-state.js.map +1 -1
- package/cjs/wizard.d.ts +8 -7
- package/cjs/wizard.js +3 -1
- package/cjs/wizard.js.map +1 -1
- package/esm/callback-data-builder.d.ts +2 -2
- package/esm/callback-data-builder.js +8 -6
- package/esm/callback-data-builder.js.map +1 -1
- package/esm/context/base.d.ts +2 -2
- package/esm/context/base.js.map +1 -1
- package/esm/context/business-message.d.ts +20 -19
- package/esm/context/business-message.js +3 -3
- package/esm/context/business-message.js.map +1 -1
- package/esm/context/callback-query.d.ts +4 -3
- package/esm/context/callback-query.js.map +1 -1
- package/esm/context/chat-join-request.d.ts +2 -2
- package/esm/context/chat-join-request.js.map +1 -1
- package/esm/context/chosen-inline-result.d.ts +2 -2
- package/esm/context/chosen-inline-result.js.map +1 -1
- package/esm/context/inline-query.d.ts +4 -3
- package/esm/context/inline-query.js.map +1 -1
- package/esm/context/message.d.ts +6 -5
- package/esm/context/message.js +3 -3
- package/esm/context/message.js.map +1 -1
- package/esm/context/parse.d.ts +5 -5
- package/esm/context/parse.js.map +1 -1
- package/esm/context/pre-checkout-query.d.ts +2 -2
- package/esm/context/pre-checkout-query.js.map +1 -1
- package/esm/context/scene-transition.d.ts +1 -1
- package/esm/context/scene-transition.js.map +1 -1
- package/esm/dispatcher.d.ts +10 -9
- package/esm/dispatcher.js +35 -32
- package/esm/dispatcher.js.map +1 -1
- package/esm/filters/bots.d.ts +15 -25
- package/esm/filters/bots.js +32 -30
- package/esm/filters/bots.js.map +1 -1
- package/esm/filters/chat.d.ts +5 -5
- package/esm/filters/chat.js +8 -7
- package/esm/filters/chat.js.map +1 -1
- package/esm/filters/group.d.ts +4 -4
- package/esm/filters/group.js +1 -3
- package/esm/filters/group.js.map +1 -1
- package/esm/filters/index.js.map +1 -1
- package/esm/filters/logic.d.ts +1 -1
- package/esm/filters/logic.js +1 -3
- package/esm/filters/logic.js.map +1 -1
- package/esm/filters/message.d.ts +29 -146
- package/esm/filters/message.js +60 -48
- package/esm/filters/message.js.map +1 -1
- package/esm/filters/state.d.ts +3 -3
- package/esm/filters/state.js +3 -2
- package/esm/filters/state.js.map +1 -1
- package/esm/filters/text.d.ts +8 -8
- package/esm/filters/text.js +22 -20
- package/esm/filters/text.js.map +1 -1
- package/esm/filters/types.d.ts +2 -2
- package/esm/filters/types.js +0 -3
- package/esm/filters/types.js.map +1 -1
- package/esm/filters/updates.d.ts +2 -2
- package/esm/filters/updates.js +7 -7
- package/esm/filters/updates.js.map +1 -1
- package/esm/filters/user.d.ts +4 -3
- package/esm/filters/user.js +15 -16
- package/esm/filters/user.js.map +1 -1
- package/esm/handler.d.ts +5 -5
- package/esm/handler.js.map +1 -1
- package/esm/state/key.d.ts +3 -3
- package/esm/state/key.js.map +1 -1
- package/esm/state/provider.d.ts +2 -2
- package/esm/state/provider.js.map +1 -1
- package/esm/state/providers/memory.d.ts +4 -3
- package/esm/state/providers/memory.js.map +1 -1
- package/esm/state/providers/sqlite.d.ts +3 -3
- package/esm/state/providers/sqlite.js.map +1 -1
- package/esm/state/repository.d.ts +7 -7
- package/esm/state/repository.js.map +1 -1
- package/esm/state/service.d.ts +4 -3
- package/esm/state/service.js +1 -1
- package/esm/state/service.js.map +1 -1
- package/esm/state/update-state.d.ts +1 -1
- package/esm/state/update-state.js +3 -4
- package/esm/state/update-state.js.map +1 -1
- package/esm/wizard.d.ts +8 -7
- package/esm/wizard.js +3 -1
- package/esm/wizard.js.map +1 -1
- package/package.json +3 -3
package/cjs/filters/bots.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.deeplinkGroup = exports.deeplink = exports.startGroup = exports.start =
|
|
3
|
+
exports.deeplinkGroup = exports.deeplink = exports.startGroup = exports.start = void 0;
|
|
4
|
+
exports.command = command;
|
|
4
5
|
const chat_js_1 = require("./chat.js");
|
|
5
6
|
const logic_js_1 = require("./logic.js");
|
|
6
7
|
/**
|
|
@@ -19,11 +20,11 @@ const logic_js_1 = require("./logic.js");
|
|
|
19
20
|
* Can be `null` to disable prefixes altogether
|
|
20
21
|
* @param caseSensitive
|
|
21
22
|
*/
|
|
22
|
-
|
|
23
|
+
function command(commands, { prefixes = '/', caseSensitive = false, } = {}) {
|
|
23
24
|
if (!Array.isArray(commands))
|
|
24
25
|
commands = [commands];
|
|
25
26
|
if (!caseSensitive) {
|
|
26
|
-
commands = commands.map(
|
|
27
|
+
commands = commands.map(i => (typeof i === 'string' ? i.toLowerCase() : i));
|
|
27
28
|
}
|
|
28
29
|
const argumentsRe = /(["'])(.*?)(?<!\\)\1|(\S+)/g;
|
|
29
30
|
const unescapeRe = /\\(['"])/;
|
|
@@ -71,51 +72,52 @@ const command = (commands, { prefixes = '/', caseSensitive = false, } = {}) => {
|
|
|
71
72
|
return false;
|
|
72
73
|
};
|
|
73
74
|
return check;
|
|
74
|
-
}
|
|
75
|
-
exports.command = command;
|
|
75
|
+
}
|
|
76
76
|
/**
|
|
77
77
|
* Shorthand filter that matches /start commands sent to bot's
|
|
78
78
|
* private messages.
|
|
79
79
|
*/
|
|
80
|
-
exports.start = (0, logic_js_1.and)((0, chat_js_1.chat)('private'),
|
|
80
|
+
exports.start = (0, logic_js_1.and)((0, chat_js_1.chat)('private'), command('start'));
|
|
81
81
|
/**
|
|
82
82
|
* Shorthand filter that matches /start commands
|
|
83
83
|
* sent in groups (i.e. using `?startgroup` parameter).
|
|
84
84
|
*/
|
|
85
|
-
exports.startGroup = (0, logic_js_1.and)((0, logic_js_1.or)((0, chat_js_1.chat)('supergroup'), (0, chat_js_1.chat)('group')),
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
exports.startGroup = (0, logic_js_1.and)((0, logic_js_1.or)((0, chat_js_1.chat)('supergroup'), (0, chat_js_1.chat)('group')), command('start'));
|
|
86
|
+
function deeplinkBase(base) {
|
|
87
|
+
return (params) => {
|
|
88
|
+
if (!Array.isArray(params)) {
|
|
89
|
+
return (0, logic_js_1.and)(exports.start, (_msg) => {
|
|
90
|
+
const msg = _msg;
|
|
91
|
+
if (msg.command.length !== 2)
|
|
92
|
+
return false;
|
|
93
|
+
const p = msg.command[1];
|
|
94
|
+
if (typeof params === 'string' && p === params)
|
|
95
|
+
return true;
|
|
96
|
+
const m = p.match(params);
|
|
97
|
+
if (!m)
|
|
98
|
+
return false;
|
|
99
|
+
msg.command.push(...m.slice(1));
|
|
100
|
+
return true;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return (0, logic_js_1.and)(base, (_msg) => {
|
|
89
104
|
const msg = _msg;
|
|
90
105
|
if (msg.command.length !== 2)
|
|
91
106
|
return false;
|
|
92
107
|
const p = msg.command[1];
|
|
93
|
-
|
|
108
|
+
for (const param of params) {
|
|
109
|
+
if (typeof param === 'string' && p === param)
|
|
110
|
+
return true;
|
|
111
|
+
const m = p.match(param);
|
|
112
|
+
if (!m)
|
|
113
|
+
continue;
|
|
114
|
+
msg.command.push(...m.slice(1));
|
|
94
115
|
return true;
|
|
95
|
-
|
|
96
|
-
if (!m)
|
|
97
|
-
return false;
|
|
98
|
-
msg.command.push(...m.slice(1));
|
|
99
|
-
return true;
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return (0, logic_js_1.and)(base, (_msg) => {
|
|
103
|
-
const msg = _msg;
|
|
104
|
-
if (msg.command.length !== 2)
|
|
116
|
+
}
|
|
105
117
|
return false;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return true;
|
|
110
|
-
const m = p.match(param);
|
|
111
|
-
if (!m)
|
|
112
|
-
continue;
|
|
113
|
-
msg.command.push(...m.slice(1));
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
return false;
|
|
117
|
-
});
|
|
118
|
-
};
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
}
|
|
119
121
|
/**
|
|
120
122
|
* Filter for deep links (i.e. `/start <deeplink_parameter>`).
|
|
121
123
|
*
|
package/cjs/filters/bots.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bots.js","sourceRoot":"","sources":["../../../src/filters/bots.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaybeArray, MaybePromise, Message } from '@mtcute/core'\n\nimport { BusinessMessageContext } from '../context/business-message.js'\nimport { MessageContext } from '../context/message.js'\nimport { chat } from './chat.js'\nimport { and, or } from './logic.js'\nimport { UpdateFilter } from './types.js'\n\n/**\n * Filter messages that call the given command(s)..\n *\n * When a command matches, the match array is stored in a\n * type-safe extension field `.commmand` of the {@link Message} object.\n * First element is the command itself, then the arguments.\n *\n * If the matched command was a RegExp, the first element is the\n * command, then the groups from the command regex, then the arguments.\n *\n * @param commands Command(s) the filter should look for (w/out prefix)\n * @param prefixes\n * Prefix(es) the filter should look for (default: `/`).\n * Can be `null` to disable prefixes altogether\n * @param caseSensitive\n */\nexport const command = (\n commands: MaybeArray<string | RegExp>,\n {\n prefixes = '/',\n caseSensitive = false,\n }: {\n prefixes?: MaybeArray<string> | null\n caseSensitive?: boolean\n } = {},\n): UpdateFilter<MessageContext | BusinessMessageContext, { command: string[] }> => {\n if (!Array.isArray(commands)) commands = [commands]\n\n if (!caseSensitive) {\n commands = commands.map((i) => (typeof i === 'string' ? i.toLowerCase() : i))\n }\n\n const argumentsRe = /([\"'])(.*?)(?<!\\\\)\\1|(\\S+)/g\n const unescapeRe = /\\\\(['\"])/\n const commandsRe: RegExp[] = []\n commands.forEach((cmd) => {\n if (typeof cmd !== 'string') cmd = cmd.source\n\n commandsRe.push(new RegExp(`^(${cmd})(?:\\\\s|$|@([a-zA-Z0-9_]+?bot)(?:\\\\s|$))`, caseSensitive ? '' : 'i'))\n })\n\n if (prefixes === null) prefixes = []\n if (typeof prefixes === 'string') prefixes = [prefixes]\n\n const _prefixes = prefixes\n\n const check = (msg: MessageContext | BusinessMessageContext): MaybePromise<boolean> => {\n if (msg.isMessageGroup) return check(msg.messages[0])\n\n for (const pref of _prefixes) {\n if (!msg.text.startsWith(pref)) continue\n\n const withoutPrefix = msg.text.slice(pref.length)\n\n for (const regex of commandsRe) {\n const m = withoutPrefix.match(regex)\n if (!m) continue\n\n const lastGroup = m[m.length - 1]\n\n if (lastGroup) {\n const self = msg.client.storage.self.getCached()\n\n if (self && self.isBot && !self.usernames.includes(lastGroup)) {\n return false\n }\n }\n\n const match = m.slice(1, -1)\n if (!caseSensitive) match[0] = match[0].toLowerCase()\n\n // we use .replace to iterate over global regex, not to replace the text\n withoutPrefix.slice(m[0].length).replace(argumentsRe, ($0, $1, $2: string, $3: string) => {\n match.push(($2 || $3 || '').replace(unescapeRe, '$1'))\n\n return ''\n })\n ;(msg as MessageContext & { command: string[] }).command = match\n\n return true\n }\n }\n\n return false\n }\n\n return check\n}\n\n/**\n * Shorthand filter that matches /start commands sent to bot's\n * private messages.\n */\nexport const start = and(chat('private'), command('start'))\n\n/**\n * Shorthand filter that matches /start commands\n * sent in groups (i.e. using `?startgroup` parameter).\n */\nexport const startGroup = and(or(chat('supergroup'), chat('group')), command('start'))\n\nconst deeplinkBase =\n (base: UpdateFilter<MessageContext | BusinessMessageContext, { command: string[] }>) =>\n (\n params: MaybeArray<string | RegExp>,\n ): UpdateFilter<MessageContext | BusinessMessageContext, { command: string[] }> => {\n if (!Array.isArray(params)) {\n return and(start, (_msg: Message) => {\n const msg = _msg as Message & { command: string[] }\n\n if (msg.command.length !== 2) return false\n\n const p = msg.command[1]\n if (typeof params === 'string' && p === params) return true\n\n const m = p.match(params)\n if (!m) return false\n\n msg.command.push(...m.slice(1))\n\n return true\n })\n }\n\n return and(base, (_msg: Message) => {\n const msg = _msg as Message & { command: string[] }\n\n if (msg.command.length !== 2) return false\n\n const p = msg.command[1]\n\n for (const param of params) {\n if (typeof param === 'string' && p === param) return true\n\n const m = p.match(param)\n if (!m) continue\n\n msg.command.push(...m.slice(1))\n\n return true\n }\n\n return false\n })\n }\n\n/**\n * Filter for deep links (i.e. `/start <deeplink_parameter>`).\n *\n * If the parameter is a regex, groups are added to `msg.command`,\n * meaning that the first group is available in `msg.command[2]`.\n */\nexport const deeplink = deeplinkBase(start)\n\n/**\n * Filter for group deep links (i.e. `/start <deeplink_parameter>`).\n *\n * If the parameter is a regex, groups are added to `msg.command`,\n * meaning that the first group is available in `msg.command[2]`.\n */\nexport const deeplinkGroup = deeplinkBase(startGroup)\n"]}
|
|
1
|
+
{"version":3,"file":"bots.js","sourceRoot":"","sources":["../../../src/filters/bots.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Chat, MaybeArray, MaybePromise, Message } from '@mtcute/core'\n\nimport type { BusinessMessageContext } from '../context/business-message.js'\nimport type { MessageContext } from '../context/message.js'\n\nimport { chat } from './chat.js'\nimport { and, or } from './logic.js'\nimport type { Modify, UpdateFilter } from './types.js'\n\n/**\n * Filter messages that call the given command(s)..\n *\n * When a command matches, the match array is stored in a\n * type-safe extension field `.commmand` of the {@link Message} object.\n * First element is the command itself, then the arguments.\n *\n * If the matched command was a RegExp, the first element is the\n * command, then the groups from the command regex, then the arguments.\n *\n * @param commands Command(s) the filter should look for (w/out prefix)\n * @param prefixes\n * Prefix(es) the filter should look for (default: `/`).\n * Can be `null` to disable prefixes altogether\n * @param caseSensitive\n */\nexport function command(commands: MaybeArray<string | RegExp>, {\n prefixes = '/',\n caseSensitive = false,\n}: {\n prefixes?: MaybeArray<string> | null\n caseSensitive?: boolean\n} = {}): UpdateFilter<MessageContext | BusinessMessageContext, { command: string[] }> {\n if (!Array.isArray(commands)) commands = [commands]\n\n if (!caseSensitive) {\n commands = commands.map(i => (typeof i === 'string' ? i.toLowerCase() : i))\n }\n\n const argumentsRe = /([\"'])(.*?)(?<!\\\\)\\1|(\\S+)/g\n const unescapeRe = /\\\\(['\"])/\n const commandsRe: RegExp[] = []\n commands.forEach((cmd) => {\n if (typeof cmd !== 'string') cmd = cmd.source\n\n commandsRe.push(new RegExp(`^(${cmd})(?:\\\\s|$|@([a-zA-Z0-9_]+?bot)(?:\\\\s|$))`, caseSensitive ? '' : 'i'))\n })\n\n if (prefixes === null) prefixes = []\n if (typeof prefixes === 'string') prefixes = [prefixes]\n\n const _prefixes = prefixes\n\n const check = (msg: MessageContext | BusinessMessageContext): MaybePromise<boolean> => {\n if (msg.isMessageGroup) return check(msg.messages[0])\n\n for (const pref of _prefixes) {\n if (!msg.text.startsWith(pref)) continue\n\n const withoutPrefix = msg.text.slice(pref.length)\n\n for (const regex of commandsRe) {\n const m = withoutPrefix.match(regex)\n if (!m) continue\n\n const lastGroup = m[m.length - 1]\n\n if (lastGroup) {\n const self = msg.client.storage.self.getCached()\n\n if (self && self.isBot && !self.usernames.includes(lastGroup)) {\n return false\n }\n }\n\n const match = m.slice(1, -1)\n if (!caseSensitive) match[0] = match[0].toLowerCase()\n\n // we use .replace to iterate over global regex, not to replace the text\n withoutPrefix.slice(m[0].length).replace(argumentsRe, ($0, $1, $2: string, $3: string) => {\n match.push(($2 || $3 || '').replace(unescapeRe, '$1'))\n\n return ''\n })\n ;(msg as MessageContext & { command: string[] }).command = match\n\n return true\n }\n }\n\n return false\n }\n\n return check\n}\n\n/**\n * Shorthand filter that matches /start commands sent to bot's\n * private messages.\n */\nexport const start: UpdateFilter<\n MessageContext | BusinessMessageContext,\n {\n chat: Modify<Chat, {\n chatType: 'private'\n }>\n command: string[]\n }\n> = and(chat('private'), command('start'))\n\n/**\n * Shorthand filter that matches /start commands\n * sent in groups (i.e. using `?startgroup` parameter).\n */\nexport const startGroup: UpdateFilter<\n MessageContext | BusinessMessageContext,\n {\n chat: Modify<Chat, {\n chatType: 'group' | 'supergroup'\n }>\n command: string[]\n },\n never\n> = and(or(chat('supergroup'), chat('group')), command('start'))\n\nfunction deeplinkBase(base: UpdateFilter<MessageContext | BusinessMessageContext, { command: string[] }>) {\n return (\n params: MaybeArray<string | RegExp>,\n ): UpdateFilter<MessageContext | BusinessMessageContext, { command: string[] }> => {\n if (!Array.isArray(params)) {\n return and(start, (_msg: Message) => {\n const msg = _msg as Message & { command: string[] }\n\n if (msg.command.length !== 2) return false\n\n const p = msg.command[1]\n if (typeof params === 'string' && p === params) return true\n\n const m = p.match(params)\n if (!m) return false\n\n msg.command.push(...m.slice(1))\n\n return true\n })\n }\n\n return and(base, (_msg: Message) => {\n const msg = _msg as Message & { command: string[] }\n\n if (msg.command.length !== 2) return false\n\n const p = msg.command[1]\n\n for (const param of params) {\n if (typeof param === 'string' && p === param) return true\n\n const m = p.match(param)\n if (!m) continue\n\n msg.command.push(...m.slice(1))\n\n return true\n }\n\n return false\n })\n }\n}\n\n/**\n * Filter for deep links (i.e. `/start <deeplink_parameter>`).\n *\n * If the parameter is a regex, groups are added to `msg.command`,\n * meaning that the first group is available in `msg.command[2]`.\n */\nexport const deeplink: (params: MaybeArray<string | RegExp>) => UpdateFilter<\n MessageContext | BusinessMessageContext,\n { command: string[] }\n> = deeplinkBase(start)\n\n/**\n * Filter for group deep links (i.e. `/start <deeplink_parameter>`).\n *\n * If the parameter is a regex, groups are added to `msg.command`,\n * meaning that the first group is available in `msg.command[2]`.\n */\nexport const deeplinkGroup: (params: MaybeArray<string | RegExp>) => UpdateFilter<\n MessageContext | BusinessMessageContext,\n { command: string[] }\n> = deeplinkBase(startGroup)\n"]}
|
package/cjs/filters/chat.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { BotChatJoinRequestUpdate, BusinessMessage, Chat, ChatMemberUpdate, ChatType, DeleteBusinessMessageUpdate, HistoryReadUpdate, MaybeArray, Message, PollVoteUpdate, User, UserTypingUpdate } from '@mtcute/core';
|
|
2
|
-
import { UpdateContextDistributed } from '../context/base.js';
|
|
3
|
-
import { EmptyObject, Modify, UpdateFilter } from './types.js';
|
|
1
|
+
import type { BotChatJoinRequestUpdate, BusinessMessage, Chat, ChatMemberUpdate, ChatType, DeleteBusinessMessageUpdate, HistoryReadUpdate, MaybeArray, Message, PollVoteUpdate, User, UserTypingUpdate } from '@mtcute/core';
|
|
2
|
+
import type { UpdateContextDistributed } from '../context/base.js';
|
|
3
|
+
import type { EmptyObject, Modify, UpdateFilter } from './types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Filter updates by type of the chat where they happened
|
|
6
6
|
*/
|
|
7
|
-
export declare
|
|
7
|
+
export declare function chat<T extends ChatType, Obj extends {
|
|
8
8
|
chat: Chat;
|
|
9
|
-
}>(type: T)
|
|
9
|
+
}>(type: T): UpdateFilter<Obj, {
|
|
10
10
|
chat: Modify<Chat, {
|
|
11
11
|
chatType: T;
|
|
12
12
|
}>;
|
package/cjs/filters/chat.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.chatId =
|
|
3
|
+
exports.chatId = void 0;
|
|
4
|
+
exports.chat = chat;
|
|
4
5
|
/**
|
|
5
6
|
* Filter updates by type of the chat where they happened
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
function chat(type) {
|
|
9
|
+
return msg => msg.chat.chatType === type;
|
|
10
|
+
}
|
|
10
11
|
/**
|
|
11
12
|
* Filter updates by marked chat ID(s) or username(s)
|
|
12
13
|
*
|
|
@@ -36,8 +37,8 @@ const chatId = (id) => {
|
|
|
36
37
|
switch (upd._name) {
|
|
37
38
|
case 'poll_vote': {
|
|
38
39
|
const peer = upd.peer;
|
|
39
|
-
return peer.type === 'chat' && (indexId.has(peer.id)
|
|
40
|
-
Boolean(peer.usernames?.some(
|
|
40
|
+
return peer.type === 'chat' && (indexId.has(peer.id)
|
|
41
|
+
|| Boolean(peer.usernames?.some(u => indexUsername.has(u.username))));
|
|
41
42
|
}
|
|
42
43
|
case 'history_read':
|
|
43
44
|
case 'user_typing': {
|
|
@@ -46,9 +47,9 @@ const chatId = (id) => {
|
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
const chat = upd.chat;
|
|
49
|
-
return (matchSelf && chat.isSelf)
|
|
50
|
-
indexId.has(chat.id)
|
|
51
|
-
Boolean(chat.usernames?.some(
|
|
50
|
+
return (matchSelf && chat.isSelf)
|
|
51
|
+
|| indexId.has(chat.id)
|
|
52
|
+
|| Boolean(chat.usernames?.some(u => indexUsername.has(u.username)));
|
|
52
53
|
};
|
|
53
54
|
};
|
|
54
55
|
exports.chatId = chatId;
|
package/cjs/filters/chat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/filters/chat.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/filters/chat.ts"],"names":[],"mappings":";;;AAsBA,oBAcC;AAjBD;;GAEG;AACH,SAAgB,IAAI,CAAiD,IAAO;IAYxE,OAAO,GAAG,CAAC,EAAE,CACT,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAA;AAClC,CAAC;AAED;;;;;;;GAOG;AACI,MAAM,MAAM,GAkBf,CAAC,EAAE,EAAE,EAAE;IACP,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;IACvC,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IACjC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACd,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,GAAG,IAAI,CAAA;QACpB,CAAC;aAAM,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACJ,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzB,CAAC;IACL,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,EAAE,EAAE;QACX,QAAQ,GAAG,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;gBAErB,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;uBACjB,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACvE,CAAA;YACL,CAAC;YACD,KAAK,cAAc,CAAC;YACpB,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;gBAErB,OAAO,CAAC,SAAS,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC/F,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;QAErB,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;eAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;eACpB,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC1E,CAAC,CAAA;AACL,CAAC,CAAA;AA1DY,QAAA,MAAM,UA0DlB","sourcesContent":["import type {\n BotChatJoinRequestUpdate,\n BusinessMessage,\n Chat,\n ChatMemberUpdate,\n ChatType,\n DeleteBusinessMessageUpdate,\n HistoryReadUpdate,\n MaybeArray,\n Message,\n PollVoteUpdate,\n User,\n UserTypingUpdate,\n} from '@mtcute/core'\n\nimport type { UpdateContextDistributed } from '../context/base.js'\n\nimport type { EmptyObject, Modify, UpdateFilter } from './types.js'\n\n/**\n * Filter updates by type of the chat where they happened\n */\nexport function chat<T extends ChatType, Obj extends { chat: Chat }>(type: T): UpdateFilter<\n Obj,\n {\n chat: Modify<Chat, { chatType: T }>\n } & (Obj extends Message\n ? T extends 'private' | 'bot' | 'group'\n ? {\n sender: User\n }\n : EmptyObject\n : EmptyObject)\n> {\n return msg =>\n msg.chat.chatType === type\n}\n\n/**\n * Filter updates by marked chat ID(s) or username(s)\n *\n * Note that only some updates support filtering by username.\n *\n * For messages, this filter checks for chat where the message\n * was sent to, NOT the chat sender.\n */\nexport const chatId: {\n (id: MaybeArray<number>): UpdateFilter<UpdateContextDistributed<\n | Message\n | BusinessMessage\n | ChatMemberUpdate\n | PollVoteUpdate\n | BotChatJoinRequestUpdate\n >>\n (id: MaybeArray<number | string>): UpdateFilter<UpdateContextDistributed<\n | Message\n | BusinessMessage\n | ChatMemberUpdate\n | UserTypingUpdate\n | HistoryReadUpdate\n | PollVoteUpdate\n | BotChatJoinRequestUpdate\n | DeleteBusinessMessageUpdate\n >>\n} = (id) => {\n const indexId = new Set<number>()\n const indexUsername = new Set<string>()\n let matchSelf = false\n\n if (!Array.isArray(id)) id = [id]\n id.forEach((id) => {\n if (id === 'me' || id === 'self') {\n matchSelf = true\n } else if (typeof id === 'number') {\n indexId.add(id)\n } else {\n indexUsername.add(id)\n }\n })\n\n return (upd) => {\n switch (upd._name) {\n case 'poll_vote': {\n const peer = upd.peer\n\n return peer.type === 'chat' && (\n indexId.has(peer.id)\n || Boolean(peer.usernames?.some(u => indexUsername.has(u.username)))\n )\n }\n case 'history_read':\n case 'user_typing': {\n const id = upd.chatId\n\n return (matchSelf && id === upd.client.storage.self.getCached()?.userId) || indexId.has(id)\n }\n }\n\n const chat = upd.chat\n\n return (matchSelf && chat.isSelf)\n || indexId.has(chat.id)\n || Boolean(chat.usernames?.some(u => indexUsername.has(u.username)))\n }\n}\n"]}
|
package/cjs/filters/group.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Message } from '@mtcute/core';
|
|
2
|
-
import { BusinessMessageContext } from '../context/business-message.js';
|
|
3
|
-
import { MessageContext } from '../context/message.js';
|
|
4
|
-
import { Modify, UpdateFilter } from './types.js';
|
|
1
|
+
import type { Message } from '@mtcute/core';
|
|
2
|
+
import type { BusinessMessageContext } from '../context/business-message.js';
|
|
3
|
+
import type { MessageContext } from '../context/message.js';
|
|
4
|
+
import type { Modify, UpdateFilter } from './types.js';
|
|
5
5
|
/**
|
|
6
6
|
* For message groups, apply a filter to every message in the group.
|
|
7
7
|
* Filter will match if **all** messages match.
|
package/cjs/filters/group.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.every = every;
|
|
4
|
+
exports.some = some;
|
|
4
5
|
/**
|
|
5
6
|
* For message groups, apply a filter to every message in the group.
|
|
6
7
|
* Filter will match if **all** messages match.
|
|
@@ -33,7 +34,6 @@ function every(filter) {
|
|
|
33
34
|
return next();
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
|
-
exports.every = every;
|
|
37
37
|
/**
|
|
38
38
|
* For message groups, apply a filter to every message in the group.
|
|
39
39
|
* Filter will match if **any** message matches.
|
|
@@ -43,9 +43,7 @@ exports.every = every;
|
|
|
43
43
|
* @param filter
|
|
44
44
|
* @returns
|
|
45
45
|
*/
|
|
46
|
-
function some(
|
|
47
|
-
// eslint-disable-next-line
|
|
48
|
-
filter) {
|
|
46
|
+
function some(filter) {
|
|
49
47
|
return (ctx, state) => {
|
|
50
48
|
let i = 0;
|
|
51
49
|
const upds = ctx.messages;
|
|
@@ -68,5 +66,4 @@ filter) {
|
|
|
68
66
|
return next();
|
|
69
67
|
};
|
|
70
68
|
}
|
|
71
|
-
exports.some = some;
|
|
72
69
|
//# sourceMappingURL=group.js.map
|
package/cjs/filters/group.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../src/filters/group.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../src/filters/group.ts"],"names":[],"mappings":";;AAgBA,sBAkCC;AAWD,oBA6BC;AAnFD;;;;;;;;GAQG;AACH,SAAgB,KAAK,CACjB,MAAyC;IAQzC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA;QAEvB,MAAM,IAAI,GAAG,GAA0B,EAAE;YACrC,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAA;YAE1B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;YAEpC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAEtB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC;YAED,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;gBAC3B,IAAI,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAEpB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,IAAI,CAChB,MAAyC;IAGzC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA;QAEvB,MAAM,IAAI,GAAG,GAA0B,EAAE;YACrC,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAA;YAE3B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;YAEpC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,GAAG;oBAAE,OAAO,IAAI,CAAA;gBAEpB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC;YAED,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;gBAC3B,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAA;gBAElB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC","sourcesContent":["import type { MaybePromise, Message } from '@mtcute/core'\n\nimport type { BusinessMessageContext } from '../context/business-message.js'\nimport type { MessageContext } from '../context/message.js'\n\nimport type { Modify, UpdateFilter } from './types.js'\n\n/**\n * For message groups, apply a filter to every message in the group.\n * Filter will match if **all** messages match.\n *\n * > **Note**: This also applies type modification to every message in the group\n *\n * @param filter\n * @returns\n */\nexport function every<Mod, State extends object>(\n filter: UpdateFilter<Message, Mod, State>,\n): UpdateFilter<\n MessageContext | BusinessMessageContext,\n Mod & {\n messages: Modify<MessageContext | BusinessMessageContext, Mod>[]\n },\n State\n > {\n return (ctx, state) => {\n let i = 0\n const upds = ctx.messages\n const max = upds.length\n\n const next = (): MaybePromise<boolean> => {\n if (i === max) return true\n\n const res = filter(upds[i++], state)\n\n if (typeof res === 'boolean') {\n if (!res) return false\n\n return next()\n }\n\n return res.then((r: boolean) => {\n if (!r) return false\n\n return next()\n })\n }\n\n return next()\n }\n}\n\n/**\n * For message groups, apply a filter to every message in the group.\n * Filter will match if **any** message matches.\n *\n * > **Note**: This *does not* apply type modification to any message\n *\n * @param filter\n * @returns\n */\nexport function some<State extends object>(\n filter: UpdateFilter<Message, any, State>,\n // eslint-disable-next-line\n): UpdateFilter<MessageContext | BusinessMessageContext, {}, State> {\n return (ctx, state) => {\n let i = 0\n const upds = ctx.messages\n const max = upds.length\n\n const next = (): MaybePromise<boolean> => {\n if (i === max) return false\n\n const res = filter(upds[i++], state)\n\n if (typeof res === 'boolean') {\n if (res) return true\n\n return next()\n }\n\n return res.then((r: boolean) => {\n if (r) return true\n\n return next()\n })\n }\n\n return next()\n }\n}\n"]}
|
package/cjs/filters/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAsC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAsC;AAI7B,0BAAO","sourcesContent":["import * as filters from './bundle.js'\n\nimport UpdateFilter = filters.UpdateFilter\n\nexport { filters }\nexport type { UpdateFilter }\n"]}
|
package/cjs/filters/logic.d.ts
CHANGED
package/cjs/filters/logic.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
// ^^ will be looked into in MTQ-29
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.
|
|
3
|
+
exports.any = void 0;
|
|
4
|
+
exports.not = not;
|
|
5
|
+
exports.and = and;
|
|
6
|
+
exports.or = or;
|
|
6
7
|
/**
|
|
7
8
|
* Filter that matches any update
|
|
8
9
|
*/
|
|
@@ -25,10 +26,9 @@ function not(fn) {
|
|
|
25
26
|
const res = fn(upd, state);
|
|
26
27
|
if (typeof res === 'boolean')
|
|
27
28
|
return !res;
|
|
28
|
-
return res.then(
|
|
29
|
+
return res.then(r => !r);
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
|
-
exports.not = not;
|
|
32
32
|
/**
|
|
33
33
|
* Combine multiple filters by applying an AND logical
|
|
34
34
|
* operation between every one of them:
|
|
@@ -69,7 +69,6 @@ function and(...fns) {
|
|
|
69
69
|
return next();
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
-
exports.and = and;
|
|
73
72
|
/**
|
|
74
73
|
* Combine multiple filters by applying an OR logical
|
|
75
74
|
* operation between every one of them:
|
|
@@ -110,5 +109,4 @@ function or(...fns) {
|
|
|
110
109
|
return next();
|
|
111
110
|
};
|
|
112
111
|
}
|
|
113
|
-
exports.or = or;
|
|
114
112
|
//# sourceMappingURL=logic.js.map
|
package/cjs/filters/logic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../../../src/filters/logic.ts"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,mCAAmC;;;AAMnC;;GAEG;AACI,MAAM,GAAG,GAAsB,GAAG,EAAE,CAAC,IAAI,CAAA;AAAnC,QAAA,GAAG,OAAgC;AAEhD;;;;;;;;;;;GAWG;AACH,SAAgB,GAAG,CACf,EAAkC;IAElC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAE1B,IAAI,OAAO,GAAG,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAA;QAEzC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC,CAAA;AACL,CAAC;AAVD,kBAUC;AAyGD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,GAAG,CAAC,GAAG,GAAkC;IACrD,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QAEtB,MAAM,IAAI,GAAG,GAA0B,EAAE;YACrC,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAA;YAE1B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAEhC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAEtB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC;YAED,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;gBAC3B,IAAI,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAEpB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC;AAzBD,kBAyBC;AAuGD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,EAAE,CAAC,GAAG,GAAkC;IACpD,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QAEtB,MAAM,IAAI,GAAG,GAA0B,EAAE;YACrC,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAA;YAE3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAEhC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,GAAG;oBAAE,OAAO,IAAI,CAAA;gBAEpB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC;YAED,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;gBAC3B,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAA;gBAElB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC;AAzBD,gBAyBC","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n// ^^ will be looked into in MTQ-29\n\nimport { MaybePromise } from '@mtcute/core'\n\nimport { ExtractBaseMany, ExtractMod, Invert, UnionToIntersection, UpdateFilter } from './types.js'\n\n/**\n * Filter that matches any update\n */\nexport const any: UpdateFilter<any> = () => true\n\n/**\n * Invert a filter by applying a NOT logical operation:\n * `not(fn) = NOT fn`\n *\n * > **Note**: This also inverts type modification, i.e.\n * > if the base is `{ field: string | number | null }`\n * > and the modification is `{ field: string }`,\n * > then the negated filter will have\n * > inverted modification `{ field: number | null }`\n *\n * @param fn Filter to negate\n */\nexport function not<Base, Mod, State extends object>(\n fn: UpdateFilter<Base, Mod, State>,\n): UpdateFilter<Base, Invert<Base, Mod>, State> {\n return (upd, state) => {\n const res = fn(upd, state)\n\n if (typeof res === 'boolean') return !res\n\n return res.then((r) => !r)\n }\n}\n\n// i couldn't come up with proper types for these 😭\n// if you know how to do this better - PRs are welcome!\n\nexport function and<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n): UpdateFilter<Base1 & Base2, Mod1 & Mod2, State1 | State2>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n): UpdateFilter<Base1 & Base2 & Base3, Mod1 & Mod2 & Mod3, State1 | State2 | State3>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n): UpdateFilter<Base1 & Base2 & Base3 & Base4, Mod1 & Mod2 & Mod3 & Mod4, State1 | State2 | State3 | State4>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5,\n Mod1 & Mod2 & Mod3 & Mod4 & Mod5,\n State1 | State2 | State3 | State4 | State5\n>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n Base6,\n Mod6,\n State6 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n fn6: UpdateFilter<Base6, Mod6, State6>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5 & Base6,\n Mod1 & Mod2 & Mod3 & Mod4 & Mod5 & Mod6,\n State1 | State2 | State3 | State4 | State5 | State6\n>\nexport function and<Filters extends UpdateFilter<any, any>[]>(\n ...fns: Filters\n): UpdateFilter<ExtractBaseMany<Filters>, UnionToIntersection<ExtractMod<Filters[number]>>>\n\n/**\n * Combine multiple filters by applying an AND logical\n * operation between every one of them:\n * `and(fn1, fn2, ..., fnN) = fn1 AND fn2 AND ... AND fnN`\n *\n * > **Note**: This also combines type modifications, i.e.\n * > if the 1st has modification `{ field1: string }`\n * > and the 2nd has modification `{ field2: number }`,\n * > then the combined filter will have\n * > combined modification `{ field1: string, field2: number }`\n *\n * > **Note**: Due to TypeScript limitations (or more likely my lack of brain cells),\n * > state type is only correctly inferred for up to 6 filters.\n * > If you need more, either provide type explicitly (e.g. `filters.state<SomeState>(...)`),\n * > or combine multiple `and` calls.\n *\n * @param fns Filters to combine\n */\nexport function and(...fns: UpdateFilter<any, any, any>[]): UpdateFilter<any, any, any> {\n return (upd, state) => {\n let i = 0\n const max = fns.length\n\n const next = (): MaybePromise<boolean> => {\n if (i === max) return true\n\n const res = fns[i++](upd, state)\n\n if (typeof res === 'boolean') {\n if (!res) return false\n\n return next()\n }\n\n return res.then((r: boolean) => {\n if (!r) return false\n\n return next()\n })\n }\n\n return next()\n }\n}\n\nexport function or<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n): UpdateFilter<Base1 & Base2, Mod1 | Mod2, State1 | State2>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n): UpdateFilter<Base1 & Base2 & Base3, Mod1 | Mod2 | Mod3, State1 | State2 | State3>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n): UpdateFilter<Base1 & Base2 & Base3 & Base4, Mod1 | Mod2 | Mod3 | Mod4, State1 | State2 | State3 | State4>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5,\n Mod1 | Mod2 | Mod3 | Mod4 | Mod5,\n State1 | State2 | State3 | State4 | State5\n>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n Base6,\n Mod6,\n State6 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n fn6: UpdateFilter<Base6, Mod6, State6>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5 & Base6,\n Mod1 | Mod2 | Mod3 | Mod4 | Mod5 | Mod6,\n State1 | State2 | State3 | State4 | State5 | State6\n>\n\n/**\n * Combine multiple filters by applying an OR logical\n * operation between every one of them:\n * `or(fn1, fn2, ..., fnN) = fn1 OR fn2 OR ... OR fnN`\n *\n * > **Note**: This also combines type modifications in a union, i.e.\n * > if the 1st has modification `{ field1: string }`\n * > and the 2nd has modification `{ field2: number }`,\n * > then the combined filter will have\n * > modification `{ field1: string } | { field2: number }`.\n *\n * > **Note**: Due to TypeScript limitations (or more likely my lack of brain cells),\n * > state type is only correctly inferred for up to 6 filters.\n * > If you need more, either provide type explicitly (e.g. `filters.state<SomeState>(...)`),\n * > or combine multiple `and` calls.\n *\n * @param fns Filters to combine\n */\nexport function or(...fns: UpdateFilter<any, any, any>[]): UpdateFilter<any, any, any> {\n return (upd, state) => {\n let i = 0\n const max = fns.length\n\n const next = (): MaybePromise<boolean> => {\n if (i === max) return false\n\n const res = fns[i++](upd, state)\n\n if (typeof res === 'boolean') {\n if (res) return true\n\n return next()\n }\n\n return res.then((r: boolean) => {\n if (r) return true\n\n return next()\n })\n }\n\n return next()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../../../src/filters/logic.ts"],"names":[],"mappings":";;;AAqBA,kBAUC;AA2HD,kBAyBC;AAyHD,gBAyBC;AAjUD;;GAEG;AACI,MAAM,GAAG,GAAsB,GAAG,EAAE,CAAC,IAAI,CAAA;AAAnC,QAAA,GAAG,OAAgC;AAEhD;;;;;;;;;;;GAWG;AACH,SAAgB,GAAG,CACf,EAAkC;IAElC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAE1B,IAAI,OAAO,GAAG,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAA;QAEzC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC,CAAA;AACL,CAAC;AAyGD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,GAAG,CAAC,GAAG,GAAkC;IACrD,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QAEtB,MAAM,IAAI,GAAG,GAA0B,EAAE;YACrC,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAA;YAE1B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAEhC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAEtB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC;YAED,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;gBAC3B,IAAI,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAEpB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC;AAuGD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,EAAE,CAAC,GAAG,GAAkC;IACpD,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QAEtB,MAAM,IAAI,GAAG,GAA0B,EAAE;YACrC,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAA;YAE3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAEhC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,GAAG;oBAAE,OAAO,IAAI,CAAA;gBAEpB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC;YAED,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;gBAC3B,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAA;gBAElB,OAAO,IAAI,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC","sourcesContent":["import type { MaybePromise } from '@mtcute/core'\n\nimport type { ExtractBaseMany, ExtractMod, Invert, UnionToIntersection, UpdateFilter } from './types.js'\n\n/**\n * Filter that matches any update\n */\nexport const any: UpdateFilter<any> = () => true\n\n/**\n * Invert a filter by applying a NOT logical operation:\n * `not(fn) = NOT fn`\n *\n * > **Note**: This also inverts type modification, i.e.\n * > if the base is `{ field: string | number | null }`\n * > and the modification is `{ field: string }`,\n * > then the negated filter will have\n * > inverted modification `{ field: number | null }`\n *\n * @param fn Filter to negate\n */\nexport function not<Base, Mod, State extends object>(\n fn: UpdateFilter<Base, Mod, State>,\n): UpdateFilter<Base, Invert<Base, Mod>, State> {\n return (upd, state) => {\n const res = fn(upd, state)\n\n if (typeof res === 'boolean') return !res\n\n return res.then(r => !r)\n }\n}\n\n// i couldn't come up with proper types for these 😭\n// if you know how to do this better - PRs are welcome!\n\nexport function and<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n): UpdateFilter<Base1 & Base2, Mod1 & Mod2, State1 | State2>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n): UpdateFilter<Base1 & Base2 & Base3, Mod1 & Mod2 & Mod3, State1 | State2 | State3>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n): UpdateFilter<Base1 & Base2 & Base3 & Base4, Mod1 & Mod2 & Mod3 & Mod4, State1 | State2 | State3 | State4>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5,\n Mod1 & Mod2 & Mod3 & Mod4 & Mod5,\n State1 | State2 | State3 | State4 | State5\n>\nexport function and<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n Base6,\n Mod6,\n State6 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n fn6: UpdateFilter<Base6, Mod6, State6>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5 & Base6,\n Mod1 & Mod2 & Mod3 & Mod4 & Mod5 & Mod6,\n State1 | State2 | State3 | State4 | State5 | State6\n>\nexport function and<Filters extends UpdateFilter<any, any>[]>(\n ...fns: Filters\n): UpdateFilter<ExtractBaseMany<Filters>, UnionToIntersection<ExtractMod<Filters[number]>>>\n\n/**\n * Combine multiple filters by applying an AND logical\n * operation between every one of them:\n * `and(fn1, fn2, ..., fnN) = fn1 AND fn2 AND ... AND fnN`\n *\n * > **Note**: This also combines type modifications, i.e.\n * > if the 1st has modification `{ field1: string }`\n * > and the 2nd has modification `{ field2: number }`,\n * > then the combined filter will have\n * > combined modification `{ field1: string, field2: number }`\n *\n * > **Note**: Due to TypeScript limitations (or more likely my lack of brain cells),\n * > state type is only correctly inferred for up to 6 filters.\n * > If you need more, either provide type explicitly (e.g. `filters.state<SomeState>(...)`),\n * > or combine multiple `and` calls.\n *\n * @param fns Filters to combine\n */\nexport function and(...fns: UpdateFilter<any, any, any>[]): UpdateFilter<any, any, any> {\n return (upd, state) => {\n let i = 0\n const max = fns.length\n\n const next = (): MaybePromise<boolean> => {\n if (i === max) return true\n\n const res = fns[i++](upd, state)\n\n if (typeof res === 'boolean') {\n if (!res) return false\n\n return next()\n }\n\n return res.then((r: boolean) => {\n if (!r) return false\n\n return next()\n })\n }\n\n return next()\n }\n}\n\nexport function or<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n): UpdateFilter<Base1 & Base2, Mod1 | Mod2, State1 | State2>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n): UpdateFilter<Base1 & Base2 & Base3, Mod1 | Mod2 | Mod3, State1 | State2 | State3>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n): UpdateFilter<Base1 & Base2 & Base3 & Base4, Mod1 | Mod2 | Mod3 | Mod4, State1 | State2 | State3 | State4>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5,\n Mod1 | Mod2 | Mod3 | Mod4 | Mod5,\n State1 | State2 | State3 | State4 | State5\n>\n\nexport function or<\n Base1,\n Mod1,\n State1 extends object,\n Base2,\n Mod2,\n State2 extends object,\n Base3,\n Mod3,\n State3 extends object,\n Base4,\n Mod4,\n State4 extends object,\n Base5,\n Mod5,\n State5 extends object,\n Base6,\n Mod6,\n State6 extends object,\n>(\n fn1: UpdateFilter<Base1, Mod1, State1>,\n fn2: UpdateFilter<Base2, Mod2, State2>,\n fn3: UpdateFilter<Base3, Mod3, State3>,\n fn4: UpdateFilter<Base4, Mod4, State4>,\n fn5: UpdateFilter<Base5, Mod5, State5>,\n fn6: UpdateFilter<Base6, Mod6, State6>,\n): UpdateFilter<\n Base1 & Base2 & Base3 & Base4 & Base5 & Base6,\n Mod1 | Mod2 | Mod3 | Mod4 | Mod5 | Mod6,\n State1 | State2 | State3 | State4 | State5 | State6\n>\n\n/**\n * Combine multiple filters by applying an OR logical\n * operation between every one of them:\n * `or(fn1, fn2, ..., fnN) = fn1 OR fn2 OR ... OR fnN`\n *\n * > **Note**: This also combines type modifications in a union, i.e.\n * > if the 1st has modification `{ field1: string }`\n * > and the 2nd has modification `{ field2: number }`,\n * > then the combined filter will have\n * > modification `{ field1: string } | { field2: number }`.\n *\n * > **Note**: Due to TypeScript limitations (or more likely my lack of brain cells),\n * > state type is only correctly inferred for up to 6 filters.\n * > If you need more, either provide type explicitly (e.g. `filters.state<SomeState>(...)`),\n * > or combine multiple `and` calls.\n *\n * @param fns Filters to combine\n */\nexport function or(...fns: UpdateFilter<any, any, any>[]): UpdateFilter<any, any, any> {\n return (upd, state) => {\n let i = 0\n const max = fns.length\n\n const next = (): MaybePromise<boolean> => {\n if (i === max) return false\n\n const res = fns[i++](upd, state)\n\n if (typeof res === 'boolean') {\n if (res) return true\n\n return next()\n }\n\n return res.then((r: boolean) => {\n if (r) return true\n\n return next()\n })\n }\n\n return next()\n }\n}\n"]}
|