adnbn 0.0.39 → 0.0.41
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/browser/index.cjs +122 -76
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.mts +6 -1
- package/dist/browser/index.d.ts +6 -1
- package/dist/browser/index.js +120 -77
- package/dist/browser/index.js.map +1 -1
- package/dist/cli/index.cjs +39 -32
- package/dist/cli/index.cjs.map +1 -1
- package/dist/entry/command/index.cjs +24 -4
- package/dist/entry/command/index.cjs.map +1 -1
- package/dist/entry/command/index.js +24 -4
- package/dist/entry/command/index.js.map +1 -1
- package/dist/entry/service/index.cjs +77 -40
- package/dist/entry/service/index.cjs.map +1 -1
- package/dist/entry/service/index.js +77 -40
- package/dist/entry/service/index.js.map +1 -1
- package/dist/index.cjs +76 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +76 -39
- package/dist/index.js.map +1 -1
- package/dist/message/index.cjs +75 -37
- package/dist/message/index.cjs.map +1 -1
- package/dist/message/index.d.mts +12 -10
- package/dist/message/index.d.ts +12 -10
- package/dist/message/index.js +75 -38
- package/dist/message/index.js.map +1 -1
- package/dist/message/react.cjs +74 -37
- package/dist/message/react.cjs.map +1 -1
- package/dist/message/react.d.mts +2 -2
- package/dist/message/react.d.ts +2 -2
- package/dist/message/react.js +74 -37
- package/dist/message/react.js.map +1 -1
- package/dist/message-CXzpmlXD.d.mts +28 -0
- package/dist/message-CXzpmlXD.d.ts +28 -0
- package/dist/relay/index.cjs +73 -68
- package/dist/relay/index.cjs.map +1 -1
- package/dist/relay/index.d.mts +34 -20
- package/dist/relay/index.d.ts +34 -20
- package/dist/relay/index.js +72 -66
- package/dist/relay/index.js.map +1 -1
- package/dist/service/index.cjs +77 -40
- package/dist/service/index.cjs.map +1 -1
- package/dist/service/index.d.mts +2 -2
- package/dist/service/index.d.ts +2 -2
- package/dist/service/index.js +77 -40
- package/dist/service/index.js.map +1 -1
- package/dist/storage/index.cjs.map +1 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/react.cjs.map +1 -1
- package/dist/storage/react.js.map +1 -1
- package/package.json +6 -5
- package/types/client.d.ts +148 -125
- package/dist/message-DO3GF4T9.d.mts +0 -27
- package/dist/message-DO3GF4T9.d.ts +0 -27
|
@@ -7,6 +7,28 @@ var browser = () => {
|
|
|
7
7
|
return chrome;
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
+
// src/browser/utils.ts
|
|
11
|
+
function safeListener(listener) {
|
|
12
|
+
return (...args) => {
|
|
13
|
+
try {
|
|
14
|
+
const result = listener(...args);
|
|
15
|
+
if (result instanceof Promise) {
|
|
16
|
+
result.catch((err) => {
|
|
17
|
+
console.error("Listener async error:", err);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
} catch (err) {
|
|
22
|
+
console.error("Listener sync error:", err);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function handleListener(target, callback) {
|
|
27
|
+
const listener = safeListener(callback);
|
|
28
|
+
target.addListener(listener);
|
|
29
|
+
return () => target.removeListener(listener);
|
|
30
|
+
}
|
|
31
|
+
|
|
10
32
|
// src/browser/runtime.ts
|
|
11
33
|
var runtime = () => browser().runtime;
|
|
12
34
|
var getManifest = () => runtime().getManifest();
|
|
@@ -16,15 +38,13 @@ var isManifestVersion3 = () => getManifestVersion() === 3;
|
|
|
16
38
|
// src/browser/action.ts
|
|
17
39
|
var action = () => isManifestVersion3() ? browser().action : browser().browserAction;
|
|
18
40
|
var onActionClicked = (callback) => {
|
|
19
|
-
action().onClicked
|
|
20
|
-
return () => action().onClicked.removeListener(callback);
|
|
41
|
+
return handleListener(action().onClicked, callback);
|
|
21
42
|
};
|
|
22
43
|
|
|
23
44
|
// src/browser/command.ts
|
|
24
45
|
var commands = () => browser().commands;
|
|
25
46
|
var onCommand = (callback) => {
|
|
26
|
-
commands().onCommand
|
|
27
|
-
return () => commands().onCommand.removeListener(callback);
|
|
47
|
+
return handleListener(commands().onCommand, callback);
|
|
28
48
|
};
|
|
29
49
|
|
|
30
50
|
// src/types/locale.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/browser/browser.ts","../../../src/browser/runtime.ts","../../../src/browser/action.ts","../../../src/browser/command.ts","../../../src/types/locale.ts","../../../src/locale/providers/AbstractLocale.ts","../../../src/browser/i18n.ts","../../../src/locale/utils.ts","../../../src/main/env.ts","../../../src/locale/providers/NativeLocale.ts","../../../src/main/locale.ts","../../../src/entry/core/Builder.ts","../../../src/entry/command/resolvers/definition.ts","../../../src/types/command.ts","../../../src/entry/command/Builder.ts","../../../src/entry/command/index.ts"],"names":["Language","_","i18n","browser","Builder_default"],"mappings":"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","file":"index.cjs","sourcesContent":["export const browser = (): typeof chrome => {\n return chrome;\n}","import {browser} from \"./browser\";\nimport {ManifestVersion} from \"@typing/manifest\";\n\ntype Manifest = chrome.runtime.Manifest;\ntype PlatformInfo = chrome.runtime.PlatformInfo;\ntype ContextFilter = chrome.runtime.ContextFilter;\ntype ExtensionContext = chrome.runtime.ExtensionContext;\n\nconst runtime = () => browser().runtime;\n\nconst backgroundPaths = [\n '/_generated_background_page.view',\n];\n\nexport const getId = (): string => runtime().id;\n\nexport const getUrl = (path: string) => runtime().getURL(path);\n\nexport const getManifest = (): Manifest => runtime().getManifest();\n\nexport const getManifestVersion = (): ManifestVersion => getManifest().manifest_version;\n\nexport const getRuntimeContexts = (filter: ContextFilter) => new Promise<ExtensionContext[]>((resolve, reject) => {\n runtime().getContexts(filter, contexts => {\n try {\n throwRuntimeError();\n\n resolve(contexts);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getPlatformInfo = (): Promise<PlatformInfo> => new Promise<PlatformInfo>((resolve, reject) => {\n runtime().getPlatformInfo((platformInfo) => {\n try {\n throwRuntimeError();\n\n resolve(platformInfo);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const isManifestVersion3 = (): boolean => getManifestVersion() === 3;\n\nexport const isBackground = (): boolean => {\n if (!getId()) {\n return false;\n }\n\n const manifest = getManifest();\n\n if (!manifest.background) {\n return false;\n }\n\n if (manifest.manifest_version === 3) {\n return typeof window === \"undefined\";\n }\n\n return window !== undefined && backgroundPaths.includes(location.pathname);\n}\n\nexport const throwRuntimeError = (): void => {\n const error = runtime().lastError;\n\n if (error) {\n throw new Error(error.message);\n }\n}\n\nexport const onRuntimeInstalled = (callback: Parameters<typeof chrome.runtime.onInstalled.addListener>[0]): () => void => {\n runtime().onInstalled.addListener(callback);\n\n return () => runtime().onInstalled.removeListener(callback);\n}\n","import {getManifest, isManifestVersion3, throwRuntimeError} from \"./runtime\";\nimport {browser} from \"./browser\";\n\ntype BadgeBackgroundColorDetails = chrome.browserAction.BadgeBackgroundColorDetails;\ntype BadgeTextDetails = chrome.action.BadgeTextDetails;\ntype BrowserAction = typeof chrome.action;\n\nconst action = () => isManifestVersion3() ? browser().action : browser().browserAction;\n\nexport const setActionBadgeText = (tabId: number, text: string | number) => new Promise<void>((resolve, reject) => {\n const details: BadgeTextDetails = {text: text.toString(), tabId};\n\n action().setBadgeText(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const clearActionBadgeText = (tabId: number): Promise<void> => setActionBadgeText(tabId, '');\n\nexport const setActionBadgeBgColor = (tabId: number, color: BadgeBackgroundColorDetails['color']) => new Promise<void>((resolve, reject) => {\n const details: BadgeBackgroundColorDetails = {color, tabId};\n\n action().setBadgeBackgroundColor(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const setActionBadgeTextColor = async (\n tabId: number,\n color: BadgeBackgroundColorDetails['color']\n): Promise<void> => {\n if (!isManifestVersion3()) {\n return;\n }\n\n const root = action() as BrowserAction;\n\n await root.setBadgeTextColor({color, tabId});\n};\n\nexport const setActionIcon = (\n tabId: number,\n icon: string | Record<string, string>\n): Promise<void> => new Promise<void>((resolve, reject) => {\n action().setIcon({tabId, path: icon}, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getActionDefaultPopup = (): string => {\n const manifest = getManifest();\n\n return isManifestVersion3() ? manifest.action.default_popup : manifest.browser_action.default_popup;\n}\n\nexport const onActionClicked = (callback: Parameters<typeof chrome.action.onClicked.addListener>[0]): () => void => {\n action().onClicked.addListener(callback);\n\n return () => action().onClicked.removeListener(callback);\n}","import {browser} from \"./browser\";\nimport {throwRuntimeError} from \"@browser/runtime\";\n\ntype Command = chrome.commands.Command;\n\nconst commands = () => browser().commands;\n\nexport const isSupportCommands = (): boolean => !!commands;\n\nexport const getAllCommands = () => new Promise<Command[]>((resolve, reject) => {\n commands().getAll((commands) => {\n try {\n throwRuntimeError();\n\n resolve(commands);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const onCommand = (callback: Parameters<typeof chrome.commands.onCommand.addListener>[0]): () => void => {\n commands().onCommand.addListener(callback);\n\n return () => commands().onCommand.removeListener(callback);\n}\n","export enum Language {\n Arabic = 'ar',\n Amharic = 'am',\n Bulgarian = 'bg',\n Bengali = 'bn',\n Catalan = 'ca',\n Czech = 'cs',\n Danish = 'da',\n German = 'de',\n Greek = 'el',\n English = 'en',\n EnglishAustralia = 'en_AU',\n EnglishGreatBritain = 'en_GB',\n EnglishUSA = 'en_US',\n Spanish = 'es',\n SpanishLatinAmericaAndCaribbean = 'es_419',\n Estonian = 'et',\n Persian = 'fa',\n Finnish = 'fi',\n Filipino = 'fil',\n French = 'fr',\n Gujarati = 'gu',\n Hebrew = 'he',\n Hindi = 'hi',\n Croatian = 'hr',\n Hungarian = 'hu',\n Indonesian = 'id',\n Italian = 'it',\n Japanese = 'ja',\n Kannada = 'kn',\n Korean = 'ko',\n Lithuanian = 'lt',\n Latvian = 'lv',\n Malayalam = 'ml',\n Marathi = 'mr',\n Malay = 'ms',\n Dutch = 'nl',\n Norwegian = 'no',\n Polish = 'pl',\n PortugueseBrazil = 'pt_BR',\n PortuguesePortugal = 'pt_PT',\n Romanian = 'ro',\n Russian = 'ru',\n Slovak = 'sk',\n Slovenian = 'sl',\n Serbian = 'sr',\n Swedish = 'sv',\n Swahili = 'sw',\n Tamil = 'ta',\n Telugu = 'te',\n Thai = 'th',\n Turkish = 'tr',\n Ukrainian = 'uk',\n Vietnamese = 'vi',\n ChineseChina = 'zh_CN',\n ChineseTaiwan = 'zh_TW',\n}\n\nexport enum LocaleDir {\n RightToLeft = 'rtl',\n LeftToRight = 'ltr',\n}\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([\n Language.Arabic,\n Language.Persian,\n Language.Hebrew,\n]);\n\nexport const LocaleNestedKeysSeparator = '.';\n\nexport const LocaleKeysSeparator = '_';\n\nexport const LocaleValuesSeparator = '|';\n\nexport const LocaleCustomKeyForLanguage = 'locale';\n\nexport const LocaleKeyMarker = '@';\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set(['yaml', 'yml', 'json']);\n\nexport const LocaleDirectoryName = 'locales';\n\nexport type LocaleValue = string | number | string[] | number[];\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport type LocaleFutures = {\n plural: boolean;\n substitutions: readonly string[];\n};\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\nexport type LocaleNonPluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: false } ? K : never }[keyof T] & string\n\nexport type LocalePluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: true } ? K : never }[keyof T] & string\n\nexport type LocaleSubstitutionsFor<\n T extends LocaleStructure,\n K extends keyof T\n> = T[K] extends { substitutions: readonly (infer U)[] }\n ? Partial<Record<U & string, string | number>>\n : never\n\nexport interface LocaleProvider<S extends LocaleStructure> {\n lang(): Language;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n}\n","import {\n Language,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleProvider,\n LocaleStructure,\n LocaleSubstitutionsFor,\n LocaleValuesSeparator\n} from \"@typing/locale\";\n\nexport default abstract class AbstractLocale<S extends LocaleStructure>\n implements LocaleProvider<S> {\n\n public abstract lang(): Language;\n\n public abstract keys(): Set<keyof S>;\n\n protected abstract value(key: keyof S & string): string | undefined;\n\n /**\n * Non-plural перевод\n */\n public trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n return this.get(key, substitutions);\n }\n\n /**\n * Plural-перевод\n */\n public choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const parts = this.get(key, substitutions).split(LocaleValuesSeparator);\n const idx = this.getPluralIndex(count);\n return parts[idx] ?? parts[0] ?? (key as string);\n }\n\n public get<K extends keyof S & string>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const template = this.value(key);\n\n if (template === undefined) {\n console.warn(`Locale key \"${key}\" not found in \"${this.lang()}\" language.`);\n return key as string;\n }\n\n if (substitutions) {\n return template.replace(/{{(.*?)}}/g, (_, placeholder: string) => {\n if (placeholder in substitutions) {\n return substitutions[placeholder]!.toString();\n }\n console.warn(\n `Locale substitution \"${placeholder}\" not found for key \"${key}\" in \"${this.lang()}\" language.`\n );\n return placeholder;\n });\n }\n\n return template;\n }\n\n private getPluralIndex(count: number): number {\n switch (this.lang()) {\n case Language.Indonesian:\n case Language.Japanese:\n case Language.Kannada:\n case Language.Korean:\n case Language.Malay:\n case Language.Thai:\n case Language.Turkish:\n case Language.Vietnamese:\n return 0;\n\n case Language.Bengali:\n case Language.Bulgarian:\n case Language.Catalan:\n case Language.Danish:\n case Language.German:\n case Language.Greek:\n case Language.English:\n case Language.EnglishAustralia:\n case Language.EnglishGreatBritain:\n case Language.EnglishUSA:\n case Language.Spanish:\n case Language.SpanishLatinAmericaAndCaribbean:\n case Language.Estonian:\n case Language.Persian:\n case Language.Finnish:\n case Language.Gujarati:\n case Language.Hebrew:\n case Language.Hungarian:\n case Language.Italian:\n case Language.Malayalam:\n case Language.Marathi:\n case Language.Dutch:\n case Language.Norwegian:\n case Language.Swedish:\n case Language.Swahili:\n case Language.Tamil:\n case Language.Telugu:\n case Language.ChineseChina:\n case Language.ChineseTaiwan:\n case Language.PortugueseBrazil:\n case Language.PortuguesePortugal:\n return (count == 1) ? 0 : 1;\n\n case Language.Amharic:\n case Language.Filipino:\n case Language.French:\n case Language.Hindi:\n return ((count == 0) || (count == 1)) ? 0 : 1;\n\n case Language.Croatian:\n case Language.Russian:\n case Language.Serbian:\n case Language.Ukrainian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Czech:\n case Language.Slovak:\n return (count == 1) ? 0 : (((count >= 2) && (count <= 4)) ? 1 : 2);\n\n case Language.Lithuanian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Slovenian:\n return (count % 100 == 1) ? 0 : ((count % 100 == 2) ? 1 : (((count % 100 == 3) || (count % 100 == 4)) ? 2 : 3));\n\n case Language.Latvian:\n return (count == 0) ? 0 : (((count % 10 == 1) && (count % 100 != 11)) ? 1 : 2);\n\n case Language.Polish:\n return (count == 1) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 12) || (count % 100 > 14))) ? 1 : 2);\n\n case Language.Romanian:\n return (count == 1) ? 0 : (((count == 0) || ((count % 100 > 0) && (count % 100 < 20))) ? 1 : 2);\n\n case Language.Arabic:\n return (count == 0) ? 0 : ((count == 1) ? 1 : ((count == 2) ? 2 : (((count % 100 >= 3) && (count % 100 <= 10)) ? 3 : (((count % 100 >= 11) && (count % 100 <= 99)) ? 4 : 5))));\n\n default:\n return 0;\n }\n }\n}\n\n","import {browser} from \"./browser\";\nimport {throwRuntimeError} from \"./runtime\";\n\ntype LanguageDetectionResult = chrome.i18n.LanguageDetectionResult\n\nconst i18n = () => browser().i18n;\n\nexport const canUseNativeI18nMessage = (): boolean => typeof (i18n().getMessage) !== \"undefined\";\n\nexport const getI18nMessage = (key: string): string | undefined => {\n if (!canUseNativeI18nMessage()) {\n return;\n }\n\n return i18n().getMessage(key);\n}\n\nexport const getI18nAcceptLanguages = (): Promise<string[]> => new Promise<string[]>((resolve, reject) => {\n i18n().getAcceptLanguages(locales => {\n try {\n throwRuntimeError();\n\n resolve(locales);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getI18nUILanguage = (): string | undefined => {\n const i18n = browser().i18n;\n\n if (!i18n['getUILanguage']) {\n return;\n }\n\n return i18n.getUILanguage();\n}\n\nexport const detectI18Language = (text: string): Promise<LanguageDetectionResult> => new Promise<LanguageDetectionResult>((resolve, reject) => {\n i18n().detectLanguage(text, result => {\n try {\n throwRuntimeError();\n\n resolve(result);\n } catch (e) {\n reject(e);\n }\n });\n});\n","import {Language, LocaleKeyMarker, LocaleKeysSeparator, LocaleNestedKeysSeparator} from \"@typing/locale\";\n\nexport const getLocaleFilename = (lang: Language): string => {\n return `_locales/${lang}/messages.json`;\n};\n\nexport const convertLocaleKey = (key: string): string => {\n return key.replaceAll(LocaleNestedKeysSeparator, LocaleKeysSeparator);\n}\n\nexport const convertLocaleMessageKey = (key: string): string => {\n return `__MSG_${convertLocaleKey(key)}__`;\n}\n\nexport const extractLocaleKey = (key?: string): string | undefined => {\n if (isLocaleKey(key)) {\n return key.substring(1);\n }\n}\n\nexport const isLocaleKey = (key?: string): key is string => {\n return key?.startsWith(LocaleKeyMarker) ?? false;\n}\n\nexport const modifyLocaleMessageKey = (key?: string): string | undefined => {\n if (typeof key !== \"string\") {\n return undefined;\n }\n\n const localeKey = extractLocaleKey(key);\n\n if (localeKey) {\n return convertLocaleMessageKey(localeKey);\n }\n\n return key;\n}\n\n","import {Browser} from \"@typing/browser\";\nimport {ManifestVersion} from \"@typing/manifest\";\n\nexport const getEnv: {\n <T extends string>(key: string): T | undefined;\n <T extends string, D>(key: string, defaults: D): T | D;\n} = (key: string, defaults?: string) => {\n const env = process.env;\n\n return (env[key] ?? defaults) as any;\n};\n\nexport const getApp = (): string => {\n const app = getEnv('APP');\n\n if (app === undefined) {\n throw new Error('App is not defined');\n }\n\n return app;\n};\n\nexport const getBrowser = (): Browser => {\n const browser = getEnv<Browser>('BROWSER');\n\n if (browser === undefined) {\n throw new Error('Browser is not defined');\n }\n\n return browser;\n}\n\nexport const isBrowser = (browser: Browser): browser is Browser => {\n return getBrowser() === browser;\n}\n\nexport const getManifestVersion = (): ManifestVersion => {\n const manifestVersion = getEnv('MANIFEST_VERSION', '3');\n\n return parseInt(manifestVersion) as ManifestVersion;\n}","import {getI18nMessage, getI18nUILanguage} from \"@browser/i18n\";\n\nimport AbstractLocale from \"./AbstractLocale\";\n\nimport {convertLocaleKey} from \"@locale/utils\";\nimport {isBrowser} from \"@main/env\";\n\nimport {Language, LanguageCodes, LocaleCustomKeyForLanguage, LocaleProvider, LocaleStructure} from \"@typing/locale\";\nimport {Browser} from \"@typing/browser\";\n\nexport interface LocaleNativeStructure extends LocaleStructure {\n}\n\nexport default class NativeLocale extends AbstractLocale<LocaleNativeStructure> {\n private static instance?: LocaleProvider<LocaleNativeStructure>;\n\n public static getInstance<S extends LocaleStructure = LocaleNativeStructure>(): LocaleProvider<S> {\n return NativeLocale.instance ??= new NativeLocale();\n }\n\n public lang(): Language {\n let lang: Language | undefined;\n\n /**\n * The Opera browser does not support RTL languages,\n * and for Opera you need to directly indicate what kind of language it is.\n * interface language is always different\n */\n if (isBrowser(Browser.Opera)) {\n lang = getI18nMessage(LocaleCustomKeyForLanguage) as Language;\n\n if (LanguageCodes.has(lang)) {\n return lang;\n }\n }\n\n lang = getI18nUILanguage() as Language;\n\n if (!lang) {\n throw new Error(\"Locale Native: Unable to get UI language\");\n }\n\n return lang;\n }\n\n\n public keys(): Set<keyof LocaleNativeStructure> {\n try {\n // @ts-expect-error\n return new Set<string>(LOCALE_KEYS);\n } catch (e) {\n console.error(\"Locale Native: Unable to get keys\", e);\n\n return new Set<string>();\n }\n }\n\n protected value(key: Extract<keyof LocaleNativeStructure, string>): string | undefined {\n const value = getI18nMessage(convertLocaleKey(key));\n\n if (!value || value.length === 0) {\n return undefined;\n }\n\n return value;\n }\n}","import {LocaleNativeStructure, NativeLocale} from \"@locale/providers\";\n\nimport {convertLocaleMessageKey, extractLocaleKey} from \"@locale/utils\";\n\nimport {\n Language,\n LanguageCodes,\n LocaleDir,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleSubstitutionsFor\n} from \"@typing/locale\";\n\nexport {Language, LanguageCodes, LocaleDir};\n\n/**\n * Translates a given locale key into the corresponding localized string.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, with substitutions applied if provided.\n */\nexport const _ = <K extends LocaleNonPluralKeys<LocaleNativeStructure>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().trans(key, substitutions);\n};\n\n/**\n * Translates a given locale key into the corresponding localized string\n * based on a specific count for pluralization.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {number} count - The count used to determine the pluralization form.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, adjusted for pluralization and with substitutions applied if provided.\n */\nexport const _c = <K extends LocalePluralKeys<LocaleNativeStructure>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().choice(key, count, substitutions);\n};\n\n/**\n * Converts a locale key into a standardized format and logs a warning if the key is not found\n * in the current language's locale keys.\n *\n * @param {Extract<keyof LocaleNativeStructure, string>} key - The locale key to be converted.\n * This key must be a string and exist within the `LocaleNativeStructure`.\n * @returns {string} - The converted locale message key.\n */\nexport const __ = (key: keyof LocaleNativeStructure & string): string => {\n const locale = NativeLocale.getInstance();\n\n if (!locale.keys().has(key)) {\n console.warn(`Locale key \"${key}\" not found in \"${locale.lang()}\" language.`);\n }\n\n return convertLocaleMessageKey(key);\n};\n\n\n/**\n * Attempts to extract a locale key from the provided string and translates it\n * into the corresponding localized string. If no locale key can be extracted,\n * the original string is returned.\n *\n * @param {string} input - The input string from which a locale key is to be extracted.\n * @returns {string} - The translated string if a locale key is successfully extracted,\n * or the original string if no locale key is found.\n */\nexport const __t = (input: string): string => {\n const localeKey = extractLocaleKey(input);\n\n if (localeKey) {\n return _(localeKey as LocaleNonPluralKeys<LocaleNativeStructure>);\n }\n\n return input;\n};","import {EntrypointBuilder, EntrypointBuilderClass} from \"@typing/entrypoint\";\n\nexport default abstract class implements EntrypointBuilder {\n public abstract build(): Promise<void>;\n\n public abstract destroy(): Promise<void>;\n\n public static resolver(this: new (definition: any) => EntrypointBuilder) {\n return (definition: EntrypointBuilderClass<typeof this>): void => {\n new this(definition).build().catch(e => {\n console.error('Failed to build entrypoint:', e);\n });\n };\n }\n}","import {CommandDefinition, CommandExecute} from \"@typing/command\";\n\nexport const isValidCommandDefinition = (definition: any): definition is CommandDefinition => {\n return definition && typeof definition === 'object' && definition.constructor === Object;\n}\n\nexport const isValidCommandExecuteFunction = (execute: any): execute is CommandExecute => {\n return execute && typeof execute === 'function';\n}\n\nexport const isValidCommandName = (name: any): name is string => {\n return name && typeof name === 'string' && name.trim().length > 0;\n}","import {Required} from \"utility-types\";\n\nimport {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {BackgroundConfig} from \"@typing/background\";\nimport {Awaiter} from \"@typing/helpers\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport const CommandExecuteActionName = '_execute_action';\n\nexport interface CommandConfig extends BackgroundConfig {\n name: string;\n description?: string;\n global?: boolean;\n defaultKey?: string;\n windowsKey?: string;\n macKey?: string;\n chromeosKey?: string;\n linuxKey?: string;\n}\n\nexport type CommandOptions = CommandConfig & EntrypointOptions;\n\nexport type CommandEntrypointOptions = Partial<CommandOptions>;\n\nexport type CommandExecute = (tab: Tab | undefined, options: CommandOptions) => Awaiter<void>;\n\nexport interface CommandDefinition extends CommandEntrypointOptions {\n execute: CommandExecute;\n}\n\nexport type ExecuteActionCommandDefinition = Omit<CommandDefinition, 'name'>;\n\nexport type CommandUnresolvedDefinition = Partial<CommandDefinition>;\n\nexport type CommandResolvedDefinition = Required<CommandDefinition, 'name' | 'execute'>;\n\nexport type CommandBuilder = EntrypointBuilder;","import {onActionClicked} from \"@browser/action\";\nimport {onCommand} from \"@browser/command\";\n\nimport {__t} from \"@main/locale\";\n\nimport Builder from \"@entry/core/Builder\";\n\nimport {isValidCommandExecuteFunction, isValidCommandName} from \"./resolvers\";\n\nimport {\n CommandBuilder,\n CommandExecuteActionName,\n CommandResolvedDefinition,\n CommandUnresolvedDefinition\n} from \"@typing/command\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport default class extends Builder implements CommandBuilder {\n protected readonly definition: CommandResolvedDefinition;\n\n protected unsubscribe?: () => void;\n\n public constructor(definition: CommandUnresolvedDefinition) {\n super();\n\n const {name, execute, description} = definition;\n\n if (!isValidCommandExecuteFunction(execute)) {\n throw new Error('The command entrypoint must export a execute function');\n }\n\n if (!isValidCommandName(name)) {\n throw new Error('The command entrypoint must export a name string');\n }\n\n this.definition = {\n ...definition,\n name,\n execute,\n description: description ? __t(description) : undefined,\n };\n }\n\n public async build(): Promise<void> {\n const {name} = this.definition;\n\n if (name == CommandExecuteActionName) {\n this.unsubscribe = onActionClicked((tab) => {\n this.handle(tab);\n });\n\n return;\n }\n\n this.unsubscribe = onCommand((command, tab) => {\n if (command === name) {\n this.handle(tab);\n }\n });\n }\n\n public async destroy(): Promise<void> {\n this.unsubscribe?.();\n }\n\n protected handle(tab?: Tab): void {\n const {name, execute, ...options} = this.definition;\n\n try {\n Promise.resolve(execute(tab, {name, ...options})).catch((e) => {\n console.error('The command execute async function crashed:', e);\n });\n } catch (e) {\n console.error('The command execute function crashed:', e);\n }\n }\n}","import Builder from \"./Builder\";\n\nexport * from \"./resolvers\";\n\nexport default Builder.resolver();"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/browser/browser.ts","../../../src/browser/utils.ts","../../../src/browser/runtime.ts","../../../src/browser/action.ts","../../../src/browser/command.ts","../../../src/types/locale.ts","../../../src/locale/providers/AbstractLocale.ts","../../../src/browser/i18n.ts","../../../src/locale/utils.ts","../../../src/main/env.ts","../../../src/locale/providers/NativeLocale.ts","../../../src/main/locale.ts","../../../src/entry/core/Builder.ts","../../../src/entry/command/resolvers/definition.ts","../../../src/types/command.ts","../../../src/entry/command/Builder.ts","../../../src/entry/command/index.ts"],"names":["Language","_","i18n","browser","Builder_default"],"mappings":"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","file":"index.cjs","sourcesContent":["export const browser = (): typeof chrome => {\n return chrome;\n}","type Event<T extends Function> = chrome.events.Event<T>\n\nexport function safeListener<T extends (...args: any[]) => any>(listener: T): T {\n return ((...args: Parameters<T>): ReturnType<T> | void => {\n try {\n const result = listener(...args);\n\n if (result instanceof Promise) {\n result.catch(err => {\n console.error('Listener async error:', err);\n });\n }\n\n return result;\n } catch (err) {\n console.error('Listener sync error:', err);\n }\n }) as T;\n}\n\nexport function handleListener<T extends (...args: any[]) => void>(\n target: Event<T>,\n callback: T,\n): () => void {\n const listener = safeListener(callback);\n\n target.addListener(listener);\n\n return () => target.removeListener(listener);\n}","import {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\n\nimport {ManifestVersion} from \"@typing/manifest\";\nimport {MessageBody, MessageDictionary, MessageResponse, MessageType} from \"@typing/message\";\n\ntype Manifest = chrome.runtime.Manifest;\ntype PlatformInfo = chrome.runtime.PlatformInfo;\ntype ContextFilter = chrome.runtime.ContextFilter;\ntype ExtensionContext = chrome.runtime.ExtensionContext;\n\nconst runtime = () => browser().runtime;\n\nconst backgroundPaths = [\n '/_generated_background_page.view',\n];\n\nexport const getId = (): string => runtime().id;\n\nexport const getUrl = (path: string) => runtime().getURL(path);\n\nexport const getManifest = (): Manifest => runtime().getManifest();\n\nexport const getManifestVersion = (): ManifestVersion => getManifest().manifest_version;\n\nexport const getRuntimeContexts = (filter: ContextFilter) => new Promise<ExtensionContext[]>((resolve, reject) => {\n runtime().getContexts(filter, contexts => {\n try {\n throwRuntimeError();\n\n resolve(contexts);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getPlatformInfo = (): Promise<PlatformInfo> => new Promise<PlatformInfo>((resolve, reject) => {\n runtime().getPlatformInfo((platformInfo) => {\n try {\n throwRuntimeError();\n\n resolve(platformInfo);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const isManifestVersion3 = (): boolean => getManifestVersion() === 3;\n\nexport const isBackground = (): boolean => {\n if (!getId()) {\n return false;\n }\n\n const manifest = getManifest();\n\n if (!manifest.background) {\n return false;\n }\n\n if (manifest.manifest_version === 3) {\n return typeof window === \"undefined\";\n }\n\n return window !== undefined && backgroundPaths.includes(location.pathname);\n}\n\nexport const throwRuntimeError = (): void => {\n const error = runtime().lastError;\n\n if (error) {\n throw new Error(error.message);\n }\n}\n\nexport const sendMessage = <\n T extends MessageDictionary,\n K extends MessageType<T>\n>(\n message: MessageBody<T, K>\n): Promise<MessageResponse<T, K>> => new Promise<MessageResponse<T, K>>((resolve, reject) => {\n runtime().sendMessage(message, (response) => {\n try {\n throwRuntimeError();\n\n resolve(response);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const onRuntimeInstalled = (callback: Parameters<typeof chrome.runtime.onInstalled.addListener>[0]): () => void => {\n return handleListener(runtime().onInstalled, callback)\n}\n\nexport const onMessage = (callback: Parameters<typeof chrome.runtime.onMessage.addListener>[0]): () => void => {\n return handleListener(runtime().onMessage, callback)\n}\n","import {getManifest, isManifestVersion3, throwRuntimeError} from \"./runtime\";\nimport {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\n\ntype BadgeBackgroundColorDetails = chrome.browserAction.BadgeBackgroundColorDetails;\ntype BadgeTextDetails = chrome.action.BadgeTextDetails;\ntype BrowserAction = typeof chrome.action;\n\nconst action = () => isManifestVersion3() ? browser().action : browser().browserAction;\n\nexport const setActionBadgeText = (tabId: number, text: string | number) => new Promise<void>((resolve, reject) => {\n const details: BadgeTextDetails = {text: text.toString(), tabId};\n\n action().setBadgeText(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const clearActionBadgeText = (tabId: number): Promise<void> => setActionBadgeText(tabId, '');\n\nexport const setActionBadgeBgColor = (tabId: number, color: BadgeBackgroundColorDetails['color']) => new Promise<void>((resolve, reject) => {\n const details: BadgeBackgroundColorDetails = {color, tabId};\n\n action().setBadgeBackgroundColor(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const setActionBadgeTextColor = async (\n tabId: number,\n color: BadgeBackgroundColorDetails['color']\n): Promise<void> => {\n if (!isManifestVersion3()) {\n return;\n }\n\n const root = action() as BrowserAction;\n\n await root.setBadgeTextColor({color, tabId});\n};\n\nexport const setActionIcon = (\n tabId: number,\n icon: string | Record<string, string>\n): Promise<void> => new Promise<void>((resolve, reject) => {\n action().setIcon({tabId, path: icon}, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getActionDefaultPopup = (): string => {\n const manifest = getManifest();\n\n return isManifestVersion3() ? manifest.action.default_popup : manifest.browser_action.default_popup;\n}\n\nexport const onActionClicked = (callback: Parameters<typeof chrome.action.onClicked.addListener>[0]): () => void => {\n return handleListener(action().onClicked, callback)\n}","import {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\nimport {throwRuntimeError} from \"@browser/runtime\";\n\ntype Command = chrome.commands.Command;\n\nconst commands = () => browser().commands;\n\nexport const isSupportCommands = (): boolean => !!commands;\n\nexport const getAllCommands = () => new Promise<Command[]>((resolve, reject) => {\n commands().getAll((commands) => {\n try {\n throwRuntimeError();\n\n resolve(commands);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const onCommand = (callback: Parameters<typeof chrome.commands.onCommand.addListener>[0]): () => void => {\n return handleListener(commands().onCommand, callback)\n}\n","export enum Language {\n Arabic = 'ar',\n Amharic = 'am',\n Bulgarian = 'bg',\n Bengali = 'bn',\n Catalan = 'ca',\n Czech = 'cs',\n Danish = 'da',\n German = 'de',\n Greek = 'el',\n English = 'en',\n EnglishAustralia = 'en_AU',\n EnglishGreatBritain = 'en_GB',\n EnglishUSA = 'en_US',\n Spanish = 'es',\n SpanishLatinAmericaAndCaribbean = 'es_419',\n Estonian = 'et',\n Persian = 'fa',\n Finnish = 'fi',\n Filipino = 'fil',\n French = 'fr',\n Gujarati = 'gu',\n Hebrew = 'he',\n Hindi = 'hi',\n Croatian = 'hr',\n Hungarian = 'hu',\n Indonesian = 'id',\n Italian = 'it',\n Japanese = 'ja',\n Kannada = 'kn',\n Korean = 'ko',\n Lithuanian = 'lt',\n Latvian = 'lv',\n Malayalam = 'ml',\n Marathi = 'mr',\n Malay = 'ms',\n Dutch = 'nl',\n Norwegian = 'no',\n Polish = 'pl',\n PortugueseBrazil = 'pt_BR',\n PortuguesePortugal = 'pt_PT',\n Romanian = 'ro',\n Russian = 'ru',\n Slovak = 'sk',\n Slovenian = 'sl',\n Serbian = 'sr',\n Swedish = 'sv',\n Swahili = 'sw',\n Tamil = 'ta',\n Telugu = 'te',\n Thai = 'th',\n Turkish = 'tr',\n Ukrainian = 'uk',\n Vietnamese = 'vi',\n ChineseChina = 'zh_CN',\n ChineseTaiwan = 'zh_TW',\n}\n\nexport enum LocaleDir {\n RightToLeft = 'rtl',\n LeftToRight = 'ltr',\n}\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([\n Language.Arabic,\n Language.Persian,\n Language.Hebrew,\n]);\n\nexport const LocaleNestedKeysSeparator = '.';\n\nexport const LocaleKeysSeparator = '_';\n\nexport const LocaleValuesSeparator = '|';\n\nexport const LocaleCustomKeyForLanguage = 'locale';\n\nexport const LocaleKeyMarker = '@';\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set(['yaml', 'yml', 'json']);\n\nexport const LocaleDirectoryName = 'locales';\n\nexport type LocaleValue = string | number | string[] | number[];\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport type LocaleFutures = {\n plural: boolean;\n substitutions: readonly string[];\n};\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\nexport type LocaleNonPluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: false } ? K : never }[keyof T] & string\n\nexport type LocalePluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: true } ? K : never }[keyof T] & string\n\nexport type LocaleSubstitutionsFor<\n T extends LocaleStructure,\n K extends keyof T\n> = T[K] extends { substitutions: readonly (infer U)[] }\n ? Partial<Record<U & string, string | number>>\n : never\n\nexport interface LocaleProvider<S extends LocaleStructure> {\n lang(): Language;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n}\n","import {\n Language,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleProvider,\n LocaleStructure,\n LocaleSubstitutionsFor,\n LocaleValuesSeparator\n} from \"@typing/locale\";\n\nexport default abstract class AbstractLocale<S extends LocaleStructure>\n implements LocaleProvider<S> {\n\n public abstract lang(): Language;\n\n public abstract keys(): Set<keyof S>;\n\n protected abstract value(key: keyof S & string): string | undefined;\n\n /**\n * Non-plural перевод\n */\n public trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n return this.get(key, substitutions);\n }\n\n /**\n * Plural-перевод\n */\n public choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const parts = this.get(key, substitutions).split(LocaleValuesSeparator);\n const idx = this.getPluralIndex(count);\n return parts[idx] ?? parts[0] ?? (key as string);\n }\n\n public get<K extends keyof S & string>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const template = this.value(key);\n\n if (template === undefined) {\n console.warn(`Locale key \"${key}\" not found in \"${this.lang()}\" language.`);\n return key as string;\n }\n\n if (substitutions) {\n return template.replace(/{{(.*?)}}/g, (_, placeholder: string) => {\n if (placeholder in substitutions) {\n return substitutions[placeholder]!.toString();\n }\n console.warn(\n `Locale substitution \"${placeholder}\" not found for key \"${key}\" in \"${this.lang()}\" language.`\n );\n return placeholder;\n });\n }\n\n return template;\n }\n\n private getPluralIndex(count: number): number {\n switch (this.lang()) {\n case Language.Indonesian:\n case Language.Japanese:\n case Language.Kannada:\n case Language.Korean:\n case Language.Malay:\n case Language.Thai:\n case Language.Turkish:\n case Language.Vietnamese:\n return 0;\n\n case Language.Bengali:\n case Language.Bulgarian:\n case Language.Catalan:\n case Language.Danish:\n case Language.German:\n case Language.Greek:\n case Language.English:\n case Language.EnglishAustralia:\n case Language.EnglishGreatBritain:\n case Language.EnglishUSA:\n case Language.Spanish:\n case Language.SpanishLatinAmericaAndCaribbean:\n case Language.Estonian:\n case Language.Persian:\n case Language.Finnish:\n case Language.Gujarati:\n case Language.Hebrew:\n case Language.Hungarian:\n case Language.Italian:\n case Language.Malayalam:\n case Language.Marathi:\n case Language.Dutch:\n case Language.Norwegian:\n case Language.Swedish:\n case Language.Swahili:\n case Language.Tamil:\n case Language.Telugu:\n case Language.ChineseChina:\n case Language.ChineseTaiwan:\n case Language.PortugueseBrazil:\n case Language.PortuguesePortugal:\n return (count == 1) ? 0 : 1;\n\n case Language.Amharic:\n case Language.Filipino:\n case Language.French:\n case Language.Hindi:\n return ((count == 0) || (count == 1)) ? 0 : 1;\n\n case Language.Croatian:\n case Language.Russian:\n case Language.Serbian:\n case Language.Ukrainian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Czech:\n case Language.Slovak:\n return (count == 1) ? 0 : (((count >= 2) && (count <= 4)) ? 1 : 2);\n\n case Language.Lithuanian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Slovenian:\n return (count % 100 == 1) ? 0 : ((count % 100 == 2) ? 1 : (((count % 100 == 3) || (count % 100 == 4)) ? 2 : 3));\n\n case Language.Latvian:\n return (count == 0) ? 0 : (((count % 10 == 1) && (count % 100 != 11)) ? 1 : 2);\n\n case Language.Polish:\n return (count == 1) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 12) || (count % 100 > 14))) ? 1 : 2);\n\n case Language.Romanian:\n return (count == 1) ? 0 : (((count == 0) || ((count % 100 > 0) && (count % 100 < 20))) ? 1 : 2);\n\n case Language.Arabic:\n return (count == 0) ? 0 : ((count == 1) ? 1 : ((count == 2) ? 2 : (((count % 100 >= 3) && (count % 100 <= 10)) ? 3 : (((count % 100 >= 11) && (count % 100 <= 99)) ? 4 : 5))));\n\n default:\n return 0;\n }\n }\n}\n\n","import {browser} from \"./browser\";\nimport {throwRuntimeError} from \"./runtime\";\n\ntype LanguageDetectionResult = chrome.i18n.LanguageDetectionResult\n\nconst i18n = () => browser().i18n;\n\nexport const canUseNativeI18nMessage = (): boolean => typeof (i18n().getMessage) !== \"undefined\";\n\nexport const getI18nMessage = (key: string): string | undefined => {\n if (!canUseNativeI18nMessage()) {\n return;\n }\n\n return i18n().getMessage(key);\n}\n\nexport const getI18nAcceptLanguages = (): Promise<string[]> => new Promise<string[]>((resolve, reject) => {\n i18n().getAcceptLanguages(locales => {\n try {\n throwRuntimeError();\n\n resolve(locales);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getI18nUILanguage = (): string | undefined => {\n const i18n = browser().i18n;\n\n if (!i18n['getUILanguage']) {\n return;\n }\n\n return i18n.getUILanguage();\n}\n\nexport const detectI18Language = (text: string): Promise<LanguageDetectionResult> => new Promise<LanguageDetectionResult>((resolve, reject) => {\n i18n().detectLanguage(text, result => {\n try {\n throwRuntimeError();\n\n resolve(result);\n } catch (e) {\n reject(e);\n }\n });\n});\n","import {Language, LocaleKeyMarker, LocaleKeysSeparator, LocaleNestedKeysSeparator} from \"@typing/locale\";\n\nexport const getLocaleFilename = (lang: Language): string => {\n return `_locales/${lang}/messages.json`;\n};\n\nexport const convertLocaleKey = (key: string): string => {\n return key.replaceAll(LocaleNestedKeysSeparator, LocaleKeysSeparator);\n}\n\nexport const convertLocaleMessageKey = (key: string): string => {\n return `__MSG_${convertLocaleKey(key)}__`;\n}\n\nexport const extractLocaleKey = (key?: string): string | undefined => {\n if (isLocaleKey(key)) {\n return key.substring(1);\n }\n}\n\nexport const isLocaleKey = (key?: string): key is string => {\n return key?.startsWith(LocaleKeyMarker) ?? false;\n}\n\nexport const modifyLocaleMessageKey = (key?: string): string | undefined => {\n if (typeof key !== \"string\") {\n return undefined;\n }\n\n const localeKey = extractLocaleKey(key);\n\n if (localeKey) {\n return convertLocaleMessageKey(localeKey);\n }\n\n return key;\n}\n\n","import {Browser} from \"@typing/browser\";\nimport {ManifestVersion} from \"@typing/manifest\";\n\nexport const getEnv: {\n <T extends string>(key: string): T | undefined;\n <T extends string, D>(key: string, defaults: D): T | D;\n} = (key: string, defaults?: string) => {\n const env = process.env;\n\n return (env[key] ?? defaults) as any;\n};\n\nexport const getApp = (): string => {\n const app = getEnv('APP');\n\n if (app === undefined) {\n throw new Error('App is not defined');\n }\n\n return app;\n};\n\nexport const getBrowser = (): Browser => {\n const browser = getEnv<Browser>('BROWSER');\n\n if (browser === undefined) {\n throw new Error('Browser is not defined');\n }\n\n return browser;\n}\n\nexport const isBrowser = (browser: Browser): browser is Browser => {\n return getBrowser() === browser;\n}\n\nexport const getManifestVersion = (): ManifestVersion => {\n const manifestVersion = getEnv('MANIFEST_VERSION', '3');\n\n return parseInt(manifestVersion) as ManifestVersion;\n}","import {getI18nMessage, getI18nUILanguage} from \"@browser/i18n\";\n\nimport AbstractLocale from \"./AbstractLocale\";\n\nimport {convertLocaleKey} from \"@locale/utils\";\nimport {isBrowser} from \"@main/env\";\n\nimport {Language, LanguageCodes, LocaleCustomKeyForLanguage, LocaleProvider, LocaleStructure} from \"@typing/locale\";\nimport {Browser} from \"@typing/browser\";\n\nexport interface LocaleNativeStructure extends LocaleStructure {\n}\n\nexport default class NativeLocale extends AbstractLocale<LocaleNativeStructure> {\n private static instance?: LocaleProvider<LocaleNativeStructure>;\n\n public static getInstance<S extends LocaleStructure = LocaleNativeStructure>(): LocaleProvider<S> {\n return NativeLocale.instance ??= new NativeLocale();\n }\n\n public lang(): Language {\n let lang: Language | undefined;\n\n /**\n * The Opera browser does not support RTL languages,\n * and for Opera you need to directly indicate what kind of language it is.\n * interface language is always different\n */\n if (isBrowser(Browser.Opera)) {\n lang = getI18nMessage(LocaleCustomKeyForLanguage) as Language;\n\n if (LanguageCodes.has(lang)) {\n return lang;\n }\n }\n\n lang = getI18nUILanguage() as Language;\n\n if (!lang) {\n throw new Error(\"Locale Native: Unable to get UI language\");\n }\n\n return lang;\n }\n\n\n public keys(): Set<keyof LocaleNativeStructure> {\n try {\n // @ts-expect-error\n return new Set<string>(LOCALE_KEYS);\n } catch (e) {\n console.error(\"Locale Native: Unable to get keys\", e);\n\n return new Set<string>();\n }\n }\n\n protected value(key: Extract<keyof LocaleNativeStructure, string>): string | undefined {\n const value = getI18nMessage(convertLocaleKey(key));\n\n if (!value || value.length === 0) {\n return undefined;\n }\n\n return value;\n }\n}","import {LocaleNativeStructure, NativeLocale} from \"@locale/providers\";\n\nimport {convertLocaleMessageKey, extractLocaleKey} from \"@locale/utils\";\n\nimport {\n Language,\n LanguageCodes,\n LocaleDir,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleSubstitutionsFor\n} from \"@typing/locale\";\n\nexport {Language, LanguageCodes, LocaleDir};\n\n/**\n * Translates a given locale key into the corresponding localized string.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, with substitutions applied if provided.\n */\nexport const _ = <K extends LocaleNonPluralKeys<LocaleNativeStructure>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().trans(key, substitutions);\n};\n\n/**\n * Translates a given locale key into the corresponding localized string\n * based on a specific count for pluralization.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {number} count - The count used to determine the pluralization form.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, adjusted for pluralization and with substitutions applied if provided.\n */\nexport const _c = <K extends LocalePluralKeys<LocaleNativeStructure>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().choice(key, count, substitutions);\n};\n\n/**\n * Converts a locale key into a standardized format and logs a warning if the key is not found\n * in the current language's locale keys.\n *\n * @param {Extract<keyof LocaleNativeStructure, string>} key - The locale key to be converted.\n * This key must be a string and exist within the `LocaleNativeStructure`.\n * @returns {string} - The converted locale message key.\n */\nexport const __ = (key: keyof LocaleNativeStructure & string): string => {\n const locale = NativeLocale.getInstance();\n\n if (!locale.keys().has(key)) {\n console.warn(`Locale key \"${key}\" not found in \"${locale.lang()}\" language.`);\n }\n\n return convertLocaleMessageKey(key);\n};\n\n\n/**\n * Attempts to extract a locale key from the provided string and translates it\n * into the corresponding localized string. If no locale key can be extracted,\n * the original string is returned.\n *\n * @param {string} input - The input string from which a locale key is to be extracted.\n * @returns {string} - The translated string if a locale key is successfully extracted,\n * or the original string if no locale key is found.\n */\nexport const __t = (input: string): string => {\n const localeKey = extractLocaleKey(input);\n\n if (localeKey) {\n return _(localeKey as LocaleNonPluralKeys<LocaleNativeStructure>);\n }\n\n return input;\n};","import {EntrypointBuilder, EntrypointBuilderClass} from \"@typing/entrypoint\";\n\nexport default abstract class implements EntrypointBuilder {\n public abstract build(): Promise<void>;\n\n public abstract destroy(): Promise<void>;\n\n public static resolver(this: new (definition: any) => EntrypointBuilder) {\n return (definition: EntrypointBuilderClass<typeof this>): void => {\n new this(definition).build().catch(e => {\n console.error('Failed to build entrypoint:', e);\n });\n };\n }\n}","import {CommandDefinition, CommandExecute} from \"@typing/command\";\n\nexport const isValidCommandDefinition = (definition: any): definition is CommandDefinition => {\n return definition && typeof definition === 'object' && definition.constructor === Object;\n}\n\nexport const isValidCommandExecuteFunction = (execute: any): execute is CommandExecute => {\n return execute && typeof execute === 'function';\n}\n\nexport const isValidCommandName = (name: any): name is string => {\n return name && typeof name === 'string' && name.trim().length > 0;\n}","import {Required} from \"utility-types\";\n\nimport {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {BackgroundConfig} from \"@typing/background\";\nimport {Awaiter} from \"@typing/helpers\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport const CommandExecuteActionName = '_execute_action';\n\nexport interface CommandConfig extends BackgroundConfig {\n name: string;\n description?: string;\n global?: boolean;\n defaultKey?: string;\n windowsKey?: string;\n macKey?: string;\n chromeosKey?: string;\n linuxKey?: string;\n}\n\nexport type CommandOptions = CommandConfig & EntrypointOptions;\n\nexport type CommandEntrypointOptions = Partial<CommandOptions>;\n\nexport type CommandExecute = (tab: Tab | undefined, options: CommandOptions) => Awaiter<void>;\n\nexport interface CommandDefinition extends CommandEntrypointOptions {\n execute: CommandExecute;\n}\n\nexport type ExecuteActionCommandDefinition = Omit<CommandDefinition, 'name'>;\n\nexport type CommandUnresolvedDefinition = Partial<CommandDefinition>;\n\nexport type CommandResolvedDefinition = Required<CommandDefinition, 'name' | 'execute'>;\n\nexport type CommandBuilder = EntrypointBuilder;","import {onActionClicked} from \"@browser/action\";\nimport {onCommand} from \"@browser/command\";\n\nimport {__t} from \"@main/locale\";\n\nimport Builder from \"@entry/core/Builder\";\n\nimport {isValidCommandExecuteFunction, isValidCommandName} from \"./resolvers\";\n\nimport {\n CommandBuilder,\n CommandExecuteActionName,\n CommandResolvedDefinition,\n CommandUnresolvedDefinition\n} from \"@typing/command\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport default class extends Builder implements CommandBuilder {\n protected readonly definition: CommandResolvedDefinition;\n\n protected unsubscribe?: () => void;\n\n public constructor(definition: CommandUnresolvedDefinition) {\n super();\n\n const {name, execute, description} = definition;\n\n if (!isValidCommandExecuteFunction(execute)) {\n throw new Error('The command entrypoint must export a execute function');\n }\n\n if (!isValidCommandName(name)) {\n throw new Error('The command entrypoint must export a name string');\n }\n\n this.definition = {\n ...definition,\n name,\n execute,\n description: description ? __t(description) : undefined,\n };\n }\n\n public async build(): Promise<void> {\n const {name} = this.definition;\n\n if (name == CommandExecuteActionName) {\n this.unsubscribe = onActionClicked((tab) => {\n this.handle(tab);\n });\n\n return;\n }\n\n this.unsubscribe = onCommand((command, tab) => {\n if (command === name) {\n this.handle(tab);\n }\n });\n }\n\n public async destroy(): Promise<void> {\n this.unsubscribe?.();\n }\n\n protected handle(tab?: Tab): void {\n const {name, execute, ...options} = this.definition;\n\n try {\n Promise.resolve(execute(tab, {name, ...options})).catch((e) => {\n console.error('The command execute async function crashed:', e);\n });\n } catch (e) {\n console.error('The command execute function crashed:', e);\n }\n }\n}","import Builder from \"./Builder\";\n\nexport * from \"./resolvers\";\n\nexport default Builder.resolver();"]}
|
|
@@ -3,6 +3,28 @@ var browser = () => {
|
|
|
3
3
|
return chrome;
|
|
4
4
|
};
|
|
5
5
|
|
|
6
|
+
// src/browser/utils.ts
|
|
7
|
+
function safeListener(listener) {
|
|
8
|
+
return (...args) => {
|
|
9
|
+
try {
|
|
10
|
+
const result = listener(...args);
|
|
11
|
+
if (result instanceof Promise) {
|
|
12
|
+
result.catch((err) => {
|
|
13
|
+
console.error("Listener async error:", err);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
} catch (err) {
|
|
18
|
+
console.error("Listener sync error:", err);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function handleListener(target, callback) {
|
|
23
|
+
const listener = safeListener(callback);
|
|
24
|
+
target.addListener(listener);
|
|
25
|
+
return () => target.removeListener(listener);
|
|
26
|
+
}
|
|
27
|
+
|
|
6
28
|
// src/browser/runtime.ts
|
|
7
29
|
var runtime = () => browser().runtime;
|
|
8
30
|
var getManifest = () => runtime().getManifest();
|
|
@@ -12,15 +34,13 @@ var isManifestVersion3 = () => getManifestVersion() === 3;
|
|
|
12
34
|
// src/browser/action.ts
|
|
13
35
|
var action = () => isManifestVersion3() ? browser().action : browser().browserAction;
|
|
14
36
|
var onActionClicked = (callback) => {
|
|
15
|
-
action().onClicked
|
|
16
|
-
return () => action().onClicked.removeListener(callback);
|
|
37
|
+
return handleListener(action().onClicked, callback);
|
|
17
38
|
};
|
|
18
39
|
|
|
19
40
|
// src/browser/command.ts
|
|
20
41
|
var commands = () => browser().commands;
|
|
21
42
|
var onCommand = (callback) => {
|
|
22
|
-
commands().onCommand
|
|
23
|
-
return () => commands().onCommand.removeListener(callback);
|
|
43
|
+
return handleListener(commands().onCommand, callback);
|
|
24
44
|
};
|
|
25
45
|
|
|
26
46
|
// src/types/locale.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/browser/browser.ts","../../../src/browser/runtime.ts","../../../src/browser/action.ts","../../../src/browser/command.ts","../../../src/types/locale.ts","../../../src/locale/providers/AbstractLocale.ts","../../../src/browser/i18n.ts","../../../src/locale/utils.ts","../../../src/main/env.ts","../../../src/locale/providers/NativeLocale.ts","../../../src/main/locale.ts","../../../src/entry/core/Builder.ts","../../../src/entry/command/resolvers/definition.ts","../../../src/types/command.ts","../../../src/entry/command/Builder.ts","../../../src/entry/command/index.ts"],"names":["Language","_","i18n","browser","Builder_default"],"mappings":";AAAO,IAAM,UAAU,MAAqB;AACxC,EAAO,OAAA,MAAA;AACX,CAAA;;;ACMA,IAAM,OAAA,GAAU,MAAM,OAAA,EAAU,CAAA,OAAA;AAUzB,IAAM,WAAc,GAAA,MAAgB,OAAQ,EAAA,CAAE,WAAY,EAAA;AAE1D,IAAM,kBAAA,GAAqB,MAAuB,WAAA,EAAc,CAAA,gBAAA;AA0BhE,IAAM,kBAAA,GAAqB,MAAe,kBAAA,EAAyB,KAAA,CAAA;;;ACvC1E,IAAM,MAAA,GAAS,MAAM,kBAAmB,EAAA,GAAI,SAAU,CAAA,MAAA,GAAS,SAAU,CAAA,aAAA;AAkElE,IAAM,eAAA,GAAkB,CAAC,QAAoF,KAAA;AAChH,EAAO,MAAA,EAAA,CAAE,SAAU,CAAA,WAAA,CAAY,QAAQ,CAAA;AAEvC,EAAA,OAAO,MAAM,MAAA,EAAS,CAAA,SAAA,CAAU,eAAe,QAAQ,CAAA;AAC3D,CAAA;;;ACxEA,IAAM,QAAA,GAAW,MAAM,OAAA,EAAU,CAAA,QAAA;AAgB1B,IAAM,SAAA,GAAY,CAAC,QAAsF,KAAA;AAC5G,EAAS,QAAA,EAAA,CAAE,SAAU,CAAA,WAAA,CAAY,QAAQ,CAAA;AAEzC,EAAA,OAAO,MAAM,QAAA,EAAW,CAAA,SAAA,CAAU,eAAe,QAAQ,CAAA;AAC7D,CAAA;;;ACzBO,IAAK,QAAA,qBAAAA,SAAL,KAAA;AACH,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,WAAY,CAAA,GAAA,IAAA;AACZ,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,OAAQ,CAAA,GAAA,IAAA;AACR,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,OAAQ,CAAA,GAAA,IAAA;AACR,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,kBAAmB,CAAA,GAAA,OAAA;AACnB,EAAAA,UAAA,qBAAsB,CAAA,GAAA,OAAA;AACtB,EAAAA,UAAA,YAAa,CAAA,GAAA,OAAA;AACb,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,iCAAkC,CAAA,GAAA,QAAA;AAClC,EAAAA,UAAA,UAAW,CAAA,GAAA,IAAA;AACX,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,UAAW,CAAA,GAAA,KAAA;AACX,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,UAAW,CAAA,GAAA,IAAA;AACX,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,OAAQ,CAAA,GAAA,IAAA;AACR,EAAAA,UAAA,UAAW,CAAA,GAAA,IAAA;AACX,EAAAA,UAAA,WAAY,CAAA,GAAA,IAAA;AACZ,EAAAA,UAAA,YAAa,CAAA,GAAA,IAAA;AACb,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,UAAW,CAAA,GAAA,IAAA;AACX,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,YAAa,CAAA,GAAA,IAAA;AACb,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,WAAY,CAAA,GAAA,IAAA;AACZ,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,OAAQ,CAAA,GAAA,IAAA;AACR,EAAAA,UAAA,OAAQ,CAAA,GAAA,IAAA;AACR,EAAAA,UAAA,WAAY,CAAA,GAAA,IAAA;AACZ,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,kBAAmB,CAAA,GAAA,OAAA;AACnB,EAAAA,UAAA,oBAAqB,CAAA,GAAA,OAAA;AACrB,EAAAA,UAAA,UAAW,CAAA,GAAA,IAAA;AACX,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,WAAY,CAAA,GAAA,IAAA;AACZ,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,OAAQ,CAAA,GAAA,IAAA;AACR,EAAAA,UAAA,QAAS,CAAA,GAAA,IAAA;AACT,EAAAA,UAAA,MAAO,CAAA,GAAA,IAAA;AACP,EAAAA,UAAA,SAAU,CAAA,GAAA,IAAA;AACV,EAAAA,UAAA,WAAY,CAAA,GAAA,IAAA;AACZ,EAAAA,UAAA,YAAa,CAAA,GAAA,IAAA;AACb,EAAAA,UAAA,cAAe,CAAA,GAAA,OAAA;AACf,EAAAA,UAAA,eAAgB,CAAA,GAAA,OAAA;AAvDR,EAAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA,CAAA;AAqEL,IAAM,yBAA4B,GAAA,GAAA;AAElC,IAAM,mBAAsB,GAAA,GAAA;AAE5B,IAAM,qBAAwB,GAAA,GAAA;AAE9B,IAAM,0BAA6B,GAAA,QAAA;AAEnC,IAAM,eAAkB,GAAA,GAAA;AAExB,IAAM,gBAAqC,IAAI,GAAA,CAAI,MAAO,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;;;ACrEjF,IAA8B,iBAA9B,MACiC;AAAA;AAAA;AAAA;AAAA,EAWtB,KAAA,CACH,KACA,aACM,EAAA;AACN,IAAO,OAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAK,aAAa,CAAA;AAAA;AACtC;AAAA;AAAA;AAAA,EAKO,MAAA,CACH,GACA,EAAA,KAAA,EACA,aACM,EAAA;AACN,IAAA,MAAM,QAAQ,IAAK,CAAA,GAAA,CAAI,KAAK,aAAa,CAAA,CAAE,MAAM,qBAAqB,CAAA;AACtE,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,cAAA,CAAe,KAAK,CAAA;AACrC,IAAA,OAAO,KAAM,CAAA,GAAG,CAAK,IAAA,KAAA,CAAM,CAAC,CAAM,IAAA,GAAA;AAAA;AACtC,EAEO,GAAA,CACH,KACA,aACM,EAAA;AACN,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAE/B,IAAA,IAAI,aAAa,MAAW,EAAA;AACxB,MAAA,OAAA,CAAQ,KAAK,CAAe,YAAA,EAAA,GAAG,mBAAmB,IAAK,CAAA,IAAA,EAAM,CAAa,WAAA,CAAA,CAAA;AAC1E,MAAO,OAAA,GAAA;AAAA;AAGX,IAAA,IAAI,aAAe,EAAA;AACf,MAAA,OAAO,QAAS,CAAA,OAAA,CAAQ,YAAc,EAAA,CAACC,IAAG,WAAwB,KAAA;AAC9D,QAAA,IAAI,eAAe,aAAe,EAAA;AAC9B,UAAO,OAAA,aAAA,CAAc,WAAW,CAAA,CAAG,QAAS,EAAA;AAAA;AAEhD,QAAQ,OAAA,CAAA,IAAA;AAAA,UACJ,wBAAwB,WAAW,CAAA,qBAAA,EAAwB,GAAG,CAAS,MAAA,EAAA,IAAA,CAAK,MAAM,CAAA,WAAA;AAAA,SACtF;AACA,QAAO,OAAA,WAAA;AAAA,OACV,CAAA;AAAA;AAGL,IAAO,OAAA,QAAA;AAAA;AACX,EAEQ,eAAe,KAAuB,EAAA;AAC1C,IAAQ,QAAA,IAAA,CAAK,MAAQ;AAAA,MACjB,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AACI,QAAO,OAAA,CAAA;AAAA,MAEX,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,OAAA;AAAA,MACA,KAAA,OAAA;AAAA,MACA,KAAA,OAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,QAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,OAAA;AAAA,MACA,KAAA,OAAA;AAAA,MACA,KAAA,OAAA;AAAA,MACA,KAAA,OAAA;AACI,QAAQ,OAAA,KAAA,IAAS,IAAK,CAAI,GAAA,CAAA;AAAA,MAE9B,KAAA,IAAA;AAAA,MACA,KAAA,KAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AACI,QAAA,OAAS,KAAS,IAAA,CAAA,IAAO,KAAS,IAAA,CAAA,GAAM,CAAI,GAAA,CAAA;AAAA,MAEhD,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AACI,QAAA,OAAS,QAAQ,EAAM,IAAA,CAAA,IAAO,QAAQ,GAAO,IAAA,EAAA,GAAO,IAAO,KAAQ,GAAA,EAAA,IAAM,KAAO,KAAQ,GAAA,EAAA,IAAM,MAAQ,KAAQ,GAAA,GAAA,GAAM,MAAQ,KAAQ,GAAA,GAAA,IAAO,MAAQ,CAAI,GAAA,CAAA;AAAA,MAE3J,KAAA,IAAA;AAAA,MACA,KAAA,IAAA;AACI,QAAA,OAAQ,SAAS,CAAK,GAAA,CAAA,GAAO,SAAS,CAAO,IAAA,KAAA,IAAS,IAAM,CAAI,GAAA,CAAA;AAAA,MAEpE,KAAA,IAAA;AACI,QAAA,OAAS,QAAQ,EAAM,IAAA,CAAA,IAAO,KAAQ,GAAA,GAAA,IAAO,KAAO,CAAO,GAAA,KAAA,GAAQ,EAAM,IAAA,CAAA,KAAQ,QAAQ,GAAM,GAAA,EAAA,IAAQ,KAAQ,GAAA,GAAA,IAAO,MAAQ,CAAI,GAAA,CAAA;AAAA,MAEtI,KAAA,IAAA;AACI,QAAA,OAAQ,KAAQ,GAAA,GAAA,IAAO,CAAK,GAAA,CAAA,GAAM,QAAQ,GAAO,IAAA,CAAA,GAAK,CAAO,GAAA,KAAA,GAAQ,GAAO,IAAA,CAAA,IAAO,KAAQ,GAAA,GAAA,IAAO,IAAM,CAAI,GAAA,CAAA;AAAA,MAEhH,KAAA,IAAA;AACI,QAAQ,OAAA,KAAA,IAAS,IAAK,CAAO,GAAA,KAAA,GAAQ,MAAM,CAAO,IAAA,KAAA,GAAQ,GAAO,IAAA,EAAA,GAAO,CAAI,GAAA,CAAA;AAAA,MAEhF,KAAA,IAAA;AACI,QAAA,OAAQ,KAAS,IAAA,CAAA,GAAK,CAAO,GAAA,KAAA,GAAQ,MAAM,CAAO,IAAA,KAAA,GAAQ,EAAM,IAAA,CAAA,KAAQ,QAAQ,GAAM,GAAA,EAAA,IAAQ,KAAQ,GAAA,GAAA,GAAM,MAAQ,CAAI,GAAA,CAAA;AAAA,MAE5H,KAAA,IAAA;AACI,QAAQ,OAAA,KAAA,IAAS,CAAK,GAAA,CAAA,GAAO,KAAS,IAAA,CAAA,IAAQ,KAAQ,GAAA,GAAA,GAAM,CAAO,IAAA,KAAA,GAAQ,GAAM,GAAA,EAAA,GAAQ,CAAI,GAAA,CAAA;AAAA,MAEjG,KAAA,IAAA;AACI,QAAQ,OAAA,KAAA,IAAS,IAAK,CAAM,GAAA,KAAA,IAAS,IAAK,CAAM,GAAA,KAAA,IAAS,CAAK,GAAA,CAAA,GAAO,KAAQ,GAAA,GAAA,IAAO,KAAO,KAAQ,GAAA,GAAA,IAAO,KAAO,CAAO,GAAA,KAAA,GAAQ,OAAO,EAAQ,IAAA,KAAA,GAAQ,GAAO,IAAA,EAAA,GAAO,CAAI,GAAA,CAAA;AAAA,MAE7K;AACI,QAAO,OAAA,CAAA;AAAA;AACf;AAER,CAAA;;;AClJA,IAAM,IAAA,GAAO,MAAM,OAAA,EAAU,CAAA,IAAA;AAEtB,IAAM,uBAA0B,GAAA,MAAe,OAAQ,IAAA,GAAO,UAAgB,KAAA,WAAA;AAE9E,IAAM,cAAA,GAAiB,CAAC,GAAoC,KAAA;AAC/D,EAAI,IAAA,CAAC,yBAA2B,EAAA;AAC5B,IAAA;AAAA;AAGJ,EAAO,OAAA,IAAA,EAAO,CAAA,UAAA,CAAW,GAAG,CAAA;AAChC,CAAA;AAcO,IAAM,oBAAoB,MAA0B;AACvD,EAAMC,MAAAA,KAAAA,GAAO,SAAU,CAAA,IAAA;AAEvB,EAAI,IAAA,CAACA,KAAK,CAAA,eAAe,CAAG,EAAA;AACxB,IAAA;AAAA;AAGJ,EAAA,OAAOA,MAAK,aAAc,EAAA;AAC9B,CAAA;;;AC/BO,IAAM,gBAAA,GAAmB,CAAC,GAAwB,KAAA;AACrD,EAAO,OAAA,GAAA,CAAI,UAAW,CAAA,yBAAA,EAA2B,mBAAmB,CAAA;AACxE,CAAA;AAMO,IAAM,gBAAA,GAAmB,CAAC,GAAqC,KAAA;AAClE,EAAI,IAAA,WAAA,CAAY,GAAG,CAAG,EAAA;AAClB,IAAO,OAAA,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA;AAE9B,CAAA;AAEO,IAAM,WAAA,GAAc,CAAC,GAAgC,KAAA;AACxD,EAAO,OAAA,CAAA,GAAA,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAK,WAAW,eAAoB,CAAA,KAAA,KAAA;AAC/C,CAAA;;;ACnBO,IAAM,MAAA,GAGT,CAAC,GAAA,EAAa,QAAsB,KAAA;AACpC,EAAA,MAAM,MAAM,OAAQ,CAAA,GAAA;AAEpB,EAAQ,OAAA,GAAA,CAAI,GAAG,CAAK,IAAA,QAAA;AACxB,CAAA;AAYO,IAAM,aAAa,MAAe;AACrC,EAAMC,MAAAA,QAAAA,GAAU,OAAgB,SAAS,CAAA;AAEzC,EAAA,IAAIA,aAAY,MAAW,EAAA;AACvB,IAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAG5C,EAAOA,OAAAA,QAAAA;AACX,CAAA;AAEO,IAAM,SAAA,GAAY,CAACA,QAAyC,KAAA;AAC/D,EAAA,OAAO,YAAiBA,KAAAA,QAAAA;AAC5B,CAAA;;;ACrBA,IAAqB,YAAA,GAArB,MAAqB,aAAA,SAAqB,cAAsC,CAAA;AAAA,EAC5E,OAAe,QAAA;AAAA,EAEf,OAAc,WAAoF,GAAA;AAC9F,IAAA,OAAO,aAAa,CAAA,QAAA,KAAb,aAAa,CAAA,QAAA,GAAa,IAAI,aAAa,EAAA,CAAA;AAAA;AACtD,EAEO,IAAiB,GAAA;AACpB,IAAI,IAAA,IAAA;AAOJ,IAAA,IAAI,8BAA0B,EAAA;AAC1B,MAAA,IAAA,GAAO,eAAe,0BAA0B,CAAA;AAEhD,MAAI,IAAA,aAAA,CAAc,GAAI,CAAA,IAAI,CAAG,EAAA;AACzB,QAAO,OAAA,IAAA;AAAA;AACX;AAGJ,IAAA,IAAA,GAAO,iBAAkB,EAAA;AAEzB,IAAA,IAAI,CAAC,IAAM,EAAA;AACP,MAAM,MAAA,IAAI,MAAM,0CAA0C,CAAA;AAAA;AAG9D,IAAO,OAAA,IAAA;AAAA;AACX,EAGO,IAAyC,GAAA;AAC5C,IAAI,IAAA;AAEA,MAAO,OAAA,IAAI,IAAY,WAAW,CAAA;AAAA,aAC7B,CAAG,EAAA;AACR,MAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,CAAC,CAAA;AAEpD,MAAA,2BAAW,GAAY,EAAA;AAAA;AAC3B;AACJ,EAEU,MAAM,GAAuE,EAAA;AACnF,IAAA,MAAM,KAAQ,GAAA,cAAA,CAAe,gBAAiB,CAAA,GAAG,CAAC,CAAA;AAElD,IAAA,IAAI,CAAC,KAAA,IAAS,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC9B,MAAO,OAAA,MAAA;AAAA;AAGX,IAAO,OAAA,KAAA;AAAA;AAEf,CAAA;;;AC1CO,IAAM,CAAA,GAAI,CACb,GAAA,EACA,aACS,KAAA;AACT,EAAA,OAAO,YAAa,CAAA,WAAA,EAAc,CAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAC9D,CAAA;AAiDO,IAAM,GAAA,GAAM,CAAC,KAA0B,KAAA;AAC1C,EAAM,MAAA,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAExC,EAAA,IAAI,SAAW,EAAA;AACX,IAAA,OAAO,EAAE,SAAuD,CAAA;AAAA;AAGpE,EAAO,OAAA,KAAA;AACX,CAAA;;;ACpFA,IAAO,kBAAP,MAA2D;AAAA,EAKvD,OAAc,QAA2D,GAAA;AACrE,IAAA,OAAO,CAAC,UAA0D,KAAA;AAC9D,MAAA,IAAI,KAAK,UAAU,CAAA,CAAE,KAAM,EAAA,CAAE,MAAM,CAAK,CAAA,KAAA;AACpC,QAAQ,OAAA,CAAA,KAAA,CAAM,+BAA+B,CAAC,CAAA;AAAA,OACjD,CAAA;AAAA,KACL;AAAA;AAER,CAAA;;;ACZa,IAAA,wBAAA,GAA2B,CAAC,UAAqD,KAAA;AAC1F,EAAA,OAAO,UAAc,IAAA,OAAO,UAAe,KAAA,QAAA,IAAY,WAAW,WAAgB,KAAA,MAAA;AACtF;AAEa,IAAA,6BAAA,GAAgC,CAAC,OAA4C,KAAA;AACtF,EAAO,OAAA,OAAA,IAAW,OAAO,OAAY,KAAA,UAAA;AACzC;AAEa,IAAA,kBAAA,GAAqB,CAAC,IAA8B,KAAA;AAC7D,EAAA,OAAO,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAK,CAAA,IAAA,GAAO,MAAS,GAAA,CAAA;AACpE;;;ACJO,IAAM,wBAA2B,GAAA,iBAAA;;;ACUxC,IAAOC,gBAAAA,GAAP,cAA6B,eAAkC,CAAA;AAAA,EACxC,UAAA;AAAA,EAET,WAAA;AAAA,EAEH,YAAY,UAAyC,EAAA;AACxD,IAAM,KAAA,EAAA;AAEN,IAAA,MAAM,EAAC,IAAA,EAAM,OAAS,EAAA,WAAA,EAAe,GAAA,UAAA;AAErC,IAAI,IAAA,CAAC,6BAA8B,CAAA,OAAO,CAAG,EAAA;AACzC,MAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA;AAAA;AAG3E,IAAI,IAAA,CAAC,kBAAmB,CAAA,IAAI,CAAG,EAAA;AAC3B,MAAM,MAAA,IAAI,MAAM,kDAAkD,CAAA;AAAA;AAGtE,IAAA,IAAA,CAAK,UAAa,GAAA;AAAA,MACd,GAAG,UAAA;AAAA,MACH,IAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAa,EAAA,WAAA,GAAc,GAAI,CAAA,WAAW,CAAI,GAAA;AAAA,KAClD;AAAA;AACJ,EAEA,MAAa,KAAuB,GAAA;AAChC,IAAM,MAAA,EAAC,IAAI,EAAA,GAAI,IAAK,CAAA,UAAA;AAEpB,IAAA,IAAI,QAAQ,wBAA0B,EAAA;AAClC,MAAK,IAAA,CAAA,WAAA,GAAc,eAAgB,CAAA,CAAC,GAAQ,KAAA;AACxC,QAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,OAClB,CAAA;AAED,MAAA;AAAA;AAGJ,IAAA,IAAA,CAAK,WAAc,GAAA,SAAA,CAAU,CAAC,OAAA,EAAS,GAAQ,KAAA;AAC3C,MAAA,IAAI,YAAY,IAAM,EAAA;AAClB,QAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA;AACnB,KACH,CAAA;AAAA;AACL,EAEA,MAAa,OAAyB,GAAA;AA9D1C,IAAA,IAAA,EAAA;AA+DQ,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,WAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA;AAAA;AACJ,EAEU,OAAO,GAAiB,EAAA;AAC9B,IAAA,MAAM,EAAC,IAAM,EAAA,OAAA,EAAS,GAAG,OAAA,KAAW,IAAK,CAAA,UAAA;AAEzC,IAAI,IAAA;AACA,MAAA,OAAA,CAAQ,OAAQ,CAAA,OAAA,CAAQ,GAAK,EAAA,EAAC,IAAM,EAAA,GAAG,OAAO,EAAC,CAAC,CAAA,CAAE,KAAM,CAAA,CAAC,CAAM,KAAA;AAC3D,QAAQ,OAAA,CAAA,KAAA,CAAM,+CAA+C,CAAC,CAAA;AAAA,OACjE,CAAA;AAAA,aACI,CAAG,EAAA;AACR,MAAQ,OAAA,CAAA,KAAA,CAAM,yCAAyC,CAAC,CAAA;AAAA;AAC5D;AAER,CAAA;;;ACzEO,IAAA,eAAA,GAAQA,iBAAQ,QAAS","file":"index.js","sourcesContent":["export const browser = (): typeof chrome => {\n return chrome;\n}","import {browser} from \"./browser\";\nimport {ManifestVersion} from \"@typing/manifest\";\n\ntype Manifest = chrome.runtime.Manifest;\ntype PlatformInfo = chrome.runtime.PlatformInfo;\ntype ContextFilter = chrome.runtime.ContextFilter;\ntype ExtensionContext = chrome.runtime.ExtensionContext;\n\nconst runtime = () => browser().runtime;\n\nconst backgroundPaths = [\n '/_generated_background_page.view',\n];\n\nexport const getId = (): string => runtime().id;\n\nexport const getUrl = (path: string) => runtime().getURL(path);\n\nexport const getManifest = (): Manifest => runtime().getManifest();\n\nexport const getManifestVersion = (): ManifestVersion => getManifest().manifest_version;\n\nexport const getRuntimeContexts = (filter: ContextFilter) => new Promise<ExtensionContext[]>((resolve, reject) => {\n runtime().getContexts(filter, contexts => {\n try {\n throwRuntimeError();\n\n resolve(contexts);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getPlatformInfo = (): Promise<PlatformInfo> => new Promise<PlatformInfo>((resolve, reject) => {\n runtime().getPlatformInfo((platformInfo) => {\n try {\n throwRuntimeError();\n\n resolve(platformInfo);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const isManifestVersion3 = (): boolean => getManifestVersion() === 3;\n\nexport const isBackground = (): boolean => {\n if (!getId()) {\n return false;\n }\n\n const manifest = getManifest();\n\n if (!manifest.background) {\n return false;\n }\n\n if (manifest.manifest_version === 3) {\n return typeof window === \"undefined\";\n }\n\n return window !== undefined && backgroundPaths.includes(location.pathname);\n}\n\nexport const throwRuntimeError = (): void => {\n const error = runtime().lastError;\n\n if (error) {\n throw new Error(error.message);\n }\n}\n\nexport const onRuntimeInstalled = (callback: Parameters<typeof chrome.runtime.onInstalled.addListener>[0]): () => void => {\n runtime().onInstalled.addListener(callback);\n\n return () => runtime().onInstalled.removeListener(callback);\n}\n","import {getManifest, isManifestVersion3, throwRuntimeError} from \"./runtime\";\nimport {browser} from \"./browser\";\n\ntype BadgeBackgroundColorDetails = chrome.browserAction.BadgeBackgroundColorDetails;\ntype BadgeTextDetails = chrome.action.BadgeTextDetails;\ntype BrowserAction = typeof chrome.action;\n\nconst action = () => isManifestVersion3() ? browser().action : browser().browserAction;\n\nexport const setActionBadgeText = (tabId: number, text: string | number) => new Promise<void>((resolve, reject) => {\n const details: BadgeTextDetails = {text: text.toString(), tabId};\n\n action().setBadgeText(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const clearActionBadgeText = (tabId: number): Promise<void> => setActionBadgeText(tabId, '');\n\nexport const setActionBadgeBgColor = (tabId: number, color: BadgeBackgroundColorDetails['color']) => new Promise<void>((resolve, reject) => {\n const details: BadgeBackgroundColorDetails = {color, tabId};\n\n action().setBadgeBackgroundColor(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const setActionBadgeTextColor = async (\n tabId: number,\n color: BadgeBackgroundColorDetails['color']\n): Promise<void> => {\n if (!isManifestVersion3()) {\n return;\n }\n\n const root = action() as BrowserAction;\n\n await root.setBadgeTextColor({color, tabId});\n};\n\nexport const setActionIcon = (\n tabId: number,\n icon: string | Record<string, string>\n): Promise<void> => new Promise<void>((resolve, reject) => {\n action().setIcon({tabId, path: icon}, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getActionDefaultPopup = (): string => {\n const manifest = getManifest();\n\n return isManifestVersion3() ? manifest.action.default_popup : manifest.browser_action.default_popup;\n}\n\nexport const onActionClicked = (callback: Parameters<typeof chrome.action.onClicked.addListener>[0]): () => void => {\n action().onClicked.addListener(callback);\n\n return () => action().onClicked.removeListener(callback);\n}","import {browser} from \"./browser\";\nimport {throwRuntimeError} from \"@browser/runtime\";\n\ntype Command = chrome.commands.Command;\n\nconst commands = () => browser().commands;\n\nexport const isSupportCommands = (): boolean => !!commands;\n\nexport const getAllCommands = () => new Promise<Command[]>((resolve, reject) => {\n commands().getAll((commands) => {\n try {\n throwRuntimeError();\n\n resolve(commands);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const onCommand = (callback: Parameters<typeof chrome.commands.onCommand.addListener>[0]): () => void => {\n commands().onCommand.addListener(callback);\n\n return () => commands().onCommand.removeListener(callback);\n}\n","export enum Language {\n Arabic = 'ar',\n Amharic = 'am',\n Bulgarian = 'bg',\n Bengali = 'bn',\n Catalan = 'ca',\n Czech = 'cs',\n Danish = 'da',\n German = 'de',\n Greek = 'el',\n English = 'en',\n EnglishAustralia = 'en_AU',\n EnglishGreatBritain = 'en_GB',\n EnglishUSA = 'en_US',\n Spanish = 'es',\n SpanishLatinAmericaAndCaribbean = 'es_419',\n Estonian = 'et',\n Persian = 'fa',\n Finnish = 'fi',\n Filipino = 'fil',\n French = 'fr',\n Gujarati = 'gu',\n Hebrew = 'he',\n Hindi = 'hi',\n Croatian = 'hr',\n Hungarian = 'hu',\n Indonesian = 'id',\n Italian = 'it',\n Japanese = 'ja',\n Kannada = 'kn',\n Korean = 'ko',\n Lithuanian = 'lt',\n Latvian = 'lv',\n Malayalam = 'ml',\n Marathi = 'mr',\n Malay = 'ms',\n Dutch = 'nl',\n Norwegian = 'no',\n Polish = 'pl',\n PortugueseBrazil = 'pt_BR',\n PortuguesePortugal = 'pt_PT',\n Romanian = 'ro',\n Russian = 'ru',\n Slovak = 'sk',\n Slovenian = 'sl',\n Serbian = 'sr',\n Swedish = 'sv',\n Swahili = 'sw',\n Tamil = 'ta',\n Telugu = 'te',\n Thai = 'th',\n Turkish = 'tr',\n Ukrainian = 'uk',\n Vietnamese = 'vi',\n ChineseChina = 'zh_CN',\n ChineseTaiwan = 'zh_TW',\n}\n\nexport enum LocaleDir {\n RightToLeft = 'rtl',\n LeftToRight = 'ltr',\n}\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([\n Language.Arabic,\n Language.Persian,\n Language.Hebrew,\n]);\n\nexport const LocaleNestedKeysSeparator = '.';\n\nexport const LocaleKeysSeparator = '_';\n\nexport const LocaleValuesSeparator = '|';\n\nexport const LocaleCustomKeyForLanguage = 'locale';\n\nexport const LocaleKeyMarker = '@';\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set(['yaml', 'yml', 'json']);\n\nexport const LocaleDirectoryName = 'locales';\n\nexport type LocaleValue = string | number | string[] | number[];\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport type LocaleFutures = {\n plural: boolean;\n substitutions: readonly string[];\n};\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\nexport type LocaleNonPluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: false } ? K : never }[keyof T] & string\n\nexport type LocalePluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: true } ? K : never }[keyof T] & string\n\nexport type LocaleSubstitutionsFor<\n T extends LocaleStructure,\n K extends keyof T\n> = T[K] extends { substitutions: readonly (infer U)[] }\n ? Partial<Record<U & string, string | number>>\n : never\n\nexport interface LocaleProvider<S extends LocaleStructure> {\n lang(): Language;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n}\n","import {\n Language,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleProvider,\n LocaleStructure,\n LocaleSubstitutionsFor,\n LocaleValuesSeparator\n} from \"@typing/locale\";\n\nexport default abstract class AbstractLocale<S extends LocaleStructure>\n implements LocaleProvider<S> {\n\n public abstract lang(): Language;\n\n public abstract keys(): Set<keyof S>;\n\n protected abstract value(key: keyof S & string): string | undefined;\n\n /**\n * Non-plural перевод\n */\n public trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n return this.get(key, substitutions);\n }\n\n /**\n * Plural-перевод\n */\n public choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const parts = this.get(key, substitutions).split(LocaleValuesSeparator);\n const idx = this.getPluralIndex(count);\n return parts[idx] ?? parts[0] ?? (key as string);\n }\n\n public get<K extends keyof S & string>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const template = this.value(key);\n\n if (template === undefined) {\n console.warn(`Locale key \"${key}\" not found in \"${this.lang()}\" language.`);\n return key as string;\n }\n\n if (substitutions) {\n return template.replace(/{{(.*?)}}/g, (_, placeholder: string) => {\n if (placeholder in substitutions) {\n return substitutions[placeholder]!.toString();\n }\n console.warn(\n `Locale substitution \"${placeholder}\" not found for key \"${key}\" in \"${this.lang()}\" language.`\n );\n return placeholder;\n });\n }\n\n return template;\n }\n\n private getPluralIndex(count: number): number {\n switch (this.lang()) {\n case Language.Indonesian:\n case Language.Japanese:\n case Language.Kannada:\n case Language.Korean:\n case Language.Malay:\n case Language.Thai:\n case Language.Turkish:\n case Language.Vietnamese:\n return 0;\n\n case Language.Bengali:\n case Language.Bulgarian:\n case Language.Catalan:\n case Language.Danish:\n case Language.German:\n case Language.Greek:\n case Language.English:\n case Language.EnglishAustralia:\n case Language.EnglishGreatBritain:\n case Language.EnglishUSA:\n case Language.Spanish:\n case Language.SpanishLatinAmericaAndCaribbean:\n case Language.Estonian:\n case Language.Persian:\n case Language.Finnish:\n case Language.Gujarati:\n case Language.Hebrew:\n case Language.Hungarian:\n case Language.Italian:\n case Language.Malayalam:\n case Language.Marathi:\n case Language.Dutch:\n case Language.Norwegian:\n case Language.Swedish:\n case Language.Swahili:\n case Language.Tamil:\n case Language.Telugu:\n case Language.ChineseChina:\n case Language.ChineseTaiwan:\n case Language.PortugueseBrazil:\n case Language.PortuguesePortugal:\n return (count == 1) ? 0 : 1;\n\n case Language.Amharic:\n case Language.Filipino:\n case Language.French:\n case Language.Hindi:\n return ((count == 0) || (count == 1)) ? 0 : 1;\n\n case Language.Croatian:\n case Language.Russian:\n case Language.Serbian:\n case Language.Ukrainian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Czech:\n case Language.Slovak:\n return (count == 1) ? 0 : (((count >= 2) && (count <= 4)) ? 1 : 2);\n\n case Language.Lithuanian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Slovenian:\n return (count % 100 == 1) ? 0 : ((count % 100 == 2) ? 1 : (((count % 100 == 3) || (count % 100 == 4)) ? 2 : 3));\n\n case Language.Latvian:\n return (count == 0) ? 0 : (((count % 10 == 1) && (count % 100 != 11)) ? 1 : 2);\n\n case Language.Polish:\n return (count == 1) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 12) || (count % 100 > 14))) ? 1 : 2);\n\n case Language.Romanian:\n return (count == 1) ? 0 : (((count == 0) || ((count % 100 > 0) && (count % 100 < 20))) ? 1 : 2);\n\n case Language.Arabic:\n return (count == 0) ? 0 : ((count == 1) ? 1 : ((count == 2) ? 2 : (((count % 100 >= 3) && (count % 100 <= 10)) ? 3 : (((count % 100 >= 11) && (count % 100 <= 99)) ? 4 : 5))));\n\n default:\n return 0;\n }\n }\n}\n\n","import {browser} from \"./browser\";\nimport {throwRuntimeError} from \"./runtime\";\n\ntype LanguageDetectionResult = chrome.i18n.LanguageDetectionResult\n\nconst i18n = () => browser().i18n;\n\nexport const canUseNativeI18nMessage = (): boolean => typeof (i18n().getMessage) !== \"undefined\";\n\nexport const getI18nMessage = (key: string): string | undefined => {\n if (!canUseNativeI18nMessage()) {\n return;\n }\n\n return i18n().getMessage(key);\n}\n\nexport const getI18nAcceptLanguages = (): Promise<string[]> => new Promise<string[]>((resolve, reject) => {\n i18n().getAcceptLanguages(locales => {\n try {\n throwRuntimeError();\n\n resolve(locales);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getI18nUILanguage = (): string | undefined => {\n const i18n = browser().i18n;\n\n if (!i18n['getUILanguage']) {\n return;\n }\n\n return i18n.getUILanguage();\n}\n\nexport const detectI18Language = (text: string): Promise<LanguageDetectionResult> => new Promise<LanguageDetectionResult>((resolve, reject) => {\n i18n().detectLanguage(text, result => {\n try {\n throwRuntimeError();\n\n resolve(result);\n } catch (e) {\n reject(e);\n }\n });\n});\n","import {Language, LocaleKeyMarker, LocaleKeysSeparator, LocaleNestedKeysSeparator} from \"@typing/locale\";\n\nexport const getLocaleFilename = (lang: Language): string => {\n return `_locales/${lang}/messages.json`;\n};\n\nexport const convertLocaleKey = (key: string): string => {\n return key.replaceAll(LocaleNestedKeysSeparator, LocaleKeysSeparator);\n}\n\nexport const convertLocaleMessageKey = (key: string): string => {\n return `__MSG_${convertLocaleKey(key)}__`;\n}\n\nexport const extractLocaleKey = (key?: string): string | undefined => {\n if (isLocaleKey(key)) {\n return key.substring(1);\n }\n}\n\nexport const isLocaleKey = (key?: string): key is string => {\n return key?.startsWith(LocaleKeyMarker) ?? false;\n}\n\nexport const modifyLocaleMessageKey = (key?: string): string | undefined => {\n if (typeof key !== \"string\") {\n return undefined;\n }\n\n const localeKey = extractLocaleKey(key);\n\n if (localeKey) {\n return convertLocaleMessageKey(localeKey);\n }\n\n return key;\n}\n\n","import {Browser} from \"@typing/browser\";\nimport {ManifestVersion} from \"@typing/manifest\";\n\nexport const getEnv: {\n <T extends string>(key: string): T | undefined;\n <T extends string, D>(key: string, defaults: D): T | D;\n} = (key: string, defaults?: string) => {\n const env = process.env;\n\n return (env[key] ?? defaults) as any;\n};\n\nexport const getApp = (): string => {\n const app = getEnv('APP');\n\n if (app === undefined) {\n throw new Error('App is not defined');\n }\n\n return app;\n};\n\nexport const getBrowser = (): Browser => {\n const browser = getEnv<Browser>('BROWSER');\n\n if (browser === undefined) {\n throw new Error('Browser is not defined');\n }\n\n return browser;\n}\n\nexport const isBrowser = (browser: Browser): browser is Browser => {\n return getBrowser() === browser;\n}\n\nexport const getManifestVersion = (): ManifestVersion => {\n const manifestVersion = getEnv('MANIFEST_VERSION', '3');\n\n return parseInt(manifestVersion) as ManifestVersion;\n}","import {getI18nMessage, getI18nUILanguage} from \"@browser/i18n\";\n\nimport AbstractLocale from \"./AbstractLocale\";\n\nimport {convertLocaleKey} from \"@locale/utils\";\nimport {isBrowser} from \"@main/env\";\n\nimport {Language, LanguageCodes, LocaleCustomKeyForLanguage, LocaleProvider, LocaleStructure} from \"@typing/locale\";\nimport {Browser} from \"@typing/browser\";\n\nexport interface LocaleNativeStructure extends LocaleStructure {\n}\n\nexport default class NativeLocale extends AbstractLocale<LocaleNativeStructure> {\n private static instance?: LocaleProvider<LocaleNativeStructure>;\n\n public static getInstance<S extends LocaleStructure = LocaleNativeStructure>(): LocaleProvider<S> {\n return NativeLocale.instance ??= new NativeLocale();\n }\n\n public lang(): Language {\n let lang: Language | undefined;\n\n /**\n * The Opera browser does not support RTL languages,\n * and for Opera you need to directly indicate what kind of language it is.\n * interface language is always different\n */\n if (isBrowser(Browser.Opera)) {\n lang = getI18nMessage(LocaleCustomKeyForLanguage) as Language;\n\n if (LanguageCodes.has(lang)) {\n return lang;\n }\n }\n\n lang = getI18nUILanguage() as Language;\n\n if (!lang) {\n throw new Error(\"Locale Native: Unable to get UI language\");\n }\n\n return lang;\n }\n\n\n public keys(): Set<keyof LocaleNativeStructure> {\n try {\n // @ts-expect-error\n return new Set<string>(LOCALE_KEYS);\n } catch (e) {\n console.error(\"Locale Native: Unable to get keys\", e);\n\n return new Set<string>();\n }\n }\n\n protected value(key: Extract<keyof LocaleNativeStructure, string>): string | undefined {\n const value = getI18nMessage(convertLocaleKey(key));\n\n if (!value || value.length === 0) {\n return undefined;\n }\n\n return value;\n }\n}","import {LocaleNativeStructure, NativeLocale} from \"@locale/providers\";\n\nimport {convertLocaleMessageKey, extractLocaleKey} from \"@locale/utils\";\n\nimport {\n Language,\n LanguageCodes,\n LocaleDir,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleSubstitutionsFor\n} from \"@typing/locale\";\n\nexport {Language, LanguageCodes, LocaleDir};\n\n/**\n * Translates a given locale key into the corresponding localized string.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, with substitutions applied if provided.\n */\nexport const _ = <K extends LocaleNonPluralKeys<LocaleNativeStructure>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().trans(key, substitutions);\n};\n\n/**\n * Translates a given locale key into the corresponding localized string\n * based on a specific count for pluralization.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {number} count - The count used to determine the pluralization form.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, adjusted for pluralization and with substitutions applied if provided.\n */\nexport const _c = <K extends LocalePluralKeys<LocaleNativeStructure>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().choice(key, count, substitutions);\n};\n\n/**\n * Converts a locale key into a standardized format and logs a warning if the key is not found\n * in the current language's locale keys.\n *\n * @param {Extract<keyof LocaleNativeStructure, string>} key - The locale key to be converted.\n * This key must be a string and exist within the `LocaleNativeStructure`.\n * @returns {string} - The converted locale message key.\n */\nexport const __ = (key: keyof LocaleNativeStructure & string): string => {\n const locale = NativeLocale.getInstance();\n\n if (!locale.keys().has(key)) {\n console.warn(`Locale key \"${key}\" not found in \"${locale.lang()}\" language.`);\n }\n\n return convertLocaleMessageKey(key);\n};\n\n\n/**\n * Attempts to extract a locale key from the provided string and translates it\n * into the corresponding localized string. If no locale key can be extracted,\n * the original string is returned.\n *\n * @param {string} input - The input string from which a locale key is to be extracted.\n * @returns {string} - The translated string if a locale key is successfully extracted,\n * or the original string if no locale key is found.\n */\nexport const __t = (input: string): string => {\n const localeKey = extractLocaleKey(input);\n\n if (localeKey) {\n return _(localeKey as LocaleNonPluralKeys<LocaleNativeStructure>);\n }\n\n return input;\n};","import {EntrypointBuilder, EntrypointBuilderClass} from \"@typing/entrypoint\";\n\nexport default abstract class implements EntrypointBuilder {\n public abstract build(): Promise<void>;\n\n public abstract destroy(): Promise<void>;\n\n public static resolver(this: new (definition: any) => EntrypointBuilder) {\n return (definition: EntrypointBuilderClass<typeof this>): void => {\n new this(definition).build().catch(e => {\n console.error('Failed to build entrypoint:', e);\n });\n };\n }\n}","import {CommandDefinition, CommandExecute} from \"@typing/command\";\n\nexport const isValidCommandDefinition = (definition: any): definition is CommandDefinition => {\n return definition && typeof definition === 'object' && definition.constructor === Object;\n}\n\nexport const isValidCommandExecuteFunction = (execute: any): execute is CommandExecute => {\n return execute && typeof execute === 'function';\n}\n\nexport const isValidCommandName = (name: any): name is string => {\n return name && typeof name === 'string' && name.trim().length > 0;\n}","import {Required} from \"utility-types\";\n\nimport {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {BackgroundConfig} from \"@typing/background\";\nimport {Awaiter} from \"@typing/helpers\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport const CommandExecuteActionName = '_execute_action';\n\nexport interface CommandConfig extends BackgroundConfig {\n name: string;\n description?: string;\n global?: boolean;\n defaultKey?: string;\n windowsKey?: string;\n macKey?: string;\n chromeosKey?: string;\n linuxKey?: string;\n}\n\nexport type CommandOptions = CommandConfig & EntrypointOptions;\n\nexport type CommandEntrypointOptions = Partial<CommandOptions>;\n\nexport type CommandExecute = (tab: Tab | undefined, options: CommandOptions) => Awaiter<void>;\n\nexport interface CommandDefinition extends CommandEntrypointOptions {\n execute: CommandExecute;\n}\n\nexport type ExecuteActionCommandDefinition = Omit<CommandDefinition, 'name'>;\n\nexport type CommandUnresolvedDefinition = Partial<CommandDefinition>;\n\nexport type CommandResolvedDefinition = Required<CommandDefinition, 'name' | 'execute'>;\n\nexport type CommandBuilder = EntrypointBuilder;","import {onActionClicked} from \"@browser/action\";\nimport {onCommand} from \"@browser/command\";\n\nimport {__t} from \"@main/locale\";\n\nimport Builder from \"@entry/core/Builder\";\n\nimport {isValidCommandExecuteFunction, isValidCommandName} from \"./resolvers\";\n\nimport {\n CommandBuilder,\n CommandExecuteActionName,\n CommandResolvedDefinition,\n CommandUnresolvedDefinition\n} from \"@typing/command\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport default class extends Builder implements CommandBuilder {\n protected readonly definition: CommandResolvedDefinition;\n\n protected unsubscribe?: () => void;\n\n public constructor(definition: CommandUnresolvedDefinition) {\n super();\n\n const {name, execute, description} = definition;\n\n if (!isValidCommandExecuteFunction(execute)) {\n throw new Error('The command entrypoint must export a execute function');\n }\n\n if (!isValidCommandName(name)) {\n throw new Error('The command entrypoint must export a name string');\n }\n\n this.definition = {\n ...definition,\n name,\n execute,\n description: description ? __t(description) : undefined,\n };\n }\n\n public async build(): Promise<void> {\n const {name} = this.definition;\n\n if (name == CommandExecuteActionName) {\n this.unsubscribe = onActionClicked((tab) => {\n this.handle(tab);\n });\n\n return;\n }\n\n this.unsubscribe = onCommand((command, tab) => {\n if (command === name) {\n this.handle(tab);\n }\n });\n }\n\n public async destroy(): Promise<void> {\n this.unsubscribe?.();\n }\n\n protected handle(tab?: Tab): void {\n const {name, execute, ...options} = this.definition;\n\n try {\n Promise.resolve(execute(tab, {name, ...options})).catch((e) => {\n console.error('The command execute async function crashed:', e);\n });\n } catch (e) {\n console.error('The command execute function crashed:', e);\n }\n }\n}","import Builder from \"./Builder\";\n\nexport * from \"./resolvers\";\n\nexport default Builder.resolver();"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/browser/browser.ts","../../../src/browser/utils.ts","../../../src/browser/runtime.ts","../../../src/browser/action.ts","../../../src/browser/command.ts","../../../src/types/locale.ts","../../../src/locale/providers/AbstractLocale.ts","../../../src/browser/i18n.ts","../../../src/locale/utils.ts","../../../src/main/env.ts","../../../src/locale/providers/NativeLocale.ts","../../../src/main/locale.ts","../../../src/entry/core/Builder.ts","../../../src/entry/command/resolvers/definition.ts","../../../src/types/command.ts","../../../src/entry/command/Builder.ts","../../../src/entry/command/index.ts"],"names":["Language","_","i18n","browser","Builder_default"],"mappings":"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","file":"index.js","sourcesContent":["export const browser = (): typeof chrome => {\n return chrome;\n}","type Event<T extends Function> = chrome.events.Event<T>\n\nexport function safeListener<T extends (...args: any[]) => any>(listener: T): T {\n return ((...args: Parameters<T>): ReturnType<T> | void => {\n try {\n const result = listener(...args);\n\n if (result instanceof Promise) {\n result.catch(err => {\n console.error('Listener async error:', err);\n });\n }\n\n return result;\n } catch (err) {\n console.error('Listener sync error:', err);\n }\n }) as T;\n}\n\nexport function handleListener<T extends (...args: any[]) => void>(\n target: Event<T>,\n callback: T,\n): () => void {\n const listener = safeListener(callback);\n\n target.addListener(listener);\n\n return () => target.removeListener(listener);\n}","import {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\n\nimport {ManifestVersion} from \"@typing/manifest\";\nimport {MessageBody, MessageDictionary, MessageResponse, MessageType} from \"@typing/message\";\n\ntype Manifest = chrome.runtime.Manifest;\ntype PlatformInfo = chrome.runtime.PlatformInfo;\ntype ContextFilter = chrome.runtime.ContextFilter;\ntype ExtensionContext = chrome.runtime.ExtensionContext;\n\nconst runtime = () => browser().runtime;\n\nconst backgroundPaths = [\n '/_generated_background_page.view',\n];\n\nexport const getId = (): string => runtime().id;\n\nexport const getUrl = (path: string) => runtime().getURL(path);\n\nexport const getManifest = (): Manifest => runtime().getManifest();\n\nexport const getManifestVersion = (): ManifestVersion => getManifest().manifest_version;\n\nexport const getRuntimeContexts = (filter: ContextFilter) => new Promise<ExtensionContext[]>((resolve, reject) => {\n runtime().getContexts(filter, contexts => {\n try {\n throwRuntimeError();\n\n resolve(contexts);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getPlatformInfo = (): Promise<PlatformInfo> => new Promise<PlatformInfo>((resolve, reject) => {\n runtime().getPlatformInfo((platformInfo) => {\n try {\n throwRuntimeError();\n\n resolve(platformInfo);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const isManifestVersion3 = (): boolean => getManifestVersion() === 3;\n\nexport const isBackground = (): boolean => {\n if (!getId()) {\n return false;\n }\n\n const manifest = getManifest();\n\n if (!manifest.background) {\n return false;\n }\n\n if (manifest.manifest_version === 3) {\n return typeof window === \"undefined\";\n }\n\n return window !== undefined && backgroundPaths.includes(location.pathname);\n}\n\nexport const throwRuntimeError = (): void => {\n const error = runtime().lastError;\n\n if (error) {\n throw new Error(error.message);\n }\n}\n\nexport const sendMessage = <\n T extends MessageDictionary,\n K extends MessageType<T>\n>(\n message: MessageBody<T, K>\n): Promise<MessageResponse<T, K>> => new Promise<MessageResponse<T, K>>((resolve, reject) => {\n runtime().sendMessage(message, (response) => {\n try {\n throwRuntimeError();\n\n resolve(response);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const onRuntimeInstalled = (callback: Parameters<typeof chrome.runtime.onInstalled.addListener>[0]): () => void => {\n return handleListener(runtime().onInstalled, callback)\n}\n\nexport const onMessage = (callback: Parameters<typeof chrome.runtime.onMessage.addListener>[0]): () => void => {\n return handleListener(runtime().onMessage, callback)\n}\n","import {getManifest, isManifestVersion3, throwRuntimeError} from \"./runtime\";\nimport {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\n\ntype BadgeBackgroundColorDetails = chrome.browserAction.BadgeBackgroundColorDetails;\ntype BadgeTextDetails = chrome.action.BadgeTextDetails;\ntype BrowserAction = typeof chrome.action;\n\nconst action = () => isManifestVersion3() ? browser().action : browser().browserAction;\n\nexport const setActionBadgeText = (tabId: number, text: string | number) => new Promise<void>((resolve, reject) => {\n const details: BadgeTextDetails = {text: text.toString(), tabId};\n\n action().setBadgeText(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const clearActionBadgeText = (tabId: number): Promise<void> => setActionBadgeText(tabId, '');\n\nexport const setActionBadgeBgColor = (tabId: number, color: BadgeBackgroundColorDetails['color']) => new Promise<void>((resolve, reject) => {\n const details: BadgeBackgroundColorDetails = {color, tabId};\n\n action().setBadgeBackgroundColor(details, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const setActionBadgeTextColor = async (\n tabId: number,\n color: BadgeBackgroundColorDetails['color']\n): Promise<void> => {\n if (!isManifestVersion3()) {\n return;\n }\n\n const root = action() as BrowserAction;\n\n await root.setBadgeTextColor({color, tabId});\n};\n\nexport const setActionIcon = (\n tabId: number,\n icon: string | Record<string, string>\n): Promise<void> => new Promise<void>((resolve, reject) => {\n action().setIcon({tabId, path: icon}, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getActionDefaultPopup = (): string => {\n const manifest = getManifest();\n\n return isManifestVersion3() ? manifest.action.default_popup : manifest.browser_action.default_popup;\n}\n\nexport const onActionClicked = (callback: Parameters<typeof chrome.action.onClicked.addListener>[0]): () => void => {\n return handleListener(action().onClicked, callback)\n}","import {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\nimport {throwRuntimeError} from \"@browser/runtime\";\n\ntype Command = chrome.commands.Command;\n\nconst commands = () => browser().commands;\n\nexport const isSupportCommands = (): boolean => !!commands;\n\nexport const getAllCommands = () => new Promise<Command[]>((resolve, reject) => {\n commands().getAll((commands) => {\n try {\n throwRuntimeError();\n\n resolve(commands);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const onCommand = (callback: Parameters<typeof chrome.commands.onCommand.addListener>[0]): () => void => {\n return handleListener(commands().onCommand, callback)\n}\n","export enum Language {\n Arabic = 'ar',\n Amharic = 'am',\n Bulgarian = 'bg',\n Bengali = 'bn',\n Catalan = 'ca',\n Czech = 'cs',\n Danish = 'da',\n German = 'de',\n Greek = 'el',\n English = 'en',\n EnglishAustralia = 'en_AU',\n EnglishGreatBritain = 'en_GB',\n EnglishUSA = 'en_US',\n Spanish = 'es',\n SpanishLatinAmericaAndCaribbean = 'es_419',\n Estonian = 'et',\n Persian = 'fa',\n Finnish = 'fi',\n Filipino = 'fil',\n French = 'fr',\n Gujarati = 'gu',\n Hebrew = 'he',\n Hindi = 'hi',\n Croatian = 'hr',\n Hungarian = 'hu',\n Indonesian = 'id',\n Italian = 'it',\n Japanese = 'ja',\n Kannada = 'kn',\n Korean = 'ko',\n Lithuanian = 'lt',\n Latvian = 'lv',\n Malayalam = 'ml',\n Marathi = 'mr',\n Malay = 'ms',\n Dutch = 'nl',\n Norwegian = 'no',\n Polish = 'pl',\n PortugueseBrazil = 'pt_BR',\n PortuguesePortugal = 'pt_PT',\n Romanian = 'ro',\n Russian = 'ru',\n Slovak = 'sk',\n Slovenian = 'sl',\n Serbian = 'sr',\n Swedish = 'sv',\n Swahili = 'sw',\n Tamil = 'ta',\n Telugu = 'te',\n Thai = 'th',\n Turkish = 'tr',\n Ukrainian = 'uk',\n Vietnamese = 'vi',\n ChineseChina = 'zh_CN',\n ChineseTaiwan = 'zh_TW',\n}\n\nexport enum LocaleDir {\n RightToLeft = 'rtl',\n LeftToRight = 'ltr',\n}\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([\n Language.Arabic,\n Language.Persian,\n Language.Hebrew,\n]);\n\nexport const LocaleNestedKeysSeparator = '.';\n\nexport const LocaleKeysSeparator = '_';\n\nexport const LocaleValuesSeparator = '|';\n\nexport const LocaleCustomKeyForLanguage = 'locale';\n\nexport const LocaleKeyMarker = '@';\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set(['yaml', 'yml', 'json']);\n\nexport const LocaleDirectoryName = 'locales';\n\nexport type LocaleValue = string | number | string[] | number[];\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport type LocaleFutures = {\n plural: boolean;\n substitutions: readonly string[];\n};\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\nexport type LocaleNonPluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: false } ? K : never }[keyof T] & string\n\nexport type LocalePluralKeys<T extends LocaleStructure> =\n { [K in keyof T]: T[K] extends { plural: true } ? K : never }[keyof T] & string\n\nexport type LocaleSubstitutionsFor<\n T extends LocaleStructure,\n K extends keyof T\n> = T[K] extends { substitutions: readonly (infer U)[] }\n ? Partial<Record<U & string, string | number>>\n : never\n\nexport interface LocaleProvider<S extends LocaleStructure> {\n lang(): Language;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string;\n}\n","import {\n Language,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleProvider,\n LocaleStructure,\n LocaleSubstitutionsFor,\n LocaleValuesSeparator\n} from \"@typing/locale\";\n\nexport default abstract class AbstractLocale<S extends LocaleStructure>\n implements LocaleProvider<S> {\n\n public abstract lang(): Language;\n\n public abstract keys(): Set<keyof S>;\n\n protected abstract value(key: keyof S & string): string | undefined;\n\n /**\n * Non-plural перевод\n */\n public trans<K extends LocaleNonPluralKeys<S>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n return this.get(key, substitutions);\n }\n\n /**\n * Plural-перевод\n */\n public choice<K extends LocalePluralKeys<S>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const parts = this.get(key, substitutions).split(LocaleValuesSeparator);\n const idx = this.getPluralIndex(count);\n return parts[idx] ?? parts[0] ?? (key as string);\n }\n\n public get<K extends keyof S & string>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<S, K>\n ): string {\n const template = this.value(key);\n\n if (template === undefined) {\n console.warn(`Locale key \"${key}\" not found in \"${this.lang()}\" language.`);\n return key as string;\n }\n\n if (substitutions) {\n return template.replace(/{{(.*?)}}/g, (_, placeholder: string) => {\n if (placeholder in substitutions) {\n return substitutions[placeholder]!.toString();\n }\n console.warn(\n `Locale substitution \"${placeholder}\" not found for key \"${key}\" in \"${this.lang()}\" language.`\n );\n return placeholder;\n });\n }\n\n return template;\n }\n\n private getPluralIndex(count: number): number {\n switch (this.lang()) {\n case Language.Indonesian:\n case Language.Japanese:\n case Language.Kannada:\n case Language.Korean:\n case Language.Malay:\n case Language.Thai:\n case Language.Turkish:\n case Language.Vietnamese:\n return 0;\n\n case Language.Bengali:\n case Language.Bulgarian:\n case Language.Catalan:\n case Language.Danish:\n case Language.German:\n case Language.Greek:\n case Language.English:\n case Language.EnglishAustralia:\n case Language.EnglishGreatBritain:\n case Language.EnglishUSA:\n case Language.Spanish:\n case Language.SpanishLatinAmericaAndCaribbean:\n case Language.Estonian:\n case Language.Persian:\n case Language.Finnish:\n case Language.Gujarati:\n case Language.Hebrew:\n case Language.Hungarian:\n case Language.Italian:\n case Language.Malayalam:\n case Language.Marathi:\n case Language.Dutch:\n case Language.Norwegian:\n case Language.Swedish:\n case Language.Swahili:\n case Language.Tamil:\n case Language.Telugu:\n case Language.ChineseChina:\n case Language.ChineseTaiwan:\n case Language.PortugueseBrazil:\n case Language.PortuguesePortugal:\n return (count == 1) ? 0 : 1;\n\n case Language.Amharic:\n case Language.Filipino:\n case Language.French:\n case Language.Hindi:\n return ((count == 0) || (count == 1)) ? 0 : 1;\n\n case Language.Croatian:\n case Language.Russian:\n case Language.Serbian:\n case Language.Ukrainian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Czech:\n case Language.Slovak:\n return (count == 1) ? 0 : (((count >= 2) && (count <= 4)) ? 1 : 2);\n\n case Language.Lithuanian:\n return ((count % 10 == 1) && (count % 100 != 11)) ? 0 : (((count % 10 >= 2) && ((count % 100 < 10) || (count % 100 >= 20))) ? 1 : 2);\n\n case Language.Slovenian:\n return (count % 100 == 1) ? 0 : ((count % 100 == 2) ? 1 : (((count % 100 == 3) || (count % 100 == 4)) ? 2 : 3));\n\n case Language.Latvian:\n return (count == 0) ? 0 : (((count % 10 == 1) && (count % 100 != 11)) ? 1 : 2);\n\n case Language.Polish:\n return (count == 1) ? 0 : (((count % 10 >= 2) && (count % 10 <= 4) && ((count % 100 < 12) || (count % 100 > 14))) ? 1 : 2);\n\n case Language.Romanian:\n return (count == 1) ? 0 : (((count == 0) || ((count % 100 > 0) && (count % 100 < 20))) ? 1 : 2);\n\n case Language.Arabic:\n return (count == 0) ? 0 : ((count == 1) ? 1 : ((count == 2) ? 2 : (((count % 100 >= 3) && (count % 100 <= 10)) ? 3 : (((count % 100 >= 11) && (count % 100 <= 99)) ? 4 : 5))));\n\n default:\n return 0;\n }\n }\n}\n\n","import {browser} from \"./browser\";\nimport {throwRuntimeError} from \"./runtime\";\n\ntype LanguageDetectionResult = chrome.i18n.LanguageDetectionResult\n\nconst i18n = () => browser().i18n;\n\nexport const canUseNativeI18nMessage = (): boolean => typeof (i18n().getMessage) !== \"undefined\";\n\nexport const getI18nMessage = (key: string): string | undefined => {\n if (!canUseNativeI18nMessage()) {\n return;\n }\n\n return i18n().getMessage(key);\n}\n\nexport const getI18nAcceptLanguages = (): Promise<string[]> => new Promise<string[]>((resolve, reject) => {\n i18n().getAcceptLanguages(locales => {\n try {\n throwRuntimeError();\n\n resolve(locales);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getI18nUILanguage = (): string | undefined => {\n const i18n = browser().i18n;\n\n if (!i18n['getUILanguage']) {\n return;\n }\n\n return i18n.getUILanguage();\n}\n\nexport const detectI18Language = (text: string): Promise<LanguageDetectionResult> => new Promise<LanguageDetectionResult>((resolve, reject) => {\n i18n().detectLanguage(text, result => {\n try {\n throwRuntimeError();\n\n resolve(result);\n } catch (e) {\n reject(e);\n }\n });\n});\n","import {Language, LocaleKeyMarker, LocaleKeysSeparator, LocaleNestedKeysSeparator} from \"@typing/locale\";\n\nexport const getLocaleFilename = (lang: Language): string => {\n return `_locales/${lang}/messages.json`;\n};\n\nexport const convertLocaleKey = (key: string): string => {\n return key.replaceAll(LocaleNestedKeysSeparator, LocaleKeysSeparator);\n}\n\nexport const convertLocaleMessageKey = (key: string): string => {\n return `__MSG_${convertLocaleKey(key)}__`;\n}\n\nexport const extractLocaleKey = (key?: string): string | undefined => {\n if (isLocaleKey(key)) {\n return key.substring(1);\n }\n}\n\nexport const isLocaleKey = (key?: string): key is string => {\n return key?.startsWith(LocaleKeyMarker) ?? false;\n}\n\nexport const modifyLocaleMessageKey = (key?: string): string | undefined => {\n if (typeof key !== \"string\") {\n return undefined;\n }\n\n const localeKey = extractLocaleKey(key);\n\n if (localeKey) {\n return convertLocaleMessageKey(localeKey);\n }\n\n return key;\n}\n\n","import {Browser} from \"@typing/browser\";\nimport {ManifestVersion} from \"@typing/manifest\";\n\nexport const getEnv: {\n <T extends string>(key: string): T | undefined;\n <T extends string, D>(key: string, defaults: D): T | D;\n} = (key: string, defaults?: string) => {\n const env = process.env;\n\n return (env[key] ?? defaults) as any;\n};\n\nexport const getApp = (): string => {\n const app = getEnv('APP');\n\n if (app === undefined) {\n throw new Error('App is not defined');\n }\n\n return app;\n};\n\nexport const getBrowser = (): Browser => {\n const browser = getEnv<Browser>('BROWSER');\n\n if (browser === undefined) {\n throw new Error('Browser is not defined');\n }\n\n return browser;\n}\n\nexport const isBrowser = (browser: Browser): browser is Browser => {\n return getBrowser() === browser;\n}\n\nexport const getManifestVersion = (): ManifestVersion => {\n const manifestVersion = getEnv('MANIFEST_VERSION', '3');\n\n return parseInt(manifestVersion) as ManifestVersion;\n}","import {getI18nMessage, getI18nUILanguage} from \"@browser/i18n\";\n\nimport AbstractLocale from \"./AbstractLocale\";\n\nimport {convertLocaleKey} from \"@locale/utils\";\nimport {isBrowser} from \"@main/env\";\n\nimport {Language, LanguageCodes, LocaleCustomKeyForLanguage, LocaleProvider, LocaleStructure} from \"@typing/locale\";\nimport {Browser} from \"@typing/browser\";\n\nexport interface LocaleNativeStructure extends LocaleStructure {\n}\n\nexport default class NativeLocale extends AbstractLocale<LocaleNativeStructure> {\n private static instance?: LocaleProvider<LocaleNativeStructure>;\n\n public static getInstance<S extends LocaleStructure = LocaleNativeStructure>(): LocaleProvider<S> {\n return NativeLocale.instance ??= new NativeLocale();\n }\n\n public lang(): Language {\n let lang: Language | undefined;\n\n /**\n * The Opera browser does not support RTL languages,\n * and for Opera you need to directly indicate what kind of language it is.\n * interface language is always different\n */\n if (isBrowser(Browser.Opera)) {\n lang = getI18nMessage(LocaleCustomKeyForLanguage) as Language;\n\n if (LanguageCodes.has(lang)) {\n return lang;\n }\n }\n\n lang = getI18nUILanguage() as Language;\n\n if (!lang) {\n throw new Error(\"Locale Native: Unable to get UI language\");\n }\n\n return lang;\n }\n\n\n public keys(): Set<keyof LocaleNativeStructure> {\n try {\n // @ts-expect-error\n return new Set<string>(LOCALE_KEYS);\n } catch (e) {\n console.error(\"Locale Native: Unable to get keys\", e);\n\n return new Set<string>();\n }\n }\n\n protected value(key: Extract<keyof LocaleNativeStructure, string>): string | undefined {\n const value = getI18nMessage(convertLocaleKey(key));\n\n if (!value || value.length === 0) {\n return undefined;\n }\n\n return value;\n }\n}","import {LocaleNativeStructure, NativeLocale} from \"@locale/providers\";\n\nimport {convertLocaleMessageKey, extractLocaleKey} from \"@locale/utils\";\n\nimport {\n Language,\n LanguageCodes,\n LocaleDir,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleSubstitutionsFor\n} from \"@typing/locale\";\n\nexport {Language, LanguageCodes, LocaleDir};\n\n/**\n * Translates a given locale key into the corresponding localized string.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, with substitutions applied if provided.\n */\nexport const _ = <K extends LocaleNonPluralKeys<LocaleNativeStructure>>(\n key: K,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().trans(key, substitutions);\n};\n\n/**\n * Translates a given locale key into the corresponding localized string\n * based on a specific count for pluralization.\n *\n * @template K - A type representing the non-plural keys of the locale structure.\n * @param {K} key - The locale key to be translated.\n * @param {number} count - The count used to determine the pluralization form.\n * @param {LocaleSubstitutionsFor<LocaleNativeStructure, K>} [substitutions] - Optional substitutions to be applied\n * within the localized string. These are typically placeholders replaced with dynamic values.\n * @returns {string} - The translated string for the given key, adjusted for pluralization and with substitutions applied if provided.\n */\nexport const _c = <K extends LocalePluralKeys<LocaleNativeStructure>>(\n key: K,\n count: number,\n substitutions?: LocaleSubstitutionsFor<LocaleNativeStructure, K>,\n): string => {\n return NativeLocale.getInstance().choice(key, count, substitutions);\n};\n\n/**\n * Converts a locale key into a standardized format and logs a warning if the key is not found\n * in the current language's locale keys.\n *\n * @param {Extract<keyof LocaleNativeStructure, string>} key - The locale key to be converted.\n * This key must be a string and exist within the `LocaleNativeStructure`.\n * @returns {string} - The converted locale message key.\n */\nexport const __ = (key: keyof LocaleNativeStructure & string): string => {\n const locale = NativeLocale.getInstance();\n\n if (!locale.keys().has(key)) {\n console.warn(`Locale key \"${key}\" not found in \"${locale.lang()}\" language.`);\n }\n\n return convertLocaleMessageKey(key);\n};\n\n\n/**\n * Attempts to extract a locale key from the provided string and translates it\n * into the corresponding localized string. If no locale key can be extracted,\n * the original string is returned.\n *\n * @param {string} input - The input string from which a locale key is to be extracted.\n * @returns {string} - The translated string if a locale key is successfully extracted,\n * or the original string if no locale key is found.\n */\nexport const __t = (input: string): string => {\n const localeKey = extractLocaleKey(input);\n\n if (localeKey) {\n return _(localeKey as LocaleNonPluralKeys<LocaleNativeStructure>);\n }\n\n return input;\n};","import {EntrypointBuilder, EntrypointBuilderClass} from \"@typing/entrypoint\";\n\nexport default abstract class implements EntrypointBuilder {\n public abstract build(): Promise<void>;\n\n public abstract destroy(): Promise<void>;\n\n public static resolver(this: new (definition: any) => EntrypointBuilder) {\n return (definition: EntrypointBuilderClass<typeof this>): void => {\n new this(definition).build().catch(e => {\n console.error('Failed to build entrypoint:', e);\n });\n };\n }\n}","import {CommandDefinition, CommandExecute} from \"@typing/command\";\n\nexport const isValidCommandDefinition = (definition: any): definition is CommandDefinition => {\n return definition && typeof definition === 'object' && definition.constructor === Object;\n}\n\nexport const isValidCommandExecuteFunction = (execute: any): execute is CommandExecute => {\n return execute && typeof execute === 'function';\n}\n\nexport const isValidCommandName = (name: any): name is string => {\n return name && typeof name === 'string' && name.trim().length > 0;\n}","import {Required} from \"utility-types\";\n\nimport {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {BackgroundConfig} from \"@typing/background\";\nimport {Awaiter} from \"@typing/helpers\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport const CommandExecuteActionName = '_execute_action';\n\nexport interface CommandConfig extends BackgroundConfig {\n name: string;\n description?: string;\n global?: boolean;\n defaultKey?: string;\n windowsKey?: string;\n macKey?: string;\n chromeosKey?: string;\n linuxKey?: string;\n}\n\nexport type CommandOptions = CommandConfig & EntrypointOptions;\n\nexport type CommandEntrypointOptions = Partial<CommandOptions>;\n\nexport type CommandExecute = (tab: Tab | undefined, options: CommandOptions) => Awaiter<void>;\n\nexport interface CommandDefinition extends CommandEntrypointOptions {\n execute: CommandExecute;\n}\n\nexport type ExecuteActionCommandDefinition = Omit<CommandDefinition, 'name'>;\n\nexport type CommandUnresolvedDefinition = Partial<CommandDefinition>;\n\nexport type CommandResolvedDefinition = Required<CommandDefinition, 'name' | 'execute'>;\n\nexport type CommandBuilder = EntrypointBuilder;","import {onActionClicked} from \"@browser/action\";\nimport {onCommand} from \"@browser/command\";\n\nimport {__t} from \"@main/locale\";\n\nimport Builder from \"@entry/core/Builder\";\n\nimport {isValidCommandExecuteFunction, isValidCommandName} from \"./resolvers\";\n\nimport {\n CommandBuilder,\n CommandExecuteActionName,\n CommandResolvedDefinition,\n CommandUnresolvedDefinition\n} from \"@typing/command\";\n\ntype Tab = chrome.tabs.Tab;\n\nexport default class extends Builder implements CommandBuilder {\n protected readonly definition: CommandResolvedDefinition;\n\n protected unsubscribe?: () => void;\n\n public constructor(definition: CommandUnresolvedDefinition) {\n super();\n\n const {name, execute, description} = definition;\n\n if (!isValidCommandExecuteFunction(execute)) {\n throw new Error('The command entrypoint must export a execute function');\n }\n\n if (!isValidCommandName(name)) {\n throw new Error('The command entrypoint must export a name string');\n }\n\n this.definition = {\n ...definition,\n name,\n execute,\n description: description ? __t(description) : undefined,\n };\n }\n\n public async build(): Promise<void> {\n const {name} = this.definition;\n\n if (name == CommandExecuteActionName) {\n this.unsubscribe = onActionClicked((tab) => {\n this.handle(tab);\n });\n\n return;\n }\n\n this.unsubscribe = onCommand((command, tab) => {\n if (command === name) {\n this.handle(tab);\n }\n });\n }\n\n public async destroy(): Promise<void> {\n this.unsubscribe?.();\n }\n\n protected handle(tab?: Tab): void {\n const {name, execute, ...options} = this.definition;\n\n try {\n Promise.resolve(execute(tab, {name, ...options})).catch((e) => {\n console.error('The command execute async function crashed:', e);\n });\n } catch (e) {\n console.error('The command execute function crashed:', e);\n }\n }\n}","import Builder from \"./Builder\";\n\nexport * from \"./resolvers\";\n\nexport default Builder.resolver();"]}
|