├── .env.sample ├── .gitignore ├── .shopify-cli.yml.sample ├── README.md ├── media ├── code-sample.png └── screenshot.png ├── package.json ├── prisma └── schema.prisma ├── src ├── app.css ├── app.d.ts ├── app.html ├── env.d.ts ├── hooks.ts ├── lib │ ├── components │ │ └── header │ │ │ ├── Header.svelte │ │ │ └── svelte-logo.svg │ ├── database │ │ ├── client.ts │ │ └── models │ │ │ ├── OfflineSession.ts │ │ │ └── Shop.ts │ └── shopify │ │ ├── app-bridge.ts │ │ ├── config.ts │ │ ├── fetch.ts │ │ ├── graphql │ │ ├── client.ts │ │ └── node-client.ts │ │ ├── handler.ts │ │ ├── session-storage.ts │ │ ├── verify.ts │ │ └── webhooks.ts └── routes │ ├── __layout.svelte │ ├── gdpr.ts │ ├── index.svelte │ ├── index.ts │ └── info.ts ├── static ├── favicon.png ├── svelte-welcome.png └── svelte-welcome.webp ├── svelte.config.js ├── tsconfig.json └── yarn.lock /.env.sample: -------------------------------------------------------------------------------- 1 | # To access the API key in the front end 2 | VITE_SHOPIFY_API_KEY=API_KEY 3 | # To be compatible with the Shopify CLI 4 | SHOPIFY_API_KEY=API_KEY 5 | SHOPIFY_API_SECRET=SECRET 6 | SCOPES=write_products,write_customers,write_draft_orders,read_locales 7 | VITE_SHOPIFY_HOST=https://ngrok.host 8 | 9 | DATABASE_URL="postgresql://postgres:postgres@localhost:5432/sveltekit_starter?schema=public" 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.sample 9 | .shopify-cli.yml 10 | -------------------------------------------------------------------------------- /.shopify-cli.yml.sample: -------------------------------------------------------------------------------- 1 | --- 2 | project_type: node 3 | organization_id: XXXXX 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SvelteKit Shopify Starter 2 | 3 | A Shopify Starter app based On SvelteKit 4 | 5 | ![Shopify starter app](./media/screenshot.png) 6 | 7 | With concise auth handling code 8 | 9 | ![Code sample](./media/code-sample.png) 10 | 11 | ## Contents 12 | 13 | - Shopify Auth handler (Provided 14 | by [sveltekit-shopify-auth](https://github.com/unlocomqx/sveltekit-shopify-auth)) 15 | - Shopify webhooks handler 16 | - Shopify GraphQL proxy 17 | - [Shopfiy App bridge](https://shopify.dev/apps/tools/app-bridge) 18 | - Prisma DB (For shop and session storage) 19 | 20 | ## How to 21 | 22 | - Clone it 23 | 24 | ```shell 25 | git clone https://github.com/unlocomqx/sveltekit-shopify-starter 26 | ``` 27 | 28 | - Install the dependencies 29 | 30 | ```shell 31 | yarn 32 | ``` 33 | 34 | - Create the `.env` file 35 | 36 | ```shell 37 | cp .env.sample .env 38 | ``` 39 | 40 | - Initialize the DB 41 | 42 | ```shell 43 | prisma db push 44 | prisma generate 45 | ``` 46 | 47 | - Run it 48 | 49 | ```shell 50 | yarn run dev 51 | # OR serve it with the Shopify cli through ngrok 52 | shopify app serve 53 | ``` 54 | 55 | ℹ️ Developing with ngrok might be slow, check 56 | this [post](https://dev.to/unlocomqx/a-much-better-dx-for-shopify-apps-38ln) for the best dev 57 | experience 58 | 59 | ## Usage with SvelteKit hooks 60 | 61 | The code in the handle function is minimal 62 | 63 | ```ts 64 | import type { Handle } from "@sveltejs/kit" 65 | import { handleShopifyAuth } from "$lib/shopify/handler" 66 | 67 | export const handle: Handle = async function ({ event, resolve }) { 68 | 69 | const response = await handleShopifyAuth(event) 70 | if (response) { 71 | return response 72 | } 73 | 74 | return resolve(event) 75 | } 76 | ``` 77 | 78 | ## Making an authenticated fetch request 79 | 80 | To make a `fetch` request that includes a token header, you can call `authenticatedFetch` like so 81 | 82 | If the request authentication fails, a redirect is triggered and a new online token is acquired 83 | 84 | ```ts 85 | import { authenticatedFetch } from "$lib/shopify/fetch" 86 | 87 | const fetchFn = authenticatedFetch() 88 | const res = await fetchFn("/info") 89 | const { info } = await res.json() 90 | ``` 91 | 92 | ## Making a graphql request 93 | 94 | ```ts 95 | import { query } from "$lib/shopify/graphql/client" 96 | import { gql } from "@apollo/client/core" 97 | import type { Product, } from "shopify-admin-api-typings" 98 | 99 | const _query = gql`{ 100 | products(first: 10) { 101 | edges { 102 | node { 103 | title 104 | id 105 | } 106 | } 107 | } 108 | }` 109 | 110 | const data = await query<{ product: Product }>(_query, { 111 | fetchPolicy: "no-cache", 112 | }) 113 | ``` 114 | 115 | ## Usage with SvelteKit Vercel Adapter 116 | 117 | Prisma needs a post install and postbuild for Vercel, and the build command for vercel needs to be 118 | set to `prisma generate` && `npm run build` 119 | 120 | ```json 121 | "scripts":{ 122 | "dev": "svelte-kit dev", 123 | "build": "svelte-kit build", 124 | "package": "svelte-kit package", 125 | "preview": "svelte-kit preview", 126 | "prepare": "svelte-kit sync", 127 | "check": "svelte-check --tsconfig ./tsconfig.json", 128 | "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", 129 | "postinstall": "prisma generate", 130 | "postbuild": "cp node_modules/@prisma/engines/*query* .vercel_build_output/functions/node/render/;cp prisma/schema.prisma .vercel_build_output/functions/node/render/", 131 | "vercel-build": "prisma generate && npm run build" 132 | } 133 | ``` 134 | -------------------------------------------------------------------------------- /media/code-sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unlocomqx/sveltekit-shopify-starter/342b442d7dcb3a998659027e626d60357fd8f040/media/code-sample.png -------------------------------------------------------------------------------- /media/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unlocomqx/sveltekit-shopify-starter/342b442d7dcb3a998659027e626d60357fd8f040/media/screenshot.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-shopify-starter", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "dev": "svelte-kit dev", 6 | "build": "svelte-kit build", 7 | "package": "svelte-kit package", 8 | "preview": "svelte-kit preview", 9 | "prepare": "svelte-kit sync", 10 | "check": "svelte-check --tsconfig ./tsconfig.json", 11 | "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch" 12 | }, 13 | "devDependencies": { 14 | "@sveltejs/adapter-node": "^1.0.0-next.73", 15 | "@sveltejs/kit": "next", 16 | "shopify-admin-api-typings": "^1.2.2", 17 | "svelte": "^3.44.0", 18 | "svelte-check": "^2.2.6", 19 | "svelte-preprocess": "^4.10.1", 20 | "tslib": "^2.3.1", 21 | "typescript": "~4.6.2" 22 | }, 23 | "type": "module", 24 | "dependencies": { 25 | "@apollo/client": "^3.5.10", 26 | "@fontsource/fira-mono": "^4.5.6", 27 | "@prisma/client": "^3.11.1", 28 | "@shopify/app-bridge": "^2.0.21", 29 | "@shopify/app-bridge-utils": "^2.0.21", 30 | "graphql": "^16.3.0", 31 | "prisma": "^3.11.1", 32 | "svelte-apollo-client": "^0.1.4", 33 | "sveltekit-shopify-api": "^1.3.7", 34 | "sveltekit-shopify-auth": "^1.6.2" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "postgresql" 10 | url = env("DATABASE_URL") 11 | } 12 | 13 | model Shop { 14 | id String @id @default(cuid()) 15 | name String @unique 16 | host String? 17 | scope String? 18 | installed Boolean @default(false) 19 | 20 | createdAt DateTime @default(now()) 21 | updatedAt DateTime @updatedAt 22 | 23 | online_sessions OnlineSession[] 24 | offline_session OfflineSession? 25 | 26 | @@map("shops") 27 | } 28 | 29 | model OnlineSession { 30 | id String @id @default(cuid()) 31 | primary_id String @unique 32 | secondary_id String @unique 33 | id_user Int 34 | 35 | id_shop String 36 | shop Shop @relation(fields: [id_shop], references: [id], onDelete: Cascade) 37 | 38 | state String 39 | scope String? 40 | expires DateTime? 41 | accessToken String? 42 | onlineAccessInfo Json? 43 | 44 | createdAt DateTime @default(now()) 45 | updatedAt DateTime @updatedAt 46 | 47 | @@map("online_sessions") 48 | } 49 | 50 | model OfflineSession { 51 | id String @id 52 | 53 | id_shop String @unique 54 | shop Shop @relation(fields: [id_shop], references: [id], onDelete: Cascade) 55 | 56 | state String? 57 | scope String? 58 | accessToken String? 59 | 60 | createdAt DateTime @default(now()) 61 | updatedAt DateTime @updatedAt 62 | 63 | @@map("offline_sessions") 64 | } 65 | -------------------------------------------------------------------------------- /src/app.css: -------------------------------------------------------------------------------- 1 | @import '@fontsource/fira-mono'; 2 | 3 | :root { 4 | font-family: Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, 5 | Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 6 | --font-mono: 'Fira Mono', monospace; 7 | --pure-white: #ffffff; 8 | --primary-color: #b9c6d2; 9 | --secondary-color: #d0dde9; 10 | --tertiary-color: #edf0f8; 11 | --accent-color: #ff3e00; 12 | --heading-color: rgba(0, 0, 0, 0.7); 13 | --text-color: #444444; 14 | --background-without-opacity: rgba(255, 255, 255, 0.7); 15 | --column-width: 42rem; 16 | --column-margin-top: 4rem; 17 | } 18 | 19 | body { 20 | min-height: 100vh; 21 | margin: 0; 22 | background-color: var(--primary-color); 23 | background: linear-gradient( 24 | 180deg, 25 | var(--primary-color) 0%, 26 | var(--secondary-color) 10.45%, 27 | var(--tertiary-color) 41.35% 28 | ); 29 | } 30 | 31 | body::before { 32 | content: ''; 33 | width: 80vw; 34 | height: 100vh; 35 | position: absolute; 36 | top: 0; 37 | left: 10vw; 38 | z-index: -1; 39 | background: radial-gradient( 40 | 50% 50% at 50% 50%, 41 | var(--pure-white) 0%, 42 | rgba(255, 255, 255, 0) 100% 43 | ); 44 | opacity: 0.05; 45 | } 46 | 47 | #svelte { 48 | min-height: 100vh; 49 | display: flex; 50 | flex-direction: column; 51 | } 52 | 53 | h1, 54 | h2, 55 | p { 56 | font-weight: 400; 57 | color: var(--heading-color); 58 | } 59 | 60 | p { 61 | line-height: 1.5; 62 | } 63 | 64 | a { 65 | color: var(--accent-color); 66 | text-decoration: none; 67 | } 68 | 69 | a:hover { 70 | text-decoration: underline; 71 | } 72 | 73 | h1 { 74 | font-size: 2rem; 75 | text-align: center; 76 | } 77 | 78 | h2 { 79 | font-size: 1.5rem; 80 | } 81 | 82 | pre { 83 | font-size: 16px; 84 | font-family: var(--font-mono); 85 | background-color: rgba(255, 255, 255, 0.45); 86 | border-radius: 3px; 87 | box-shadow: 2px 2px 6px rgb(255 255 255 / 25%); 88 | padding: 0.5em; 89 | overflow-x: auto; 90 | color: var(--text-color); 91 | } 92 | 93 | input, 94 | button { 95 | font-size: inherit; 96 | font-family: inherit; 97 | } 98 | 99 | button:focus:not(:focus-visible) { 100 | outline: none; 101 | } 102 | 103 | button { 104 | cursor: pointer; 105 | color: var(--text-color); 106 | background-color: var(--secondary-color); 107 | border: 1px solid var(--primary-color); 108 | padding: .5em; 109 | border-radius: .25em; 110 | } 111 | 112 | ul { 113 | color: var(--text-color); 114 | } 115 | 116 | @media (min-width: 720px) { 117 | h1 { 118 | font-size: 2.4rem; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | // See https://kit.svelte.dev/docs/types#the-app-namespace 4 | // for information about these interfaces 5 | declare namespace App { 6 | 7 | import type { Shop } from "@prisma/client" 8 | import type { Session } from "sveltekit-shopify-api/dist/auth/session" 9 | 10 | interface Locals { 11 | shop: Shop 12 | session: Session 13 | } 14 | 15 | } 16 | 17 | declare namespace NodeJS { 18 | interface ProcessEnv { 19 | VITE_SHOPIFY_API_KEY: string 20 | SHOPIFY_API_SECRET: string 21 | SCOPES: string 22 | VITE_SHOPIFY_HOST: string 23 | 24 | DATABASE_URL: string 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | %svelte.head% 9 | 10 | 11 |
%svelte.body%
12 | 13 | 14 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | readonly VITE_SHOPIFY_API_KEY: string 5 | readonly VITE_SHOPIFY_HOST: string 6 | } 7 | 8 | interface ImportMeta { 9 | readonly env: ImportMetaEnv 10 | } 11 | -------------------------------------------------------------------------------- /src/hooks.ts: -------------------------------------------------------------------------------- 1 | import { handleShopifyAuth } from "$lib/shopify/handler" 2 | import type { Handle } from "@sveltejs/kit" 3 | 4 | export const handle: Handle = async function ({ event, resolve }) { 5 | 6 | const response = await handleShopifyAuth(event) 7 | if (response) { 8 | return response 9 | } 10 | 11 | return resolve(event, { 12 | ssr: false, 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /src/lib/components/header/Header.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 |
8 | 9 | SvelteKit 10 | 11 |
12 | 13 | 30 | 31 |
32 | 33 |
34 |
35 | 36 | 125 | -------------------------------------------------------------------------------- /src/lib/components/header/svelte-logo.svg: -------------------------------------------------------------------------------- 1 | svelte-logo -------------------------------------------------------------------------------- /src/lib/database/client.ts: -------------------------------------------------------------------------------- 1 | import * as Prisma from "@prisma/client"; 2 | 3 | let PrismaPkg = Prisma; 4 | 5 | if (typeof Prisma.PrismaClient !== "function") { 6 | PrismaPkg = (Prisma as any).default; 7 | } 8 | 9 | const { PrismaClient } = PrismaPkg; 10 | 11 | export const prisma = new PrismaClient(); 12 | -------------------------------------------------------------------------------- /src/lib/database/models/OfflineSession.ts: -------------------------------------------------------------------------------- 1 | import { prisma } from "$lib/database/client"; 2 | 3 | export async function getOfflineToken(shop_name: string) { 4 | try { 5 | const shop = await prisma.shop.findUnique({ 6 | where: { 7 | name: shop_name, 8 | }, 9 | include: { 10 | offline_session: true, 11 | }, 12 | }); 13 | 14 | return shop.offline_session.accessToken; 15 | } catch (error) { 16 | return null; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/lib/database/models/Shop.ts: -------------------------------------------------------------------------------- 1 | import { prisma } from "$lib/database/client" 2 | import type { Shop } from "@prisma/client" 3 | 4 | export async function getShopById(id: string): Promise { 5 | return prisma.shop.findUnique({ 6 | where: { 7 | id, 8 | }, 9 | }) 10 | } 11 | 12 | export async function getShopByName(name: string): Promise { 13 | return prisma.shop.findUnique({ 14 | where: { 15 | name, 16 | }, 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /src/lib/shopify/app-bridge.ts: -------------------------------------------------------------------------------- 1 | import type { AppConfigV1, AppConfigV2, ClientApplication } from "@shopify/app-bridge" 2 | import AppBridge from "@shopify/app-bridge" 3 | import { Redirect } from "@shopify/app-bridge/actions" 4 | 5 | // @ts-ignore 6 | const createApp = typeof AppBridge === "function" ? AppBridge : AppBridge.default 7 | 8 | export function initAppBridge (shop: string, host: string) { 9 | const apiKey = import.meta.env.VITE_SHOPIFY_API_KEY 10 | const redirectUri = `${ import.meta.env.VITE_SHOPIFY_HOST }/auth/callback` 11 | const permissionUrl = `https://${ shop }/admin/oauth/authorize?client_id=${ apiKey }&scope=read_products,read_content&redirect_uri=${ redirectUri }` 12 | 13 | if (host) { 14 | // Redirect to the app page if the app is already authorized 15 | createApp({ 16 | apiKey : import.meta.env.VITE_SHOPIFY_API_KEY, 17 | host, 18 | forceRedirect: true, 19 | }) 20 | } else { 21 | // If the current window is the 'parent', change the URL by setting location.href 22 | if (window.top === window.self) { 23 | window.location.assign(permissionUrl) 24 | } else { 25 | // If the current window is the 'child', 26 | // change the parent's URL with Shopify App Bridge's Redirect action 27 | const app = createApp({ 28 | apiKey: apiKey, 29 | host : host, 30 | }) 31 | 32 | Redirect.create(app).dispatch(Redirect.Action.REMOTE, permissionUrl) 33 | } 34 | } 35 | } 36 | 37 | export function getApp (shop = null, host = null): ClientApplication { 38 | if (!shop || !host) { 39 | const params = new URLSearchParams(location.search) 40 | shop = params.get("shop") 41 | host = params.get("host") 42 | } 43 | 44 | return createApp({ 45 | apiKey : import.meta.env.VITE_SHOPIFY_API_KEY, 46 | shopOrigin : shop, 47 | host, 48 | forceRedirect: false, 49 | } as AppConfigV1 & AppConfigV2) 50 | } 51 | -------------------------------------------------------------------------------- /src/lib/shopify/config.ts: -------------------------------------------------------------------------------- 1 | import type { Shop } from "@prisma/client" 2 | import type { AuthValidationResult, RegisterReturn } from "sveltekit-shopify-api" 3 | import { AccessMode, ApiVersion, Shopify } from "sveltekit-shopify-api" 4 | import { prisma } from "../database/client" 5 | import { sessionStorage } from "./session-storage" 6 | import { processAppUninstalled, processProductDeleted, processProductUpdated } from "./webhooks" 7 | 8 | export const config = { 9 | accessMode : AccessMode.OFFLINE, 10 | keys : [process.env.SHOPIFY_API_SECRET], 11 | API_KEY : process.env.VITE_SHOPIFY_API_KEY, 12 | API_SECRET_KEY : process.env.SHOPIFY_API_SECRET, 13 | SCOPES : process.env.SCOPES.split(","), 14 | HOST_NAME : process.env.VITE_SHOPIFY_HOST.replace(/https:\/\//, ""), 15 | API_VERSION : ApiVersion.July21, 16 | IS_EMBEDDED_APP: true, 17 | LOG_FILE : "logs/shopify.log", 18 | SESSION_STORAGE: sessionStorage, 19 | afterAuth : async (result: AuthValidationResult) => { 20 | const { shop, accessToken, scope } = result.session 21 | const host = result.host 22 | 23 | const shopData: Shop = { 24 | id : undefined, 25 | name : shop, 26 | host, 27 | scope, 28 | installed: true, 29 | createdAt: undefined, 30 | updatedAt: undefined, 31 | } 32 | await prisma.shop.upsert({ 33 | where : { 34 | name: shop, 35 | }, 36 | update: shopData, 37 | create: shopData, 38 | }) 39 | 40 | const responses: RegisterReturn[] = await Promise.all(Object.keys(webhooks).map(webhook => Shopify.Webhooks.Registry.register(config, { 41 | shop, 42 | accessToken, 43 | path : "/webhooks", 44 | topic: webhook, 45 | }))) 46 | 47 | responses.flatMap(Object.entries).map(([webhook, res]) => { 48 | if (!res.success) { 49 | const message = `Failed to register ${ webhook } webhook: ${ res.result }` 50 | console.error(message) 51 | } else { 52 | console.log(`Registered ${ webhook } successfully`) 53 | } 54 | }) 55 | 56 | // Redirect to our SvelteKit app 🎉 57 | return new Response(null, { 58 | status : 301, 59 | headers: { 60 | location: `/?shop=${ shop }&host=${ host }`, 61 | }, 62 | }) 63 | }, 64 | } 65 | 66 | const webhooks = { 67 | "APP_UNINSTALLED": processAppUninstalled, 68 | "PRODUCTS_UPDATE": processProductUpdated, 69 | "PRODUCTS_DELETE": processProductDeleted, 70 | } 71 | 72 | Object.entries(webhooks).forEach(([webhook, handler]) => { 73 | Shopify.Webhooks.Registry.addHandler(webhook, { 74 | path : "/webhooks", 75 | webhookHandler: handler, 76 | }) 77 | }) 78 | -------------------------------------------------------------------------------- /src/lib/shopify/fetch.ts: -------------------------------------------------------------------------------- 1 | import { browser } from "$app/env" 2 | import { getApp } from "$lib/shopify/app-bridge" 3 | import { authenticatedFetch as shopifyFetch } from "@shopify/app-bridge-utils" 4 | import { Redirect } from "@shopify/app-bridge/actions/index.js" 5 | 6 | export function authenticatedFetch (fetchFn = fetch): (uri: RequestInfo, options?: RequestInit | undefined) => Promise { 7 | let shop, host 8 | 9 | if (browser) { 10 | const urlParams = new URLSearchParams(window.location.search) 11 | shop = urlParams.get("shop") 12 | host = urlParams.get("host") 13 | } 14 | 15 | const app = getApp(shop, host) 16 | 17 | const fetchFunction = shopifyFetch(app, fetchFn) 18 | 19 | return async (uri, options) => { 20 | const response = await fetchFunction(uri, options) 21 | if (response.headers.get("X-Shopify-API-Request-Failure-Reauthorize") === "1") { 22 | const authUrl = response.headers.get("X-Shopify-API-Request-Failure-Reauthorize-Url") 23 | if (window.top === window.self) { 24 | window.location.assign(`${ import.meta.env.VITE_SHOPIFY_HOST }${ authUrl }`) 25 | } else { 26 | Redirect.create(app) 27 | .dispatch(Redirect.Action.REMOTE, `${ import.meta.env.VITE_SHOPIFY_HOST }${ authUrl }`) 28 | } 29 | return null 30 | } 31 | 32 | return response 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /src/lib/shopify/graphql/client.ts: -------------------------------------------------------------------------------- 1 | import { authenticatedFetch } from "$lib/shopify/fetch" 2 | import { HttpLink, InMemoryCache } from "@apollo/client/core" 3 | import { SvelteApolloClient } from "svelte-apollo-client" 4 | 5 | const link = new HttpLink({ 6 | uri : "/graphql", 7 | fetch : authenticatedFetch(), 8 | fetchOptions: { 9 | credentials: "include", 10 | }, 11 | }) 12 | 13 | export const client = SvelteApolloClient({ 14 | link, 15 | cache: new InMemoryCache(), 16 | }) 17 | 18 | export async function query (q, options = {}): Promise { 19 | const op = client.query(q, options) 20 | 21 | return new Promise((resolve, reject) => { 22 | const unsub = op.subscribe(response => { 23 | if (!response.loading && !response.error) { 24 | unsub() 25 | resolve(response.data) 26 | } 27 | if (response.error) { 28 | unsub() 29 | reject(response.error) 30 | } 31 | }) 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /src/lib/shopify/graphql/node-client.ts: -------------------------------------------------------------------------------- 1 | import { GraphqlClient } from "sveltekit-shopify-api/dist/clients/graphql/index.js" 2 | import type { IShop } from "@interfaces/shop" 3 | import type { Session } from "sveltekit-shopify-api/dist/auth/session" 4 | import { createLogger } from "@utils/logger" 5 | import type { AuthConfig } from "sveltekit-shopify-api" 6 | 7 | const log = createLogger("APP:LOCALES") 8 | 9 | type ResponseBody = { 10 | data: T, 11 | errors: Array<{ 12 | message: string 13 | }> 14 | }; 15 | 16 | export async function query(config: AuthConfig, shop: IShop, session: Session, _query): Promise { 17 | const client = new GraphqlClient(config, shop.name, session.accessToken) 18 | try { 19 | const response = await client.query(config, { 20 | data: _query, 21 | }) 22 | const body: ResponseBody = response.body as any 23 | if (body.errors) { 24 | throw new Error(body.errors[0].message) 25 | } 26 | return body.data 27 | } catch (error) { 28 | log.error(error) 29 | throw error 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/lib/shopify/handler.ts: -------------------------------------------------------------------------------- 1 | import { getShopByName } from "$lib/database/models/Shop" 2 | import type { RequestEvent } from "@sveltejs/kit/types/private" 3 | import { AccessMode, Shopify } from "sveltekit-shopify-api" 4 | import { createHandler } from "sveltekit-shopify-auth" 5 | import { getOfflineToken } from "../database/models/OfflineSession" 6 | import { config } from "./config" 7 | import { verify } from "./verify" 8 | 9 | export async function handleShopifyAuth (event: RequestEvent) { 10 | const { url } = event 11 | const shop = url.searchParams.get("shop") 12 | 13 | if (url.pathname === "/") { 14 | const savedShop = shop && await getShopByName(shop) 15 | if (!savedShop) { 16 | return new Response(null, { 17 | status : 302, 18 | headers: { 19 | location: `/auth?shop=${ shop }`, 20 | }, 21 | }) 22 | } 23 | } 24 | 25 | if (shop && await getOfflineToken(shop)) { 26 | // Request online token if we already have an offline token 27 | config.accessMode = AccessMode.ONLINE 28 | } 29 | 30 | const authHandler = createHandler(config) 31 | 32 | const authResponse = await authHandler(event) 33 | if (authResponse) { 34 | return authResponse 35 | } 36 | 37 | if (event.url.pathname === "/webhooks") { 38 | return Shopify.Webhooks.Registry.process(config, event) 39 | } 40 | 41 | if (event.url.pathname === "/graphql") { 42 | return Shopify.Utils.graphqlProxy(config, event) 43 | } 44 | 45 | if (event.url.pathname === "/refresh-shopify-token") { 46 | // Reauthenticate app if the online token is not valid 47 | const response = await verify(config, event) 48 | return response || new Response("ok") 49 | } 50 | 51 | // if there is a hmac, validate it. Otherwise, validate the bearer token 52 | if (url.searchParams.get("hmac")) { 53 | if (!Shopify.Auth.validateHmac(config, event)) { 54 | return new Response(null, { 55 | status : 301, 56 | headers: { 57 | location: `/auth?shop=${ shop }`, 58 | }, 59 | }) 60 | } 61 | } else { 62 | const response = await verify(config, event) 63 | if (response) { 64 | return response 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/lib/shopify/session-storage.ts: -------------------------------------------------------------------------------- 1 | import { prisma } from "$lib/database/client" 2 | import { Shopify } from "sveltekit-shopify-api" 3 | import { Session } from "sveltekit-shopify-api/dist/auth/session/index.js" 4 | 5 | async function storeCallback (session: Session) { 6 | const { 7 | shop, 8 | id, 9 | state, 10 | isOnline, 11 | scope, 12 | expires: defaultExpires, 13 | accessToken, 14 | onlineAccessInfo, 15 | } = session 16 | 17 | const type = isOnline ? "onlineSession" : "offlineSession" 18 | 19 | try { 20 | let shopData = await prisma.shop.findFirst({ 21 | where: { 22 | name: shop, 23 | }, 24 | }) 25 | 26 | if (!shopData) { 27 | shopData = await prisma.shop.create({ 28 | data: { 29 | name: shop, 30 | }, 31 | }) 32 | } 33 | 34 | if (!shopData) { 35 | throw new Error(`Unable to create / find shop: ${ shop }`) 36 | } 37 | 38 | let expires: Date | undefined = defaultExpires || new Date() 39 | 40 | if (type === "onlineSession") { 41 | const id_user = onlineAccessInfo?.associated_user?.id ?? 0 42 | let onlineSession = null 43 | if (id_user) { 44 | onlineSession = await prisma.onlineSession.findFirst({ 45 | where: { 46 | id_user, 47 | }, 48 | }) 49 | } 50 | 51 | if (!onlineSession) { 52 | onlineSession = await prisma.onlineSession.findFirst({ 53 | where: { 54 | id_shop: shopData.id, 55 | }, 56 | }) 57 | } 58 | 59 | const primary_id = id.startsWith(shop) ? id : (onlineSession?.primary_id ?? "") 60 | const secondary_id = !id.startsWith(shop) ? id : (onlineSession?.secondary_id ?? "") 61 | 62 | expires = 63 | expires >= (onlineSession?.expires || new Date()) 64 | ? expires 65 | : onlineSession?.expires 66 | 67 | if (onlineSession) { 68 | await prisma.onlineSession.update({ 69 | where: { 70 | id: onlineSession.id, 71 | }, 72 | data : { 73 | id_shop : shopData.id, 74 | primary_id, 75 | secondary_id, 76 | id_user, 77 | state, 78 | scope, 79 | accessToken, 80 | expires, 81 | onlineAccessInfo: JSON.stringify(onlineAccessInfo), 82 | }, 83 | }) 84 | } else { 85 | await prisma.onlineSession.create({ 86 | data: { 87 | id_shop : shopData.id, 88 | primary_id, 89 | secondary_id, 90 | id_user, 91 | state, 92 | scope, 93 | accessToken, 94 | expires, 95 | onlineAccessInfo: JSON.stringify(onlineAccessInfo), 96 | }, 97 | }) 98 | } 99 | } 100 | 101 | if (type === "offlineSession") { 102 | await prisma.offlineSession.upsert({ 103 | where : { 104 | id, 105 | }, 106 | create: { 107 | id, 108 | id_shop: shopData.id, 109 | state, 110 | scope, 111 | accessToken, 112 | }, 113 | update: { 114 | id_shop: shopData.id, 115 | state, 116 | scope, 117 | accessToken, 118 | }, 119 | }) 120 | } 121 | 122 | return true 123 | } catch (error) { 124 | console.error(error) 125 | return false 126 | } 127 | 128 | return true 129 | } 130 | 131 | async function loadCallback (id: string) { 132 | const type = id.startsWith("offline_") ? "offlineSession" : "onlineSession" 133 | 134 | if (type === "onlineSession") { 135 | // delete expired sessions 136 | await prisma.onlineSession.deleteMany({ 137 | where: { 138 | expires: { 139 | lt: new Date(), 140 | }, 141 | }, 142 | }) 143 | 144 | const onlineSession = await prisma.onlineSession.findFirst({ 145 | where : { 146 | OR: [ 147 | { 148 | primary_id: id, 149 | }, 150 | { 151 | secondary_id: id, 152 | }, 153 | ], 154 | }, 155 | include: { 156 | shop: true, 157 | }, 158 | }) 159 | 160 | if (onlineSession) { 161 | const session = new Session(id, onlineSession.shop.name, onlineSession.state, true) 162 | session.accessToken = onlineSession.accessToken 163 | session.expires = onlineSession.expires 164 | session.scope = onlineSession.scope 165 | session.onlineAccessInfo = JSON.parse(onlineSession.onlineAccessInfo?.toString() ?? "{}") 166 | return session 167 | } 168 | } 169 | 170 | if (type === "offlineSession") { 171 | const offlineSession = await prisma.offlineSession.findUnique({ 172 | where : { id }, 173 | include: { 174 | shop: true, 175 | }, 176 | }) 177 | 178 | if (offlineSession) { 179 | const session = new Session(id, offlineSession.shop.name, offlineSession.state, false) 180 | session.accessToken = offlineSession.accessToken 181 | session.scope = offlineSession.scope 182 | return session 183 | } 184 | } 185 | return undefined 186 | } 187 | 188 | async function deleteCallback (id: string) { 189 | try { 190 | await prisma.onlineSession.delete({ 191 | where: { id }, 192 | }) 193 | await prisma.offlineSession.delete({ 194 | where: { id }, 195 | }) 196 | } catch (e) { 197 | return true 198 | } 199 | return true 200 | } 201 | 202 | export const sessionStorage = new Shopify.Session.CustomSessionStorage( 203 | storeCallback, 204 | loadCallback, 205 | deleteCallback, 206 | ) 207 | -------------------------------------------------------------------------------- /src/lib/shopify/verify.ts: -------------------------------------------------------------------------------- 1 | import { prisma } from "$lib/database/client" 2 | import type { RequestEvent } from "@sveltejs/kit/types/private" 3 | import type { AuthConfig } from "sveltekit-shopify-api" 4 | import { Shopify } from "sveltekit-shopify-api" 5 | import { verifyRequest } from "sveltekit-shopify-auth" 6 | 7 | export async function verify (config: AuthConfig, event: RequestEvent) { 8 | 9 | const verifyFn = verifyRequest({ returnHeader: true }) 10 | const response = await verifyFn(config, event) 11 | if (response.status !== 200) { 12 | return response 13 | } 14 | 15 | const session = await Shopify.Utils.loadCurrentSession(config, event) 16 | if (session) { 17 | event.locals.session = session 18 | event.locals.shop = await prisma.shop.findUnique({ 19 | where: { name: session.shop }, 20 | }) 21 | } 22 | 23 | return undefined 24 | } 25 | -------------------------------------------------------------------------------- /src/lib/shopify/webhooks.ts: -------------------------------------------------------------------------------- 1 | import { prisma } from "$lib/database/client" 2 | 3 | export async function processAppUninstalled (topic: string, shop_name: string, body: string) { 4 | const shop = await prisma.shop.findUnique({ 5 | where: { name: shop_name }, 6 | }) 7 | 8 | if (!shop) { 9 | throw new Error("Access denied") 10 | } 11 | 12 | await prisma.shop.delete({ 13 | where: { 14 | name: shop_name, 15 | }, 16 | }) 17 | 18 | } 19 | 20 | export async function processProductUpdated (topic: string, shop_name: string, body: string) { 21 | console.log(topic, shop_name, body) 22 | } 23 | 24 | export async function processProductDeleted (topic: string, shop_name: string, body: string) { 25 | console.log(topic, shop_name, body) 26 | } 27 | 28 | export async function processCustomersDataRequest (topic, shop_domain, body) { 29 | try { 30 | const { 31 | shop_domain, 32 | customer: { 33 | id, 34 | email, 35 | }, 36 | orders_requested, 37 | } = JSON.parse(body) 38 | // log event or send an email notification 39 | } catch (e) { 40 | console.error(e) 41 | } 42 | } 43 | 44 | export async function processCustomersRedact (topic, shop_domain, body) { 45 | try { 46 | const { 47 | shop_domain, 48 | customer: { 49 | id, 50 | email, 51 | }, 52 | orders_to_redact, 53 | } = JSON.parse(body) 54 | // log event or send an email notification 55 | } catch (e) { 56 | console.error(e) 57 | } 58 | } 59 | 60 | export async function processShopRedact (topic, shop, body) { 61 | try { 62 | const { shop_domain } = JSON.parse(body) 63 | // log event or send an email notification 64 | } catch (e) { 65 | console.error(e) 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/routes/__layout.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | {#if redirect} 24 |

Redirecting...

25 | {:else} 26 |
27 | 28 |
29 | 30 |
31 | 32 | 35 | 36 | 66 | {/if} 67 | -------------------------------------------------------------------------------- /src/routes/gdpr.ts: -------------------------------------------------------------------------------- 1 | import { config } from "$lib/shopify/config" 2 | import { processCustomersDataRequest, processCustomersRedact, processShopRedact } from "$lib/shopify/webhooks" 3 | import type { RequestHandler } from "@sveltejs/kit" 4 | import { Shopify } from "sveltekit-shopify-api" 5 | 6 | Shopify.Webhooks.Registry.addHandlers({ 7 | "CUSTOMERS_DATA_REQUEST": { 8 | path : "/gdpr", 9 | webhookHandler: processCustomersDataRequest, 10 | }, 11 | "CUSTOMERS_REDACT" : { 12 | path : "/gdpr", 13 | webhookHandler: processCustomersRedact, 14 | }, 15 | "SHOP_REDACT" : { 16 | path : "/gdpr", 17 | webhookHandler: processShopRedact, 18 | }, 19 | }) 20 | 21 | export const post: RequestHandler = async function (event) { 22 | try { 23 | return await Shopify.Webhooks.Registry.process(config, event) 24 | } catch (e) { 25 | return new Response("Access denied!", { 26 | status: 401, 27 | }) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/routes/index.svelte: -------------------------------------------------------------------------------- 1 | 41 | 42 | 43 | Home 44 | 45 | 46 |
47 |

48 |
49 | 50 | 51 | Welcome 52 | 53 |
54 | 55 | to your new
SvelteKit app 56 |

57 | 58 |

Congrats! Your app works 🎉

59 | 60 |
    61 |
  • The current shop is {shop.name}
  • 62 |
  • 63 | The app scopes are 64 |
      65 | {#each shop.scope.split(",") as scope} 66 |
    • {scope}
    • 67 | {/each} 68 |
    69 |
  • 70 |
71 | 72 |

73 | 74 | 75 |

76 | 77 | {#if infosPromise} 78 | {#await infosPromise} 79 |

Fetching infos...

80 | {:then {session, shop}} 81 | 82 |

83 | The session will expire in ⏳ {session.expires} seconds 84 |

85 | 86 |

87 | The app was first installed at ⏰ {new Date(shop.createdAt)} 88 |

89 | {/await} 90 | {/if} 91 | 92 | {#if productsPromise} 93 | {#await productsPromise} 94 |

Fetching products...

95 | {:then {products}} 96 |
    97 | {#if products.edges.length} 98 | {#each products.edges as {node: product}} 99 |
  • {product.title}
  • 100 | {/each} 101 | {:else} 102 | There are no products yet 103 | {/if} 104 |
105 | {/await} 106 | {/if} 107 |
108 | 109 | 137 | -------------------------------------------------------------------------------- /src/routes/index.ts: -------------------------------------------------------------------------------- 1 | import type { RequestHandler } from "@sveltejs/kit" 2 | import { getShopByName } from "../lib/database/models/Shop" 3 | 4 | export const get: RequestHandler = async function ({ url }) { 5 | const shop_name = url.searchParams.get("shop") 6 | const shop = await getShopByName(shop_name) 7 | 8 | return { 9 | body: { 10 | // ⚠️ For demo purposes only, remove sensitive information 11 | shop: { 12 | name : shop.name, 13 | scope: shop.scope, 14 | } 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/routes/info.ts: -------------------------------------------------------------------------------- 1 | import type { RequestHandler } from "@sveltejs/kit" 2 | 3 | export const get: RequestHandler = async function ({ locals }) { 4 | // You can read the shop info and the session info from the locals 5 | const { shop, session } = locals 6 | 7 | return { 8 | body: { 9 | shop: { 10 | createdAt: shop.createdAt, 11 | }, 12 | // ⚠️ For demo purposes only 13 | session: { 14 | expires: session.onlineAccessInfo.expires_in, 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unlocomqx/sveltekit-shopify-starter/342b442d7dcb3a998659027e626d60357fd8f040/static/favicon.png -------------------------------------------------------------------------------- /static/svelte-welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unlocomqx/sveltekit-shopify-starter/342b442d7dcb3a998659027e626d60357fd8f040/static/svelte-welcome.png -------------------------------------------------------------------------------- /static/svelte-welcome.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unlocomqx/sveltekit-shopify-starter/342b442d7dcb3a998659027e626d60357fd8f040/static/svelte-welcome.webp -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from "@sveltejs/adapter-node" 2 | import preprocess from "svelte-preprocess" 3 | 4 | /** @type {import("@sveltejs/kit").Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: preprocess(), 9 | 10 | kit: { 11 | adapter: adapter(), 12 | 13 | prerender: { 14 | default: false, 15 | enabled: false, 16 | }, 17 | 18 | vite: { 19 | server: { 20 | hmr: { 21 | // Necessary to avoid issues with https 22 | host: "localhost", 23 | protocol: "ws", 24 | }, 25 | }, 26 | } 27 | } 28 | } 29 | 30 | export default config 31 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["@prisma/client"] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@apollo/client@^3.5.10": 6 | version "3.5.10" 7 | resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.5.10.tgz#43463108a6e07ae602cca0afc420805a19339a71" 8 | integrity sha512-tL3iSpFe9Oldq7gYikZK1dcYxp1c01nlSwtsMz75382HcI6fvQXyFXUCJTTK3wgO2/ckaBvRGw7VqjFREdVoRw== 9 | dependencies: 10 | "@graphql-typed-document-node/core" "^3.0.0" 11 | "@wry/context" "^0.6.0" 12 | "@wry/equality" "^0.5.0" 13 | "@wry/trie" "^0.3.0" 14 | graphql-tag "^2.12.3" 15 | hoist-non-react-statics "^3.3.2" 16 | optimism "^0.16.1" 17 | prop-types "^15.7.2" 18 | symbol-observable "^4.0.0" 19 | ts-invariant "^0.9.4" 20 | tslib "^2.3.0" 21 | zen-observable-ts "^1.2.0" 22 | 23 | "@fontsource/fira-mono@^4.5.6": 24 | version "4.5.6" 25 | resolved "https://registry.yarnpkg.com/@fontsource/fira-mono/-/fira-mono-4.5.6.tgz#719b9c55fba655a4189477150fd5d89fac012ec3" 26 | integrity sha512-sEt0MoN25QabXfq4xrtOyHQT257hNkJwR2Z10Y3xH9dEqH6Zlr9id7biiI+nwX1nnhgaywpnc7UH1cv/8t0VLA== 27 | 28 | "@graphql-typed-document-node/core@^3.0.0": 29 | version "3.1.1" 30 | resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" 31 | integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== 32 | 33 | "@nodelib/fs.scandir@2.1.5": 34 | version "2.1.5" 35 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 36 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 37 | dependencies: 38 | "@nodelib/fs.stat" "2.0.5" 39 | run-parallel "^1.1.9" 40 | 41 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 42 | version "2.0.5" 43 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 44 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 45 | 46 | "@nodelib/fs.walk@^1.2.3": 47 | version "1.2.8" 48 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 49 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 50 | dependencies: 51 | "@nodelib/fs.scandir" "2.1.5" 52 | fastq "^1.6.0" 53 | 54 | "@prisma/client@^3.11.1": 55 | version "3.11.1" 56 | resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.11.1.tgz#bde6dec71ae133d04ce1c6658e3d76627a3c6dc7" 57 | integrity sha512-B3C7zQG4HbjJzUr2Zg9UVkBJutbqq9/uqkl1S138+keZCubJrwizx3RuIvGwI+s+pm3qbsyNqXiZgL3Ir0fSng== 58 | dependencies: 59 | "@prisma/engines-version" "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9" 60 | 61 | "@prisma/engines-version@3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9": 62 | version "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9" 63 | resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz#81a1835b495ad287ad7824dbd62f74e9eee90fb9" 64 | integrity sha512-HkcsDniA4iNb/gi0iuyOJNAM7nD/LwQ0uJm15v360O5dee3TM4lWdSQiTYBMK6FF68ACUItmzSur7oYuUZ2zkQ== 65 | 66 | "@prisma/engines@3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9": 67 | version "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9" 68 | resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz#09ac23f8f615a8586d8d44538060ada199fe872c" 69 | integrity sha512-MILbsGnvmnhCbFGa2/iSnsyGyazU3afzD7ldjCIeLIGKkNBMSZgA2IvpYsAXl+6qFHKGrS3B2otKfV31dwMSQw== 70 | 71 | "@rollup/pluginutils@^4.2.0": 72 | version "4.2.0" 73 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.0.tgz#a14bbd058fdbba0a5647143b16ed0d86fb60bd08" 74 | integrity sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA== 75 | dependencies: 76 | estree-walker "^2.0.1" 77 | picomatch "^2.2.2" 78 | 79 | "@shopify/app-bridge-utils@^2.0.21": 80 | version "2.0.21" 81 | resolved "https://registry.yarnpkg.com/@shopify/app-bridge-utils/-/app-bridge-utils-2.0.21.tgz#b4d4d6b663e4ecba6b7a546c351b8d58e24247be" 82 | integrity sha512-sInEoMmYXywSrXf8b3TowfGa4hh9ewkQtMA1TesVWxyDUnjBoOUli6synxzW+56V0H0xtCgc9tQCgwAHPoYMQg== 83 | dependencies: 84 | "@shopify/app-bridge" "^2.0.21" 85 | 86 | "@shopify/app-bridge@^2.0.21": 87 | version "2.0.21" 88 | resolved "https://registry.yarnpkg.com/@shopify/app-bridge/-/app-bridge-2.0.21.tgz#4fcd5bc85ab10ffc189889ba338acfaa329e34e7" 89 | integrity sha512-X7GpBcMKic+9/j9nAadALqSStVSs9aoKBG0/jyYEQlcY4HwUQLJC5SrXubWQMskRQ19F8Oz2o2VcQT/zjTKJqg== 90 | dependencies: 91 | base64url "^3.0.1" 92 | 93 | "@shopify/network@^1.5.1": 94 | version "1.6.4" 95 | resolved "https://registry.yarnpkg.com/@shopify/network/-/network-1.6.4.tgz#fdfa8379cb6e06f05ee63d24aafcd6f8e275cb34" 96 | integrity sha512-V+//Et386LnYdtNhQ3e33AKYfU25XEt8H5XYeMqPvJZpVvC9Z1lHKQMpmM/zq13VXjPUjt9/sNxHxMP3I6cbJg== 97 | 98 | "@sveltejs/adapter-node@^1.0.0-next.73": 99 | version "1.0.0-next.73" 100 | resolved "https://registry.yarnpkg.com/@sveltejs/adapter-node/-/adapter-node-1.0.0-next.73.tgz#5de0e8c088b8d74a12bd19a8b6710cf5a54452ca" 101 | integrity sha512-eidd7u1dPHIaBKMjRePrxazUt+Mm/JpnaiKLzZJBdamhBiiYIb+epkPLLqfG5Oo346/0HLKwFRAM/FXn3u3BHQ== 102 | dependencies: 103 | tiny-glob "^0.2.9" 104 | 105 | "@sveltejs/kit@next": 106 | version "1.0.0-next.303" 107 | resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-1.0.0-next.303.tgz#062a8e2b2918499f84142a443c4a278a81d3a9c3" 108 | integrity sha512-WdxDc8OiF1WEd/bEza7CBdzA+3qIcCi1GKBj/gieKX9I3N8iDJt/Cg2POrLo9wQoJ47nZcAd1eOhfr7XEX1aIQ== 109 | dependencies: 110 | "@sveltejs/vite-plugin-svelte" "^1.0.0-next.32" 111 | sade "^1.7.4" 112 | vite "^2.8.0" 113 | 114 | "@sveltejs/vite-plugin-svelte@^1.0.0-next.32": 115 | version "1.0.0-next.40" 116 | resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.40.tgz#8f39cd5fa5400697bef1cefe112e77f08b90c23e" 117 | integrity sha512-DtXF01fYGEJkbC7GntU/7jaq9M1SwyyNCkbDA+cfQSXRpm3H7zbu0M80wSQBSpntdd+hgSdxKCxv4GgX6/zI6w== 118 | dependencies: 119 | "@rollup/pluginutils" "^4.2.0" 120 | debug "^4.3.3" 121 | kleur "^4.1.4" 122 | magic-string "^0.26.1" 123 | svelte-hmr "^0.14.11" 124 | 125 | "@types/cookiejar@*": 126 | version "2.1.2" 127 | resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" 128 | integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== 129 | 130 | "@types/jsonwebtoken@^8.5.0": 131 | version "8.5.8" 132 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz#01b39711eb844777b7af1d1f2b4cf22fda1c0c44" 133 | integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== 134 | dependencies: 135 | "@types/node" "*" 136 | 137 | "@types/node-fetch@^2.5.7": 138 | version "2.6.1" 139 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" 140 | integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== 141 | dependencies: 142 | "@types/node" "*" 143 | form-data "^3.0.0" 144 | 145 | "@types/node@*": 146 | version "17.0.23" 147 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" 148 | integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== 149 | 150 | "@types/pug@^2.0.4": 151 | version "2.0.6" 152 | resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" 153 | integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== 154 | 155 | "@types/sass@^1.16.0": 156 | version "1.43.1" 157 | resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.43.1.tgz#86bb0168e9e881d7dade6eba16c9ed6d25dc2f68" 158 | integrity sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g== 159 | dependencies: 160 | "@types/node" "*" 161 | 162 | "@types/superagent@*": 163 | version "4.1.15" 164 | resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.15.tgz#63297de457eba5e2bc502a7609426c4cceab434a" 165 | integrity sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ== 166 | dependencies: 167 | "@types/cookiejar" "*" 168 | "@types/node" "*" 169 | 170 | "@types/supertest@^2.0.10": 171 | version "2.0.12" 172 | resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" 173 | integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== 174 | dependencies: 175 | "@types/superagent" "*" 176 | 177 | "@wry/context@^0.6.0": 178 | version "0.6.1" 179 | resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" 180 | integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== 181 | dependencies: 182 | tslib "^2.3.0" 183 | 184 | "@wry/equality@^0.1.2": 185 | version "0.1.11" 186 | resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" 187 | integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== 188 | dependencies: 189 | tslib "^1.9.3" 190 | 191 | "@wry/equality@^0.5.0": 192 | version "0.5.2" 193 | resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73" 194 | integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== 195 | dependencies: 196 | tslib "^2.3.0" 197 | 198 | "@wry/trie@^0.3.0": 199 | version "0.3.1" 200 | resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139" 201 | integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== 202 | dependencies: 203 | tslib "^2.3.0" 204 | 205 | anymatch@~3.1.2: 206 | version "3.1.2" 207 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 208 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 209 | dependencies: 210 | normalize-path "^3.0.0" 211 | picomatch "^2.0.4" 212 | 213 | apollo-link-ws@^1.0.20: 214 | version "1.0.20" 215 | resolved "https://registry.yarnpkg.com/apollo-link-ws/-/apollo-link-ws-1.0.20.tgz#dfad44121f8445c6d7b7f8101a1b24813ba008ed" 216 | integrity sha512-mjSFPlQxmoLArpHBeUb2Xj+2HDYeTaJqFGOqQ+I8NVJxgL9lJe84PDWcPah/yMLv3rB7QgBDSuZ0xoRFBPlySw== 217 | dependencies: 218 | apollo-link "^1.2.14" 219 | tslib "^1.9.3" 220 | 221 | apollo-link@^1.2.14: 222 | version "1.2.14" 223 | resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" 224 | integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== 225 | dependencies: 226 | apollo-utilities "^1.3.0" 227 | ts-invariant "^0.4.0" 228 | tslib "^1.9.3" 229 | zen-observable-ts "^0.8.21" 230 | 231 | apollo-utilities@^1.3.0: 232 | version "1.3.4" 233 | resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" 234 | integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== 235 | dependencies: 236 | "@wry/equality" "^0.1.2" 237 | fast-json-stable-stringify "^2.0.0" 238 | ts-invariant "^0.4.0" 239 | tslib "^1.10.0" 240 | 241 | asynckit@^0.4.0: 242 | version "0.4.0" 243 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 244 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 245 | 246 | balanced-match@^1.0.0: 247 | version "1.0.2" 248 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 249 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 250 | 251 | base64url@^3.0.1: 252 | version "3.0.1" 253 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" 254 | integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== 255 | 256 | binary-extensions@^2.0.0: 257 | version "2.2.0" 258 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 259 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 260 | 261 | brace-expansion@^1.1.7: 262 | version "1.1.11" 263 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 264 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 265 | dependencies: 266 | balanced-match "^1.0.0" 267 | concat-map "0.0.1" 268 | 269 | braces@^3.0.2, braces@~3.0.2: 270 | version "3.0.2" 271 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 272 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 273 | dependencies: 274 | fill-range "^7.0.1" 275 | 276 | buffer-crc32@^0.2.5: 277 | version "0.2.13" 278 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 279 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 280 | 281 | buffer-equal-constant-time@1.0.1: 282 | version "1.0.1" 283 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 284 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 285 | 286 | callsites@^3.0.0: 287 | version "3.1.0" 288 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 289 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 290 | 291 | chokidar@^3.4.1: 292 | version "3.5.3" 293 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 294 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 295 | dependencies: 296 | anymatch "~3.1.2" 297 | braces "~3.0.2" 298 | glob-parent "~5.1.2" 299 | is-binary-path "~2.1.0" 300 | is-glob "~4.0.1" 301 | normalize-path "~3.0.0" 302 | readdirp "~3.6.0" 303 | optionalDependencies: 304 | fsevents "~2.3.2" 305 | 306 | combined-stream@^1.0.8: 307 | version "1.0.8" 308 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 309 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 310 | dependencies: 311 | delayed-stream "~1.0.0" 312 | 313 | concat-map@0.0.1: 314 | version "0.0.1" 315 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 316 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 317 | 318 | cookie@^0.4.2: 319 | version "0.4.2" 320 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" 321 | integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== 322 | 323 | cookies@^0.8.0: 324 | version "0.8.0" 325 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" 326 | integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== 327 | dependencies: 328 | depd "~2.0.0" 329 | keygrip "~1.1.0" 330 | 331 | debug@^4.3.3: 332 | version "4.3.4" 333 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 334 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 335 | dependencies: 336 | ms "2.1.2" 337 | 338 | delayed-stream@~1.0.0: 339 | version "1.0.0" 340 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 341 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 342 | 343 | depd@~2.0.0: 344 | version "2.0.0" 345 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 346 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 347 | 348 | detect-indent@^6.0.0: 349 | version "6.1.0" 350 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" 351 | integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== 352 | 353 | ecdsa-sig-formatter@1.0.11: 354 | version "1.0.11" 355 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 356 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 357 | dependencies: 358 | safe-buffer "^5.0.1" 359 | 360 | es6-promise@^3.1.2: 361 | version "3.3.1" 362 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" 363 | integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= 364 | 365 | esbuild-android-64@0.14.27: 366 | version "0.14.27" 367 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.27.tgz#b868bbd9955a92309c69df628d8dd1945478b45c" 368 | integrity sha512-LuEd4uPuj/16Y8j6kqy3Z2E9vNY9logfq8Tq+oTE2PZVuNs3M1kj5Qd4O95ee66yDGb3isaOCV7sOLDwtMfGaQ== 369 | 370 | esbuild-android-arm64@0.14.27: 371 | version "0.14.27" 372 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.27.tgz#e7d6430555e8e9c505fd87266bbc709f25f1825c" 373 | integrity sha512-E8Ktwwa6vX8q7QeJmg8yepBYXaee50OdQS3BFtEHKrzbV45H4foMOeEE7uqdjGQZFBap5VAqo7pvjlyA92wznQ== 374 | 375 | esbuild-darwin-64@0.14.27: 376 | version "0.14.27" 377 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.27.tgz#4dc7484127564e89b4445c0a560a3cb50b3d68e1" 378 | integrity sha512-czw/kXl/1ZdenPWfw9jDc5iuIYxqUxgQ/Q+hRd4/3udyGGVI31r29LCViN2bAJgGvQkqyLGVcG03PJPEXQ5i2g== 379 | 380 | esbuild-darwin-arm64@0.14.27: 381 | version "0.14.27" 382 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.27.tgz#469e59c665f84a8ed323166624c5e7b9b2d22ac1" 383 | integrity sha512-BEsv2U2U4o672oV8+xpXNxN9bgqRCtddQC6WBh4YhXKDcSZcdNh7+6nS+DM2vu7qWIWNA4JbRG24LUUYXysimQ== 384 | 385 | esbuild-freebsd-64@0.14.27: 386 | version "0.14.27" 387 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.27.tgz#895df03bf5f87094a56c9a5815bf92e591903d70" 388 | integrity sha512-7FeiFPGBo+ga+kOkDxtPmdPZdayrSzsV9pmfHxcyLKxu+3oTcajeZlOO1y9HW+t5aFZPiv7czOHM4KNd0tNwCA== 389 | 390 | esbuild-freebsd-arm64@0.14.27: 391 | version "0.14.27" 392 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.27.tgz#0b72a41a6b8655e9a8c5608f2ec1afdcf6958441" 393 | integrity sha512-8CK3++foRZJluOWXpllG5zwAVlxtv36NpHfsbWS7TYlD8S+QruXltKlXToc/5ZNzBK++l6rvRKELu/puCLc7jA== 394 | 395 | esbuild-linux-32@0.14.27: 396 | version "0.14.27" 397 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.27.tgz#43b8ba3803b0bbe7f051869c6a8bf6de1e95de28" 398 | integrity sha512-qhNYIcT+EsYSBClZ5QhLzFzV5iVsP1YsITqblSaztr3+ZJUI+GoK8aXHyzKd7/CKKuK93cxEMJPpfi1dfsOfdw== 399 | 400 | esbuild-linux-64@0.14.27: 401 | version "0.14.27" 402 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.27.tgz#dc8072097327ecfadba1735562824ce8c05dd0bd" 403 | integrity sha512-ESjck9+EsHoTaKWlFKJpPZRN26uiav5gkI16RuI8WBxUdLrrAlYuYSndxxKgEn1csd968BX/8yQZATYf/9+/qg== 404 | 405 | esbuild-linux-arm64@0.14.27: 406 | version "0.14.27" 407 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.27.tgz#c52b58cbe948426b1559910f521b0a3f396f10b8" 408 | integrity sha512-no6Mi17eV2tHlJnqBHRLekpZ2/VYx+NfGxKcBE/2xOMYwctsanCaXxw4zapvNrGE9X38vefVXLz6YCF8b1EHiQ== 409 | 410 | esbuild-linux-arm@0.14.27: 411 | version "0.14.27" 412 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.27.tgz#df869dbd67d4ee3a04b3c7273b6bd2b233e78a18" 413 | integrity sha512-JnnmgUBdqLQO9hoNZQqNHFWlNpSX82vzB3rYuCJMhtkuaWQEmQz6Lec1UIxJdC38ifEghNTBsF9bbe8dFilnCw== 414 | 415 | esbuild-linux-mips64le@0.14.27: 416 | version "0.14.27" 417 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.27.tgz#a2b646d9df368b01aa970a7b8968be6dd6b01d19" 418 | integrity sha512-NolWP2uOvIJpbwpsDbwfeExZOY1bZNlWE/kVfkzLMsSgqeVcl5YMen/cedRe9mKnpfLli+i0uSp7N+fkKNU27A== 419 | 420 | esbuild-linux-ppc64le@0.14.27: 421 | version "0.14.27" 422 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.27.tgz#9a21af766a0292578a3009c7408b8509cac7cefd" 423 | integrity sha512-/7dTjDvXMdRKmsSxKXeWyonuGgblnYDn0MI1xDC7J1VQXny8k1qgNp6VmrlsawwnsymSUUiThhkJsI+rx0taNA== 424 | 425 | esbuild-linux-riscv64@0.14.27: 426 | version "0.14.27" 427 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.27.tgz#344a27f91568056a5903ad5841b447e00e78d740" 428 | integrity sha512-D+aFiUzOJG13RhrSmZgrcFaF4UUHpqj7XSKrIiCXIj1dkIkFqdrmqMSOtSs78dOtObWiOrFCDDzB24UyeEiNGg== 429 | 430 | esbuild-linux-s390x@0.14.27: 431 | version "0.14.27" 432 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.27.tgz#73a7309bd648a07ef58f069658f989a5096130db" 433 | integrity sha512-CD/D4tj0U4UQjELkdNlZhQ8nDHU5rBn6NGp47Hiz0Y7/akAY5i0oGadhEIg0WCY/HYVXFb3CsSPPwaKcTOW3bg== 434 | 435 | esbuild-netbsd-64@0.14.27: 436 | version "0.14.27" 437 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.27.tgz#482a587cdbd18a6c264a05136596927deb46c30a" 438 | integrity sha512-h3mAld69SrO1VoaMpYl3a5FNdGRE/Nqc+E8VtHOag4tyBwhCQXxtvDDOAKOUQexBGca0IuR6UayQ4ntSX5ij1Q== 439 | 440 | esbuild-openbsd-64@0.14.27: 441 | version "0.14.27" 442 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.27.tgz#e99f8cdc63f1628747b63edd124d53cf7796468d" 443 | integrity sha512-xwSje6qIZaDHXWoPpIgvL+7fC6WeubHHv18tusLYMwL+Z6bEa4Pbfs5IWDtQdHkArtfxEkIZz77944z8MgDxGw== 444 | 445 | esbuild-sunos-64@0.14.27: 446 | version "0.14.27" 447 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.27.tgz#8611d825bcb8239c78d57452e83253a71942f45c" 448 | integrity sha512-/nBVpWIDjYiyMhuqIqbXXsxBc58cBVH9uztAOIfWShStxq9BNBik92oPQPJ57nzWXRNKQUEFWr4Q98utDWz7jg== 449 | 450 | esbuild-windows-32@0.14.27: 451 | version "0.14.27" 452 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.27.tgz#c06374206d4d92dd31d4fda299b09f51a35e82f6" 453 | integrity sha512-Q9/zEjhZJ4trtWhFWIZvS/7RUzzi8rvkoaS9oiizkHTTKd8UxFwn/Mm2OywsAfYymgUYm8+y2b+BKTNEFxUekw== 454 | 455 | esbuild-windows-64@0.14.27: 456 | version "0.14.27" 457 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.27.tgz#756631c1d301dfc0d1a887deed2459ce4079582f" 458 | integrity sha512-b3y3vTSl5aEhWHK66ngtiS/c6byLf6y/ZBvODH1YkBM+MGtVL6jN38FdHUsZasCz9gFwYs/lJMVY9u7GL6wfYg== 459 | 460 | esbuild-windows-arm64@0.14.27: 461 | version "0.14.27" 462 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.27.tgz#ad7e187193dcd18768b16065a950f4441d7173f4" 463 | integrity sha512-I/reTxr6TFMcR5qbIkwRGvldMIaiBu2+MP0LlD7sOlNXrfqIl9uNjsuxFPGEG4IRomjfQ5q8WT+xlF/ySVkqKg== 464 | 465 | esbuild@^0.14.14: 466 | version "0.14.27" 467 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.27.tgz#41fe0f1b6b68b9f77cac025009bc54bb96e616f1" 468 | integrity sha512-MZQt5SywZS3hA9fXnMhR22dv0oPGh6QtjJRIYbgL1AeqAoQZE+Qn5ppGYQAoHv/vq827flj4tIJ79Mrdiwk46Q== 469 | optionalDependencies: 470 | esbuild-android-64 "0.14.27" 471 | esbuild-android-arm64 "0.14.27" 472 | esbuild-darwin-64 "0.14.27" 473 | esbuild-darwin-arm64 "0.14.27" 474 | esbuild-freebsd-64 "0.14.27" 475 | esbuild-freebsd-arm64 "0.14.27" 476 | esbuild-linux-32 "0.14.27" 477 | esbuild-linux-64 "0.14.27" 478 | esbuild-linux-arm "0.14.27" 479 | esbuild-linux-arm64 "0.14.27" 480 | esbuild-linux-mips64le "0.14.27" 481 | esbuild-linux-ppc64le "0.14.27" 482 | esbuild-linux-riscv64 "0.14.27" 483 | esbuild-linux-s390x "0.14.27" 484 | esbuild-netbsd-64 "0.14.27" 485 | esbuild-openbsd-64 "0.14.27" 486 | esbuild-sunos-64 "0.14.27" 487 | esbuild-windows-32 "0.14.27" 488 | esbuild-windows-64 "0.14.27" 489 | esbuild-windows-arm64 "0.14.27" 490 | 491 | estree-walker@^2.0.1: 492 | version "2.0.2" 493 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 494 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 495 | 496 | fast-glob@^3.2.7: 497 | version "3.2.11" 498 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" 499 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 500 | dependencies: 501 | "@nodelib/fs.stat" "^2.0.2" 502 | "@nodelib/fs.walk" "^1.2.3" 503 | glob-parent "^5.1.2" 504 | merge2 "^1.3.0" 505 | micromatch "^4.0.4" 506 | 507 | fast-json-stable-stringify@^2.0.0: 508 | version "2.1.0" 509 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 510 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 511 | 512 | fastq@^1.6.0: 513 | version "1.13.0" 514 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 515 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 516 | dependencies: 517 | reusify "^1.0.4" 518 | 519 | fill-range@^7.0.1: 520 | version "7.0.1" 521 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 522 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 523 | dependencies: 524 | to-regex-range "^5.0.1" 525 | 526 | form-data@^3.0.0: 527 | version "3.0.1" 528 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" 529 | integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== 530 | dependencies: 531 | asynckit "^0.4.0" 532 | combined-stream "^1.0.8" 533 | mime-types "^2.1.12" 534 | 535 | fs.realpath@^1.0.0: 536 | version "1.0.0" 537 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 538 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 539 | 540 | fsevents@~2.3.2: 541 | version "2.3.2" 542 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 543 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 544 | 545 | function-bind@^1.1.1: 546 | version "1.1.1" 547 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 548 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 549 | 550 | glob-parent@^5.1.2, glob-parent@~5.1.2: 551 | version "5.1.2" 552 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 553 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 554 | dependencies: 555 | is-glob "^4.0.1" 556 | 557 | glob@^7.1.3: 558 | version "7.2.0" 559 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 560 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 561 | dependencies: 562 | fs.realpath "^1.0.0" 563 | inflight "^1.0.4" 564 | inherits "2" 565 | minimatch "^3.0.4" 566 | once "^1.3.0" 567 | path-is-absolute "^1.0.0" 568 | 569 | globalyzer@0.1.0: 570 | version "0.1.0" 571 | resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" 572 | integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== 573 | 574 | globrex@^0.1.2: 575 | version "0.1.2" 576 | resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" 577 | integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== 578 | 579 | graceful-fs@^4.1.3: 580 | version "4.2.9" 581 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" 582 | integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== 583 | 584 | graphql-tag@^2.12.3: 585 | version "2.12.6" 586 | resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" 587 | integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== 588 | dependencies: 589 | tslib "^2.1.0" 590 | 591 | graphql@^16.3.0: 592 | version "16.3.0" 593 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.3.0.tgz#a91e24d10babf9e60c706919bb182b53ccdffc05" 594 | integrity sha512-xm+ANmA16BzCT5pLjuXySbQVFwH3oJctUVdy81w1sV0vBU0KgDdBGtxQOUd5zqOBk/JayAFeG8Dlmeq74rjm/A== 595 | 596 | has@^1.0.3: 597 | version "1.0.3" 598 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 599 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 600 | dependencies: 601 | function-bind "^1.1.1" 602 | 603 | hoist-non-react-statics@^3.3.2: 604 | version "3.3.2" 605 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" 606 | integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== 607 | dependencies: 608 | react-is "^16.7.0" 609 | 610 | import-fresh@^3.2.1: 611 | version "3.3.0" 612 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 613 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 614 | dependencies: 615 | parent-module "^1.0.0" 616 | resolve-from "^4.0.0" 617 | 618 | inflight@^1.0.4: 619 | version "1.0.6" 620 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 621 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 622 | dependencies: 623 | once "^1.3.0" 624 | wrappy "1" 625 | 626 | inherits@2: 627 | version "2.0.4" 628 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 629 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 630 | 631 | is-binary-path@~2.1.0: 632 | version "2.1.0" 633 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 634 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 635 | dependencies: 636 | binary-extensions "^2.0.0" 637 | 638 | is-core-module@^2.8.1: 639 | version "2.8.1" 640 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" 641 | integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== 642 | dependencies: 643 | has "^1.0.3" 644 | 645 | is-extglob@^2.1.1: 646 | version "2.1.1" 647 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 648 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 649 | 650 | is-glob@^4.0.1, is-glob@~4.0.1: 651 | version "4.0.3" 652 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 653 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 654 | dependencies: 655 | is-extglob "^2.1.1" 656 | 657 | is-number@^7.0.0: 658 | version "7.0.0" 659 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 660 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 661 | 662 | "js-tokens@^3.0.0 || ^4.0.0": 663 | version "4.0.0" 664 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 665 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 666 | 667 | jsonwebtoken@^8.5.1: 668 | version "8.5.1" 669 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 670 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 671 | dependencies: 672 | jws "^3.2.2" 673 | lodash.includes "^4.3.0" 674 | lodash.isboolean "^3.0.3" 675 | lodash.isinteger "^4.0.4" 676 | lodash.isnumber "^3.0.3" 677 | lodash.isplainobject "^4.0.6" 678 | lodash.isstring "^4.0.1" 679 | lodash.once "^4.0.0" 680 | ms "^2.1.1" 681 | semver "^5.6.0" 682 | 683 | jwa@^1.4.1: 684 | version "1.4.1" 685 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 686 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 687 | dependencies: 688 | buffer-equal-constant-time "1.0.1" 689 | ecdsa-sig-formatter "1.0.11" 690 | safe-buffer "^5.0.1" 691 | 692 | jws@^3.2.2: 693 | version "3.2.2" 694 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 695 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 696 | dependencies: 697 | jwa "^1.4.1" 698 | safe-buffer "^5.0.1" 699 | 700 | keygrip@~1.1.0: 701 | version "1.1.0" 702 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" 703 | integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== 704 | dependencies: 705 | tsscmp "1.0.6" 706 | 707 | kleur@^4.1.4: 708 | version "4.1.4" 709 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" 710 | integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== 711 | 712 | lodash.includes@^4.3.0: 713 | version "4.3.0" 714 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 715 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 716 | 717 | lodash.isboolean@^3.0.3: 718 | version "3.0.3" 719 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 720 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 721 | 722 | lodash.isinteger@^4.0.4: 723 | version "4.0.4" 724 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 725 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 726 | 727 | lodash.isnumber@^3.0.3: 728 | version "3.0.3" 729 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 730 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 731 | 732 | lodash.isplainobject@^4.0.6: 733 | version "4.0.6" 734 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 735 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 736 | 737 | lodash.isstring@^4.0.1: 738 | version "4.0.1" 739 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 740 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 741 | 742 | lodash.once@^4.0.0: 743 | version "4.1.1" 744 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 745 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 746 | 747 | loose-envify@^1.4.0: 748 | version "1.4.0" 749 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 750 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 751 | dependencies: 752 | js-tokens "^3.0.0 || ^4.0.0" 753 | 754 | magic-string@^0.25.7: 755 | version "0.25.9" 756 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 757 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 758 | dependencies: 759 | sourcemap-codec "^1.4.8" 760 | 761 | magic-string@^0.26.1: 762 | version "0.26.1" 763 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.1.tgz#ba9b651354fa9512474199acecf9c6dbe93f97fd" 764 | integrity sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg== 765 | dependencies: 766 | sourcemap-codec "^1.4.8" 767 | 768 | merge2@^1.3.0: 769 | version "1.4.1" 770 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 771 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 772 | 773 | micromatch@^4.0.4: 774 | version "4.0.5" 775 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 776 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 777 | dependencies: 778 | braces "^3.0.2" 779 | picomatch "^2.3.1" 780 | 781 | mime-db@1.52.0: 782 | version "1.52.0" 783 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 784 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 785 | 786 | mime-types@^2.1.12: 787 | version "2.1.35" 788 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 789 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 790 | dependencies: 791 | mime-db "1.52.0" 792 | 793 | min-indent@^1.0.0: 794 | version "1.0.1" 795 | resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" 796 | integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== 797 | 798 | minimatch@^3.0.4: 799 | version "3.1.2" 800 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 801 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 802 | dependencies: 803 | brace-expansion "^1.1.7" 804 | 805 | minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: 806 | version "1.2.6" 807 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 808 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 809 | 810 | mkdirp@^0.5.1: 811 | version "0.5.6" 812 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 813 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 814 | dependencies: 815 | minimist "^1.2.6" 816 | 817 | mri@^1.1.0: 818 | version "1.2.0" 819 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" 820 | integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== 821 | 822 | ms@2.1.2: 823 | version "2.1.2" 824 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 825 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 826 | 827 | ms@^2.1.1: 828 | version "2.1.3" 829 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 830 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 831 | 832 | nanoid@^3.3.1: 833 | version "3.3.1" 834 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" 835 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== 836 | 837 | node-fetch@^2.6.1: 838 | version "2.6.7" 839 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" 840 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 841 | dependencies: 842 | whatwg-url "^5.0.0" 843 | 844 | normalize-path@^3.0.0, normalize-path@~3.0.0: 845 | version "3.0.0" 846 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 847 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 848 | 849 | object-assign@^4.1.1: 850 | version "4.1.1" 851 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 852 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 853 | 854 | once@^1.3.0: 855 | version "1.4.0" 856 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 857 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 858 | dependencies: 859 | wrappy "1" 860 | 861 | optimism@^0.16.1: 862 | version "0.16.1" 863 | resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" 864 | integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== 865 | dependencies: 866 | "@wry/context" "^0.6.0" 867 | "@wry/trie" "^0.3.0" 868 | 869 | parent-module@^1.0.0: 870 | version "1.0.1" 871 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 872 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 873 | dependencies: 874 | callsites "^3.0.0" 875 | 876 | path-is-absolute@^1.0.0: 877 | version "1.0.1" 878 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 879 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 880 | 881 | path-parse@^1.0.7: 882 | version "1.0.7" 883 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 884 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 885 | 886 | picocolors@^1.0.0: 887 | version "1.0.0" 888 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 889 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 890 | 891 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: 892 | version "2.3.1" 893 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 894 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 895 | 896 | postcss@^8.4.6: 897 | version "8.4.12" 898 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" 899 | integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== 900 | dependencies: 901 | nanoid "^3.3.1" 902 | picocolors "^1.0.0" 903 | source-map-js "^1.0.2" 904 | 905 | prisma@^3.11.1: 906 | version "3.11.1" 907 | resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.11.1.tgz#fff9c0bcf83cb30c2e1d650882d5eb3c5565e028" 908 | integrity sha512-aYn8bQwt1xwR2oSsVNHT4PXU7EhsThIwmpNB/MNUaaMx5OPLTro6VdNJe/sJssXFLxhamfWeMjwmpXjljo6xkg== 909 | dependencies: 910 | "@prisma/engines" "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9" 911 | 912 | prop-types@^15.7.2: 913 | version "15.8.1" 914 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" 915 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 916 | dependencies: 917 | loose-envify "^1.4.0" 918 | object-assign "^4.1.1" 919 | react-is "^16.13.1" 920 | 921 | queue-microtask@^1.2.2: 922 | version "1.2.3" 923 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 924 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 925 | 926 | react-is@^16.13.1, react-is@^16.7.0: 927 | version "16.13.1" 928 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 929 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 930 | 931 | readdirp@~3.6.0: 932 | version "3.6.0" 933 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 934 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 935 | dependencies: 936 | picomatch "^2.2.1" 937 | 938 | resolve-from@^4.0.0: 939 | version "4.0.0" 940 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 941 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 942 | 943 | resolve@^1.22.0: 944 | version "1.22.0" 945 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" 946 | integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== 947 | dependencies: 948 | is-core-module "^2.8.1" 949 | path-parse "^1.0.7" 950 | supports-preserve-symlinks-flag "^1.0.0" 951 | 952 | reusify@^1.0.4: 953 | version "1.0.4" 954 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 955 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 956 | 957 | rimraf@^2.5.2: 958 | version "2.7.1" 959 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 960 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 961 | dependencies: 962 | glob "^7.1.3" 963 | 964 | rollup@^2.59.0: 965 | version "2.70.1" 966 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e" 967 | integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA== 968 | optionalDependencies: 969 | fsevents "~2.3.2" 970 | 971 | run-parallel@^1.1.9: 972 | version "1.2.0" 973 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 974 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 975 | dependencies: 976 | queue-microtask "^1.2.2" 977 | 978 | sade@^1.7.4: 979 | version "1.8.1" 980 | resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" 981 | integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== 982 | dependencies: 983 | mri "^1.1.0" 984 | 985 | safe-buffer@^5.0.1: 986 | version "5.2.1" 987 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 988 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 989 | 990 | sander@^0.5.0: 991 | version "0.5.1" 992 | resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" 993 | integrity sha1-dB4kXiMfB8r7b98PEzrfohalAq0= 994 | dependencies: 995 | es6-promise "^3.1.2" 996 | graceful-fs "^4.1.3" 997 | mkdirp "^0.5.1" 998 | rimraf "^2.5.2" 999 | 1000 | semver@^5.6.0: 1001 | version "5.7.1" 1002 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1003 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1004 | 1005 | shopify-admin-api-typings@^1.2.2: 1006 | version "1.2.2" 1007 | resolved "https://registry.yarnpkg.com/shopify-admin-api-typings/-/shopify-admin-api-typings-1.2.2.tgz#7a3a088329c388d80d2e64040c3c4c8ccbe680f5" 1008 | integrity sha512-n9NSBPBKX+TSfAr8ibpXKoGdHCUCY6WBKV2FhD9xvjGG3DIqqUylqhC3OXKiWcrTQuyb3WnaRCvl16i3uhJMiQ== 1009 | 1010 | sorcery@^0.10.0: 1011 | version "0.10.0" 1012 | resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" 1013 | integrity sha1-iukK19fLBfxZ8asMY3hF1cFaUrc= 1014 | dependencies: 1015 | buffer-crc32 "^0.2.5" 1016 | minimist "^1.2.0" 1017 | sander "^0.5.0" 1018 | sourcemap-codec "^1.3.0" 1019 | 1020 | source-map-js@^1.0.2: 1021 | version "1.0.2" 1022 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1023 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1024 | 1025 | source-map@^0.7.3: 1026 | version "0.7.3" 1027 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 1028 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 1029 | 1030 | sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.8: 1031 | version "1.4.8" 1032 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 1033 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1034 | 1035 | strip-indent@^3.0.0: 1036 | version "3.0.0" 1037 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" 1038 | integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== 1039 | dependencies: 1040 | min-indent "^1.0.0" 1041 | 1042 | supports-preserve-symlinks-flag@^1.0.0: 1043 | version "1.0.0" 1044 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1045 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1046 | 1047 | svelte-apollo-client@^0.1.4: 1048 | version "0.1.4" 1049 | resolved "https://registry.yarnpkg.com/svelte-apollo-client/-/svelte-apollo-client-0.1.4.tgz#b481e927dcd20541f25b44ef717f31e6d06d9db6" 1050 | integrity sha512-g1gT4CLt9SbQbFtGp9zlnjAQRJM9uoQF3oWZNm1kv4QENWwkYqveqsAO1hwQVRV+oeFYbZNUHfZPQnGhJw65CA== 1051 | dependencies: 1052 | apollo-link-ws "^1.0.20" 1053 | ws "^7.5.3" 1054 | 1055 | svelte-check@^2.2.6: 1056 | version "2.4.6" 1057 | resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-2.4.6.tgz#dfdb6b4a68d9b2cececdedd4e17d895eb82314b3" 1058 | integrity sha512-luzdly7RJhyXucQe8ID/7CqDgXdMrPYXmyZBjCbp+cixzTopZotuWevrB5hWDOnOU19m2cyetigIIa7WDHnCmQ== 1059 | dependencies: 1060 | chokidar "^3.4.1" 1061 | fast-glob "^3.2.7" 1062 | import-fresh "^3.2.1" 1063 | minimist "^1.2.5" 1064 | picocolors "^1.0.0" 1065 | sade "^1.7.4" 1066 | source-map "^0.7.3" 1067 | svelte-preprocess "^4.0.0" 1068 | typescript "*" 1069 | 1070 | svelte-hmr@^0.14.11: 1071 | version "0.14.11" 1072 | resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.14.11.tgz#63d532dc9c2c849ab708592f034765fa2502e568" 1073 | integrity sha512-R9CVfX6DXxW1Kn45Jtmx+yUe+sPhrbYSUp7TkzbW0jI5fVPn6lsNG9NEs5dFg5qRhFNAoVdRw5qQDLALNKhwbQ== 1074 | 1075 | svelte-preprocess@^4.0.0, svelte-preprocess@^4.10.1: 1076 | version "4.10.4" 1077 | resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.10.4.tgz#308a410266bfc55b4e608da8d552b63580141260" 1078 | integrity sha512-fuwol0N4UoHsNQolLFbMqWivqcJ9N0vfWO9IuPAiX/5okfoGXURyJ6nECbuEIv0nU3M8Xe2I1ONNje2buk7l6A== 1079 | dependencies: 1080 | "@types/pug" "^2.0.4" 1081 | "@types/sass" "^1.16.0" 1082 | detect-indent "^6.0.0" 1083 | magic-string "^0.25.7" 1084 | sorcery "^0.10.0" 1085 | strip-indent "^3.0.0" 1086 | 1087 | svelte@^3.44.0: 1088 | version "3.46.4" 1089 | resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.46.4.tgz#0c46bc4a3e20a2617a1b7dc43a722f9d6c084a38" 1090 | integrity sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg== 1091 | 1092 | sveltekit-shopify-api@^1.3.7: 1093 | version "1.3.7" 1094 | resolved "https://registry.yarnpkg.com/sveltekit-shopify-api/-/sveltekit-shopify-api-1.3.7.tgz#56c0960b67e11157c1b3438e803a3fe85d55ab02" 1095 | integrity sha512-KJQxdFSq46ZXr1DNRFW3GzE4TV9ssfsDdtFr1rfS9+31MMWfbDc2QEbbfMLSItXOvDlBzwLTPPha2puJ3izz5g== 1096 | dependencies: 1097 | "@shopify/network" "^1.5.1" 1098 | "@types/jsonwebtoken" "^8.5.0" 1099 | "@types/node-fetch" "^2.5.7" 1100 | "@types/supertest" "^2.0.10" 1101 | cookie "^0.4.2" 1102 | cookies "^0.8.0" 1103 | jsonwebtoken "^8.5.1" 1104 | node-fetch "^2.6.1" 1105 | tslib "^2.0.3" 1106 | uuid "^8.3.1" 1107 | 1108 | sveltekit-shopify-auth@^1.6.2: 1109 | version "1.6.2" 1110 | resolved "https://registry.yarnpkg.com/sveltekit-shopify-auth/-/sveltekit-shopify-auth-1.6.2.tgz#175aee66d947f05fad7cd868c88eb1430116b0e8" 1111 | integrity sha512-dskzj43FJ9AZBLEqdlKRzt0zDzer897j62oAw7XzzIZgqzyJyHadOcF85dwUgRm6NYNOCWbVxXx9pZp+vSJTmg== 1112 | dependencies: 1113 | cookie "^0.4.2" 1114 | sveltekit-shopify-api "^1.3.7" 1115 | 1116 | symbol-observable@^4.0.0: 1117 | version "4.0.0" 1118 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" 1119 | integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== 1120 | 1121 | tiny-glob@^0.2.9: 1122 | version "0.2.9" 1123 | resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" 1124 | integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== 1125 | dependencies: 1126 | globalyzer "0.1.0" 1127 | globrex "^0.1.2" 1128 | 1129 | to-regex-range@^5.0.1: 1130 | version "5.0.1" 1131 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1132 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1133 | dependencies: 1134 | is-number "^7.0.0" 1135 | 1136 | tr46@~0.0.3: 1137 | version "0.0.3" 1138 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1139 | integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= 1140 | 1141 | ts-invariant@^0.4.0: 1142 | version "0.4.4" 1143 | resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" 1144 | integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== 1145 | dependencies: 1146 | tslib "^1.9.3" 1147 | 1148 | ts-invariant@^0.9.4: 1149 | version "0.9.4" 1150 | resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.4.tgz#42ac6c791aade267dd9dc65276549df5c5d71cac" 1151 | integrity sha512-63jtX/ZSwnUNi/WhXjnK8kz4cHHpYS60AnmA6ixz17l7E12a5puCWFlNpkne5Rl0J8TBPVHpGjsj4fxs8ObVLQ== 1152 | dependencies: 1153 | tslib "^2.1.0" 1154 | 1155 | tslib@^1.10.0, tslib@^1.9.3: 1156 | version "1.14.1" 1157 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1158 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1159 | 1160 | tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1: 1161 | version "2.3.1" 1162 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" 1163 | integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== 1164 | 1165 | tsscmp@1.0.6: 1166 | version "1.0.6" 1167 | resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" 1168 | integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== 1169 | 1170 | typescript@*, typescript@~4.6.2: 1171 | version "4.6.3" 1172 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" 1173 | integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== 1174 | 1175 | uuid@^8.3.1: 1176 | version "8.3.2" 1177 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 1178 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1179 | 1180 | vite@^2.8.0: 1181 | version "2.8.6" 1182 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.8.6.tgz#32d50e23c99ca31b26b8ccdc78b1d72d4d7323d3" 1183 | integrity sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug== 1184 | dependencies: 1185 | esbuild "^0.14.14" 1186 | postcss "^8.4.6" 1187 | resolve "^1.22.0" 1188 | rollup "^2.59.0" 1189 | optionalDependencies: 1190 | fsevents "~2.3.2" 1191 | 1192 | webidl-conversions@^3.0.0: 1193 | version "3.0.1" 1194 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1195 | integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= 1196 | 1197 | whatwg-url@^5.0.0: 1198 | version "5.0.0" 1199 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1200 | integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= 1201 | dependencies: 1202 | tr46 "~0.0.3" 1203 | webidl-conversions "^3.0.0" 1204 | 1205 | wrappy@1: 1206 | version "1.0.2" 1207 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1208 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1209 | 1210 | ws@^7.5.3: 1211 | version "7.5.7" 1212 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" 1213 | integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== 1214 | 1215 | zen-observable-ts@^0.8.21: 1216 | version "0.8.21" 1217 | resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" 1218 | integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== 1219 | dependencies: 1220 | tslib "^1.9.3" 1221 | zen-observable "^0.8.0" 1222 | 1223 | zen-observable-ts@^1.2.0: 1224 | version "1.2.3" 1225 | resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.3.tgz#c2f5ccebe812faf0cfcde547e6004f65b1a6d769" 1226 | integrity sha512-hc/TGiPkAWpByykMwDcem3SdUgA4We+0Qb36bItSuJC9xD0XVBZoFHYoadAomDSNf64CG8Ydj0Qb8Od8BUWz5g== 1227 | dependencies: 1228 | zen-observable "0.8.15" 1229 | 1230 | zen-observable@0.8.15, zen-observable@^0.8.0: 1231 | version "0.8.15" 1232 | resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" 1233 | integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== 1234 | --------------------------------------------------------------------------------