browser-extension-settings 0.6.0 → 0.6.2

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/lib/common.ts CHANGED
@@ -1,4 +1,4 @@
1
- export const besVersion = 55
1
+ export const besVersion = 62
2
2
  export const openButton = `<svg viewBox="0 0 60.2601318359375 84.8134765625" version="1.1" xmlns="http://www.w3.org/2000/svg" class=" glyph-box" style="height: 9.62969px; width: 6.84191px;"><g transform="matrix(1 0 0 1 -6.194965820312518 77.63671875)"><path d="M66.4551-35.2539C66.4551-36.4746 65.9668-37.5977 65.0391-38.4766L26.3672-76.3672C25.4883-77.1973 24.4141-77.6367 23.1445-77.6367C20.6543-77.6367 18.7012-75.7324 18.7012-73.1934C18.7012-71.9727 19.1895-70.8496 19.9707-70.0195L55.5176-35.2539L19.9707-0.488281C19.1895 0.341797 18.7012 1.41602 18.7012 2.68555C18.7012 5.22461 20.6543 7.12891 23.1445 7.12891C24.4141 7.12891 25.4883 6.68945 26.3672 5.81055L65.0391-32.0312C65.9668-32.959 66.4551-34.0332 66.4551-35.2539Z"></path></g></svg>`
3
3
  export const openInNewTabButton = `<svg viewBox="0 0 72.127685546875 72.2177734375" version="1.1" xmlns="http://www.w3.org/2000/svg" class=" glyph-box" style="height: 8.19958px; width: 8.18935px;"><g transform="matrix(1 0 0 1 -12.451127929687573 71.3388671875)"><path d="M84.5703-17.334L84.5215-66.4551C84.5215-69.2383 82.7148-71.1914 79.7852-71.1914L30.6641-71.1914C27.9297-71.1914 26.0742-69.0918 26.0742-66.748C26.0742-64.4043 28.1738-62.4023 30.4688-62.4023L47.4609-62.4023L71.2891-63.1836L62.207-55.2246L13.8184-6.73828C12.9395-5.85938 12.4512-4.73633 12.4512-3.66211C12.4512-1.31836 14.5508 0.878906 16.9922 0.878906C18.1152 0.878906 19.1895 0.488281 20.0684-0.439453L68.5547-48.877L76.6113-58.0078L75.7324-35.2051L75.7324-17.1387C75.7324-14.8438 77.7344-12.6953 80.127-12.6953C82.4707-12.6953 84.5703-14.6973 84.5703-17.334Z"></path></g></svg>`
4
4
  export const settingButton = `<svg viewBox="0 0 16 16" version="1.1">
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Einstellungen",
3
3
  "settings.otherExtensions": "Andere Erweiterungen",
4
4
  "settings.locale": "Sprache",
5
+ "settings.systemLanguage": "Systemsprache",
5
6
  "settings.displaySettingsButtonInSideMenu": "Einstellungsschaltfläche im Seitenmenü anzeigen",
6
7
  "settings.menu.settings": "⚙️ Einstellungen",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Benutzer-Tags zu Links hinzufügen",
@@ -2,6 +2,7 @@ const messages = {
2
2
  "settings.title": "Settings",
3
3
  "settings.otherExtensions": "Other Extensions",
4
4
  "settings.locale": "Language",
5
+ "settings.systemLanguage": "System Language",
5
6
  "settings.displaySettingsButtonInSideMenu": "Display Settings Button in Side Menu",
6
7
  "settings.menu.settings": "⚙️ Settings",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Add usertags to links",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Configuración",
3
3
  "settings.otherExtensions": "Otras extensiones",
4
4
  "settings.locale": "Idioma",
5
+ "settings.systemLanguage": "Idioma del sistema",
5
6
  "settings.displaySettingsButtonInSideMenu": "Mostrar botón de configuración en el menú lateral",
6
7
  "settings.menu.settings": "⚙️ Configuración",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Agregar etiquetas de usuario a los enlaces",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "Paramètres",
3
3
  "settings.otherExtensions": "Autres extensions",
4
4
  "settings.locale": "Langue",
5
- "settings.displaySettingsButtonInSideMenu": "Afficher le bouton des paramètres dans le menu latéral",
5
+ "settings.systemLanguage": "Langue du système",
6
+ "settings.displaySettingsButtonInSideMenu": "Afficher le bouton de paramètres dans le menu latéral",
6
7
  "settings.menu.settings": "⚙️ Paramètres",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Ajouter des balises utilisateur aux liens",
8
9
  "settings.extensions.links-helper.title": "🔗 Assistant de liens",
@@ -1,4 +1,4 @@
1
- import { initAvailableLocales, initI18n, extractLocaleFromNavigator } from "browser-extension-i18n"
1
+ import { initAvailableLocales, initI18n, getPrefferedLocale } from "browser-extension-i18n"
2
2
  import messagesEn from "./en.js"
3
3
  import messagesZh from "./zh-cn.js"
4
4
  import messagesZhHk from "./zh-hk.js"
@@ -15,41 +15,70 @@ import messagesVi from "./vi.js"
15
15
 
16
16
  const localeMap = {
17
17
  en: messagesEn,
18
- "en-US": messagesEn,
18
+ "en-us": messagesEn,
19
19
  zh: messagesZh,
20
- "zh-CN": messagesZh,
21
- "zh-HK": messagesZhHk,
22
- "zh-TW": messagesZhTw,
20
+ "zh-cn": messagesZh,
21
+ "zh-hk": messagesZhHk,
22
+ "zh-tw": messagesZhTw,
23
23
  ru: messagesRu,
24
- "ru-RU": messagesRu,
24
+ "ru-ru": messagesRu,
25
25
  ko: messagesKo,
26
- "ko-KR": messagesKo,
26
+ "ko-kr": messagesKo,
27
27
  ja: messagesJa,
28
- "ja-JP": messagesJa,
28
+ "ja-jp": messagesJa,
29
29
  fr: messagesFr,
30
- "fr-FR": messagesFr,
30
+ "fr-fr": messagesFr,
31
31
  de: messagesDe,
32
- "de-DE": messagesDe,
32
+ "de-de": messagesDe,
33
33
  it: messagesIt,
34
- "it-IT": messagesIt,
34
+ "it-it": messagesIt,
35
35
  es: messagesEs,
36
- "es-ES": messagesEs,
36
+ "es-es": messagesEs,
37
37
  pt: messagesPt,
38
- "pt-PT": messagesPt,
39
- "pt-BR": messagesPt,
38
+ "pt-pt": messagesPt,
39
+ "pt-br": messagesPt,
40
40
  vi: messagesVi,
41
- "vi-VN": messagesVi,
41
+ "vi-vn": messagesVi,
42
+ }
43
+
44
+ // Language display names for each locale code
45
+ export const localeNames = {
46
+ en: "English",
47
+ "en-us": "English (US)",
48
+ zh: "中文",
49
+ "zh-cn": "中文 (简体)",
50
+ "zh-hk": "中文 (香港)",
51
+ "zh-tw": "中文 (台灣)",
52
+ ru: "Русский",
53
+ "ru-ru": "Русский",
54
+ ko: "한국어",
55
+ "ko-kr": "한국어",
56
+ ja: "日本語",
57
+ "ja-jp": "日本語",
58
+ fr: "Français",
59
+ "fr-fr": "Français",
60
+ de: "Deutsch",
61
+ "de-de": "Deutsch",
62
+ it: "Italiano",
63
+ "it-it": "Italiano",
64
+ es: "Español",
65
+ "es-es": "Español",
66
+ pt: "Português",
67
+ "pt-pt": "Português",
68
+ "pt-br": "Português (Brasil)",
69
+ vi: "Tiếng Việt",
70
+ "vi-vn": "Tiếng Việt",
42
71
  }
43
72
 
44
73
  const locales = Object.keys(localeMap)
45
74
 
46
75
  initAvailableLocales(locales)
47
76
 
48
- export const prefferedLocale = extractLocaleFromNavigator() || "en"
49
-
77
+ console.log("[settings] prefferedLocale:", getPrefferedLocale())
50
78
  // eslint-disable-next-line import/no-mutable-exports
51
- export let i = initI18n(localeMap, prefferedLocale)
79
+ export let i = initI18n(localeMap, getPrefferedLocale())
52
80
 
53
81
  export function resetI18n(locale?: string) {
54
- i = initI18n(localeMap, locale || prefferedLocale)
82
+ console.log("[settings] prefferedLocale:", getPrefferedLocale(), "locale:", locale)
83
+ i = initI18n(localeMap, locale || getPrefferedLocale())
55
84
  }
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "Impostazioni",
3
3
  "settings.otherExtensions": "Altre estensioni",
4
4
  "settings.locale": "Lingua",
5
- "settings.displaySettingsButtonInSideMenu": "Mostra il pulsante delle impostazioni nel menu laterale",
5
+ "settings.systemLanguage": "Lingua del sistema",
6
+ "settings.displaySettingsButtonInSideMenu": "Mostra pulsante impostazioni nel menu laterale",
6
7
  "settings.menu.settings": "⚙️ Impostazioni",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Aggiungi tag utente ai collegamenti",
8
9
  "settings.extensions.links-helper.title": "🔗 Assistente collegamenti",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "設定",
3
3
  "settings.otherExtensions": "その他の拡張機能",
4
4
  "settings.locale": "言語",
5
+ "settings.systemLanguage": "システム言語",
5
6
  "settings.displaySettingsButtonInSideMenu": "サイドメニューに設定ボタンを表示",
6
7
  "settings.menu.settings": "⚙️ 設定",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - リンクにユーザータグを追加",
@@ -1,7 +1,8 @@
1
1
  export const messages = {
2
2
  "settings.title": "설정",
3
- "settings.otherExtensions": "다른 확장 프로그램",
3
+ "settings.otherExtensions": "기타 확장 프로그램",
4
4
  "settings.locale": "언어",
5
+ "settings.systemLanguage": "시스템 언어",
5
6
  "settings.displaySettingsButtonInSideMenu": "사이드 메뉴에 설정 버튼 표시",
6
7
  "settings.menu.settings": "⚙️ 설정",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - 링크에 사용자 태그 추가",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Configurações",
3
3
  "settings.otherExtensions": "Outras extensões",
4
4
  "settings.locale": "Idioma",
5
+ "settings.systemLanguage": "Idioma do sistema",
5
6
  "settings.displaySettingsButtonInSideMenu": "Exibir botão de configurações no menu lateral",
6
7
  "settings.menu.settings": "⚙️ Configurações",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Adicionar tags de usuário aos links",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Настройки",
3
3
  "settings.otherExtensions": "Другие расширения",
4
4
  "settings.locale": "Язык",
5
+ "settings.systemLanguage": "Системный язык",
5
6
  "settings.displaySettingsButtonInSideMenu": "Показать кнопку настроек в боковом меню",
6
7
  "settings.menu.settings": "⚙️ Настройки",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Добавить пользовательские теги к ссылкам",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Cài đặt",
3
3
  "settings.otherExtensions": "Tiện ích mở rộng khác",
4
4
  "settings.locale": "Ngôn ngữ",
5
+ "settings.systemLanguage": "Ngôn ngữ hệ thống",
5
6
  "settings.displaySettingsButtonInSideMenu": "Hiển thị nút cài đặt trong menu bên",
6
7
  "settings.menu.settings": "⚙️ Cài đặt",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Thêm thẻ người dùng vào liên kết",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "设置",
3
3
  "settings.otherExtensions": "其他扩展",
4
4
  "settings.locale": "语言",
5
- "settings.displaySettingsButtonInSideMenu": "在侧边栏菜单中显示设置按钮",
5
+ "settings.systemLanguage": "系统语言",
6
+ "settings.displaySettingsButtonInSideMenu": "在侧边菜单中显示设置按钮",
6
7
  "settings.menu.settings": "⚙️ 设置",
7
8
  "settings.extensions.utags.title": "🏷️ 小鱼标签 (UTags) - 为链接添加用户标签",
8
9
  "settings.extensions.links-helper.title": "🔗 链接助手",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "設定",
3
3
  "settings.otherExtensions": "其他擴充功能",
4
4
  "settings.locale": "語言",
5
- "settings.displaySettingsButtonInSideMenu": "在側邊欄選單中顯示設定按鈕",
5
+ "settings.systemLanguage": "系統語言",
6
+ "settings.displaySettingsButtonInSideMenu": "在側邊選單中顯示設定按鈕",
6
7
  "settings.menu.settings": "⚙️ 設定",
7
8
  "settings.extensions.utags.title": "🏷️ 小魚標籤 (UTags) - 為連結添加用戶標籤",
8
9
  "settings.extensions.links-helper.title": "🔗 連結助手",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "設定",
3
3
  "settings.otherExtensions": "其他擴充功能",
4
4
  "settings.locale": "語言",
5
- "settings.displaySettingsButtonInSideMenu": "在側邊欄選單中顯示設定按鈕",
5
+ "settings.systemLanguage": "系統語言",
6
+ "settings.displaySettingsButtonInSideMenu": "在側邊選單中顯示設定按鈕",
6
7
  "settings.menu.settings": "⚙️ 設定",
7
8
  "settings.extensions.utags.title": "🏷️ 小魚標籤 (UTags) - 為連結新增使用者標籤",
8
9
  "settings.extensions.links-helper.title": "🔗 連結助手",
package/lib/settings.ts CHANGED
@@ -17,7 +17,12 @@ import {
17
17
  runWhenDomReady,
18
18
  runWhenHeadExists,
19
19
  } from "browser-extension-utils"
20
+ // @ts-expect-error - data-text import for build system
20
21
  import styleText from "data-text:./style.scss"
22
+ import {
23
+ initAvailableLocales,
24
+ getPrefferedLocale,
25
+ } from "browser-extension-i18n"
21
26
  import { createSwitchOption } from "./switch.js"
22
27
  import {
23
28
  createExtensionList,
@@ -27,7 +32,15 @@ import {
27
32
  deactiveExtensionList,
28
33
  } from "./extension-list.js"
29
34
  import { besVersion, settingButton } from "./common.js"
30
- import { i, prefferedLocale, resetI18n } from "./messages/index.js"
35
+ import { i, resetI18n, localeNames } from "./messages/index.js"
36
+
37
+ // Declare GM global variable for userscript environment
38
+ // eslint-disable-next-line @typescript-eslint/naming-convention
39
+ declare const GM:
40
+ | {
41
+ registerMenuCommand?: (name: string, function_: () => void) => void
42
+ }
43
+ | undefined
31
44
 
32
45
  const prefix = "browser_extension_settings_"
33
46
 
@@ -36,12 +49,13 @@ type SettingsOptions = {
36
49
  title: string
37
50
  footer?: string
38
51
  settingsTable?: SettingsTable
52
+ availableLocales?: readonly string[]
39
53
  onValueChange?: () => void
40
54
  onViewUpdate?: (settingsMainView: HTMLElement) => void
41
55
  relatedExtensions?: RelatedExtension[]
42
56
  }
43
57
 
44
- type SettingsTable = Record<
58
+ export type SettingsTable = Record<
45
59
  string,
46
60
  | SettingsSwitchItem
47
61
  | SettingsInputItem
@@ -181,6 +195,23 @@ export function hideSettings() {
181
195
  closeModal()
182
196
  }
183
197
 
198
+ function destroySettings() {
199
+ closeModal()
200
+ const settingsContainer = getSettingsContainer()
201
+ if (settingsContainer) {
202
+ settingsContainer.remove()
203
+ }
204
+ }
205
+
206
+ function isSettingsShown() {
207
+ const settingsContainer = getSettingsContainer()
208
+ if (settingsContainer) {
209
+ return settingsContainer.style.display === "block"
210
+ }
211
+
212
+ return false
213
+ }
214
+
184
215
  const onDocumentClick = (event: Event) => {
185
216
  const target = event.target as HTMLElement
186
217
  if (target?.closest(`.${prefix}container`)) {
@@ -320,13 +351,13 @@ function createSettingsElement() {
320
351
  class: `${prefix}main thin_scrollbar`,
321
352
  })
322
353
 
323
- addElement(settingsMain, "a", {
324
- textContent: i("settings.title"),
325
- class: "navigation_go_previous",
326
- onclick() {
327
- activeExtensionList()
328
- },
329
- })
354
+ // addElement(settingsMain, "a", {
355
+ // textContent: i("settings.title"),
356
+ // class: "navigation_go_previous",
357
+ // onclick() {
358
+ // activeExtensionList()
359
+ // },
360
+ // })
330
361
 
331
362
  if (settingsOptions.title) {
332
363
  addElement(settingsMain, "h2", { textContent: settingsOptions.title })
@@ -560,30 +591,26 @@ function addCommonSettings(settingsTable: SettingsTable) {
560
591
  settingsTable.locale = {
561
592
  title: i("settings.locale"),
562
593
  type: "select",
563
- defaultValue: prefferedLocale,
564
- options: {
565
- // eslint-disable-next-line @typescript-eslint/naming-convention
566
- English: "en",
567
- 中文: "zh",
568
- // eslint-disable-next-line @typescript-eslint/naming-convention
569
- Русский: "ru",
570
- },
594
+ defaultValue: "",
595
+ options: {},
571
596
  group: ++maxGroup,
572
597
  } as SettingsSelectItem
573
598
 
574
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
575
- settingsTable.displaySettingsButtonInSideMenu = {
576
- title: i("settings.displaySettingsButtonInSideMenu"),
577
- defaultValue: !(
578
- typeof GM === "object" && typeof GM.registerMenuCommand === "function"
579
- ),
580
- group: ++maxGroup,
581
- } as SettingsSwitchItem
599
+ // // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
600
+ // settingsTable.displaySettingsButtonInSideMenu = {
601
+ // title: i("settings.displaySettingsButtonInSideMenu"),
602
+ // defaultValue: !(
603
+ // typeof GM === "object" && typeof GM?.registerMenuCommand === "function"
604
+ // ),
605
+ // group: ++maxGroup,
606
+ // } as SettingsSwitchItem
582
607
  }
583
608
 
584
609
  function handleShowSettingsUrl() {
585
- if (location.hash === "#bes-show-settings") {
610
+ const hashString = `#!show-settings-${settingsOptions.id}`
611
+ if (location.hash === hashString) {
586
612
  setTimeout(showSettings, 100)
613
+ history.replaceState({}, "", location.href.replace(hashString, ""))
587
614
  }
588
615
  }
589
616
 
@@ -596,48 +623,86 @@ export async function showSettings() {
596
623
 
597
624
  addEventListener(document, "click", onDocumentClick, true)
598
625
  addEventListener(document, "keydown", onDocumentKeyDown, true)
599
- activeExtension(settingsOptions.id)
600
- deactiveExtensionList()
626
+ // activeExtension(settingsOptions.id)
627
+ // deactiveExtensionList()
601
628
  }
602
629
 
603
- export const initSettings = async (options: SettingsOptions) => {
630
+ let lastLocale: string | undefined
631
+
632
+ // Reset settings UI on init and locale change
633
+ // eslint-disable-next-line @typescript-eslint/naming-convention
634
+ const resetSettingsUI = (optionsProvider: () => SettingsOptions) => {
635
+ lastLocale =
636
+ (getSettingsValue("locale") as string | undefined) || getPrefferedLocale()
637
+ resetI18n(lastLocale)
638
+
639
+ const options = optionsProvider()
604
640
  settingsOptions = options
605
641
  settingsTable = options.settingsTable || {}
606
642
  addCommonSettings(settingsTable)
643
+ const availableLocales = options.availableLocales
644
+ if (availableLocales?.length) {
645
+ initAvailableLocales(availableLocales)
646
+ const localeSelect = settingsTable.locale as SettingsSelectItem
647
+ localeSelect.options = {
648
+ [i("settings.systemLanguage")]: "",
649
+ }
650
+ for (const locale of availableLocales) {
651
+ // Use language display name from localeNames, fallback to locale code if not found
652
+ const lowerCaseLocale = locale.toLowerCase()
653
+ const displayName =
654
+ localeNames[lowerCaseLocale as keyof typeof localeNames] || locale
655
+ localeSelect.options[displayName] = locale
656
+ }
657
+ }
658
+
659
+ // runWhenDomReady(() => {
660
+ // initExtensionList()
661
+ // addSideMenu()
662
+ // })
663
+ }
664
+
665
+ export const initSettings = async (optionsProvider: () => SettingsOptions) => {
607
666
  addValueChangeListener(storageKey, async () => {
608
667
  settings = await getSettings()
609
668
  // console.log(JSON.stringify(settings, null, 2))
610
669
  await updateOptions()
611
- addSideMenu()
670
+ // addSideMenu()
612
671
 
613
672
  const newLocale =
614
- (getSettingsValue("locale") as string | undefined) || prefferedLocale
673
+ (getSettingsValue("locale") as string | undefined) || getPrefferedLocale()
615
674
  console.log("lastLocale:", lastLocale, "newLocale:", newLocale)
616
675
  if (lastLocale !== newLocale) {
617
- closeModal()
676
+ const isShown = isSettingsShown()
677
+ destroySettings()
618
678
  resetI18n(newLocale)
619
679
  lastLocale = newLocale
620
- setTimeout(showSettings, 100)
680
+
681
+ setTimeout(() => {
682
+ resetSettingsUI(optionsProvider)
683
+ }, 50)
684
+
685
+ if (isShown) {
686
+ setTimeout(showSettings, 100)
687
+ }
621
688
  }
622
689
 
623
- if (typeof options.onValueChange === "function") {
624
- options.onValueChange()
690
+ if (typeof settingsOptions.onValueChange === "function") {
691
+ settingsOptions.onValueChange()
625
692
  }
626
693
  })
627
694
 
628
695
  settings = await getSettings()
629
696
 
630
- let lastLocale =
631
- (getSettingsValue("locale") as string | undefined) || prefferedLocale
632
- resetI18n(lastLocale)
697
+ resetSettingsUI(optionsProvider)
698
+ // Wait until extension intialized
699
+ setTimeout(() => {
700
+ resetSettingsUI(optionsProvider)
701
+ }, 50)
633
702
 
634
703
  runWhenHeadExists(() => {
635
704
  addStyle(getSettingsStyle())
636
705
  })
637
- runWhenDomReady(() => {
638
- initExtensionList()
639
- addSideMenu()
640
- })
641
706
 
642
707
  registerMenuCommand(i("settings.menu.settings"), showSettings, "o")
643
708
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-extension-settings",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "Settings module for developing browser extensions and userscripts",
5
5
  "type": "module",
6
6
  "main": "./lib/index.ts",
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "homepage": "https://github.com/utags/browser-extension-settings#readme",
32
32
  "dependencies": {
33
- "browser-extension-i18n": "^0.1.1",
33
+ "browser-extension-i18n": "^0.1.3",
34
34
  "browser-extension-storage": "^0.1.2",
35
35
  "browser-extension-utils": "^0.2.0"
36
36
  },