diff --git a/packages/ui/app/src/auth/OAuth2Client.ts b/packages/ui/app/src/auth/OAuth2Client.ts index fe09dd315e..2d00078391 100644 --- a/packages/ui/app/src/auth/OAuth2Client.ts +++ b/packages/ui/app/src/auth/OAuth2Client.ts @@ -2,7 +2,7 @@ import { JWTPayload, createRemoteJWKSet, decodeJwt, jwtVerify } from "jose"; import { NextApiRequestCookies } from "next/dist/server/api-utils"; import type { NextRequest } from "next/server"; import urlJoin from "url-join"; -import { AuthEdgeConfigOAuth2, OAuthTokenResponse, OAuthTokenResponseSchema } from "./types"; +import { AuthEdgeConfigOAuth2Ory, OAuthTokenResponse, OAuthTokenResponseSchema } from "./types"; interface TokenInfo { access_token: string; @@ -18,7 +18,7 @@ export class OAuth2Client { private readonly jwks: string | undefined; constructor( - config: AuthEdgeConfigOAuth2, + config: AuthEdgeConfigOAuth2Ory, private readonly redirect_uri?: string, ) { this.clientId = config.clientId; diff --git a/packages/ui/app/src/auth/getApiKeyInjectionConfig.ts b/packages/ui/app/src/auth/getApiKeyInjectionConfig.ts index 864f0398aa..23331b9c6e 100644 --- a/packages/ui/app/src/auth/getApiKeyInjectionConfig.ts +++ b/packages/ui/app/src/auth/getApiKeyInjectionConfig.ts @@ -26,13 +26,14 @@ export type APIKeyInjectionConfig = | APIKeyInjectionConfigEnabledUnauthorized | APIKeyInjectionConfigEnabledAuthorized; +// TODO: since this is for ORY (rightbrain) only, lets refactor export async function getAPIKeyInjectionConfig( domain: string, cookies?: NextRequest["cookies"], state?: string, ): Promise { const config = await getAuthEdgeConfig(domain); - if (config?.type === "oauth2" && config["api-key-injection-enabled"]) { + if (config?.type === "oauth2" && config.partner === "ory" && config["api-key-injection-enabled"]) { const client = new OAuth2Client(config, `https://${domain}/api/auth/callback`); const tokens = cookies != null ? await client.getOrRefreshAccessTokenEdge(cookies) : undefined; @@ -61,13 +62,15 @@ export async function getAPIKeyInjectionConfig( enabled: false, }; } + +// TODO: since this is for ORY (rightbrain) only, lets refactor export async function getAPIKeyInjectionConfigNode( domain: string, cookies?: NextApiRequestCookies, state?: string, ): Promise { const config = await getAuthEdgeConfig(domain); - if (config?.type === "oauth2" && config["api-key-injection-enabled"]) { + if (config?.type === "oauth2" && config.partner === "ory" && config["api-key-injection-enabled"]) { const client = new OAuth2Client(config, `https://${domain}/api/auth/callback`); const tokens = cookies != null ? await client.getOrRefreshAccessTokenNode(cookies) : undefined; diff --git a/packages/ui/app/src/auth/types.ts b/packages/ui/app/src/auth/types.ts index f923927c35..c8b429598b 100644 --- a/packages/ui/app/src/auth/types.ts +++ b/packages/ui/app/src/auth/types.ts @@ -9,7 +9,7 @@ export const FernUserSchema = z.object({ export type FernUser = z.infer; -export const AuthEdgeConfigOAuth2Schema = z.object({ +export const AuthEdgeConfigOAuth2OrySchema = z.object({ type: z.literal("oauth2"), partner: z.literal("ory"), environment: z.string(), @@ -19,6 +19,13 @@ export const AuthEdgeConfigOAuth2Schema = z.object({ clientSecret: z.string(), "api-key-injection-enabled": z.optional(z.boolean()), }); +export const AuthEdgeConfigOAuth2WebflowSchema = z.object({ + type: z.literal("oauth2"), + partner: z.literal("webflow"), + scope: z.optional(z.union([z.string(), z.array(z.string())])), + clientId: z.string(), + clientSecret: z.string(), +}); export const AuthEdgeConfigBasicTokenVerificationSchema = z.object({ type: z.literal("basic_token_verification"), @@ -27,10 +34,16 @@ export const AuthEdgeConfigBasicTokenVerificationSchema = z.object({ redirect: z.string(), }); -export const AuthEdgeConfigSchema = z.union([AuthEdgeConfigOAuth2Schema, AuthEdgeConfigBasicTokenVerificationSchema]); +export const AuthEdgeConfigSchema = z.union([ + AuthEdgeConfigOAuth2OrySchema, + AuthEdgeConfigOAuth2WebflowSchema, + AuthEdgeConfigBasicTokenVerificationSchema, + AuthEdgeConfigBasicTokenVerificationSchema, +]); export type AuthEdgeConfig = z.infer; -export type AuthEdgeConfigOAuth2 = z.infer; +export type AuthEdgeConfigOAuth2Ory = z.infer; +export type AuthEdgeConfigOAuth2Webflow = z.infer; export type AuthEdgeConfigBasicTokenVerification = z.infer; export const OAuthTokenResponseSchema = z.object({ diff --git a/packages/ui/docs-bundle/package.json b/packages/ui/docs-bundle/package.json index 73a0772635..00f4618b05 100644 --- a/packages/ui/docs-bundle/package.json +++ b/packages/ui/docs-bundle/package.json @@ -24,7 +24,6 @@ "lint": "pnpm lint:eslint && pnpm lint:style" }, "dependencies": { - "@fern-ui/fern-docs-utils": "workspace:*", "@algolia/requester-fetch": "^4.24.0", "@aws-sdk/client-s3": "^3.335.0", "@aws-sdk/s3-request-presigner": "^3.574.0", @@ -36,6 +35,7 @@ "@fern-ui/components": "workspace:*", "@fern-ui/core-utils": "workspace:*", "@fern-ui/fdr-utils": "workspace:*", + "@fern-ui/fern-docs-utils": "workspace:*", "@fern-ui/search-utils": "workspace:*", "@fern-ui/ui": "workspace:*", "@sentry/nextjs": "^8.30.0", @@ -59,6 +59,7 @@ "ts-essentials": "^10.0.1", "url-join": "5.0.0", "uuid": "^9.0.0", + "webflow-api": "^2.4.2", "zod": "^3.23.8" }, "devDependencies": { diff --git a/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/api-key-injection.ts b/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/api-key-injection.ts index 87bb98dc96..1ffbd38f54 100644 --- a/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/api-key-injection.ts +++ b/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/api-key-injection.ts @@ -9,15 +9,43 @@ import { } from "@fern-ui/ui/auth"; import { NextRequest, NextResponse } from "next/server"; import urlJoin from "url-join"; +import { WebflowClient } from "webflow-api"; +import type { OauthScope } from "webflow-api/api/types/OAuthScope"; export const runtime = "edge"; export default async function handler(req: NextRequest): Promise> { const domain = getXFernHostEdge(req); + const edgeConfig = await getAuthEdgeConfig(domain); + + // assume that if the edge config is set for webflow, api key injection is always enabled + if (edgeConfig?.type === "oauth2" && edgeConfig.partner === "webflow") { + const accessToken = req.cookies.get("access_token")?.value; + if (accessToken == null) { + return NextResponse.json({ + enabled: true, + authenticated: false, + url: WebflowClient.authorizeURL({ + clientId: edgeConfig.clientId, + + // TODO: subpaths will not work + // redirectUri: `https://${domain}/api/fern-docs/oauth/webflow/callback`, + + // note: this is not validated + scope: (edgeConfig.scope as OauthScope | OauthScope[]) ?? "authorized_user:read", + }), + }); + } + return NextResponse.json({ + enabled: true, + authenticated: true, + access_token: accessToken, + }); + } + const fern_token = req.cookies.get("fern_token")?.value; const config = await getAPIKeyInjectionConfig(domain, req.cookies); - const edgeConfig = await getAuthEdgeConfig(domain); const response = NextResponse.json(config); if (config.enabled && config.authenticated) { diff --git a/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/callback.ts b/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/callback.ts index 6311ea5292..990c50037d 100644 --- a/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/callback.ts +++ b/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/callback.ts @@ -1,15 +1,7 @@ import { getWorkOS, getWorkOSClientId } from "@/server/workos"; import { getXFernHostEdge } from "@/server/xfernhost/edge"; -import { - FernUser, - OAuth2Client, - OryAccessTokenSchema, - getAuthEdgeConfig, - signFernJWT, - withSecureCookie, -} from "@fern-ui/ui/auth"; +import { FernUser, getAuthEdgeConfig, signFernJWT, withSecureCookie } from "@fern-ui/ui/auth"; import { NextRequest, NextResponse } from "next/server"; -import urlJoin from "url-join"; export const runtime = "edge"; @@ -20,6 +12,10 @@ function redirectWithLoginError(location: string, errorMessage: string): NextRes } export default async function GET(req: NextRequest): Promise { + if (req.method !== "GET") { + return new NextResponse(null, { status: 405 }); + } + // The authorization code returned by AuthKit const code = req.nextUrl.searchParams.get("code"); const state = req.nextUrl.searchParams.get("state"); @@ -39,31 +35,13 @@ export default async function GET(req: NextRequest): Promise { const config = await getAuthEdgeConfig(domain); if (config != null && config.type === "oauth2" && config.partner === "ory") { - const oauthClient = new OAuth2Client(config, urlJoin(`https://${domain}`, req.nextUrl.pathname)); - try { - const { access_token, refresh_token } = await oauthClient.getToken(code); - const token = OryAccessTokenSchema.parse(await oauthClient.decode(access_token)); - const fernUser: FernUser = { - type: "user", - partner: "ory", - name: token.ext?.name, - email: token.ext?.email, - }; - const expires = token.exp == null ? undefined : new Date(token.exp * 1000); - const res = NextResponse.redirect(redirectLocation); - res.cookies.set("fern_token", await signFernJWT(fernUser), withSecureCookie({ expires })); - res.cookies.set("access_token", access_token, withSecureCookie({ expires })); - if (refresh_token != null) { - res.cookies.set("refresh_token", refresh_token, withSecureCookie({ expires })); - } else { - res.cookies.delete("refresh_token"); - } - return res; - } catch (error) { - // eslint-disable-next-line no-console - console.error(error); - return redirectWithLoginError(redirectLocation, "Couldn't login, please try again"); - } + const nextUrl = req.nextUrl.clone(); + nextUrl.pathname = nextUrl.pathname.replace( + "/api/fern-docs/auth/callback", + "/api/fern-docs/oauth/ory/callback", + ); + // Permanent GET redirect to the Ory callback endpoint + return NextResponse.redirect(nextUrl, { status: 307 }); } try { diff --git a/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/logout.ts b/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/logout.ts index e850e58a39..c06e2dae8d 100644 --- a/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/logout.ts +++ b/packages/ui/docs-bundle/src/pages/api/fern-docs/auth/logout.ts @@ -1,21 +1,14 @@ -import { getXFernHostEdge } from "@/server/xfernhost/edge"; -import { getAuthEdgeConfig } from "@fern-ui/ui/auth"; import { NextRequest, NextResponse } from "next/server"; export const runtime = "edge"; export default async function GET(req: NextRequest): Promise { - const domain = getXFernHostEdge(req); - const config = await getAuthEdgeConfig(domain); - const state = req.nextUrl.searchParams.get("state"); const redirectLocation = state ?? req.nextUrl.origin; const res = NextResponse.redirect(redirectLocation); - if (config != null && config.type === "oauth2" && config.partner === "ory") { - res.cookies.delete("fern_token"); - res.cookies.delete("access_token"); - res.cookies.delete("refresh_token"); - } + res.cookies.delete("fern_token"); + res.cookies.delete("access_token"); + res.cookies.delete("refresh_token"); return res; } diff --git a/packages/ui/docs-bundle/src/pages/api/fern-docs/oauth/ory/callback.ts b/packages/ui/docs-bundle/src/pages/api/fern-docs/oauth/ory/callback.ts new file mode 100644 index 0000000000..9f9724fd71 --- /dev/null +++ b/packages/ui/docs-bundle/src/pages/api/fern-docs/oauth/ory/callback.ts @@ -0,0 +1,72 @@ +import { getXFernHostEdge } from "@/server/xfernhost/edge"; +import { + FernUser, + OAuth2Client, + OryAccessTokenSchema, + getAuthEdgeConfig, + signFernJWT, + withSecureCookie, +} from "@fern-ui/ui/auth"; +import { NextRequest, NextResponse } from "next/server"; +import urlJoin from "url-join"; + +export const runtime = "edge"; + +function redirectWithLoginError(location: string, errorMessage: string): NextResponse { + const url = new URL(location); + url.searchParams.set("loginError", errorMessage); + return NextResponse.redirect(url.toString()); +} + +export default async function GET(req: NextRequest): Promise { + if (req.method !== "GET") { + return new NextResponse(null, { status: 405 }); + } + + const code = req.nextUrl.searchParams.get("code"); + const state = req.nextUrl.searchParams.get("state"); + const error = req.nextUrl.searchParams.get("error"); + const error_description = req.nextUrl.searchParams.get("error_description"); + const redirectLocation = state ?? req.nextUrl.origin; + + if (error != null) { + return redirectWithLoginError(redirectLocation, error_description ?? error); + } + + if (typeof code !== "string") { + return redirectWithLoginError(redirectLocation, "Couldn't login, please try again"); + } + + const domain = getXFernHostEdge(req); + const config = await getAuthEdgeConfig(domain); + + if (config == null || config.type !== "oauth2" || config.partner !== "ory") { + return redirectWithLoginError(redirectLocation, "Couldn't login, please try again"); + } + + const oauthClient = new OAuth2Client(config, urlJoin(`https://${domain}`, req.nextUrl.pathname)); + try { + const { access_token, refresh_token } = await oauthClient.getToken(code); + const token = OryAccessTokenSchema.parse(await oauthClient.decode(access_token)); + const fernUser: FernUser = { + type: "user", + partner: "ory", + name: token.ext?.name, + email: token.ext?.email, + }; + const expires = token.exp == null ? undefined : new Date(token.exp * 1000); + const res = NextResponse.redirect(redirectLocation); + res.cookies.set("fern_token", await signFernJWT(fernUser), withSecureCookie({ expires })); + res.cookies.set("access_token", access_token, withSecureCookie({ expires })); + if (refresh_token != null) { + res.cookies.set("refresh_token", refresh_token, withSecureCookie({ expires })); + } else { + res.cookies.delete("refresh_token"); + } + return res; + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + return redirectWithLoginError(redirectLocation, "Couldn't login, please try again"); + } +} diff --git a/packages/ui/docs-bundle/src/pages/api/fern-docs/oauth/webflow/callback.ts b/packages/ui/docs-bundle/src/pages/api/fern-docs/oauth/webflow/callback.ts new file mode 100644 index 0000000000..9a34aefd80 --- /dev/null +++ b/packages/ui/docs-bundle/src/pages/api/fern-docs/oauth/webflow/callback.ts @@ -0,0 +1,55 @@ +import { getXFernHostEdge } from "@/server/xfernhost/edge"; +import { getAuthEdgeConfig, withSecureCookie } from "@fern-ui/ui/auth"; +import { NextRequest, NextResponse } from "next/server"; +import { WebflowClient } from "webflow-api"; + +export const runtime = "edge"; + +function redirectWithLoginError(location: string, errorMessage: string): NextResponse { + const url = new URL(location); + url.searchParams.set("loginError", errorMessage); + return NextResponse.redirect(url.toString()); +} + +export default async function GET(req: NextRequest): Promise { + if (req.method !== "GET") { + return new NextResponse(null, { status: 405 }); + } + + const code = req.nextUrl.searchParams.get("code"); + const state = req.nextUrl.searchParams.get("state"); + const error = req.nextUrl.searchParams.get("error"); + const error_description = req.nextUrl.searchParams.get("error_description"); + const redirectLocation = state ?? req.nextUrl.origin; + + if (error != null) { + return redirectWithLoginError(redirectLocation, error_description ?? error); + } + + if (typeof code !== "string") { + return redirectWithLoginError(redirectLocation, "Couldn't login, please try again"); + } + + const domain = getXFernHostEdge(req); + const config = await getAuthEdgeConfig(domain); + + if (config == null || config.type !== "oauth2" || config.partner === "ory") { + return redirectWithLoginError(redirectLocation, "Couldn't login, please try again"); + } + + try { + const accessToken = await WebflowClient.getAccessToken({ + clientId: config.clientId, + clientSecret: config.clientSecret, + code, + }); + + const res = NextResponse.redirect(redirectLocation); + res.cookies.set("access_token", accessToken, withSecureCookie()); + return res; + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + return redirectWithLoginError(redirectLocation, "Couldn't login, please try again"); + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9bb647d313..70aa7a2c07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -446,7 +446,7 @@ importers: version: 3.3.2 simple-git: specifier: ^3.24.0 - version: 3.24.0 + version: 3.24.0(supports-color@8.1.1) stylelint: specifier: ^16.1.0 version: 16.5.0(typescript@5.4.3) @@ -1847,6 +1847,9 @@ importers: uuid: specifier: ^9.0.0 version: 9.0.1 + webflow-api: + specifier: ^2.4.2 + version: 2.4.2 zod: specifier: ^3.23.8 version: 3.23.8 @@ -2651,7 +2654,7 @@ importers: version: 3.21.0(serverless@3.38.0) simple-git: specifier: ^3.24.0 - version: 3.24.0 + version: 3.24.0(supports-color@8.1.1) tmp-promise: specifier: ^3.0.3 version: 3.0.3 @@ -16280,6 +16283,9 @@ packages: web-vitals@4.2.3: resolution: {integrity: sha512-/CFAm1mNxSmOj6i0Co+iGFJ58OS4NRGVP+AWS/l509uIK5a1bSoIVaHz/ZumpHTfHSZBpgrJ+wjfpAOrTHok5Q==} + webflow-api@2.4.2: + resolution: {integrity: sha512-+znE6V6E6YULwZIGIk8NLFZaimGFH7xVEAjCeivHz4gV13Zcg4FRXyhWxxTHnOYBwKjcjDoaWl8ZK1H9mUA5mQ==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -17003,10 +17009,10 @@ snapshots: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0 - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) + '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-bucket-endpoint': 3.568.0 '@aws-sdk/middleware-expect-continue': 3.572.0 '@aws-sdk/middleware-flexible-checksums': 3.572.0 @@ -17067,7 +17073,7 @@ snapshots: '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -17201,52 +17207,7 @@ snapshots: '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.572.0 '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.572.0 - '@aws-sdk/region-config-resolver': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0 - '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -17283,7 +17244,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/core@3.572.0': @@ -17332,23 +17292,6 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0))': - dependencies: - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0)': dependencies: '@aws-sdk/client-sts': 3.572.0 @@ -17385,25 +17328,6 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0))': - dependencies: - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-http': 3.568.0 - '@aws-sdk/credential-provider-ini': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) - '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0)': dependencies: '@aws-sdk/credential-provider-env': 3.568.0 @@ -17459,7 +17383,7 @@ snapshots: '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.572.0)': dependencies: - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) + '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/types': 2.12.0 @@ -17672,7 +17596,7 @@ snapshots: '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -18471,7 +18395,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -18486,7 +18410,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -18710,7 +18634,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -18973,7 +18897,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -19441,12 +19365,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@kwsites/file-exists@1.1.1': - dependencies: - debug: 4.3.4(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - '@kwsites/file-exists@1.1.1(supports-color@8.1.1)': dependencies: debug: 4.3.4(supports-color@8.1.1) @@ -24162,7 +24080,7 @@ snapshots: '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -24180,7 +24098,7 @@ snapshots: '@typescript-eslint/types': 7.17.0 '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.4.3) '@typescript-eslint/visitor-keys': 7.17.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.4.3 @@ -24193,7 +24111,7 @@ snapshots: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.3) '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.4.3 @@ -24206,7 +24124,7 @@ snapshots: '@typescript-eslint/types': 7.3.1 '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.4.3 @@ -24259,7 +24177,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.3) optionalDependencies: @@ -24342,7 +24260,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.3.1 '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -27426,7 +27344,7 @@ snapshots: callsite: 1.0.0 camelcase: 6.3.0 cosmiconfig: 7.1.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) deps-regex: 0.2.0 findup-sync: 5.0.0 ignore: 5.3.1 @@ -27916,7 +27834,7 @@ snapshots: eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.16.1 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) @@ -28130,7 +28048,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -29562,7 +29480,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -30525,7 +30443,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 11.0.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) execa: 7.2.0 lilconfig: 2.1.0 listr2: 6.6.1 @@ -33963,14 +33881,6 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-git@3.24.0: - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - simple-git@3.24.0(supports-color@8.1.1): dependencies: '@kwsites/file-exists': 1.1.1(supports-color@8.1.1) @@ -34411,7 +34321,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.4.3) css-functions-list: 3.2.2 css-tree: 2.3.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 file-entry-cache: 8.0.0 @@ -34449,7 +34359,7 @@ snapshots: stylus@0.62.0: dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) glob: 7.2.3 sax: 1.3.0 source-map: 0.7.4 @@ -35046,7 +34956,7 @@ snapshots: bundle-require: 4.1.0(esbuild@0.20.2) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) esbuild: 0.20.2 execa: 5.1.1 globby: 11.1.0 @@ -35568,7 +35478,7 @@ snapshots: vite-node@1.6.0(@types/node@18.19.33)(less@4.2.0)(sass@1.77.0)(stylus@0.62.0)(terser@5.31.0): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.0 vite: 5.2.11(@types/node@18.19.33)(less@4.2.0)(sass@1.77.0)(stylus@0.62.0)(terser@5.31.0) @@ -35585,7 +35495,7 @@ snapshots: vite-node@1.6.0(@types/node@22.5.5)(less@4.2.0)(sass@1.77.0)(stylus@0.62.0)(terser@5.31.0): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.0 vite: 5.2.11(@types/node@22.5.5)(less@4.2.0)(sass@1.77.0)(stylus@0.62.0)(terser@5.31.0) @@ -35709,7 +35619,7 @@ snapshots: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -35744,7 +35654,7 @@ snapshots: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -35869,6 +35779,18 @@ snapshots: web-vitals@4.2.3: {} + webflow-api@2.4.2: + dependencies: + form-data: 4.0.0 + formdata-node: 6.0.3 + js-base64: 3.7.2 + node-fetch: 2.7.0 + qs: 6.11.2 + readable-stream: 4.5.2 + url-join: 4.0.1 + transitivePeerDependencies: + - encoding + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {}