├── .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 | 
6 |
7 | With concise auth handling code
8 |
9 | 
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 |
12 |
13 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
125 |
--------------------------------------------------------------------------------
/src/lib/components/header/svelte-logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------