diff --git a/.prettierignore b/.prettierignore index d0b804d..d8d8c06 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ /dist /coverage +package-lock.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3445835 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "python.formatting.provider": "none" +} diff --git a/README.md b/README.md index d72537d..5260b27 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # The fal-serverless JS Client -![NPM client](https://img.shields.io/npm/v/@fal-ai/serverless-client?color=%237527D7&label=client) -![Build](https://img.shields.io/github/actions/workflow/status/fal-ai/serverless-js/build.yml) -![License](https://img.shields.io/github/license/fal-ai/serverless-js) +![@fal-ai/serverless-client npm package](https://img.shields.io/npm/v/@fal-ai/serverless-client?color=%237527D7&label=client&style=flat-square) +![@fal-ai/serverless-nextjs npm package](https://img.shields.io/npm/v/@fal-ai/serverless-nextjs?color=%237527D7&label=nextjs-proxy&style=flat-square) +![Build](https://img.shields.io/github/actions/workflow/status/fal-ai/serverless-js/build.yml?style=flat-square) +![License](https://img.shields.io/github/license/fal-ai/serverless-js?style=flat-square) ## About the project diff --git a/apps/demo-app/pages/api/_fal/proxy.ts b/apps/demo-app/pages/api/_fal/proxy.ts new file mode 100644 index 0000000..682f38b --- /dev/null +++ b/apps/demo-app/pages/api/_fal/proxy.ts @@ -0,0 +1,3 @@ +// @snippet:start(client.proxy.nextjs) +export { config, handler as default } from '@fal-ai/serverless-nextjs'; +// @snippet:end diff --git a/apps/demo-app/pages/api/generateImage.ts b/apps/demo-app/pages/api/generateImage.ts deleted file mode 100644 index 07bd888..0000000 --- a/apps/demo-app/pages/api/generateImage.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - generateImage, - GenerateImageInput, -} from '../../services/generateImage'; - -export default async function handler(req, res) { - if (req.method === 'POST') { - // not really type-safe, force cast because I can =P - const prompt = req.body as GenerateImageInput; - try { - const imageUrl = await generateImage(prompt); - res.status(200).json({ imageUrl }); - } catch (error) { - res - .status(500) - .json({ error: 'Failed to update image', causedBy: error }); - } - } else { - res.status(405).json({ error: 'Method not allowed' }); - } -} diff --git a/apps/demo-app/pages/diffusion.tsx b/apps/demo-app/pages/diffusion.tsx deleted file mode 100644 index 854d27e..0000000 --- a/apps/demo-app/pages/diffusion.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { useState } from 'react'; -import Image from 'next/image'; -import Head from 'next/head'; - -import { generateImage } from '../services/generateImage'; - -const IMG_PLACEHOLDER = '/placeholder@2x.jpg'; - -export default function Diffusion() { - const [prompt, setPrompt] = useState(''); - const [imageUrl, setImageUrl] = useState(IMG_PLACEHOLDER); - - const handleChange = (e) => { - setPrompt(e.target.value); - }; - - const handleSubmit = async (e) => { - e.preventDefault(); - // TODO replace this with direct serverless call once cors is solved - // const response = await fetch('/api/generateImage', { - // method: 'POST', - // headers: { - // 'Content-Type': 'application/json', - // }, - // body: JSON.stringify({ prompt }), - // }); - // const data = await response.json(); - // setImageUrl(data.imageUrl); - - const result = await generateImage({ prompt }); - setImageUrl(result); - }; - - return ( -
- - fal-serverless diffusion - - -
-

- fal-serverless diffusion -

-

Enter a prompt to generate the image

-
- - -
- -
- Generated Image -
-
-
- ); -} diff --git a/apps/demo-app/pages/index.tsx b/apps/demo-app/pages/index.tsx index 181a3e4..7e61668 100644 --- a/apps/demo-app/pages/index.tsx +++ b/apps/demo-app/pages/index.tsx @@ -1,21 +1,23 @@ -import { getJoke } from '../services/getJoke'; +import * as fal from '@fal-ai/serverless-client'; +import { withNextProxy } from '@fal-ai/serverless-nextjs'; +import { useMemo, useState } from 'react'; -export async function getServerSideProps(context) { - try { - const result = await getJoke(); - return { - props: { - ...result, - }, - }; - } catch (error) { - return { - props: { - error: error.message, - }, - }; - } -} +// @snippet:start(client.config) +fal.config({ + requestMiddleware: withNextProxy(), +}); +// @snippet:end + +// @snippet:start(client.result.type) +type Image = { + url: string; + file_name: string; + file_size: number; +}; +type Result = { + images: Image[]; +}; +// @snippet:end function Error(props) { if (!props.error) { @@ -26,43 +28,126 @@ function Error(props) { className="p-4 mb-4 text-sm text-red-800 rounded bg-red-50 dark:bg-gray-800 dark:text-red-400" role="alert" > - Error {props.error} + Error {props.error.message} ); } -export function Index(props) { - const handleClick = async (e) => { +const DEFAULT_PROMPT = "a city landscape of a cyberpunk metropolis, raining, purple, pink and teal neon lights, highly detailed, uhd"; + +export function Index() { + // @snippet:start(client.ui.state) + // Input state + const [prompt, setPrompt] = useState(DEFAULT_PROMPT); + // Result state + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [result, setResult] = useState(null); + const [logs, setLogs] = useState([]); + const [elapsedTime, setElapsedTime] = useState(0); + // @snippet:end + const image = useMemo(() => { + if (!result) { + return null; + } + return result.images[0]; + }, [result]); + + const reset = () => { + setLoading(false); + setError(null); + setResult(null); + setLogs([]); + setElapsedTime(0); + }; + + const handleOnClick = async (e) => { e.preventDefault(); + reset(); + // @snippet:start(client.queue.subscribe) + setLoading(true); + const start = Date.now(); try { - const joke = await getJoke(); - console.log(joke); - } catch (e) { - console.log(e); + const result: Result = await fal.queue.subscribe('110602490-lora', { + input: { + prompt, + model_name: 'stabilityai/stable-diffusion-xl-base-1.0', + image_size: 'square_hd', + }, + onQueueUpdate(status) { + setElapsedTime(Date.now() - start); + if (status.status === 'IN_PROGRESS') { + setLogs(status.logs.map((log) => log.message)); + } + }, + }); + setResult(result); + } catch (error) { + setError(error); + } finally { + setLoading(false); + setElapsedTime(Date.now() - start); } + // @snippet:end }; return ( -
-
+
+

- Hello fal-serverless + Hello fal

-

- This page can access fal-serverless functions when - it's rendering. -

- +
+ + setPrompt(e.target.value)} + onBlur={(e) => setPrompt(e.target.value.trim())} + /> +
-

- Here's a joke: {props.joke} -

+ + +
+
+ {image && ( + // eslint-disable-next-line @next/next/no-img-element + + )} +
+
+

JSON Result

+

+ {`Elapsed Time (seconds): ${(elapsedTime / 1000).toFixed(2)}`} +

+
+              {result
+                ? JSON.stringify(result, null, 2)
+                : '// result pending...'}
+            
+
+ +
+

Logs

+
+              {logs.filter(Boolean).join('\n')}
+            
+
+
); diff --git a/apps/demo-app/services/generateImage.ts b/apps/demo-app/services/generateImage.ts deleted file mode 100644 index 2ed4e27..0000000 --- a/apps/demo-app/services/generateImage.ts +++ /dev/null @@ -1,27 +0,0 @@ -import * as fal from '@fal-ai/serverless-client'; - -export type GenerateImageInput = { - prompt: string; -}; - -type ImageType = 'gif' | 'png' | 'jpg' | 'jpeg'; -type ImageDataUri = `data:image/${ImageType};base64,${string}`; - -fal.config({ - credentials: { - userId: '', - keyId: '', - keySecret: '', - }, -}); - -export async function generateImage( - input: GenerateImageInput -): Promise { - const result = await fal.run('a51c0ca0-9011-4ff0-8dc1-2ac0b42a9fd0', { - path: '/generate', - input, - }); - const data = result['raw_data']; - return `data:image/jpg;base64,${data}`; -} diff --git a/apps/demo-app/services/getJoke.ts b/apps/demo-app/services/getJoke.ts deleted file mode 100644 index e4afad2..0000000 --- a/apps/demo-app/services/getJoke.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as fal from '@fal-ai/serverless-client'; - -fal.config({ - host: 'gateway.alpha.fal.ai', - credentials: { - userId: process.env.FAL_USER_ID || '', - keyId: process.env.FAL_KEY_ID || '', - keySecret: process.env.FAL_KEY_SECRET || '', - }, -}); - -export type GetJokeInput = { - language?: string; -}; - -export function getJoke(input?: GetJokeInput): Promise<{ joke: string }> { - return fal.run('fastapi_get_joke', { input }); -} diff --git a/apps/demo-app/specs/index.spec.tsx b/apps/demo-app/specs/index.spec.tsx index 80e1079..5d65455 100644 --- a/apps/demo-app/specs/index.spec.tsx +++ b/apps/demo-app/specs/index.spec.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { render } from '@testing-library/react'; import Index from '../pages/index'; diff --git a/libs/client/package.json b/libs/client/package.json index b823b85..4de3d04 100644 --- a/libs/client/package.json +++ b/libs/client/package.json @@ -1,7 +1,7 @@ { "name": "@fal-ai/serverless-client", "description": "The fal serverless JS/TS client", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT", "repository": { "type": "git", diff --git a/libs/client/src/config.spec.ts b/libs/client/src/config.spec.ts index ef7458d..06d2255 100644 --- a/libs/client/src/config.spec.ts +++ b/libs/client/src/config.spec.ts @@ -7,11 +7,11 @@ describe('The config test suite', () => { credentials: { keyId: 'key-id', keySecret: 'key-secret', - userId: 'user-id', }, }; config(newConfig); const currentConfig = getConfig(); - expect(currentConfig).toEqual(newConfig); + expect(currentConfig.host).toBe(newConfig.host); + expect(currentConfig.credentials).toEqual(newConfig.credentials); }); }); diff --git a/libs/client/src/config.ts b/libs/client/src/config.ts index 403ae69..73d0955 100644 --- a/libs/client/src/config.ts +++ b/libs/client/src/config.ts @@ -1,21 +1,80 @@ +import type { RequestMiddleware } from './middleware'; +import type { ResponseHandler } from './response'; +import { defaultResponseHandler } from './response'; + export type Credentials = { keyId: string; keySecret: string; - userId: string; }; +export type CredentialsResolver = () => Credentials; + export type Config = { - credentials: Credentials; + credentials?: Credentials | CredentialsResolver; host?: string; + requestMiddleware?: RequestMiddleware; + responseHandler?: ResponseHandler; }; export type RequiredConfig = Required; +/** + * Checks if the required FAL environment variables are set. + * + * @returns `true` if the required environment variables are set, + * `false` otherwise. + */ +function hasEnvVariables(): boolean { + return ( + process && + process.env && + typeof process.env.FAL_KEY_ID !== 'undefined' && + typeof process.env.FAL_KEY_SECRET !== 'undefined' + ); +} + +export const credentialsFromEnv: CredentialsResolver = () => { + if (!hasEnvVariables()) { + return { + keyId: '', + keySecret: '', + }; + } + if (typeof window !== 'undefined') { + console.warn( + "The fal credentials are exposed in the browser's environment. " + + "That's not recommended for production use cases." + ); + } + + return { + keyId: process.env.FAL_KEY_ID || '', + keySecret: process.env.FAL_KEY_SECRET || '', + }; +}; + +/** + * Get the default host for the fal-serverless gateway endpoint. + * @private + * @returns the default host. Depending on the platform it can default to + * the environment variable `FAL_HOST`. + */ +function getDefaultHost(): string { + const host = 'gateway.alpha.fal.ai'; + if (process && process.env) { + return process.env.FAL_HOST || host; + } + return host; +} + const DEFAULT_CONFIG: Partial = { - host: 'gateway.shark.fal.ai', + host: getDefaultHost(), + credentials: credentialsFromEnv, + requestMiddleware: (request) => Promise.resolve(request), + responseHandler: defaultResponseHandler, }; -let configuration: RequiredConfig | undefined = undefined; +let configuration: RequiredConfig; /** * Configures the fal serverless client. @@ -32,8 +91,8 @@ export function config(config: Config) { * @returns the current client configuration. */ export function getConfig(): RequiredConfig { - if (typeof configuration === 'undefined') { - throw new Error('You must configure fal-serverless first.'); + if (!configuration) { + console.info('Using default configuration for the fal client'); } return configuration; } diff --git a/libs/client/src/function.spec.ts b/libs/client/src/function.spec.ts index 2cbd87e..5735c8d 100644 --- a/libs/client/src/function.spec.ts +++ b/libs/client/src/function.spec.ts @@ -5,7 +5,6 @@ import { buildUrl } from './function'; config({ host: 'gateway.alpha.fal.ai', credentials: { - userId: 'github|123456', keyId: 'a91ff3ca-71bc-4c8c-b400-859f6cbe804d', keySecret: '0123456789abcdfeghijklmnopqrstuv', }, @@ -13,15 +12,14 @@ config({ describe('The function test suite', () => { it('should build the URL with a function UUIDv4', () => { - const { credentials } = getConfig(); const id = randomUUID(); - const url = buildUrl(id); - expect(url).toMatch(`trigger/${credentials.userId}/${id}`); + const url = buildUrl(`12345/${id}`); + expect(url).toMatch(`trigger/12345/${id}`); }); it('should build the URL with a function alias', () => { const { host } = getConfig(); - const alias = 'some-alias'; + const alias = '12345-some-alias'; const url = buildUrl(alias); expect(url).toMatch(`${alias}.${host}`); }); diff --git a/libs/client/src/function.ts b/libs/client/src/function.ts index d0a5721..93fc3b2 100644 --- a/libs/client/src/function.ts +++ b/libs/client/src/function.ts @@ -1,7 +1,7 @@ -import fetch from 'cross-fetch'; import { getConfig } from './config'; import { getUserAgent, isBrowser } from './runtime'; -import { isUUIDv4 } from './utils'; +import { EnqueueResult, QueueStatus } from './types'; +import { isUUIDv4, isValidUrl } from './utils'; /** * The function input and other configuration when running @@ -22,7 +22,7 @@ type RunOptions = { /** * The HTTP method, defaults to `post`; */ - readonly method?: 'get' | 'post' | 'put' | 'delete'; + readonly method?: 'get' | 'post' | 'put' | 'delete' | string; }; /** @@ -38,150 +38,143 @@ export function buildUrl( id: string, options: RunOptions = {} ): string { - const { credentials, host } = getConfig(); + const { host } = getConfig(); const method = (options.method ?? 'post').toLowerCase(); - const path = options.path ?? ''; + const path = (options.path ?? '').replace(/^\//, '').replace(/\/{2,}/, '/'); const params = method === 'get' ? new URLSearchParams(options.input ?? {}) : undefined; - let queryParams = ''; - if (params) { - queryParams = `?${params.toString()}`; + // TODO: change to params.size once it's officially supported + const queryParams = params && params['size'] ? `?${params.toString()}` : ''; + const parts = id.split('/'); + + // if a fal.ai url is passed, just use it + if (isValidUrl(id)) { + const url = id.endsWith('/') ? id : `${id}/`; + return `${url}${path}${queryParams}`; } - if (isUUIDv4(id)) { - return `https://${host}/trigger/${credentials.userId}/${id}/${path}${queryParams}`; + + if (parts.length === 2 && isUUIDv4(parts[1])) { + return `https://${host}/trigger/${id}/${path}${queryParams}`; } - const userId = credentials.userId.replace(/github\|/g, ''); - return `https://${userId}-${id}.${host}/${path}${queryParams}`; + return `https://${id}.${host}/${path}${queryParams}`; } /** * Runs a fal serverless function identified by its `id`. * TODO: expand documentation and provide examples * - * @param id the registered function id + * @param id the registered function revision id or alias. * @returns the remote function output */ export async function run( id: string, options: RunOptions = {} ): Promise { - const { credentials } = getConfig(); + const { credentials, requestMiddleware, responseHandler } = getConfig(); const method = (options.method ?? 'post').toLowerCase(); - const userAgent = isBrowser ? {} : { 'User-Agent': getUserAgent() }; - const response = await fetch(buildUrl(id, options), { + const userAgent = isBrowser() ? {} : { 'User-Agent': getUserAgent() }; + const { keyId, keySecret } = + typeof credentials === 'function' ? credentials() : credentials; + + const { url, headers } = await requestMiddleware({ + url: buildUrl(id, options), + }); + const authHeader = + keyId && keySecret ? { Authorization: `Key ${keyId}:${keySecret}` } : {}; + const requestHeaders = { + ...authHeader, + Accept: 'application/json', + 'Content-Type': 'application/json', + ...userAgent, + ...(headers ?? {}), + } as HeadersInit; + const response = await fetch(url, { method, - headers: { - 'X-Fal-Key-Id': credentials.keyId, - 'X-Fal-Key-Secret': credentials.keySecret, - 'Content-Type': 'application/json', - ...userAgent, - }, - mode: 'cors', + headers: requestHeaders, + mode: 'same-origin', + credentials: 'same-origin', body: method !== 'get' && options.input ? JSON.stringify(options.input) : undefined, }); - - const { status, statusText } = response; - if (status < 200 || status >= 300) { - // TODO better error type so handlers can differentiate - throw new Error(statusText); - } - - // TODO move this elsewhere so it can be reused by websocket impl too - const contentType = response.headers.get('Content-Type'); - if (contentType?.includes('application/json')) { - return response.json(); - } - if (contentType?.includes('text/html')) { - return response.text() as Promise; - } - if (contentType?.includes('application/octet-stream')) { - return response.arrayBuffer() as Promise; - } - // TODO convert to either number or bool automatically - return response.text() as Promise; + return await responseHandler(response); } -/** - * An event contract for progress updates from the server function. - */ -export interface ProgressEvent { - readonly progress: number; - readonly partialData: T | undefined; -} - -/** - * Represents a result of a remote fal serverless function call. - * - * The contract allows developers to not only get the function - * result, but also track its progress and logs through event - * listeners. - * - * This flexibility enables developers to define complex / long-running functions - * but also simple ones with an unified developer experience. - */ -export interface FunctionExecution { - /** - * Listens to `progress` events. - * - * @param event of type `progress` - * @param handler the callback to handle in-progress data. - */ - on(event: 'progress', handler: (info: ProgressEvent) => void): void; - - /** - * Listens to `cancel` events. - * - * @param event of type `cancel`. - * @param handler the callback to handle the cancellation signal. - */ - on(event: 'cancel', handler: () => void): void; - - /** - * Listens to logging events. - * - * @param event of type `log` - * @param handler the callback to handle the forwarded `log` - */ - on(event: 'log', handler: (log: string) => void): void; - - /** - * Signals to the server that the execution should be cancelled. - * Once the server cancels the execution sucessfully, the `cancel` - * event will be fired. - * - * @see #on(event:) - */ - cancel(): Promise; +type QueueSubscribeOptions = { + pollInterval?: number; + onEnqueue?: (requestId: string) => void; + onQueueUpdate?: (status: QueueStatus) => void; +}; - /** - * Async function that represents the final result of the function call. - * - * ```ts - * const image = await execution.result(); - * ``` - * - * @returns Promise the final result. - * @throws in case the backing remote function raises an error. - */ - result(): Promise; +interface Queue { + submit(id: string, options: RunOptions): Promise; + status(id: string, requestId: string): Promise; + result(id: string, requestId: string): Promise; + subscribe( + id: string, + options: RunOptions & QueueSubscribeOptions + ): Promise; } -type ListenOptions = { - readonly input?: Input; -}; - /** - * TODO: document me - * - * @param id - * @param options + * The fal run queue module. It allows to submit a function to the queue and get its result + * on a separate call. This is useful for long running functions that can be executed + * asynchronously and not . */ -export function listen( - id: string, - options: ListenOptions -): FunctionExecution { - throw 'TODO: implement me!'; -} +export const queue: Queue = { + async submit( + id: string, + options: RunOptions + ): Promise { + return run(id, { ...options, method: 'post', path: '/fal/queue/submit/' }); + }, + async status(id: string, requestId: string): Promise { + return run(id, { + method: 'get', + path: `/fal/queue/requests/${requestId}/status`, + }); + }, + async result(id: string, requestId: string): Promise { + return run(id, { + method: 'get', + path: `/fal/queue/requests/${requestId}/response`, + }); + }, + async subscribe( + id: string, + options: RunOptions & QueueSubscribeOptions = {} + ): Promise { + const { request_id: requestId } = await queue.submit(id, options); + if (options.onEnqueue) { + options.onEnqueue(requestId); + } + return new Promise((resolve, reject) => { + let timeoutId: ReturnType; + const pollInterval = options.pollInterval ?? 1000; + const poll = async () => { + try { + const requestStatus = await queue.status(id, requestId); + if (options.onQueueUpdate) { + options.onQueueUpdate(requestStatus); + } + if (requestStatus.status === 'COMPLETED') { + clearTimeout(timeoutId); + try { + const result = await queue.result(id, requestId); + resolve(result); + } catch (error) { + reject(error); + } + return; + } + timeoutId = setTimeout(poll, pollInterval); + } catch (error) { + clearTimeout(timeoutId); + reject(error); + } + }; + timeoutId = setTimeout(poll, pollInterval); + }); + }, +}; diff --git a/libs/client/src/index.ts b/libs/client/src/index.ts index 094aed8..00a6eb5 100644 --- a/libs/client/src/index.ts +++ b/libs/client/src/index.ts @@ -1,4 +1,7 @@ -export { config } from './config'; +export { config, getConfig } from './config'; export type { Credentials } from './config'; -export { run } from './function'; -export type { FunctionExecution, ProgressEvent } from './function'; +export { queue, run } from './function'; +export { withMiddleware } from './middleware'; +export type { RequestMiddleware } from './middleware'; +export type { ResponseHandler } from './response'; +export type { QueueStatus } from './types'; diff --git a/libs/client/src/middleware.ts b/libs/client/src/middleware.ts new file mode 100644 index 0000000..98f79c3 --- /dev/null +++ b/libs/client/src/middleware.ts @@ -0,0 +1,34 @@ +/** + * A request configuration object. + * + * **Note:** This is a simplified version of the `RequestConfig` type from the + * `fetch` API. It contains only the properties that are relevant for the + * `fal-serverless` client. It also works around the fact that the `fetch` API + * `Request` does not support mutability, its clone method has critical limitations + * to our use case. + */ +export type RequestConfig = { + url: string; + headers?: Record; +}; + +export type RequestMiddleware = ( + request: RequestConfig +) => Promise; + +/** + * Setup a execution chain of middleware functions. + * + * @param middlewares one or more middleware functions. + * @returns a middleware function that executes the given middlewares in order. + */ +export function withMiddleware( + ...middlewares: RequestMiddleware[] +): RequestMiddleware { + return (config) => + middlewares.reduce( + (configPromise, middleware) => + configPromise.then((req) => middleware(req)), + Promise.resolve(config) + ); +} diff --git a/libs/client/src/response.ts b/libs/client/src/response.ts new file mode 100644 index 0000000..e972659 --- /dev/null +++ b/libs/client/src/response.ts @@ -0,0 +1,46 @@ +export type ResponseHandler = (response: Response) => Promise; + +type ApiErrorArgs = { + message: string; + status: number; + body?: any; +}; + +export class ApiError extends Error { + public readonly status: number; + public readonly body?: any; + constructor({ message, status, body }: ApiErrorArgs) { + super(message); + this.status = status; + this.body = body; + } +} + +export async function defaultResponseHandler( + response: Response +): Promise { + const { status, statusText } = response; + const contentType = response.headers.get('Content-Type'); + if (!response.ok) { + if (contentType?.includes('application/json')) { + const body = await response.json(); + throw new ApiError({ + message: body.message || statusText, + status, + body, + }); + } + throw new Error(`HTTP ${status}: ${statusText}`); + } + if (contentType?.includes('application/json')) { + return response.json() as Promise; + } + if (contentType?.includes('text/html')) { + return response.text() as Promise; + } + if (contentType?.includes('application/octet-stream')) { + return response.arrayBuffer() as Promise; + } + // TODO convert to either number or bool automatically + return response.text() as Promise; +} diff --git a/libs/client/src/types.ts b/libs/client/src/types.ts new file mode 100644 index 0000000..258c8e2 --- /dev/null +++ b/libs/client/src/types.ts @@ -0,0 +1,35 @@ +export type Result = { + result: T; +}; + +export type EnqueueResult = { + request_id: string; +}; + +// export type QueueStatus = { +// status: "IN_PROGRESS" | "COMPLETED"; +// queue: number; +// }; + +export type RequestLog = { + message: string; + level: 'STDERR' | 'STDOUT' | 'ERROR' | 'INFO' | 'WARN' | 'DEBUG'; + source: 'USER'; + timestamp: string; // Using string to represent date-time format, but you could also use 'Date' type if you're going to construct Date objects. +}; + +export type QueueStatus = + | { + status: 'IN_PROGRESS' | 'COMPLETED'; + response_url: string; + logs: RequestLog[]; + } + | { + status: 'IN_QUEUE'; + queue_position: number; + response_url: string; + }; + +export function isQueueStatus(obj: any): obj is QueueStatus { + return obj && obj.status && obj.response_url; +} diff --git a/libs/client/src/utils.ts b/libs/client/src/utils.ts index 177860a..2819323 100644 --- a/libs/client/src/utils.ts +++ b/libs/client/src/utils.ts @@ -6,3 +6,12 @@ export function isUUIDv4(id: string): boolean { ['8', '9', 'a', 'b'].includes(id[19]) ); } + +export function isValidUrl(url: string) { + try { + const parsedUrl = new URL(url); + return parsedUrl.hostname.endsWith('fal.ai'); + } catch (_) { + return false; + } +} diff --git a/libs/nextjs/.babelrc b/libs/nextjs/.babelrc new file mode 100644 index 0000000..9cbf979 --- /dev/null +++ b/libs/nextjs/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": [["@nrwl/js/babel", { "useBuiltIns": "usage" }]] +} diff --git a/libs/nextjs/.eslintrc.json b/libs/nextjs/.eslintrc.json new file mode 100644 index 0000000..9d9c0db --- /dev/null +++ b/libs/nextjs/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/libs/nextjs/README.md b/libs/nextjs/README.md new file mode 100644 index 0000000..d5b6dcb --- /dev/null +++ b/libs/nextjs/README.md @@ -0,0 +1,11 @@ +# nextjs + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test nextjs` to execute the unit tests via [Jest](https://jestjs.io). + +## Running lint + +Run `nx lint nextjs` to execute the lint via [ESLint](https://eslint.org/). diff --git a/libs/nextjs/jest.config.ts b/libs/nextjs/jest.config.ts new file mode 100644 index 0000000..eccdc1e --- /dev/null +++ b/libs/nextjs/jest.config.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +export default { + displayName: 'nextjs', + preset: '../../jest.preset.js', + globals: { + 'ts-jest': { + tsconfig: '/tsconfig.spec.json', + }, + }, + testEnvironment: 'node', + transform: { + '^.+\\.[tj]sx?$': 'ts-jest', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + coverageDirectory: '../../coverage/libs/nextjs', +}; diff --git a/libs/nextjs/package.json b/libs/nextjs/package.json new file mode 100644 index 0000000..42398ff --- /dev/null +++ b/libs/nextjs/package.json @@ -0,0 +1,32 @@ +{ + "name": "@fal-ai/serverless-nextjs", + "description": "The fal-serverless Next.js integration", + "version": "0.2.0", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/fal-ai/serverless-js.git", + "directory": "libs/nextjs" + }, + "keywords": [ + "fal", + "serverless", + "client", + "next", + "nextjs", + "proxy" + ], + "peerDependencies": { + "next": "^13.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } +} diff --git a/libs/nextjs/project.json b/libs/nextjs/project.json new file mode 100644 index 0000000..777e976 --- /dev/null +++ b/libs/nextjs/project.json @@ -0,0 +1,41 @@ +{ + "name": "nextjs", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/nextjs/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nrwl/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/libs/nextjs", + "tsConfig": "libs/nextjs/tsconfig.lib.json", + "packageJson": "libs/nextjs/package.json", + "main": "libs/nextjs/src/index.ts", + "assets": ["libs/nextjs/*.md"] + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["libs/nextjs/**/*.ts"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "libs/nextjs/jest.config.ts", + "passWithNoTests": true + }, + "configurations": { + "ci": { + "ci": true, + "codeCoverage": true + } + } + } + }, + "tags": [] +} diff --git a/libs/nextjs/src/config.ts b/libs/nextjs/src/config.ts new file mode 100644 index 0000000..d440cbe --- /dev/null +++ b/libs/nextjs/src/config.ts @@ -0,0 +1,29 @@ +import type { RequestMiddleware } from '@fal-ai/serverless-client'; + +export type NextProxyConfig = { + targetUrl: string; +}; + +const defaultConfig: NextProxyConfig = { + targetUrl: '/api/_fal/proxy', +}; + +export const TARGET_URL_HEADER = 'x-fal-target-url'; + +export function withNextProxy( + config: NextProxyConfig = defaultConfig +): RequestMiddleware { + // when running on the server, we don't need to proxy the request + if (typeof window === 'undefined') { + return (requestConfig) => Promise.resolve(requestConfig); + } + return (requestConfig) => + Promise.resolve({ + ...requestConfig, + url: config.targetUrl, + headers: { + [TARGET_URL_HEADER]: requestConfig.url, + ...(requestConfig.headers || {}), + }, + }); +} diff --git a/libs/nextjs/src/handler.ts b/libs/nextjs/src/handler.ts new file mode 100644 index 0000000..0333657 --- /dev/null +++ b/libs/nextjs/src/handler.ts @@ -0,0 +1,93 @@ +import type { NextApiHandler, NextApiRequest, PageConfig } from 'next'; +import { TARGET_URL_HEADER } from './config'; + +const FAL_KEY_ID = process.env.FAL_KEY_ID || process.env.NEXT_PUBLIC_FAL_KEY_ID; +const FAL_KEY_SECRET = + process.env.FAL_KEY_SECRET || process.env.NEXT_PUBLIC_FAL_KEY_SECRET; + +/** + * Utility to get a header value as `string` from a Headers object. + * + * @private + * @param request the Next request object. + * @param key the header key. + * @returns the header value as `string` or `undefined` if the header is not set. + */ +function getHeader(request: NextApiRequest, key: string): string | undefined { + const headerValue = request.headers[key.toLowerCase()]; + if (Array.isArray(headerValue)) { + return headerValue[0]; + } + return headerValue; +} + +/** + * Clean up headers that should not be forwarded to the proxy. + * @param request the Next request object. + */ +function cleanUpHeaders(request: NextApiRequest) { + delete request.headers['origin']; + delete request.headers['referer']; + // delete request.headers['transfer-encoding']; + delete request.headers[TARGET_URL_HEADER]; +} + +/** + * A Next request handler that proxies the request to the fal-serverless + * endpoint. This is useful so client-side calls to the fal-serverless endpoint + * can be made without CORS issues and the correct credentials can be added + * effortlessly. + * + * @param request the Next request object. + * @param response the Next response object. + * @returns Promise the promise that will be resolved once the request is done. + */ +export const handler: NextApiHandler = async (request, response) => { + const targetUrl = getHeader(request, TARGET_URL_HEADER); + if (!targetUrl) { + response.status(400).send(`Missing the ${TARGET_URL_HEADER} header`); + return; + } + if (targetUrl.indexOf('fal.ai') === -1) { + response.status(412).send(`Invalid ${TARGET_URL_HEADER} header`); + return; + } + + cleanUpHeaders(request); + + const authHeader = + FAL_KEY_ID && FAL_KEY_SECRET + ? { authorization: `Key ${FAL_KEY_ID}:${FAL_KEY_SECRET}` } + : {}; + + const res = await fetch(targetUrl, { + method: request.method, + headers: { + ...authHeader, + accept: 'application/json', + 'content-type': 'application/json', + 'x-fal-client-proxy': '@fal-ai/serverless-nextjs', + }, + body: + request.method?.toUpperCase() === 'GET' + ? undefined + : JSON.stringify(request.body), + }); + + // copy headers from res to response + res.headers.forEach((value, key) => { + response.setHeader(key, value); + }); + + if (res.headers.get('content-type') === 'application/json') { + const data = await res.json(); + response.status(res.status).json(data); + return; + } + const data = await res.text(); + response.status(res.status).send(data); +}; + +export const config: PageConfig = { + api: {}, +}; diff --git a/libs/nextjs/src/index.ts b/libs/nextjs/src/index.ts new file mode 100644 index 0000000..738ad61 --- /dev/null +++ b/libs/nextjs/src/index.ts @@ -0,0 +1,2 @@ +export * from './config'; +export * from './handler'; diff --git a/libs/nextjs/tsconfig.json b/libs/nextjs/tsconfig.json new file mode 100644 index 0000000..62ebbd9 --- /dev/null +++ b/libs/nextjs/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/nextjs/tsconfig.lib.json b/libs/nextjs/tsconfig.lib.json new file mode 100644 index 0000000..3f06e80 --- /dev/null +++ b/libs/nextjs/tsconfig.lib.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], + "include": ["src/**/*.ts"] +} diff --git a/libs/nextjs/tsconfig.spec.json b/libs/nextjs/tsconfig.spec.json new file mode 100644 index 0000000..26ef046 --- /dev/null +++ b/libs/nextjs/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ] +} diff --git a/package-lock.json b/package-lock.json index 0dc8a11..82aba1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,10 @@ "chokidar": "^3.5.3", "core-js": "^3.6.5", "cross-fetch": "^3.1.5", + "encoding": "^0.1.13", "fast-glob": "^3.2.12", + "http-proxy": "^1.18.1", + "http-proxy-middleware": "^2.0.6", "js-base64": "^3.7.5", "next": "13.1.1", "react": "18.2.0", @@ -42,7 +45,7 @@ "@testing-library/react": "13.4.0", "@theunderscorer/nx-semantic-release": "^2.2.1", "@types/jest": "28.1.1", - "@types/node": "16.11.7", + "@types/node": "^18.17.14", "@types/react": "18.0.20", "@types/react-dom": "18.0.6", "@typescript-eslint/eslint-plugin": "^5.55.0", @@ -67,7 +70,7 @@ "postcss": "8.4.19", "prettier": "^2.6.2", "react-test-renderer": "18.2.0", - "tailwindcss": "3.2.4", + "tailwindcss": "^3.3.3", "ts-jest": "28.0.5", "ts-node": "^10.9.1", "ts-protoc-gen": "^0.15.0", @@ -75,6 +78,18 @@ "typescript": "^4.9.5" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -8715,9 +8730,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + "version": "18.17.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.14.tgz", + "integrity": "sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -9460,38 +9475,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -9644,6 +9627,12 @@ "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -10582,9 +10571,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001457", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", - "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "funding": [ { "type": "opencollective", @@ -10593,6 +10582,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -12173,15 +12166,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -12277,23 +12261,6 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -12617,6 +12584,14 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -15531,9 +15506,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dependencies": { "has": "^1.0.3" }, @@ -16974,6 +16949,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-base64": { "version": "3.7.5", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", @@ -17387,9 +17371,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "engines": { "node": ">=10" } @@ -18350,10 +18334,27 @@ "multicast-dns": "cli.js" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -18823,6 +18824,7 @@ "inBundle": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=0.1.90" } @@ -18831,19 +18833,22 @@ "version": "1.1.3", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/@npmcli/arborist": { "version": "6.2.5", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", @@ -18891,6 +18896,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/map-workspaces": "^3.0.2", "ini": "^3.0.0", @@ -18909,6 +18915,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "ansi-styles": "^4.3.0" }, @@ -18921,6 +18928,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "semver": "^7.3.5" }, @@ -18933,6 +18941,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", @@ -18953,6 +18962,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -18969,6 +18979,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^8.0.1", @@ -18984,6 +18995,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "cacache": "^17.0.0", "json-parse-even-better-errors": "^3.0.0", @@ -18999,6 +19011,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -19012,6 +19025,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -19021,6 +19035,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -19030,6 +19045,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "json-parse-even-better-errors": "^3.0.0" }, @@ -19042,6 +19058,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "which": "^3.0.0" }, @@ -19054,6 +19071,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -19066,6 +19084,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^6.0.0", @@ -19082,6 +19101,7 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -19091,6 +19111,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -19100,6 +19121,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "minimatch": "^6.1.0" }, @@ -19112,6 +19134,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -19121,6 +19144,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -19133,6 +19157,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "4" }, @@ -19145,6 +19170,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.1.0", "depd": "^2.0.0", @@ -19159,6 +19185,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -19172,6 +19199,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19181,6 +19209,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -19195,19 +19224,22 @@ "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/are-we-there-yet": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^4.1.0" @@ -19220,7 +19252,8 @@ "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/base64-js": { "version": "1.5.1", @@ -19240,13 +19273,15 @@ } ], "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.1", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -19262,6 +19297,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19271,6 +19307,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -19294,6 +19331,7 @@ ], "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -19304,6 +19342,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "semver": "^7.0.0" } @@ -19313,6 +19352,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -19337,6 +19377,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19353,6 +19394,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": ">=10" } @@ -19368,6 +19410,7 @@ ], "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19377,6 +19420,7 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "ip-regex": "^4.1.0" }, @@ -19389,6 +19433,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -19398,6 +19443,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" @@ -19411,6 +19457,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "string-width": "^4.2.0" }, @@ -19426,6 +19473,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -19435,6 +19483,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -19444,6 +19493,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -19455,13 +19505,15 @@ "version": "1.1.4", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/color-support": { "version": "1.1.3", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "bin": { "color-support": "bin.js" } @@ -19471,6 +19523,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" @@ -19483,25 +19536,29 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/concat-map": { "version": "0.0.1", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/console-control-strings": { "version": "1.1.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "bin": { "cssesc": "bin/cssesc" }, @@ -19514,6 +19571,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -19530,13 +19588,15 @@ "version": "2.1.2", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/defaults": { "version": "1.0.4", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -19548,13 +19608,15 @@ "version": "1.0.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/depd": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -19564,6 +19626,7 @@ "dev": true, "inBundle": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.3.1" } @@ -19572,7 +19635,8 @@ "version": "8.0.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", @@ -19580,6 +19644,7 @@ "inBundle": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -19589,6 +19654,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -19597,13 +19663,15 @@ "version": "2.0.3", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/event-target-shim": { "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -19613,6 +19681,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.x" } @@ -19622,6 +19691,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4.9.1" } @@ -19631,6 +19701,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^4.0.0" }, @@ -19642,19 +19713,22 @@ "version": "1.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/function-bind": { "version": "1.1.1", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/gauge": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -19674,6 +19748,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19693,6 +19768,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -19704,13 +19780,15 @@ "version": "4.2.10", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/has": { "version": "1.0.3", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -19723,6 +19801,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19731,13 +19810,15 @@ "version": "2.0.1", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/hosted-git-info": { "version": "6.1.1", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^7.5.1" }, @@ -19749,13 +19830,15 @@ "version": "4.1.1", "dev": true, "inBundle": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -19770,6 +19853,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -19783,6 +19867,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.0.0" } @@ -19793,6 +19878,7 @@ "inBundle": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -19818,13 +19904,15 @@ } ], "inBundle": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minimatch": "^6.1.6" }, @@ -19837,6 +19925,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.19" } @@ -19846,6 +19935,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19854,13 +19944,15 @@ "version": "1.0.4", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/inflight": { "version": "1.0.6", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -19870,13 +19962,15 @@ "version": "2.0.4", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/ini": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } @@ -19886,6 +19980,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "npm-package-arg": "^10.0.0", "promzard": "^1.0.0", @@ -19903,13 +19998,15 @@ "version": "2.0.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/ip-regex": { "version": "4.3.0", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19919,6 +20016,7 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "cidr-regex": "^3.1.1" }, @@ -19931,6 +20029,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "has": "^1.0.3" }, @@ -19943,6 +20042,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19951,19 +20051,22 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -19973,6 +20076,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -19984,25 +20088,29 @@ "node >= 0.2.0" ], "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/just-diff": { "version": "5.2.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/libnpmaccess": { "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "npm-package-arg": "^10.1.0", "npm-registry-fetch": "^14.0.3" @@ -20016,6 +20124,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/arborist": "^6.2.5", "@npmcli/disparity-colors": "^3.0.0", @@ -20036,6 +20145,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/arborist": "^6.2.5", "@npmcli/run-script": "^6.0.0", @@ -20059,6 +20169,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/arborist": "^6.2.5" }, @@ -20071,6 +20182,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^14.0.3" @@ -20084,6 +20196,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^14.0.3" @@ -20097,6 +20210,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/arborist": "^6.2.5", "@npmcli/run-script": "^6.0.0", @@ -20112,6 +20226,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "ci-info": "^3.6.1", "normalize-package-data": "^5.0.0", @@ -20131,6 +20246,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "npm-registry-fetch": "^14.0.3" }, @@ -20143,6 +20259,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^14.0.3" @@ -20156,6 +20273,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/git": "^4.0.1", "@npmcli/run-script": "^6.0.0", @@ -20172,6 +20290,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -20181,6 +20300,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -20207,6 +20327,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -20222,6 +20343,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": ">=8" } @@ -20231,6 +20353,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -20243,6 +20366,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20255,6 +20379,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^4.0.0", "minipass-sized": "^1.0.3", @@ -20272,6 +20397,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -20284,6 +20410,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20296,6 +20423,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" @@ -20306,6 +20434,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20318,6 +20447,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -20330,6 +20460,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20342,6 +20473,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -20354,6 +20486,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20366,6 +20499,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -20379,6 +20513,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20391,6 +20526,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -20402,13 +20538,15 @@ "version": "2.1.3", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/mute-stream": { "version": "1.0.0", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -20418,6 +20556,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -20427,6 +20566,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -20451,6 +20591,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -20463,13 +20604,15 @@ "version": "1.1.1", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -20483,6 +20626,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -20493,6 +20637,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -20522,6 +20667,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -20531,6 +20677,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -20550,6 +20697,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -20562,6 +20710,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -20574,6 +20723,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -20593,6 +20743,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -20613,6 +20764,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -20640,6 +20792,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -20652,6 +20805,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20664,6 +20818,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", @@ -20681,6 +20836,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "abbrev": "^1.0.0" }, @@ -20696,6 +20852,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -20711,6 +20868,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -20725,6 +20883,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^3.1.1" }, @@ -20737,6 +20896,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "unique-slug": "^3.0.0" }, @@ -20749,6 +20909,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4" }, @@ -20761,6 +20922,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -20776,6 +20938,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "abbrev": "^2.0.0" }, @@ -20791,6 +20954,7 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", @@ -20806,6 +20970,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "chalk": "^4.0.0" }, @@ -20818,6 +20983,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, @@ -20830,6 +20996,7 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "semver": "^7.1.1" }, @@ -20842,6 +21009,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -20851,6 +21019,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", @@ -20866,6 +21035,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "ignore-walk": "^6.0.0" }, @@ -20878,6 +21048,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -20893,6 +21064,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "npm-registry-fetch": "^14.0.0", "proc-log": "^3.0.0" @@ -20906,6 +21078,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "make-fetch-happen": "^11.0.0", "minipass": "^4.0.0", @@ -20924,6 +21097,7 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -20933,6 +21107,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "are-we-there-yet": "^4.0.0", "console-control-strings": "^1.1.0", @@ -20948,6 +21123,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "wrappy": "1" } @@ -20957,6 +21133,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -20972,6 +21149,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", @@ -21004,6 +21182,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^5.0.1", @@ -21018,6 +21197,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -21027,6 +21207,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -21040,6 +21221,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -21049,6 +21231,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6.0" } @@ -21058,6 +21241,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -21067,6 +21251,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -21075,13 +21260,15 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -21095,6 +21282,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "read": "^2.0.0" }, @@ -21106,6 +21294,7 @@ "version": "0.12.0", "dev": true, "inBundle": true, + "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -21115,6 +21304,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "mute-stream": "~1.0.0" }, @@ -21127,6 +21317,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -21136,6 +21327,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "glob": "^8.0.1", "json-parse-even-better-errors": "^3.0.0", @@ -21151,6 +21343,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -21164,6 +21357,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -21179,6 +21373,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -21188,6 +21383,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -21203,6 +21399,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -21213,6 +21410,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -21233,6 +21431,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -21244,20 +21443,23 @@ "version": "5.1.2", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, "inBundle": true, "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/npm/node_modules/semver": { "version": "7.3.8", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -21273,6 +21475,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -21284,19 +21487,22 @@ "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/signal-exit": { "version": "3.0.7", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/sigstore": { "version": "1.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@sigstore/protobuf-specs": "^0.1.0", "make-fetch-happen": "^11.0.1", @@ -21314,6 +21520,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -21324,6 +21531,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -21338,6 +21546,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -21352,6 +21561,7 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -21361,13 +21571,15 @@ "version": "2.3.0", "dev": true, "inBundle": true, - "license": "CC-BY-3.0" + "license": "CC-BY-3.0", + "peer": true }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -21377,13 +21589,15 @@ "version": "3.0.12", "dev": true, "inBundle": true, - "license": "CC0-1.0" + "license": "CC0-1.0", + "peer": true }, "node_modules/npm/node_modules/ssri": { "version": "10.0.1", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^4.0.0" }, @@ -21396,6 +21610,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -21405,6 +21620,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21419,6 +21635,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -21431,6 +21648,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -21443,6 +21661,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -21460,6 +21679,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -21472,6 +21692,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -21483,19 +21704,22 @@ "version": "0.2.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -21505,6 +21729,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "@tufjs/models": "1.0.0", "make-fetch-happen": "^11.0.1" @@ -21518,6 +21743,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "unique-slug": "^4.0.0" }, @@ -21530,6 +21756,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4" }, @@ -21541,13 +21768,15 @@ "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, "inBundle": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -21558,6 +21787,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "builtins": "^5.0.0" }, @@ -21569,13 +21799,15 @@ "version": "1.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/wcwidth": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -21585,6 +21817,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -21600,6 +21833,7 @@ "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -21608,13 +21842,15 @@ "version": "1.0.2", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm/node_modules/write-file-atomic": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -21627,7 +21863,8 @@ "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/nth-check": { "version": "2.1.1", @@ -23038,12 +23275,12 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" @@ -23492,18 +23729,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -23962,11 +24187,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -25794,6 +26019,57 @@ "semver": "bin/semver.js" } }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25876,44 +26152,40 @@ } }, "node_modules/tailwindcss": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", - "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", "dev": true, "dependencies": { + "@alloc/quick-lru": "^5.2.0", "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", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.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" + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">=14.0.0" } }, "node_modules/tailwindcss/node_modules/arg": { @@ -25934,6 +26206,89 @@ "node": ">=10.13.0" } }, + "node_modules/tailwindcss/node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/tailwindcss/node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -26188,6 +26543,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "devOptional": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", @@ -26317,6 +26693,12 @@ "node": ">=8" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/ts-jest": { "version": "28.0.5", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.5.tgz", @@ -27574,6 +27956,12 @@ } }, "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -33775,9 +34163,9 @@ "dev": true }, "@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + "version": "18.17.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.14.tgz", + "integrity": "sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -34377,31 +34765,6 @@ "devOptional": true, "requires": {} }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - } - } - }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -34505,6 +34868,12 @@ "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -35192,9 +35561,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001457", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", - "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==" + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==" }, "capital-case": { "version": "1.0.4", @@ -36370,12 +36739,6 @@ "object-keys": "^1.1.1" } }, - "defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true - }, "del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -36445,17 +36808,6 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -36716,6 +37068,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -38890,9 +39250,9 @@ } }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "requires": { "has": "^1.0.3" } @@ -39978,6 +40338,12 @@ } } }, + "jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true + }, "js-base64": { "version": "3.7.5", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", @@ -40285,9 +40651,9 @@ } }, "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" }, "lines-and-columns": { "version": "1.2.4", @@ -41027,10 +41393,21 @@ "thunky": "^1.0.2" } }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "native-request": { "version": "1.1.0", @@ -41327,22 +41704,26 @@ "version": "1.5.0", "bundled": true, "dev": true, - "optional": true + "optional": true, + "peer": true }, "@gar/promisify": { "version": "1.1.3", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "@isaacs/string-locale-compare": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "@npmcli/arborist": { "version": "6.2.5", "bundled": true, "dev": true, + "peer": true, "requires": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", @@ -41383,6 +41764,7 @@ "version": "6.1.4", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/map-workspaces": "^3.0.2", "ini": "^3.0.0", @@ -41397,6 +41779,7 @@ "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.3.0" } @@ -41405,6 +41788,7 @@ "version": "3.1.0", "bundled": true, "dev": true, + "peer": true, "requires": { "semver": "^7.3.5" } @@ -41413,6 +41797,7 @@ "version": "4.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", @@ -41429,6 +41814,7 @@ "version": "2.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -41438,6 +41824,7 @@ "version": "3.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^8.0.1", @@ -41449,6 +41836,7 @@ "version": "5.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "cacache": "^17.0.0", "json-parse-even-better-errors": "^3.0.0", @@ -41460,6 +41848,7 @@ "version": "2.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -41468,17 +41857,20 @@ "@npmcli/name-from-folder": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "@npmcli/node-gyp": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "@npmcli/package-json": { "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "json-parse-even-better-errors": "^3.0.0" } @@ -41487,6 +41879,7 @@ "version": "6.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "which": "^3.0.0" } @@ -41495,6 +41888,7 @@ "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.10" } @@ -41503,6 +41897,7 @@ "version": "6.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^6.0.0", @@ -41514,17 +41909,20 @@ "@sigstore/protobuf-specs": { "version": "0.1.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "@tootallnate/once": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "@tufjs/models": { "version": "1.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "minimatch": "^6.1.0" } @@ -41532,12 +41930,14 @@ "abbrev": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "abort-controller": { "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "event-target-shim": "^5.0.0" } @@ -41546,6 +41946,7 @@ "version": "6.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "debug": "4" } @@ -41554,6 +41955,7 @@ "version": "4.3.0", "bundled": true, "dev": true, + "peer": true, "requires": { "debug": "^4.1.0", "depd": "^2.0.0", @@ -41564,6 +41966,7 @@ "version": "3.1.0", "bundled": true, "dev": true, + "peer": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -41572,12 +41975,14 @@ "ansi-regex": { "version": "5.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "ansi-styles": { "version": "4.3.0", "bundled": true, "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -41585,17 +41990,20 @@ "aproba": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "archy": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "are-we-there-yet": { "version": "4.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^4.1.0" @@ -41604,17 +42012,20 @@ "balanced-match": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "base64-js": { "version": "1.5.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "bin-links": { "version": "4.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -41625,12 +42036,14 @@ "binary-extensions": { "version": "2.2.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "brace-expansion": { "version": "2.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -41639,6 +42052,7 @@ "version": "6.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -41648,6 +42062,7 @@ "version": "5.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "semver": "^7.0.0" } @@ -41656,6 +42071,7 @@ "version": "17.0.4", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -41676,6 +42092,7 @@ "version": "4.1.2", "bundled": true, "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41684,17 +42101,20 @@ "chownr": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "ci-info": { "version": "3.8.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "cidr-regex": { "version": "3.1.1", "bundled": true, "dev": true, + "peer": true, "requires": { "ip-regex": "^4.1.0" } @@ -41702,12 +42122,14 @@ "clean-stack": { "version": "2.2.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "cli-columns": { "version": "4.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" @@ -41717,6 +42139,7 @@ "version": "0.6.3", "bundled": true, "dev": true, + "peer": true, "requires": { "@colors/colors": "1.5.0", "string-width": "^4.2.0" @@ -41725,17 +42148,20 @@ "clone": { "version": "1.0.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "cmd-shim": { "version": "6.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "color-convert": { "version": "2.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -41743,17 +42169,20 @@ "color-name": { "version": "1.1.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "color-support": { "version": "1.1.3", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "columnify": { "version": "1.6.0", "bundled": true, "dev": true, + "peer": true, "requires": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" @@ -41762,27 +42191,32 @@ "common-ancestor-path": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "cssesc": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "debug": { "version": "4.3.4", "bundled": true, "dev": true, + "peer": true, "requires": { "ms": "2.1.2" }, @@ -41790,7 +42224,8 @@ "ms": { "version": "2.1.2", "bundled": true, - "dev": true + "dev": true, + "peer": true } } }, @@ -41798,6 +42233,7 @@ "version": "1.0.4", "bundled": true, "dev": true, + "peer": true, "requires": { "clone": "^1.0.2" } @@ -41805,28 +42241,33 @@ "delegates": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "depd": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "diff": { "version": "5.1.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "emoji-regex": { "version": "8.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "encoding": { "version": "0.1.13", "bundled": true, "dev": true, "optional": true, + "peer": true, "requires": { "iconv-lite": "^0.6.2" } @@ -41834,32 +42275,38 @@ "env-paths": { "version": "2.2.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "err-code": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "event-target-shim": { "version": "5.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "events": { "version": "3.3.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "fastest-levenshtein": { "version": "1.0.16", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "fs-minipass": { "version": "3.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^4.0.0" } @@ -41867,17 +42314,20 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "function-bind": { "version": "1.1.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "gauge": { "version": "5.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -41893,6 +42343,7 @@ "version": "8.1.0", "bundled": true, "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41905,6 +42356,7 @@ "version": "5.1.6", "bundled": true, "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -41914,12 +42366,14 @@ "graceful-fs": { "version": "4.2.10", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "has": { "version": "1.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "function-bind": "^1.1.1" } @@ -41927,17 +42381,20 @@ "has-flag": { "version": "4.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "hosted-git-info": { "version": "6.1.1", "bundled": true, "dev": true, + "peer": true, "requires": { "lru-cache": "^7.5.1" } @@ -41945,12 +42402,14 @@ "http-cache-semantics": { "version": "4.1.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "http-proxy-agent": { "version": "5.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "@tootallnate/once": "2", "agent-base": "6", @@ -41961,6 +42420,7 @@ "version": "5.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "agent-base": "6", "debug": "4" @@ -41970,6 +42430,7 @@ "version": "1.2.1", "bundled": true, "dev": true, + "peer": true, "requires": { "ms": "^2.0.0" } @@ -41979,6 +42440,7 @@ "bundled": true, "dev": true, "optional": true, + "peer": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -41986,12 +42448,14 @@ "ieee754": { "version": "1.2.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "ignore-walk": { "version": "6.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "minimatch": "^6.1.6" } @@ -41999,22 +42463,26 @@ "imurmurhash": { "version": "0.1.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "indent-string": { "version": "4.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "infer-owner": { "version": "1.0.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "peer": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -42023,17 +42491,20 @@ "inherits": { "version": "2.0.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "ini": { "version": "3.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "init-package-json": { "version": "5.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "npm-package-arg": "^10.0.0", "promzard": "^1.0.0", @@ -42047,17 +42518,20 @@ "ip": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "ip-regex": { "version": "4.3.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "is-cidr": { "version": "4.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "cidr-regex": "^3.1.1" } @@ -42066,6 +42540,7 @@ "version": "2.11.0", "bundled": true, "dev": true, + "peer": true, "requires": { "has": "^1.0.3" } @@ -42073,47 +42548,56 @@ "is-fullwidth-code-point": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "is-lambda": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "isexe": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "json-parse-even-better-errors": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "json-stringify-nice": { "version": "1.1.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "jsonparse": { "version": "1.3.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "just-diff": { "version": "5.2.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "just-diff-apply": { "version": "5.5.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "libnpmaccess": { "version": "7.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "npm-package-arg": "^10.1.0", "npm-registry-fetch": "^14.0.3" @@ -42123,6 +42607,7 @@ "version": "5.0.13", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/arborist": "^6.2.5", "@npmcli/disparity-colors": "^3.0.0", @@ -42139,6 +42624,7 @@ "version": "5.0.13", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/arborist": "^6.2.5", "@npmcli/run-script": "^6.0.0", @@ -42158,6 +42644,7 @@ "version": "4.0.13", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/arborist": "^6.2.5" } @@ -42166,6 +42653,7 @@ "version": "9.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^14.0.3" @@ -42175,6 +42663,7 @@ "version": "5.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^14.0.3" @@ -42184,6 +42673,7 @@ "version": "5.0.13", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/arborist": "^6.2.5", "@npmcli/run-script": "^6.0.0", @@ -42195,6 +42685,7 @@ "version": "7.1.2", "bundled": true, "dev": true, + "peer": true, "requires": { "ci-info": "^3.6.1", "normalize-package-data": "^5.0.0", @@ -42210,6 +42701,7 @@ "version": "6.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "npm-registry-fetch": "^14.0.3" } @@ -42218,6 +42710,7 @@ "version": "5.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^14.0.3" @@ -42227,6 +42720,7 @@ "version": "4.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/git": "^4.0.1", "@npmcli/run-script": "^6.0.0", @@ -42238,12 +42732,14 @@ "lru-cache": { "version": "7.18.3", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "make-fetch-happen": { "version": "11.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -42266,6 +42762,7 @@ "version": "6.2.0", "bundled": true, "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -42273,12 +42770,14 @@ "minipass": { "version": "4.2.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "minipass-collect": { "version": "1.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.0.0" }, @@ -42287,6 +42786,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -42297,6 +42797,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "encoding": "^0.1.13", "minipass": "^4.0.0", @@ -42308,6 +42809,7 @@ "version": "1.0.5", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.0.0" }, @@ -42316,6 +42818,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -42326,6 +42829,7 @@ "version": "1.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" @@ -42335,6 +42839,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -42345,6 +42850,7 @@ "version": "1.2.4", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.0.0" }, @@ -42353,6 +42859,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -42363,6 +42870,7 @@ "version": "1.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.0.0" }, @@ -42371,6 +42879,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -42381,6 +42890,7 @@ "version": "2.1.2", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -42390,6 +42900,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -42399,27 +42910,32 @@ "mkdirp": { "version": "1.0.4", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "ms": { "version": "2.1.3", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "mute-stream": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "negotiator": { "version": "0.6.3", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "node-gyp": { "version": "9.3.1", "bundled": true, "dev": true, + "peer": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -42437,6 +42953,7 @@ "version": "2.1.2", "bundled": true, "dev": true, + "peer": true, "requires": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -42445,12 +42962,14 @@ "abbrev": { "version": "1.1.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "are-we-there-yet": { "version": "3.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -42460,6 +42979,7 @@ "version": "1.1.11", "bundled": true, "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -42469,6 +42989,7 @@ "version": "16.1.3", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -42494,6 +43015,7 @@ "version": "2.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -42502,6 +43024,7 @@ "version": "8.1.0", "bundled": true, "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -42514,6 +43037,7 @@ "version": "5.1.6", "bundled": true, "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -42524,6 +43048,7 @@ "version": "2.1.0", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.0.0" } @@ -42532,6 +43057,7 @@ "version": "4.0.4", "bundled": true, "dev": true, + "peer": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -42547,6 +43073,7 @@ "version": "7.2.3", "bundled": true, "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -42560,6 +43087,7 @@ "version": "10.2.1", "bundled": true, "dev": true, + "peer": true, "requires": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -42583,6 +43111,7 @@ "version": "3.1.2", "bundled": true, "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -42591,6 +43120,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -42599,6 +43129,7 @@ "version": "2.1.2", "bundled": true, "dev": true, + "peer": true, "requires": { "encoding": "^0.1.13", "minipass": "^3.1.6", @@ -42610,6 +43141,7 @@ "version": "6.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "abbrev": "^1.0.0" } @@ -42618,6 +43150,7 @@ "version": "6.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -42629,6 +43162,7 @@ "version": "3.6.1", "bundled": true, "dev": true, + "peer": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -42639,6 +43173,7 @@ "version": "9.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.1.1" } @@ -42647,6 +43182,7 @@ "version": "2.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "unique-slug": "^3.0.0" } @@ -42655,6 +43191,7 @@ "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4" } @@ -42663,6 +43200,7 @@ "version": "2.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "isexe": "^2.0.0" } @@ -42673,6 +43211,7 @@ "version": "7.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "abbrev": "^2.0.0" } @@ -42681,6 +43220,7 @@ "version": "5.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", @@ -42692,6 +43232,7 @@ "version": "4.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "chalk": "^4.0.0" } @@ -42700,6 +43241,7 @@ "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "npm-normalize-package-bin": "^3.0.0" } @@ -42708,6 +43250,7 @@ "version": "6.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "semver": "^7.1.1" } @@ -42715,12 +43258,14 @@ "npm-normalize-package-bin": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "npm-package-arg": { "version": "10.1.0", "bundled": true, "dev": true, + "peer": true, "requires": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", @@ -42732,6 +43277,7 @@ "version": "7.0.4", "bundled": true, "dev": true, + "peer": true, "requires": { "ignore-walk": "^6.0.0" } @@ -42740,6 +43286,7 @@ "version": "8.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -42751,6 +43298,7 @@ "version": "7.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "npm-registry-fetch": "^14.0.0", "proc-log": "^3.0.0" @@ -42760,6 +43308,7 @@ "version": "14.0.3", "bundled": true, "dev": true, + "peer": true, "requires": { "make-fetch-happen": "^11.0.0", "minipass": "^4.0.0", @@ -42773,12 +43322,14 @@ "npm-user-validate": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "npmlog": { "version": "7.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "are-we-there-yet": "^4.0.0", "console-control-strings": "^1.1.0", @@ -42790,6 +43341,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "peer": true, "requires": { "wrappy": "1" } @@ -42798,6 +43350,7 @@ "version": "4.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "aggregate-error": "^3.0.0" } @@ -42806,6 +43359,7 @@ "version": "15.1.1", "bundled": true, "dev": true, + "peer": true, "requires": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", @@ -42831,6 +43385,7 @@ "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^5.0.1", @@ -42840,12 +43395,14 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "postcss-selector-parser": { "version": "6.0.11", "bundled": true, "dev": true, + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -42854,32 +43411,38 @@ "proc-log": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "process": { "version": "0.11.10", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "promise-all-reject-late": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "promise-call-limit": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "promise-inflight": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "promise-retry": { "version": "2.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -42889,6 +43452,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "read": "^2.0.0" } @@ -42896,12 +43460,14 @@ "qrcode-terminal": { "version": "0.12.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "read": { "version": "2.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "mute-stream": "~1.0.0" } @@ -42909,12 +43475,14 @@ "read-cmd-shim": { "version": "4.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "read-package-json": { "version": "6.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "glob": "^8.0.1", "json-parse-even-better-errors": "^3.0.0", @@ -42926,6 +43494,7 @@ "version": "3.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -42935,6 +43504,7 @@ "version": "4.3.0", "bundled": true, "dev": true, + "peer": true, "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -42945,12 +43515,14 @@ "retry": { "version": "0.12.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "rimraf": { "version": "3.0.2", "bundled": true, "dev": true, + "peer": true, "requires": { "glob": "^7.1.3" }, @@ -42959,6 +43531,7 @@ "version": "1.1.11", "bundled": true, "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -42968,6 +43541,7 @@ "version": "7.2.3", "bundled": true, "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -42981,6 +43555,7 @@ "version": "3.1.2", "bundled": true, "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -42990,18 +43565,21 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, "dev": true, - "optional": true + "optional": true, + "peer": true }, "semver": { "version": "7.3.8", "bundled": true, "dev": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" }, @@ -43010,6 +43588,7 @@ "version": "6.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -43019,17 +43598,20 @@ "set-blocking": { "version": "2.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "signal-exit": { "version": "3.0.7", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "sigstore": { "version": "1.1.1", "bundled": true, "dev": true, + "peer": true, "requires": { "@sigstore/protobuf-specs": "^0.1.0", "make-fetch-happen": "^11.0.1", @@ -43039,12 +43621,14 @@ "smart-buffer": { "version": "4.2.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "socks": { "version": "2.7.1", "bundled": true, "dev": true, + "peer": true, "requires": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -43054,6 +43638,7 @@ "version": "7.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -43064,6 +43649,7 @@ "version": "3.2.0", "bundled": true, "dev": true, + "peer": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -43072,12 +43658,14 @@ "spdx-exceptions": { "version": "2.3.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "spdx-expression-parse": { "version": "3.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -43086,12 +43674,14 @@ "spdx-license-ids": { "version": "3.0.12", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "ssri": { "version": "10.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^4.0.0" } @@ -43100,6 +43690,7 @@ "version": "1.1.1", "bundled": true, "dev": true, + "peer": true, "requires": { "safe-buffer": "~5.1.0" } @@ -43108,6 +43699,7 @@ "version": "4.2.3", "bundled": true, "dev": true, + "peer": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -43118,6 +43710,7 @@ "version": "6.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "ansi-regex": "^5.0.1" } @@ -43126,6 +43719,7 @@ "version": "7.2.0", "bundled": true, "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -43134,6 +43728,7 @@ "version": "6.1.13", "bundled": true, "dev": true, + "peer": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -43147,6 +43742,7 @@ "version": "2.1.0", "bundled": true, "dev": true, + "peer": true, "requires": { "minipass": "^3.0.0" }, @@ -43155,6 +43751,7 @@ "version": "3.3.6", "bundled": true, "dev": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -43166,22 +43763,26 @@ "text-table": { "version": "0.2.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "tiny-relative-date": { "version": "1.3.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "treeverse": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "tuf-js": { "version": "1.1.1", "bundled": true, "dev": true, + "peer": true, "requires": { "@tufjs/models": "1.0.0", "make-fetch-happen": "^11.0.1" @@ -43191,6 +43792,7 @@ "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "unique-slug": "^4.0.0" } @@ -43199,6 +43801,7 @@ "version": "4.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4" } @@ -43206,12 +43809,14 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "validate-npm-package-license": { "version": "3.0.4", "bundled": true, "dev": true, + "peer": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -43221,6 +43826,7 @@ "version": "5.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "builtins": "^5.0.0" } @@ -43228,12 +43834,14 @@ "walk-up-path": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "wcwidth": { "version": "1.0.1", "bundled": true, "dev": true, + "peer": true, "requires": { "defaults": "^1.0.3" } @@ -43242,6 +43850,7 @@ "version": "3.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "isexe": "^2.0.0" } @@ -43250,6 +43859,7 @@ "version": "1.1.5", "bundled": true, "dev": true, + "peer": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -43257,12 +43867,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "peer": true }, "write-file-atomic": { "version": "5.0.0", "bundled": true, "dev": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -43271,7 +43883,8 @@ "yallist": { "version": "4.0.0", "bundled": true, - "dev": true + "dev": true, + "peer": true } } }, @@ -44273,12 +44886,12 @@ } }, "postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" } }, "postcss-normalize-charset": { @@ -44571,12 +45184,6 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -44922,11 +45529,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -46294,6 +46901,43 @@ "normalize-path": "^3.0.0" } }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -46352,34 +46996,33 @@ } }, "tailwindcss": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", - "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", "dev": true, "requires": { + "@alloc/quick-lru": "^5.2.0", "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", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.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" + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "dependencies": { "arg": { @@ -46396,6 +47039,44 @@ "requires": { "is-glob": "^4.0.3" } + }, + "postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true } } }, @@ -46574,6 +47255,24 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "devOptional": true }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", @@ -46676,6 +47375,12 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "ts-jest": { "version": "28.0.5", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.5.tgz", diff --git a/package.json b/package.json index 89dd864..c8cc57a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,10 @@ "chokidar": "^3.5.3", "core-js": "^3.6.5", "cross-fetch": "^3.1.5", + "encoding": "^0.1.13", "fast-glob": "^3.2.12", + "http-proxy": "^1.18.1", + "http-proxy-middleware": "^2.0.6", "js-base64": "^3.7.5", "next": "13.1.1", "react": "18.2.0", @@ -43,7 +46,7 @@ "@testing-library/react": "13.4.0", "@theunderscorer/nx-semantic-release": "^2.2.1", "@types/jest": "28.1.1", - "@types/node": "16.11.7", + "@types/node": "^18.17.14", "@types/react": "18.0.20", "@types/react-dom": "18.0.6", "@typescript-eslint/eslint-plugin": "^5.55.0", @@ -68,7 +71,7 @@ "postcss": "8.4.19", "prettier": "^2.6.2", "react-test-renderer": "18.2.0", - "tailwindcss": "3.2.4", + "tailwindcss": "^3.3.3", "ts-jest": "28.0.5", "ts-node": "^10.9.1", "ts-protoc-gen": "^0.15.0", diff --git a/tsconfig.base.json b/tsconfig.base.json index 659dda1..d28755d 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -16,7 +16,8 @@ "baseUrl": ".", "paths": { "@fal-ai/serverless-client": ["libs/client/src/index.ts"], - "@fal-ai/serverless-codegen": ["libs/codegen/src/index.ts"] + "@fal-ai/serverless-codegen": ["libs/codegen/src/index.ts"], + "@fal-ai/serverless-nextjs": ["libs/nextjs/src/index.ts"] } }, "exclude": ["node_modules", "tmp"]