diff --git a/Dockerfile b/Dockerfile index c320e46..bcda83e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ -FROM --platform=$BUILDPLATFORM cgr.dev/chainguard/go:1.20 as build +FROM --platform=$BUILDPLATFORM cgr.dev/chainguard/wolfi-base as build +RUN apk update && apk add build-base git openssh go-1.20 WORKDIR /work diff --git a/convex.go b/convex.go index a6f8799..9a1f7b4 100644 --- a/convex.go +++ b/convex.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "io/fs" "net/http" "time" @@ -18,9 +19,7 @@ type LinkDocument struct { Owner string `json:"owner"` } -type StatsMap struct { - Stats [][2]interface{} `json:"$map"` -} +type StatsMap = map[string]interface{} type ConvexDB struct { url string @@ -28,8 +27,9 @@ type ConvexDB struct { } type UdfExecution struct { - Path string `json:"path"` - Args []interface{} `json:"args"` + Path string `json:"path"` + Args map[string]interface{} `json:"args"` + Format string `json:"format"` } type ConvexResponse struct { @@ -43,7 +43,7 @@ func NewConvexDB(url string, token string) *ConvexDB { } func (c *ConvexDB) mutation(args *UdfExecution) error { - args.Args = append(args.Args, c.token) + args.Args["token"] = c.token url := fmt.Sprintf("%s/api/mutation", c.url) encodedArgs, err := json.Marshal(args) if err != nil { @@ -73,7 +73,7 @@ func (c *ConvexDB) mutation(args *UdfExecution) error { } func (c *ConvexDB) query(args *UdfExecution) (json.RawMessage, error) { - args.Args = append(args.Args, c.token) + args.Args["token"] = c.token url := fmt.Sprintf("%s/api/query", c.url) encodedArgs, err := json.Marshal(args) if err != nil { @@ -84,7 +84,8 @@ func (c *ConvexDB) query(args *UdfExecution) (json.RawMessage, error) { return nil, err } if resp.StatusCode != 200 { - return nil, fmt.Errorf("unexpected status code from Convex: %d", resp.StatusCode) + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("unexpected status code from Convex: %d: %s", resp.StatusCode, body) } defer resp.Body.Close() @@ -103,7 +104,7 @@ func (c *ConvexDB) query(args *UdfExecution) (json.RawMessage, error) { } func (c *ConvexDB) LoadAll() ([]*Link, error) { - args := UdfExecution{"load:loadAll", []interface{}{}} + args := UdfExecution{"load:loadAll", map[string]interface{}{}, "json"} resp, err := c.query(&args) if err != nil { return nil, err @@ -130,7 +131,7 @@ func (c *ConvexDB) LoadAll() ([]*Link, error) { } func (c *ConvexDB) Load(short string) (*Link, error) { - args := UdfExecution{"load:loadOne", []interface{}{linkID(short)}} + args := UdfExecution{"load:loadOne", map[string]interface{}{"normalizedId": linkID(short)}, "json"} resp, err := c.query(&args) if err != nil { return nil, err @@ -166,12 +167,12 @@ func (c *ConvexDB) Save(link *Link) error { LastEdit: float64(link.LastEdit.Unix()), Owner: link.Owner, } - args := UdfExecution{"store", []interface{}{document}} + args := UdfExecution{"store", map[string]interface{}{"link": document}, "json"} return c.mutation(&args) } func (c *ConvexDB) LoadStats() (ClickStats, error) { - args := UdfExecution{"stats:loadStats", []interface{}{}} + args := UdfExecution{"stats:loadStats", map[string]interface{}{}, "json"} response, err := c.query(&args) if err != nil { return nil, err @@ -184,12 +185,12 @@ func (c *ConvexDB) LoadStats() (ClickStats, error) { return nil, err } clicks := make(ClickStats) - for _, entry := range stats.Stats { - num, err := entry[1].(json.Number).Float64() + for k, v := range stats { + num, err := v.(json.Number).Float64() if err != nil { return nil, err } - clicks[entry[0].(string)] = int(num) + clicks[k] = int(num) } return clicks, nil } @@ -199,6 +200,6 @@ func (c *ConvexDB) SaveStats(stats ClickStats) error { for id, clicks := range stats { mungedStats[linkID(id)] = clicks } - args := UdfExecution{"stats:saveStats", []interface{}{mungedStats}} + args := UdfExecution{"stats:saveStats", map[string]interface{}{"stats": mungedStats}, "json"} return c.mutation(&args) } diff --git a/convex.json b/convex.json index 581e06a..89700aa 100644 --- a/convex.json +++ b/convex.json @@ -1,7 +1,3 @@ { - "project": "golink", - "team": "convex", - "prodUrl": "https://merry-grouse-70.convex.cloud", - "functions": "src/convex/", - "authInfo": [] + "functions": "src/convex/" } diff --git a/convex_test.go b/convex_test.go index 16b6856..473648d 100644 --- a/convex_test.go +++ b/convex_test.go @@ -10,15 +10,29 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/joho/godotenv" ) func clear(c *ConvexDB) { - c.mutation(&UdfExecution{Path: "clear", Args: []interface{}{}}) + c.mutation(&UdfExecution{Path: "clear", Args: map[string]interface{}{}, Format: "json"}) +} + +func getDbUrl() string { + envLocal, err := godotenv.Read(".env.local") + if err != nil { + return "https://feeble-gull-946.convex.cloud" + } + url := envLocal["VITE_CONVEX_URL"] + if len(url) == 0 { + url = "https://feeble-gull-946.convex.cloud" + } + return url } // Test saving and loading links for SQLiteDB func Test_Convex_SaveLoadLinks(t *testing.T) { - db := NewConvexDB("https://feeble-gull-946.convex.cloud", "test") + url := getDbUrl() + db := NewConvexDB(url, "test") clear(db) defer clear(db) @@ -56,11 +70,11 @@ func Test_Convex_SaveLoadLinks(t *testing.T) { // Test saving and loading stats for SQLiteDB func Test_Convex_SaveLoadStats(t *testing.T) { - db := NewConvexDB("https://feeble-gull-946.convex.cloud", "test") + url := getDbUrl() + db := NewConvexDB(url, "test") clear(db) defer clear(db) - // preload some links links := []*Link{ {Short: "a"}, diff --git a/go.mod b/go.mod index 5b55bb8..bbb8f9c 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/illarion/gonotify v1.0.1 // indirect github.com/insomniacslk/dhcp v0.0.0-20221215072855-de60144f33f8 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/joho/godotenv v1.5.1 // indirect github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 // indirect github.com/jsimonetti/rtnetlink v1.1.2-0.20220408201609-d380b505068b // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect diff --git a/go.sum b/go.sum index 7e227c4..1cafdd8 100644 --- a/go.sum +++ b/go.sum @@ -115,6 +115,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 h1:elKwZS1OcdQ0WwEDBeqxKwb7WB62QX8bvZ/FJnVXIfk= diff --git a/package.json b/package.json index 24c9ae4..7d3c903 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "typescript": "^4.9.5" }, "dependencies": { - "convex": "^0.9.1" + "convex": "^1.3.1" } } diff --git a/src/convex/_generated/api.d.ts b/src/convex/_generated/api.d.ts index 0772113..c445921 100644 --- a/src/convex/_generated/api.d.ts +++ b/src/convex/_generated/api.d.ts @@ -1,32 +1,43 @@ /* eslint-disable */ /** - * Generated API. + * Generated `api` utility. * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@0.9.1. - * To regenerate, run `npx convex codegen`. + * Generated by convex@1.3.1. + * To regenerate, run `npx convex dev`. * @module */ -import type { ApiFromModules } from "convex/api"; +import type { + ApiFromModules, + FilterApi, + FunctionReference, +} from "convex/server"; import type * as clear from "../clear"; import type * as load from "../load"; import type * as stats from "../stats"; import type * as store from "../store"; /** - * A type describing your app's public Convex API. + * A utility for referencing Convex functions in your app's API. * - * This `API` type includes information about the arguments and return - * types of your app's query and mutation functions. - * - * This type should be used with type-parameterized classes like - * `ConvexReactClient` to create app-specific types. + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` */ -export type API = ApiFromModules<{ +declare const fullApi: ApiFromModules<{ clear: typeof clear; load: typeof load; stats: typeof stats; store: typeof store; }>; +export declare const api: FilterApi< + typeof fullApi, + FunctionReference +>; +export declare const internal: FilterApi< + typeof fullApi, + FunctionReference +>; diff --git a/src/convex/_generated/api.js b/src/convex/_generated/api.js new file mode 100644 index 0000000..3f4ee54 --- /dev/null +++ b/src/convex/_generated/api.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * Generated by convex@1.3.1. + * To regenerate, run `npx convex dev`. + * @module + */ + +import { anyApi } from "convex/server"; + +/** + * A utility for referencing Convex functions in your app's API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ +export const api = anyApi; +export const internal = anyApi; diff --git a/src/convex/_generated/dataModel.d.ts b/src/convex/_generated/dataModel.d.ts index 5916f17..68d087f 100644 --- a/src/convex/_generated/dataModel.d.ts +++ b/src/convex/_generated/dataModel.d.ts @@ -4,14 +4,14 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@0.9.1. - * To regenerate, run `npx convex codegen`. + * Generated by convex@1.3.1. + * To regenerate, run `npx convex dev`. * @module */ -import type { DataModelFromSchemaDefinition } from "convex/schema"; +import type { DataModelFromSchemaDefinition } from "convex/server"; import type { DocumentByName, TableNamesInDataModel } from "convex/server"; -import { GenericId, GenericIdConstructor } from "convex/values"; +import type { GenericId } from "convex/values"; import schema from "../schema"; /** @@ -24,7 +24,7 @@ export type TableNames = TableNamesInDataModel; * * @typeParam TableName - A string literal type of the table name (like "users"). */ -export type Document = DocumentByName< +export type Doc = DocumentByName< DataModel, TableName >; @@ -37,28 +37,13 @@ export type Document = DocumentByName< * * Documents can be loaded using `db.get(id)` in query and mutation functions. * - * **Important**: Use `myId.equals(otherId)` to check for equality. - * Using `===` will not work because two different instances of `Id` can refer - * to the same document. + * IDs are just strings at runtime, but this type can be used to distinguish them from other + * strings when type checking. * * @typeParam TableName - A string literal type of the table name (like "users"). */ export type Id = GenericId; -/** - * An identifier for a document in Convex. - * - * Convex documents are uniquely identified by their `Id`, which is accessible - * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids). - * - * Documents can be loaded using `db.get(id)` in query and mutation functions. - * - * **Important**: Use `myId.equals(otherId)` to check for equality. - * Using `===` will not work because two different instances of `Id` can refer - * to the same document. - */ -export declare const Id: GenericIdConstructor; - /** * A type describing your Convex data model. * diff --git a/src/convex/_generated/dataModel.js b/src/convex/_generated/dataModel.js deleted file mode 100644 index ffa1ff6..0000000 --- a/src/convex/_generated/dataModel.js +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint-disable */ -/** - * Generated data model types. - * - * THIS CODE IS AUTOMATICALLY GENERATED. - * - * Generated by convex@0.9.1. - * To regenerate, run `npx convex codegen`. - * @module - */ - -import { GenericId } from "convex/values"; - -/** - * An identifier for a document in Convex. - * - * Convex documents are uniquely identified by their `Id`, which is accessible - * on the `_id` field. To learn more, see [Data Modeling](https://docs.convex.dev/using/data-modeling). - * - * Documents can be loaded using `db.get(id)` in query and mutation functions. - * - * **Important**: Use `myId.equals(otherId)` to check for equality. - * Using `===` will not work because two different instances of `Id` can refer - * to the same document. - */ -export const Id = GenericId; diff --git a/src/convex/_generated/react.d.ts b/src/convex/_generated/react.d.ts deleted file mode 100644 index f1fa758..0000000 --- a/src/convex/_generated/react.d.ts +++ /dev/null @@ -1,167 +0,0 @@ -/* eslint-disable */ -/** - * Generated React hooks. - * - * THIS CODE IS AUTOMATICALLY GENERATED. - * - * Generated by convex@0.9.1. - * To regenerate, run `npx convex codegen`. - * @module - */ - -import type { OptimisticLocalStore as GenericOptimisticLocalStore } from "convex/browser"; -import type { - UseActionForAPI, - UseConvexForAPI, - UsePaginatedQueryForAPI, - UseMutationForAPI, - UseQueriesForAPI, - UseQueryForAPI, -} from "convex/react"; -import type { API } from "./api"; - -/** - * Load a reactive query within a React component. - * - * This React hook contains internal state that will cause a rerender whenever - * the query result changes. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @param name - The name of the query function. - * @param args - The arguments to the query function. - * @returns `undefined` if loading and the query's return value otherwise. - */ -export declare const useQuery: UseQueryForAPI; - -/** - * Construct a new {@link ReactMutation}. - * - * Mutation objects can be called like functions to request execution of the - * corresponding Convex function, or further configured with - * [optimistic updates](https://docs.convex.dev/using/optimistic-updates). - * - * The value returned by this hook is stable across renders, so it can be used - * by React dependency arrays and memoization logic relying on object identity - * without causing rerenders. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @param name - The name of the mutation. - * @returns The {@link ReactMutation} object with that name. - */ -export declare const useMutation: UseMutationForAPI; - -/** - * Construct a new {@link ReactAction}. - * - * Action objects can be called like functions to request execution of the - * corresponding Convex function. - * - * The value returned by this hook is stable across renders, so it can be used - * by React dependency arrays and memoization logic relying on object identity - * without causing rerenders. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @param name - The name of the action. - * @returns The {@link ReactAction} object with that name. - */ -export declare const useAction: UseActionForAPI; - -/** - * Get the {@link ConvexReactClient} within a React component. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @returns The active {@link ConvexReactClient} object, or `undefined`. - */ -export declare const useConvex: UseConvexForAPI; - -/** - * Load data reactively from a paginated query to a create a growing list. - * - * This can be used to power "infinite scroll" UIs. - * - * This hook must be used with Convex query functions that match - * {@link PaginatedQueryFunction}. This means they must: - * 1. Have a first argument must be an object containing `numItems` and `cursor`. - * 2. Return a {@link PaginationResult}. - * - * `usePaginatedQuery` concatenates all the pages - * of results into a single list and manages the continuation cursors when - * requesting more items. - * - * Example usage: - * ```typescript - * const { results, status, loadMore } = usePaginatedQuery( - * "listMessages", - * { initialNumItems: 5 }, - * "#general" - * ); - * ``` - * - * @param name - The name of the query function. - * @param options - An object specifying the `initialNumItems` to be loaded in - * the first page. - * @param args - The arguments to the query function, excluding the first. - * @returns A {@link UsePaginatedQueryResult} that includes the currently loaded - * items, the status of the pagination, and a `loadMore` function. - */ -export declare const usePaginatedQuery: UsePaginatedQueryForAPI; - -/** - * Load a variable number of reactive Convex queries. - * - * `useQueries` is similar to {@link useQuery} but it allows - * loading multiple queries which can be useful for loading a dynamic number - * of queries without violating the rules of React hooks. - * - * This hook accepts an object whose keys are identifiers for each query and the - * values are objects of `{ name: string, args: Value[] }`. The `name` is the - * name of the Convex query function to load, and the `args` are the arguments to - * that function. - * - * The hook returns an object that maps each identifier to the result of the query, - * `undefined` if the query is still loading, or an instance of `Error` if the query - * threw an exception. - * - * For example if you loaded a query like: - * ```typescript - * const results = useQueriesGeneric({ - * messagesInGeneral: { - * name: "listMessages", - * args: ["#general"] - * } - * }); - * ``` - * then the result would look like: - * ```typescript - * { - * messagesInGeneral: [{ - * channel: "#general", - * body: "hello" - * _id: ..., - * _creationTime: ... - * }] - * } - * ``` - * - * This React hook contains internal state that will cause a rerender - * whenever any of the query results change. - * - * Throws an error if not used under {@link ConvexProvider}. - * - * @param queries - An object mapping identifiers to objects of - * `{name: string, args: Value[] }` describing which query functions to fetch. - * @returns An object with the same keys as the input. The values are the result - * of the query function, `undefined` if it's still loading, or an `Error` if - * it threw an exception. - */ -export declare const useQueries: UseQueriesForAPI; - -/** - * A view of the query results currently in the Convex client for use within - * optimistic updates. - */ -export type OptimisticLocalStore = GenericOptimisticLocalStore; diff --git a/src/convex/_generated/react.js b/src/convex/_generated/react.js deleted file mode 100644 index 47fcd8c..0000000 --- a/src/convex/_generated/react.js +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable */ -/** - * Generated React hooks. - * - * THIS CODE IS AUTOMATICALLY GENERATED. - * - * Generated by convex@0.9.1. - * To regenerate, run `npx convex codegen`. - * @module - */ - -import { - useConvexGeneric, - useActionGeneric, - useMutationGeneric, - usePaginatedQueryGeneric, - useQueriesGeneric, - useQueryGeneric, -} from "convex/react"; - -/** - * Load a reactive query within a React component. - * - * This React hook contains internal state that will cause a rerender whenever - * the query result changes. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @param name - The name of the query function. - * @param args - The arguments to the query function. - * @returns `undefined` if loading and the query's return value otherwise. - */ -export const useQuery = useQueryGeneric; - -/** - * Construct a new {@link ReactMutation}. - * - * Mutation objects can be called like functions to request execution of the - * corresponding Convex function, or further configured with - * [optimistic updates](https://docs.convex.dev/using/optimistic-updates). - * - * The value returned by this hook is stable across renders, so it can be used - * by React dependency arrays and memoization logic relying on object identity - * without causing rerenders. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @param name - The name of the mutation. - * @returns The {@link ReactMutation} object with that name. - */ -export const useMutation = useMutationGeneric; - -/** - * Construct a new {@link ReactAction}. - * - * Convex function objects can be called like functions to request execution of - * the corresponding Convex function. - * - * The value returned by this hook is stable across renders, so it can be used - * by React dependency arrays and memoization logic relying on object identity - * without causing rerenders. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @param name - The name of the function. - * @returns The {@link ReactAction} object with that name. - */ -export const useAction = useActionGeneric; - -/** - * Get the {@link ConvexReactClient} within a React component. - * - * This relies on the {@link ConvexProvider} being above in the React component tree. - * - * @returns The active {@link ConvexReactClient} object, or `undefined`. - */ -export const useConvex = useConvexGeneric; - -/** - * Load data reactively from a paginated query to a create a growing list. - * - * This can be used to power "infinite scroll" UIs. - * - * This hook must be used with Convex query functions that match - * {@link PaginatedQueryFunction}. This means they must: - * 1. Have a first argument must be an object containing `numItems` and `cursor`. - * 2. Return a {@link PaginationResult}. - * - * `usePaginatedQuery` concatenates all the pages - * of results into a single list and manages the continuation cursors when - * requesting more items. - * - * Example usage: - * ```typescript - * const { results, status, loadMore } = usePaginatedQuery( - * "listMessages", - * { initialNumItems: 5 }, - * "#general" - * ); - * ``` - * - * If the query `name` or `args` change, the pagination state will be reset - * to the first page. Similarly, if any of the pages result in an InvalidCursor - * or QueryScannedTooManyDocuments error, the pagination state will also reset - * to the first page. - * - * To learn more about pagination, see [Paginated Queries](https://docs.convex.dev/using/pagination). - * - * @param name - The name of the query function. - * @param options - An object specifying the `initialNumItems` to be loaded in - * the first page. - * @param args - The arguments to the query function, excluding the first. - * @returns A {@link UsePaginatedQueryResult} that includes the currently loaded - * items, the status of the pagination, and a `loadMore` function. - */ -export const usePaginatedQuery = usePaginatedQueryGeneric; - -/** - * Load a variable number of reactive Convex queries. - * - * `useQueries` is similar to {@link useQuery} but it allows - * loading multiple queries which can be useful for loading a dynamic number - * of queries without violating the rules of React hooks. - * - * This hook accepts an object whose keys are identifiers for each query and the - * values are objects of `{ name: string, args: Value[] }`. The `name` is the - * name of the Convex query function to load, and the `args` are the arguments to - * that function. - * - * The hook returns an object that maps each identifier to the result of the query, - * `undefined` if the query is still loading, or an instance of `Error` if the query - * threw an exception. - * - * For example if you loaded a query like: - * ```typescript - * const results = useQueriesGeneric({ - * messagesInGeneral: { - * name: "listMessages", - * args: ["#general"] - * } - * }); - * ``` - * then the result would look like: - * ```typescript - * { - * messagesInGeneral: [{ - * channel: "#general", - * body: "hello" - * _id: ..., - * _creationTime: ... - * }] - * } - * ``` - * - * This React hook contains internal state that will cause a rerender - * whenever any of the query results change. - * - * Throws an error if not used under {@link ConvexProvider}. - * - * @param queries - An object mapping identifiers to objects of - * `{name: string, args: Value[] }` describing which query functions to fetch. - * @returns An object with the same keys as the input. The values are the result - * of the query function, `undefined` if it's still loading, or an `Error` if - * it threw an exception. - */ -export const useQueries = useQueriesGeneric; diff --git a/src/convex/_generated/server.d.ts b/src/convex/_generated/server.d.ts index 13a980f..729d94c 100644 --- a/src/convex/_generated/server.d.ts +++ b/src/convex/_generated/server.d.ts @@ -4,25 +4,23 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@0.9.1. - * To regenerate, run `npx convex codegen`. + * Generated by convex@1.3.1. + * To regenerate, run `npx convex dev`. * @module */ import { - ActionBuilderForAPI, - HttpEndpointBuilderForAPI, + ActionBuilder, + HttpActionBuilder, MutationBuilder, - QueryBuilderForDataModel, - ActionCtx as GenericActionCtx, - HttpEndpointCtx as GenericHttpEndpointCtx, - MutationCtx as GenericMutationCtx, - QueryCtx as GenericQueryCtx, - DatabaseReader as GenericDatabaseReader, - DatabaseWriter as GenericDatabaseWriter, + QueryBuilder, + GenericActionCtx, + GenericMutationCtx, + GenericQueryCtx, + GenericDatabaseReader, + GenericDatabaseWriter, } from "convex/server"; import type { DataModel } from "./dataModel.js"; -import type { API } from "./api.js"; /** * Define a query in this Convex app's public API. @@ -32,7 +30,17 @@ import type { API } from "./api.js"; * @param func - The query function. It receives a {@link QueryCtx} as its first argument. * @returns The wrapped query. Include this as an `export` to name it and make it accessible. */ -export declare const query: QueryBuilderForDataModel; +export declare const query: QueryBuilder; + +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export declare const internalQuery: QueryBuilder; /** * Define a mutation in this Convex app's public API. @@ -42,34 +50,50 @@ export declare const query: QueryBuilderForDataModel; * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. */ -export declare const mutation: MutationBuilder; +export declare const mutation: MutationBuilder; + +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export declare const internalMutation: MutationBuilder; /** * Define an action in this Convex app's public API. * * An action is a function which can execute any JavaScript code, including non-deterministic - * code and code with side-effects. Actions are often used to call into third-party services. - * Actions execute in a Node.js environment and can interact with the database indirectly by - * calling queries and mutations via the provided {@link ActionCtx} object. Actions need to be defined - * in the `/convex/actions directory`. Queries and mutations, on the other hand, must be defined - * outside of the `/convex/actions directory`. + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. * - * @param func - The action. It receives a {@link ActionCtx} as its first argument. + * @param func - The action. It receives an {@link ActionCtx} as its first argument. * @returns The wrapped action. Include this as an `export` to name it and make it accessible. */ -export declare const action: ActionBuilderForAPI; +export declare const action: ActionBuilder; /** - * Define an HTTP endpoint. + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export declare const internalAction: ActionBuilder; + +/** + * Define an HTTP action. * * This function will be used to respond to HTTP requests received by a Convex - * deployment if the requests matches the path and method where this endpoint - * is routed. Be sure to route your endpoint in `convex/http.js`. + * deployment if the requests matches the path and method where this action + * is routed. Be sure to route your action in `convex/http.js`. * - * @param func - The endpoint function. It receives a {@link HttpEndpointCtx} as its first argument. - * @returns The wrapped endpoint function. Import this function from `convex/http.js` and route it to hook it up. + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up. */ -export declare const httpEndpoint: HttpEndpointBuilderForAPI; +export declare const httpAction: HttpActionBuilder; /** * A set of services for use within Convex query functions. @@ -88,7 +112,7 @@ export type QueryCtx = GenericQueryCtx; * The mutation context is passed as the first argument to any Convex mutation * function run on the server. */ -export type MutationCtx = GenericMutationCtx; +export type MutationCtx = GenericMutationCtx; /** * A set of services for use within Convex action functions. @@ -96,15 +120,7 @@ export type MutationCtx = GenericMutationCtx; * The action context is passed as the first argument to any Convex action * function run on the server. */ -export type ActionCtx = GenericActionCtx; - -/** - * A set of services for use within Convex HTTP endpoints. - * - * The HttpEndpointCtx is passed as the first argument to any Convex HTTP - * endpoint run on the server. - */ -export type HttpEndpointCtx = GenericHttpEndpointCtx; +export type ActionCtx = GenericActionCtx; /** * An interface to read from the database within Convex query functions. diff --git a/src/convex/_generated/server.js b/src/convex/_generated/server.js index 7d1e750..fa2cb37 100644 --- a/src/convex/_generated/server.js +++ b/src/convex/_generated/server.js @@ -4,16 +4,19 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@0.9.1. - * To regenerate, run `npx convex codegen`. + * Generated by convex@1.3.1. + * To regenerate, run `npx convex dev`. * @module */ import { actionGeneric, - httpEndpointGeneric, + httpActionGeneric, queryGeneric, mutationGeneric, + internalActionGeneric, + internalMutationGeneric, + internalQueryGeneric, } from "convex/server"; /** @@ -26,6 +29,16 @@ import { */ export const query = queryGeneric; +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export const internalQuery = internalQueryGeneric; + /** * Define a mutation in this Convex app's public API. * @@ -36,26 +49,42 @@ export const query = queryGeneric; */ export const mutation = mutationGeneric; +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export const internalMutation = internalMutationGeneric; + /** * Define an action in this Convex app's public API. * * An action is a function which can execute any JavaScript code, including non-deterministic - * code and code with side-effects. Actions are often used to call into third-party services. - * Actions execute in a Node.js environment and can interact with the database indirectly by - * calling queries and mutations via the provided {@link ActionCtx} object. Actions need to be defined - * in the `/convex/actions directory`. Queries and mutations, on the other hand, must be defined - * outside of the `/convex/actions directory`. + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. * - * @param func - The action. It receives a {@link ActionCtx} as its first argument. + * @param func - The action. It receives an {@link ActionCtx} as its first argument. * @returns The wrapped action. Include this as an `export` to name it and make it accessible. */ export const action = actionGeneric; /** - * Define a Convex HTTP endpoint. + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export const internalAction = internalActionGeneric; + +/** + * Define a Convex HTTP action. * - * @param func - The function. It receives an {@link HttpEndpointCtx} as its first argument, and a `Request` object + * @param func - The function. It receives an {@link ActionCtx} as its first argument, and a `Request` object * as its second. * @returns The wrapped endpoint function. Route a URL path to this function in `convex/http.js`. */ -export const httpEndpoint = httpEndpointGeneric; +export const httpAction = httpActionGeneric; diff --git a/src/convex/clear.ts b/src/convex/clear.ts index ae3b2e4..0b0c33e 100644 --- a/src/convex/clear.ts +++ b/src/convex/clear.ts @@ -1,15 +1,20 @@ import { mutation } from "./_generated/server"; +import { v } from "convex/values"; -export default mutation(async ({ db }, token: string) => { +export default mutation({ + args: { token: v.string() }, + handler: async (ctx, { token }) => { if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { - throw new Error("Invalid authorization token"); + throw new Error("Invalid authorization token"); } let deletions = []; - for await (const link of db.query("links").fullTableScan()) { - deletions.push(db.delete(link._id)); + for await (const link of ctx.db.query("links").fullTableScan()) { + deletions.push(ctx.db.delete(link._id)); } - for await (const stat of db.query("stats").fullTableScan()) { - deletions.push(db.delete(stat._id)); + for await (const stat of ctx.db.query("stats").fullTableScan()) { + deletions.push(ctx.db.delete(stat._id)); } await Promise.all(deletions); -}); \ No newline at end of file + }, +}); + diff --git a/src/convex/load.ts b/src/convex/load.ts index a1810f9..d4e7213 100644 --- a/src/convex/load.ts +++ b/src/convex/load.ts @@ -1,24 +1,26 @@ import { query } from "./_generated/server"; -import { Document } from "./_generated/dataModel"; +import { v } from "convex/values"; -export const loadOne = query( - async ({ db }, normalizedId: string, token: string): Promise | null> => { +export const loadOne = query({ + args: { normalizedId: v.string(), token: v.string() }, + handler: async (ctx, { normalizedId, token }) => { if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { throw new Error("Invalid authorization token"); } - return await db + return await ctx.db .query("links") .withIndex("by_normalizedId", (q) => q.eq("normalizedId", normalizedId)) .first(); - } -); + }, +}); -export const loadAll = query( - async ({ db }, token: string): Promise>> => { +export const loadAll = query({ + args: { token: v.string() }, + handler: async (ctx, { token }) => { // TODO: Paginate if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { throw new Error("Invalid authorization token"); } - return await db.query("links").fullTableScan().collect(); - } -); + return await ctx.db.query("links").fullTableScan().collect(); + }, +}); diff --git a/src/convex/schema.ts b/src/convex/schema.ts index 81f6931..9915ece 100644 --- a/src/convex/schema.ts +++ b/src/convex/schema.ts @@ -1,16 +1,19 @@ -import { defineSchema, defineTable, s } from "convex/schema"; +import { defineSchema, defineTable } from "convex/server"; +import { v } from "convex/values"; + +export const LinkDoc = { + normalizedId: v.string(), + short: v.string(), + long: v.string(), + created: v.number(), + lastEdit: v.number(), + owner: v.string(), +}; export default defineSchema({ - links: defineTable({ - normalizedId: s.string(), - short: s.string(), - long: s.string(), - created: s.number(), - lastEdit: s.number(), - owner: s.string(), - }).index("by_normalizedId", ["normalizedId"]), + links: defineTable(LinkDoc).index("by_normalizedId", ["normalizedId"]), stats: defineTable({ - link: s.id("links"), - clicks: s.number(), + link: v.id("links"), + clicks: v.number(), }).index("byLink", ["link"]), }); diff --git a/src/convex/stats.ts b/src/convex/stats.ts index e9e878f..ac009d2 100644 --- a/src/convex/stats.ts +++ b/src/convex/stats.ts @@ -1,46 +1,53 @@ import { query, mutation } from "./_generated/server"; +import { v } from "convex/values"; -export const loadStats = query(async ({ db }, token: string) => { - if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { - throw new Error("Invalid authorization token"); - } - let stats = new Map(); - for await (const link of db.query("links").fullTableScan()) { - const clicks = ( - await db - .query("stats") - .withIndex("byLink", (q) => q.eq("link", link._id)) - .first() - )?.clicks; - if (clicks) { - stats.set(link.normalizedId, clicks); +export const loadStats = query({ + args: { token: v.string() }, + handler: async (ctx, { token }) => { + if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { + throw new Error("Invalid authorization token"); } - } - return stats; + let stats: Record = {}; + for await (const link of ctx.db.query("links").fullTableScan()) { + const clicks = ( + await ctx.db + .query("stats") + .withIndex("byLink", (q) => q.eq("link", link._id)) + .first() + )?.clicks; + if (clicks) { + stats[link.normalizedId] = clicks; + } + } + return stats; + }, }); -export const saveStats = mutation(async ({ db }, stats: Object, token: string) => { - if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { - throw new Error("Invalid authorization token"); - } - for (const [normalizedId, clicks] of Object.entries(stats)) { - const link = await db - .query("links") - .withIndex("by_normalizedId", (q) => q.eq("normalizedId", normalizedId)) - .first(); - if (link !== null) { - let stat = await db - .query("stats") - .withIndex("byLink", (q) => q.eq("link", link._id)) +export const saveStats = mutation({ + args: { stats: v.record(v.string(), v.number()), token: v.string() }, + handler: async (ctx, { stats, token }) => { + if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { + throw new Error("Invalid authorization token"); + } + for (const [normalizedId, clicks] of Object.entries(stats)) { + const link = await ctx.db + .query("links") + .withIndex("by_normalizedId", (q) => q.eq("normalizedId", normalizedId)) .first(); - if (stat !== null) { - stat.clicks += clicks; - await db.replace(stat._id, stat); + if (link !== null) { + let stat = await ctx.db + .query("stats") + .withIndex("byLink", (q) => q.eq("link", link._id)) + .first(); + if (stat !== null) { + stat.clicks += clicks; + await ctx.db.replace(stat._id, stat); + } else { + await ctx.db.insert("stats", { link: link._id, clicks: clicks }); + } } else { - await db.insert("stats", { link: link._id, clicks: clicks }); + console.warn("Writing stats for nonexistent link: ", normalizedId); } - } else { - console.warn("Writing stats for nonexistent link: ", normalizedId); } - } + }, }); diff --git a/src/convex/store.ts b/src/convex/store.ts index 2b5d619..183ade8 100644 --- a/src/convex/store.ts +++ b/src/convex/store.ts @@ -1,19 +1,23 @@ import { mutation } from "./_generated/server"; -import { Document } from "./_generated/dataModel"; +import { v } from "convex/values"; +import { LinkDoc } from "./schema"; -export default mutation(async ({ db }, link: Document<"links">, token: string) => { - if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { - throw new Error("Invalid authorization token"); - } - let existing = await db - .query("links") - .withIndex("by_normalizedId", (q) => - q.eq("normalizedId", link.normalizedId) - ) - .first(); - if (existing !== null) { - await db.replace(existing._id, link); - return; - } - await db.insert("links", link); +export default mutation({ + args: { link: v.object(LinkDoc), token: v.string() }, + handler: async (ctx, { link, token }) => { + if (token === "" || token !== process.env.CONVEX_AUTH_TOKEN) { + throw new Error("Invalid authorization token"); + } + let existing = await ctx.db + .query("links") + .withIndex("by_normalizedId", (q) => + q.eq("normalizedId", link.normalizedId) + ) + .first(); + if (existing !== null) { + await ctx.db.replace(existing._id, link); + return; + } + await ctx.db.insert("links", link); + }, }); diff --git a/yarn.lock b/yarn.lock index e55a2d2..c986d54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,577 +2,551 @@ # yarn lockfile v1 +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + "@nodelib/fs.scandir@2.1.5": - "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - "version" "2.1.5" + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" + run-parallel "^1.1.9" "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - "version" "2.0.5" + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - "version" "1.2.8" + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" + fastq "^1.6.0" "@tailwindcss/forms@^0.5.3": - "integrity" "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==" - "resolved" "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz" - "version" "0.5.3" + version "0.5.3" + resolved "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz" + integrity sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q== dependencies: - "mini-svg-data-uri" "^1.2.3" + mini-svg-data-uri "^1.2.3" "@tailwindcss/typography@^0.5.8": - "integrity" "sha512-xGQEp8KXN8Sd8m6R4xYmwxghmswrd0cPnNI2Lc6fmrC3OojysTBJJGSIVwPV56q4t6THFUK3HJ0EaWwpglSxWw==" - "resolved" "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.8.tgz" - "version" "0.5.8" + version "0.5.8" + resolved "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.8.tgz" + integrity sha512-xGQEp8KXN8Sd8m6R4xYmwxghmswrd0cPnNI2Lc6fmrC3OojysTBJJGSIVwPV56q4t6THFUK3HJ0EaWwpglSxWw== dependencies: - "lodash.castarray" "^4.4.0" - "lodash.isplainobject" "^4.0.6" - "lodash.merge" "^4.6.2" - "postcss-selector-parser" "6.0.10" + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + postcss-selector-parser "6.0.10" "@types/node@^18.14.2": - "integrity" "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz" - "version" "18.14.2" - -"acorn-node@^1.8.2": - "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==" - "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" - "version" "1.8.2" - dependencies: - "acorn" "^7.0.0" - "acorn-walk" "^7.0.0" - "xtend" "^4.0.2" - -"acorn-walk@^7.0.0": - "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" - "version" "7.2.0" - -"acorn@^7.0.0": - "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - "version" "7.4.1" - -"anymatch@~3.1.2": - "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"arg@^5.0.2": - "integrity" "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - "version" "5.0.2" - -"base64-js@^1.5.1": - "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - "version" "1.5.1" - -"binary-extensions@^2.0.0": - "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - "version" "2.2.0" - -"braces@^3.0.2", "braces@~3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"camelcase-css@^2.0.1": - "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - "resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - "version" "2.0.1" - -"chokidar@^3.5.3": - "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - "version" "3.5.3" - dependencies: - "anymatch" "~3.1.2" - "braces" "~3.0.2" - "glob-parent" "~5.1.2" - "is-binary-path" "~2.1.0" - "is-glob" "~4.0.1" - "normalize-path" "~3.0.0" - "readdirp" "~3.6.0" + version "18.14.2" + resolved "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz" + integrity sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA== + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" optionalDependencies: - "fsevents" "~2.3.2" - -"color-name@^1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" - -"convex@^0.9.1": - "integrity" "sha512-smz6JeXpZbkfkjq3xa7g73Z8YnGKDCNW44XYKPf434SqidHvtcb/JoJ2BbG5ArhTxnsOjkVZswztSOchQvLB4w==" - "resolved" "https://registry.npmjs.org/convex/-/convex-0.9.1.tgz" - "version" "0.9.1" - dependencies: - "base64-js" "^1.5.1" - "encoding" "^0.1.13" - "esbuild" "^0.15.16" - "node-fetch" "^2.6.1" - "uuid" "^9.0.0" - -"cssesc@^3.0.0": - "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - "version" "3.0.0" - -"defined@^1.0.0": - "integrity" "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==" - "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" - "version" "1.0.0" - -"detective@^5.2.1": - "integrity" "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==" - "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" - "version" "5.2.1" - dependencies: - "acorn-node" "^1.8.2" - "defined" "^1.0.0" - "minimist" "^1.2.6" - -"didyoumean@^1.2.2": - "integrity" "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - "resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - "version" "1.2.2" - -"dlv@^1.1.3": - "integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - "resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - "version" "1.1.3" - -"encoding@^0.1.0", "encoding@^0.1.13": - "integrity" "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==" - "resolved" "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" - "version" "0.1.13" - dependencies: - "iconv-lite" "^0.6.2" - -"esbuild-darwin-arm64@0.15.18": - "integrity" "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==" - "resolved" "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz" - "version" "0.15.18" - -"esbuild@^0.15.16": - "integrity" "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==" - "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz" - "version" "0.15.18" + fsevents "~2.3.2" + +color-name@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +convex@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/convex/-/convex-1.3.1.tgz" + integrity sha512-KV67OOpzcdSHDJoLX6srO+v0WCtOq1Zl4RQbZigt2oNBn9L+rf3lZD4zxJBVnqaaq+7vLkDr6v2FmLDaxAJcpA== + dependencies: + esbuild "^0.17.5" + jwt-decode "^3.1.2" + node-fetch "^2.6.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" + integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +esbuild@^0.17.5: + version "0.17.19" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== optionalDependencies: - "@esbuild/android-arm" "0.15.18" - "@esbuild/linux-loong64" "0.15.18" - "esbuild-android-64" "0.15.18" - "esbuild-android-arm64" "0.15.18" - "esbuild-darwin-64" "0.15.18" - "esbuild-darwin-arm64" "0.15.18" - "esbuild-freebsd-64" "0.15.18" - "esbuild-freebsd-arm64" "0.15.18" - "esbuild-linux-32" "0.15.18" - "esbuild-linux-64" "0.15.18" - "esbuild-linux-arm" "0.15.18" - "esbuild-linux-arm64" "0.15.18" - "esbuild-linux-mips64le" "0.15.18" - "esbuild-linux-ppc64le" "0.15.18" - "esbuild-linux-riscv64" "0.15.18" - "esbuild-linux-s390x" "0.15.18" - "esbuild-netbsd-64" "0.15.18" - "esbuild-openbsd-64" "0.15.18" - "esbuild-sunos-64" "0.15.18" - "esbuild-windows-32" "0.15.18" - "esbuild-windows-64" "0.15.18" - "esbuild-windows-arm64" "0.15.18" - -"fast-glob@^3.2.12": - "integrity" "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - "version" "3.2.12" + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + +fast-glob@^3.2.12: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - "glob-parent" "^5.1.2" - "merge2" "^1.3.0" - "micromatch" "^4.0.4" - -"fastq@^1.6.0": - "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - "version" "1.13.0" - dependencies: - "reusify" "^1.0.4" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: - "to-regex-range" "^5.0.1" + reusify "^1.0.4" -"fsevents@~2.3.2": - "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" - "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - "version" "2.3.2" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -"glob-parent@^5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob-parent@^6.0.2": - "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "is-glob" "^4.0.3" - -"glob-parent@~5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - "function-bind" "^1.1.1" - -"iconv-lite@^0.6.2": - "integrity" "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" - "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - "version" "0.6.3" - dependencies: - "safer-buffer" ">= 2.1.2 < 3.0.0" - -"is-binary-path@~2.1.0": - "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "binary-extensions" "^2.0.0" - -"is-core-module@^2.9.0": - "integrity" "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" - "version" "2.11.0" - dependencies: - "has" "^1.0.3" - -"is-extglob@^2.1.1": - "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" - -"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "is-extglob" "^2.1.1" - -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"lilconfig@^2.0.5", "lilconfig@^2.0.6": - "integrity" "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" - "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz" - "version" "2.0.6" - -"lodash.castarray@^4.4.0": - "integrity" "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==" - "resolved" "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz" - "version" "4.4.0" - -"lodash.isplainobject@^4.0.6": - "integrity" "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - "resolved" "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - "version" "4.0.6" - -"lodash.merge@^4.6.2": - "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - "version" "4.6.2" - -"merge2@^1.3.0": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" - -"micromatch@^4.0.4", "micromatch@^4.0.5": - "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - "version" "4.0.5" - dependencies: - "braces" "^3.0.2" - "picomatch" "^2.3.1" - -"mini-svg-data-uri@^1.2.3": - "integrity" "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==" - "resolved" "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" - "version" "1.4.4" - -"minimist@^1.2.6": - "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - "version" "1.2.6" - -"nanoid@^3.3.4": - "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" - "version" "3.3.4" - -"node-fetch@^2.6.1": - "integrity" "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==" - "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - "version" "2.6.7" - dependencies: - "whatwg-url" "^5.0.0" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" - -"object-hash@^3.0.0": - "integrity" "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - "version" "3.0.0" - -"path-parse@^1.0.7": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" - -"picocolors@^1.0.0": - "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - "version" "1.0.0" - -"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" - -"pify@^2.3.0": - "integrity" "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" - "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - "version" "2.3.0" - -"postcss-import@^14.1.0": - "integrity" "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==" - "resolved" "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" - "version" "14.1.0" - dependencies: - "postcss-value-parser" "^4.0.0" - "read-cache" "^1.0.0" - "resolve" "^1.1.7" - -"postcss-js@^4.0.0": - "integrity" "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==" - "resolved" "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "camelcase-css" "^2.0.1" - -"postcss-load-config@^3.1.4": - "integrity" "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==" - "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" - "version" "3.1.4" - dependencies: - "lilconfig" "^2.0.5" - "yaml" "^1.10.2" - -"postcss-nested@6.0.0": - "integrity" "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==" - "resolved" "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "postcss-selector-parser" "^6.0.10" - -"postcss-selector-parser@^6.0.10", "postcss-selector-parser@6.0.10": - "integrity" "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==" - "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" - "version" "6.0.10" - dependencies: - "cssesc" "^3.0.0" - "util-deprecate" "^1.0.2" - -"postcss-value-parser@^4.0.0", "postcss-value-parser@^4.2.0": - "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - "version" "4.2.0" - -"postcss@^8.0.0", "postcss@^8.2.14", "postcss@^8.3.3", "postcss@^8.4.18", "postcss@>=8.0.9": - "integrity" "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz" - "version" "8.4.18" - dependencies: - "nanoid" "^3.3.4" - "picocolors" "^1.0.0" - "source-map-js" "^1.0.2" - -"queue-microtask@^1.2.2": - "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - "version" "1.2.3" - -"quick-lru@^5.1.1": - "integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" - "version" "5.1.1" - -"read-cache@^1.0.0": - "integrity" "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==" - "resolved" "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "pify" "^2.3.0" - -"readdirp@~3.6.0": - "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - "version" "3.6.0" - dependencies: - "picomatch" "^2.2.1" - -"resolve@^1.1.7", "resolve@^1.22.1": - "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - "version" "1.22.1" - dependencies: - "is-core-module" "^2.9.0" - "path-parse" "^1.0.7" - "supports-preserve-symlinks-flag" "^1.0.0" - -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" - -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "queue-microtask" "^1.2.2" - -"safer-buffer@>= 2.1.2 < 3.0.0": - "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - "version" "2.1.2" - -"source-map-js@^1.0.2": - "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - "version" "1.0.2" - -"supports-preserve-symlinks-flag@^1.0.0": - "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - "version" "1.0.0" - -"tailwindcss@^3.2.2", "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1", "tailwindcss@>=3.0.0 || insiders": - "integrity" "sha512-c2GtSdqg+harR4QeoTmex0Ngfg8IIHNeLQH5yr2B9uZbZR1Xt1rYbjWOWTcj3YLTZhrmZnPowoQDbSRFyZHQ5Q==" - "resolved" "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.2.tgz" - "version" "3.2.2" - dependencies: - "arg" "^5.0.2" - "chokidar" "^3.5.3" - "color-name" "^1.1.4" - "detective" "^5.2.1" - "didyoumean" "^1.2.2" - "dlv" "^1.1.3" - "fast-glob" "^3.2.12" - "glob-parent" "^6.0.2" - "is-glob" "^4.0.3" - "lilconfig" "^2.0.6" - "micromatch" "^4.0.5" - "normalize-path" "^3.0.0" - "object-hash" "^3.0.0" - "picocolors" "^1.0.0" - "postcss" "^8.4.18" - "postcss-import" "^14.1.0" - "postcss-js" "^4.0.0" - "postcss-load-config" "^3.1.4" - "postcss-nested" "6.0.0" - "postcss-selector-parser" "^6.0.10" - "postcss-value-parser" "^4.2.0" - "quick-lru" "^5.1.1" - "resolve" "^1.22.1" - -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "is-number" "^7.0.0" - -"tr46@~0.0.3": - "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - "version" "0.0.3" - -"typescript@^4.9.5": - "integrity" "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" - "version" "4.9.5" - -"util-deprecate@^1.0.2": - "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"uuid@^9.0.0": - "integrity" "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" - "version" "9.0.0" - -"webidl-conversions@^3.0.0": - "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - "version" "3.0.1" - -"whatwg-url@^5.0.0": - "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" - "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "tr46" "~0.0.3" - "webidl-conversions" "^3.0.0" - -"xtend@^4.0.2": - "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - "version" "4.0.2" - -"yaml@^1.10.2": - "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - "version" "1.10.2" + is-glob "^4.0.1" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + +lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mini-svg-data-uri@^1.2.3: + version "1.4.4" + resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" + integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== + +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@6.0.10: + version "6.0.10" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.0.0, postcss@^8.2.14, postcss@^8.3.3, postcss@^8.4.18, postcss@>=8.0.9: + version "8.4.18" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz" + integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve@^1.1.7, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@^3.2.2, "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1", "tailwindcss@>=3.0.0 || insiders": + version "3.2.2" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.2.tgz" + integrity sha512-c2GtSdqg+harR4QeoTmex0Ngfg8IIHNeLQH5yr2B9uZbZR1Xt1rYbjWOWTcj3YLTZhrmZnPowoQDbSRFyZHQ5Q== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.18" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==