From 31c76c4ec2903f0d8b1b2eddd6353ab5d5e079ea Mon Sep 17 00:00:00 2001 From: Tanmay Shah Date: Fri, 1 Dec 2023 13:34:54 +0530 Subject: [PATCH 1/6] feat: plasmo extension configured with svelte, background worker, tailwind, browser utils --- .../.github/workflows/submit.yml | 34 + oslash-with-plasmo/.gitignore | 42 + oslash-with-plasmo/.prettierrc.mjs | 26 + oslash-with-plasmo/README.md | 35 + oslash-with-plasmo/assets/icon.png | Bin 0 -> 5952 bytes oslash-with-plasmo/background.ts | 117 + .../lib/constants/browserNames.ts | 3 + .../lib/constants/defaultShortcuts.ts | 28 + oslash-with-plasmo/lib/constants/keys.ts | 3 + oslash-with-plasmo/lib/store/createStore.ts | 37 + oslash-with-plasmo/lib/store/shortcuts.ts | 8 + oslash-with-plasmo/lib/types.ts | 11 + .../utils/browser/constructShortcutRules.ts | 49 + .../lib/utils/browser/getBrowserName.ts | 17 + .../browser/getDeclarativeNetRequestRules.ts | 11 + .../lib/utils/browser/storageUtils.ts | 16 + .../lib/utils/browser/tabOperations.ts | 19 + .../updateDeclarativeNetRequestRules.ts | 23 + .../lib/utils/getSavedShortcuts.ts | 34 + .../lib/utils/setShortcutsToStorage.ts | 7 + oslash-with-plasmo/package.json | 55 + oslash-with-plasmo/pnpm-lock.yaml | 5686 +++++++++++++++++ oslash-with-plasmo/postcss.config.js | 9 + oslash-with-plasmo/style.css | 3 + oslash-with-plasmo/svelte.config.mjs | 15 + oslash-with-plasmo/tailwind.config.js | 7 + oslash-with-plasmo/tsconfig.json | 20 + 27 files changed, 6315 insertions(+) create mode 100644 oslash-with-plasmo/.github/workflows/submit.yml create mode 100644 oslash-with-plasmo/.gitignore create mode 100644 oslash-with-plasmo/.prettierrc.mjs create mode 100644 oslash-with-plasmo/README.md create mode 100644 oslash-with-plasmo/assets/icon.png create mode 100644 oslash-with-plasmo/background.ts create mode 100644 oslash-with-plasmo/lib/constants/browserNames.ts create mode 100644 oslash-with-plasmo/lib/constants/defaultShortcuts.ts create mode 100644 oslash-with-plasmo/lib/constants/keys.ts create mode 100644 oslash-with-plasmo/lib/store/createStore.ts create mode 100644 oslash-with-plasmo/lib/store/shortcuts.ts create mode 100644 oslash-with-plasmo/lib/types.ts create mode 100644 oslash-with-plasmo/lib/utils/browser/constructShortcutRules.ts create mode 100644 oslash-with-plasmo/lib/utils/browser/getBrowserName.ts create mode 100644 oslash-with-plasmo/lib/utils/browser/getDeclarativeNetRequestRules.ts create mode 100644 oslash-with-plasmo/lib/utils/browser/storageUtils.ts create mode 100644 oslash-with-plasmo/lib/utils/browser/tabOperations.ts create mode 100644 oslash-with-plasmo/lib/utils/browser/updateDeclarativeNetRequestRules.ts create mode 100644 oslash-with-plasmo/lib/utils/getSavedShortcuts.ts create mode 100644 oslash-with-plasmo/lib/utils/setShortcutsToStorage.ts create mode 100644 oslash-with-plasmo/package.json create mode 100644 oslash-with-plasmo/pnpm-lock.yaml create mode 100644 oslash-with-plasmo/postcss.config.js create mode 100644 oslash-with-plasmo/style.css create mode 100644 oslash-with-plasmo/svelte.config.mjs create mode 100644 oslash-with-plasmo/tailwind.config.js create mode 100644 oslash-with-plasmo/tsconfig.json diff --git a/oslash-with-plasmo/.github/workflows/submit.yml b/oslash-with-plasmo/.github/workflows/submit.yml new file mode 100644 index 0000000..f4de392 --- /dev/null +++ b/oslash-with-plasmo/.github/workflows/submit.yml @@ -0,0 +1,34 @@ +name: "Submit to Web Store" +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Cache pnpm modules + uses: actions/cache@v3 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}- + - uses: pnpm/action-setup@v2.2.4 + with: + version: latest + run_install: true + - name: Use Node.js 16.x + uses: actions/setup-node@v3.4.1 + with: + node-version: 16.x + cache: "pnpm" + - name: Build the extension + run: pnpm build + - name: Package the extension into a zip artifact + run: pnpm package + - name: Browser Platform Publish + uses: PlasmoHQ/bpp@v3 + with: + keys: ${{ secrets.SUBMIT_KEYS }} + artifact: build/chrome-mv3-prod.zip diff --git a/oslash-with-plasmo/.gitignore b/oslash-with-plasmo/.gitignore new file mode 100644 index 0000000..a08786b --- /dev/null +++ b/oslash-with-plasmo/.gitignore @@ -0,0 +1,42 @@ + +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +#cache +.turbo +.next +.vercel + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + + +# local env files +.env* + +out/ +build/ +dist/ + +# plasmo - https://www.plasmo.com +.plasmo + +# bpp - http://bpp.browser.market/ +keys.json + +# typescript +.tsbuildinfo diff --git a/oslash-with-plasmo/.prettierrc.mjs b/oslash-with-plasmo/.prettierrc.mjs new file mode 100644 index 0000000..77f84c2 --- /dev/null +++ b/oslash-with-plasmo/.prettierrc.mjs @@ -0,0 +1,26 @@ +/** + * @type {import('prettier').Options} + */ +export default { + printWidth: 80, + tabWidth: 2, + useTabs: false, + semi: false, + singleQuote: false, + trailingComma: "none", + bracketSpacing: true, + bracketSameLine: true, + plugins: ["@ianvs/prettier-plugin-sort-imports"], + importOrder: [ + "", // Node.js built-in modules + "", // Imports not matched by other special words or groups. + "", // Empty line + "^@plasmo/(.*)$", + "", + "^@plasmohq/(.*)$", + "", + "^~(.*)$", + "", + "^[./]" + ] +} diff --git a/oslash-with-plasmo/README.md b/oslash-with-plasmo/README.md new file mode 100644 index 0000000..86cea12 --- /dev/null +++ b/oslash-with-plasmo/README.md @@ -0,0 +1,35 @@ +This is a [Plasmo extension](https://docs.plasmo.com/) project bootstrapped with [`plasmo init`](https://www.npmjs.com/package/plasmo). + +## Getting Started + +First, make sure to replace `type="ts"` with `lang="ts"` in your Svelte components. + +Second, run the development server: + +```bash +pnpm dev +# or +npm run dev +``` + +Open your browser and load the appropriate development build. For example, if you are developing for the chrome browser, using manifest v3, use: `build/chrome-mv3-dev`. + +You can start editing the popup by modifying `popup.tsx`. It should auto-update as you make changes. To add an options page, simply add a `options.tsx` file to the root of the project, with a react component default exported. Likewise to add a content page, add a `content.ts` file to the root of the project, importing some module and do some logic, then reload the extension on your browser. + +For further guidance, [visit our Documentation](https://docs.plasmo.com/) + +## Making production build + +Run the following: + +```bash +pnpm build +# or +npm run build +``` + +This should create a production bundle for your extension, ready to be zipped and published to the stores. + +## Submit to the webstores + +The easiest way to deploy your Plasmo extension is to use the built-in [bpp](https://bpp.browser.market) GitHub action. Prior to using this action however, make sure to build your extension and upload the first version to the store to establish the basic credentials. Then, simply follow [this setup instruction](https://docs.plasmo.com/framework/workflows/submit) and you should be on your way for automated submission! diff --git a/oslash-with-plasmo/assets/icon.png b/oslash-with-plasmo/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f60d8f8ba9908dc5c7eb575ac0dadfa2e4965d57 GIT binary patch literal 5952 zcmV-G7r*F_WSE`CMkq&~oEaL8hu0Iva3cIeW zqS68aQp6RIfJm3#Rgwt=0_g>iP6#P8@BaP(Ldr}s@4okD0-4WW6G9e1- z5Rk-xBo}f%aqir)>ngZ!7ar&U@Cl3c5=615z*r{+p##98p#Eb`B!-h9c0gpp9_FOo zT9EeZA1d2ajR!6Oe1oE+h-fev>jy$B*nb=&5^x+uiHzaSsxJ1^akXm3}lQl|pIFEpk*L^cb+llJySB@Tet z$N3p48(AIskFOH};2*4yW1ueqw70h}Hi2QEAmEjp^yDOayJFV>@bQUt)3})42BYbq z`Y|b04ucVduZp$BZ(mMJyJ0Uk>=poiA^Lt`^d;_0($r@Ph}ewWbi*=x7`J%<_(eoC zL5cH{hh~7M9EntB9Fv=S>as13+B5(HLiA6Fj8+2(wwcifiyVk-SYDQ4zpV_~WEPEx z$Tv88s>o;`9F1QS0U-LtFF5*LBC<`}sNDku2F5&U6tEIty;U{zkimeTbkL5-$oTD= zns!tTfS{n}P0L8L89=ORMjmcXl2+)In|2~sEd#0rK(l7ip(YKs00>pZK>Z;LB=pKl zKXF08GN8>9&AeeZ-KPX0(*-^yoJcpu&w?< z`lpmutmq@4X{f%9V4|HMG*nEfgNhUpqwcwxNe7ius8|35gz3XX6YU4!rHDcY=3%%5 zqE1RBo+$DNXx1#!S2ST89F4C&geCyn>K7KR$P~Kl00<3j{fJ59^bw>KSMx>>k!=b}Rarp2t>^pD>w{I7#?5#9hU0twu*Jd<+w6SE_ z;UmZ6@Zn=M-owCp=VutU)TYa-Uo;ai6E;d7c6D_@-)DN`h35w$E-o58Go4zk7Ew_V zh>D89n9(odR#6eQZrh1<>k@I`;1Se?-B3e@Jjd1eNy#a-Ha-9l=p6vH20*PnfPav_ zD+qUnr`hH@p*0!rL00M$rv<0JXR$G*aULS?^ zYggi}8Pn0Ik-J)E%n}(9j#Vob<6pC9!M&mF5}1ex6DEx2l3loPDMV3Huhp|@sJ=~2 zH`EvacZ)Nq!muIF;rrD~5fv4omWf&+B0M{&KQ?V#gSa@`6dvgs-w6@n(sN}mUAm0* z8#YOn6GZ%_#?LK%;1?0m1VDeu7Hh%D$qE1d*9Z9E{kP%lTsMk-`1$%`)wc;4(En-G zZB3duhD$DC$+sveDdCW$fu50(7Q0u=JwU0`SO7W>ixz3<=7xlYb1`T@-CIg|wEmOyamUTVLabW-J+E0;U5WE^mOiu?0K{k{uSIjXxHQ1R1z(^; z`?gA|RTLt^KW4sxmnV%?MgNq^xu! z+|NJ36Kz^4rBYSic>OgD8T_oGIzvN(@l?E3lXI0QEiJ`2%U8*?&f+a4ky`2jUXW?A z5;JDJj`%JelvJrIM1=Qe{R164v{Ovyq={o72-4Fpepr`?KQ79yHYdPDBg}tb4#pJA z^XvOeZ;Tmb)^?pnqY?1$IUm5&Oa2BYZ*MR3@7G7NoG6M|v`DGKAe{=07~p~^0JdN#qwAHFMF&-gJT;p8Meb#m*r9mveel5PJkPx$*sc~rev zEda<=*2~;=9^QZNEi`(hkrJw^QF!YXPM-D*@X#;mJQM{CvEqt7ppA>kw~3E@)t`wb$k*%y2Z=ZbB`N0Zequ--PpQyCypKe z4OgyQt@OD@BOoj!7;$m2=-0P5+O=!LwUA_vH)l-8_8q^VsOYw2*^wiMaZPU@Ja`1Z z|DG&au0{x*0en~KQq{#Ezu@Q;0L|st5d;An)~!-xmhZ;(8(6q_8I~?xiCaZQR?7ti z24d30(HQ*vKt%%KlTYX3tFISHlF{jO*u8TTJUyF8wl{k0WbECi*dEY(B;{o!SK7o= zsjCkTZrK<>q+BcAp6a4V<8R%z6J5IZ#aCZ1lGOMBkeQW*nQy&^A;ZTY?d&<(zDyW5 z3U02hl4PELZU9%~pGrN0eftkdma_uAM|gOpXL6+gFv1vD^%@UyNByEG;-lIB!IW30 zN*5~r zAp$XwNqAT&+O};iOUJAa<{%+qnPUG5Hwz0fZo;cpucKRH#E2nQ-`l%a4+J)ACfP<# zZXUL5*)CbmYD};k0AM70_V1aed&-iZ`{e>G|8})pH>y!qR)#nJ_79v&J;SXdB0SXU zmAr}LM|0U&xM(SiCKH#eH87$|%bt}3faKTo>C>kNw`@{!3O=7ZPp%6VDJr^+$y26D z9#2%HSMS=tUx)T>q1Q)A)_wW%75uRFM;^DVhJcWYe+!jAWI=M2dwY8!EHtF{8_i%e z8Zqkg!zPLpHaY8E9d#UFoM;*xFNJQ6N04J>{h75O;YKly}Yy+uX0v2qpnlCKm3 zD^?*b|A$XlOApB0>Kz-?f?IZ}>=iHTDJr^+b?f;K?{IQ*g1&|2?tRMS@m%u`t5^RI z*RHBs6!ad>{{Ah>(~($?cC+n6tLLt?vf_V~@#I91;@5C3p1bZ*omb=H$s#T)cRZOExgj z-|Y1X<3~ZO)kxO2{>M$oFDT&hg$t8dz9@8m5U3$Hxq6#;R9kGaisQf9_Sb)pGim8u za^BwF)vkGXJcefnNl&3CS+?+kf z7XS_2tN&I;zcifd`)}X58)wqwPgP4nFx_wK@&FJ`@&drc)rDL3`i+}%OmkCI$hU;- z+Mx1xb#-;Y@S)Fh=~}RG374E4Okm}as@QH{lZ@TCWo2bbxgiNbBmH>|pxR7bX-O%% z_LScJw~UKM!u&5J%iSm}M4xA#<654sN_hYX8kEX8EL~0`dV71~`hT(-Ujr)t0_BeY#!$+w5kPTq3Aa;CeSGAY<|ZOMoJ;Pe z0*|b)&=7RtNR(9~OIXz0Z|nPS0VXCpr|JUdYgJ4%{{)g8qN4Z$ATLk;E8EL2kF{Ht zFqu%^))ig@HGFfU70AiSQoKjiB zq!r5}=zah=70W)aE;W_!R1;4xPqb_)I~73^g9h?vzMncJ@AQ`Om*%Nz~e+%SMM)3>y=RMw)^BaI)y3or2PI#MW0xFkC}xx9>A zg+U+_3CNM7`S6irQunWy^Hh9iG;c0D9nmVLOdikO{r`T#AnT21~^(kO(1GUaH#bm=lqp5*Hui3oH4`JU=q#zTUGFlID=&f?BpHC9}y5uHwl z7l-rhx|^@ugi%JtKdK~zh-c+$-?E**oKRF$1pfBdsd8Pgh`W13eErpbWChuF2_;&p z^1|RjTv@`Yr_+>75wA4wT)77zL3SUrZfzp>V*t35Q9Su&zHQVs;q2^;&;L7zJ7WpB zlVO~Z$u|hoXatPq?0M$RU#wVyECH3;xXL2{NpcMooIfu+THkp6HB6g2MX^^yPtPV; zxqJ~icWN(7&+0X6xn-a3(+ka-Nl&=S$<4#&&0D$cR)vYIQX5wa03FjL0g#=PH-73r`pQInyL5ro#UU-xu3a0fU%Nu~Yv%b27qD^D&)o78#*N~VOIW;I$t+>9*tx`V z50H`Z+cjc1Dc8#3Bgb*{nEWJ%=2jYOxVgF_BqRu3x^zVMZt>8!h*Inkl9in; ztNZ8OBd}!IN<~)u%3*9@)l1a^KxD!mA~sR3t)wIaeptH!gP$KLR~3LegSbAud!WzV zynImb2_i0dyr> zpuji)0RB1WQ=Gq`PPUIA2x!v80|EYisy64VW|#9yY(K;p*DN~%>9qtS?I(`RDsIBVojA3lBG<27 z$Jp_&VAD_hTgL7&Y}jC~^7lze1{^!C_%5lU5}ncFB!?+>9~IU$6wP zP5qnf@-Iq}l9Gyn&yA2>Mh3WZ8px=ZhH}YDEkb1#gmr(UrdrHmt#ODd5c@=VkM6Mf z=WXcIcd#0ju&l;tG~%-_=Hc1FFCsf9R}r1h4(i91<(!_8i5)U>4J;uN`>dwVYYc## zbi)xas8+D%{Dlh`J$5oCPMWG%16a%c1BcOn;81-2#XQB1m?I*L+jwz9^qlqtL$93a1lRl_(^ep7|}TexSv}uJ^E2QT^+`L(cPVv2E9SC6-LeISP(_AY>NVu$708;t<)vqjrw|t_{opA>$|?M$V8#z%{jVR8 zaCo#&Sgc-S5`TrvIzkRqhQTNZ_)|`LvQ_DQR5T6H;M)M`Kz$f;%Nnv-QbZ&Lz}*=o)ee(%AP)ximx~62qydoCV}OeI1;_ko=?oeN zc4K{BMzZ9iNw_jLwIW6XER#ppfhy!snQ=UiAXflnWhGq|z=i_ys){&JgfcJ;HJ9#X z4cs}~IT{0u`sCZiE$?b=|B zu?B+kO91Rs>a%{6tToX{IgJm<>;dl4tXZV5Nu%8lP>^h84y+-=iJ3ZNW}cK?txAyt zBD1qo^92oh0I*NZ*ZKs*C6LfZiN*&M3IG7eIcqq}1oQ=9pSrL0gCZiK-`%WjMNljN z03iQd@-bp;AQ)`F9QUxpP)LmR%gs2U=z)TYi~*|R8yel3L~H`!rMU9?$rWPMH#aj$ z@dQd$0ssJf0%Jln#I}GCriy`j1Iq+ydMnxOS46b{006IGy^j-UGk`eNj6B2;gMmz% z-Z?qHtF{8G=op|X7c&g!ouTatg3Z&(9s&||8eK;<8y`@)2Pii}L`{SAed?ImXZo0v?M~B_TraeGK^3n~7 zDAh#)cn|e4uYkb_;PX;lX{5axAFyK&P?3Ppm}pTHzXYh0y?wC-1nf46;wuGNDJgdM zr7i@(J^VuT9l`J}7)h_J^dLak53t$!87Uj(F5@aioeF?^_=V~_!bE=u;TZt7JxfLn z2>Zz-ypx-CqFR|Yds8O^;2upw^=$-3Q^7C@fb>%q>`M^{>lop``R9_4+1nXQ)ad}Y zM?gS(7v@yhmx=5p5c&Y%JMmF{L=X-#(6Tb;(p5E8=BO(?5CKpTzp&^4m}msR1^{RS z`v-#wz!89cgodrORE?{y^1uZ^MFIl!kBM690YYambOfM>`meSk00W5j64)LpW7~6b z3|CaPsTvP-093^zJiJi@Q5QoZMTL z^#_@UDgbK2-#^L&I-Lhhq6gE!jftXGAi*5~L?+%OK`@dDx1bR&qom|A??#IUjd~LR i4$Nb>sbB|ngZ~HrlPLkc8M2Z90000 { + if (details.reason !== "install") return + + // persist default Shortcuts to local storage + await setShortcutsToStorage(defaultShortcuts) + + // construct new rules on every installation + const newRules = constructShortcutRules(defaultShortcuts) + const oldRules = await getDeclarativeNetRequestRules() + + let oldRuleIds = [] + if (oldRules) { + oldRuleIds = oldRules.map((rule) => rule.id) + } + + // add the new rules as declarativeNetRequest Dynamic rules, and remove old rules if there are any + await updateDeclarativeNetRequestRules(newRules, oldRuleIds) + }) + + browserInstance.omnibox.onInputStarted.addListener(async function () { + // on each input session, get all shortcuts and create a new fuse object with them + const savedShortcuts = await getSavedShortcutsFromStorage() + fuse = new Fuse(savedShortcuts, fuseOptions) + }) + + browserInstance.omnibox.onInputChanged.addListener(async function (text, suggest) { + // get fuse suggestions + const suggestedShortcuts = fuse.search(text) + // map fuse suggestions to omnibox suggestions + const suggestions = suggestedShortcuts.map( + (shortcut) => { + return { + content: shortcut.item.shortlink, + description: `${shortcut.item.shortlink} - ${shortcut.item.url}` + } + } + ) + suggest(suggestions) + }) + + browserInstance.omnibox.onInputEntered.addListener(function (text, disposition) { + // redirect to url in new tab + const url = `http://${text}` + switch (disposition) { + case "currentTab": + updateTab({ url }) + break + case "newForegroundTab": + openNewTab({ url }) + break + case "newBackgroundTab": + openNewTab({ url, active: false }) + break + } + }) + + // If o/ is prefix and no shortcut with given name is saved then redirect to options page + browserInstance.webRequest.onBeforeRequest.addListener( + (param) => { + getSavedShortcutsFromStorage().then((shortcuts) => { + const savedShortcutNamesSet = new Set( + shortcuts.map((shortcut) => shortcut.shortlink) + ) + const requestUrl = new URL(param.url) + if (requestUrl.searchParams.has("q")) { + const queryValue = requestUrl.searchParams.get("q") ?? "" + if (queryValue.startsWith("o/")) { + if (!savedShortcutNamesSet.has(queryValue)) { + updateTab({ url: "/options.html" }) + } else { + const url = + shortcuts.find((shortcut) => shortcut.shortlink === queryValue) + ?.url ?? "" + updateTab({ url }) + } + } + } else if (param.url.startsWith("http://o/")) { + const requestShortcutName = param.url.replace("http://", "") + if (!savedShortcutNamesSet.has(requestShortcutName)) { + updateTab({ url: "/options.html" }) + } + } + }) + }, + { urls: ["*://*/search*", "*://o/*"] } + ) +} + diff --git a/oslash-with-plasmo/lib/constants/browserNames.ts b/oslash-with-plasmo/lib/constants/browserNames.ts new file mode 100644 index 0000000..bb1ef6e --- /dev/null +++ b/oslash-with-plasmo/lib/constants/browserNames.ts @@ -0,0 +1,3 @@ +export const SAFARI = 'safari' +export const FIREFOX = 'firefox' +export const CHROME = 'chrome' \ No newline at end of file diff --git a/oslash-with-plasmo/lib/constants/defaultShortcuts.ts b/oslash-with-plasmo/lib/constants/defaultShortcuts.ts new file mode 100644 index 0000000..958026f --- /dev/null +++ b/oslash-with-plasmo/lib/constants/defaultShortcuts.ts @@ -0,0 +1,28 @@ +import type { Shortcut } from "../types"; + +export const DEFAULT_SHORTCUTS: Shortcut[] = [ + { + shortlink: 'o/meet', + url: 'https://meet.google.com', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }, + { + shortlink: 'o/mail', + url: 'https://mail.google.com', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }, + { + shortlink: 'o/linkedin', + url: 'https://www.linkedin.com/feed/', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }, + { + shortlink: 'o/figma', + url: 'https://figma.com/', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + } +] \ No newline at end of file diff --git a/oslash-with-plasmo/lib/constants/keys.ts b/oslash-with-plasmo/lib/constants/keys.ts new file mode 100644 index 0000000..77193c4 --- /dev/null +++ b/oslash-with-plasmo/lib/constants/keys.ts @@ -0,0 +1,3 @@ +export const SHORTCUTS_STORAGE_KEY = "shortcuts" +export const SHORTCUT_NAME_INPUT_ID = 'shortcut-name' +export const SHORTCUT_URL_INPUT_ID = 'shortcut-url' \ No newline at end of file diff --git a/oslash-with-plasmo/lib/store/createStore.ts b/oslash-with-plasmo/lib/store/createStore.ts new file mode 100644 index 0000000..7d5b4c1 --- /dev/null +++ b/oslash-with-plasmo/lib/store/createStore.ts @@ -0,0 +1,37 @@ +import { writable } from 'svelte/store'; +import { Storage } from '@plasmohq/storage/dist'; +import { SHORTCUTS_STORAGE_KEY } from '~lib/constants/keys'; + +export function createStoreSyncedWithStorage({ + key, + initialValue +}: { + key: string; + initialValue: T; +}) { + const { subscribe, set, update } = writable(initialValue); + const storage = new Storage({ + area: 'local' + }); + + async function init() { + const valueFromStorage = await storage.get(key); + set(valueFromStorage || initialValue); + } + + async function setValue(value: T) { + await storage.set(key, value); + set(value); + } + + storage.watch({ + [SHORTCUTS_STORAGE_KEY]: () => init() + }) + + return { + subscribe, + init, + set: setValue, + update + }; +} diff --git a/oslash-with-plasmo/lib/store/shortcuts.ts b/oslash-with-plasmo/lib/store/shortcuts.ts new file mode 100644 index 0000000..7548055 --- /dev/null +++ b/oslash-with-plasmo/lib/store/shortcuts.ts @@ -0,0 +1,8 @@ +import type { Shortcut } from '~lib/types'; +import { createStoreSyncedWithStorage } from './createStore'; +import { SHORTCUTS_STORAGE_KEY } from '~lib/constants/keys'; + +export const shortcuts = createStoreSyncedWithStorage({ + key: SHORTCUTS_STORAGE_KEY, + initialValue: [] +}); diff --git a/oslash-with-plasmo/lib/types.ts b/oslash-with-plasmo/lib/types.ts new file mode 100644 index 0000000..9559038 --- /dev/null +++ b/oslash-with-plasmo/lib/types.ts @@ -0,0 +1,11 @@ +export type Shortcut = { + shortlink: string + url: string + createdAt: string + updatedAt: string +} + +export type ShortcutValidationResult = { + shortlink: string, + url: string +} diff --git a/oslash-with-plasmo/lib/utils/browser/constructShortcutRules.ts b/oslash-with-plasmo/lib/utils/browser/constructShortcutRules.ts new file mode 100644 index 0000000..728e0ba --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/constructShortcutRules.ts @@ -0,0 +1,49 @@ +import { FIREFOX, SAFARI } from "~lib/constants/browserNames" +import type { Shortcut } from "~lib/types" +import { isNonChromiumBrowser } from "./getBrowserName" + +export function constructShortcutRules(shortcuts: Shortcut[]) { + if (isNonChromiumBrowser()) { + return shortcuts.map((shortcut, index) => { + const newRule: browser.declarativeNetRequest.Rule = { + "id": index + 1, + "priority": 1, + "action": { + // chrome.declarativeNetRequest.RuleActionType['REDIRECT'] equivalent + // is not available in browser namespace + "type": "redirect", + "redirect": { + "url": shortcut.url + } + }, + "condition": { + "urlFilter": `http://${shortcut.shortlink}`, + // chrome.declarativeNetRequest.ResourceType['MAIN_FRAME'] equivalent + // is not available in browser namespace + "resourceTypes": ["main_frame"] + } + } + return newRule + }) + } + else { + return shortcuts.map((shortcut, index) => { + const newRule: chrome.declarativeNetRequest.Rule = { + "id": index + 1, + "priority": 1, + "action": { + "type": chrome.declarativeNetRequest.RuleActionType['REDIRECT'], + "redirect": { + "url": shortcut.url + } + }, + "condition": { + "urlFilter": `http://${shortcut.shortlink}`, + "resourceTypes": [chrome.declarativeNetRequest.ResourceType['MAIN_FRAME']] + } + } + return newRule + + }) + } +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/browser/getBrowserName.ts b/oslash-with-plasmo/lib/utils/browser/getBrowserName.ts new file mode 100644 index 0000000..52f9f80 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/getBrowserName.ts @@ -0,0 +1,17 @@ +import { FIREFOX, SAFARI } from "~lib/constants/browserNames"; + +export function getBrowserName() { + return process.env.PLASMO_BROWSER +} + +export function isNonChromiumBrowser() { + // For now, only safari and firefox are considered in non chromium browsers + // More can be added in future if required + const browserName = process.env.PLASMO_BROWSER + + switch(browserName) { + case FIREFOX: return true; + case SAFARI : return true; + default: return false; + } +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/browser/getDeclarativeNetRequestRules.ts b/oslash-with-plasmo/lib/utils/browser/getDeclarativeNetRequestRules.ts new file mode 100644 index 0000000..2ef1b46 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/getDeclarativeNetRequestRules.ts @@ -0,0 +1,11 @@ +import { isNonChromiumBrowser } from "./getBrowserName"; + +export async function getDeclarativeNetRequestRules() { + const browserName = process.env.PLASMO_BROWSER + if (isNonChromiumBrowser()) { + return await browser.declarativeNetRequest.getDynamicRules(); + } + else { + return await chrome.declarativeNetRequest.getDynamicRules(); + } +} diff --git a/oslash-with-plasmo/lib/utils/browser/storageUtils.ts b/oslash-with-plasmo/lib/utils/browser/storageUtils.ts new file mode 100644 index 0000000..b24d14a --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/storageUtils.ts @@ -0,0 +1,16 @@ +import { Storage } from "@plasmohq/storage"; +import type { Shortcut } from "~lib/types"; + +export async function getDataFromStorage(key) { + const storage = new Storage({ + area: "local" + }) + return await storage.get(key) +} + +export async function setDataToStorage(key: string, shortcuts: Shortcut[]) { + const storage = new Storage({ + area: "local" + }) + await storage.set(key, shortcuts) +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/browser/tabOperations.ts b/oslash-with-plasmo/lib/utils/browser/tabOperations.ts new file mode 100644 index 0000000..5439651 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/tabOperations.ts @@ -0,0 +1,19 @@ +import { isNonChromiumBrowser } from "./getBrowserName" + +export function openNewTab(props: chrome.tabs.CreateProperties | browser.tabs._CreateCreateProperties) { + if (isNonChromiumBrowser()) { + browser.tabs.create(props) + } + else { + chrome.tabs.create(props) + } +} + +export function updateTab(props: chrome.tabs.UpdateProperties | browser.tabs._UpdateUpdateProperties) { + if (isNonChromiumBrowser()) { + browser.tabs.update(props) + } + else { + chrome.tabs.update(props) + } +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/browser/updateDeclarativeNetRequestRules.ts b/oslash-with-plasmo/lib/utils/browser/updateDeclarativeNetRequestRules.ts new file mode 100644 index 0000000..a968399 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/updateDeclarativeNetRequestRules.ts @@ -0,0 +1,23 @@ +import { isNonChromiumBrowser } from "./getBrowserName"; + +export async function updateDeclarativeNetRequestRules( + addRules: browser.declarativeNetRequest.Rule[] + | chrome.declarativeNetRequest.Rule[], + removeRuleIds: number[] +) { + + + if (isNonChromiumBrowser()) { + await browser.declarativeNetRequest.updateDynamicRules({ + removeRuleIds, + addRules: addRules as browser.declarativeNetRequest.Rule[] + }) + } + + else { + await chrome.declarativeNetRequest.updateDynamicRules({ + removeRuleIds, + addRules: addRules as chrome.declarativeNetRequest.Rule[] + }) + } +} diff --git a/oslash-with-plasmo/lib/utils/getSavedShortcuts.ts b/oslash-with-plasmo/lib/utils/getSavedShortcuts.ts new file mode 100644 index 0000000..a69effd --- /dev/null +++ b/oslash-with-plasmo/lib/utils/getSavedShortcuts.ts @@ -0,0 +1,34 @@ + +import { get } from "svelte/store" +import { SHORTCUTS_STORAGE_KEY } from "~lib/constants/keys" + +import { shortcuts } from "~lib/store/shortcuts" +import { getDataFromStorage } from "./browser/storageUtils" +import type { Shortcut } from "~lib/types" + +/** + * Get Saved Shortcuts from local store + * @returns {Shortcut[]} Shortcuts Array + */ +export async function getSavedShortcutsFromStore() { + // NOTE: the store should be initialized by the component/parent function first + // NOTE: We are fetching from the store and not local storage to optimize performance + + const savedShortcuts = get(shortcuts) + if (Array.isArray(savedShortcuts)) { + return savedShortcuts + } + return [] +} + +/** + * Get Saved Shortcuts from local storage + * @returns {Shortcut[]} Shortcuts Array + */ +export async function getSavedShortcutsFromStorage() { + const savedShortcuts = await getDataFromStorage(SHORTCUTS_STORAGE_KEY) + if (Array.isArray(savedShortcuts)) { + return savedShortcuts + } + return [] +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/setShortcutsToStorage.ts b/oslash-with-plasmo/lib/utils/setShortcutsToStorage.ts new file mode 100644 index 0000000..d45e5f9 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/setShortcutsToStorage.ts @@ -0,0 +1,7 @@ +import type { Shortcut } from "~lib/types" +import { setDataToStorage } from "./browser/storageUtils" +import { SHORTCUTS_STORAGE_KEY } from "~lib/constants/keys" + +export async function setShortcutsToStorage(shortcuts: Shortcut[]) { + await setDataToStorage(SHORTCUTS_STORAGE_KEY, shortcuts) +} \ No newline at end of file diff --git a/oslash-with-plasmo/package.json b/oslash-with-plasmo/package.json new file mode 100644 index 0000000..cd1518a --- /dev/null +++ b/oslash-with-plasmo/package.json @@ -0,0 +1,55 @@ +{ + "name": "oslash-with-plasmo", + "displayName": "Oslash with plasmo", + "version": "0.0.1", + "description": "OSlash browser extension", + "author": "Tanmay Dineshkumar Shah", + "scripts": { + "dev": "plasmo dev", + "build": "pnpm build-firefox && pnpm build-chrome", + "build-firefox": "plasmo build --target=firefox-mv2 --zip", + "build-chrome": "plasmo build --target=chrome-mv3 --zip", + "package": "plasmo package" + }, + "dependencies": { + "@plasmohq/storage": "^1.9.0", + "fuse.js": "^6.6.2", + "papaparse": "^5.4.1", + "plasmo": "0.84.0", + "svelte": "4.2.2", + "svelte-preprocess": "5.0.4" + }, + "devDependencies": { + "@ianvs/prettier-plugin-sort-imports": "4.1.1", + "@rgossiaux/svelte-headlessui": "^2.0.0", + "@types/chrome": "0.0.251", + "@types/firefox-webext-browser": "^120.0.0", + "@types/node": "20.9.0", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.31", + "prettier": "3.0.3", + "tailwindcss": "^3.3.5", + "typescript": "5.2.2" + }, + "manifest": { + "host_permissions": [ + "*://*/*" + ], + "web_accessible_resources": [ + { + "resources": ["assets/icon.png"], + "matches": [] + } + ], + "omnibox": { + "keyword": "o/" + }, + "permissions": [ + "storage", + "declarativeNetRequest", + "activeTab", + "webRequest", + "favicon" + ] + } +} diff --git a/oslash-with-plasmo/pnpm-lock.yaml b/oslash-with-plasmo/pnpm-lock.yaml new file mode 100644 index 0000000..e7818d0 --- /dev/null +++ b/oslash-with-plasmo/pnpm-lock.yaml @@ -0,0 +1,5686 @@ +lockfileVersion: '6.0' + +dependencies: + '@plasmohq/storage': + specifier: ^1.9.0 + version: 1.9.0 + fuse.js: + specifier: ^6.6.2 + version: 6.6.2 + papaparse: + specifier: ^5.4.1 + version: 5.4.1 + plasmo: + specifier: 0.84.0 + version: 0.84.0(postcss@8.4.31) + svelte: + specifier: 4.2.2 + version: 4.2.2 + svelte-preprocess: + specifier: 5.0.4 + version: 5.0.4(@babel/core@7.23.3)(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2) + +devDependencies: + '@ianvs/prettier-plugin-sort-imports': + specifier: 4.1.1 + version: 4.1.1(prettier@3.0.3) + '@rgossiaux/svelte-headlessui': + specifier: ^2.0.0 + version: 2.0.0(svelte@4.2.2) + '@types/chrome': + specifier: 0.0.251 + version: 0.0.251 + '@types/firefox-webext-browser': + specifier: ^120.0.0 + version: 120.0.0 + '@types/node': + specifier: 20.9.0 + version: 20.9.0 + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.31) + postcss: + specifier: ^8.4.31 + version: 8.4.31 + prettier: + specifier: 3.0.3 + version: 3.0.3 + tailwindcss: + specifier: ^3.3.5 + version: 3.3.5 + typescript: + specifier: 5.2.2 + version: 5.2.2 + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + + /@babel/code-frame@7.23.4: + resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/helpers': 7.23.4 + '@babel/parser': 7.23.4 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.23.4: + resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.4 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + + /@babel/helpers@7.23.4: + resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.4: + resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.4 + + /@babel/runtime@7.23.4: + resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.4 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 + + /@babel/traverse@7.23.4: + resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.4: + resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@expo/spawn-async@1.7.2: + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + dependencies: + cross-spawn: 7.0.3 + dev: false + + /@ianvs/prettier-plugin-sort-imports@4.1.1(prettier@3.0.3): + resolution: {integrity: sha512-kJhXq63ngpTQ2dxgf5GasbPJWsJA3LgoOdd7WGhpUSzLgLgI4IsIzYkbJf9kmpOHe7Vdm/o3PcRA3jmizXUuAQ==} + peerDependencies: + '@vue/compiler-sfc': '>=3.0.0' + prettier: 2 || 3 + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + dependencies: + '@babel/core': 7.23.3 + '@babel/generator': 7.23.4 + '@babel/parser': 7.23.4 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 + prettier: 3.0.3 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@lezer/common@0.15.12: + resolution: {integrity: sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==} + dev: false + + /@lezer/common@1.1.1: + resolution: {integrity: sha512-aAPB9YbvZHqAW+bIwiuuTDGB4DG0sYNRObGLxud8cW7osw1ZQxfDuTZ8KQiqfZ0QJGcR34CvpTMDXEyo/+Htgg==} + dev: false + + /@lezer/lr@0.15.8: + resolution: {integrity: sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==} + dependencies: + '@lezer/common': 0.15.12 + dev: false + + /@lezer/lr@1.3.14: + resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==} + dependencies: + '@lezer/common': 1.1.1 + dev: false + + /@ljharb/through@2.3.11: + resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + dev: false + + /@lmdb/lmdb-darwin-arm64@2.5.2: + resolution: {integrity: sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-darwin-arm64@2.7.11: + resolution: {integrity: sha512-r6+vYq2vKzE+vgj/rNVRMwAevq0+ZR9IeMFIqcSga+wMtMdXQ27KqQ7uS99/yXASg29bos7yHP3yk4x6Iio0lw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-darwin-x64@2.5.2: + resolution: {integrity: sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-darwin-x64@2.7.11: + resolution: {integrity: sha512-jhj1aB4K8ycRL1HOQT5OtzlqOq70jxUQEWRN9Gqh3TIDN30dxXtiHi6EWF516tzw6v2+3QqhDMJh8O6DtTGG8Q==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm64@2.5.2: + resolution: {integrity: sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm64@2.7.11: + resolution: {integrity: sha512-7xGEfPPbmVJWcY2Nzqo11B9Nfxs+BAsiiaY/OcT4aaTDdykKeCjvKMQJA3KXCtZ1AtiC9ljyGLi+BfUwdulY5A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm@2.5.2: + resolution: {integrity: sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm@2.7.11: + resolution: {integrity: sha512-dHfLFVSrw/v5X5lkwp0Vl7+NFpEeEYKfMG2DpdFJnnG1RgHQZngZxCaBagFoaJGykRpd2DYF1AeuXBFrAUAXfw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-x64@2.5.2: + resolution: {integrity: sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-x64@2.7.11: + resolution: {integrity: sha512-vUKI3JrREMQsXX8q0Eq5zX2FlYCKWMmLiCyyJNfZK0Uyf14RBg9VtB3ObQ41b4swYh2EWaltasWVe93Y8+KDng==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-win32-x64@2.5.2: + resolution: {integrity: sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-win32-x64@2.7.11: + resolution: {integrity: sha512-BJwkHlSUgtB+Ei52Ai32M1AOMerSlzyIGA/KC4dAGL+GGwVMdwG8HGCOA2TxP3KjhbgDPMYkv7bt/NmOmRIFng==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@mischnic/json-sourcemap@0.1.0: + resolution: {integrity: sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==} + engines: {node: '>=12.0.0'} + dependencies: + '@lezer/common': 0.15.12 + '@lezer/lr': 0.15.8 + json5: 2.2.3 + dev: false + + /@mischnic/json-sourcemap@0.1.1: + resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} + engines: {node: '>=12.0.0'} + dependencies: + '@lezer/common': 1.1.1 + '@lezer/lr': 1.3.14 + json5: 2.2.3 + dev: false + + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: + resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: + resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: + resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: + resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: + resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: + resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@parcel/bundler-default@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-JjJK8dq39/UO/MWI/4SCbB1t/qgpQRFnFDetAAAezQ8oN++b24u1fkMDa/xqQGjbuPmGeTds5zxGgYs7id7PYg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/cache@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-k7xv5vSQrJLdXuglo+Hv3yF4BCSs1tQ/8Vbd6CHTkOhf7LcGg6CPtLw053R/KdMpd/4GPn0QrAsOLdATm1ELtQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/logger': 2.8.3 + '@parcel/utils': 2.8.3 + lmdb: 2.5.2 + dev: false + + /@parcel/cache@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-Bj/H2uAJJSXtysG7E/x4EgTrE2hXmm7td/bc97K8M9N7+vQjxf7xb0ebgqe84ePVMkj4MVQSMEJkEucXVx4b0Q==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/logger': 2.9.3 + '@parcel/utils': 2.9.3 + lmdb: 2.7.11 + dev: false + + /@parcel/codeframe@2.8.3: + resolution: {integrity: sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/codeframe@2.9.3: + resolution: {integrity: sha512-z7yTyD6h3dvduaFoHpNqur74/2yDWL++33rjQjIjCaXREBN6dKHoMGMizzo/i4vbiI1p9dDox2FIDEHCMQxqdA==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/compressor-raw@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-jz3t4/ICMsHEqgiTmv5i1DJva2k5QRpZlBELVxfY+QElJTVe8edKJ0TiKcBxh2hx7sm4aUigGmp7JiqqHRRYmA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/config-default@2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)(typescript@5.2.2): + resolution: {integrity: sha512-tqN5tF7QnVABDZAu76co5E6N8mA9n8bxiWdK4xYyINYFIEHgX172oRTqXTnhEMjlMrdmASxvnGlbaPBaVnrCTw==} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/bundler-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/core': 2.9.3 + '@parcel/namer-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-htmlnano': 2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)(typescript@5.2.2) + '@parcel/optimizer-image': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-svgo': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-swc': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-html': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-svg': 2.9.3(@parcel/core@2.9.3) + '@parcel/reporter-dev-server': 2.9.3(@parcel/core@2.9.3) + '@parcel/resolver-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-browser-hmr': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-react-refresh': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-service-worker': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-babel': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-html': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-image': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-json': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-postcss': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-posthtml': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-react-refresh-wrap': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-svg': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: false + + /@parcel/core@2.9.3: + resolution: {integrity: sha512-4KlM1Zr/jpsqWuMXr2zmGsaOUs1zMMFh9vfCNKRZkptf+uk8I3sugHbNdo+F5B+4e2yMuOEb1zgAmvJLeuH6ww==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/profiler': 2.9.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + abortcontroller-polyfill: 1.7.5 + base-x: 3.0.9 + browserslist: 4.22.1 + clone: 2.1.2 + dotenv: 7.0.0 + dotenv-expand: 5.1.0 + json5: 2.2.3 + msgpackr: 1.9.9 + nullthrows: 1.1.1 + semver: 7.5.4 + dev: false + + /@parcel/diagnostic@2.8.3: + resolution: {integrity: sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + dev: false + + /@parcel/diagnostic@2.9.3: + resolution: {integrity: sha512-6jxBdyB3D7gP4iE66ghUGntWt2v64E6EbD4AetZk+hNJpgudOOPsKTovcMi/i7I4V0qD7WXSF4tvkZUoac0jwA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + dev: false + + /@parcel/events@2.8.3: + resolution: {integrity: sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==} + engines: {node: '>= 12.0.0'} + dev: false + + /@parcel/events@2.9.3: + resolution: {integrity: sha512-K0Scx+Bx9f9p1vuShMzNwIgiaZUkxEnexaKYHYemJrM7pMAqxIuIqhnvwurRCsZOVLUJPDDNJ626cWTc5vIq+A==} + engines: {node: '>= 12.0.0'} + dev: false + + /@parcel/fs-search@2.8.3: + resolution: {integrity: sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + dev: false + + /@parcel/fs-search@2.9.3: + resolution: {integrity: sha512-nsNz3bsOpwS+jphcd+XjZL3F3PDq9lik0O8HPm5f6LYkqKWT+u/kgQzA8OkAHCR3q96LGiHxUywHPEBc27vI4Q==} + engines: {node: '>= 12.0.0'} + dev: false + + /@parcel/fs@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs-search': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + '@parcel/watcher': 2.2.0 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + dev: false + + /@parcel/fs@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-/PrRKgCRw22G7rNPSpgN3Q+i2nIkZWuvIOAdMG4KWXC4XLp8C9jarNaWd5QEQ75amjhQSl3oUzABzkdCtkKrgg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs-search': 2.9.3 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/watcher': 2.2.0 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@parcel/graph@2.9.3: + resolution: {integrity: sha512-3LmRJmF8+OprAr6zJT3X2s8WAhLKkrhi6RsFlMWHifGU5ED1PFcJWFbOwJvSjcAhMQJP0fErcFIK1Ludv3Vm3g==} + engines: {node: '>= 12.0.0'} + dependencies: + nullthrows: 1.1.1 + dev: false + + /@parcel/hash@2.8.3: + resolution: {integrity: sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + xxhash-wasm: 0.4.2 + dev: false + + /@parcel/hash@2.9.3: + resolution: {integrity: sha512-qlH5B85XLzVAeijgKPjm1gQu35LoRYX/8igsjnN8vOlbc3O8BYAUIutU58fbHbtE8MJPbxQQUw7tkTjeoujcQQ==} + engines: {node: '>= 12.0.0'} + dependencies: + xxhash-wasm: 0.4.2 + dev: false + + /@parcel/logger@2.8.3: + resolution: {integrity: sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/events': 2.8.3 + dev: false + + /@parcel/logger@2.9.3: + resolution: {integrity: sha512-5FNBszcV6ilGFcijEOvoNVG6IUJGsnMiaEnGQs7Fvc1dktTjEddnoQbIYhcSZL63wEmzBZOgkT5yDMajJ/41jw==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + dev: false + + /@parcel/markdown-ansi@2.8.3: + resolution: {integrity: sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/markdown-ansi@2.9.3: + resolution: {integrity: sha512-/Q4X8F2aN8UNjAJrQ5NfK2OmZf6shry9DqetUSEndQ0fHonk78WKt6LT0zSKEBEW/bB/bXk6mNMsCup6L8ibjQ==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/namer-default@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-1ynFEcap48/Ngzwwn318eLYpLUwijuuZoXQPCsEQ21OOIOtfhFQJaPwXTsw6kRitshKq76P2aafE0BioGSqxcA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/node-resolver-core@3.0.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-AjxNcZVHHJoNT/A99PKIdFtwvoze8PAiC3yz8E/dRggrDIOboUEodeQYV5Aq++aK76uz/iOP0tST2T8A5rhb1A==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-css@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-RK1QwcSdWDNUsFvuLy0hgnYKtPQebzCb0vPPzqs6LhL+vqUu9utOyRycGaQffHCkHVQP6zGlN+KFssd7YtFGhA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.22.1 + lightningcss: 1.22.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-data-url@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-k8lOKLzgZ24JKOuyrNe5PptoH8GJ78AwnumG1xEOKZ77gZnUgdrn3XdjzE28ZqTI4LFkT3jApUiBKBmqnWDe7Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + isbinaryfile: 4.0.10 + mime: 2.6.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-htmlnano@2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)(typescript@5.2.2): + resolution: {integrity: sha512-9g/KBck3c6DokmJfvJ5zpHFBiCSolaGrcsTGx8C3YPdCTVTI9P1TDCwUxvAr4LjpcIRSa82wlLCI+nF6sSgxKA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + htmlnano: 2.1.0(postcss@8.4.31)(svgo@2.8.0)(typescript@5.2.2) + nullthrows: 1.1.1 + posthtml: 0.16.6 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: false + + /@parcel/optimizer-image@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-530YzthE7kmecnNhPbkAK+26yQNt69pfJrgE0Ev0BZaM1Wu2+33nki7o8qvkTkikhPrurEJLGIXt1qKmbKvCbA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@parcel/optimizer-svgo@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-ytQS0wY5JJhWU4mL0wfhYDUuHcfuw+Gy2+JcnTm1t1AZXHlOTbU6EzRWNqBShsgXjvdrQQXizAe3B6GFFlFJVQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-swc@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-GQINNeqtdpL1ombq/Cpwi6IBk02wKJ/JJbYbyfHtk8lxlq13soenpwOlzJ5T9D2fdG+FUhai9NxpN5Ss4lNoAg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@swc/core': 1.3.82 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: false + + /@parcel/package-manager@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-tIpY5pD2lH53p9hpi++GsODy6V3khSTX4pLEGuMpeSYbHthnOViobqIlFLsjni+QA1pfc8NNNIQwSNdGjYflVA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + semver: 5.7.2 + dev: false + + /@parcel/package-manager@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-NH6omcNTEupDmW4Lm1e4NUYBjdqkURxgZ4CNESESInHJe6tblVhNB8Rpr1ar7zDar7cly9ILr8P6N3Ei7bTEjg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/logger': 2.9.3 + '@parcel/node-resolver-core': 3.0.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + semver: 7.5.4 + dev: false + + /@parcel/packager-css@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-mePiWiYZOULY6e1RdAIJyRoYqXqGci0srOaVZYaP7mnrzvJgA63kaZFFsDiEWghunQpMUuUjM2x/vQVHzxmhKQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-html@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-0Ex+O0EaZf9APNERRNGgGto02hFJ6f5RQEvRWBK55WAV1rXeU+kpjC0c0qZvnUaUtXfpWMsEBkevJCwDkUMeMg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-js@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-V5xwkoE3zQ3R+WqAWhA1KGQ791FvJeW6KonOlMI1q76Djjgox68hhObqcLu66AmYNhR2R/wUpkP18hP2z8dSFw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + globals: 13.23.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-raw@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-oPQTNoYanQ2DdJyL61uPYK2py83rKOT8YVh2QWAx0zsSli6Kiy64U3+xOCYWgDVCrHw9+9NpQMuAdSiFg4cq8g==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-svg@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-p/Ya6UO9DAkaCUFxfFGyeHZDp9YPAlpdnh1OChuwqSFOXFjjeXuoK4KLT+ZRalVBo2Jo8xF70oKMZw4MVvaL7Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/plugin@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/plugin@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-qN85Gqr2GMuxX1dT1mnuO9hOcvlEv1lrYrCxn7CJN2nUhbwcfG+LEvcrCzCOJ6XtIHm+ZBV9h9p7FfoPLvpw+g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/profiler@2.9.3: + resolution: {integrity: sha512-pyHc9lw8VZDfgZoeZWZU9J0CVEv1Zw9O5+e0DJPDPHuXJYr72ZAOhbljtU3owWKAeW+++Q2AZWkbUGEOjI/e6g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + chrome-trace-event: 1.0.3 + dev: false + + /@parcel/reporter-bundle-buddy@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-9ftzLZ161USdvnxueT55EWufLI48va0xJfB5MAJLG92VAS1N1FSFgYKdkGFzBKw0eK9UScQNYnntCGC17rBayQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/reporter-dev-server@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-s6eboxdLEtRSvG52xi9IiNbcPKC0XMVmvTckieue2EqGDbDcaHQoHmmwkk0rNq0/Z/UxelGcQXoIYC/0xq3ykQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/resolver-default@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-8ESJk1COKvDzkmOnppNXoDamNMlYVIvrKc2RuFPmp8nKVj47R6NwMgvwxEaatyPzvkmyTpq5RvG9I3HFc+r4Cw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/node-resolver-core': 3.0.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-browser-hmr@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-EgiDIDrVAWpz7bOzWXqVinQkaFjLwT34wsonpXAbuI7f7r00d52vNAQC9AMu+pTijA3gyKoJ+Q4NWPMZf7ACDA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-js@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-IRja0vNKwvMtPgIqkBQh0QtRn0XcxNC8HU1jrgWGRckzu10qJWO+5ULgtOeR4pv9krffmMPqywGXw6l/gvJKYQ==} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-js@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-EvIy+qXcKnB5qxHhe96zmJpSAViNVXHfQI5RSdZ2a7CPwORwhTI+zPNT9sb7xb/WwFw/WuTTgzT40b41DceU6Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-react-refresh@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-XBgryZQIyCmi6JwEfMUCmINB3l1TpTp9a2iFxmYNpzHlqj4Ve0saKaqWOVRLvC945ZovWIBzcSW2IYqWKGtbAA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + react-error-overlay: 6.0.9 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-service-worker@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-qLJLqv1mMdWL7gyh8aKBFFAuEiJkhUUgLKpdn6eSfH/R7kTtb76WnOwqUrhvEI9bZFUM/8Pa1bzJnPpqSOM+Sw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/source-map@2.1.1: + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + dependencies: + detect-libc: 1.0.3 + dev: false + + /@parcel/transformer-babel@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-pURtEsnsp3h6tOBDuzh9wRvVtw4PgIlqwAArIWdrG7iwqOUYv9D8ME4+ePWEu7MQWAp58hv9pTJtqWv4T+Sq8A==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.22.1 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-css@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-duWMdbEBBPjg3fQdXF16iWIdThetDZvCs2TpUD7xOlXH6kR0V5BJy8ONFT15u1RCqIV9hSNGaS3v3I9YRNY5zQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.22.1 + lightningcss: 1.22.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-graphql@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-cIohsH3WlXgn63baU35ZoWHzttmkyE2Q1pexKjszODzSUq3pdcg+9k4rB/z8GGMzXvFRYuBgl2M2Ukqz7SueMg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + graphql: 15.8.0 + graphql-import-macro: 1.0.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-html@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-0NU4omcHzFXA1seqftAXA2KNZaMByoKaNdXnLgBgtCGDiYvOcL+6xGHgY6pw9LvOh5um10KI5TxSIMILoI7VtA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-image@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-7CEe35RaPadQzLIuxzTtIxnItvOoy46hcbXtOdDt6lmVa4omuOygZYRIya2lsGIP4JHvAaALMb5nt99a1uTwJg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + dev: false + + /@parcel/transformer-inline-string@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-IZNd0Ksl32psX1M41KbUc4BmvVSoLVnlpaMrh9C/l+piFSkDXWMnF0PONX/RcxYMBIwB2jYllheIKH54naeNaA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-js@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-Z2MVVg5FYcPOfxlUwxqb5l9yjTMEqE3KI3zq2MBRUme6AV07KxLmCDF23b6glzZlHWQUE8MXzYCTAkOPCcPz+Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + '@swc/helpers': 0.5.3 + browserslist: 4.22.1 + nullthrows: 1.1.1 + regenerator-runtime: 0.13.11 + semver: 7.5.4 + dev: false + + /@parcel/transformer-json@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-yNL27dbOLhkkrjaQjiQ7Im9VOxmkfuuSNSmS0rA3gEjVcm07SLKRzWkAaPnyx44Lb6bzyOTWwVrb9aMmxgADpA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-less@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-qwF5NQ8rPZjS79tv9RRPxzkZcwLcI4Xg2gHm9c1PvsgoaL2tVNpfjiRA6MOrzfJp+xr7xEzeMDZksOJ1WQiiQg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + less: 4.2.0 + transitivePeerDependencies: + - '@parcel/core' + - supports-color + dev: false + + /@parcel/transformer-postcss@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-HoDvPqKzhpmvMmHqQhDnt8F1vH61m6plpGiYaYnYv2Om4HHi5ZIq9bO+9QLBnTKfaZ7ndYSefTKOxTYElg7wyw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-posthtml@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-2fQGgrzRmaqbWf3y2/T6xhqrNjzqMMKksqJzvc8TMfK6f2kg3Ddjv158eaSW2JdkV39aY7tvAOn5f1uzo74BMA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-raw@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-oqdPzMC9QzWRbY9J6TZEqltknjno+dY24QWqf8ondmdF2+W+/2mRDu59hhCzQrqUHgTq4FewowRZmSfpzHxwaQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-react-refresh-wrap@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-cb9NyU6oJlDblFIlzqIE8AkvRQVGl2IwJNKwD4PdE7Y6sq2okGEPG4hOw3k/Y9JVjM4/2pUORqvjSRhWwd9oVQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-sass@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-i9abj9bKg3xCHghJyTM3rUVxIEn9n1Rl+DFdpyNAD8VZ52COfOshFDQOWNuhU1hEnJOFYCjnfcO0HRTsg3dWmg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + sass: 1.69.5 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-svg-react@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-RXmCn58CkCBhpsS1AaRBrSRla0U5JN3r3hb7kQvEb+d7chGnsxCCWsBxtlrxPUjoUFLdQli9rhpCTkiyOBXY2A==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + transitivePeerDependencies: + - '@parcel/core' + - supports-color + dev: false + + /@parcel/transformer-svg@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-ypmE+dzB09IMCdEAkOsSxq1dEIm2A3h67nAFz4qbfHbwNgXBUuy/jB3ZMwXN/cO0f7SBh/Ap8Jhq6vmGqB5tWw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-worklet@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-Fgd81OTOvAxAKoBGsQow/mgxELaNG1FeZW4DuDEPo/hR3lbs90oYuVpG2thdx7hmi/W6xqhrLaEN5Ea1v0LvEA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/types@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-FECA1FB7+0UpITKU0D6TgGBpGxYpVSMNEENZbSJxFSajNy3wrko+zwBKQmFOLOiPcEtnGikxNs+jkFWbPlUAtw==} + dependencies: + '@parcel/cache': 2.8.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.8.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/types@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-NSNY8sYtRhvF1SqhnIGgGvJocyWt1K8Tnw5cVepm0g38ywtX6mwkBvMkmeehXkII4mSUn+frD9wGsydTunezvA==} + dependencies: + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/utils@2.8.3: + resolution: {integrity: sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/codeframe': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/markdown-ansi': 2.8.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + dev: false + + /@parcel/utils@2.9.3: + resolution: {integrity: sha512-cesanjtj/oLehW8Waq9JFPmAImhoiHX03ihc3JTWkrvJYSbD7wYKCDgPAM3JiRAqvh1LZ6P699uITrYWNoRLUg==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/codeframe': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/markdown-ansi': 2.9.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + dev: false + + /@parcel/watcher-android-arm64@2.2.0: + resolution: {integrity: sha512-nU2wh00CTQT9rr1TIKTjdQ9lAGYpmz6XuKw0nAwAN+S2A5YiD55BK1u+E5WMCT8YOIDe/n6gaj4o/Bi9294SSQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.2.0: + resolution: {integrity: sha512-cJl0UZDcodciy3TDMomoK/Huxpjlkkim3SyMgWzjovHGOZKNce9guLz2dzuFwfObBFCjfznbFMIvAZ5syXotYw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.2.0: + resolution: {integrity: sha512-QI77zxaGrCV1StKcoRYfsUfmUmvPMPfQrubkBBy5XujV2fwaLgZivQOTQMBgp5K2+E19u1ufpspKXAPqSzpbyg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.2.0: + resolution: {integrity: sha512-I2GPBcAXazPzabCmfsa3HRRW+MGlqxYd8g8RIueJU+a4o5nyNZDz0CR1cu0INT0QSQXEZV7w6UE8Hz9CF8u3Pg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.2.0: + resolution: {integrity: sha512-St5mlfp+2lS9AmgixUqfwJa/DwVmTCJxC1HcOubUTz6YFOKIlkHCeUa1Bxi4E/tR/HSez8+heXHL8HQkJ4Bd8g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.2.0: + resolution: {integrity: sha512-jS+qfhhoOBVWwMLP65MaG8xdInMK30pPW8wqTCg2AAuVJh5xepMbzkhHJ4zURqHiyY3EiIRuYu4ONJKCxt8iqA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.2.0: + resolution: {integrity: sha512-xJvJ7R2wJdi47WZBFS691RDOWvP1j/IAs3EXaWVhDI8FFITbWrWaln7KoNcR0Y3T+ZwimFY/cfb0PNht1q895g==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.2.0: + resolution: {integrity: sha512-D+NMpgr23a+RI5mu8ZPKWy7AqjBOkURFDgP5iIXXEf/K3hm0jJ3ogzi0Ed2237B/CdYREimCgXyeiAlE/FtwyA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-arm64@2.2.0: + resolution: {integrity: sha512-z225cPn3aygJsyVUOWwfyW+fY0Tvk7N3XCOl66qUPFxpbuXeZuiuuJemmtm8vxyqa3Ur7peU/qJxrpC64aeI7Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.2.0: + resolution: {integrity: sha512-JqGW0RJ61BkKx+yYzIURt9s53P7xMVbv0uxYPzAXLBINGaFmkIKSuUPyBVfy8TMbvp93lvF4SPBNDzVRJfvgOw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.2.0: + resolution: {integrity: sha512-71S4TF+IMyAn24PK4KSkdKtqJDR3zRzb0HE3yXpacItqTM7XfF2f5q9NEGLEVl0dAaBAGfNwDCjH120y25F6Tg==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.2.0 + '@parcel/watcher-darwin-arm64': 2.2.0 + '@parcel/watcher-darwin-x64': 2.2.0 + '@parcel/watcher-linux-arm-glibc': 2.2.0 + '@parcel/watcher-linux-arm64-glibc': 2.2.0 + '@parcel/watcher-linux-arm64-musl': 2.2.0 + '@parcel/watcher-linux-x64-glibc': 2.2.0 + '@parcel/watcher-linux-x64-musl': 2.2.0 + '@parcel/watcher-win32-arm64': 2.2.0 + '@parcel/watcher-win32-x64': 2.2.0 + dev: false + + /@parcel/workers@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + chrome-trace-event: 1.0.3 + nullthrows: 1.1.1 + dev: false + + /@parcel/workers@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-zRrDuZJzTevrrwElYosFztgldhqW6G9q5zOeQXfVQFkkEJCNfg36ixeiofKRU8uu2x+j+T6216mhMNB6HiuY+w==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/profiler': 2.9.3 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/consolidate@0.17.0: + resolution: {integrity: sha512-Na8imBnvzYPtzkK+9Uv9hPZ/oJti/0jgiQWD222SHxHw2QCVuR4KzslxXCy/rS8gGluSiTs1BGVvc3d2O6aJCA==} + engines: {node: '>= 0.10.0'} + peerDependencies: + arc-templates: ^0.5.3 + atpl: '>=0.7.6' + babel-core: ^6.26.3 + bracket-template: ^1.1.5 + coffeescript: ^2.7.0 + dot: ^1.1.3 + eco: ^1.1.0-rc-3 + ect: ^0.5.9 + ejs: ^3.1.5 + haml-coffee: ^1.14.1 + hamlet: ^0.3.3 + hamljs: ^0.6.2 + handlebars: ^4.7.6 + hogan.js: ^3.0.2 + htmling: ^0.0.8 + jazz: ^0.0.18 + jqtpl: ~1.1.0 + just: ^0.1.8 + liquid: ^5.1.1 + liquor: ^0.0.5 + lodash: ^4.17.20 + marko: ^3.14.4 + mote: ^0.2.0 + mustache: ^4.0.1 + nunjucks: ^3.2.2 + plates: ~0.4.11 + pug: ^3.0.0 + qejs: ^3.0.5 + ractive: ^1.3.12 + razor-tmpl: ^1.3.1 + react: ^18.2.0 + react-dom: ^18.2.0 + slm: ^2.0.0 + squirrelly: ^5.1.0 + teacup: ^2.0.0 + templayed: '>=0.2.3' + then-pug: '*' + tinyliquid: ^0.2.34 + toffee: ^0.3.6 + twig: ^1.15.2 + twing: ^5.0.2 + underscore: ^1.11.0 + vash: ^0.13.0 + velocityjs: ^2.0.1 + walrus: ^0.10.1 + whiskers: ^0.4.0 + peerDependenciesMeta: + arc-templates: + optional: true + atpl: + optional: true + babel-core: + optional: true + bracket-template: + optional: true + coffeescript: + optional: true + dot: + optional: true + eco: + optional: true + ect: + optional: true + ejs: + optional: true + haml-coffee: + optional: true + hamlet: + optional: true + hamljs: + optional: true + handlebars: + optional: true + hogan.js: + optional: true + htmling: + optional: true + jazz: + optional: true + jqtpl: + optional: true + just: + optional: true + liquid: + optional: true + liquor: + optional: true + lodash: + optional: true + marko: + optional: true + mote: + optional: true + mustache: + optional: true + nunjucks: + optional: true + plates: + optional: true + pug: + optional: true + qejs: + optional: true + ractive: + optional: true + razor-tmpl: + optional: true + react: + optional: true + react-dom: + optional: true + slm: + optional: true + squirrelly: + optional: true + teacup: + optional: true + templayed: + optional: true + then-pug: + optional: true + tinyliquid: + optional: true + toffee: + optional: true + twig: + optional: true + twing: + optional: true + underscore: + optional: true + vash: + optional: true + velocityjs: + optional: true + walrus: + optional: true + whiskers: + optional: true + dependencies: + bluebird: 3.7.2 + dev: false + + /@plasmohq/init@0.7.0: + resolution: {integrity: sha512-P75g48dqOGneJ+n0AcqnLE/TYflcaPc3B7h6EopnCBBYUDnCNBMwYmKAkaf5pnhsEB0ybPS6TU1C2DTGfqaW7A==} + dev: false + + /@plasmohq/parcel-bundler@0.5.5: + resolution: {integrity: sha512-QCMmmfic514CfdXMJ7JMWUnqDzIHKVKyYeqPpUDsXON6JvA1yTmO5mEQSls8+5u/HpocP9QmTskQOHu3RCNX9A==} + engines: {node: '>= 16.0.0', parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-compressor-utf8@0.0.6(@parcel/core@2.9.3): + resolution: {integrity: sha512-dtbZXi2gAHyVhxqxF2SvJtwDOy02QYRjwCJYOFsQR79qwAiuUBaeQ47p++vFrqNX86mo1lUtZniJl63xNQi08w==} + engines: {parcel: '>= 2.8.0'} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@plasmohq/parcel-config@0.40.0(postcss@8.4.31)(typescript@5.2.2): + resolution: {integrity: sha512-aDyZIL3ScTmA1CsB/Sym7SxOMVSFUgNQrFovD+sl1M2nrYytqkLDFs7mspCpBlsxCGt97s8rD/kufke21UUHRA==} + dependencies: + '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/config-default': 2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)(typescript@5.2.2) + '@parcel/core': 2.9.3 + '@parcel/optimizer-data-url': 2.9.3(@parcel/core@2.9.3) + '@parcel/reporter-bundle-buddy': 2.9.3(@parcel/core@2.9.3) + '@parcel/resolver-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-js': 2.8.3(@parcel/core@2.9.3) + '@parcel/runtime-service-worker': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/transformer-babel': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-graphql': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-inline-string': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-less': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-postcss': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-react-refresh-wrap': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-sass': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-svg-react': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-worklet': 2.9.3(@parcel/core@2.9.3) + '@plasmohq/parcel-bundler': 0.5.5 + '@plasmohq/parcel-compressor-utf8': 0.0.6(@parcel/core@2.9.3) + '@plasmohq/parcel-namer-manifest': 0.3.12 + '@plasmohq/parcel-optimizer-encapsulate': 0.0.7 + '@plasmohq/parcel-optimizer-es': 0.4.0 + '@plasmohq/parcel-packager': 0.6.14 + '@plasmohq/parcel-resolver': 0.13.1 + '@plasmohq/parcel-resolver-post': 0.4.2(postcss@8.4.31) + '@plasmohq/parcel-runtime': 0.23.0 + '@plasmohq/parcel-transformer-inject-env': 0.2.11 + '@plasmohq/parcel-transformer-inline-css': 0.3.9 + '@plasmohq/parcel-transformer-manifest': 0.17.8 + '@plasmohq/parcel-transformer-svelte': 0.5.2 + '@plasmohq/parcel-transformer-vue': 0.5.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - cssnano + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - postcss + - pug + - purgecss + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - relateurl + - slm + - squirrelly + - srcset + - supports-color + - teacup + - templayed + - terser + - then-pug + - tinyliquid + - toffee + - ts-node + - twig + - twing + - typescript + - uncss + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: false + + /@plasmohq/parcel-core@0.1.8: + resolution: {integrity: sha512-kMWuazvf925ZAn2yHzzrb4Zsje1titFmvi/C5cXrI0TH58eT7n6GUiRXiOYP4JgGDHs/pEygx3WPuyWVTNF2HQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/watcher': 2.2.0 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + abortcontroller-polyfill: 1.7.5 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-namer-manifest@0.3.12: + resolution: {integrity: sha512-mNyIVK4nRbjlnXXUygBcmV7xLzgS1HZ3vedxUrMQah0Wp0Y20GFcomToDBC0w9NXIZVSSKY0bRIeh0B6/verfQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + dev: false + + /@plasmohq/parcel-optimizer-encapsulate@0.0.7: + resolution: {integrity: sha512-mA9kY5dwuebQ4vLX6A5yTFo0gZZNWKUHpF6yO0lYq3oP843MyRJS8SxAtzQb4vTlVWPk3SX6Yw81DgBo4I6Xiw==} + engines: {parcel: '>= 2.8.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@plasmohq/parcel-optimizer-es@0.4.0: + resolution: {integrity: sha512-Iz1cTuw38wEbSQ36/dVKh5MyRA12/Ecrx90pqaIkoqA9ZSZuxuWWa7rPa3bVMFkzi28BpVHW1z9EnhVN4188kQ==} + engines: {parcel: '>= 2.8.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@swc/core': 1.3.82 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@swc/helpers' + dev: false + + /@plasmohq/parcel-packager@0.6.14: + resolution: {integrity: sha512-pFab9COfafx66CtOFWgLgKf4TUPLb5EiTO4ecRz1HDINSvPl48ci+3czmtSzOI4+b1uiqZYxUB3eeaMfh9XWpA==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-resolver-post@0.4.2(postcss@8.4.31): + resolution: {integrity: sha512-dbrwjUQEhKqKBEgVJjL5ls1p6bpQ3VlDXI5REoaSpwoPcB7TRAcUfTwV4oNGE4eTnw4ElF08JkyslYvKgxosAw==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + tsup: 7.2.0(postcss@8.4.31)(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - postcss + - supports-color + - ts-node + dev: false + + /@plasmohq/parcel-resolver@0.13.1: + resolution: {integrity: sha512-IuKr3Ue1+2fsyJPQuHh4Yh36L3FI/2I27X6hC+NHlX/1j9fVYiFk89dTSPNhvAdGN/hwsMjQ/jCiKZGW1157xg==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + fast-glob: 3.2.12 + fs-extra: 11.1.1 + got: 13.0.0 + dev: false + + /@plasmohq/parcel-runtime@0.23.0: + resolution: {integrity: sha512-+ZqH9XksSbWPC6pnvjmvmykxh1SfyYkSKyOeNQSeHsPFo40fADUKOda8Hw/vm/g5p8GIlv5YSb2iYZzCWmKs1g==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + react-refresh: 0.14.0 + dev: false + + /@plasmohq/parcel-transformer-inject-env@0.2.11: + resolution: {integrity: sha512-eGwwoaDbPPwrRcEgOi/BpLVGe5ttrBhs91NBcKMpE/D5gktfbJPD1zHG8MPtQdE4Iq23aG3JUbiT5clmdwtUhQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@plasmohq/parcel-transformer-inline-css@0.3.9: + resolution: {integrity: sha512-da1gVe3TX7J5lC6M04iHzp2NPwhh40n/Gx/Di9o2KLLEYe0q+pKlI5OjN9zf5kpXwXfVO7QzE5B1/tRGoEu2Bw==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + browserslist: 4.21.10 + lightningcss: 1.21.7 + dev: false + + /@plasmohq/parcel-transformer-manifest@0.17.8: + resolution: {integrity: sha512-G6XISWddf900Q/4ABlFLBJcqvN1VTYF06NytTOMSDO4dOraxGhgZ0CyC990b+LJEa7nc5xf4xhHQxf3mkjALPQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.0 + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + content-security-policy-parser: 0.4.1 + json-schema-to-ts: 2.9.2 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-transformer-svelte@0.5.2: + resolution: {integrity: sha512-kZevkKYgYB7KZqi1+8k5ELqrSNKakqBwuTLnIT0BOx/8VKTJ6fwkzW0SR1OFsDJIACRFbMLO77u+erwHkodBEA==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + svelte: 4.0.1 + dev: false + + /@plasmohq/parcel-transformer-vue@0.5.0: + resolution: {integrity: sha512-/3oVbajt+DRqtbM0RkKFtfyZR8DVjcsYpj1jHqPParGVBiXwgP0D/8Bj5p5/5Iqihs08gzasTcjKcwQKKdj0og==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@plasmohq/consolidate': 0.17.0 + '@vue/compiler-sfc': 3.3.4 + nullthrows: 1.1.1 + semver: 7.5.4 + vue: 3.3.4 + transitivePeerDependencies: + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - slm + - squirrelly + - teacup + - templayed + - then-pug + - tinyliquid + - toffee + - twig + - twing + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: false + + /@plasmohq/storage@1.9.0: + resolution: {integrity: sha512-mntoJ0EVh7JfYyMKWKnt6yqVlJnwavEkwdXssSOxS1CEeyNX2GPkXQfChvlGhuEJplqcRhLaym6rEc690Ao0fg==} + peerDependencies: + react: ^16.8.6 || ^17 || ^18 + peerDependenciesMeta: + react: + optional: true + dependencies: + pify: 6.1.0 + dev: false + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: false + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: false + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: false + + /@rgossiaux/svelte-headlessui@2.0.0(svelte@4.2.2): + resolution: {integrity: sha512-ksh245HqMM8yqkzd/OyAK2FCHZYOSA3ldLIHab7C9S60FmifqT24JFVgi8tZpsDEMk3plbfQvfah93n5IEi8sg==} + peerDependencies: + svelte: ^3.47.0 + dependencies: + svelte: 4.2.2 + dev: true + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.3): + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.3): + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.3): + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.3): + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.3): + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.3): + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-preset@6.5.1(@babel/core@7.23.3): + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.3) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.3) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.3) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.3) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.3) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.3) + dev: false + + /@svgr/core@6.5.1: + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.3) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/hast-util-to-babel-ast@6.5.1: + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.23.4 + entities: 4.5.0 + dev: false + + /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + dependencies: + '@babel/core': 7.23.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.3) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + dev: false + + /@swc/core-darwin-arm64@1.3.82: + resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-darwin-x64@1.3.82: + resolution: {integrity: sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.82: + resolution: {integrity: sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-gnu@1.3.82: + resolution: {integrity: sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-musl@1.3.82: + resolution: {integrity: sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-gnu@1.3.82: + resolution: {integrity: sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-musl@1.3.82: + resolution: {integrity: sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-arm64-msvc@1.3.82: + resolution: {integrity: sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-ia32-msvc@1.3.82: + resolution: {integrity: sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-x64-msvc@1.3.82: + resolution: {integrity: sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core@1.3.82: + resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.82 + '@swc/core-darwin-x64': 1.3.82 + '@swc/core-linux-arm-gnueabihf': 1.3.82 + '@swc/core-linux-arm64-gnu': 1.3.82 + '@swc/core-linux-arm64-musl': 1.3.82 + '@swc/core-linux-x64-gnu': 1.3.82 + '@swc/core-linux-x64-musl': 1.3.82 + '@swc/core-win32-arm64-msvc': 1.3.82 + '@swc/core-win32-ia32-msvc': 1.3.82 + '@swc/core-win32-x64-msvc': 1.3.82 + dev: false + + /@swc/helpers@0.5.3: + resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} + dependencies: + tslib: 2.6.2 + dev: false + + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: false + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: false + + /@types/chrome@0.0.251: + resolution: {integrity: sha512-UF+yr0LEKWWGsKxQ5A3XOSF5SNoU1ctW3pXcWJPpT8OOUTEspYeaLU8spDKe+6xalXeMTS0TBrX1g0b6qlWmkw==} + dependencies: + '@types/filesystem': 0.0.35 + '@types/har-format': 1.2.15 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/filesystem@0.0.35: + resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} + dependencies: + '@types/filewriter': 0.0.32 + dev: true + + /@types/filewriter@0.0.32: + resolution: {integrity: sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==} + dev: true + + /@types/firefox-webext-browser@120.0.0: + resolution: {integrity: sha512-L+tDlwNeq0kQGfAYc2sNfKhRWJz9CNRvlbq9HnLibKUiJ3VTThG8sj7xrJF4CtKpEA9eBAr91Z2nnKIAy+xUJg==} + dev: true + + /@types/har-format@1.2.15: + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/node@20.9.0: + resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false + + /@types/pug@2.0.10: + resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + dev: false + + /@vue/compiler-core@3.3.4: + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + dependencies: + '@babel/parser': 7.23.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-dom@3.3.4: + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + dev: false + + /@vue/compiler-sfc@3.3.4: + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + dependencies: + '@babel/parser': 7.23.4 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.31 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-ssr@3.3.4: + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + dev: false + + /@vue/reactivity-transform@3.3.4: + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + dependencies: + '@babel/parser': 7.23.4 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.5 + dev: false + + /@vue/reactivity@3.3.4: + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + dependencies: + '@vue/shared': 3.3.4 + dev: false + + /@vue/runtime-core@3.3.4: + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + dev: false + + /@vue/runtime-dom@3.3.4: + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.2 + dev: false + + /@vue/server-renderer@3.3.4(vue@3.3.4): + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + dev: false + + /@vue/shared@3.3.4: + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + dev: false + + /abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + dev: false + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001565 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: true + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001565 + electron-to-chromium: 1.4.594 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.21.10) + dev: false + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001565 + electron-to-chromium: 1.4.594 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /bundle-require@4.0.2(esbuild@0.18.20): + resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + dependencies: + esbuild: 0.18.20 + load-tsconfig: 0.2.5 + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: false + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: false + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: false + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + + /caniuse-lite@1.0.30001565: + resolution: {integrity: sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==} + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /change-case@5.1.2: + resolution: {integrity: sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA==} + dev: false + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: false + + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: false + + /code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.5 + acorn: 8.11.2 + estree-walker: 3.0.3 + periscopic: 3.1.0 + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /content-security-policy-parser@0.4.1: + resolution: {integrity: sha512-NNJS8XPnx3OKr/CUOSwDSJw+lWTrZMYnclLKj0Y9CYOfJNJTWLFGPg3u2hYgbXMXKVRkZR2fbyReNQ1mUff/Qg==} + engines: {node: '>=8.0.0'} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: false + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: false + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + optional: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: false + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: false + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: false + + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: false + + /dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /dotenv@7.0.0: + resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} + engines: {node: '>=6'} + dev: false + + /electron-to-chromium@1.4.594: + resolution: {integrity: sha512-xT1HVAu5xFn7bDfkjGQi9dNpMqGchUkebwf1GL7cZN32NSwwlHRPMSDJ1KN6HkS0bWUtndbSQZqvpQftKG2uFQ==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: false + + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: false + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + + /es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: false + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fflate@0.8.1: + resolution: {integrity: sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==} + dev: false + + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /fuse.js@6.6.2: + resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} + engines: {node: '>=10'} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + + /get-port@7.0.0: + resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + engines: {node: '>=16'} + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: false + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /graphql-import-macro@1.0.0: + resolution: {integrity: sha512-YK4g6iP60H++MpP93tb0VwOg7aM5iIC0hdSQKTrEDANeLWf0KFAT9dwlBeMDrhY+jcW7qsAEDtaw58cgVnQXAw==} + dependencies: + graphql: 15.8.0 + dev: false + + /graphql@15.8.0: + resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} + engines: {node: '>= 10.x'} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /htmlnano@2.1.0(postcss@8.4.31)(svgo@2.8.0)(typescript@5.2.2): + resolution: {integrity: sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==} + peerDependencies: + cssnano: ^6.0.0 + postcss: ^8.3.11 + purgecss: ^5.0.0 + relateurl: ^0.2.7 + srcset: 4.0.0 + svgo: ^3.0.2 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + dependencies: + cosmiconfig: 8.3.6(typescript@5.2.2) + postcss: 8.4.31 + posthtml: 0.16.6 + svgo: 2.8.0 + timsort: 0.3.0 + transitivePeerDependencies: + - typescript + dev: false + + /htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + optional: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /immutable@4.3.4: + resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + engines: {node: '>=14.18.0'} + dependencies: + '@ljharb/through': 2.3.11 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-json@2.0.1: + resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + dev: false + + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: false + + /isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /json-schema-to-ts@2.9.2: + resolution: {integrity: sha512-h9WqLkTVpBbiaPb5OmeUpz/FBLS/kvIJw4oRCPiEisIu2WjMh+aai0QIY2LoOhRFx5r92taGLcerIrzxKBAP6g==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.23.4 + '@types/json-schema': 7.0.15 + ts-algebra: 1.2.2 + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: false + + /less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: false + + /lightningcss-darwin-arm64@1.21.7: + resolution: {integrity: sha512-tt7hIsFio9jZofTVHtCACz6rB6c9RyABMXfA9A/VcKOjS3sq+koX/QkRJWY06utwOImbJIXBC5hbg9t3RkPUAQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-arm64@1.22.1: + resolution: {integrity: sha512-ldvElu+R0QimNTjsKpaZkUv3zf+uefzLy/R1R19jtgOfSRM+zjUCUgDhfEDRmVqJtMwYsdhMI2aJtJChPC6Osg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.21.7: + resolution: {integrity: sha512-F4gS4bf7eWekfPT+TxJNm/pF+QRgZiTrTkQH6cw4/UWfdeZISfuhD5El2dm16giFnY0K5ylIwO+ZusgYNkGSXA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.22.1: + resolution: {integrity: sha512-5p2rnlVTv6Gpw4PlTLq925nTVh+HFh4MpegX8dPDYJae+NFVjQ67gY7O6iHIzQjLipDiYejFF0yHrhjU3XgLBQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.21.7: + resolution: {integrity: sha512-RMfNzJWXCSfPnL55fcLWEAadcY6QUFT0S8NceNKYzp1KiCZtkJIy6RQ5SaVxPzRqd3iMsahUf5sfnG8N1UQSNQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.22.1: + resolution: {integrity: sha512-1FaBtcFrZqB2hkFbAxY//Pnp8koThvyB6AhjbdVqKD4/pu13Rl91fKt2N9qyeQPUt3xy7ORUvSO+dPk3J6EjXg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.21.7: + resolution: {integrity: sha512-biSRUDZNx7vubWP1jArw/qqfZKPGpkV/qzunasZzxmqijbZ43sW9faDQYxWNcxPWljJJdF/qs6qcurYFovWtrQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.22.1: + resolution: {integrity: sha512-6rub98tYGfE5I5j0BP8t/2d4BZyu1S7Iz9vUkm0H26snAFHYxLfj3RbQn0xHHIePSetjLnhcg3QlfwUAkD/FYg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.21.7: + resolution: {integrity: sha512-PENY8QekqL9TG3AY/A7rkUBb5ymefGxea7Oe7+x7Hbw4Bz4Hpj5cec5OoMypMqFbURPmpi0fTWx4vSWUPzpDcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.22.1: + resolution: {integrity: sha512-nYO5qGtb/1kkTZu3FeTiM+2B2TAb7m2DkLCTgQIs2bk2o9aEs7I96fwySKcoHWQAiQDGR9sMux9vkV4KQXqPaQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.21.7: + resolution: {integrity: sha512-pfOipKvA/0X1OjRaZt3870vnV9UGBSjayIqHh0fGx/+aRz3O0MVFHE/60P2UWXpM3YGJEw/hMWtNkrFwqOge8A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.22.1: + resolution: {integrity: sha512-MCV6RuRpzXbunvzwY644iz8cw4oQxvW7oer9xPkdadYqlEyiJJ6wl7FyJOH7Q6ZYH4yjGAUCvxDBxPbnDu9ZVg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.21.7: + resolution: {integrity: sha512-dgcsis4TAA7s0ia4f31QHX+G4PWPwxk+wJaEQLaV0NdJs09O5hHoA8DpLEr8nrvc/tsRTyVNBP1rDtgzySjpXg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.22.1: + resolution: {integrity: sha512-RjNgpdM20VUXgV7us/VmlO3Vn2ZRiDnc3/bUxCVvySZWPiVPprpqW/QDWuzkGa+NCUf6saAM5CLsZLSxncXJwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.21.7: + resolution: {integrity: sha512-A+9dXpxld3p4Cd6fxev2eqEvaauYtrgNpXV3t7ioCJy30Oj9nYiNGwiGusM+4MJVcEpUPGUGiuAqY4sWilRDwA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.22.1: + resolution: {integrity: sha512-ZgO4C7Rd6Hv/5MnyY2KxOYmIlzk4rplVolDt3NbkNR8DndnyX0Q5IR4acJWNTBICQ21j3zySzKbcJaiJpk/4YA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.21.7: + resolution: {integrity: sha512-07/8vogEq+C/mF99pdMhh/f19/xreq8N9Ca6AWeVHZIdODyF/pt6KdKSCWDZWIn+3CUxI8gCJWuUWyOc3xymvw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.22.1: + resolution: {integrity: sha512-4pozV4eyD0MDET41ZLHAeBo+H04Nm2UEYIk5w/ts40231dRFV7E0cjwbnZvSoc1DXFgecAhiC0L16ruv/ZDCpg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss@1.21.7: + resolution: {integrity: sha512-xITZyh5sLFwRPYUSw15T00Rm7gcQ1qOPuQwNOcvHsTm6nLWTQ723w7zl42wrC5t+xtdg6FPmnXHml1nZxxvp1w==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.21.7 + lightningcss-darwin-x64: 1.21.7 + lightningcss-freebsd-x64: 1.21.7 + lightningcss-linux-arm-gnueabihf: 1.21.7 + lightningcss-linux-arm64-gnu: 1.21.7 + lightningcss-linux-arm64-musl: 1.21.7 + lightningcss-linux-x64-gnu: 1.21.7 + lightningcss-linux-x64-musl: 1.21.7 + lightningcss-win32-x64-msvc: 1.21.7 + dev: false + + /lightningcss@1.22.1: + resolution: {integrity: sha512-Fy45PhibiNXkm0cK5FJCbfO8Y6jUpD/YcHf/BtuI+jvYYqSXKF4muk61jjE8YxCR9y+hDYIWSzHTc+bwhDE6rQ==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.22.1 + lightningcss-darwin-x64: 1.22.1 + lightningcss-freebsd-x64: 1.22.1 + lightningcss-linux-arm-gnueabihf: 1.22.1 + lightningcss-linux-arm64-gnu: 1.22.1 + lightningcss-linux-arm64-musl: 1.22.1 + lightningcss-linux-x64-gnu: 1.22.1 + lightningcss-linux-x64-musl: 1.22.1 + lightningcss-win32-x64-msvc: 1.22.1 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lmdb@2.5.2: + resolution: {integrity: sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==} + requiresBuild: true + dependencies: + msgpackr: 1.9.9 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.3 + ordered-binary: 1.4.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.5.2 + '@lmdb/lmdb-darwin-x64': 2.5.2 + '@lmdb/lmdb-linux-arm': 2.5.2 + '@lmdb/lmdb-linux-arm64': 2.5.2 + '@lmdb/lmdb-linux-x64': 2.5.2 + '@lmdb/lmdb-win32-x64': 2.5.2 + dev: false + + /lmdb@2.7.11: + resolution: {integrity: sha512-x9bD4hVp7PFLUoELL8RglbNXhAMt5CYhkmss+CEau9KlNoilsTzNi9QDsPZb3KMpOGZXG6jmXhW3bBxE2XVztw==} + hasBin: true + requiresBuild: true + dependencies: + msgpackr: 1.8.5 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.6 + ordered-binary: 1.4.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.7.11 + '@lmdb/lmdb-darwin-x64': 2.7.11 + '@lmdb/lmdb-linux-arm': 2.7.11 + '@lmdb/lmdb-linux-arm64': 2.7.11 + '@lmdb/lmdb-linux-x64': 2.7.11 + '@lmdb/lmdb-win32-x64': 2.7.11 + dev: false + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: false + optional: true + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mnemonic-id@3.2.7: + resolution: {integrity: sha512-kysx9gAGbvrzuFYxKkcRjnsg/NK61ovJOV4F1cHTRl9T5leg+bo6WI0pWIvOFh1Z/yDL0cjA5R3EEGPPLDv/XA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + optional: true + + /msgpackr-extract@3.0.2: + resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.0.7 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 + dev: false + optional: true + + /msgpackr@1.8.5: + resolution: {integrity: sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==} + optionalDependencies: + msgpackr-extract: 3.0.2 + dev: false + + /msgpackr@1.9.9: + resolution: {integrity: sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A==} + optionalDependencies: + msgpackr-extract: 3.0.2 + dev: false + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /needle@3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.6.3 + sax: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + dev: false + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + + /node-addon-api@7.0.0: + resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} + dev: false + + /node-gyp-build-optional-packages@5.0.3: + resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + hasBin: true + dev: false + + /node-gyp-build-optional-packages@5.0.6: + resolution: {integrity: sha512-2ZJErHG4du9G3/8IWl/l9Bp5BBFy63rno5GVmjQijvTuUZKsl6g8RB4KH/x3NLcV5ZBb4GsXmAuTYr6dRml3Gw==} + hasBin: true + dev: false + + /node-gyp-build-optional-packages@5.0.7: + resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} + hasBin: true + dev: false + optional: true + + /node-object-hash@3.0.0: + resolution: {integrity: sha512-jLF6tlyletktvSAawuPmH1SReP0YfZQ+tBrDiTCK+Ai7eXPMS9odi5xW/iKC7ZhrWJJ0Z5xYcW/x+1fVMn1Qvw==} + engines: {node: '>=16', pnpm: '>=8'} + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /ordered-binary@1.4.1: + resolution: {integrity: sha512-9LtiGlPy982CsgxZvJGNNp2/NnrgEr6EAyN3iIEP3/8vd3YLgAZQHbQ75ZrkfBRGrNg37Dk3U6tuVb+B4Xfslg==} + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: false + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 + dev: false + + /papaparse@5.4.1: + resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + optional: true + + /pify@6.1.0: + resolution: {integrity: sha512-KocF8ve28eFjjuBKKGvzOBGzG8ew2OqOOSxTTZhirkzH7h3BI1vyzqlR0qbfcDBve1Yzo3FVlWUAtCRrbVN8Fw==} + engines: {node: '>=14.16'} + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + /plasmo@0.84.0(postcss@8.4.31): + resolution: {integrity: sha512-SK6A/uX5mo4EsYiF7JySTOCp2aMo3ejfpbNey89M0zat9p0yDTKEClvMs9MWKXld5Ae0CXPaMYcZPAMvCMngPQ==} + hasBin: true + dependencies: + '@expo/spawn-async': 1.7.2 + '@parcel/core': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/watcher': 2.2.0 + '@plasmohq/init': 0.7.0 + '@plasmohq/parcel-config': 0.40.0(postcss@8.4.31)(typescript@5.2.2) + '@plasmohq/parcel-core': 0.1.8 + buffer: 6.0.3 + chalk: 5.3.0 + change-case: 5.1.2 + dotenv: 16.3.1 + dotenv-expand: 10.0.0 + events: 3.3.0 + fast-glob: 3.3.2 + fflate: 0.8.1 + get-port: 7.0.0 + got: 13.0.0 + ignore: 5.2.4 + inquirer: 9.2.12 + is-path-inside: 4.0.0 + json5: 2.2.3 + mnemonic-id: 3.2.7 + node-object-hash: 3.0.0 + package-json: 8.1.1 + process: 0.11.10 + semver: 7.5.4 + sharp: 0.32.6 + tempy: 3.1.0 + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - cssnano + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - postcss + - pug + - purgecss + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - relateurl + - slm + - squirrelly + - srcset + - supports-color + - teacup + - templayed + - terser + - then-pug + - tinyliquid + - toffee + - ts-node + - twig + - twing + - uncss + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: false + + /postcss-import@15.1.0(postcss@8.4.31): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.31): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.31 + dev: true + + /postcss-load-config@4.0.2(postcss@8.4.31): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.31 + yaml: 2.3.4 + + /postcss-nested@6.0.1(postcss@8.4.31): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /posthtml-parser@0.10.2: + resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: false + + /posthtml-parser@0.11.0: + resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: false + + /posthtml-render@3.0.0: + resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} + engines: {node: '>=12'} + dependencies: + is-json: 2.0.1 + dev: false + + /posthtml@0.16.6: + resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} + engines: {node: '>=12.0.0'} + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.51.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: false + optional: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-error-overlay@6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: false + + /react-refresh@0.9.0: + resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} + engines: {node: '>=0.10.0'} + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + dev: false + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: false + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /sander@0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.11 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: false + + /sass@1.69.5: + resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.4 + source-map-js: 1.0.2 + dev: false + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: false + optional: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /sorcery@0.11.0: + resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + hasBin: true + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + buffer-crc32: 0.2.13 + minimist: 1.2.8 + sander: 0.5.1 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: false + + /srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + dev: false + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: false + + /streamx@2.15.5: + resolution: {integrity: sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-preprocess@5.0.4(@babel/core@7.23.3)(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2): + resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} + engines: {node: '>= 14.10.0'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@babel/core': 7.23.3 + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.27.0 + postcss: 8.4.31 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.2 + typescript: 5.2.2 + dev: false + + /svelte@4.0.1: + resolution: {integrity: sha512-7n2u7A5cu8xCY6MBiXh/Mg6Lh3+Mw2qXlTDBYhzvCvmSM4L4gc4MVo540UtGcjqBiA48E1VDW+EUpBr7iuBlPg==} + engines: {node: '>=16'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + acorn: 8.11.2 + aria-query: 5.3.0 + axobject-query: 3.2.1 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.5 + periscopic: 3.1.0 + dev: false + + /svelte@4.2.2: + resolution: {integrity: sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==} + engines: {node: '>=16'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + acorn: 8.11.2 + aria-query: 5.3.0 + axobject-query: 3.2.1 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.5 + periscopic: 3.1.0 + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: false + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: false + + /tailwindcss@3.3.5: + resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-import: 15.1.0(postcss@8.4.31) + postcss-js: 4.0.1(postcss@8.4.31) + postcss-load-config: 4.0.2(postcss@8.4.31) + postcss-nested: 6.0.1(postcss@8.4.31) + postcss-selector-parser: 6.0.13 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.5 + dev: false + + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: false + + /tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + + /timsort@0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: false + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: false + + /ts-algebra@1.2.2: + resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /tsup@7.2.0(postcss@8.4.31)(typescript@5.2.2): + resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} + engines: {node: '>=16.14'} + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.1.0' + peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 4.0.2(esbuild@0.18.20) + cac: 6.7.14 + chokidar: 3.5.3 + debug: 4.3.4 + esbuild: 0.18.20 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss: 8.4.31 + postcss-load-config: 4.0.2(postcss@8.4.31) + resolve-from: 5.0.0 + rollup: 3.29.4 + source-map: 0.8.0-beta.0 + sucrase: 3.34.0 + tree-kill: 1.2.2 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + - ts-node + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.21.10): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /utility-types@3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + dev: false + + /vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + + /weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + dev: false + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: false + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /xxhash-wasm@0.4.2: + resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} diff --git a/oslash-with-plasmo/postcss.config.js b/oslash-with-plasmo/postcss.config.js new file mode 100644 index 0000000..1c62447 --- /dev/null +++ b/oslash-with-plasmo/postcss.config.js @@ -0,0 +1,9 @@ +/** + * @type {import('postcss').ProcessOptions} + */ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} \ No newline at end of file diff --git a/oslash-with-plasmo/style.css b/oslash-with-plasmo/style.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/oslash-with-plasmo/style.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/oslash-with-plasmo/svelte.config.mjs b/oslash-with-plasmo/svelte.config.mjs new file mode 100644 index 0000000..4bd8cc6 --- /dev/null +++ b/oslash-with-plasmo/svelte.config.mjs @@ -0,0 +1,15 @@ +import preprocess from "svelte-preprocess" + +/** + * This will add autocompletion if you're working with SvelteKit + * https://github.com/sveltejs/svelte-preprocess/blob/main/docs/usage.md + * @type {import('@sveltejs/kit').Config} + */ +const config = { + preprocess: preprocess({ + // ...svelte-preprocess options + }) + // ...other svelte options +} + +export default config diff --git a/oslash-with-plasmo/tailwind.config.js b/oslash-with-plasmo/tailwind.config.js new file mode 100644 index 0000000..d7984f7 --- /dev/null +++ b/oslash-with-plasmo/tailwind.config.js @@ -0,0 +1,7 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + mode: "jit", + darkMode: "class", + content: ["./**/*.svelte"], + plugins: [] +} \ No newline at end of file diff --git a/oslash-with-plasmo/tsconfig.json b/oslash-with-plasmo/tsconfig.json new file mode 100644 index 0000000..17f3e9f --- /dev/null +++ b/oslash-with-plasmo/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "plasmo/templates/tsconfig.base", + "exclude": [ + "node_modules" + ], + "include": [ + ".plasmo/index.d.ts", + "./**/*.ts", + "./**/*.svelte" + ], + "compilerOptions": { + "paths": { + "~*": [ + "./*" + ] + }, + "baseUrl": ".", + "types": ["svelte", "chrome", "firefox-webext-browser"] + } +} From e3117ae948ce12ec5bd2da1149f4852df5760797 Mon Sep 17 00:00:00 2001 From: Tanmay Shah Date: Fri, 1 Dec 2023 13:37:22 +0530 Subject: [PATCH 2/6] chore: temp-commit --- .../ShortcutForm/ShortcutForm.svelte | 121 +++++ .../lib/components/button/Button.spec.ts | 7 + .../lib/components/button/Button.svelte | 122 +++++ .../components/copybutton/CopyButton.spec.ts | 7 + .../components/copybutton/CopyButton.svelte | 45 ++ .../lib/components/icons/IconArrowLeft.svelte | 9 + .../components/icons/IconChevronRight.svelte | 7 + .../lib/components/icons/IconCopy.svelte | 8 + .../components/icons/IconDotsVertical.svelte | 7 + .../icons/IconExclamationCircle.svelte | 16 + .../components/icons/IconExternalLink.svelte | 8 + .../lib/components/icons/IconOslash.svelte | 9 + .../lib/components/icons/IconSearch.svelte | 16 + .../lib/components/input/Input.spec.ts | 7 + .../lib/components/input/Input.svelte | 107 +++++ .../lib/components/modal/ShortcutModal.svelte | 73 +++ .../lib/components/option/Option.spec.ts | 7 + .../lib/components/option/Option.svelte | 442 ++++++++++++++++++ .../lib/components/popup/Popup.spec.ts | 7 + .../lib/components/popup/Popup.svelte | 119 +++++ .../lib/components/success/Success.spec.ts | 7 + .../lib/components/success/Success.svelte | 65 +++ .../lib/utils/browser/getFaviconURL.ts | 19 + .../lib/utils/browser/getTabUrl.ts | 32 ++ .../lib/utils/checkIfShortcutExists.ts | 23 + .../utils/constructShortcutsFromCSVData.ts | 55 +++ .../lib/utils/copyToClipboard.ts | 27 ++ oslash-with-plasmo/lib/utils/isNotNull.ts | 3 + .../lib/utils/shortcutOperations.ts | 104 +++++ oslash-with-plasmo/lib/utils/validate.ts | 66 +++ oslash-with-plasmo/options.svelte | 15 + oslash-with-plasmo/popup.svelte | 16 + 32 files changed, 1576 insertions(+) create mode 100644 oslash-with-plasmo/lib/components/ShortcutForm/ShortcutForm.svelte create mode 100644 oslash-with-plasmo/lib/components/button/Button.spec.ts create mode 100644 oslash-with-plasmo/lib/components/button/Button.svelte create mode 100644 oslash-with-plasmo/lib/components/copybutton/CopyButton.spec.ts create mode 100644 oslash-with-plasmo/lib/components/copybutton/CopyButton.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconArrowLeft.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconChevronRight.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconCopy.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconDotsVertical.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconExclamationCircle.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconExternalLink.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconOslash.svelte create mode 100644 oslash-with-plasmo/lib/components/icons/IconSearch.svelte create mode 100644 oslash-with-plasmo/lib/components/input/Input.spec.ts create mode 100644 oslash-with-plasmo/lib/components/input/Input.svelte create mode 100644 oslash-with-plasmo/lib/components/modal/ShortcutModal.svelte create mode 100644 oslash-with-plasmo/lib/components/option/Option.spec.ts create mode 100644 oslash-with-plasmo/lib/components/option/Option.svelte create mode 100644 oslash-with-plasmo/lib/components/popup/Popup.spec.ts create mode 100644 oslash-with-plasmo/lib/components/popup/Popup.svelte create mode 100644 oslash-with-plasmo/lib/components/success/Success.spec.ts create mode 100644 oslash-with-plasmo/lib/components/success/Success.svelte create mode 100644 oslash-with-plasmo/lib/utils/browser/getFaviconURL.ts create mode 100644 oslash-with-plasmo/lib/utils/browser/getTabUrl.ts create mode 100644 oslash-with-plasmo/lib/utils/checkIfShortcutExists.ts create mode 100644 oslash-with-plasmo/lib/utils/constructShortcutsFromCSVData.ts create mode 100644 oslash-with-plasmo/lib/utils/copyToClipboard.ts create mode 100644 oslash-with-plasmo/lib/utils/isNotNull.ts create mode 100644 oslash-with-plasmo/lib/utils/shortcutOperations.ts create mode 100644 oslash-with-plasmo/lib/utils/validate.ts create mode 100644 oslash-with-plasmo/options.svelte create mode 100644 oslash-with-plasmo/popup.svelte diff --git a/oslash-with-plasmo/lib/components/ShortcutForm/ShortcutForm.svelte b/oslash-with-plasmo/lib/components/ShortcutForm/ShortcutForm.svelte new file mode 100644 index 0000000..0f6b7ca --- /dev/null +++ b/oslash-with-plasmo/lib/components/ShortcutForm/ShortcutForm.svelte @@ -0,0 +1,121 @@ + + +
+
+ + + + +
+ + +
+
+
diff --git a/oslash-with-plasmo/lib/components/button/Button.spec.ts b/oslash-with-plasmo/lib/components/button/Button.spec.ts new file mode 100644 index 0000000..0bb6797 --- /dev/null +++ b/oslash-with-plasmo/lib/components/button/Button.spec.ts @@ -0,0 +1,7 @@ +import Button from './Button.svelte' +import { render } from '@testing-library/svelte' +describe("Button Component", () => { + test("should render the Button component", () => { + render(Button) + }) +}) \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/button/Button.svelte b/oslash-with-plasmo/lib/components/button/Button.svelte new file mode 100644 index 0000000..60a7c81 --- /dev/null +++ b/oslash-with-plasmo/lib/components/button/Button.svelte @@ -0,0 +1,122 @@ + + + + + + + diff --git a/oslash-with-plasmo/lib/components/copybutton/CopyButton.spec.ts b/oslash-with-plasmo/lib/components/copybutton/CopyButton.spec.ts new file mode 100644 index 0000000..bdff6ea --- /dev/null +++ b/oslash-with-plasmo/lib/components/copybutton/CopyButton.spec.ts @@ -0,0 +1,7 @@ +import CopyButton from './CopyButton.svelte' +import { render } from '@testing-library/svelte' +describe("Copy Button Component", () => { + test("should render the Copy Button component", () => { + render(CopyButton) + }) +}) \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/copybutton/CopyButton.svelte b/oslash-with-plasmo/lib/components/copybutton/CopyButton.svelte new file mode 100644 index 0000000..e3f360e --- /dev/null +++ b/oslash-with-plasmo/lib/components/copybutton/CopyButton.svelte @@ -0,0 +1,45 @@ + + + + + + \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/icons/IconArrowLeft.svelte b/oslash-with-plasmo/lib/components/icons/IconArrowLeft.svelte new file mode 100644 index 0000000..255dd20 --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconArrowLeft.svelte @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/icons/IconChevronRight.svelte b/oslash-with-plasmo/lib/components/icons/IconChevronRight.svelte new file mode 100644 index 0000000..1bfdef8 --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconChevronRight.svelte @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/icons/IconCopy.svelte b/oslash-with-plasmo/lib/components/icons/IconCopy.svelte new file mode 100644 index 0000000..89dfcad --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconCopy.svelte @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/icons/IconDotsVertical.svelte b/oslash-with-plasmo/lib/components/icons/IconDotsVertical.svelte new file mode 100644 index 0000000..b4fb2a7 --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconDotsVertical.svelte @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/icons/IconExclamationCircle.svelte b/oslash-with-plasmo/lib/components/icons/IconExclamationCircle.svelte new file mode 100644 index 0000000..3fc6eda --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconExclamationCircle.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/oslash-with-plasmo/lib/components/icons/IconExternalLink.svelte b/oslash-with-plasmo/lib/components/icons/IconExternalLink.svelte new file mode 100644 index 0000000..ab29ee1 --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconExternalLink.svelte @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/icons/IconOslash.svelte b/oslash-with-plasmo/lib/components/icons/IconOslash.svelte new file mode 100644 index 0000000..0e61917 --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconOslash.svelte @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/icons/IconSearch.svelte b/oslash-with-plasmo/lib/components/icons/IconSearch.svelte new file mode 100644 index 0000000..c6ce199 --- /dev/null +++ b/oslash-with-plasmo/lib/components/icons/IconSearch.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/oslash-with-plasmo/lib/components/input/Input.spec.ts b/oslash-with-plasmo/lib/components/input/Input.spec.ts new file mode 100644 index 0000000..1faa30f --- /dev/null +++ b/oslash-with-plasmo/lib/components/input/Input.spec.ts @@ -0,0 +1,7 @@ +import Input from './Input.svelte' +import { render } from '@testing-library/svelte' +describe("Input Component", () => { + test("should render the Input component", () => { + render(Input) + }) +}) \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/input/Input.svelte b/oslash-with-plasmo/lib/components/input/Input.svelte new file mode 100644 index 0000000..90e281d --- /dev/null +++ b/oslash-with-plasmo/lib/components/input/Input.svelte @@ -0,0 +1,107 @@ + + +
+
+ { + if (e.key === "Enter") { + onEnter(); + } + }} + on:change + on:input + /> + + {#if showStartIcon} + + {/if} + + {#if isError} + + {/if} +
+ + {#if !hideHint} +

{hint}

+ {/if} +
+ + diff --git a/oslash-with-plasmo/lib/components/modal/ShortcutModal.svelte b/oslash-with-plasmo/lib/components/modal/ShortcutModal.svelte new file mode 100644 index 0000000..c4e973d --- /dev/null +++ b/oslash-with-plasmo/lib/components/modal/ShortcutModal.svelte @@ -0,0 +1,73 @@ + + { + closeModal() + }} + as="div" + class="relative z-10" +> + + +
+
+
+ + {modalTitle} + + + {#if savedShortcutNames} +
+ +
+ {/if} +
+
+
+
diff --git a/oslash-with-plasmo/lib/components/option/Option.spec.ts b/oslash-with-plasmo/lib/components/option/Option.spec.ts new file mode 100644 index 0000000..1b070ba --- /dev/null +++ b/oslash-with-plasmo/lib/components/option/Option.spec.ts @@ -0,0 +1,7 @@ +import Option from './Option.svelte' +import { render } from '@testing-library/svelte' +describe("Option Component", () => { + test("should render the Option component", () => { + render(Option) + }) +}) \ No newline at end of file diff --git a/oslash-with-plasmo/lib/components/option/Option.svelte b/oslash-with-plasmo/lib/components/option/Option.svelte new file mode 100644 index 0000000..11e1ba6 --- /dev/null +++ b/oslash-with-plasmo/lib/components/option/Option.svelte @@ -0,0 +1,442 @@ + + +
+
+
+
Shortcuts
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + Export as CSV + + + + +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + {#if filteredShortcuts.length} + {#each filteredShortcuts as shortcut} + + + + + + + + + + {/each} + {:else} + + + + {/if} + +
Shortcutdestination + Edit + + Delete +
+ + {""} + {shortcut.shortlink} + + + {shortcut.url} + + + + +
+
+ + Uh-oh looked everywhere! +
+ Couldn’t find a Shortcut +
+ + + + +
+
+
+
+
+
+
+ + {#if selectedShortcut && openEditShortcutModal} + { + selectedShortcut = null + openEditShortcutModal = false + }} + {savedShortcutNames} + shortcut={selectedShortcut} + submitModal={updateSelectedShortcut} + modalTitle="Update Shortcut" + ctaButtonTitle="Update" /> + {/if} + + {#if openCreateShortcut} + { + openCreateShortcut = false + }} + {savedShortcutNames} + submitModal={createShortcut} + modalTitle="Create Shortcut" + ctaButtonTitle="Create" /> + {/if} + + {#if selectedShortcut && openDeleteShortcutModal} + { + selectedShortcut = null + openDeleteShortcutModal = false + }} + {savedShortcutNames} + submitModal={deleteSelectedShortcut} + modalTitle="Do you want to delete this Shortcut ?" + ctaButtonTitle="Delete" + disabledFields={[SHORTCUT_NAME_INPUT_ID, SHORTCUT_URL_INPUT_ID]} + submitButtonColorScheme={"red"} + shortcut={selectedShortcut} /> + {/if} +
+ + diff --git a/oslash-with-plasmo/lib/components/popup/Popup.spec.ts b/oslash-with-plasmo/lib/components/popup/Popup.spec.ts new file mode 100644 index 0000000..c1448f2 --- /dev/null +++ b/oslash-with-plasmo/lib/components/popup/Popup.spec.ts @@ -0,0 +1,7 @@ +import Popup from "./Popup.svelte"; +import { render } from '@testing-library/svelte' +describe("Popup Component", () => { + test("should render the Popup component", () => { + render(Popup) + }) +}) diff --git a/oslash-with-plasmo/lib/components/popup/Popup.svelte b/oslash-with-plasmo/lib/components/popup/Popup.svelte new file mode 100644 index 0000000..e65887e --- /dev/null +++ b/oslash-with-plasmo/lib/components/popup/Popup.svelte @@ -0,0 +1,119 @@ + + +
+
+ + + + + + Shortcuts + + + + + +
+ + {#if savedShortcutNames && !savedNewShortcut} + {}} + cancelForm={closePopup} + submitForm={handleCreateOrUpdateShortcut} + submitButtonText={shortcutExistsCheck ? "Update" : "Create"} /> + {/if} + + {#if savedNewShortcut} + + {/if} +
diff --git a/oslash-with-plasmo/lib/components/success/Success.spec.ts b/oslash-with-plasmo/lib/components/success/Success.spec.ts new file mode 100644 index 0000000..9654c3b --- /dev/null +++ b/oslash-with-plasmo/lib/components/success/Success.spec.ts @@ -0,0 +1,7 @@ +import Success from "./Success.svelte"; +import { render } from '@testing-library/svelte' +describe("Success Component", () => { + test("should render the Success component", () => { + render(Success) + }) +}) diff --git a/oslash-with-plasmo/lib/components/success/Success.svelte b/oslash-with-plasmo/lib/components/success/Success.svelte new file mode 100644 index 0000000..b8145e0 --- /dev/null +++ b/oslash-with-plasmo/lib/components/success/Success.svelte @@ -0,0 +1,65 @@ + + +
+

Congratulations! 🎉

+ +

+ Shortcut created successfully +

+ +
+
+ + {shortcut.shortlink} + + + + External Link + + +
+ +
+ { + copyToClipboard(shortcut.shortlink) + }} /> + + +
+
+
diff --git a/oslash-with-plasmo/lib/utils/browser/getFaviconURL.ts b/oslash-with-plasmo/lib/utils/browser/getFaviconURL.ts new file mode 100644 index 0000000..5feb676 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/getFaviconURL.ts @@ -0,0 +1,19 @@ +import { isNonChromiumBrowser } from "./getBrowserName" + +export function getFaviconURL(u: string) { + let url: URL | null = null + if (isNonChromiumBrowser()) { + // NOTE: This is a fallback icon. Firefox does not support accessing cached favicon + // TODO: Either store favicon url with shortcut or find some other workaround + url = new URL(browser.runtime.getURL("/assets/icon.png")) + } else { + url = new URL(chrome.runtime.getURL("/_favicon/")) + } + + if (url) { + url.searchParams.set("pageUrl", u) + url.searchParams.set("size", "32") + return url.toString() + } + return "" +} diff --git a/oslash-with-plasmo/lib/utils/browser/getTabUrl.ts b/oslash-with-plasmo/lib/utils/browser/getTabUrl.ts new file mode 100644 index 0000000..2043fc0 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/browser/getTabUrl.ts @@ -0,0 +1,32 @@ +import { isNonChromiumBrowser } from "./getBrowserName" + +export async function getActiveTabURL() { + return await getTabURL() +} + +function getTabURL() { + return new Promise((resolve) => { + try { + if (isNonChromiumBrowser()) { + browser.tabs + .query({ active: true, currentWindow: true }) + .then((tabs) => { + resolve(tabs[0]?.url ?? "") + }) + } else { + chrome.tabs.query( + { + active: true, + currentWindow: true + }, + (tabs) => { + resolve(tabs[0]?.url ?? "") + } + ) + } + } catch (e) { + console.error("Error in fetching tab URL", e) + resolve("") + } + }) +} diff --git a/oslash-with-plasmo/lib/utils/checkIfShortcutExists.ts b/oslash-with-plasmo/lib/utils/checkIfShortcutExists.ts new file mode 100644 index 0000000..9103c6f --- /dev/null +++ b/oslash-with-plasmo/lib/utils/checkIfShortcutExists.ts @@ -0,0 +1,23 @@ +import type { Shortcut } from "../types"; + +/** + * Checks if there is already a shortcut with same URL. Also returns the shortcut if there exists any. + * @param {string} pageURL url for which shortcut is created/exists + * @param {Set | null} savedShortcutURLs a set of url strings or null + * @param {Shortcut[]} savedShortcuts shortcuts array which are already saved + * @returns {{isShortcutExists: boolean;existingShortcut: Shortcut | null;}} boolean and shortcut if that shortcut exists + */ +export function checkIfShortcutExists( + pageURL: string, + savedShortcutURLs: Set | null, + savedShortcuts: Shortcut[] +) { + if (savedShortcutURLs?.has(pageURL)) { + const existingShortcut = savedShortcuts.find( + (shortcut) => shortcut.url === pageURL + ); + return existingShortcut ?? null + } + + return null +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/constructShortcutsFromCSVData.ts b/oslash-with-plasmo/lib/utils/constructShortcutsFromCSVData.ts new file mode 100644 index 0000000..45229b9 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/constructShortcutsFromCSVData.ts @@ -0,0 +1,55 @@ +import type { Shortcut } from "../types"; +import { isNotNull } from "./isNotNull"; +import { validateShortcutName, validateShortcutURL } from "./validate"; + +/** + * validates and constructs shortcuts from CSV data + * @param {string[][]} csvData + * @param {Set | null} savedShortcutNames set of saved shortcuts . + * @returns {Shortcut[]} throws if error. else return shortcuts array + */ +export async function constructShortcutsFromCSVData(csvData: string[][], savedShortcuts: Shortcut[]) { + // construct map for quick access + const savedShortcutsMap = new Map() + for (const shortcut of savedShortcuts) { + savedShortcutsMap.set(shortcut.shortlink, shortcut.url) + } + + const savedShortcutNames = new Set(savedShortcutsMap.keys()) + + const shortcuts = csvData.map((shortcutRow) => { + // if shortcutName is already present, either ignore if same url or append -new + if (savedShortcutsMap.has(shortcutRow[0])) { + // if shortcutName and url are same then ignore that shortcut + if (savedShortcutsMap.get(shortcutRow[0]) === shortcutRow[1]) { + return null + } + shortcutRow[0] = shortcutRow[0] + '-new' + } + + // validate shortcut name and url + const shortcutNameErrorMsg = validateShortcutName(shortcutRow[0] ?? '', savedShortcutNames) + const urlErrorMsg = validateShortcutURL(shortcutRow[1] ?? '') + + if (!shortcutNameErrorMsg && !urlErrorMsg) { + const shortcut: Shortcut = { + shortlink: shortcutRow[0], + url: shortcutRow[1], + createdAt: new Date(), + updatedAt: new Date(), + }; + return shortcut; + } + else { + let errorMsg = 'Invalid Data: ' + if (shortcutNameErrorMsg) { + errorMsg = errorMsg + `\n${shortcutRow[0]} is invalid : ${shortcutNameErrorMsg}` + } + if (urlErrorMsg) { + errorMsg = errorMsg + `\n${shortcutRow[1]} is invalid : ${urlErrorMsg}` + } + throw new Error(errorMsg) + } + }).filter(isNotNull); + return shortcuts; +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/copyToClipboard.ts b/oslash-with-plasmo/lib/utils/copyToClipboard.ts new file mode 100644 index 0000000..229fc7a --- /dev/null +++ b/oslash-with-plasmo/lib/utils/copyToClipboard.ts @@ -0,0 +1,27 @@ +export function copyToClipboard(text: string): void { + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard + .writeText(text) + .then(() => { + console.log('Text copied to clipboard'); + }) + .catch((error) => { + console.error('Failed to copy text to clipboard:', error); + }); + } else { + const textarea = document.createElement('textarea'); + textarea.value = text; + textarea.style.position = 'fixed'; // Ensure off-screen position + document.body.appendChild(textarea); + textarea.focus(); + textarea.select(); + + try { + document.execCommand('copy'); + } catch (error) { + console.error('Failed to copy text to clipboard:', error); + } + + document.body.removeChild(textarea); + } +} diff --git a/oslash-with-plasmo/lib/utils/isNotNull.ts b/oslash-with-plasmo/lib/utils/isNotNull.ts new file mode 100644 index 0000000..60bc291 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/isNotNull.ts @@ -0,0 +1,3 @@ +export function isNotNull(value: T | null): value is T { + return value !== null; +} \ No newline at end of file diff --git a/oslash-with-plasmo/lib/utils/shortcutOperations.ts b/oslash-with-plasmo/lib/utils/shortcutOperations.ts new file mode 100644 index 0000000..ddf8efc --- /dev/null +++ b/oslash-with-plasmo/lib/utils/shortcutOperations.ts @@ -0,0 +1,104 @@ +import type { Shortcut } from "../types"; +import { constructShortcutRules } from "./browser/constructShortcutRules"; +import { getDeclarativeNetRequestRules } from "./browser/getDeclarativeNetRequestRules"; +import { updateDeclarativeNetRequestRules } from "./browser/updateDeclarativeNetRequestRules"; +import { getSavedShortcutsFromStore } from "./getSavedShortcuts"; +import { shortcuts as storageSyncedShortcutsStore } from "~lib/store/shortcuts"; + +/** + * Updates declarative net request rules and saves shortcuts to local storage + * @param {Shortcut[]} shortcuts shortcut + * @returns {void} + */ +export async function updateRules(shortcuts: Shortcut[]) { + // get old rules from local storage + const oldRules = await getDeclarativeNetRequestRules() + + const oldRuleIds = oldRules.map(rule => rule.id); + const newRules = constructShortcutRules(shortcuts) + + // sort according to last updated first + shortcuts.sort((shortcut1, shortcut2) => { + if (shortcut1.updatedAt > shortcut2.updatedAt) return -1 + if (shortcut1.updatedAt < shortcut2.updatedAt) return 1 + return 0 + }) + + // persist shortcuts array to + storageSyncedShortcutsStore.set(shortcuts) + + // update rules + await updateDeclarativeNetRequestRules( + newRules, oldRuleIds + ) +} + +/** + * Creates multiple new shortcuts + * @param {Shortcut[]} shortcuts shortcuts + * @returns {void} + */ +export async function createNewShortcuts(shortcuts: Shortcut[]) { + // get old shortcuts from store + const oldShortcuts = await getSavedShortcutsFromStore() + + // create a new array with added shortcuts + const newShortcuts = [...oldShortcuts, ...shortcuts] + + await updateRules(newShortcuts) +} + +/** + * Creates a new shortcut + * @param {Shortcut} shortcut shortcut + * @returns {void} + */ +export async function createNewShortcut(shortcut: Shortcut) { + // get old shortcuts from local storage + const oldShortcuts = await getSavedShortcutsFromStore() + // create a new array with added shortcut + const newShortcut: Shortcut = { ...shortcut, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } + const newShortcuts = [...oldShortcuts, newShortcut] + + await updateRules(newShortcuts) +} + +/** + * Updates the Shortcut + * @param {Shortcut} oldShortcut shortcut + * @param {Shortcut} newShortcut shortcut + * @returns {void} + */ +export async function updateShortcut(oldShortcut: Shortcut, newShortcut: Shortcut) { + // get old shortcuts from local storage + const oldShortcuts = await getSavedShortcutsFromStore() + + const updatedShortcut: Shortcut = { ...newShortcut, updatedAt: new Date().toISOString() } + + // create new shortcuts list with updated shortcut + const newShortcuts = [ + ...oldShortcuts.filter( + (shortcut) => shortcut.shortlink !== oldShortcut.shortlink) + , updatedShortcut + ] + + await updateRules(newShortcuts) +} + +/** + * deletes the Shortcut + * @param {Shortcut} shortcutToBeDeleted shortcut to be deleted + * @returns {void} + */ +export async function deleteShortcut(shortcutToBeDeleted: Shortcut) { + // get old shortcuts from local storage + const oldShortcuts = await getSavedShortcutsFromStore() + + // filter out the shortcut that needs to be deleted + const newShortcuts = [ + ...oldShortcuts.filter( + (shortcut) => shortcut.shortlink !== shortcutToBeDeleted.shortlink) + ] + + await updateRules(newShortcuts) +} diff --git a/oslash-with-plasmo/lib/utils/validate.ts b/oslash-with-plasmo/lib/utils/validate.ts new file mode 100644 index 0000000..134e703 --- /dev/null +++ b/oslash-with-plasmo/lib/utils/validate.ts @@ -0,0 +1,66 @@ + +import type { Shortcut } from "../types"; +/** + * Validates Shortcut + * @param {Shortcut} shortcut shortcut which is to be validated + * @param {Set | null} savedShortcutNames set of saved shortcut names + * @returns {ShortcutValidationResult} shortcut validation result + */ +export function validateShortcut(shortcut: Shortcut, savedShortcutNames: Set | null) { + const url = shortcut.url + const name = shortcut.shortlink + const nameError = validateShortcutName(name, savedShortcutNames) + const urlError = validateShortcutURL(url) + return { + shortlink: nameError, + url: urlError + } +} + +/** + * Validates shortcut url + * @param {string} shortcutURL shortcut name which is to be validated + * @returns {string | null} error message string if error exists. else null + */ +export function validateShortcutURL(shortcutURL: string): string | null { + // validate if empty + if (shortcutURL === '') { + return 'URL cannot be empty' + } + + // validate if valid url + // REFER: https://stackoverflow.com/questions/48110677/url-regex-improvement-to-allow-localhost-url + const httpRegex = /(?:^|[ \t])((https?:\/\/)?(?:localhost|[\w-]+(?:\.[\w-]+)+)(:\d+)?(\/\S*)?)/gm + if (!httpRegex.test(shortcutURL)) { + return 'Please enter a valid URL' + } + + return null +} + +/** + * Validates shortcut name + * @param {Set | null} savedShortcutNames set of saved shortcuts . + * @param {string} shortcutName shortcut name which is to be validated + * @returns {string | null} error message string if error exists. else null + */ +export function validateShortcutName(shortcutName: string, savedShortcutNames: Set | null): string | null { + // validate if empty + if (shortcutName === '') { + return 'Shortcut name cannot be empty' + //shortcutNameErrors.push('Shortcut name cannot be empty') + } + + // validate if starts with o/ + if (!shortcutName.startsWith('o/')) { + return 'Shortcut name must start with o/' + } + + // validate if unique + if (savedShortcutNames?.has(shortcutName)) { + return 'Shortcut with same name already exists' + } + + return null +} + diff --git a/oslash-with-plasmo/options.svelte b/oslash-with-plasmo/options.svelte new file mode 100644 index 0000000..a3fe339 --- /dev/null +++ b/oslash-with-plasmo/options.svelte @@ -0,0 +1,15 @@ + + +
+
+ + diff --git a/oslash-with-plasmo/popup.svelte b/oslash-with-plasmo/popup.svelte new file mode 100644 index 0000000..f7af1b1 --- /dev/null +++ b/oslash-with-plasmo/popup.svelte @@ -0,0 +1,16 @@ + + +
+ +
+ + From f3dd04be791ac0c056845fd18c03078376bef336 Mon Sep 17 00:00:00 2001 From: Tanmay Shah Date: Fri, 1 Dec 2023 13:47:37 +0530 Subject: [PATCH 3/6] chore: remove workflow files --- .../.github/workflows/submit.yml | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 oslash-with-plasmo/.github/workflows/submit.yml diff --git a/oslash-with-plasmo/.github/workflows/submit.yml b/oslash-with-plasmo/.github/workflows/submit.yml deleted file mode 100644 index f4de392..0000000 --- a/oslash-with-plasmo/.github/workflows/submit.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: "Submit to Web Store" -on: - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Cache pnpm modules - uses: actions/cache@v3 - with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- - - uses: pnpm/action-setup@v2.2.4 - with: - version: latest - run_install: true - - name: Use Node.js 16.x - uses: actions/setup-node@v3.4.1 - with: - node-version: 16.x - cache: "pnpm" - - name: Build the extension - run: pnpm build - - name: Package the extension into a zip artifact - run: pnpm package - - name: Browser Platform Publish - uses: PlasmoHQ/bpp@v3 - with: - keys: ${{ secrets.SUBMIT_KEYS }} - artifact: build/chrome-mv3-prod.zip From 02db504ebe2d77894ab5ae57cb86ec2001998b1d Mon Sep 17 00:00:00 2001 From: Tanmay Shah Date: Fri, 1 Dec 2023 16:49:15 +0530 Subject: [PATCH 4/6] feat: add popup, options and build workflows --- .github/workflows/release-ext.yml | 62 +- .gitignore | 61 +- .../.prettierrc.mjs => .prettierrc.mjs | 0 .../assets => assets}/icon.png | Bin .../background.ts => background.ts | 0 .../ShortcutForm/ShortcutForm.svelte | 0 .../components/button/Button.svelte | 0 .../components/copybutton/CopyButton.svelte | 0 .../components/icons/IconArrowLeft.svelte | 0 .../components/icons/IconChevronRight.svelte | 0 .../components/icons/IconCopy.svelte | 0 .../components/icons/IconDotsVertical.svelte | 0 .../icons/IconExclamationCircle.svelte | 0 .../components/icons/IconExternalLink.svelte | 0 .../components/icons/IconOslash.svelte | 0 .../components/icons/IconSearch.svelte | 0 .../lib => lib}/components/input/Input.svelte | 0 .../components/modal/ShortcutModal.svelte | 0 .../components/option/Option.svelte | 0 .../lib => lib}/components/popup/Popup.svelte | 0 .../components/success/Success.svelte | 0 .../lib => lib}/constants/browserNames.ts | 0 .../lib => lib}/constants/defaultShortcuts.ts | 0 .../lib => lib}/constants/keys.ts | 0 .../lib => lib}/store/createStore.ts | 0 .../lib => lib}/store/shortcuts.ts | 0 {oslash-with-plasmo/lib => lib}/types.ts | 0 .../utils/browser/constructShortcutRules.ts | 0 .../utils/browser/getBrowserName.ts | 0 .../browser/getDeclarativeNetRequestRules.ts | 0 .../utils/browser/getFaviconURL.ts | 0 .../lib => lib}/utils/browser/getTabUrl.ts | 0 .../lib => lib}/utils/browser/storageUtils.ts | 0 .../utils/browser/tabOperations.ts | 0 .../updateDeclarativeNetRequestRules.ts | 0 .../utils/checkIfShortcutExists.ts | 0 .../utils/constructShortcutsFromCSVData.ts | 0 .../lib => lib}/utils/copyToClipboard.ts | 0 .../lib => lib}/utils/getSavedShortcuts.ts | 0 .../lib => lib}/utils/isNotNull.ts | 0 .../utils/setShortcutsToStorage.ts | 0 .../lib => lib}/utils/shortcutOperations.ts | 0 .../lib => lib}/utils/validate.ts | 0 manifest.json | 38 - option.html | 13 - .../options.svelte => options.svelte | 4 +- oslash-with-plasmo/.gitignore | 42 - oslash-with-plasmo/README.md | 35 - .../lib/components/button/Button.spec.ts | 7 - .../components/copybutton/CopyButton.spec.ts | 7 - .../lib/components/input/Input.spec.ts | 7 - .../lib/components/option/Option.spec.ts | 7 - .../lib/components/popup/Popup.spec.ts | 7 - .../lib/components/success/Success.spec.ts | 7 - oslash-with-plasmo/package.json | 55 - oslash-with-plasmo/postcss.config.js | 9 - oslash-with-plasmo/tailwind.config.js | 7 - oslash-with-plasmo/tsconfig.json | 20 - package-lock.json | 14023 ---------------- package.json | 82 +- .../pnpm-lock.yaml => pnpm-lock.yaml | 1448 +- popup.html | 13 - .../popup.svelte => popup.svelte | 4 +- postcss.config.js | 8 +- public/icons/icon128.png | Bin 5952 -> 0 bytes public/icons/icon16.png | Bin 709 -> 0 bytes public/icons/icon32.png | Bin 1490 -> 0 bytes public/icons/icon48.png | Bin 2234 -> 0 bytes src/app.css | 3 - src/assets/svelte.svg | 1 - .../ShortcutForm/ShortcutForm.svelte | 121 - src/lib/components/button/Button.spec.ts | 7 - src/lib/components/button/Button.svelte | 122 - .../components/copybutton/CopyButton.spec.ts | 7 - .../components/copybutton/CopyButton.svelte | 45 - src/lib/components/icons/IconArrowLeft.svelte | 9 - .../components/icons/IconChevronRight.svelte | 7 - src/lib/components/icons/IconCopy.svelte | 8 - .../components/icons/IconDotsVertical.svelte | 7 - .../icons/IconExclamationCircle.svelte | 16 - .../components/icons/IconExternalLink.svelte | 8 - src/lib/components/icons/IconOslash.svelte | 9 - src/lib/components/icons/IconSearch.svelte | 16 - src/lib/components/input/Input.spec.ts | 7 - src/lib/components/input/Input.svelte | 107 - src/lib/components/modal/ShortcutModal.svelte | 73 - src/lib/components/option/Option.spec.ts | 7 - src/lib/components/option/Option.svelte | 491 - src/lib/components/popup/Popup.spec.ts | 7 - src/lib/components/popup/Popup.svelte | 121 - src/lib/components/success/Success.spec.ts | 7 - src/lib/components/success/Success.svelte | 68 - src/lib/constants/defaultShortcuts.ts | 28 - src/lib/constants/keys.ts | 3 - src/lib/types.ts | 11 - src/lib/utils/checkIfShortcutExists.ts | 23 - src/lib/utils/constructShortcutRules.ts | 27 - .../utils/constructShortcutsFromCSVData.ts | 55 - src/lib/utils/copyToClipboard.ts | 27 - src/lib/utils/getFaviconURL.ts | 6 - src/lib/utils/getSavedShortcuts.ts | 23 - src/lib/utils/isNotNull.ts | 3 - src/lib/utils/shortcuts.ts | 118 - src/lib/utils/validate.ts | 66 - src/option.css | 4 - src/option.ts | 13 - src/popup.css | 5 - src/popup.ts | 13 - src/service_worker.ts | 91 - src/vite-env.d.ts | 2 - oslash-with-plasmo/style.css => style.css | 0 svelte.config.js | 7 - .../svelte.config.mjs => svelte.config.mjs | 0 tailwind.config.js | 38 +- tsconfig.json | 36 +- tsconfig.node.json | 9 - vite.config.ts | 26 - vitest.config.js | 12 - 118 files changed, 1532 insertions(+), 16354 deletions(-) rename oslash-with-plasmo/.prettierrc.mjs => .prettierrc.mjs (100%) rename {oslash-with-plasmo/assets => assets}/icon.png (100%) rename oslash-with-plasmo/background.ts => background.ts (100%) rename {oslash-with-plasmo/lib => lib}/components/ShortcutForm/ShortcutForm.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/button/Button.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/copybutton/CopyButton.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconArrowLeft.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconChevronRight.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconCopy.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconDotsVertical.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconExclamationCircle.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconExternalLink.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconOslash.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/icons/IconSearch.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/input/Input.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/modal/ShortcutModal.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/option/Option.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/popup/Popup.svelte (100%) rename {oslash-with-plasmo/lib => lib}/components/success/Success.svelte (100%) rename {oslash-with-plasmo/lib => lib}/constants/browserNames.ts (100%) rename {oslash-with-plasmo/lib => lib}/constants/defaultShortcuts.ts (100%) rename {oslash-with-plasmo/lib => lib}/constants/keys.ts (100%) rename {oslash-with-plasmo/lib => lib}/store/createStore.ts (100%) rename {oslash-with-plasmo/lib => lib}/store/shortcuts.ts (100%) rename {oslash-with-plasmo/lib => lib}/types.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/constructShortcutRules.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/getBrowserName.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/getDeclarativeNetRequestRules.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/getFaviconURL.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/getTabUrl.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/storageUtils.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/tabOperations.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/browser/updateDeclarativeNetRequestRules.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/checkIfShortcutExists.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/constructShortcutsFromCSVData.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/copyToClipboard.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/getSavedShortcuts.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/isNotNull.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/setShortcutsToStorage.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/shortcutOperations.ts (100%) rename {oslash-with-plasmo/lib => lib}/utils/validate.ts (100%) delete mode 100644 manifest.json delete mode 100644 option.html rename oslash-with-plasmo/options.svelte => options.svelte (61%) delete mode 100644 oslash-with-plasmo/.gitignore delete mode 100644 oslash-with-plasmo/README.md delete mode 100644 oslash-with-plasmo/lib/components/button/Button.spec.ts delete mode 100644 oslash-with-plasmo/lib/components/copybutton/CopyButton.spec.ts delete mode 100644 oslash-with-plasmo/lib/components/input/Input.spec.ts delete mode 100644 oslash-with-plasmo/lib/components/option/Option.spec.ts delete mode 100644 oslash-with-plasmo/lib/components/popup/Popup.spec.ts delete mode 100644 oslash-with-plasmo/lib/components/success/Success.spec.ts delete mode 100644 oslash-with-plasmo/package.json delete mode 100644 oslash-with-plasmo/postcss.config.js delete mode 100644 oslash-with-plasmo/tailwind.config.js delete mode 100644 oslash-with-plasmo/tsconfig.json delete mode 100644 package-lock.json rename oslash-with-plasmo/pnpm-lock.yaml => pnpm-lock.yaml (80%) delete mode 100644 popup.html rename oslash-with-plasmo/popup.svelte => popup.svelte (67%) delete mode 100644 public/icons/icon128.png delete mode 100644 public/icons/icon16.png delete mode 100644 public/icons/icon32.png delete mode 100644 public/icons/icon48.png delete mode 100644 src/app.css delete mode 100644 src/assets/svelte.svg delete mode 100644 src/lib/components/ShortcutForm/ShortcutForm.svelte delete mode 100644 src/lib/components/button/Button.spec.ts delete mode 100644 src/lib/components/button/Button.svelte delete mode 100644 src/lib/components/copybutton/CopyButton.spec.ts delete mode 100644 src/lib/components/copybutton/CopyButton.svelte delete mode 100644 src/lib/components/icons/IconArrowLeft.svelte delete mode 100644 src/lib/components/icons/IconChevronRight.svelte delete mode 100644 src/lib/components/icons/IconCopy.svelte delete mode 100644 src/lib/components/icons/IconDotsVertical.svelte delete mode 100644 src/lib/components/icons/IconExclamationCircle.svelte delete mode 100644 src/lib/components/icons/IconExternalLink.svelte delete mode 100644 src/lib/components/icons/IconOslash.svelte delete mode 100644 src/lib/components/icons/IconSearch.svelte delete mode 100644 src/lib/components/input/Input.spec.ts delete mode 100644 src/lib/components/input/Input.svelte delete mode 100644 src/lib/components/modal/ShortcutModal.svelte delete mode 100644 src/lib/components/option/Option.spec.ts delete mode 100644 src/lib/components/option/Option.svelte delete mode 100644 src/lib/components/popup/Popup.spec.ts delete mode 100644 src/lib/components/popup/Popup.svelte delete mode 100644 src/lib/components/success/Success.spec.ts delete mode 100644 src/lib/components/success/Success.svelte delete mode 100644 src/lib/constants/defaultShortcuts.ts delete mode 100644 src/lib/constants/keys.ts delete mode 100644 src/lib/types.ts delete mode 100644 src/lib/utils/checkIfShortcutExists.ts delete mode 100644 src/lib/utils/constructShortcutRules.ts delete mode 100644 src/lib/utils/constructShortcutsFromCSVData.ts delete mode 100644 src/lib/utils/copyToClipboard.ts delete mode 100644 src/lib/utils/getFaviconURL.ts delete mode 100644 src/lib/utils/getSavedShortcuts.ts delete mode 100644 src/lib/utils/isNotNull.ts delete mode 100644 src/lib/utils/shortcuts.ts delete mode 100644 src/lib/utils/validate.ts delete mode 100644 src/option.css delete mode 100644 src/option.ts delete mode 100644 src/popup.css delete mode 100644 src/popup.ts delete mode 100644 src/service_worker.ts delete mode 100644 src/vite-env.d.ts rename oslash-with-plasmo/style.css => style.css (100%) delete mode 100644 svelte.config.js rename oslash-with-plasmo/svelte.config.mjs => svelte.config.mjs (100%) delete mode 100644 tsconfig.node.json delete mode 100644 vite.config.ts delete mode 100644 vitest.config.js diff --git a/.github/workflows/release-ext.yml b/.github/workflows/release-ext.yml index b5a10cb..c6d7365 100644 --- a/.github/workflows/release-ext.yml +++ b/.github/workflows/release-ext.yml @@ -13,24 +13,37 @@ env: permissions: write-all jobs: - chrome: - name: building chrome extension + release-ext: + name: building and packaging extension runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.version }} steps: - - name: checking out repository ⏬ + - name: Checking out repository ⏬ uses: actions/checkout@v3 - - name: get-npm-version - id: package-version - uses: martinbeentjes/npm-get-version-action@v1.3.1 + - name: Cache pnpm modules + uses: actions/cache@v3 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}- + + - name: Setup pnpm and install required node_modules + uses: pnpm/action-setup@v2.2.4 + with: + version: latest + run_install: true - - name: Install Dependencies - run: npm install + - name: Use Node.js 16.x + uses: actions/setup-node@v3.4.1 + with: + node-version: 16.x + cache: "pnpm" - - name: Build Extension - run: npm run build + - name: Build and package Extension + run: pnpm build - name: Find the upcoming release version from semantic-release id: version @@ -42,12 +55,15 @@ jobs: - name: log extension version run: echo v${{ steps.version.outputs.version }} - - name: Bump up version in package.json and manifest.json + - name: Bump up version in package.json if: steps.version.outputs.version - run: ./scripts/bump-version.sh ${{ steps.version.outputs.version }} ./package.json ./manifest.json + run: ./scripts/bump-version.sh ${{ steps.version.outputs.version }} ./package.json - - name: creating oslash-chrome-extension.zip - run: zip -r oslash-chrome-extension.zip oslash-chrome-extension + - name: zipping chrome extension + run: zip -r oslash-chrome-extension.zip chrome-mv3-prod + + - name: zipping firefox extension + run: zip -r oslash-firefox-extension.zip firefox-mv2-prod - name: upload oslash-chrome-extension.zip to artifacts uses: actions/upload-artifact@v2 @@ -55,13 +71,19 @@ jobs: name: oslash-chrome-extension path: oslash-chrome-extension.zip + - name: upload oslash-firefox-extension.zip to artifacts + uses: actions/upload-artifact@v2 + with: + name: oslash-firefox-extension + path: oslash-firefox-extension.zip + - name: reset changes for release notes run: git checkout -- . - name: generate release notes run: npm run semantic-release - - name: 📎 Attach local flavour of extension ZIP file to GitHub release + - name: 📎 Attach local flavour of chrome extension ZIP file to GitHub release if: steps.version.outputs.version continue-on-error: true uses: svenstaro/upload-release-action@v2 @@ -70,3 +92,13 @@ jobs: file: oslash-chrome-extension.zip tag: "@v${{ steps.version.outputs.version }}" overwrite: true + + - name: 📎 Attach local flavour of firefox extension ZIP file to GitHub release + if: steps.version.outputs.version + continue-on-error: true + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: oslash-firefox-extension.zip + tag: "@v${{ steps.version.outputs.version }}" + overwrite: true diff --git a/.gitignore b/.gitignore index 5a426ab..a08786b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,42 @@ -# Logs -logs -*.log + +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +#cache +.turbo +.next +.vercel + +# misc +.DS_Store +*.pem + +# debug npm-debug.log* yarn-debug.log* yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -oslash-chrome-extension -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? +.pnpm-debug.log* + + +# local env files +.env* + +out/ +build/ +dist/ + +# plasmo - https://www.plasmo.com +.plasmo + +# bpp - http://bpp.browser.market/ +keys.json + +# typescript +.tsbuildinfo diff --git a/oslash-with-plasmo/.prettierrc.mjs b/.prettierrc.mjs similarity index 100% rename from oslash-with-plasmo/.prettierrc.mjs rename to .prettierrc.mjs diff --git a/oslash-with-plasmo/assets/icon.png b/assets/icon.png similarity index 100% rename from oslash-with-plasmo/assets/icon.png rename to assets/icon.png diff --git a/oslash-with-plasmo/background.ts b/background.ts similarity index 100% rename from oslash-with-plasmo/background.ts rename to background.ts diff --git a/oslash-with-plasmo/lib/components/ShortcutForm/ShortcutForm.svelte b/lib/components/ShortcutForm/ShortcutForm.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/ShortcutForm/ShortcutForm.svelte rename to lib/components/ShortcutForm/ShortcutForm.svelte diff --git a/oslash-with-plasmo/lib/components/button/Button.svelte b/lib/components/button/Button.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/button/Button.svelte rename to lib/components/button/Button.svelte diff --git a/oslash-with-plasmo/lib/components/copybutton/CopyButton.svelte b/lib/components/copybutton/CopyButton.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/copybutton/CopyButton.svelte rename to lib/components/copybutton/CopyButton.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconArrowLeft.svelte b/lib/components/icons/IconArrowLeft.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconArrowLeft.svelte rename to lib/components/icons/IconArrowLeft.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconChevronRight.svelte b/lib/components/icons/IconChevronRight.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconChevronRight.svelte rename to lib/components/icons/IconChevronRight.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconCopy.svelte b/lib/components/icons/IconCopy.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconCopy.svelte rename to lib/components/icons/IconCopy.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconDotsVertical.svelte b/lib/components/icons/IconDotsVertical.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconDotsVertical.svelte rename to lib/components/icons/IconDotsVertical.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconExclamationCircle.svelte b/lib/components/icons/IconExclamationCircle.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconExclamationCircle.svelte rename to lib/components/icons/IconExclamationCircle.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconExternalLink.svelte b/lib/components/icons/IconExternalLink.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconExternalLink.svelte rename to lib/components/icons/IconExternalLink.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconOslash.svelte b/lib/components/icons/IconOslash.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconOslash.svelte rename to lib/components/icons/IconOslash.svelte diff --git a/oslash-with-plasmo/lib/components/icons/IconSearch.svelte b/lib/components/icons/IconSearch.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/icons/IconSearch.svelte rename to lib/components/icons/IconSearch.svelte diff --git a/oslash-with-plasmo/lib/components/input/Input.svelte b/lib/components/input/Input.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/input/Input.svelte rename to lib/components/input/Input.svelte diff --git a/oslash-with-plasmo/lib/components/modal/ShortcutModal.svelte b/lib/components/modal/ShortcutModal.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/modal/ShortcutModal.svelte rename to lib/components/modal/ShortcutModal.svelte diff --git a/oslash-with-plasmo/lib/components/option/Option.svelte b/lib/components/option/Option.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/option/Option.svelte rename to lib/components/option/Option.svelte diff --git a/oslash-with-plasmo/lib/components/popup/Popup.svelte b/lib/components/popup/Popup.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/popup/Popup.svelte rename to lib/components/popup/Popup.svelte diff --git a/oslash-with-plasmo/lib/components/success/Success.svelte b/lib/components/success/Success.svelte similarity index 100% rename from oslash-with-plasmo/lib/components/success/Success.svelte rename to lib/components/success/Success.svelte diff --git a/oslash-with-plasmo/lib/constants/browserNames.ts b/lib/constants/browserNames.ts similarity index 100% rename from oslash-with-plasmo/lib/constants/browserNames.ts rename to lib/constants/browserNames.ts diff --git a/oslash-with-plasmo/lib/constants/defaultShortcuts.ts b/lib/constants/defaultShortcuts.ts similarity index 100% rename from oslash-with-plasmo/lib/constants/defaultShortcuts.ts rename to lib/constants/defaultShortcuts.ts diff --git a/oslash-with-plasmo/lib/constants/keys.ts b/lib/constants/keys.ts similarity index 100% rename from oslash-with-plasmo/lib/constants/keys.ts rename to lib/constants/keys.ts diff --git a/oslash-with-plasmo/lib/store/createStore.ts b/lib/store/createStore.ts similarity index 100% rename from oslash-with-plasmo/lib/store/createStore.ts rename to lib/store/createStore.ts diff --git a/oslash-with-plasmo/lib/store/shortcuts.ts b/lib/store/shortcuts.ts similarity index 100% rename from oslash-with-plasmo/lib/store/shortcuts.ts rename to lib/store/shortcuts.ts diff --git a/oslash-with-plasmo/lib/types.ts b/lib/types.ts similarity index 100% rename from oslash-with-plasmo/lib/types.ts rename to lib/types.ts diff --git a/oslash-with-plasmo/lib/utils/browser/constructShortcutRules.ts b/lib/utils/browser/constructShortcutRules.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/constructShortcutRules.ts rename to lib/utils/browser/constructShortcutRules.ts diff --git a/oslash-with-plasmo/lib/utils/browser/getBrowserName.ts b/lib/utils/browser/getBrowserName.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/getBrowserName.ts rename to lib/utils/browser/getBrowserName.ts diff --git a/oslash-with-plasmo/lib/utils/browser/getDeclarativeNetRequestRules.ts b/lib/utils/browser/getDeclarativeNetRequestRules.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/getDeclarativeNetRequestRules.ts rename to lib/utils/browser/getDeclarativeNetRequestRules.ts diff --git a/oslash-with-plasmo/lib/utils/browser/getFaviconURL.ts b/lib/utils/browser/getFaviconURL.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/getFaviconURL.ts rename to lib/utils/browser/getFaviconURL.ts diff --git a/oslash-with-plasmo/lib/utils/browser/getTabUrl.ts b/lib/utils/browser/getTabUrl.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/getTabUrl.ts rename to lib/utils/browser/getTabUrl.ts diff --git a/oslash-with-plasmo/lib/utils/browser/storageUtils.ts b/lib/utils/browser/storageUtils.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/storageUtils.ts rename to lib/utils/browser/storageUtils.ts diff --git a/oslash-with-plasmo/lib/utils/browser/tabOperations.ts b/lib/utils/browser/tabOperations.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/tabOperations.ts rename to lib/utils/browser/tabOperations.ts diff --git a/oslash-with-plasmo/lib/utils/browser/updateDeclarativeNetRequestRules.ts b/lib/utils/browser/updateDeclarativeNetRequestRules.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/browser/updateDeclarativeNetRequestRules.ts rename to lib/utils/browser/updateDeclarativeNetRequestRules.ts diff --git a/oslash-with-plasmo/lib/utils/checkIfShortcutExists.ts b/lib/utils/checkIfShortcutExists.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/checkIfShortcutExists.ts rename to lib/utils/checkIfShortcutExists.ts diff --git a/oslash-with-plasmo/lib/utils/constructShortcutsFromCSVData.ts b/lib/utils/constructShortcutsFromCSVData.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/constructShortcutsFromCSVData.ts rename to lib/utils/constructShortcutsFromCSVData.ts diff --git a/oslash-with-plasmo/lib/utils/copyToClipboard.ts b/lib/utils/copyToClipboard.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/copyToClipboard.ts rename to lib/utils/copyToClipboard.ts diff --git a/oslash-with-plasmo/lib/utils/getSavedShortcuts.ts b/lib/utils/getSavedShortcuts.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/getSavedShortcuts.ts rename to lib/utils/getSavedShortcuts.ts diff --git a/oslash-with-plasmo/lib/utils/isNotNull.ts b/lib/utils/isNotNull.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/isNotNull.ts rename to lib/utils/isNotNull.ts diff --git a/oslash-with-plasmo/lib/utils/setShortcutsToStorage.ts b/lib/utils/setShortcutsToStorage.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/setShortcutsToStorage.ts rename to lib/utils/setShortcutsToStorage.ts diff --git a/oslash-with-plasmo/lib/utils/shortcutOperations.ts b/lib/utils/shortcutOperations.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/shortcutOperations.ts rename to lib/utils/shortcutOperations.ts diff --git a/oslash-with-plasmo/lib/utils/validate.ts b/lib/utils/validate.ts similarity index 100% rename from oslash-with-plasmo/lib/utils/validate.ts rename to lib/utils/validate.ts diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 2b6447f..0000000 --- a/manifest.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "manifest_version": 3, - "name": "OSlash", - "description": "Transform your URLs into quick, simple shortcuts", - "version": "1.0", - "options_page": "option.html", - "action": { - "default_popup": "popup.html", - "default_icon": { - "16": "icons/icon16.png", - "32": "icons/icon32.png", - "48": "icons/icon48.png", - "128": "icons/icon128.png" - } - }, - "background": { - "service_worker": "src/service_worker.ts" - }, - "omnibox": { - "keyword": "o/" - }, - "permissions": [ - "storage", - "declarativeNetRequest", - "activeTab", - "webRequest", - "favicon" - ], - "host_permissions": [ - "*://*/*" - ], - "icons": { - "16": "icons/icon16.png", - "32": "icons/icon32.png", - "48": "icons/icon48.png", - "128": "icons/icon128.png" - } -} \ No newline at end of file diff --git a/option.html b/option.html deleted file mode 100644 index 5d1ea5c..0000000 --- a/option.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - OSlash - Shortcuts - - -
- - - diff --git a/oslash-with-plasmo/options.svelte b/options.svelte similarity index 61% rename from oslash-with-plasmo/options.svelte rename to options.svelte index a3fe339..17e77bf 100644 --- a/oslash-with-plasmo/options.svelte +++ b/options.svelte @@ -1,11 +1,11 @@
-
diff --git a/src/lib/components/copybutton/CopyButton.spec.ts b/src/lib/components/copybutton/CopyButton.spec.ts deleted file mode 100644 index bdff6ea..0000000 --- a/src/lib/components/copybutton/CopyButton.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import CopyButton from './CopyButton.svelte' -import { render } from '@testing-library/svelte' -describe("Copy Button Component", () => { - test("should render the Copy Button component", () => { - render(CopyButton) - }) -}) \ No newline at end of file diff --git a/src/lib/components/copybutton/CopyButton.svelte b/src/lib/components/copybutton/CopyButton.svelte deleted file mode 100644 index e3f360e..0000000 --- a/src/lib/components/copybutton/CopyButton.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/lib/components/icons/IconArrowLeft.svelte b/src/lib/components/icons/IconArrowLeft.svelte deleted file mode 100644 index 255dd20..0000000 --- a/src/lib/components/icons/IconArrowLeft.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/lib/components/icons/IconChevronRight.svelte b/src/lib/components/icons/IconChevronRight.svelte deleted file mode 100644 index 1bfdef8..0000000 --- a/src/lib/components/icons/IconChevronRight.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/lib/components/icons/IconCopy.svelte b/src/lib/components/icons/IconCopy.svelte deleted file mode 100644 index 89dfcad..0000000 --- a/src/lib/components/icons/IconCopy.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/lib/components/icons/IconDotsVertical.svelte b/src/lib/components/icons/IconDotsVertical.svelte deleted file mode 100644 index b4fb2a7..0000000 --- a/src/lib/components/icons/IconDotsVertical.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/lib/components/icons/IconExclamationCircle.svelte b/src/lib/components/icons/IconExclamationCircle.svelte deleted file mode 100644 index 3fc6eda..0000000 --- a/src/lib/components/icons/IconExclamationCircle.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/src/lib/components/icons/IconExternalLink.svelte b/src/lib/components/icons/IconExternalLink.svelte deleted file mode 100644 index ab29ee1..0000000 --- a/src/lib/components/icons/IconExternalLink.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/lib/components/icons/IconOslash.svelte b/src/lib/components/icons/IconOslash.svelte deleted file mode 100644 index 0e61917..0000000 --- a/src/lib/components/icons/IconOslash.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/lib/components/icons/IconSearch.svelte b/src/lib/components/icons/IconSearch.svelte deleted file mode 100644 index c6ce199..0000000 --- a/src/lib/components/icons/IconSearch.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/src/lib/components/input/Input.spec.ts b/src/lib/components/input/Input.spec.ts deleted file mode 100644 index 1faa30f..0000000 --- a/src/lib/components/input/Input.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Input from './Input.svelte' -import { render } from '@testing-library/svelte' -describe("Input Component", () => { - test("should render the Input component", () => { - render(Input) - }) -}) \ No newline at end of file diff --git a/src/lib/components/input/Input.svelte b/src/lib/components/input/Input.svelte deleted file mode 100644 index 90e281d..0000000 --- a/src/lib/components/input/Input.svelte +++ /dev/null @@ -1,107 +0,0 @@ - - -
-
- { - if (e.key === "Enter") { - onEnter(); - } - }} - on:change - on:input - /> - - {#if showStartIcon} - - {/if} - - {#if isError} - - {/if} -
- - {#if !hideHint} -

{hint}

- {/if} -
- - diff --git a/src/lib/components/modal/ShortcutModal.svelte b/src/lib/components/modal/ShortcutModal.svelte deleted file mode 100644 index c4e973d..0000000 --- a/src/lib/components/modal/ShortcutModal.svelte +++ /dev/null @@ -1,73 +0,0 @@ - - { - closeModal() - }} - as="div" - class="relative z-10" -> - - -
-
-
- - {modalTitle} - - - {#if savedShortcutNames} -
- -
- {/if} -
-
-
-
diff --git a/src/lib/components/option/Option.spec.ts b/src/lib/components/option/Option.spec.ts deleted file mode 100644 index 1b070ba..0000000 --- a/src/lib/components/option/Option.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Option from './Option.svelte' -import { render } from '@testing-library/svelte' -describe("Option Component", () => { - test("should render the Option component", () => { - render(Option) - }) -}) \ No newline at end of file diff --git a/src/lib/components/option/Option.svelte b/src/lib/components/option/Option.svelte deleted file mode 100644 index 207dc27..0000000 --- a/src/lib/components/option/Option.svelte +++ /dev/null @@ -1,491 +0,0 @@ - - -
-
-
-
Shortcuts
- -
-
- - - - - -
- - - - - - - - - - - - - - - Export as CSV - - - - -
-
- -
-
-
-
- - - - - - - - - - - - - - - {#if filteredShortcuts.length} - {#each filteredShortcuts as shortcut} - - - - - - - - - - {/each} - {:else} - - - - {/if} - -
Shortcutdestination - Edit - - Delete -
- - {shortcut.shortlink} - {shortcut.shortlink} - - - {shortcut.url} - - - - -
-
- - Uh-oh looked everywhere! -
- Couldn’t find a Shortcut -
- - - - -
-
-
-
-
-
-
- - {#if selectedShortcut && openEditShortcutModal} - { - selectedShortcut = null; - openEditShortcutModal = false; - }} - {savedShortcutNames} - shortcut={selectedShortcut} - submitModal={updateSelectedShortcut} - modalTitle="Update Shortcut" - ctaButtonTitle="Update" - /> - {/if} - - {#if openCreateShortcut} - { - openCreateShortcut = false; - }} - {savedShortcutNames} - submitModal={createShortcut} - modalTitle="Create Shortcut" - ctaButtonTitle="Create" - /> - {/if} - - {#if selectedShortcut && openDeleteShortcutModal} - { - selectedShortcut = null; - openDeleteShortcutModal = false; - }} - {savedShortcutNames} - submitModal={deleteSelectedShortcut} - modalTitle="Do you want to delete this Shortcut ?" - ctaButtonTitle="Delete" - disabledFields={[SHORTCUT_NAME_INPUT_ID, SHORTCUT_URL_INPUT_ID]} - submitButtonColorScheme={"red"} - shortcut={selectedShortcut} - /> - {/if} -
- - diff --git a/src/lib/components/popup/Popup.spec.ts b/src/lib/components/popup/Popup.spec.ts deleted file mode 100644 index c1448f2..0000000 --- a/src/lib/components/popup/Popup.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Popup from "./Popup.svelte"; -import { render } from '@testing-library/svelte' -describe("Popup Component", () => { - test("should render the Popup component", () => { - render(Popup) - }) -}) diff --git a/src/lib/components/popup/Popup.svelte b/src/lib/components/popup/Popup.svelte deleted file mode 100644 index 8b6c4fb..0000000 --- a/src/lib/components/popup/Popup.svelte +++ /dev/null @@ -1,121 +0,0 @@ - - -
-
- - - - - - Shortcuts - - - - - -
- - {#if savedShortcutNames && !savedNewShortcut} - {}} - cancelForm={closePopup} - submitForm={handleCreateOrUpdateShortcut} - submitButtonText={shortcutExistsCheck ? "Update" : "Create"} - /> - {/if} - - {#if savedNewShortcut} - - {/if} -
diff --git a/src/lib/components/success/Success.spec.ts b/src/lib/components/success/Success.spec.ts deleted file mode 100644 index 9654c3b..0000000 --- a/src/lib/components/success/Success.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Success from "./Success.svelte"; -import { render } from '@testing-library/svelte' -describe("Success Component", () => { - test("should render the Success component", () => { - render(Success) - }) -}) diff --git a/src/lib/components/success/Success.svelte b/src/lib/components/success/Success.svelte deleted file mode 100644 index dd16fe6..0000000 --- a/src/lib/components/success/Success.svelte +++ /dev/null @@ -1,68 +0,0 @@ - - -
-

Congratulations! 🎉

- -

- Shortcut created successfully -

- -
-
- - {shortcut.shortlink} - - - - External Link - - -
- -
- { - copyToClipboard(shortcut.shortlink); - }} - /> - - -
-
-
diff --git a/src/lib/constants/defaultShortcuts.ts b/src/lib/constants/defaultShortcuts.ts deleted file mode 100644 index e10b11e..0000000 --- a/src/lib/constants/defaultShortcuts.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { Shortcut } from "../types"; - -export const DEFAULT_SHORTCUTS: Shortcut[] = [ - { - shortlink: 'o/meet', - url: 'https://meet.google.com', - createdAt: new Date(), - updatedAt: new Date() - }, - { - shortlink: 'o/mail', - url: 'https://mail.google.com', - createdAt: new Date(), - updatedAt: new Date() - }, - { - shortlink: 'o/linkedin', - url: 'https://www.linkedin.com/feed/', - createdAt: new Date(), - updatedAt: new Date() - }, - { - shortlink: 'o/figma', - url: 'https://figma.com/', - createdAt: new Date(), - updatedAt: new Date() - } -] \ No newline at end of file diff --git a/src/lib/constants/keys.ts b/src/lib/constants/keys.ts deleted file mode 100644 index 09e1cdb..0000000 --- a/src/lib/constants/keys.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const SHORTCUTS_STORAGE_KEY = "shortcuts" -export let SHORTCUT_NAME_INPUT_ID = 'shortcut-name' -export let SHORTCUT_URL_INPUT_ID = 'shortcut-url' \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts deleted file mode 100644 index a5a9d56..0000000 --- a/src/lib/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type Shortcut = { - shortlink: string - url: string - createdAt: Date - updatedAt: Date -} - -export type ShortcutValidationResult = { - shortlink: string, - url: string -} diff --git a/src/lib/utils/checkIfShortcutExists.ts b/src/lib/utils/checkIfShortcutExists.ts deleted file mode 100644 index 9103c6f..0000000 --- a/src/lib/utils/checkIfShortcutExists.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Shortcut } from "../types"; - -/** - * Checks if there is already a shortcut with same URL. Also returns the shortcut if there exists any. - * @param {string} pageURL url for which shortcut is created/exists - * @param {Set | null} savedShortcutURLs a set of url strings or null - * @param {Shortcut[]} savedShortcuts shortcuts array which are already saved - * @returns {{isShortcutExists: boolean;existingShortcut: Shortcut | null;}} boolean and shortcut if that shortcut exists - */ -export function checkIfShortcutExists( - pageURL: string, - savedShortcutURLs: Set | null, - savedShortcuts: Shortcut[] -) { - if (savedShortcutURLs?.has(pageURL)) { - const existingShortcut = savedShortcuts.find( - (shortcut) => shortcut.url === pageURL - ); - return existingShortcut ?? null - } - - return null -} \ No newline at end of file diff --git a/src/lib/utils/constructShortcutRules.ts b/src/lib/utils/constructShortcutRules.ts deleted file mode 100644 index 779c2cd..0000000 --- a/src/lib/utils/constructShortcutRules.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Shortcut } from "../types" - -/** - * Construct DeclarativeNetRequestRules from Shortcuts array - * @param {Shortcut[]} shortcuts shortcuts array - * @returns {chrome.declarativeNetRequest.Rule[]} declarativeNetRequest rules - */ -export function constructShortcutRules(shortcuts: Shortcut[]) { - const newRules = shortcuts.map((shortcut, index) => { - const newRule: chrome.declarativeNetRequest.Rule = { - "id": index + 1, - "priority": 1, - "action": { - "type": chrome.declarativeNetRequest.RuleActionType['REDIRECT'], - "redirect": { - "url": shortcut.url - } - }, - "condition": { - "urlFilter": `http://${shortcut.shortlink}`, - "resourceTypes": [chrome.declarativeNetRequest.ResourceType['MAIN_FRAME']] - } - } - return newRule - }) - return newRules -} \ No newline at end of file diff --git a/src/lib/utils/constructShortcutsFromCSVData.ts b/src/lib/utils/constructShortcutsFromCSVData.ts deleted file mode 100644 index 45229b9..0000000 --- a/src/lib/utils/constructShortcutsFromCSVData.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { Shortcut } from "../types"; -import { isNotNull } from "./isNotNull"; -import { validateShortcutName, validateShortcutURL } from "./validate"; - -/** - * validates and constructs shortcuts from CSV data - * @param {string[][]} csvData - * @param {Set | null} savedShortcutNames set of saved shortcuts . - * @returns {Shortcut[]} throws if error. else return shortcuts array - */ -export async function constructShortcutsFromCSVData(csvData: string[][], savedShortcuts: Shortcut[]) { - // construct map for quick access - const savedShortcutsMap = new Map() - for (const shortcut of savedShortcuts) { - savedShortcutsMap.set(shortcut.shortlink, shortcut.url) - } - - const savedShortcutNames = new Set(savedShortcutsMap.keys()) - - const shortcuts = csvData.map((shortcutRow) => { - // if shortcutName is already present, either ignore if same url or append -new - if (savedShortcutsMap.has(shortcutRow[0])) { - // if shortcutName and url are same then ignore that shortcut - if (savedShortcutsMap.get(shortcutRow[0]) === shortcutRow[1]) { - return null - } - shortcutRow[0] = shortcutRow[0] + '-new' - } - - // validate shortcut name and url - const shortcutNameErrorMsg = validateShortcutName(shortcutRow[0] ?? '', savedShortcutNames) - const urlErrorMsg = validateShortcutURL(shortcutRow[1] ?? '') - - if (!shortcutNameErrorMsg && !urlErrorMsg) { - const shortcut: Shortcut = { - shortlink: shortcutRow[0], - url: shortcutRow[1], - createdAt: new Date(), - updatedAt: new Date(), - }; - return shortcut; - } - else { - let errorMsg = 'Invalid Data: ' - if (shortcutNameErrorMsg) { - errorMsg = errorMsg + `\n${shortcutRow[0]} is invalid : ${shortcutNameErrorMsg}` - } - if (urlErrorMsg) { - errorMsg = errorMsg + `\n${shortcutRow[1]} is invalid : ${urlErrorMsg}` - } - throw new Error(errorMsg) - } - }).filter(isNotNull); - return shortcuts; -} \ No newline at end of file diff --git a/src/lib/utils/copyToClipboard.ts b/src/lib/utils/copyToClipboard.ts deleted file mode 100644 index 229fc7a..0000000 --- a/src/lib/utils/copyToClipboard.ts +++ /dev/null @@ -1,27 +0,0 @@ -export function copyToClipboard(text: string): void { - if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard - .writeText(text) - .then(() => { - console.log('Text copied to clipboard'); - }) - .catch((error) => { - console.error('Failed to copy text to clipboard:', error); - }); - } else { - const textarea = document.createElement('textarea'); - textarea.value = text; - textarea.style.position = 'fixed'; // Ensure off-screen position - document.body.appendChild(textarea); - textarea.focus(); - textarea.select(); - - try { - document.execCommand('copy'); - } catch (error) { - console.error('Failed to copy text to clipboard:', error); - } - - document.body.removeChild(textarea); - } -} diff --git a/src/lib/utils/getFaviconURL.ts b/src/lib/utils/getFaviconURL.ts deleted file mode 100644 index 19b2db8..0000000 --- a/src/lib/utils/getFaviconURL.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function getFaviconURL(u:string) { - const url = new URL(chrome.runtime.getURL("/_favicon/")); - url.searchParams.set("pageUrl", u); - url.searchParams.set("size", "32"); - return url.toString(); -} \ No newline at end of file diff --git a/src/lib/utils/getSavedShortcuts.ts b/src/lib/utils/getSavedShortcuts.ts deleted file mode 100644 index c572f36..0000000 --- a/src/lib/utils/getSavedShortcuts.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { SHORTCUTS_STORAGE_KEY } from "../constants/keys" -import type { Shortcut } from "../types" - -/** - * Get Saved Shortcuts from local storage - * @returns {Shortcut[]} Shortcuts Array - */ -export async function getSavedShortcuts() { - let savedShortcuts: Shortcut[] = [] - const shortcutsKeyValuePair = await chrome.storage.local.get(SHORTCUTS_STORAGE_KEY) - if (shortcutsKeyValuePair) { - savedShortcuts = JSON.parse(shortcutsKeyValuePair[SHORTCUTS_STORAGE_KEY]) as Shortcut[] - if (Array.isArray(savedShortcuts)) { - - return savedShortcuts.sort((shortcut1, shortcut2) => { - if (shortcut1.updatedAt > shortcut2.updatedAt) return -1 - if (shortcut1.updatedAt < shortcut2.updatedAt) return 1 - return 0 - }) - } - } - return [] -} \ No newline at end of file diff --git a/src/lib/utils/isNotNull.ts b/src/lib/utils/isNotNull.ts deleted file mode 100644 index 60bc291..0000000 --- a/src/lib/utils/isNotNull.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function isNotNull(value: T | null): value is T { - return value !== null; -} \ No newline at end of file diff --git a/src/lib/utils/shortcuts.ts b/src/lib/utils/shortcuts.ts deleted file mode 100644 index 457b1f8..0000000 --- a/src/lib/utils/shortcuts.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { SHORTCUTS_STORAGE_KEY } from "../constants/keys"; -import type { Shortcut } from "../types"; -import { constructShortcutRules } from "./constructShortcutRules"; -import { getSavedShortcuts } from "./getSavedShortcuts"; - -/** - * Updates declarative net request rules and saves shortcuts to local storage - * @param {Shortcut[]} shortcuts shortcut - * @returns {void} - */ -export async function updateDeclarativeNetRequestRules(shortcuts: Shortcut[]) { - // get old rules from local storage - const oldRules = await chrome.declarativeNetRequest.getDynamicRules(); - const oldRuleIds = oldRules.map(rule => rule.id); - const newRules = constructShortcutRules(shortcuts) - - // persist shortcuts array to - chrome.storage.local.set({ [SHORTCUTS_STORAGE_KEY]: JSON.stringify(shortcuts) }) - - // update rules - await chrome.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: oldRuleIds, - addRules: newRules - }) -} - -/** - * Creates multiple new shortcuts - * @param {Shortcut[]} shortcuts shortcuts - * @returns {void} - */ -export async function createNewShortcuts(shortcuts: Shortcut[]) { - // get old shortcuts from local storage - const oldShortcuts = await getSavedShortcuts() - - // create a new array with added shortcuts - const newShortcuts = [...oldShortcuts, ...shortcuts] - - await updateDeclarativeNetRequestRules(newShortcuts) -} - -/** - * Creates a new shortcut - * @param {Shortcut} shortcut shortcut - * @returns {void} - */ -export async function createNewShortcut(shortcut: Shortcut) { - // get old shortcuts from local storage - const oldShortcuts = await getSavedShortcuts() - - // create a new array with added shortcut - const newShortcut: Shortcut = { ...shortcut, createdAt: new Date(), updatedAt: new Date() } - const newShortcuts = [...oldShortcuts, newShortcut] - - await updateDeclarativeNetRequestRules(newShortcuts) -} - -/** - * Updates the Shortcut - * @param {Shortcut} oldShortcut shortcut - * @param {Shortcut} newShortcut shortcut - * @returns {void} - */ -export async function updateShortcut(oldShortcut: Shortcut, newShortcut: Shortcut) { - // get old shortcuts from local storage - const oldShortcuts = await getSavedShortcuts() - // get old rules from local storage - const oldRules = await chrome.declarativeNetRequest.getDynamicRules(); - const oldRuleIds = oldRules.map(rule => rule.id); - - const updatedShortcut: Shortcut = { ...newShortcut, updatedAt: new Date() } - const newShortcuts = [ - ...oldShortcuts.filter( - (shortcut) => shortcut.shortlink !== oldShortcut.shortlink) - , updatedShortcut - ] - - const newRules = constructShortcutRules(newShortcuts) - - // persist new shortcuts array to - chrome.storage.local.set({ [SHORTCUTS_STORAGE_KEY]: JSON.stringify(newShortcuts) }) - - // update rules - await chrome.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: oldRuleIds, - addRules: newRules - }) -} - -/** - * deletes the Shortcut - * @param {Shortcut} shortcutToBeDeleted shortcut to be deleted - * @returns {void} - */ -export async function deleteShortcut(shortcutToBeDeleted: Shortcut) { - // get old shortcuts from local storage - const oldShortcuts = await getSavedShortcuts() - - // get old rules from local storage - const oldRules = await chrome.declarativeNetRequest.getDynamicRules(); - const oldRuleIds = oldRules.map(rule => rule.id); - - const newShortcuts = [ - ...oldShortcuts.filter( - (shortcut) => shortcut.shortlink !== shortcutToBeDeleted.shortlink) - ] - - const newRules = constructShortcutRules(newShortcuts) - - // persist new shortcuts array to - chrome.storage.local.set({ [SHORTCUTS_STORAGE_KEY]: JSON.stringify(newShortcuts) }) - - // update rules - await chrome.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: oldRuleIds, - addRules: newRules - }) -} diff --git a/src/lib/utils/validate.ts b/src/lib/utils/validate.ts deleted file mode 100644 index 134e703..0000000 --- a/src/lib/utils/validate.ts +++ /dev/null @@ -1,66 +0,0 @@ - -import type { Shortcut } from "../types"; -/** - * Validates Shortcut - * @param {Shortcut} shortcut shortcut which is to be validated - * @param {Set | null} savedShortcutNames set of saved shortcut names - * @returns {ShortcutValidationResult} shortcut validation result - */ -export function validateShortcut(shortcut: Shortcut, savedShortcutNames: Set | null) { - const url = shortcut.url - const name = shortcut.shortlink - const nameError = validateShortcutName(name, savedShortcutNames) - const urlError = validateShortcutURL(url) - return { - shortlink: nameError, - url: urlError - } -} - -/** - * Validates shortcut url - * @param {string} shortcutURL shortcut name which is to be validated - * @returns {string | null} error message string if error exists. else null - */ -export function validateShortcutURL(shortcutURL: string): string | null { - // validate if empty - if (shortcutURL === '') { - return 'URL cannot be empty' - } - - // validate if valid url - // REFER: https://stackoverflow.com/questions/48110677/url-regex-improvement-to-allow-localhost-url - const httpRegex = /(?:^|[ \t])((https?:\/\/)?(?:localhost|[\w-]+(?:\.[\w-]+)+)(:\d+)?(\/\S*)?)/gm - if (!httpRegex.test(shortcutURL)) { - return 'Please enter a valid URL' - } - - return null -} - -/** - * Validates shortcut name - * @param {Set | null} savedShortcutNames set of saved shortcuts . - * @param {string} shortcutName shortcut name which is to be validated - * @returns {string | null} error message string if error exists. else null - */ -export function validateShortcutName(shortcutName: string, savedShortcutNames: Set | null): string | null { - // validate if empty - if (shortcutName === '') { - return 'Shortcut name cannot be empty' - //shortcutNameErrors.push('Shortcut name cannot be empty') - } - - // validate if starts with o/ - if (!shortcutName.startsWith('o/')) { - return 'Shortcut name must start with o/' - } - - // validate if unique - if (savedShortcutNames?.has(shortcutName)) { - return 'Shortcut with same name already exists' - } - - return null -} - diff --git a/src/option.css b/src/option.css deleted file mode 100644 index 3f9657f..0000000 --- a/src/option.css +++ /dev/null @@ -1,4 +0,0 @@ -html, -body { - height: 100%; -} diff --git a/src/option.ts b/src/option.ts deleted file mode 100644 index aeda940..0000000 --- a/src/option.ts +++ /dev/null @@ -1,13 +0,0 @@ -import './app.css' -import './option.css' -import Option from './lib/components/option/Option.svelte' - -const optionDOMElement = document.getElementById('option') -let option: Option | null = null -if (optionDOMElement) { - option = new Option({ - target: optionDOMElement, - }) -} - -export default option diff --git a/src/popup.css b/src/popup.css deleted file mode 100644 index 6d75621..0000000 --- a/src/popup.css +++ /dev/null @@ -1,5 +0,0 @@ -html, -body { - width: 468px; - height: 282px; -} diff --git a/src/popup.ts b/src/popup.ts deleted file mode 100644 index 56a3926..0000000 --- a/src/popup.ts +++ /dev/null @@ -1,13 +0,0 @@ -import './app.css' -import './popup.css' -import Popup from './lib/components/popup/Popup.svelte' - -const popupDOMElement = document.getElementById('popup') -let popup: Popup | null = null -if (popupDOMElement) { - popup = new Popup({ - target: popupDOMElement, - }) -} - -export default popup diff --git a/src/service_worker.ts b/src/service_worker.ts deleted file mode 100644 index 1e41b82..0000000 --- a/src/service_worker.ts +++ /dev/null @@ -1,91 +0,0 @@ -'use strict'; - -import { DEFAULT_SHORTCUTS } from "./lib/constants/defaultShortcuts"; -import { SHORTCUTS_STORAGE_KEY } from "./lib/constants/keys"; -import { constructShortcutRules } from "./lib/utils/constructShortcutRules"; -import { getSavedShortcuts } from "./lib/utils/getSavedShortcuts"; -import Fuse from 'fuse.js' - -const defaultShortcuts = DEFAULT_SHORTCUTS -const fuseOptions = { - includeScore: true, - keys: ['shortlink'] -} -let fuse = new Fuse(defaultShortcuts, fuseOptions) - -chrome.runtime.onInstalled.addListener(async (details) => { - if (details.reason !== "install") return; - - // persist default Shortcuts to local storage - chrome.storage.local.set({ [SHORTCUTS_STORAGE_KEY]: JSON.stringify(defaultShortcuts) }) - // construct new rules on every installation - const newRules = constructShortcutRules(defaultShortcuts) - const oldRules = await chrome.declarativeNetRequest.getDynamicRules(); - const oldRuleIds = oldRules.map(rule => rule.id); - // add the new rules as declarativeNetRequest Dynamic rules, and remove old rules if there are any - await chrome.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: oldRuleIds, - addRules: newRules - }); -}); - -chrome.omnibox.onInputStarted.addListener(async function () { - // on each input session, get all shortcuts and create a new fuse object with them - const savedShortcuts = await getSavedShortcuts() - fuse = new Fuse(savedShortcuts, fuseOptions) -}); - -chrome.omnibox.onInputChanged.addListener(async function (text, suggest) { - // get fuse suggestions - const suggestedShortcuts = fuse.search(text) - - // map fuse suggestions to omnibox suggestions - const suggestions: chrome.omnibox.SuggestResult[] = suggestedShortcuts.map((shortcut) => { - return { - content: shortcut.item.shortlink, description: `${shortcut.item.shortlink} - ${shortcut.item.url}` - } - }) - suggest(suggestions); -}); - -chrome.omnibox.onInputEntered.addListener(function (text, disposition) { - // redirect to url in new tab - const url = `http://${text}` - switch (disposition) { - case "currentTab": - chrome.tabs.update({ url }); - break; - case "newForegroundTab": - chrome.tabs.create({ url }); - break; - case "newBackgroundTab": - chrome.tabs.create({ url, active: false }); - break; - } -}); - -// If o/ is prefix and no shortcut with given name is saved then redirect to options page -chrome.webRequest.onBeforeRequest.addListener((param) => { - getSavedShortcuts().then((shortcuts) => { - const savedShortcutNamesSet = new Set(shortcuts.map((shortcut) => shortcut.shortlink)) - const requestUrl = new URL(param.url) - if (requestUrl.searchParams.has('q')) { - const queryValue = requestUrl.searchParams.get('q') ?? '' - if (queryValue.startsWith('o/')) { - if (!savedShortcutNamesSet.has(queryValue)) { - chrome.tabs.update({ url: '/option.html' }) - } - else { - const url = shortcuts.find((shortcut) => shortcut.shortlink === queryValue)?.url ?? '' - chrome.tabs.update({ url }) - } - } - } - else if (param.url.startsWith('http://o/')) { - const requestShortcutName = param.url.replace('http://', '') - if (!savedShortcutNamesSet.has(requestShortcutName)) { - chrome.tabs.update({ url: '/option.html' }) - } - } - }) -}, { urls: ["*://*/search*", "*://o/*"] }) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts deleted file mode 100644 index 4078e74..0000000 --- a/src/vite-env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/oslash-with-plasmo/style.css b/style.css similarity index 100% rename from oslash-with-plasmo/style.css rename to style.css diff --git a/svelte.config.js b/svelte.config.js deleted file mode 100644 index b0683fd..0000000 --- a/svelte.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' - -export default { - // Consult https://svelte.dev/docs#compile-time-svelte-preprocess - // for more information about preprocessors - preprocess: vitePreprocess(), -} diff --git a/oslash-with-plasmo/svelte.config.mjs b/svelte.config.mjs similarity index 100% rename from oslash-with-plasmo/svelte.config.mjs rename to svelte.config.mjs diff --git a/tailwind.config.js b/tailwind.config.js index d0d2034..d7984f7 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,33 +1,7 @@ /** @type {import('tailwindcss').Config} */ -const defaultTheme = require('tailwindcss/defaultTheme'); -export default { - content: ['./src/**/*.{html,js,svelte,ts}'], - theme: { - extend: { - fontFamily: { - sans: ['Inter var', ...defaultTheme.fontFamily.sans], - }, - animation: { - shake: 'shake 1s cubic-bezier(.36,.07,.19,.97) both' - }, - keyframes: { - shake: { - '10%, 90%': { - transform: 'rotate(18deg)' - }, - '20%, 80%': { - transform: 'rotate(-18deg)' - }, - '30%, 50%, 70%': { - transform: 'rotate(18deg)' - }, - '40%, 60%': { - transform: 'rotate(-18deg)' - } - } - }, - }, - }, - plugins: [], -} - +module.exports = { + mode: "jit", + darkMode: "class", + content: ["./**/*.svelte"], + plugins: [] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 3ccb2c0..17f3e9f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,20 @@ { - "extends": "@tsconfig/svelte/tsconfig.json", + "extends": "plasmo/templates/tsconfig.base", + "exclude": [ + "node_modules" + ], + "include": [ + ".plasmo/index.d.ts", + "./**/*.ts", + "./**/*.svelte" + ], "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "types": ["vitest/globals", "chrome"], - "resolveJsonModule": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable checkJs if you'd like to use dynamic types in JS. - * Note that setting allowJs false does not prevent the use - * of JS in `.svelte` files. - */ - "allowJs": true, - "checkJs": true, - "isolatedModules": true, - "strict": true - }, - "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], - "references": [{ "path": "./tsconfig.node.json" }] + "paths": { + "~*": [ + "./*" + ] + }, + "baseUrl": ".", + "types": ["svelte", "chrome", "firefox-webext-browser"] + } } diff --git a/tsconfig.node.json b/tsconfig.node.json deleted file mode 100644 index ab47257..0000000 --- a/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler" - }, - "include": ["vite.config.ts", "manifest.json"] -} diff --git a/vite.config.ts b/vite.config.ts deleted file mode 100644 index f5e732e..0000000 --- a/vite.config.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { defineConfig } from 'vite' -import { svelte } from '@sveltejs/vite-plugin-svelte' -import { resolve, join } from 'path' -import { crx } from '@crxjs/vite-plugin' -import manifest from './manifest.json' -// https://vitejs.dev/config/ -export default defineConfig({ - // REFER: https://github.com/crxjs/chrome-extension-tools/issues/696#issuecomment-1526138970 - server: { - port: 5173, - strictPort: true, - hmr: { - port: 5173, - }, - }, - plugins: [svelte(), crx({ manifest })], - build: { - outDir: join(__dirname, "oslash-chrome-extension"), - rollupOptions: { - input: { - option: resolve(__dirname, 'option.html'), - popup: resolve(__dirname, 'popup.html') - }, - }, - }, -}) diff --git a/vitest.config.js b/vitest.config.js deleted file mode 100644 index c0b2c78..0000000 --- a/vitest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'vitest/config' -import { svelte } from '@sveltejs/vite-plugin-svelte' - -export default defineConfig({ - plugins: [ - svelte({ hot: !process.env.VITEST }), - ], - test: { - environment: 'jsdom', - globals: true - } -}) \ No newline at end of file From 6cc73810faf980dc3c18029e37da52430cb3ef39 Mon Sep 17 00:00:00 2001 From: Tanmay Shah Date: Fri, 1 Dec 2023 17:22:34 +0530 Subject: [PATCH 5/6] feat: update readme for firefox --- README.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3856072..56f6b50 100644 --- a/README.md +++ b/README.md @@ -19,17 +19,23 @@ So, we replaced them with OSlash shortcuts (or `o/shortcuts`) to make them more ### How to install OSlash? -To install the open source extension, please follow these steps: - -1. Start by downloading the OSlash [ZIP file](https://github.com/getoslash/oslash/releases/download/%40v1.1.0/oslash-chrome-extension.zip) to your local drive and then extract its contents into a designated folder. -2. Open your Chrome browser. -3. Access the extensions management page by entering `chrome://extensions` into the Chrome address bar and pressing Enter. -4. In the top right corner of the extensions page, toggle the switch to enable "Developer mode." -5. With developer mode activated, click on the "Load unpacked" button that appears. -6. Navigate to the location where you extracted the OSlash extension files and select the folder. -7. After the folder is loaded, you should see the OSlash extension in your list of installed extensions. -8. To have quick access to OSlash, locate it in the extensions list and click the `pin` icon, so it appears in your browser's toolbar. -9. Here is a short video for the same: https://drive.google.com/file/d/1nPZqKjsDWJezidBEAS1R8fDgsb3AYWgg/view?usp=drive_link +To install the local version of open source extension, please follow these steps: + +1. Go to the [Releases Page](https://github.com/getoslash/oslash/releases) and start by downloading the OSlash extension as per your browser name to your local drive and then extract its contents into a designated folder. +2. Open your browser +3. For chrome/brave/arc/chromium users: + 1. Access the extensions management page by entering `chrome://extensions` into the Chrome address bar and pressing Enter. + 2. In the top right corner of the extensions page, toggle the switch to enable "Developer mode." + 3. With developer mode activated, click on the "Load unpacked" button that appears. + 4. Navigate to the location where you extracted the OSlash extension files and select the folder. + 5. After the folder is loaded, you should see the OSlash extension in your list of installed extensions. + 6. To have quick access to OSlash, locate it in the extensions list and click the `pin` icon, so it appears in your browser's toolbar. + 7. Here is a short video for the same: https://drive.google.com/file/d/1nPZqKjsDWJezidBEAS1R8fDgsb3AYWgg/view?usp=drive_lin +4. For firefox users: + 1. Open the [about:debugging](https://firefox-source-docs.mozilla.org/devtools-user/about_colon_debugging/index.html) page, click the This Firefox option, click the Load Temporary Add-on button, then select any file in your extension's directory. + 2. The extension now installs, and remains installed until you restart Firefox. + 3. To have quick access to OSlash, locate it in the extensions list and click the `pin` icon, so it appears in your browser's toolbar. + ### How to start creating and using OSlash shortcuts? From a01cd5213393d491676b972f98c1c40430c7205f Mon Sep 17 00:00:00 2001 From: Tanmay Dineshkumar Shah Date: Tue, 5 Dec 2023 10:40:14 +0530 Subject: [PATCH 6/6] chore: add jsdoc comments on util functions --- lib/components/option/Option.svelte | 4 ++++ lib/utils/browser/constructShortcutRules.ts | 6 +++++- lib/utils/browser/getBrowserName.ts | 8 ++++++++ lib/utils/browser/getDeclarativeNetRequestRules.ts | 4 ++++ lib/utils/browser/getFaviconURL.ts | 9 +++++++-- lib/utils/browser/getTabUrl.ts | 8 ++++++++ lib/utils/browser/storageUtils.ts | 5 +++++ lib/utils/browser/tabOperations.ts | 10 ++++++++++ lib/utils/browser/updateDeclarativeNetRequestRules.ts | 6 ++++++ lib/utils/constructShortcutsFromCSVData.ts | 4 ++-- lib/utils/copyToClipboard.ts | 5 +++++ lib/utils/isNotNull.ts | 5 +++++ lib/utils/setShortcutsToStorage.ts | 5 +++++ pnpm-lock.yaml | 11 +++++++++++ tsconfig.json | 4 ++-- 15 files changed, 87 insertions(+), 7 deletions(-) diff --git a/lib/components/option/Option.svelte b/lib/components/option/Option.svelte index 11e1ba6..2ea1900 100644 --- a/lib/components/option/Option.svelte +++ b/lib/components/option/Option.svelte @@ -57,6 +57,10 @@ // reset search query every-time shortcut list changes $: resetSearchQuery($shortcuts) + /** + * loads the shortcuts into the store from storage + * @returns {Promise} + */ async function loadShortcuts() { await shortcuts.init() } diff --git a/lib/utils/browser/constructShortcutRules.ts b/lib/utils/browser/constructShortcutRules.ts index 728e0ba..67333e8 100644 --- a/lib/utils/browser/constructShortcutRules.ts +++ b/lib/utils/browser/constructShortcutRules.ts @@ -1,7 +1,11 @@ -import { FIREFOX, SAFARI } from "~lib/constants/browserNames" import type { Shortcut } from "~lib/types" import { isNonChromiumBrowser } from "./getBrowserName" +/** + * construct the declarative net request rules for given shortcuts array + * @param {Shortcut[]} shortcuts shortcuts array + * @returns {browser.declarativeNetRequest.Rule[] | chrome.declarativeNetRequest.Rule[]} array of shortcut rules + */ export function constructShortcutRules(shortcuts: Shortcut[]) { if (isNonChromiumBrowser()) { return shortcuts.map((shortcut, index) => { diff --git a/lib/utils/browser/getBrowserName.ts b/lib/utils/browser/getBrowserName.ts index 52f9f80..d900e19 100644 --- a/lib/utils/browser/getBrowserName.ts +++ b/lib/utils/browser/getBrowserName.ts @@ -1,9 +1,17 @@ import { FIREFOX, SAFARI } from "~lib/constants/browserNames"; +/** + * gives the browser name + * @returns {string} browser name as per plasmo env + */ export function getBrowserName() { return process.env.PLASMO_BROWSER } +/** + * checks if the browser is a non chromium based one or not + * @returns {boolean} true if if not based on chromium. else false + */ export function isNonChromiumBrowser() { // For now, only safari and firefox are considered in non chromium browsers // More can be added in future if required diff --git a/lib/utils/browser/getDeclarativeNetRequestRules.ts b/lib/utils/browser/getDeclarativeNetRequestRules.ts index 2ef1b46..49008e9 100644 --- a/lib/utils/browser/getDeclarativeNetRequestRules.ts +++ b/lib/utils/browser/getDeclarativeNetRequestRules.ts @@ -1,5 +1,9 @@ import { isNonChromiumBrowser } from "./getBrowserName"; +/** + * gives the saved declarative net request rules in browser + * @returns {browser.declarativeNetRequest.Rule[] | chrome.declarativeNetRequest.Rule[]} declarative net request rules array + */ export async function getDeclarativeNetRequestRules() { const browserName = process.env.PLASMO_BROWSER if (isNonChromiumBrowser()) { diff --git a/lib/utils/browser/getFaviconURL.ts b/lib/utils/browser/getFaviconURL.ts index 5feb676..7c5f4e3 100644 --- a/lib/utils/browser/getFaviconURL.ts +++ b/lib/utils/browser/getFaviconURL.ts @@ -1,6 +1,11 @@ import { isNonChromiumBrowser } from "./getBrowserName" -export function getFaviconURL(u: string) { +/** + * gives the saved favicon url in browser of a given website + * @param {string} url the shortlink's url + * @returns {browser.declarativeNetRequest.Rule[] | chrome.declarativeNetRequest.Rule[]} declarative net request rules array + */ +export function getFaviconURL(shortcutURL: string) { let url: URL | null = null if (isNonChromiumBrowser()) { // NOTE: This is a fallback icon. Firefox does not support accessing cached favicon @@ -11,7 +16,7 @@ export function getFaviconURL(u: string) { } if (url) { - url.searchParams.set("pageUrl", u) + url.searchParams.set("pageUrl", shortcutURL) url.searchParams.set("size", "32") return url.toString() } diff --git a/lib/utils/browser/getTabUrl.ts b/lib/utils/browser/getTabUrl.ts index 2043fc0..cd51f81 100644 --- a/lib/utils/browser/getTabUrl.ts +++ b/lib/utils/browser/getTabUrl.ts @@ -1,9 +1,17 @@ import { isNonChromiumBrowser } from "./getBrowserName" +/** + * gives the active/current tab url + * @returns {Promise} url string of the active/current tab + */ export async function getActiveTabURL() { return await getTabURL() } +/** + * utility function to get current tab url using browser APIs + * @returns {Promise} url string of the active/current tab + */ function getTabURL() { return new Promise((resolve) => { try { diff --git a/lib/utils/browser/storageUtils.ts b/lib/utils/browser/storageUtils.ts index b24d14a..2fae9a9 100644 --- a/lib/utils/browser/storageUtils.ts +++ b/lib/utils/browser/storageUtils.ts @@ -1,6 +1,11 @@ import { Storage } from "@plasmohq/storage"; import type { Shortcut } from "~lib/types"; +/** + * gives the browser local storage data for a given key + * @param {string} key key for the stored data + * @returns {Promise} stored data with given type + */ export async function getDataFromStorage(key) { const storage = new Storage({ area: "local" diff --git a/lib/utils/browser/tabOperations.ts b/lib/utils/browser/tabOperations.ts index 5439651..7c623c8 100644 --- a/lib/utils/browser/tabOperations.ts +++ b/lib/utils/browser/tabOperations.ts @@ -1,5 +1,10 @@ import { isNonChromiumBrowser } from "./getBrowserName" +/** + * opens new tab + * @param {chrome.tabs.CreateProperties | browser.tabs._CreateCreateProperties} props properties for creating new tab + * @returns {void} + */ export function openNewTab(props: chrome.tabs.CreateProperties | browser.tabs._CreateCreateProperties) { if (isNonChromiumBrowser()) { browser.tabs.create(props) @@ -9,6 +14,11 @@ export function openNewTab(props: chrome.tabs.CreateProperties | browser.tabs._C } } +/** + * updates the current tab + * @param {chrome.tabs.UpdateProperties | browser.tabs._UpdateUpdateProperties} props properties for updating the tab + * @returns {void} + */ export function updateTab(props: chrome.tabs.UpdateProperties | browser.tabs._UpdateUpdateProperties) { if (isNonChromiumBrowser()) { browser.tabs.update(props) diff --git a/lib/utils/browser/updateDeclarativeNetRequestRules.ts b/lib/utils/browser/updateDeclarativeNetRequestRules.ts index a968399..34dd035 100644 --- a/lib/utils/browser/updateDeclarativeNetRequestRules.ts +++ b/lib/utils/browser/updateDeclarativeNetRequestRules.ts @@ -1,5 +1,11 @@ import { isNonChromiumBrowser } from "./getBrowserName"; +/** + * updates the declarative net request rules of the browser + * @param { browser.declarativeNetRequest.Rule[] | chrome.declarativeNetRequest.Rule[]} addRules rules that need to be added + * @param {number[]} removeRuleIds IDs of rules that need to be removed + * @returns {void} + */ export async function updateDeclarativeNetRequestRules( addRules: browser.declarativeNetRequest.Rule[] | chrome.declarativeNetRequest.Rule[], diff --git a/lib/utils/constructShortcutsFromCSVData.ts b/lib/utils/constructShortcutsFromCSVData.ts index 45229b9..e478dcd 100644 --- a/lib/utils/constructShortcutsFromCSVData.ts +++ b/lib/utils/constructShortcutsFromCSVData.ts @@ -35,8 +35,8 @@ export async function constructShortcutsFromCSVData(csvData: string[][], savedSh const shortcut: Shortcut = { shortlink: shortcutRow[0], url: shortcutRow[1], - createdAt: new Date(), - updatedAt: new Date(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), }; return shortcut; } diff --git a/lib/utils/copyToClipboard.ts b/lib/utils/copyToClipboard.ts index 229fc7a..e79d8e2 100644 --- a/lib/utils/copyToClipboard.ts +++ b/lib/utils/copyToClipboard.ts @@ -1,3 +1,8 @@ +/** + * copies the given text to clipboard + * @param {string} text text to be copied + * @returns {void} + */ export function copyToClipboard(text: string): void { if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard diff --git a/lib/utils/isNotNull.ts b/lib/utils/isNotNull.ts index 60bc291..c475097 100644 --- a/lib/utils/isNotNull.ts +++ b/lib/utils/isNotNull.ts @@ -1,3 +1,8 @@ +/** + * checks if value is null or not + * @param {T | null} value value to be checked + * @returns {boolean} true if value is not null. else false + */ export function isNotNull(value: T | null): value is T { return value !== null; } \ No newline at end of file diff --git a/lib/utils/setShortcutsToStorage.ts b/lib/utils/setShortcutsToStorage.ts index d45e5f9..74a7bde 100644 --- a/lib/utils/setShortcutsToStorage.ts +++ b/lib/utils/setShortcutsToStorage.ts @@ -2,6 +2,11 @@ import type { Shortcut } from "~lib/types" import { setDataToStorage } from "./browser/storageUtils" import { SHORTCUTS_STORAGE_KEY } from "~lib/constants/keys" +/** + * set/store given shortcuts to storage + * @param {Shortcut[]} shortcuts shortcuts to be stored + * @returns {Promise} + */ export async function setShortcutsToStorage(shortcuts: Shortcut[]) { await setDataToStorage(SHORTCUTS_STORAGE_KEY, shortcuts) } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cddaa9..6528577 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + dependencies: '@plasmohq/storage': specifier: ^1.9.0 @@ -3537,6 +3541,7 @@ packages: /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + requiresBuild: true peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -4310,6 +4315,7 @@ packages: /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: safer-buffer: 2.1.2 dev: false @@ -5110,6 +5116,7 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + requiresBuild: true dev: false optional: true @@ -5226,6 +5233,7 @@ packages: /node-gyp-build-optional-packages@5.0.7: resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} hasBin: true + requiresBuild: true dev: false optional: true @@ -5609,6 +5617,7 @@ packages: /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + requiresBuild: true dev: false optional: true @@ -5858,6 +5867,7 @@ packages: /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + requiresBuild: true dev: false optional: true @@ -6117,6 +6127,7 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + requiresBuild: true dev: false optional: true diff --git a/tsconfig.json b/tsconfig.json index 17f3e9f..932fd75 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "include": [ ".plasmo/index.d.ts", "./**/*.ts", - "./**/*.svelte" + "./**/*.svelte", ], "compilerOptions": { "paths": { @@ -15,6 +15,6 @@ ] }, "baseUrl": ".", - "types": ["svelte", "chrome", "firefox-webext-browser"] + "types": ["svelte", "chrome", "firefox-webext-browser", "node"] } }