diff --git a/console/src/components/app-sidebar.tsx b/console/src/components/app-sidebar.tsx index d631abfc4..5565d6166 100644 --- a/console/src/components/app-sidebar.tsx +++ b/console/src/components/app-sidebar.tsx @@ -21,7 +21,7 @@ import type { SidebarLink } from "@/types/sidebar" import { useContext } from "react" import { AdminContext, ProjectContext } from "@/contexts" import { useResolver } from "@/hooks" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import { UserDropdown } from "./user-dropdown" import type { Admin } from "@/types" import { BookIcon } from "./icons" @@ -50,7 +50,8 @@ export function AppSidebar({ const [allProjects] = useResolver( React.useCallback(async () => { try { - return (await api.projects.all()).results + const result = await oapiClient.GET("/api/admin/projects") + return result.data?.results ?? [] } catch (error) { console.error("Failed to fetch projects:", error) return [] diff --git a/console/src/components/provider/select.tsx b/console/src/components/provider/select.tsx index c02fddc1a..690441376 100644 --- a/console/src/components/provider/select.tsx +++ b/console/src/components/provider/select.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useContext } from "react" import { ProjectContext } from "@/contexts" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import type { Provider, ProviderGroup } from "@/types" import { useTranslation } from "react-i18next" @@ -28,8 +28,17 @@ export function ProviderSelect({ value, onChange, channel }: ProviderSelectProps const fetchProviders = async () => { setIsLoading(true) try { - const result = await api.providers.all(project.id) - const filteredProviders = result.filter((provider) => provider.channel === channel) + const result = await oapiClient.GET("/api/admin/projects/{projectID}/providers", { + params: { + path: { + projectID: project.id, + }, + }, + }) + + const filteredProviders = (result.data?.results ?? []).filter( + (provider) => provider.channel === channel + ) setProviders(filteredProviders) if (filteredProviders.length > 0 && !value) { diff --git a/console/src/oapi/client.ts b/console/src/oapi/client.ts index 6809d8f75..617035f3b 100644 --- a/console/src/oapi/client.ts +++ b/console/src/oapi/client.ts @@ -1,43 +1,43 @@ -import createClient from "openapi-fetch" -import type { paths, components } from "./management.generated" +import createClient from "openapi-fetch"; +import type { paths, components } from "./management.generated"; // Create the openapi-fetch client // Note: OpenAPI paths already include /api prefix, so we use empty baseUrl export const oapiClient = createClient({ - baseUrl: "", - credentials: "include", -}) + baseUrl: "", + credentials: "include", +}); // Add response interceptor for 401 handling oapiClient.use({ - async onResponse({ response }) { - const isLoginPage = window.location.pathname.startsWith("/login") - if (response.status === 401 && !isLoginPage) { - window.location.href = `/login?r=${encodeURIComponent(window.location.href)}` - } - return response - }, -}) + async onResponse({ response }) { + const isLoginPage = window.location.pathname.startsWith("/login"); + if (response.status === 401 && !isLoginPage) { + window.location.href = `/login?r=${encodeURIComponent(window.location.href)}`; + } + return response; + }, +}); // Export schema types for convenience -export type Organization = components["schemas"]["Organization"] -export type OrganizationList = components["schemas"]["OrganizationList"] -export type UpsertOrganization = components["schemas"]["UpsertOrganization"] -export type UpdateOrganization = components["schemas"]["UpdateOrganization"] -export type OrganizationMember = components["schemas"]["OrganizationMember"] -export type OrganizationMemberList = components["schemas"]["OrganizationMemberList"] -export type AddOrganizationMember = components["schemas"]["AddOrganizationMember"] -export type User = components["schemas"]["User"] -export type UserList = components["schemas"]["UserList"] +export type Organization = components["schemas"]["Organization"]; +export type OrganizationList = components["schemas"]["OrganizationList"]; +export type UpsertOrganization = components["schemas"]["UpsertOrganization"]; +export type UpdateOrganization = components["schemas"]["UpdateOrganization"]; +export type OrganizationMember = components["schemas"]["OrganizationMember"]; +export type OrganizationMemberList = components["schemas"]["OrganizationMemberList"]; +export type AddOrganizationMember = components["schemas"]["AddOrganizationMember"]; +export type User = components["schemas"]["User"]; +export type UserList = components["schemas"]["UserList"]; -export type Action = components["schemas"]["Action"] -export type CreateAction = components["schemas"]["CreateAction"] -export type UpdateAction = components["schemas"]["UpdateAction"] -export type ActionMeta = components["schemas"]["ActionMeta"] -export type ActionFunction = components["schemas"]["ActionFunction"] -export type TestActionRequest = components["schemas"]["TestActionRequest"] -export type TestActionResult = components["schemas"]["TestActionResult"] -export type TestActionFunctionRequest = components["schemas"]["TestActionFunctionRequest"] -export type TestActionFunctionResult = components["schemas"]["TestActionFunctionResult"] +export type Action = components["schemas"]["Action"]; +export type CreateAction = components["schemas"]["CreateAction"]; +export type UpdateAction = components["schemas"]["UpdateAction"]; +export type ActionMeta = components["schemas"]["ActionMeta"]; +export type ActionFunction = components["schemas"]["ActionFunction"]; +export type TestActionRequest = components["schemas"]["TestActionRequest"]; +export type TestActionResult = components["schemas"]["TestActionResult"]; +export type TestActionFunctionRequest = components["schemas"]["TestActionFunctionRequest"]; +export type TestActionFunctionResult = components["schemas"]["TestActionFunctionResult"]; -export default oapiClient +export default oapiClient; diff --git a/console/src/oapi/management.generated.ts b/console/src/oapi/management.generated.ts index 108a95f2b..b98769da5 100644 --- a/console/src/oapi/management.generated.ts +++ b/console/src/oapi/management.generated.ts @@ -228,6 +228,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/admin/projects/{projectID}/lists/{listID}/recount": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Recount list users + * @description Recalculates the user count for a dynamic list by re-evaluating the rules + */ + post: operations["recountList"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/admin/projects/{projectID}/lists/{listID}": { parameters: { query?: never; @@ -466,7 +486,11 @@ export interface paths { * @description Triggers a user into a journey at a specific entrance step, typically used for testing or manual overrides */ post: operations["triggerUser"]; - delete?: never; + /** + * Remove user from journey + * @description Removes a user from all active entrances in a journey + */ + delete: operations["removeUserFromJourney"]; options?: never; head?: never; patch?: never; @@ -556,6 +580,106 @@ export interface paths { patch?: never; trace?: never; }; + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List users in journey step + * @description Retrieves a paginated list of users currently in a specific journey step + */ + get: operations["listJourneyStepUsers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/trigger": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Trigger user into journey entrance + * @description Manually adds a user to a specific journey entrance step + */ + post: operations["triggerUserToJourneyStep"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/skip": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Skip delay for user + * @description Skips the delay for a user currently waiting in a delay step + */ + post: operations["skipJourneyStepDelay"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Remove user from journey step + * @description Removes a user from a specific journey step entrance + */ + delete: operations["removeUserFromJourneyStep"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/admin/projects/{projectID}/journeys/{journeyID}/entrances": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List journey entrances + * @description Retrieves a paginated list of user entrances for a journey + */ + get: operations["listJourneyEntrances"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/admin/profile": { parameters: { query?: never; @@ -1661,7 +1785,7 @@ export interface components { * @example email * @enum {string} */ - Channel: "email" | "text" | "push"; + Channel: "email" | "text" | "push" | "webhook"; /** * @description Type of action (module ID from registered action modules) * @example webhook @@ -3006,6 +3130,82 @@ export interface components { UserJourneyList: components["schemas"]["PaginatedResponse"] & { results: components["schemas"]["UserJourneyEntrance"][]; }; + JourneyUserStep: { + /** + * Format: uuid + * @example 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d + */ + id: string; + /** + * Format: uuid + * @example 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d + */ + entrance_id: string; + /** + * @description Status/type of the user step + * @example waiting + * @enum {string} + */ + type: "waiting" | "completed" | "skipped" | "exited"; + /** + * Format: date-time + * @example 2025-11-24T10:30:00.000Z + */ + delay_until?: string; + /** + * Format: date-time + * @example 2025-11-19T14:18:42.960Z + */ + created_at: string; + /** + * Format: date-time + * @example 2025-11-23T17:20:00.021Z + */ + updated_at: string; + /** + * Format: date-time + * @example 2025-11-24T10:30:00.000Z + */ + ended_at?: string; + user?: components["schemas"]["User"]; + journey?: components["schemas"]["Journey"]; + step?: components["schemas"]["JourneyStep"]; + }; + JourneyUserStepList: components["schemas"]["PaginatedResponse"] & { + results: components["schemas"]["JourneyUserStep"][]; + }; + JourneyUserEntrance: { + /** + * Format: uuid + * @example 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d + */ + id: string; + /** + * Format: uuid + * @example 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d + */ + entrance_id: string; + /** + * Format: date-time + * @example 2025-11-19T14:18:42.960Z + */ + created_at: string; + /** + * Format: date-time + * @example 2025-11-23T17:20:00.021Z + */ + updated_at: string; + /** + * Format: date-time + * @example 2025-11-24T10:30:00.000Z + */ + ended_at?: string; + user?: components["schemas"]["User"]; + journey?: components["schemas"]["Journey"]; + }; + JourneyUserEntranceListResponse: components["schemas"]["PaginatedResponse"] & { + results: components["schemas"]["JourneyUserEntrance"][]; + }; /** @description Map of journey steps keyed by external_id */ JourneyStepMap: { [key: string]: components["schemas"]["JourneyStep"]; @@ -3452,6 +3652,17 @@ export interface components { }; }; }; + /** @description Journey user steps retrieved successfully */ + JourneyUserStepListResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PaginatedResponse"] & { + results: components["schemas"]["JourneyUserStep"][]; + }; + }; + }; /** @description Tags retrieved successfully */ TagListResponse: { headers: { @@ -3988,6 +4199,32 @@ export interface operations { default: components["responses"]["Error"]; }; }; + recountList: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + /** @description The list ID */ + listID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Recount started successfully. The list state will be set to 'loading'. */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["List"]; + }; + }; + default: components["responses"]["Error"]; + }; + }; getList: { parameters: { query?: never; @@ -4583,6 +4820,32 @@ export interface operations { default: components["responses"]["Error"]; }; }; + removeUserFromJourney: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + /** @description The journey ID */ + journeyID: string; + /** @description The user ID */ + userID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User removed from journey successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + default: components["responses"]["Error"]; + }; + }; getJourneySteps: { parameters: { query?: never; @@ -4717,6 +4980,150 @@ export interface operations { default: components["responses"]["Error"]; }; }; + listJourneyStepUsers: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: components["parameters"]["Limit"]; + /** @description Number of items to skip */ + offset?: components["parameters"]["Offset"]; + }; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + /** @description The journey ID */ + journeyID: string; + /** @description The step external ID */ + stepID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["JourneyUserStepListResponse"]; + default: components["responses"]["Error"]; + }; + }; + triggerUserToJourneyStep: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + /** @description The journey ID */ + journeyID: string; + /** @description The step external ID (must be an entrance step) */ + stepID: string; + /** @description The user ID */ + userID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User added to journey entrance successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["JourneyUserStep"]; + }; + }; + default: components["responses"]["Error"]; + }; + }; + skipJourneyStepDelay: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + /** @description The journey ID */ + journeyID: string; + /** @description The step external ID (must be a delay step) */ + stepID: string; + /** @description The user ID */ + userID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Delay skipped successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + default: components["responses"]["Error"]; + }; + }; + removeUserFromJourneyStep: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + /** @description The journey ID */ + journeyID: string; + /** @description The step external ID */ + stepID: string; + /** @description The user ID */ + userID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User removed from journey step successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + default: components["responses"]["Error"]; + }; + }; + listJourneyEntrances: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: components["parameters"]["Limit"]; + /** @description Number of items to skip */ + offset?: components["parameters"]["Offset"]; + /** @description Search query string */ + search?: components["parameters"]["Search"]; + }; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + /** @description The journey ID */ + journeyID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Journey entrances retrieved successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["JourneyUserEntranceListResponse"]; + }; + }; + default: components["responses"]["Error"]; + }; + }; getProfile: { parameters: { query?: never; diff --git a/console/src/types.ts b/console/src/types.ts index 61c21f546..d2617ccd0 100644 --- a/console/src/types.ts +++ b/console/src/types.ts @@ -1,6 +1,7 @@ import type { ComponentType, Dispatch, Key, ReactNode, SetStateAction } from "react" import type { FieldPath, FieldValues, UseFormReturn } from "react-hook-form" import type { Node } from "reactflow" +import type { components } from "@/oapi/management.generated" import type { UUID } from "@/types/common" export type Class = new () => T @@ -241,7 +242,7 @@ export interface OrganizationSchemaPath { } export interface VariableSuggestions { - userPaths: UserSchemaPath[] + userPaths: EventSchemaPath[] eventPaths: EventSchema[] organizationEventPaths?: EventSchema[] organizationUserPaths?: OrganizationUserSchemaPath[] @@ -422,8 +423,8 @@ export type List = { name: string state: ListState type: ListType - rule?: WrapperRule | null - draft_rule?: WrapperRule | null + rule?: any + draft_rule?: any version_number?: number | null users_count: number tags?: string[] @@ -437,8 +438,8 @@ export type List = { } & ( | { type: "dynamic" - rule: WrapperRule | null - draft_rule: WrapperRule | null + rule: any + draft_rule: any } | { type: "static" } ) @@ -468,12 +469,14 @@ export interface Journey { updated_at: string deleted_at?: string stats_at?: string - stats: Record + stats?: Record } +export type JourneyStepKind = components["schemas"]["JourneyStepType"]; + export interface JourneyStep { id: UUID - type: string + type: JourneyStepKind name: string data: T x: number @@ -482,27 +485,16 @@ export interface JourneyStep { export type JourneyStepParams = Omit -interface JourneyStepMapChild { - external_id: string - path?: string - data?: E -} - -export interface JourneyStepMap { - [external_id: string]: { - type: string - name: string - data_key?: string - data?: Record - x: number - y: number - children?: JourneyStepMapChild[] - stats?: Record - stats_at?: Date - id?: UUID - } +export type JourneyStepMapChild = components["schemas"]["JourneyStepChild"] + +export type JourneyStepMapEntry = components["schemas"]["JourneyStep"] & { + stats?: Record + stats_at?: Date + id?: UUID } +export type JourneyStepMap = Record + export interface JourneyStepTypeEditProps extends ControlledProps { journey: Journey project: Project @@ -719,7 +711,7 @@ export interface Provider { data: any is_default: boolean - setup: ProviderSetupMeta[] + setup?: ProviderSetupMeta[] external_id?: string } diff --git a/console/src/views/auth/Login.tsx b/console/src/views/auth/Login.tsx index 657229aee..31e1462f7 100644 --- a/console/src/views/auth/Login.tsx +++ b/console/src/views/auth/Login.tsx @@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next" import { Loader2, Mail, Lock, ArrowLeft } from "lucide-react" import { useForm } from "react-hook-form" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { type AuthDriver, AUTH_DRIVERS } from "../../types" import { Button } from "@/components/ui/button" @@ -57,7 +57,10 @@ export default function Login() { setIsSubmitting(true) try { - await api.auth.basicAuth(data.email, data.password) + await oapiClient.POST("/api/auth/login/{driver}/callback", { + params: { path: { driver: AUTH_DRIVERS.BASIC } }, + body: { email: data.email, password: data.password }, + }) window.location.href = redirect } catch (err) { console.error("Basic auth failed:", err) @@ -67,9 +70,10 @@ export default function Login() { } useEffect(() => { - api.auth - .methods() - .then((methods) => { + oapiClient + .GET("/api/auth/methods") + .then((result) => { + const methods = result.data ?? [] const supportedDrivers = methods.filter((driver) => SUPPORTED_DRIVERS.includes(driver), ) diff --git a/console/src/views/auth/LoginCallback.tsx b/console/src/views/auth/LoginCallback.tsx index 640899cf7..6dc877f28 100644 --- a/console/src/views/auth/LoginCallback.tsx +++ b/console/src/views/auth/LoginCallback.tsx @@ -1,7 +1,7 @@ import { useParams, useSearchParams } from "react-router" import { useEffect, useState } from "react" import { useClerk } from "@clerk/clerk-react" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { AUTH_DRIVERS } from "../../types" import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert" import { useTranslation } from "react-i18next" @@ -30,7 +30,10 @@ export default function LoginCallback() { return } // Call our backend to complete the auth flow - await api.auth.clerkAuth(token, redirect) + await oapiClient.POST("/api/auth/login/{driver}/callback", { + params: { path: { driver: "clerk" } }, + body: { redirect }, + }) break } default: diff --git a/console/src/views/campaign/CampaignDetails.tsx b/console/src/views/campaign/CampaignDetails.tsx index ac0d0d8d3..db24220a5 100644 --- a/console/src/views/campaign/CampaignDetails.tsx +++ b/console/src/views/campaign/CampaignDetails.tsx @@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next" import { Controller, useForm } from "react-hook-form" import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import { channels } from "./template/channels" @@ -50,12 +50,24 @@ function CampaignReview({ campaign, template }: { campaign: Campaign; template: setIsSubmitting(true) try { - const updatedCampaign = await api.campaigns.update(project.id, campaign.id, { - name: data.name, - provider_id: data.provider_id, + const res = await oapiClient.PATCH('/api/admin/projects/{projectID}/campaigns/{campaignID}', { + params: { + path: { + projectID: project.id, + campaignID: campaign.id, + } + }, + body: { + name: data.name, + provider_id: data.provider_id, + } }) - setCampaign(updatedCampaign) + if (res.error || !res.data) { + return + } + + setCampaign(res.data) } finally { setIsSubmitting(false) } @@ -155,9 +167,18 @@ export default function CampaignDetails() { useEffect(() => { if (!selectedUser && project?.id) { - api.users.search(project.id, { limit: 1 }).then((result) => { - if (result.results && result.results.length > 0) { - setSelectedUser(result.results[0]) + oapiClient.GET('/api/admin/projects/{projectID}/users', { + params: { + path: { + projectID: project.id, + }, + query: { + limit: 1, + } + } + }).then((result) => { + if (result.data?.results && result.data.results.length > 0) { + setSelectedUser(result.data.results[0]) } }) } diff --git a/console/src/views/campaign/Campaigns.tsx b/console/src/views/campaign/Campaigns.tsx index 9857c4262..59a29aded 100644 --- a/console/src/views/campaign/Campaigns.tsx +++ b/console/src/views/campaign/Campaigns.tsx @@ -15,7 +15,7 @@ import { Archive, } from "lucide-react" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { useResolver } from "../../hooks" import { formatDate, snakeToTitle } from "../../utils" import { getRandomColor } from "@/lib/colors" @@ -90,12 +90,26 @@ export default function Campaigns({ create = false }: CampaignsProps) { const [result, , reload] = useResolver( useCallback(async () => { - return await api.campaigns.search(project.id, { - limit: 25, - cursor, - page: pageDirection, - search: debouncedQuery || undefined, + const res = await oapiClient.GET("/api/admin/projects/{projectID}/campaigns", { + params: { + path: { projectID: project.id }, + query: { + q: debouncedQuery || undefined, + limit: 25, + cursor, + page: pageDirection, + }, + }, }) + if (res.error || !res.data) { + return null + } + return { + results: res.data.results ?? [], + nextCursor: res.data.nextCursor ?? "", + limit: res.data.limit ?? 25, + total: res.data.total ?? 0, + } }, [project.id, debouncedQuery, cursor, pageDirection]), ) @@ -123,13 +137,27 @@ export default function Campaigns({ create = false }: CampaignsProps) { const handleDuplicateCampaign = async (e: React.MouseEvent, id: UUID) => { e.stopPropagation() - const campaign = await api.campaigns.duplicate(project.id, id) - await navigate(`/projects/${project.id}/campaigns/${campaign.id.toString()}`) + const campaign = await oapiClient.POST("/api/admin/projects/{projectID}/campaigns/{campaignID}/duplicate", { + params: { + path: { + projectID: project.id, + campaignID: id, + }, + }, + }) + await navigate(`/projects/${project.id}/campaigns/${campaign.data?.id.toString()}`) } const handleArchiveCampaign = async (e: React.MouseEvent, id: UUID) => { e.stopPropagation() - await api.campaigns.delete(project.id, id) + await oapiClient.DELETE("/api/admin/projects/{projectID}/campaigns/{campaignID}", { + params: { + path: { + projectID: project.id, + campaignID: id, + }, + }, + }) await reload() } diff --git a/console/src/views/campaign/CreateCampaign.tsx b/console/src/views/campaign/CreateCampaign.tsx index 4d32ccb10..2172d011e 100644 --- a/console/src/views/campaign/CreateCampaign.tsx +++ b/console/src/views/campaign/CreateCampaign.tsx @@ -25,7 +25,7 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog" -import api from "@/api" +import { oapiClient } from "@/oapi/client" interface Channel { key: ChannelType @@ -51,11 +51,20 @@ export function CreateCampaign({ open = false, onBeforeCreate, trigger }: Create if (onBeforeCreate) { await onBeforeCreate() } - const campaign = await api.campaigns.create(project.id, { - name: generateProjectName(), - channel: channel, + const campaign = await oapiClient.POST("/api/admin/projects/{projectID}/campaigns", { + params: { + path: { + projectID: project?.id ?? "", + } + }, + body: { + name: generateProjectName(), + channel: channel, + }, }) - await navigate(`/projects/${project.id}/campaigns/${campaign.id}/setup`) + if (campaign.data?.id) { + navigate(`/projects/${project?.id}/campaigns/${campaign.data.id}/setup`) + } } const channels: Array = [ @@ -82,6 +91,7 @@ export function CreateCampaign({ open = false, onBeforeCreate, trigger }: Create }, ] + return ( setIsOpen(!isOpen)}> diff --git a/console/src/views/campaign/setup/Setup.tsx b/console/src/views/campaign/setup/Setup.tsx index 66c5387eb..36dadd494 100644 --- a/console/src/views/campaign/setup/Setup.tsx +++ b/console/src/views/campaign/setup/Setup.tsx @@ -2,7 +2,7 @@ import { Controller, useForm } from "react-hook-form" import { useContext, useState } from "react" import { CampaignContext, ProjectContext } from "@/contexts" import { useTranslation } from "react-i18next" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" @@ -37,23 +37,49 @@ export default function CampaignSetup() { const onSubmit = async (data: FormData) => { setIsSubmitting(true) try { - const updated = await api.campaigns.update(project.id, campaign.id, { - name: data.name, - provider_id: data.provider_id, + const updated = await oapiClient.PATCH("/api/admin/projects/{projectID}/campaigns/{campaignID}", { + params: { + path: { + projectID: project.id, + campaignID: campaign.id, + } + }, + body: { + name: data.name, + provider_id: data.provider_id, + } }) - setCampaign(updated) + if (!updated.data) { + return + } + + setCampaign(updated.data) if (campaign.templates?.length === 0) { - const template = await api.campaigns.templates.create(project.id, campaign.id, { - locale: project.locale, - data: {}, + const template = await oapiClient.POST("/api/admin/projects/{projectID}/campaigns/{campaignID}/templates", { + params: { + path: { + projectID: project.id, + campaignID: campaign.id, + } + }, + body: { + locale: project.locale, + data: {}, + } }) - setCampaign({ - ...campaign, - templates: [template], - }) + if (template.data?.id) { + setCampaign({ + ...campaign, + templates: [template.data], + }) + await navigate( + `/projects/${project.id}/campaigns/${campaign.id.toString()}/templates/${template.data.id.toString()}`, + ) + return + } } const template = diff --git a/console/src/views/campaign/template/Content.tsx b/console/src/views/campaign/template/Content.tsx index b5e5b4e94..23535896d 100644 --- a/console/src/views/campaign/template/Content.tsx +++ b/console/src/views/campaign/template/Content.tsx @@ -5,7 +5,7 @@ import { TemplateContext as CurrentTemplateContext, } from "@/contexts" import { useTranslation } from "react-i18next" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import { channels } from "./channels" import { TemplateWorkflowContext } from "./contexts" @@ -44,11 +44,24 @@ export default function TemplateContent() { } const data = form.getValues() - const updated = await api.campaigns.templates.update(project.id, campaign.id, template.id, { - data: { ...template.data, ...data }, + const updated = await oapiClient.PATCH("/api/admin/projects/{projectID}/campaigns/{campaignID}/templates/{templateID}", { + params: { + path: { + projectID: project.id, + campaignID: campaign.id, + templateID: template.id, + } + }, + body: { + data: { ...template.data, ...data }, + } }) - setTemplate(updated) + if (!updated.data) { + return false + } + + setTemplate(updated.data) return true }) diff --git a/console/src/views/campaign/template/Review.tsx b/console/src/views/campaign/template/Review.tsx index 72953c440..a9658b0b2 100644 --- a/console/src/views/campaign/template/Review.tsx +++ b/console/src/views/campaign/template/Review.tsx @@ -6,7 +6,7 @@ import { } from "@/contexts" import type { User } from "@/types" import { useTranslation } from "react-i18next" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import { channels } from "./channels" @@ -24,9 +24,19 @@ export default function TemplateReview() { useEffect(() => { if (!selectedUser && project?.id) { - api.users.search(project.id, { limit: 1 }).then((result) => { - if (result.results && result.results.length > 0) { - setSelectedUser(result.results[0]) + oapiClient.GET("/api/admin/projects/{projectID}/users", { + params: { + path: { + projectID: project.id, + }, + query: { + limit: 1, + }, + }, + }).then((res) => { + const users = res.data?.results || [] + if (users.length > 0) { + setSelectedUser(users[0]) } }) } @@ -51,8 +61,16 @@ export default function TemplateReview() { return false } - await api.campaigns.update(project.id, campaign.id, { - state: "running", + await oapiClient.PATCH("/api/admin/projects/{projectID}/campaigns/{campaignID}", { + params: { + path: { + projectID: project.id, + campaignID: campaign.id, + }, + }, + body: { + state: "running", + }, }) return true diff --git a/console/src/views/campaign/template/Template.tsx b/console/src/views/campaign/template/Template.tsx index 643fbeb36..1a1a4f505 100644 --- a/console/src/views/campaign/template/Template.tsx +++ b/console/src/views/campaign/template/Template.tsx @@ -1,15 +1,34 @@ -import { ChevronRight, Loader2 } from "lucide-react" -import { Link, Outlet, useLocation, useNavigate, useParams } from "react-router" -import { useCallback, useContext, useMemo, memo, useState, useEffect, useRef } from "react" -import { CampaignContext, LocaleContext, ProjectContext, type LocaleSelection } from "@/contexts" -import api from "@/api" +import { ChevronRight, Loader2 } from "lucide-react"; +import { + Link, + Outlet, + useLocation, + useNavigate, + useParams, +} from "react-router"; +import { + useCallback, + useContext, + useMemo, + memo, + useState, + useEffect, + useRef, +} from "react"; +import { + CampaignContext, + LocaleContext, + ProjectContext, + type LocaleSelection, +} from "@/contexts"; +import { oapiClient } from "@/oapi/client"; import { Pagination, PaginationContent, PaginationItem } from "@/components/ui/pagination" -import { LocaleSelect } from "@/components/locale/select" -import { Button } from "@/components/ui/button" -import { TemplateWorkflowContext } from "./contexts" -import { t } from "i18next" +import { LocaleSelect } from "@/components/locale/select"; +import { Button } from "@/components/ui/button"; +import { TemplateWorkflowContext } from "./contexts"; +import { t } from "i18next"; interface CampaignStepProps { steps: Array<{ name: string; href: string }> @@ -67,142 +86,184 @@ export default function Template() { const navSteps = [{ name: "Content", href: basePath }] - if (campaign.channel === "email") { - navSteps.push({ name: "Editor", href: `${basePath}/email/editor` }) - } - - navSteps.push({ name: "Review", href: `${basePath}/review` }) - - return navSteps - }, [project.id, campaign.id, campaign.channel, campaign.templates, project.locale, templateId]) - - const nextStep = useMemo(() => { - const currentIndex = steps.findIndex((step) => step.href === location.pathname) - return currentIndex !== -1 && currentIndex < steps.length - 1 - ? steps[currentIndex + 1] - : undefined - }, [steps, location.pathname]) - - const onSubmit = useCallback((fn: () => Promise | boolean) => { - handler.current = fn - return () => { - if (handler.current === fn) handler.current = null - } - }, []) - - const submit = useCallback(async () => { - if (!handler.current) return - - setIsNextLoading(true) - try { - const next = await handler.current() - if (next && nextStep) navigate(nextStep.href) - } finally { - setIsNextLoading(false) - } - }, [navigate, nextStep]) - - const currentTemplate = useMemo( - () => campaign.templates?.find((t) => t.id === templateId), - [campaign.templates, templateId], - ) - const workflowContextValue = useMemo( - () => ({ onSubmit, submit, canProceed, setCanProceed }), - [onSubmit, submit, canProceed], - ) - - const publish = useCallback(async () => { - if (!handler.current) return + if (campaign.channel === "email") { + navSteps.push({ name: "Editor", href: `${basePath}/email/editor` }); + } - setIsNextLoading(true) - try { - await handler.current() - navigate(`/projects/${project.id}/campaigns`) - } finally { - setIsNextLoading(false) + navSteps.push({ name: "Review", href: `${basePath}/review` }); + + return navSteps; + }, [ + project.id, + campaign.id, + campaign.channel, + campaign.templates, + project.locale, + templateId, + ]); + + const nextStep = useMemo(() => { + const currentIndex = steps.findIndex( + (step) => step.href === location.pathname, + ); + return currentIndex !== -1 && currentIndex < steps.length - 1 + ? steps[currentIndex + 1] + : undefined; + }, [steps, location.pathname]); + + const onSubmit = useCallback((fn: () => Promise | boolean) => { + handler.current = fn; + return () => { + if (handler.current === fn) handler.current = null; + }; + }, []); + + const submit = useCallback(async () => { + if (!handler.current) return; + + setIsNextLoading(true); + try { + const next = await handler.current(); + if (next && nextStep) navigate(nextStep.href); + } finally { + setIsNextLoading(false); + } + }, [navigate, nextStep]); + + const currentTemplate = useMemo( + () => campaign.templates?.find((t) => t.id === templateId), + [campaign.templates, templateId], + ); + const workflowContextValue = useMemo( + () => ({ onSubmit, submit, canProceed, setCanProceed }), + [onSubmit, submit, canProceed], + ); + + const publish = useCallback(async () => { + if (!handler.current) return; + + setIsNextLoading(true); + try { + await handler.current(); + navigate(`/projects/${project.id}/campaigns`); + } finally { + setIsNextLoading(false); + } + }, [project.id, navigate]); + + const navigateToTemplate = useCallback( + (templateId: string) => { + const basePath = `/projects/${project.id}/campaigns/${campaign.id}/templates/${templateId}`; + const suffix = location.pathname.split(/\/templates\/[^/]+/)[1] ?? ""; + navigate(basePath + suffix); + }, + [project.id, campaign.id, location.pathname, navigate], + ); + + const handleLocaleChange = useCallback( + async (localeKey: string) => { + if (handler.current) { + const next = await handler.current(); + if (!next) { + return; } - }, [project.id, navigate]) - - const navigateToTemplate = useCallback( - (templateId: string) => { - const basePath = `/projects/${project.id}/campaigns/${campaign.id}/templates/${templateId}` - const suffix = location.pathname.split(/\/templates\/[^/]+/)[1] ?? "" - navigate(basePath + suffix) + } + + const selectedTemplate = campaign.templates.find( + (template) => template.locale === localeKey, + ); + if (selectedTemplate) { + navigateToTemplate(selectedTemplate.id); + return; + } + + setPageLoading(true); + const template = await oapiClient.POST( + "/api/admin/projects/{projectID}/campaigns/{campaignID}/templates", + { + params: { + path: { + projectID: project.id, + campaignID: campaign.id, + }, + }, + body: { + locale: localeKey, + data: {}, + }, }, - [project.id, campaign.id, location.pathname, navigate], - ) - - const handleLocaleChange = useCallback( - async (localeKey: string) => { - if (handler.current) { - const next = await handler.current() - if (!next) { - return - } - } - - const selectedTemplate = campaign.templates.find( - (template) => template.locale === localeKey, - ) - if (selectedTemplate) { - navigateToTemplate(selectedTemplate.id) - return - } - - setPageLoading(true) - const template = await api.campaigns.templates.create(project.id, campaign.id, { - locale: localeKey, - data: {}, - }) - - setCampaign({ - ...campaign, - templates: [...campaign.templates, template], - }) - - navigateToTemplate(template.id) - setPageLoading(false) - }, - [campaign, project?.id, setCampaign, navigateToTemplate], - ) - - // Fetch locales when template changes - useEffect(() => { - const fetchLocales = async () => { - if (!project?.id) return - - setPageLoading(true) - - const allLocalesResult = await api.locales.search(project.id, { - limit: 5, - }) - if (currentTemplate) { - try { - const selectedLocale = await api.locales.getByKey( - project.id, - currentTemplate.locale, - ) - setLocaleSelection({ - currentLocale: selectedLocale, - allLocales: allLocalesResult.results, - }) - } catch { - // Locale not found, use default or first available locale - console.warn(`Locale ${currentTemplate.locale} not found, using default`) - setLocaleSelection({ - currentLocale: allLocalesResult.results[0], - allLocales: allLocalesResult.results, - }) - } - } else { - setLocaleSelection({ - currentLocale: undefined, - allLocales: allLocalesResult.results, - }) - } - - setPageLoading(false) + ); + + if (template.data) { + setCampaign({ + ...campaign, + templates: [...campaign.templates, template.data], + }); + + navigateToTemplate(template.data.id); + } + setPageLoading(false); + }, + [campaign, project?.id, setCampaign, navigateToTemplate], + ); + + // Fetch locales when template changes + useEffect(() => { + const fetchLocales = async () => { + if (!project?.id) return; + + setPageLoading(true); + + try { + const allLocalesResult = await oapiClient.GET( + "/api/admin/projects/{projectID}/locales", + { + params: { + path: { + projectID: project.id, + }, + }, + }, + ); + if (currentTemplate) { + try { + const selectedLocale = await oapiClient.GET( + "/api/admin/projects/{projectID}/locales/{localeID}", + { + params: { + path: { + projectID: project.id, + localeID: currentTemplate.locale, + }, + }, + }, + ); + setLocaleSelection({ + currentLocale: selectedLocale.data, + allLocales: allLocalesResult.data?.results ?? [], + }); + } catch { + // Locale not found, use default or first available locale + console.warn( + `Locale ${currentTemplate.locale} not found, using default`, + ); + setLocaleSelection({ + currentLocale: allLocalesResult.data?.results?.[0], + allLocales: allLocalesResult.data?.results ?? [], + }); + } + } else { + setLocaleSelection({ + currentLocale: undefined, + allLocales: allLocalesResult.data?.results ?? [], + }); } + } catch (error) { + console.error("Failed to fetch locales:", error); + } finally { + setPageLoading(false); + } + }; fetchLocales() }, [project?.id, currentTemplate]) diff --git a/console/src/views/campaign/template/UserSelection.tsx b/console/src/views/campaign/template/UserSelection.tsx index 6cd6c4d03..9efeb81ad 100644 --- a/console/src/views/campaign/template/UserSelection.tsx +++ b/console/src/views/campaign/template/UserSelection.tsx @@ -1,7 +1,7 @@ import { useState, useCallback, useEffect } from "react" import type { User } from "@/types" import { cn } from "@/utils" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import { Check, ChevronsUpDown } from "lucide-react" import { Button } from "@/components/ui/button" @@ -29,12 +29,19 @@ export function UserSelection({ projectId, value, onChange }: UserSelectionProps const [users, setUsers] = useState([]) const fetchUsers = useCallback(async () => { - const users = await api.users.search(projectId, { - search: search, - limit: 50, + const result = await oapiClient.GET("/api/admin/projects/{projectID}/users", { + params: { + path: { + projectID: projectId, + }, + query: { + search: search, + limit: 50, + } + }, }) - setUsers(users.results) + setUsers(result.data?.results || []) }, [projectId, search]) useEffect(() => { @@ -70,7 +77,7 @@ export function UserSelection({ projectId, value, onChange }: UserSelectionProps No user found. - {users.map((user) => ( + {users?.map((user) => ( { const fetchLocales = async () => { if (project?.id) { - const result = await api.locales.search(project.id, { limit: 100 }) - setLocales(result.results) + const result = await oapiClient.GET("/api/admin/projects/{projectID}/locales", { + params: { + path: { + projectID: project.id, + } + } + }) + setLocales(result.data?.results ?? []) } } fetchLocales() diff --git a/console/src/views/campaign/template/push/Setup.tsx b/console/src/views/campaign/template/push/Setup.tsx index d6a702a04..91e73a92a 100644 --- a/console/src/views/campaign/template/push/Setup.tsx +++ b/console/src/views/campaign/template/push/Setup.tsx @@ -7,7 +7,7 @@ import { useContext, useState, useEffect } from "react" import { ProjectContext, TemplateContext } from "@/contexts" import { useNavigate } from "react-router" import { Button } from "@/components/ui/button" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import * as z from "zod" import { Field, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field" @@ -134,8 +134,14 @@ export function PushPreview({ campaign, form, edit = false }: PushSetupProps) { useEffect(() => { const fetchLocales = async () => { if (project?.id) { - const result = await api.locales.search(project.id, { limit: 100 }) - setLocales(result.results) + const res = await oapiClient.GET("/api/admin/projects/{projectID}/locales", { + params: { + path: { + projectID: project.id, + }, + }, + }) + setLocales(res.data?.results || []) } } fetchLocales() diff --git a/console/src/views/campaign/template/text/Setup.tsx b/console/src/views/campaign/template/text/Setup.tsx index 8f1c70972..053384d64 100644 --- a/console/src/views/campaign/template/text/Setup.tsx +++ b/console/src/views/campaign/template/text/Setup.tsx @@ -4,7 +4,7 @@ import { Ellipsis, UserRound } from "lucide-react" import type { Campaign, Template, User, Locale } from "@/types" import { useTranslation } from "react-i18next" import { useNavigate } from "react-router" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import * as z from "zod" import { Field, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field" @@ -117,8 +117,14 @@ export function TextPreview({ campaign, form, edit = false }: TextSetupProps) { useEffect(() => { const fetchLocales = async () => { if (project?.id) { - const result = await api.locales.search(project.id, { limit: 100 }) - setLocales(result.results) + const res = await oapiClient.GET("/api/admin/projects/{projectID}/locales", { + params: { + path: { + projectID: project.id, + }, + }, + }) + setLocales(res.data?.results ?? []) } } fetchLocales() diff --git a/console/src/views/journey/JourneyForm.tsx b/console/src/views/journey/JourneyForm.tsx index 8cc73471b..0a90fbd79 100644 --- a/console/src/views/journey/JourneyForm.tsx +++ b/console/src/views/journey/JourneyForm.tsx @@ -1,6 +1,6 @@ import { useContext, useState } from "react" import { toast } from "sonner" -import api from "../../api" +import oapiClient from "@/oapi/client" import { ProjectContext } from "../../contexts" import type { Journey } from "../../types" import { useTranslation } from "react-i18next" @@ -30,21 +30,41 @@ export function JourneyForm({ journey, onSaved }: JourneyFormProps) { e.preventDefault() setSaving(true) try { - const saved = journey?.id - ? await api.journeys.update(project.id, journey.id, { - name, - description, - status, - tags: journey.tags, - }) - : await api.journeys.create(project.id, { - name, - description, - status, - tags: journey?.tags, + const payload = { + name, + description, + status, + tags: journey?.tags, + } + + const response = journey?.id + ? await oapiClient.PATCH( + `/api/admin/projects/{projectID}/journeys/{journeyID}`, + { + params: { + path: { + projectID: project.id, + journeyID: journey.id, + }, + }, + body: payload, + }, + ) + : await oapiClient.POST(`/api/admin/projects/{projectID}/journeys`, { + params: { + path: { + projectID: project.id, + }, + }, + body: payload, }) + + if (!response.data) { + return + } + toast.success(t("journey_saved")) - onSaved?.(saved) + onSaved?.(response.data) } finally { setSaving(false) } diff --git a/console/src/views/journey/JourneyStepUsers.tsx b/console/src/views/journey/JourneyStepUsers.tsx index bec2b2275..3f0b632cb 100644 --- a/console/src/views/journey/JourneyStepUsers.tsx +++ b/console/src/views/journey/JourneyStepUsers.tsx @@ -5,7 +5,7 @@ import clsx from "clsx" import { JourneyContext, ProjectContext } from "../../contexts" import { PreferencesContext } from "@/contexts/PreferencesContext" import { SearchTable, useSearchTableState } from "@/components/search-table" -import api from "../../api" +import oapiClient from "@/oapi/client" import { Badge } from "@/components/ui/badge" import { Avatar, AvatarFallback } from "@/components/ui/avatar" import { Button } from "@/components/ui/button" @@ -89,8 +89,37 @@ export function JourneyStepUsers({ open, onClose, stepType, stepId, stepName }: const state = useSearchTableState( useCallback( - async (params) => - await api.journeys.steps.searchUsers(projectId, journeyId, stepId, params), + async (params) => { + const res = await oapiClient.GET( + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users", + { + params: { + path: { + projectID: projectId, + journeyID: journeyId, + stepID: stepId, + }, + query: { + limit: params.limit, + offset: params.cursor ? +params.cursor : 0, + }, + }, + }, + ) + if (!res.data) return null + const { results, limit, offset, total } = res.data + return { + results, + limit, + nextCursor: + typeof total === "number" && + typeof limit === "number" && + typeof offset === "number" && + offset + results.length < total + ? String(offset + results.length) + : "", + } + }, [projectId, journeyId, stepId], ), { @@ -100,13 +129,54 @@ export function JourneyStepUsers({ open, onClose, stepType, stepId, stepName }: }, ) + const handleAddUserToEntrance = async (stepId: UUID, user: User) => { + await oapiClient.POST( + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/trigger", + { + params: { + path: { + projectID: projectId, + journeyID: journeyId, + stepID: stepId, + userID: user.id, + }, + }, + }, + ) + await state.reload() + } + const handleSkipDelay = async (stepId: UUID, user: User) => { - await api.journeys.users.skipDelay(projectId, journeyId, user.id, stepId) + await oapiClient.POST( + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/skip", + { + params: { + path: { + projectID: projectId, + journeyID: journeyId, + stepID: stepId, + userID: user.id, + }, + }, + }, + ) await state.reload() } - const handleRemoveFromJourney = async (stepId: UUID, user: User) => { - await api.journeys.users.removeFromJourney(projectId, journeyId, user.id, stepId) + const handleRemoveFromJourney = async (_stepId: UUID, user: User) => { + await oapiClient.DELETE( + "/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}", + { + params: { + path: { + projectID: projectId, + journeyID: journeyId, + stepID: stepId, + userID: user.id, + }, + }, + }, + ) await state.reload() } diff --git a/console/src/views/journey/JourneyUserEntrances.tsx b/console/src/views/journey/JourneyUserEntrances.tsx index 255b3836c..9d2a0785f 100644 --- a/console/src/views/journey/JourneyUserEntrances.tsx +++ b/console/src/views/journey/JourneyUserEntrances.tsx @@ -1,7 +1,7 @@ import { useCallback, useContext } from "react" import { JourneyContext, ProjectContext } from "../../contexts" import { SearchTable, useSearchTableQueryState } from "@/components/search-table" -import api from "../../api" +import oapiClient from "@/oapi/client" export default function JourneyUserEntrances() { const [project] = useContext(ProjectContext) @@ -12,7 +12,36 @@ export default function JourneyUserEntrances() { const state = useSearchTableQueryState( useCallback( - async (params) => await api.journeys.entrances.search(projectId, journeyId, params), + async (params) => { + const res = await oapiClient.GET( + "/api/admin/projects/{projectID}/journeys/{journeyID}/entrances", + { + params: { + path: { + projectID: projectId, + journeyID: journeyId, + }, + query: { + limit: params.limit, + offset: params.cursor ? +params.cursor : 0, + }, + }, + }, + ) + if (!res.data) return null + const { results, limit, offset, total } = res.data + return { + results, + limit, + nextCursor: + typeof total === "number" && + typeof limit === "number" && + typeof offset === "number" && + offset + results.length < total + ? String(offset + results.length) + : "", + } + }, [projectId, journeyId], ), ) diff --git a/console/src/views/journey/Journeys.tsx b/console/src/views/journey/Journeys.tsx index 1330f9f47..5537913d8 100644 --- a/console/src/views/journey/Journeys.tsx +++ b/console/src/views/journey/Journeys.tsx @@ -15,7 +15,7 @@ import { Archive, } from "lucide-react" -import api from "../../api" +import oapiClient from "@/oapi/client" import { useResolver } from "../../hooks" import { formatDate } from "../../utils" import { getRandomColor } from "@/lib/colors" @@ -96,12 +96,19 @@ export default function Journeys() { const [result, , reload] = useResolver( useCallback(async () => { - return await api.journeys.search(project.id, { - limit: 25, - cursor, - page: pageDirection, - search: debouncedQuery || undefined, + const res = await oapiClient.GET(`/api/admin/projects/{projectID}/journeys`, { + params: { + path: { projectID: project.id }, + query: { + limit: 25, + cursor, + page: pageDirection, + search: debouncedQuery || undefined, + }, + }, }) + if (!res.data) return null + return res.data }, [project.id, debouncedQuery, cursor, pageDirection]), ) @@ -133,13 +140,33 @@ export default function Journeys() { const handleDuplicateJourney = async (e: React.MouseEvent, id: UUID) => { e.stopPropagation() - const journey = await api.journeys.duplicate(project.id, id) - await navigate(journey.id.toString()) + const res = await oapiClient.POST( + `/api/admin/projects/{projectID}/journeys/{journeyID}/duplicate`, + { + params: { + path: { + projectID: project.id, + journeyID: id, + }, + }, + }, + ) + if (!res.data) { + return + } + await navigate(res.data.id) } const handleArchiveJourney = async (e: React.MouseEvent, id: UUID) => { e.stopPropagation() - await api.journeys.delete(project.id, id) + await oapiClient.DELETE(`/api/admin/projects/{projectID}/journeys/{journeyID}`, { + params: { + path: { + projectID: project.id, + journeyID: id, + }, + }, + }) await reload() } diff --git a/console/src/views/journey/steps/Entrance.tsx b/console/src/views/journey/steps/Entrance.tsx index b80ca74d6..814ed6b68 100644 --- a/console/src/views/journey/steps/Entrance.tsx +++ b/console/src/views/journey/steps/Entrance.tsx @@ -8,7 +8,7 @@ import { Switch } from "@/components/ui/switch" import { Label } from "@/components/ui/label" import { Combobox } from "@/components/ui/combobox" import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs" -import api from "../../../api" +import oapiClient from "@/oapi/client" import { Button } from "@/components/ui/button" import { env } from "../../../config/env" import { useTranslation, Trans } from "react-i18next" @@ -185,17 +185,18 @@ export const entranceStep: JourneyStepType = { const handleSearch = useCallback( async (query: string): Promise => { if (!cacheRef.current) { - const suggestions = await api.projects.pathSuggestions(projectId) - cacheRef.current = Array.isArray(suggestions?.eventPaths) - ? suggestions.eventPaths.map((event, index) => ({ - id: `event-${index}` as UUID, - name: event.name, - path: event.name, - type: "event" as const, - data_type: "string" as const, - visibility: "public" as const, - })) - : [] + const res = await oapiClient.GET('/api/admin/projects/{projectID}/events/schema', { + params: { path: { projectID: projectId } }, + }) + const events = res.data?.results ?? [] + cacheRef.current = events.map((event, index) => ({ + id: `event-${index}` as UUID, + name: event.name, + path: event.name, + type: "event" as const, + data_type: "string" as const, + visibility: "public" as const, + })) } if (!query) return cacheRef.current const lower = query.toLowerCase() diff --git a/console/src/views/journey/steps/JourneyLink.tsx b/console/src/views/journey/steps/JourneyLink.tsx index cf46b89f4..257878631 100644 --- a/console/src/views/journey/steps/JourneyLink.tsx +++ b/console/src/views/journey/steps/JourneyLink.tsx @@ -1,5 +1,5 @@ import { useCallback } from "react" -import api from "../../../api" +import oapiClient from "@/oapi/client" import type { Journey, JourneyStepType } from "../../../types" import { Combobox } from "@/components/ui/combobox" import { Label } from "@/components/ui/label" @@ -41,7 +41,15 @@ export const journeyLinkStep: JourneyStepType = { return journey } if (target_id) { - return await api.journeys.get(project.id, target_id) + const res = await oapiClient.GET('/api/admin/projects/{projectID}/journeys/{journeyID}', { + params: { + path: { + projectID: project.id, + journeyID: target_id, + }, + }, + }) + return res.data ?? null } return null }, [project, journey, target_id]), @@ -73,7 +81,15 @@ export const journeyLinkStep: JourneyStepType = { const [target] = useResolver( useCallback(async () => { if (value.target_id && value.target_id !== NIL) { - return await api.journeys.get(project.id, value.target_id) + const res = await oapiClient.GET('/api/admin/projects/{projectID}/journeys/{journeyID}', { + params: { + path: { + projectID: project.id, + journeyID: value.target_id, + }, + }, + }) + return res.data ?? null } return null }, [project.id, value.target_id]), @@ -81,11 +97,17 @@ export const journeyLinkStep: JourneyStepType = { const handleSearch = useCallback( async (query: string): Promise => { - const result = await api.journeys.search(project.id, { - search: query || undefined, - limit: 50, + const res = await oapiClient.GET('/api/admin/projects/{projectID}/journeys', { + params: { + path: { projectID: project.id }, + query: { + search: query || undefined, + limit: 50, + }, + }, }) - return result.results.map((j) => ({ ...j, path: j.id })) + const results = res.data?.results ?? [] + return results.map((j) => ({ ...j, path: j.id })) }, [project.id], ) diff --git a/console/src/views/project/GettingStarted.tsx b/console/src/views/project/GettingStarted.tsx index 88617a444..d7d7966c1 100644 --- a/console/src/views/project/GettingStarted.tsx +++ b/console/src/views/project/GettingStarted.tsx @@ -15,7 +15,7 @@ import { ProjectContext } from "@/contexts" import { useNavigate, useParams } from "react-router" import type { UUID } from "@/types/common" import { NIL } from "uuid" -import api from "@/api" +import { oapiClient } from "@/oapi/client" import { cn } from "@/utils" import { t } from "i18next" import { Puzzle } from "lucide-react" @@ -28,8 +28,23 @@ export default function ProjectGettingStarted() { useEffect(() => { const loadProject = async () => { - const projectState = await api.projects.get(projectId) - setProject(projectState) + const res = await oapiClient.GET('/api/admin/projects/{projectID}', { + params: { + path: { projectID: projectId } + } + }) + if (!res.data) return + const { role, ...projectData } = res.data + const validRole = + role === 'support' || role === 'editor' || role === 'publisher' || role === 'admin' + ? role + : undefined + setProject({ + ...projectData, + link_wrap_email: res.data.link_wrap_email ?? false, + link_wrap_push: res.data.link_wrap_push ?? false, + role: validRole, + }) } loadProject().catch(console.error) }, [setProject, projectId]) @@ -43,13 +58,21 @@ export default function ProjectGettingStarted() { async function createOnboardingJourney() { setIsJourneyLoading(true) try { - const journey = await api.journeys.create(projectId, { - name: "Onboarding", - description: "Getting started with your first journey", - template_id: "onboarding", - status: "draft", + const res = await oapiClient.POST("/api/admin/projects/{projectID}/journeys", { + params: { + path: { + projectID: projectId + } + }, + body: { + name: "Onboarding", + description: "Getting started with your first journey", + template_id: "onboarding", + status: "draft", + }, }) - await navigate(`/projects/${projectId}/journeys/${journey.id}`) + if (!res.data) return + await navigate(`/projects/${projectId}/journeys/${res.data.id}`) } finally { setIsJourneyLoading(false) } diff --git a/console/src/views/project/ProjectForm.tsx b/console/src/views/project/ProjectForm.tsx index 7ccfe9ec7..193219eca 100644 --- a/console/src/views/project/ProjectForm.tsx +++ b/console/src/views/project/ProjectForm.tsx @@ -1,4 +1,5 @@ -import api from "../../api" +import { oapiClient } from "@/oapi/client" +import type { components } from "@/oapi/management.generated" import type { Project } from "../../types" import { useTranslation } from "react-i18next" import type { UseFormReturn } from "react-hook-form" @@ -45,9 +46,11 @@ export declare namespace Intl { } } +type OapiProject = components["schemas"]["Project"] + interface ProjectFormProps { project?: Project - onSave?: (project: Project) => void + onSave?: (project: OapiProject) => void } export default function ProjectForm({ project, onSave }: ProjectFormProps) { @@ -87,10 +90,20 @@ export default function ProjectForm({ project, onSave }: ProjectFormProps) { } try { - const updatedProject = id - ? await api.projects.update(id, params) - : await api.projects.create(params) - onSave?.(updatedProject) + const res = id + ? await oapiClient.PATCH("/api/admin/projects/{projectID}", { + params: { + path: { projectID: id }, + }, + body: params, + }) + : await oapiClient.POST("/api/admin/projects", { + body: params, + }) + if (!res.data) { + return + } + onSave?.(res.data) } catch (error) { console.error("Failed to save project", error) window.alert(t("project.saveError", "Unable to save project. Please try again.")) diff --git a/console/src/views/project/ProjectOnboardingGettingStarted.tsx b/console/src/views/project/ProjectOnboardingGettingStarted.tsx index d2896256d..fcffce2f3 100644 --- a/console/src/views/project/ProjectOnboardingGettingStarted.tsx +++ b/console/src/views/project/ProjectOnboardingGettingStarted.tsx @@ -9,7 +9,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import type { UUID } from "@/types/common" import { useState } from "react" import { NIL } from "uuid" @@ -24,20 +24,33 @@ export default function ProjectOnboardingGettingStarted() { async function createOnboardingJourney() { setIsJourneyLoading(true) try { - const journeys = await api.journeys.search(projectId, { limit: 1 }) - if (journeys.results.length > 0) { - await navigate(`/projects/${projectId}/journeys/${journeys.results[0].id}`) + const searchRes = await oapiClient.GET("/api/admin/projects/{projectID}/journeys", { + params: { + path: { projectID: projectId }, + query: { limit: 1 }, + }, + }) + if (searchRes.data?.results && searchRes.data.results.length > 0) { + await navigate(`/projects/${projectId}/journeys/${searchRes.data.results[0].id}`) return } - const journey = await api.journeys.create(projectId, { - name: "Onboarding", - description: "Getting started with your first journey", - template_id: "onboarding", - status: "draft", + const res = await oapiClient.POST("/api/admin/projects/{projectID}/journeys", { + params: { + path: { + projectID: projectId + } + }, + body: { + name: "Onboarding", + description: "Getting started with your first journey", + template_id: "onboarding", + status: "draft", + }, }) - await navigate(`/projects/${projectId}/journeys/${journey.id}`) + if (!res.data) return + await navigate(`/projects/${projectId}/journeys/${res.data.id}`) } finally { setIsJourneyLoading(false) } diff --git a/console/src/views/project/ProjectOnboardingUsers.tsx b/console/src/views/project/ProjectOnboardingUsers.tsx index 58f15942c..d6d589fd4 100644 --- a/console/src/views/project/ProjectOnboardingUsers.tsx +++ b/console/src/views/project/ProjectOnboardingUsers.tsx @@ -10,7 +10,7 @@ import { CardTitle, } from "@/components/ui/card" import { UserImportForm } from "@/components/ui/user-import-dialog" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import type { UUID } from "@/types/common" import { useContext, useState } from "react" import { NIL } from "uuid" @@ -26,22 +26,29 @@ export default function ProjectOnboardingUsers() { const [skipLoading, setSkipLoading] = useState(false) async function createInitialUser() { - const admin = await api.admins.whoami() - if (!admin) return + const res = await oapiClient.GET("/api/admin/organizations/whoami") + if (!res.data) return let fullName - if (admin.first_name || admin.last_name) { - fullName = admin.last_name ? admin.first_name + " " + admin.last_name : admin.first_name + if (res.data.first_name || res.data.last_name) { + fullName = res.data.last_name ? res.data.first_name + " " + res.data.last_name : res.data.first_name } - await api.users.create(projectId, { - anonymous_id: crypto.randomUUID(), - data: { - full_name: fullName, - admin: true, + await oapiClient.POST("/api/admin/projects/{projectID}/users", { + params: { + path: { + projectID: projectId, + }, + }, + body: { + anonymous_id: crypto.randomUUID(), + data: { + full_name: fullName, + admin: true, + }, + email: res.data.email, + timezone: project.timezone, }, - email: admin.email, - timezone: project.timezone, }) } @@ -51,7 +58,13 @@ export default function ProjectOnboardingUsers() { await createInitialUser() if (file) { - await api.users.addImport(projectId, file) + const formData = new FormData() + formData.append("file", file) + await fetch(`/api/admin/projects/${projectId}/users/import`, { + method: "POST", + credentials: "include", + body: formData, + }) } await navigate(`/projects/${projectId}/onboarding/getting-started`) diff --git a/console/src/views/project/Projects.tsx b/console/src/views/project/Projects.tsx index 53ae54f43..665183856 100644 --- a/console/src/views/project/Projects.tsx +++ b/console/src/views/project/Projects.tsx @@ -1,6 +1,6 @@ import { useContext, useEffect, useMemo, useState } from "react" import { useNavigate } from "react-router" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { useResolver } from "../../hooks" import type { Project } from "../../types" import { Button } from "@/components/ui/button" @@ -17,9 +17,16 @@ export function Projects() { const navigate = useNavigate() const { t } = useTranslation() const [preferences] = useContext(PreferencesContext) - const [response] = useResolver(api.projects.all) - const projects = response?.results - + const [res] = useResolver(() => oapiClient.GET('/api/admin/projects', { + params: { + query: { + limit: 50, + offset: 0, + }, + }, + }) + ) + const projects = res?.data?.results || []; const recents = useMemo(() => { const recents = getRecentProjects() if (!projects?.length || !recents.length) return [] @@ -34,20 +41,22 @@ export function Projects() { a.push({ when, project, - }) + }); } - return a - }, []) - }, [projects]) - const [open, setOpen] = useState(false) + return a; + }, []); + }, [projects]); + const [open, setOpen] = useState(false); useEffect(() => { - if (projects && !projects.length) { + if (res && projects && !projects.length) { navigate("/onboarding/project")?.catch((e) => { console.error("Failed to navigate to onboarding:", e) }) } - }, [projects, navigate]) + }, [res, projects, navigate]); + + if (!res) return null; return ( { - return await api.apiKeys.search(project.id, { - limit: 50, - search: debouncedQuery || undefined, + const res = await oapiClient.GET("/api/admin/projects/{projectID}/keys", { + params: { + path: { projectID: project.id }, + query: { + limit: 50, + search: debouncedQuery || undefined, + }, + }, }) + return res.data ?? null }, [project.id, debouncedQuery]), ) @@ -60,7 +66,14 @@ export default function ProjectApiKeys() { const handleArchive = async (id: UUID) => { if (confirm(t("delete_key_confirmation"))) { - await api.apiKeys.delete(project.id, id) + await oapiClient.DELETE("/api/admin/projects/{projectID}/keys/{keyID}", { + params: { + path: { + projectID: project.id, + keyID: id, + }, + }, + }) await reload() } } @@ -237,17 +250,32 @@ export default function ProjectApiKeys() { try { const { id, name, description, role } = data if (id) { - await api.apiKeys.update(project.id, id, { - name: name as string, - description, - role, + await oapiClient.PATCH("/api/admin/projects/{projectID}/keys/{keyID}", { + params: { + path: { + projectID: project.id, + keyID: id, + }, + }, + body: { + name: name as string, + description, + role, + }, }) } else { - await api.apiKeys.create(project.id, { - name: name as string, - description, - scope: "secret", - role, + await oapiClient.POST("/api/admin/projects/{projectID}/keys", { + params: { + path: { + projectID: project.id, + }, + }, + body: { + name: name as string, + description, + scope: "secret", + role, + }, }) } await reload() diff --git a/console/src/views/settings/IntegrationModal.tsx b/console/src/views/settings/IntegrationModal.tsx index 1875cc183..cec883998 100644 --- a/console/src/views/settings/IntegrationModal.tsx +++ b/console/src/views/settings/IntegrationModal.tsx @@ -2,7 +2,7 @@ import { useCallback, useContext, useEffect, useMemo, useState } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { ChevronLeft } from "lucide-react" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { ProjectContext } from "../../contexts" import { useResolver } from "../../hooks" import { snakeToTitle } from "../../utils" @@ -44,14 +44,17 @@ export function IntegrationForm({ useEffect(() => { if (defaultProvider) { - api.providers - .get( - project.id, - defaultProvider.channel, - defaultProvider.module, - defaultProvider.id, - ) - .then((provider) => setProvider(provider)) + oapiClient.GET("/api/admin/projects/{projectID}/providers/{group}/{type}/{providerID}", { + params: { + path: { + projectID: project.id, + group: defaultProvider.channel, + type: defaultProvider.module, + providerID: defaultProvider.id, + }, + }, + }) + .then((res) => setProvider(res.data)) .catch(() => {}) } }, [project.id, defaultProvider]) @@ -71,9 +74,41 @@ export function IntegrationForm({ setIsSaving(true) try { const params = { ...values, module, channel } - const result = provider?.id - ? await api.providers.update(project.id, provider.id, params) - : await api.providers.create(project.id, params) + let result: Provider + + if (provider?.id) { + const res = await oapiClient.PATCH("/api/admin/projects/{projectID}/providers/{group}/{type}/{providerID}", { + params: { + path: { + projectID: project.id, + group: channel, + type: module, + providerID: provider.id, + }, + }, + body: params, + }) + if (!res.data) { + throw new Error("Failed to update provider") + } + result = res.data + } else { + const res = await oapiClient.POST("/api/admin/projects/{projectID}/providers/{group}/{type}", { + params: { + path: { + projectID: project.id, + group: channel, + type: module, + }, + }, + body: params, + }) + if (!res.data) { + throw new Error("Failed to create provider") + } + result = res.data + } + onChange(result) } finally { setIsSaving(false) @@ -154,7 +189,16 @@ export default function IntegrationModal({ const { t } = useTranslation() const [project] = useContext(ProjectContext) const [options] = useResolver( - useCallback(async () => await api.providers.options(project.id), [project]), + useCallback(async () => { + const res = await oapiClient.GET("/api/admin/projects/{projectID}/providers/meta", { + params: { + path: { + projectID: project.id, + }, + }, + }) + return res.data ?? [] + }, [project]), ) const [meta, setMeta] = useState() diff --git a/console/src/views/settings/Integrations.tsx b/console/src/views/settings/Integrations.tsx index 69968212d..071718370 100644 --- a/console/src/views/settings/Integrations.tsx +++ b/console/src/views/settings/Integrations.tsx @@ -1,7 +1,7 @@ import { useCallback, useContext, useRef, useState } from "react" import { useTranslation } from "react-i18next" import { Plus, Search, Puzzle, MoreHorizontal } from "lucide-react" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { ProjectContext } from "../../contexts" import { useResolver } from "../../hooks" import { snakeToTitle } from "../../utils" @@ -48,10 +48,16 @@ export default function Integrations() { const [result, , reload] = useResolver( useCallback(async () => { - return await api.providers.search(project.id, { - limit: 50, - search: debouncedQuery || undefined, - } as any) + const res = await oapiClient.GET("/api/admin/projects/{projectID}/providers", { + params: { + path: { projectID: project.id }, + query: { + limit: 50, + search: debouncedQuery || undefined, + } as any, + }, + }) + return res.data ?? null }, [project.id, debouncedQuery]), ) @@ -59,7 +65,14 @@ export default function Integrations() { const handleArchive = async (id: UUID) => { if (!confirm(t("delete_integration_confirmation"))) return - await api.providers.delete(project.id, id) + await oapiClient.DELETE("/api/admin/projects/{projectID}/providers/{providerID}", { + params: { + path: { + projectID: project.id, + providerID: id, + }, + }, + }) await reload() } diff --git a/console/src/views/settings/Locales.tsx b/console/src/views/settings/Locales.tsx index 2fceada1c..43da0249b 100644 --- a/console/src/views/settings/Locales.tsx +++ b/console/src/views/settings/Locales.tsx @@ -1,7 +1,7 @@ import { useCallback, useContext, useState } from "react" import { useTranslation } from "react-i18next" import { Globe, Plus, Search, MoreHorizontal } from "lucide-react" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { ProjectContext } from "../../contexts" import { useResolver } from "../../hooks" import type { Locale } from "../../types" @@ -45,7 +45,14 @@ export default function Locales() { const [result, , reload] = useResolver( useCallback(async () => { - return await api.locales.search(project.id, { limit: 100 }) + const res = await oapiClient.GET("/api/admin/projects/{projectID}/locales", { + params: { + path: { + projectID: project.id, + }, + }, + }) + return res.data ?? null }, [project.id]), ) @@ -63,7 +70,14 @@ export default function Locales() { const handleDeleteLocale = async (locale: Locale) => { if (!confirm(t("locale.delete_confirmation"))) return - await api.locales.delete(project.id, locale.id) + await oapiClient.DELETE("/api/admin/projects/{projectID}/locales/{localeID}", { + params: { + path: { + projectID: project.id, + localeID: locale.id, + }, + }, + }) await reload() } @@ -72,7 +86,14 @@ export default function Locales() { setIsCreating(true) try { const label = resolveLocaleName(selectedLocaleKey) - await api.locales.create(project.id, { key: selectedLocaleKey, label }) + await oapiClient.POST("/api/admin/projects/{projectID}/locales", { + params: { + path: { + projectID: project.id, + }, + }, + body: { key: selectedLocaleKey, label }, + }) await reload() setOpen(false) setSelectedLocaleKey(undefined) diff --git a/console/src/views/settings/Subscriptions.tsx b/console/src/views/settings/Subscriptions.tsx index e5cfd8fe4..8684ab34a 100644 --- a/console/src/views/settings/Subscriptions.tsx +++ b/console/src/views/settings/Subscriptions.tsx @@ -2,7 +2,7 @@ import { useCallback, useContext, useMemo, useState } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { Plus, Search, Bell, MoreHorizontal } from "lucide-react" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { ProjectContext } from "../../contexts" import { useResolver } from "../../hooks" import { snakeToTitle } from "../../utils" @@ -53,7 +53,13 @@ export default function Subscriptions() { const [result, , reload] = useResolver( useCallback(async () => { - return await api.subscriptions.search(project.id, { limit: 50 }) + const res = await oapiClient.GET("/api/admin/projects/{projectID}/subscriptions", { + params: { + path: { projectID: project.id }, + query: { limit: 50 }, + }, + }) + return res.data ?? null }, [project.id]), ) @@ -207,9 +213,31 @@ export default function Subscriptions() { onSave={async (data) => { const { id, name, channel, is_public } = data if (id) { - await api.subscriptions.update(project.id, id, { name, is_public }) + await oapiClient.PATCH("/api/admin/projects/{projectID}/subscriptions/{subscriptionID}", { + params: { + path: { + projectID: project.id, + subscriptionID: id, + }, + }, + body: { + name, + is_public, + }, + }) } else { - await api.subscriptions.create(project.id, { name, channel, is_public }) + await oapiClient.POST("/api/admin/projects/{projectID}/subscriptions", { + params: { + path: { + projectID: project.id, + }, + }, + body: { + name, + channel, + is_public, + }, + }) } await reload() setEditing(null) diff --git a/console/src/views/users/ListCreateForm.tsx b/console/src/views/users/ListCreateForm.tsx index 005889200..0d3b53a76 100644 --- a/console/src/views/users/ListCreateForm.tsx +++ b/console/src/views/users/ListCreateForm.tsx @@ -1,5 +1,5 @@ import { useContext, useState } from "react" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { ProjectContext } from "../../contexts" import type { List } from "../../types" import { useTranslation } from "react-i18next" @@ -25,13 +25,20 @@ export function ListCreateForm({ onCreated }: ListCreateFormProps) { setSaving(true) try { const rule = createWrapperRule() - const created = await api.lists.create(project.id, { - name, - type, - rule: type === "dynamic" ? rule : undefined, - is_visible: true, + const res = await oapiClient.POST('/api/admin/projects/{projectID}/lists', { + params: { + path: { projectID: project.id }, + }, + body: { + name, + type, + rule: type === "dynamic" ? rule : undefined, + is_visible: true, + }, }) - onCreated?.(created) + if (res.data) { + onCreated?.(res.data as List) + } } finally { setSaving(false) } diff --git a/console/src/views/users/ListDetail.tsx b/console/src/views/users/ListDetail.tsx index 26d1077fa..b8ee474cd 100644 --- a/console/src/views/users/ListDetail.tsx +++ b/console/src/views/users/ListDetail.tsx @@ -15,8 +15,7 @@ import { Users, Eye, } from "lucide-react" -import api from "../../api" -import oapiClient from "../../oapi/client" +import { oapiClient } from "@/oapi/client" import { ListContext, ProjectContext } from "../../contexts" import { PreferencesContext } from "@/contexts/PreferencesContext" import type { DynamicList, ListUpdateParams, Rule, WrapperRule } from "../../types" @@ -185,15 +184,26 @@ export default function ListDetail() { setPreviewTotal(data?.total ?? data?.results?.length ?? 0) setNextCursor(undefined) } else { - const result = await api.lists.users(project.id, list.id, { - limit: 25, - cursor, - page: pageDirection, - search: debouncedQuery || undefined, - }) - setUsers(result.results) + const res = await oapiClient.GET( + "/api/admin/projects/{projectID}/lists/{listID}/users", + { + params: { + path: { + projectID: project.id, + listID: list.id, + }, + query: { + limit: 25, + cursor, + page: pageDirection, + search: debouncedQuery || undefined, + }, + }, + }, + ) + setUsers(res.data?.results ?? []) setPreviewTotal(null) - setNextCursor(result.nextCursor || undefined) + setNextCursor(res.data?.nextCursor || undefined) } } catch { setUsers([]) @@ -206,9 +216,15 @@ export default function ListDetail() { }, [loadUsers]) const refreshList = useCallback(() => { - api.lists - .get(project.id, list.id) - .then(setList) + oapiClient.GET("/api/admin/projects/{projectID}/lists/{listID}", { + params: { + path: { + projectID: project.id, + listID: list.id, + }, + }, + }) + .then(res => { if (res.data) setList(res.data) }) .then(() => loadUsers()) .catch(() => {}) }, [project.id, list.id, setList, loadUsers]) @@ -278,16 +294,26 @@ export default function ListDetail() { setIsSaving(true) setSavingAction(action) try { - const value = await api.lists.update(project.id, list.id, { - name, - rule, - published, - tags, - }) - setError(undefined) - setList(value) - setHasUnsavedChanges(false) - loadUsers() + const res = await oapiClient.PATCH( + "/api/admin/projects/{projectID}/lists/{listID}", + { + params: { + path: { + projectID: project.id, + listID: list.id, + }, + }, + body: { name, rule, published, tags }, + }, + ) + if (res.error) { + setError(res.error.detail || res.error.title || "Failed to save list") + } else if (res.data) { + setError(undefined) + setList(res.data) + setHasUnsavedChanges(false) + loadUsers() + } } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred" @@ -299,18 +325,37 @@ export default function ListDetail() { } const uploadUsers = async (file: File) => { - await api.lists.upload(project.id, list.id, file) + const formData = new FormData() + formData.append("file", file) + await fetch(`/api/admin/projects/${project.id}/lists/${list.id}/users`, { + method: "POST", + body: formData, + }) refreshList() setIsUploadOpen(false) } const handleRecountList = async () => { - await api.lists.recount(project.id, list.id) + await oapiClient.POST('/api/admin/projects/{projectID}/lists/{listID}/recount', { + params: { + path: { + projectID: project.id, + listID: list.id, + }, + }, + }) window.location.reload() } const handleArchiveList = async () => { - await api.lists.delete(project.id, list.id) + await oapiClient.DELETE("/api/admin/projects/{projectID}/lists/{listID}", { + params: { + path: { + projectID: project.id, + listID: list.id, + }, + }, + }) await navigate(`/projects/${project.id}/lists`) } diff --git a/console/src/views/users/ListTable.tsx b/console/src/views/users/ListTable.tsx index 607f2e577..46410f6a5 100644 --- a/console/src/views/users/ListTable.tsx +++ b/console/src/views/users/ListTable.tsx @@ -7,7 +7,7 @@ import { snakeToTitle } from "../../utils" import { useRoute } from "../router" import Menu, { MenuItem } from "@/components/menu" import { ArchiveIcon, DuplicateIcon, EditIcon } from "../../components/icons" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { useNavigate, useParams } from "react-router" import { Translation, useTranslation } from "react-i18next" import type { UUID } from "@/types/common" @@ -58,12 +58,26 @@ export default function ListTable({ search, selectedRow, onSelectRow, title }: L } const handleDuplicateList = async (id: UUID) => { - const list = await api.lists.duplicate(projectId, id) - await navigate(list.id.toString()) + const res = await oapiClient.POST(`/api/admin/projects/{projectID}/lists/{listID}/duplicate`, { + params: { + path: { + projectID: projectId, + listID: id, + }, + }, + }) + await navigate(res.data?.id ? `lists/${res.data.id}` : 'lists') } const handleArchiveList = async (id: UUID) => { - await api.lists.delete(projectId, id) + await oapiClient.DELETE(`/api/admin/projects/{projectID}/lists/{listID}`, { + params: { + path: { + projectID: projectId, + listID: id, + }, + }, + }) await state.reload() } diff --git a/console/src/views/users/Lists.tsx b/console/src/views/users/Lists.tsx index 166d9c8dd..ec8977701 100644 --- a/console/src/views/users/Lists.tsx +++ b/console/src/views/users/Lists.tsx @@ -16,7 +16,7 @@ import { } from "lucide-react" import { NIL } from "uuid" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { useResolver } from "../../hooks" import { formatDate, snakeToTitle } from "../../utils" import { getRandomColor } from "@/lib/colors" @@ -91,11 +91,17 @@ export default function Lists() { const [result, , reload] = useResolver( useCallback(async () => { - return await api.lists.search(projectId, { - limit: pageSize, - offset, - search: debouncedQuery || undefined, + const res = await oapiClient.GET('/api/admin/projects/{projectID}/lists', { + params: { + path: { projectID: projectId }, + query: { + limit: pageSize, + offset, + search: debouncedQuery || undefined, + }, + }, }) + return res.data }, [projectId, debouncedQuery, offset]), ) @@ -118,13 +124,23 @@ export default function Lists() { const handleDuplicateList = async (e: React.MouseEvent, id: UUID) => { e.stopPropagation() - const list = await api.lists.duplicate(projectId, id) - await navigate(list.id.toString()) + const res = await oapiClient.POST('/api/admin/projects/{projectID}/lists/{listID}/duplicate', { + params: { + path: { projectID: projectId, listID: id }, + }, + }) + if (res.data) { + await navigate(res.data.id.toString()) + } } const handleArchiveList = async (e: React.MouseEvent, id: UUID) => { e.stopPropagation() - await api.lists.delete(projectId, id) + await oapiClient.DELETE('/api/admin/projects/{projectID}/lists/{listID}', { + params: { + path: { projectID: projectId, listID: id }, + }, + }) await reload() } diff --git a/console/src/views/users/UserDetail.tsx b/console/src/views/users/UserDetail.tsx index 185751571..0896e3a40 100644 --- a/console/src/views/users/UserDetail.tsx +++ b/console/src/views/users/UserDetail.tsx @@ -22,7 +22,7 @@ import { ProjectContext, UserContext } from "../../contexts" import { PreferencesContext } from "@/contexts/PreferencesContext" import { getRandomColor } from "@/lib/colors" import { formatDate, cn } from "../../utils" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { getTimezoneCoordinates, getLocalTimeInTimezone, @@ -87,11 +87,19 @@ export default function UserDetail() { const handleTimezoneChange = async (newTimezone: string) => { setIsSavingTimezone(true) try { - const updatedUser = await api.users.update(project.id, user.id, { - timezone: newTimezone, - } as User) - if (updatedUser) { - setUser(updatedUser) + const res = await oapiClient.PATCH('/api/admin/projects/{projectID}/users/{userID}', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + }, + body: { + timezone: newTimezone, + }, + }) + if (res.data) { + setUser(res.data) toast.success(t("timezone_updated", "Timezone updated")) } setIsTimezoneOpen(false) @@ -105,11 +113,19 @@ export default function UserDetail() { const handleLocaleChange = async (newLocale: string) => { setIsSavingLocale(true) try { - const updatedUser = await api.users.update(project.id, user.id, { - locale: newLocale, - } as User) - if (updatedUser) { - setUser(updatedUser) + const res = await oapiClient.PATCH('/api/admin/projects/{projectID}/users/{userID}', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + }, + body: { + locale: newLocale, + }, + }) + if (res.data) { + setUser(res.data) toast.success(t("locale_updated", "Locale updated")) } setIsLocaleOpen(false) @@ -144,7 +160,14 @@ export default function UserDetail() { const deleteUser = async () => { setIsDeleting(true) try { - await api.users.delete(project.id, user.id) + await oapiClient.DELETE('/api/admin/projects/{projectID}/users/{userID}', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + }, + }) await navigate(`/projects/${project.id}/users`) } finally { setIsDeleting(false) @@ -229,15 +252,19 @@ export default function UserDetail() { { - const updatedUser = await api.users.update( - project.id, - user.id, - { + const res = await oapiClient.PATCH('/api/admin/projects/{projectID}/users/{userID}', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + }, + body: { email: value || undefined, - } as User, - ) - if (updatedUser) { - setUser(updatedUser) + }, + }) + if (res.data) { + setUser(res.data) toast.success(t("email_updated", "Email updated")) } }} @@ -254,15 +281,22 @@ export default function UserDetail() { { - const updatedUser = await api.users.update( - project.id, - user.id, + const res = await oapiClient.PATCH( + "/api/admin/projects/{projectID}/users/{userID}", { - phone: value || undefined, - } as User, + params: { + path: { + projectID: project.id, + userID: user.id, + }, + }, + body: { + phone: value || undefined, + }, + }, ) - if (updatedUser) { - setUser(updatedUser) + if (res.data) { + setUser(res.data) toast.success(t("phone_updated", "Phone updated")) } }} diff --git a/console/src/views/users/UserDetailAttrs.tsx b/console/src/views/users/UserDetailAttrs.tsx index a3fdd9757..0abf7aa0c 100644 --- a/console/src/views/users/UserDetailAttrs.tsx +++ b/console/src/views/users/UserDetailAttrs.tsx @@ -4,8 +4,7 @@ import { Save, Smartphone, Monitor, Tablet, Trash2 } from "lucide-react" import { toast } from "sonner" import { ProjectContext, UserContext } from "../../contexts" import { useResolver } from "../../hooks" -import api from "../../api" -import oapiClient from "../../oapi/client" +import { oapiClient } from "@/oapi/client" import { Button } from "@/components/ui/button" import { AttributeEditor } from "@/components/ui/attribute-editor" @@ -40,9 +39,17 @@ export default function UserDetailAttrs() { const handleSave = async () => { setIsSaving(true) try { - const updatedUser = await api.users.update(project.id, user.id, { data } as User) - if (updatedUser) { - setUser(updatedUser) + const res = await oapiClient.PATCH(`/api/admin/projects/{projectID}/users/{userID}`, { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + }, + body: { data } as any, + }) + if (res.data) { + setUser(res.data as User) setIsDirty(false) toast.success(t("save_success", "Attributes saved successfully")) } diff --git a/console/src/views/users/UserDetailEvents.tsx b/console/src/views/users/UserDetailEvents.tsx index ea3dc2830..e44f5ec2f 100644 --- a/console/src/views/users/UserDetailEvents.tsx +++ b/console/src/views/users/UserDetailEvents.tsx @@ -6,7 +6,7 @@ import { PreferencesContext } from "@/contexts/PreferencesContext" import { useResolver } from "../../hooks" import { formatDate, cn } from "../../utils" import { getRandomColor } from "@/lib/colors" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import type { SearchParams, UserEvent } from "../../types" import Iframe from "@/components/iframe" @@ -115,7 +115,16 @@ export default function UserDetailEvents() { offset: (page - 1) * limit, search: debouncedQuery || undefined, } - return await api.users.events(project.id, user.id, params) + const res = await oapiClient.GET('/api/admin/projects/{projectID}/users/{userID}/events', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + query: params, + }, + }) + return res.data }, [project.id, user.id, page, debouncedQuery]), ) diff --git a/console/src/views/users/UserDetailJourneys.tsx b/console/src/views/users/UserDetailJourneys.tsx index 4646531b6..66492fb7d 100644 --- a/console/src/views/users/UserDetailJourneys.tsx +++ b/console/src/views/users/UserDetailJourneys.tsx @@ -6,7 +6,7 @@ import { ProjectContext, UserContext } from "../../contexts" import { PreferencesContext } from "@/contexts/PreferencesContext" import { useResolver } from "../../hooks" import { formatDate } from "../../utils" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import { Button } from "@/components/ui/button" import { Skeleton } from "@/components/ui/skeleton" @@ -44,10 +44,19 @@ export default function UserDetailJourneys() { const [result] = useResolver( useCallback(async () => { - return await api.users.journeys.search(project.id, user.id, { - limit, - offset: (page - 1) * limit, + const res = await oapiClient.GET('/api/admin/projects/{projectID}/users/{userID}/journeys', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + query: { + limit, + offset: (page - 1) * limit, + }, + }, }) + return res.data }, [project.id, user.id, page]), ) diff --git a/console/src/views/users/UserDetailSubscriptions.tsx b/console/src/views/users/UserDetailSubscriptions.tsx index 0cbdbc90e..5dda05b7d 100644 --- a/console/src/views/users/UserDetailSubscriptions.tsx +++ b/console/src/views/users/UserDetailSubscriptions.tsx @@ -4,7 +4,7 @@ import { Bell, BellOff } from "lucide-react" import { ProjectContext, UserContext } from "../../contexts" import { useResolver } from "../../hooks" import { snakeToTitle } from "../../utils" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import type { SubscriptionParams, SubscriptionState } from "../../types" import type { UUID } from "@/types/common" @@ -41,7 +41,16 @@ export default function UserDetailSubscriptions() { const [search, , reload] = useResolver( useCallback(async () => { - return await api.users.subscriptions(project.id, user.id, { limit: 100 }) + const res = await oapiClient.GET('/api/admin/projects/{projectID}/users/{userID}/subscriptions', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + query: { limit: 100 }, + }, + }) + return res.data }, [project.id, user.id]), ) @@ -59,19 +68,35 @@ export default function UserDetailSubscriptions() { if (!confirmAction) return if (confirmAction.type === "toggle" && confirmAction.subscriptionId) { - await api.users.updateSubscriptions(project.id, user.id, [ - { - subscription_id: confirmAction.subscriptionId, - state: confirmAction.newState!, + await oapiClient.PATCH('/api/admin/projects/{projectID}/users/{userID}/subscriptions', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, }, - ]) + body: [ + { + subscription_id: confirmAction.subscriptionId, + state: confirmAction.newState!, + }, + ], + }) } else if (confirmAction.type === "unsubscribe_all") { const params: SubscriptionParams[] = subscriptions?.map((item) => ({ subscription_id: item.subscription_id, state: "unsubscribed" as SubscriptionState, })) ?? [] - await api.users.updateSubscriptions(project.id, user.id, params) + await oapiClient.PATCH('/api/admin/projects/{projectID}/users/{userID}/subscriptions', { + params: { + path: { + projectID: project.id, + userID: user.id, + }, + }, + body: params, + }) } await reload() diff --git a/console/src/views/users/Users.tsx b/console/src/views/users/Users.tsx index 7d6345ec3..411442f41 100644 --- a/console/src/views/users/Users.tsx +++ b/console/src/views/users/Users.tsx @@ -20,7 +20,7 @@ import { formatDate } from "../../utils" import { getRandomColor } from "@/lib/colors" import { PreferencesContext } from "@/contexts/PreferencesContext" import { UsersIcon as UsersPageIcon } from "@/components/icons" -import api from "../../api" +import { oapiClient } from "@/oapi/client" import type { UUID } from "@/types/common" import type { User } from "../../types" @@ -87,6 +87,7 @@ export default function Users() { const limit = 25 const searchTimeoutRef = useRef>() + // Debounce search const handleSearch = useCallback((value: string) => { setSearchQuery(value) @@ -99,11 +100,17 @@ export default function Users() { const [result, , reload] = useResolver( useCallback(async () => { - return await api.users.search(projectId, { - limit, - offset: (page - 1) * limit, - search: debouncedQuery || undefined, + const res = await oapiClient.GET('/api/admin/projects/{projectID}/users', { + params: { + path: { projectID: projectId }, + query: { + limit, + offset: (page - 1) * limit, + search: debouncedQuery || undefined, + }, + }, }) + return res.data }, [projectId, debouncedQuery, page]), ) @@ -136,16 +143,21 @@ export default function Users() { setIsCreating(true) try { const locale = navigator.languages[0]?.split("-")[0] ?? "en" - const newUser: User = { - anonymous_id: crypto.randomUUID() as UUID, + const newUser = { + anonymous_id: crypto.randomUUID(), email: newUserEmail.trim() || undefined, phone: newUserPhone.trim() || undefined, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, locale, data: newUserFullName.trim() ? { full_name: newUserFullName.trim() } : {}, - } as User + } - await api.users.create(projectId, newUser) + await oapiClient.POST('/api/admin/projects/{projectID}/users', { + params: { + path: { projectID: projectId }, + }, + body: newUser, + }) await reload() setIsCreateOpen(false) setNewUserFullName("") @@ -157,7 +169,13 @@ export default function Users() { } const handleImportUsers = async (file: File) => { - await api.users.addImport(projectId, file) + const formData = new FormData() + formData.append('file', file) + + await fetch(`/api/admin/projects/${projectId}/users`, { + method: 'POST', + body: formData, + }) await reload() } diff --git a/console/src/views/users/rules/RuleBuilder.tsx b/console/src/views/users/rules/RuleBuilder.tsx index b7da0787f..21aac2d09 100644 --- a/console/src/views/users/rules/RuleBuilder.tsx +++ b/console/src/views/users/rules/RuleBuilder.tsx @@ -5,7 +5,7 @@ import { useController } from "react-hook-form" import { useCallback, useContext, useMemo } from "react" import { ProjectContext } from "../../../contexts" import { useResolver } from "../../../hooks" -import api from "../../../api" +import { oapiClient } from "@/oapi/client" import { snakeToTitle } from "../../../utils" import { emptySuggestions, VariablesContext } from "./RuleHelpers" import RuleEdit from "./RuleEdit" @@ -30,7 +30,34 @@ export default function RuleBuilder({ }: RuleBuilderParams) { const [{ id: projectId }] = useContext(ProjectContext) const [suggestions] = useResolver( - useCallback(async () => await api.projects.pathSuggestions(projectId), [projectId]), + useCallback(async () => { + const [eventsRes, usersRes] = await Promise.all([ + oapiClient.GET('/api/admin/projects/{projectID}/events/schema', { + params: { path: { projectID: projectId } } + }), + oapiClient.GET('/api/admin/projects/{projectID}/users/schema', { + params: { path: { projectID: projectId } } + }) + ]) + + if (!eventsRes.data || !usersRes.data) { + return emptySuggestions + } + + const eventPaths = eventsRes.data.results.map(event => ({ + id: event.id, + name: event.name, + schema: (event.schema ?? []).map(schemaPath => ({ + path: `.data${schemaPath.path}`, + types: schemaPath.types, + })) + })) + + return { + eventPaths, + userPaths: usersRes.data.results, + } + }, [projectId]), ) return ( Lunogram - - + + diff --git a/internal/http/controllers/v1/management/journeys.go b/internal/http/controllers/v1/management/journeys.go index 2ae6b4f98..41dfb23f9 100644 --- a/internal/http/controllers/v1/management/journeys.go +++ b/internal/http/controllers/v1/management/journeys.go @@ -991,3 +991,27 @@ func journeyEntranceEventDependencies(steps oapi.JourneyStepMap) (map[string]str return events, nil } + +func (srv *JourneysController) ListJourneyEntrances(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, journeyID uuid.UUID, params oapi.ListJourneyEntrancesParams) { + oapi.WriteProblem(w, problem.ErrUnimplemented()) +} + +func (srv *JourneysController) RemoveUserFromJourney(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, journeyID uuid.UUID, userID uuid.UUID) { + oapi.WriteProblem(w, problem.ErrUnimplemented()) +} + +func (srv *JourneysController) RemoveUserFromJourneyStep(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, journeyID uuid.UUID, stepID string, userID uuid.UUID) { + oapi.WriteProblem(w, problem.ErrUnimplemented()) +} + +func (srv *JourneysController) ListJourneyStepUsers(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, journeyID uuid.UUID, stepID string, params oapi.ListJourneyStepUsersParams) { + oapi.WriteProblem(w, problem.ErrUnimplemented()) +} + +func (srv *JourneysController) SkipJourneyStepDelay(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, journeyID uuid.UUID, stepID string, userID uuid.UUID) { + oapi.WriteProblem(w, problem.ErrUnimplemented()) +} + +func (srv *JourneysController) TriggerUserToJourneyStep(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, journeyID uuid.UUID, stepID string, userID uuid.UUID) { + oapi.WriteProblem(w, problem.ErrUnimplemented()) +} diff --git a/internal/http/controllers/v1/management/lists.go b/internal/http/controllers/v1/management/lists.go index c80ca6806..ee364f73f 100644 --- a/internal/http/controllers/v1/management/lists.go +++ b/internal/http/controllers/v1/management/lists.go @@ -698,3 +698,7 @@ func (srv *ListsController) PreviewListUsers(w http.ResponseWriter, r *http.Requ Results: users.OAPI(), }) } + +func (srv *ListsController) RecountList(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, listID uuid.UUID) { + oapi.WriteProblem(w, problem.ErrUnimplemented()) +} diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index e8dad9d0e..ceecec625 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -552,6 +552,41 @@ paths: default: $ref: "#/components/responses/Error" + + /api/admin/projects/{projectID}/lists/{listID}/recount: + post: + summary: Recount list users + description: Recalculates the user count for a dynamic list by re-evaluating the rules + operationId: recountList + tags: + - Lists + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - name: listID + in: path + required: true + schema: + type: string + format: uuid + description: The list ID + responses: + "202": + description: Recount started successfully. The list state will be set to 'loading'. + content: + application/json: + schema: + $ref: "#/components/schemas/List" + default: + $ref: "#/components/responses/Error" + /api/admin/projects/{projectID}/lists/{listID}: get: summary: Get list by ID @@ -1283,6 +1318,41 @@ paths: description: Current step advanced successfully default: $ref: "#/components/responses/Error" + delete: + summary: Remove user from journey + description: Removes a user from all active entrances in a journey + operationId: removeUserFromJourney + tags: + - Journeys + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - name: journeyID + in: path + required: true + schema: + type: string + format: uuid + description: The journey ID + - name: userID + in: path + required: true + schema: + type: string + format: uuid + description: The user ID + responses: + "204": + description: User removed from journey successfully + default: + $ref: "#/components/responses/Error" /api/admin/projects/{projectID}/journeys/{journeyID}/steps: get: @@ -1459,6 +1529,214 @@ paths: default: $ref: "#/components/responses/Error" + /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users: + get: + summary: List users in journey step + description: Retrieves a paginated list of users currently in a specific journey step + operationId: listJourneyStepUsers + tags: + - Journeys + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - name: journeyID + in: path + required: true + schema: + type: string + format: uuid + description: The journey ID + - name: stepID + in: path + required: true + schema: + type: string + description: The step external ID + - $ref: "#/components/parameters/Limit" + - $ref: "#/components/parameters/Offset" + responses: + "200": + $ref: "#/components/responses/JourneyUserStepListResponse" + default: + $ref: "#/components/responses/Error" + + /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/trigger: + post: + summary: Trigger user into journey entrance + description: Manually adds a user to a specific journey entrance step + operationId: triggerUserToJourneyStep + tags: + - Journeys + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - name: journeyID + in: path + required: true + schema: + type: string + format: uuid + description: The journey ID + - name: stepID + in: path + required: true + schema: + type: string + description: The step external ID (must be an entrance step) + - name: userID + in: path + required: true + schema: + type: string + format: uuid + description: The user ID + responses: + "201": + description: User added to journey entrance successfully + content: + application/json: + schema: + $ref: "#/components/schemas/JourneyUserStep" + default: + $ref: "#/components/responses/Error" + + /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/skip: + post: + summary: Skip delay for user + description: Skips the delay for a user currently waiting in a delay step + operationId: skipJourneyStepDelay + tags: + - Journeys + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - name: journeyID + in: path + required: true + schema: + type: string + format: uuid + description: The journey ID + - name: stepID + in: path + required: true + schema: + type: string + description: The step external ID (must be a delay step) + - name: userID + in: path + required: true + schema: + type: string + format: uuid + description: The user ID + responses: + "200": + description: Delay skipped successfully + default: + $ref: "#/components/responses/Error" + + /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}: + delete: + summary: Remove user from journey step + description: Removes a user from a specific journey step entrance + operationId: removeUserFromJourneyStep + tags: + - Journeys + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - name: journeyID + in: path + required: true + schema: + type: string + format: uuid + description: The journey ID + - name: stepID + in: path + required: true + schema: + type: string + description: The step external ID + - name: userID + in: path + required: true + schema: + type: string + format: uuid + description: The user ID + responses: + "204": + description: User removed from journey step successfully + default: + $ref: "#/components/responses/Error" + + /api/admin/projects/{projectID}/journeys/{journeyID}/entrances: + get: + summary: List journey entrances + description: Retrieves a paginated list of user entrances for a journey + operationId: listJourneyEntrances + tags: + - Journeys + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - name: journeyID + in: path + required: true + schema: + type: string + format: uuid + description: The journey ID + - $ref: "#/components/parameters/Limit" + - $ref: "#/components/parameters/Offset" + - $ref: "#/components/parameters/Search" + responses: + "200": + description: Journey entrances retrieved successfully + content: + application/json: + schema: + $ref: "#/components/schemas/JourneyUserEntranceListResponse" + default: + $ref: "#/components/responses/Error" + /api/admin/profile: get: summary: Get current admin profile @@ -4113,6 +4391,22 @@ components: items: $ref: "#/components/schemas/Journey" + JourneyUserStepListResponse: + description: Journey user steps retrieved successfully + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/PaginatedResponse" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/JourneyUserStep" + TagListResponse: description: Tags retrieved successfully content: @@ -4242,7 +4536,7 @@ components: schemas: Channel: type: string - enum: [email, text, push] + enum: [email, text, push, webhook] description: Communication channel type example: email @@ -6114,6 +6408,108 @@ components: items: $ref: "#/components/schemas/UserJourneyEntrance" + JourneyUserStep: + type: object + required: + - id + - entrance_id + - type + - created_at + - updated_at + properties: + id: + type: string + format: uuid + example: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" + entrance_id: + type: string + format: uuid + example: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" + type: + type: string + description: Status/type of the user step + enum: [waiting, completed, skipped, exited] + example: "waiting" + delay_until: + type: string + format: date-time + example: "2025-11-24T10:30:00.000Z" + created_at: + type: string + format: date-time + example: "2025-11-19T14:18:42.960Z" + updated_at: + type: string + format: date-time + example: "2025-11-23T17:20:00.021Z" + ended_at: + type: string + format: date-time + example: "2025-11-24T10:30:00.000Z" + user: + $ref: "#/components/schemas/User" + journey: + $ref: "#/components/schemas/Journey" + step: + $ref: "#/components/schemas/JourneyStep" + + JourneyUserStepList: + allOf: + - $ref: "#/components/schemas/PaginatedResponse" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/JourneyUserStep" + + JourneyUserEntrance: + type: object + required: + - id + - entrance_id + - created_at + - updated_at + properties: + id: + type: string + format: uuid + example: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" + entrance_id: + type: string + format: uuid + example: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" + created_at: + type: string + format: date-time + example: "2025-11-19T14:18:42.960Z" + updated_at: + type: string + format: date-time + example: "2025-11-23T17:20:00.021Z" + ended_at: + type: string + format: date-time + example: "2025-11-24T10:30:00.000Z" + user: + $ref: "#/components/schemas/User" + journey: + $ref: "#/components/schemas/Journey" + + JourneyUserEntranceListResponse: + allOf: + - $ref: "#/components/schemas/PaginatedResponse" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/JourneyUserEntrance" + JourneyStepMap: type: object description: Map of journey steps keyed by external_id diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index 0d04a33ad..26729fb6c 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -42,9 +42,10 @@ const ( // Defines values for Channel. const ( - Email Channel = "email" - Push Channel = "push" - Text Channel = "text" + Email Channel = "email" + Push Channel = "push" + Text Channel = "text" + Webhook Channel = "webhook" ) // Defines values for CreateListType. @@ -76,6 +77,14 @@ const ( JourneyStepTypeUpdate JourneyStepType = "update" ) +// Defines values for JourneyUserStepType. +const ( + Completed JourneyUserStepType = "completed" + Exited JourneyUserStepType = "exited" + Skipped JourneyUserStepType = "skipped" + Waiting JourneyUserStepType = "waiting" +) + // Defines values for ListState. const ( ListStateDraft ListState = "draft" @@ -552,6 +561,49 @@ type JourneyStepMap map[string]JourneyStep // JourneyStepType Journey step type type JourneyStepType string +// JourneyUserEntrance defines model for JourneyUserEntrance. +type JourneyUserEntrance struct { + CreatedAt time.Time `json:"created_at"` + EndedAt *time.Time `json:"ended_at,omitempty"` + EntranceId openapi_types.UUID `json:"entrance_id"` + Id openapi_types.UUID `json:"id"` + Journey *Journey `json:"journey,omitempty"` + UpdatedAt time.Time `json:"updated_at"` + User *User `json:"user,omitempty"` +} + +// JourneyUserEntranceListResponse defines model for JourneyUserEntranceListResponse. +type JourneyUserEntranceListResponse struct { + // Limit Maximum number of items returned + Limit int `json:"limit"` + + // Offset Number of items skipped + Offset int `json:"offset"` + Results []JourneyUserEntrance `json:"results"` + + // Total Total number of items matching the filters + Total int `json:"total"` +} + +// JourneyUserStep defines model for JourneyUserStep. +type JourneyUserStep struct { + CreatedAt time.Time `json:"created_at"` + DelayUntil *time.Time `json:"delay_until,omitempty"` + EndedAt *time.Time `json:"ended_at,omitempty"` + EntranceId openapi_types.UUID `json:"entrance_id"` + Id openapi_types.UUID `json:"id"` + Journey *Journey `json:"journey,omitempty"` + Step *JourneyStep `json:"step,omitempty"` + + // Type Status/type of the user step + Type JourneyUserStepType `json:"type"` + UpdatedAt time.Time `json:"updated_at"` + User *User `json:"user,omitempty"` +} + +// JourneyUserStepType Status/type of the user step +type JourneyUserStepType string + // List defines model for List. type List struct { CreatedAt time.Time `json:"created_at"` @@ -1236,6 +1288,19 @@ type JourneyListResponse struct { Total int `json:"total"` } +// JourneyUserStepListResponse defines model for JourneyUserStepListResponse. +type JourneyUserStepListResponse struct { + // Limit Maximum number of items returned + Limit int `json:"limit"` + + // Offset Number of items skipped + Offset int `json:"offset"` + Results []JourneyUserStep `json:"results"` + + // Total Total number of items matching the filters + Total int `json:"total"` +} + // ListListResponse defines model for ListListResponse. type ListListResponse struct { // Limit Maximum number of items returned @@ -1378,6 +1443,27 @@ type CreateJourneyParams struct { Publish *bool `form:"publish,omitempty" json:"publish,omitempty"` } +// ListJourneyEntrancesParams defines parameters for ListJourneyEntrances. +type ListJourneyEntrancesParams struct { + // Limit Maximum number of items to return + Limit *Limit `form:"limit,omitempty" json:"limit,omitempty"` + + // Offset Number of items to skip + Offset *Offset `form:"offset,omitempty" json:"offset,omitempty"` + + // Search Search query string + Search *Search `form:"search,omitempty" json:"search,omitempty"` +} + +// ListJourneyStepUsersParams defines parameters for ListJourneyStepUsers. +type ListJourneyStepUsersParams struct { + // Limit Maximum number of items to return + Limit *Limit `form:"limit,omitempty" json:"limit,omitempty"` + + // Offset Number of items to skip + Offset *Offset `form:"offset,omitempty" json:"offset,omitempty"` +} + // TriggerUserJSONBody defines parameters for TriggerUser. type TriggerUserJSONBody struct { // ExternalStepID The ID of the journey entry to enroll the user in @@ -2104,6 +2190,9 @@ type ClientInterface interface { // DuplicateJourney request DuplicateJourney(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListJourneyEntrances request + ListJourneyEntrances(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, params *ListJourneyEntrancesParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // PublishJourney request PublishJourney(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2115,6 +2204,21 @@ type ClientInterface interface { SetJourneySteps(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, body SetJourneyStepsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListJourneyStepUsers request + ListJourneyStepUsers(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, params *ListJourneyStepUsersParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // RemoveUserFromJourneyStep request + RemoveUserFromJourneyStep(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + + // SkipJourneyStepDelay request + SkipJourneyStepDelay(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + + // TriggerUserToJourneyStep request + TriggerUserToJourneyStep(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + + // RemoveUserFromJourney request + RemoveUserFromJourney(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + // StreamUserJourneySteps request StreamUserJourneySteps(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2175,6 +2279,9 @@ type ClientInterface interface { // DuplicateList request DuplicateList(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + // RecountList request + RecountList(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetListUsers request GetListUsers(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, params *GetListUsersParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -3045,6 +3152,18 @@ func (c *Client) DuplicateJourney(ctx context.Context, projectID openapi_types.U return c.Client.Do(req) } +func (c *Client) ListJourneyEntrances(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, params *ListJourneyEntrancesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListJourneyEntrancesRequest(c.Server, projectID, journeyID, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) PublishJourney(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewPublishJourneyRequest(c.Server, projectID, journeyID) if err != nil { @@ -3093,6 +3212,66 @@ func (c *Client) SetJourneySteps(ctx context.Context, projectID openapi_types.UU return c.Client.Do(req) } +func (c *Client) ListJourneyStepUsers(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, params *ListJourneyStepUsersParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListJourneyStepUsersRequest(c.Server, projectID, journeyID, stepID, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) RemoveUserFromJourneyStep(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewRemoveUserFromJourneyStepRequest(c.Server, projectID, journeyID, stepID, userID) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) SkipJourneyStepDelay(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSkipJourneyStepDelayRequest(c.Server, projectID, journeyID, stepID, userID) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TriggerUserToJourneyStep(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTriggerUserToJourneyStepRequest(c.Server, projectID, journeyID, stepID, userID) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) RemoveUserFromJourney(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewRemoveUserFromJourneyRequest(c.Server, projectID, journeyID, userID) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) StreamUserJourneySteps(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewStreamUserJourneyStepsRequest(c.Server, projectID, journeyID, userID) if err != nil { @@ -3357,6 +3536,18 @@ func (c *Client) DuplicateList(ctx context.Context, projectID openapi_types.UUID return c.Client.Do(req) } +func (c *Client) RecountList(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewRecountListRequest(c.Server, projectID, listID) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) GetListUsers(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, params *GetListUsersParams, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewGetListUsersRequest(c.Server, projectID, listID, params) if err != nil { @@ -6413,6 +6604,101 @@ func NewDuplicateJourneyRequest(server string, projectID openapi_types.UUID, jou return req, nil } +// NewListJourneyEntrancesRequest generates requests for ListJourneyEntrances +func NewListJourneyEntrancesRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, params *ListJourneyEntrancesParams) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "journeyID", runtime.ParamLocationPath, journeyID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/entrances", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.Limit != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "limit", runtime.ParamLocationQuery, *params.Limit); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Offset != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "offset", runtime.ParamLocationQuery, *params.Offset); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Search != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "search", runtime.ParamLocationQuery, *params.Search); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewPublishJourneyRequest generates requests for PublishJourney func NewPublishJourneyRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID) (*http.Request, error) { var err error @@ -6549,8 +6835,8 @@ func NewSetJourneyStepsRequestWithBody(server string, projectID openapi_types.UU return req, nil } -// NewStreamUserJourneyStepsRequest generates requests for StreamUserJourneySteps -func NewStreamUserJourneyStepsRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID) (*http.Request, error) { +// NewListJourneyStepUsersRequest generates requests for ListJourneyStepUsers +func NewListJourneyStepUsersRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, params *ListJourneyStepUsersParams) (*http.Request, error) { var err error var pathParam0 string @@ -6569,7 +6855,7 @@ func NewStreamUserJourneyStepsRequest(server string, projectID openapi_types.UUI var pathParam2 string - pathParam2, err = runtime.StyleParamWithLocation("simple", false, "userID", runtime.ParamLocationPath, userID) + pathParam2, err = runtime.StyleParamWithLocation("simple", false, "stepID", runtime.ParamLocationPath, stepID) if err != nil { return nil, err } @@ -6579,7 +6865,7 @@ func NewStreamUserJourneyStepsRequest(server string, projectID openapi_types.UUI return nil, err } - operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/users/%s", pathParam0, pathParam1, pathParam2) + operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/steps/%s/users", pathParam0, pathParam1, pathParam2) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -6589,32 +6875,331 @@ func NewStreamUserJourneyStepsRequest(server string, projectID openapi_types.UUI return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -// NewTriggerUserRequest calls the generic TriggerUser builder with application/json body -func NewTriggerUserRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, body TriggerUserJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewTriggerUserRequestWithBody(server, projectID, journeyID, userID, "application/json", bodyReader) -} - -// NewTriggerUserRequestWithBody generates requests for TriggerUser with any type of body -func NewTriggerUserRequestWithBody(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, contentType string, body io.Reader) (*http.Request, error) { - var err error + if params != nil { + queryValues := queryURL.Query() - var pathParam0 string + if params.Limit != nil { - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "limit", runtime.ParamLocationQuery, *params.Limit); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Offset != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "offset", runtime.ParamLocationQuery, *params.Offset); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewRemoveUserFromJourneyStepRequest generates requests for RemoveUserFromJourneyStep +func NewRemoveUserFromJourneyStepRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "journeyID", runtime.ParamLocationPath, journeyID) + if err != nil { + return nil, err + } + + var pathParam2 string + + pathParam2, err = runtime.StyleParamWithLocation("simple", false, "stepID", runtime.ParamLocationPath, stepID) + if err != nil { + return nil, err + } + + var pathParam3 string + + pathParam3, err = runtime.StyleParamWithLocation("simple", false, "userID", runtime.ParamLocationPath, userID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/steps/%s/users/%s", pathParam0, pathParam1, pathParam2, pathParam3) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewSkipJourneyStepDelayRequest generates requests for SkipJourneyStepDelay +func NewSkipJourneyStepDelayRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "journeyID", runtime.ParamLocationPath, journeyID) + if err != nil { + return nil, err + } + + var pathParam2 string + + pathParam2, err = runtime.StyleParamWithLocation("simple", false, "stepID", runtime.ParamLocationPath, stepID) + if err != nil { + return nil, err + } + + var pathParam3 string + + pathParam3, err = runtime.StyleParamWithLocation("simple", false, "userID", runtime.ParamLocationPath, userID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/steps/%s/users/%s/skip", pathParam0, pathParam1, pathParam2, pathParam3) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewTriggerUserToJourneyStepRequest generates requests for TriggerUserToJourneyStep +func NewTriggerUserToJourneyStepRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "journeyID", runtime.ParamLocationPath, journeyID) + if err != nil { + return nil, err + } + + var pathParam2 string + + pathParam2, err = runtime.StyleParamWithLocation("simple", false, "stepID", runtime.ParamLocationPath, stepID) + if err != nil { + return nil, err + } + + var pathParam3 string + + pathParam3, err = runtime.StyleParamWithLocation("simple", false, "userID", runtime.ParamLocationPath, userID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/steps/%s/users/%s/trigger", pathParam0, pathParam1, pathParam2, pathParam3) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewRemoveUserFromJourneyRequest generates requests for RemoveUserFromJourney +func NewRemoveUserFromJourneyRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "journeyID", runtime.ParamLocationPath, journeyID) + if err != nil { + return nil, err + } + + var pathParam2 string + + pathParam2, err = runtime.StyleParamWithLocation("simple", false, "userID", runtime.ParamLocationPath, userID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/users/%s", pathParam0, pathParam1, pathParam2) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewStreamUserJourneyStepsRequest generates requests for StreamUserJourneySteps +func NewStreamUserJourneyStepsRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "journeyID", runtime.ParamLocationPath, journeyID) + if err != nil { + return nil, err + } + + var pathParam2 string + + pathParam2, err = runtime.StyleParamWithLocation("simple", false, "userID", runtime.ParamLocationPath, userID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/journeys/%s/users/%s", pathParam0, pathParam1, pathParam2) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewTriggerUserRequest calls the generic TriggerUser builder with application/json body +func NewTriggerUserRequest(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, body TriggerUserJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewTriggerUserRequestWithBody(server, projectID, journeyID, userID, "application/json", bodyReader) +} + +// NewTriggerUserRequestWithBody generates requests for TriggerUser with any type of body +func NewTriggerUserRequestWithBody(server string, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) if err != nil { return nil, err } @@ -7375,6 +7960,47 @@ func NewDuplicateListRequest(server string, projectID openapi_types.UUID, listID return req, nil } +// NewRecountListRequest generates requests for RecountList +func NewRecountListRequest(server string, projectID openapi_types.UUID, listID openapi_types.UUID) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "listID", runtime.ParamLocationPath, listID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/lists/%s/recount", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewGetListUsersRequest generates requests for GetListUsers func NewGetListUsersRequest(server string, projectID openapi_types.UUID, listID openapi_types.UUID, params *GetListUsersParams) (*http.Request, error) { var err error @@ -10692,6 +11318,9 @@ type ClientWithResponsesInterface interface { // DuplicateJourneyWithResponse request DuplicateJourneyWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, reqEditors ...RequestEditorFn) (*DuplicateJourneyResponse, error) + // ListJourneyEntrancesWithResponse request + ListJourneyEntrancesWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, params *ListJourneyEntrancesParams, reqEditors ...RequestEditorFn) (*ListJourneyEntrancesResponse, error) + // PublishJourneyWithResponse request PublishJourneyWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, reqEditors ...RequestEditorFn) (*PublishJourneyResponse, error) @@ -10703,6 +11332,21 @@ type ClientWithResponsesInterface interface { SetJourneyStepsWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, body SetJourneyStepsJSONRequestBody, reqEditors ...RequestEditorFn) (*SetJourneyStepsResponse, error) + // ListJourneyStepUsersWithResponse request + ListJourneyStepUsersWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, params *ListJourneyStepUsersParams, reqEditors ...RequestEditorFn) (*ListJourneyStepUsersResponse, error) + + // RemoveUserFromJourneyStepWithResponse request + RemoveUserFromJourneyStepWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*RemoveUserFromJourneyStepResponse, error) + + // SkipJourneyStepDelayWithResponse request + SkipJourneyStepDelayWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*SkipJourneyStepDelayResponse, error) + + // TriggerUserToJourneyStepWithResponse request + TriggerUserToJourneyStepWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*TriggerUserToJourneyStepResponse, error) + + // RemoveUserFromJourneyWithResponse request + RemoveUserFromJourneyWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*RemoveUserFromJourneyResponse, error) + // StreamUserJourneyStepsWithResponse request StreamUserJourneyStepsWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*StreamUserJourneyStepsResponse, error) @@ -10763,6 +11407,9 @@ type ClientWithResponsesInterface interface { // DuplicateListWithResponse request DuplicateListWithResponse(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, reqEditors ...RequestEditorFn) (*DuplicateListResponse, error) + // RecountListWithResponse request + RecountListWithResponse(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, reqEditors ...RequestEditorFn) (*RecountListResponse, error) + // GetListUsersWithResponse request GetListUsersWithResponse(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, params *GetListUsersParams, reqEditors ...RequestEditorFn) (*GetListUsersResponse, error) @@ -11942,6 +12589,29 @@ func (r DuplicateJourneyResponse) StatusCode() int { return 0 } +type ListJourneyEntrancesResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *JourneyUserEntranceListResponse + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r ListJourneyEntrancesResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r ListJourneyEntrancesResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type PublishJourneyResponse struct { Body []byte HTTPResponse *http.Response @@ -11996,7 +12666,119 @@ type SetJourneyStepsResponse struct { } // Status returns HTTPResponse.Status -func (r SetJourneyStepsResponse) Status() string { +func (r SetJourneyStepsResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r SetJourneyStepsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type ListJourneyStepUsersResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *JourneyUserStepListResponse + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r ListJourneyStepUsersResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r ListJourneyStepUsersResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type RemoveUserFromJourneyStepResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r RemoveUserFromJourneyStepResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r RemoveUserFromJourneyStepResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type SkipJourneyStepDelayResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r SkipJourneyStepDelayResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r SkipJourneyStepDelayResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type TriggerUserToJourneyStepResponse struct { + Body []byte + HTTPResponse *http.Response + JSON201 *JourneyUserStep + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r TriggerUserToJourneyStepResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r TriggerUserToJourneyStepResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type RemoveUserFromJourneyResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r RemoveUserFromJourneyResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -12004,7 +12786,7 @@ func (r SetJourneyStepsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r SetJourneyStepsResponse) StatusCode() int { +func (r RemoveUserFromJourneyResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -12378,6 +13160,29 @@ func (r DuplicateListResponse) StatusCode() int { return 0 } +type RecountListResponse struct { + Body []byte + HTTPResponse *http.Response + JSON202 *List + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r RecountListResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r RecountListResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type GetListUsersResponse struct { Body []byte HTTPResponse *http.Response @@ -14225,6 +15030,15 @@ func (c *ClientWithResponses) DuplicateJourneyWithResponse(ctx context.Context, return ParseDuplicateJourneyResponse(rsp) } +// ListJourneyEntrancesWithResponse request returning *ListJourneyEntrancesResponse +func (c *ClientWithResponses) ListJourneyEntrancesWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, params *ListJourneyEntrancesParams, reqEditors ...RequestEditorFn) (*ListJourneyEntrancesResponse, error) { + rsp, err := c.ListJourneyEntrances(ctx, projectID, journeyID, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseListJourneyEntrancesResponse(rsp) +} + // PublishJourneyWithResponse request returning *PublishJourneyResponse func (c *ClientWithResponses) PublishJourneyWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, reqEditors ...RequestEditorFn) (*PublishJourneyResponse, error) { rsp, err := c.PublishJourney(ctx, projectID, journeyID, reqEditors...) @@ -14260,6 +15074,51 @@ func (c *ClientWithResponses) SetJourneyStepsWithResponse(ctx context.Context, p return ParseSetJourneyStepsResponse(rsp) } +// ListJourneyStepUsersWithResponse request returning *ListJourneyStepUsersResponse +func (c *ClientWithResponses) ListJourneyStepUsersWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, params *ListJourneyStepUsersParams, reqEditors ...RequestEditorFn) (*ListJourneyStepUsersResponse, error) { + rsp, err := c.ListJourneyStepUsers(ctx, projectID, journeyID, stepID, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseListJourneyStepUsersResponse(rsp) +} + +// RemoveUserFromJourneyStepWithResponse request returning *RemoveUserFromJourneyStepResponse +func (c *ClientWithResponses) RemoveUserFromJourneyStepWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*RemoveUserFromJourneyStepResponse, error) { + rsp, err := c.RemoveUserFromJourneyStep(ctx, projectID, journeyID, stepID, userID, reqEditors...) + if err != nil { + return nil, err + } + return ParseRemoveUserFromJourneyStepResponse(rsp) +} + +// SkipJourneyStepDelayWithResponse request returning *SkipJourneyStepDelayResponse +func (c *ClientWithResponses) SkipJourneyStepDelayWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*SkipJourneyStepDelayResponse, error) { + rsp, err := c.SkipJourneyStepDelay(ctx, projectID, journeyID, stepID, userID, reqEditors...) + if err != nil { + return nil, err + } + return ParseSkipJourneyStepDelayResponse(rsp) +} + +// TriggerUserToJourneyStepWithResponse request returning *TriggerUserToJourneyStepResponse +func (c *ClientWithResponses) TriggerUserToJourneyStepWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*TriggerUserToJourneyStepResponse, error) { + rsp, err := c.TriggerUserToJourneyStep(ctx, projectID, journeyID, stepID, userID, reqEditors...) + if err != nil { + return nil, err + } + return ParseTriggerUserToJourneyStepResponse(rsp) +} + +// RemoveUserFromJourneyWithResponse request returning *RemoveUserFromJourneyResponse +func (c *ClientWithResponses) RemoveUserFromJourneyWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*RemoveUserFromJourneyResponse, error) { + rsp, err := c.RemoveUserFromJourney(ctx, projectID, journeyID, userID, reqEditors...) + if err != nil { + return nil, err + } + return ParseRemoveUserFromJourneyResponse(rsp) +} + // StreamUserJourneyStepsWithResponse request returning *StreamUserJourneyStepsResponse func (c *ClientWithResponses) StreamUserJourneyStepsWithResponse(ctx context.Context, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID, reqEditors ...RequestEditorFn) (*StreamUserJourneyStepsResponse, error) { rsp, err := c.StreamUserJourneySteps(ctx, projectID, journeyID, userID, reqEditors...) @@ -14452,6 +15311,15 @@ func (c *ClientWithResponses) DuplicateListWithResponse(ctx context.Context, pro return ParseDuplicateListResponse(rsp) } +// RecountListWithResponse request returning *RecountListResponse +func (c *ClientWithResponses) RecountListWithResponse(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, reqEditors ...RequestEditorFn) (*RecountListResponse, error) { + rsp, err := c.RecountList(ctx, projectID, listID, reqEditors...) + if err != nil { + return nil, err + } + return ParseRecountListResponse(rsp) +} + // GetListUsersWithResponse request returning *GetListUsersResponse func (c *ClientWithResponses) GetListUsersWithResponse(ctx context.Context, projectID openapi_types.UUID, listID openapi_types.UUID, params *GetListUsersParams, reqEditors ...RequestEditorFn) (*GetListUsersResponse, error) { rsp, err := c.GetListUsers(ctx, projectID, listID, params, reqEditors...) @@ -16446,6 +17314,39 @@ func ParseDuplicateJourneyResponse(rsp *http.Response) (*DuplicateJourneyRespons return response, nil } +// ParseListJourneyEntrancesResponse parses an HTTP response from a ListJourneyEntrancesWithResponse call +func ParseListJourneyEntrancesResponse(rsp *http.Response) (*ListJourneyEntrancesResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &ListJourneyEntrancesResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest JourneyUserEntranceListResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParsePublishJourneyResponse parses an HTTP response from a PublishJourneyWithResponse call func ParsePublishJourneyResponse(rsp *http.Response) (*PublishJourneyResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -16545,6 +17446,150 @@ func ParseSetJourneyStepsResponse(rsp *http.Response) (*SetJourneyStepsResponse, return response, nil } +// ParseListJourneyStepUsersResponse parses an HTTP response from a ListJourneyStepUsersWithResponse call +func ParseListJourneyStepUsersResponse(rsp *http.Response) (*ListJourneyStepUsersResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &ListJourneyStepUsersResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest JourneyUserStepListResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseRemoveUserFromJourneyStepResponse parses an HTTP response from a RemoveUserFromJourneyStepWithResponse call +func ParseRemoveUserFromJourneyStepResponse(rsp *http.Response) (*RemoveUserFromJourneyStepResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &RemoveUserFromJourneyStepResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseSkipJourneyStepDelayResponse parses an HTTP response from a SkipJourneyStepDelayWithResponse call +func ParseSkipJourneyStepDelayResponse(rsp *http.Response) (*SkipJourneyStepDelayResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &SkipJourneyStepDelayResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseTriggerUserToJourneyStepResponse parses an HTTP response from a TriggerUserToJourneyStepWithResponse call +func ParseTriggerUserToJourneyStepResponse(rsp *http.Response) (*TriggerUserToJourneyStepResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &TriggerUserToJourneyStepResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: + var dest JourneyUserStep + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON201 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseRemoveUserFromJourneyResponse parses an HTTP response from a RemoveUserFromJourneyWithResponse call +func ParseRemoveUserFromJourneyResponse(rsp *http.Response) (*RemoveUserFromJourneyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &RemoveUserFromJourneyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseStreamUserJourneyStepsResponse parses an HTTP response from a StreamUserJourneyStepsWithResponse call func ParseStreamUserJourneyStepsResponse(rsp *http.Response) (*StreamUserJourneyStepsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -17042,6 +18087,39 @@ func ParseDuplicateListResponse(rsp *http.Response) (*DuplicateListResponse, err return response, nil } +// ParseRecountListResponse parses an HTTP response from a RecountListWithResponse call +func ParseRecountListResponse(rsp *http.Response) (*RecountListResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &RecountListResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 202: + var dest List + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON202 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseGetListUsersResponse parses an HTTP response from a GetListUsersWithResponse call func ParseGetListUsersResponse(rsp *http.Response) (*GetListUsersResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -19047,6 +20125,9 @@ type ServerInterface interface { // Duplicate journey // (POST /api/admin/projects/{projectID}/journeys/{journeyID}/duplicate) DuplicateJourney(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID) + // List journey entrances + // (GET /api/admin/projects/{projectID}/journeys/{journeyID}/entrances) + ListJourneyEntrances(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, params ListJourneyEntrancesParams) // Publish journey // (POST /api/admin/projects/{projectID}/journeys/{journeyID}/publish) PublishJourney(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID) @@ -19056,6 +20137,21 @@ type ServerInterface interface { // Set journey steps // (PUT /api/admin/projects/{projectID}/journeys/{journeyID}/steps) SetJourneySteps(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID) + // List users in journey step + // (GET /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users) + ListJourneyStepUsers(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, params ListJourneyStepUsersParams) + // Remove user from journey step + // (DELETE /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}) + RemoveUserFromJourneyStep(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) + // Skip delay for user + // (POST /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/skip) + SkipJourneyStepDelay(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) + // Trigger user into journey entrance + // (POST /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/trigger) + TriggerUserToJourneyStep(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) + // Remove user from journey + // (DELETE /api/admin/projects/{projectID}/journeys/{journeyID}/users/{userID}) + RemoveUserFromJourney(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID) // Stream user journey steps // (GET /api/admin/projects/{projectID}/journeys/{journeyID}/users/{userID}) StreamUserJourneySteps(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID) @@ -19104,6 +20200,9 @@ type ServerInterface interface { // Duplicate list // (POST /api/admin/projects/{projectID}/lists/{listID}/duplicate) DuplicateList(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, listID openapi_types.UUID) + // Recount list users + // (POST /api/admin/projects/{projectID}/lists/{listID}/recount) + RecountList(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, listID openapi_types.UUID) // Get list users // (GET /api/admin/projects/{projectID}/lists/{listID}/users) GetListUsers(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, listID openapi_types.UUID, params GetListUsersParams) @@ -19539,6 +20638,12 @@ func (_ Unimplemented) DuplicateJourney(w http.ResponseWriter, r *http.Request, w.WriteHeader(http.StatusNotImplemented) } +// List journey entrances +// (GET /api/admin/projects/{projectID}/journeys/{journeyID}/entrances) +func (_ Unimplemented) ListJourneyEntrances(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, params ListJourneyEntrancesParams) { + w.WriteHeader(http.StatusNotImplemented) +} + // Publish journey // (POST /api/admin/projects/{projectID}/journeys/{journeyID}/publish) func (_ Unimplemented) PublishJourney(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID) { @@ -19557,6 +20662,36 @@ func (_ Unimplemented) SetJourneySteps(w http.ResponseWriter, r *http.Request, p w.WriteHeader(http.StatusNotImplemented) } +// List users in journey step +// (GET /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users) +func (_ Unimplemented) ListJourneyStepUsers(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, params ListJourneyStepUsersParams) { + w.WriteHeader(http.StatusNotImplemented) +} + +// Remove user from journey step +// (DELETE /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}) +func (_ Unimplemented) RemoveUserFromJourneyStep(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) { + w.WriteHeader(http.StatusNotImplemented) +} + +// Skip delay for user +// (POST /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/skip) +func (_ Unimplemented) SkipJourneyStepDelay(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) { + w.WriteHeader(http.StatusNotImplemented) +} + +// Trigger user into journey entrance +// (POST /api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/trigger) +func (_ Unimplemented) TriggerUserToJourneyStep(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, stepID string, userID openapi_types.UUID) { + w.WriteHeader(http.StatusNotImplemented) +} + +// Remove user from journey +// (DELETE /api/admin/projects/{projectID}/journeys/{journeyID}/users/{userID}) +func (_ Unimplemented) RemoveUserFromJourney(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID) { + w.WriteHeader(http.StatusNotImplemented) +} + // Stream user journey steps // (GET /api/admin/projects/{projectID}/journeys/{journeyID}/users/{userID}) func (_ Unimplemented) StreamUserJourneySteps(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, journeyID openapi_types.UUID, userID openapi_types.UUID) { @@ -19653,6 +20788,12 @@ func (_ Unimplemented) DuplicateList(w http.ResponseWriter, r *http.Request, pro w.WriteHeader(http.StatusNotImplemented) } +// Recount list users +// (POST /api/admin/projects/{projectID}/lists/{listID}/recount) +func (_ Unimplemented) RecountList(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, listID openapi_types.UUID) { + w.WriteHeader(http.StatusNotImplemented) +} + // Get list users // (GET /api/admin/projects/{projectID}/lists/{listID}/users) func (_ Unimplemented) GetListUsers(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, listID openapi_types.UUID, params GetListUsersParams) { @@ -21311,16 +22452,267 @@ func (siw *ServerInterfaceWrapper) ListDocuments(w http.ResponseWriter, r *http. return } - // ------------- Optional query parameter "offset" ------------- + // ------------- Optional query parameter "offset" ------------- + + err = runtime.BindQueryParameter("form", true, false, "offset", r.URL.Query(), ¶ms.Offset) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "offset", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.ListDocuments(w, r, projectID, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// UploadDocuments operation middleware +func (siw *ServerInterfaceWrapper) UploadDocuments(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.UploadDocuments(w, r, projectID) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// DeleteDocument operation middleware +func (siw *ServerInterfaceWrapper) DeleteDocument(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + // ------------- Path parameter "documentID" ------------- + var documentID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "documentID", chi.URLParam(r, "documentID"), &documentID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "documentID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.DeleteDocument(w, r, projectID, documentID) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// GetDocument operation middleware +func (siw *ServerInterfaceWrapper) GetDocument(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + // ------------- Path parameter "documentID" ------------- + var documentID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "documentID", chi.URLParam(r, "documentID"), &documentID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "documentID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetDocument(w, r, projectID, documentID) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// GetDocumentMetadata operation middleware +func (siw *ServerInterfaceWrapper) GetDocumentMetadata(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + // ------------- Path parameter "documentID" ------------- + var documentID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "documentID", chi.URLParam(r, "documentID"), &documentID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "documentID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetDocumentMetadata(w, r, projectID, documentID) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// ListJourneys operation middleware +func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + // Parameter object where we will unmarshal all parameters from the context + var params ListJourneysParams + + // ------------- Optional query parameter "limit" ------------- + + err = runtime.BindQueryParameter("form", true, false, "limit", r.URL.Query(), ¶ms.Limit) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "limit", Err: err}) + return + } + + // ------------- Optional query parameter "offset" ------------- + + err = runtime.BindQueryParameter("form", true, false, "offset", r.URL.Query(), ¶ms.Offset) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "offset", Err: err}) + return + } + + // ------------- Optional query parameter "search" ------------- + + err = runtime.BindQueryParameter("form", true, false, "search", r.URL.Query(), ¶ms.Search) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "search", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.ListJourneys(w, r, projectID, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// CreateJourney operation middleware +func (siw *ServerInterfaceWrapper) CreateJourney(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + // Parameter object where we will unmarshal all parameters from the context + var params CreateJourneyParams + + // ------------- Optional query parameter "publish" ------------- - err = runtime.BindQueryParameter("form", true, false, "offset", r.URL.Query(), ¶ms.Offset) + err = runtime.BindQueryParameter("form", true, false, "publish", r.URL.Query(), ¶ms.Publish) if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "offset", Err: err}) + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "publish", Err: err}) return } handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.ListDocuments(w, r, projectID, params) + siw.Handler.CreateJourney(w, r, projectID, params) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21330,8 +22722,8 @@ func (siw *ServerInterfaceWrapper) ListDocuments(w http.ResponseWriter, r *http. handler.ServeHTTP(w, r) } -// UploadDocuments operation middleware -func (siw *ServerInterfaceWrapper) UploadDocuments(w http.ResponseWriter, r *http.Request) { +// DeleteJourney operation middleware +func (siw *ServerInterfaceWrapper) DeleteJourney(w http.ResponseWriter, r *http.Request) { var err error @@ -21344,6 +22736,15 @@ func (siw *ServerInterfaceWrapper) UploadDocuments(w http.ResponseWriter, r *htt return } + // ------------- Path parameter "journeyID" ------------- + var journeyID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "journeyID", chi.URLParam(r, "journeyID"), &journeyID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "journeyID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) @@ -21351,7 +22752,7 @@ func (siw *ServerInterfaceWrapper) UploadDocuments(w http.ResponseWriter, r *htt r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.UploadDocuments(w, r, projectID) + siw.Handler.DeleteJourney(w, r, projectID, journeyID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21361,8 +22762,8 @@ func (siw *ServerInterfaceWrapper) UploadDocuments(w http.ResponseWriter, r *htt handler.ServeHTTP(w, r) } -// DeleteDocument operation middleware -func (siw *ServerInterfaceWrapper) DeleteDocument(w http.ResponseWriter, r *http.Request) { +// GetJourney operation middleware +func (siw *ServerInterfaceWrapper) GetJourney(w http.ResponseWriter, r *http.Request) { var err error @@ -21375,12 +22776,12 @@ func (siw *ServerInterfaceWrapper) DeleteDocument(w http.ResponseWriter, r *http return } - // ------------- Path parameter "documentID" ------------- - var documentID openapi_types.UUID + // ------------- Path parameter "journeyID" ------------- + var journeyID openapi_types.UUID - err = runtime.BindStyledParameterWithOptions("simple", "documentID", chi.URLParam(r, "documentID"), &documentID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "journeyID", chi.URLParam(r, "journeyID"), &journeyID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "documentID", Err: err}) + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "journeyID", Err: err}) return } @@ -21391,7 +22792,7 @@ func (siw *ServerInterfaceWrapper) DeleteDocument(w http.ResponseWriter, r *http r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.DeleteDocument(w, r, projectID, documentID) + siw.Handler.GetJourney(w, r, projectID, journeyID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21401,8 +22802,8 @@ func (siw *ServerInterfaceWrapper) DeleteDocument(w http.ResponseWriter, r *http handler.ServeHTTP(w, r) } -// GetDocument operation middleware -func (siw *ServerInterfaceWrapper) GetDocument(w http.ResponseWriter, r *http.Request) { +// UpdateJourney operation middleware +func (siw *ServerInterfaceWrapper) UpdateJourney(w http.ResponseWriter, r *http.Request) { var err error @@ -21415,12 +22816,12 @@ func (siw *ServerInterfaceWrapper) GetDocument(w http.ResponseWriter, r *http.Re return } - // ------------- Path parameter "documentID" ------------- - var documentID openapi_types.UUID + // ------------- Path parameter "journeyID" ------------- + var journeyID openapi_types.UUID - err = runtime.BindStyledParameterWithOptions("simple", "documentID", chi.URLParam(r, "documentID"), &documentID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "journeyID", chi.URLParam(r, "journeyID"), &journeyID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "documentID", Err: err}) + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "journeyID", Err: err}) return } @@ -21431,7 +22832,7 @@ func (siw *ServerInterfaceWrapper) GetDocument(w http.ResponseWriter, r *http.Re r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetDocument(w, r, projectID, documentID) + siw.Handler.UpdateJourney(w, r, projectID, journeyID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21441,8 +22842,8 @@ func (siw *ServerInterfaceWrapper) GetDocument(w http.ResponseWriter, r *http.Re handler.ServeHTTP(w, r) } -// GetDocumentMetadata operation middleware -func (siw *ServerInterfaceWrapper) GetDocumentMetadata(w http.ResponseWriter, r *http.Request) { +// DuplicateJourney operation middleware +func (siw *ServerInterfaceWrapper) DuplicateJourney(w http.ResponseWriter, r *http.Request) { var err error @@ -21455,12 +22856,12 @@ func (siw *ServerInterfaceWrapper) GetDocumentMetadata(w http.ResponseWriter, r return } - // ------------- Path parameter "documentID" ------------- - var documentID openapi_types.UUID + // ------------- Path parameter "journeyID" ------------- + var journeyID openapi_types.UUID - err = runtime.BindStyledParameterWithOptions("simple", "documentID", chi.URLParam(r, "documentID"), &documentID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "journeyID", chi.URLParam(r, "journeyID"), &journeyID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "documentID", Err: err}) + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "journeyID", Err: err}) return } @@ -21471,7 +22872,7 @@ func (siw *ServerInterfaceWrapper) GetDocumentMetadata(w http.ResponseWriter, r r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetDocumentMetadata(w, r, projectID, documentID) + siw.Handler.DuplicateJourney(w, r, projectID, journeyID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21481,8 +22882,8 @@ func (siw *ServerInterfaceWrapper) GetDocumentMetadata(w http.ResponseWriter, r handler.ServeHTTP(w, r) } -// ListJourneys operation middleware -func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.Request) { +// ListJourneyEntrances operation middleware +func (siw *ServerInterfaceWrapper) ListJourneyEntrances(w http.ResponseWriter, r *http.Request) { var err error @@ -21495,6 +22896,15 @@ func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.R return } + // ------------- Path parameter "journeyID" ------------- + var journeyID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "journeyID", chi.URLParam(r, "journeyID"), &journeyID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "journeyID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) @@ -21502,7 +22912,7 @@ func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.R r = r.WithContext(ctx) // Parameter object where we will unmarshal all parameters from the context - var params ListJourneysParams + var params ListJourneyEntrancesParams // ------------- Optional query parameter "limit" ------------- @@ -21529,7 +22939,7 @@ func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.R } handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.ListJourneys(w, r, projectID, params) + siw.Handler.ListJourneyEntrances(w, r, projectID, journeyID, params) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21539,8 +22949,8 @@ func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.R handler.ServeHTTP(w, r) } -// CreateJourney operation middleware -func (siw *ServerInterfaceWrapper) CreateJourney(w http.ResponseWriter, r *http.Request) { +// PublishJourney operation middleware +func (siw *ServerInterfaceWrapper) PublishJourney(w http.ResponseWriter, r *http.Request) { var err error @@ -21553,25 +22963,23 @@ func (siw *ServerInterfaceWrapper) CreateJourney(w http.ResponseWriter, r *http. return } + // ------------- Path parameter "journeyID" ------------- + var journeyID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "journeyID", chi.URLParam(r, "journeyID"), &journeyID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "journeyID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) r = r.WithContext(ctx) - // Parameter object where we will unmarshal all parameters from the context - var params CreateJourneyParams - - // ------------- Optional query parameter "publish" ------------- - - err = runtime.BindQueryParameter("form", true, false, "publish", r.URL.Query(), ¶ms.Publish) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "publish", Err: err}) - return - } - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.CreateJourney(w, r, projectID, params) + siw.Handler.PublishJourney(w, r, projectID, journeyID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21581,8 +22989,8 @@ func (siw *ServerInterfaceWrapper) CreateJourney(w http.ResponseWriter, r *http. handler.ServeHTTP(w, r) } -// DeleteJourney operation middleware -func (siw *ServerInterfaceWrapper) DeleteJourney(w http.ResponseWriter, r *http.Request) { +// GetJourneySteps operation middleware +func (siw *ServerInterfaceWrapper) GetJourneySteps(w http.ResponseWriter, r *http.Request) { var err error @@ -21611,7 +23019,7 @@ func (siw *ServerInterfaceWrapper) DeleteJourney(w http.ResponseWriter, r *http. r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.DeleteJourney(w, r, projectID, journeyID) + siw.Handler.GetJourneySteps(w, r, projectID, journeyID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21621,8 +23029,8 @@ func (siw *ServerInterfaceWrapper) DeleteJourney(w http.ResponseWriter, r *http. handler.ServeHTTP(w, r) } -// GetJourney operation middleware -func (siw *ServerInterfaceWrapper) GetJourney(w http.ResponseWriter, r *http.Request) { +// SetJourneySteps operation middleware +func (siw *ServerInterfaceWrapper) SetJourneySteps(w http.ResponseWriter, r *http.Request) { var err error @@ -21651,7 +23059,7 @@ func (siw *ServerInterfaceWrapper) GetJourney(w http.ResponseWriter, r *http.Req r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetJourney(w, r, projectID, journeyID) + siw.Handler.SetJourneySteps(w, r, projectID, journeyID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21661,8 +23069,8 @@ func (siw *ServerInterfaceWrapper) GetJourney(w http.ResponseWriter, r *http.Req handler.ServeHTTP(w, r) } -// UpdateJourney operation middleware -func (siw *ServerInterfaceWrapper) UpdateJourney(w http.ResponseWriter, r *http.Request) { +// ListJourneyStepUsers operation middleware +func (siw *ServerInterfaceWrapper) ListJourneyStepUsers(w http.ResponseWriter, r *http.Request) { var err error @@ -21684,14 +23092,42 @@ func (siw *ServerInterfaceWrapper) UpdateJourney(w http.ResponseWriter, r *http. return } + // ------------- Path parameter "stepID" ------------- + var stepID string + + err = runtime.BindStyledParameterWithOptions("simple", "stepID", chi.URLParam(r, "stepID"), &stepID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "stepID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) r = r.WithContext(ctx) + // Parameter object where we will unmarshal all parameters from the context + var params ListJourneyStepUsersParams + + // ------------- Optional query parameter "limit" ------------- + + err = runtime.BindQueryParameter("form", true, false, "limit", r.URL.Query(), ¶ms.Limit) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "limit", Err: err}) + return + } + + // ------------- Optional query parameter "offset" ------------- + + err = runtime.BindQueryParameter("form", true, false, "offset", r.URL.Query(), ¶ms.Offset) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "offset", Err: err}) + return + } + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.UpdateJourney(w, r, projectID, journeyID) + siw.Handler.ListJourneyStepUsers(w, r, projectID, journeyID, stepID, params) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21701,8 +23137,8 @@ func (siw *ServerInterfaceWrapper) UpdateJourney(w http.ResponseWriter, r *http. handler.ServeHTTP(w, r) } -// DuplicateJourney operation middleware -func (siw *ServerInterfaceWrapper) DuplicateJourney(w http.ResponseWriter, r *http.Request) { +// RemoveUserFromJourneyStep operation middleware +func (siw *ServerInterfaceWrapper) RemoveUserFromJourneyStep(w http.ResponseWriter, r *http.Request) { var err error @@ -21724,6 +23160,24 @@ func (siw *ServerInterfaceWrapper) DuplicateJourney(w http.ResponseWriter, r *ht return } + // ------------- Path parameter "stepID" ------------- + var stepID string + + err = runtime.BindStyledParameterWithOptions("simple", "stepID", chi.URLParam(r, "stepID"), &stepID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "stepID", Err: err}) + return + } + + // ------------- Path parameter "userID" ------------- + var userID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "userID", chi.URLParam(r, "userID"), &userID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "userID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) @@ -21731,7 +23185,7 @@ func (siw *ServerInterfaceWrapper) DuplicateJourney(w http.ResponseWriter, r *ht r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.DuplicateJourney(w, r, projectID, journeyID) + siw.Handler.RemoveUserFromJourneyStep(w, r, projectID, journeyID, stepID, userID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21741,8 +23195,8 @@ func (siw *ServerInterfaceWrapper) DuplicateJourney(w http.ResponseWriter, r *ht handler.ServeHTTP(w, r) } -// PublishJourney operation middleware -func (siw *ServerInterfaceWrapper) PublishJourney(w http.ResponseWriter, r *http.Request) { +// SkipJourneyStepDelay operation middleware +func (siw *ServerInterfaceWrapper) SkipJourneyStepDelay(w http.ResponseWriter, r *http.Request) { var err error @@ -21764,6 +23218,24 @@ func (siw *ServerInterfaceWrapper) PublishJourney(w http.ResponseWriter, r *http return } + // ------------- Path parameter "stepID" ------------- + var stepID string + + err = runtime.BindStyledParameterWithOptions("simple", "stepID", chi.URLParam(r, "stepID"), &stepID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "stepID", Err: err}) + return + } + + // ------------- Path parameter "userID" ------------- + var userID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "userID", chi.URLParam(r, "userID"), &userID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "userID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) @@ -21771,7 +23243,7 @@ func (siw *ServerInterfaceWrapper) PublishJourney(w http.ResponseWriter, r *http r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.PublishJourney(w, r, projectID, journeyID) + siw.Handler.SkipJourneyStepDelay(w, r, projectID, journeyID, stepID, userID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21781,8 +23253,8 @@ func (siw *ServerInterfaceWrapper) PublishJourney(w http.ResponseWriter, r *http handler.ServeHTTP(w, r) } -// GetJourneySteps operation middleware -func (siw *ServerInterfaceWrapper) GetJourneySteps(w http.ResponseWriter, r *http.Request) { +// TriggerUserToJourneyStep operation middleware +func (siw *ServerInterfaceWrapper) TriggerUserToJourneyStep(w http.ResponseWriter, r *http.Request) { var err error @@ -21804,6 +23276,24 @@ func (siw *ServerInterfaceWrapper) GetJourneySteps(w http.ResponseWriter, r *htt return } + // ------------- Path parameter "stepID" ------------- + var stepID string + + err = runtime.BindStyledParameterWithOptions("simple", "stepID", chi.URLParam(r, "stepID"), &stepID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "stepID", Err: err}) + return + } + + // ------------- Path parameter "userID" ------------- + var userID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "userID", chi.URLParam(r, "userID"), &userID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "userID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) @@ -21811,7 +23301,7 @@ func (siw *ServerInterfaceWrapper) GetJourneySteps(w http.ResponseWriter, r *htt r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetJourneySteps(w, r, projectID, journeyID) + siw.Handler.TriggerUserToJourneyStep(w, r, projectID, journeyID, stepID, userID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -21821,8 +23311,8 @@ func (siw *ServerInterfaceWrapper) GetJourneySteps(w http.ResponseWriter, r *htt handler.ServeHTTP(w, r) } -// SetJourneySteps operation middleware -func (siw *ServerInterfaceWrapper) SetJourneySteps(w http.ResponseWriter, r *http.Request) { +// RemoveUserFromJourney operation middleware +func (siw *ServerInterfaceWrapper) RemoveUserFromJourney(w http.ResponseWriter, r *http.Request) { var err error @@ -21844,6 +23334,15 @@ func (siw *ServerInterfaceWrapper) SetJourneySteps(w http.ResponseWriter, r *htt return } + // ------------- Path parameter "userID" ------------- + var userID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "userID", chi.URLParam(r, "userID"), &userID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "userID", Err: err}) + return + } + ctx := r.Context() ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) @@ -21851,7 +23350,7 @@ func (siw *ServerInterfaceWrapper) SetJourneySteps(w http.ResponseWriter, r *htt r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.SetJourneySteps(w, r, projectID, journeyID) + siw.Handler.RemoveUserFromJourney(w, r, projectID, journeyID, userID) })) for _, middleware := range siw.HandlerMiddlewares { @@ -22547,6 +24046,46 @@ func (siw *ServerInterfaceWrapper) DuplicateList(w http.ResponseWriter, r *http. handler.ServeHTTP(w, r) } +// RecountList operation middleware +func (siw *ServerInterfaceWrapper) RecountList(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + // ------------- Path parameter "listID" ------------- + var listID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "listID", chi.URLParam(r, "listID"), &listID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "listID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.RecountList(w, r, projectID, listID) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // GetListUsers operation middleware func (siw *ServerInterfaceWrapper) GetListUsers(w http.ResponseWriter, r *http.Request) { @@ -25230,6 +26769,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/duplicate", wrapper.DuplicateJourney) }) + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/entrances", wrapper.ListJourneyEntrances) + }) r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/publish", wrapper.PublishJourney) }) @@ -25239,6 +26781,21 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Put(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/steps", wrapper.SetJourneySteps) }) + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users", wrapper.ListJourneyStepUsers) + }) + r.Group(func(r chi.Router) { + r.Delete(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}", wrapper.RemoveUserFromJourneyStep) + }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/skip", wrapper.SkipJourneyStepDelay) + }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/steps/{stepID}/users/{userID}/trigger", wrapper.TriggerUserToJourneyStep) + }) + r.Group(func(r chi.Router) { + r.Delete(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/users/{userID}", wrapper.RemoveUserFromJourney) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects/{projectID}/journeys/{journeyID}/users/{userID}", wrapper.StreamUserJourneySteps) }) @@ -25287,6 +26844,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/api/admin/projects/{projectID}/lists/{listID}/duplicate", wrapper.DuplicateList) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/api/admin/projects/{projectID}/lists/{listID}/recount", wrapper.RecountList) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects/{projectID}/lists/{listID}/users", wrapper.GetListUsers) }) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..6aa4b3c66 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1889 @@ +{ + "name": "platform", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@openapitools/openapi-generator-cli": "^2.29.0" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", + "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nestjs/axios": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-4.0.1.tgz", + "integrity": "sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "axios": "^1.3.1", + "rxjs": "^7.0.0" + } + }, + "node_modules/@nestjs/common": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.13.tgz", + "integrity": "sha512-ieqWtipT+VlyDWLz5Rvz0f3E5rXcVAnaAi+D53DEHLjc1kmFxCgZ62qVfTX2vwkywwqNkTNXvBgGR72hYqV//Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "file-type": "21.3.0", + "iterare": "1.2.1", + "load-esm": "1.0.3", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.13.tgz", + "integrity": "sha512-Tq9EIKiC30EBL8hLK93tNqaToy0hzbuVGYt29V8NhkVJUsDzlmiVf6c3hSPtzx2krIUVbTgQ2KFeaxr72rEyzQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.3.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, + "node_modules/@openapitools/openapi-generator-cli": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.29.0.tgz", + "integrity": "sha512-qk0ccFLK653U/+dmIzlUK1Qr7edG6EkFapF9rgvTbgJvzu9y50nU6iGgu5+zElSB24GmRUysDbgJSkqSnk26Iw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@nestjs/axios": "4.0.1", + "@nestjs/common": "11.1.13", + "@nestjs/core": "11.1.13", + "@nuxtjs/opencollective": "0.3.2", + "axios": "1.13.5", + "chalk": "4.1.2", + "commander": "8.3.0", + "compare-versions": "6.1.1", + "concurrently": "9.2.1", + "console.table": "0.10.0", + "fs-extra": "11.3.3", + "glob": "13.0.3", + "inquirer": "8.2.7", + "proxy-agent": "6.5.0", + "reflect-metadata": "0.2.2", + "rxjs": "7.8.2", + "tslib": "2.8.1" + }, + "bin": { + "openapi-generator-cli": "main.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/openapi_generator" + } + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/console.table": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz", + "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==", + "license": "MIT", + "dependencies": { + "easy-table": "1.1.0" + }, + "engines": { + "node": "> 0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/easy-table": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz", + "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==", + "license": "MIT", + "optionalDependencies": { + "wcwidth": ">=1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-type": { + "version": "21.3.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.0.tgz", + "integrity": "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.3.tgz", + "integrity": "sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.0", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", + "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", + "license": "MIT", + "dependencies": { + "@inquirer/external-editor": "^1.0.0", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/load-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strtok3": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..4d1068c69 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@openapitools/openapi-generator-cli": "^2.29.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..0b7000bcf --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1148 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@openapitools/openapi-generator-cli': + specifier: ^2.29.0 + version: 2.30.2 + +packages: + + '@borewit/text-codec@0.2.1': + resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} + + '@inquirer/core@6.0.0': + resolution: {integrity: sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==} + engines: {node: '>=14.18.0'} + + '@inquirer/select@1.3.3': + resolution: {integrity: sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg==} + engines: {node: '>=14.18.0'} + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@nestjs/axios@4.0.1': + resolution: {integrity: sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==} + peerDependencies: + '@nestjs/common': ^10.0.0 || ^11.0.0 + axios: ^1.3.1 + rxjs: ^7.0.0 + + '@nestjs/common@11.1.16': + resolution: {integrity: sha512-JSIeW+USuMJkkcNbiOdcPkVCeI3TSnXstIVEPpp3HiaKnPRuSbUUKm9TY9o/XpIcPHWUOQItAtC5BiAwFdVITQ==} + peerDependencies: + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/core@11.1.16': + resolution: {integrity: sha512-tXWXyCiqWthelJjrE0KLFjf0O98VEt+WPVx5CrqCf+059kIxJ8y1Vw7Cy7N4fwQafWNrmFL2AfN87DDMbVAY0w==} + engines: {node: '>= 20'} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 + '@nestjs/websockets': ^11.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nuxt/opencollective@0.4.1': + resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==} + engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} + hasBin: true + + '@nuxtjs/opencollective@0.3.2': + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + '@openapitools/openapi-generator-cli@2.30.2': + resolution: {integrity: sha512-rGgLrY88f7/eTBc2wmehhcqQq7/1wEkNQUhvk1NF0nh/bCGGGRfzN6O4U2VHsREtshUT+IUaRoJwq4UeDrRXZQ==} + engines: {node: '>=20.19.0'} + hasBin: true + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node@20.19.37': + resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.13.6: + resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + basic-ftp@5.2.0: + resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} + engines: {node: '>=10.0.0'} + + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + console.table@0.10.0: + resolution: {integrity: sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==} + engines: {node: '> 0.10'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + easy-table@1.1.0: + resolution: {integrity: sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-type@21.3.0: + resolution: {integrity: sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==} + engines: {node: '>=20'} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} + engines: {node: '>=14.14'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + load-esm@1.0.3: + resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} + engines: {node: '>=13.2.0'} + + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + +snapshots: + + '@borewit/text-codec@0.2.1': {} + + '@inquirer/core@6.0.0': + dependencies: + '@inquirer/type': 1.5.5 + '@types/mute-stream': 0.0.4 + '@types/node': 20.19.37 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + figures: 3.2.0 + mute-stream: 1.0.0 + run-async: 3.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + '@inquirer/select@1.3.3': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + figures: 3.2.0 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@lukeed/csprng@1.1.0': {} + + '@nestjs/axios@4.0.1(@nestjs/common@11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.13.6)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2) + axios: 1.13.6 + rxjs: 7.8.2 + + '@nestjs/common@11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + file-type: 21.3.0 + iterare: 1.2.1 + load-esm: 1.0.3 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + transitivePeerDependencies: + - supports-color + + '@nestjs/core@11.1.16(@nestjs/common@11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nuxt/opencollective': 0.4.1 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 8.3.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + + '@nuxt/opencollective@0.4.1': + dependencies: + consola: 3.4.2 + + '@nuxtjs/opencollective@0.3.2': + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@openapitools/openapi-generator-cli@2.30.2': + dependencies: + '@inquirer/select': 1.3.3 + '@nestjs/axios': 4.0.1(@nestjs/common@11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.13.6)(rxjs@7.8.2) + '@nestjs/common': 11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.16(@nestjs/common@11.1.16(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nuxtjs/opencollective': 0.3.2 + axios: 1.13.6 + chalk: 4.1.2 + commander: 8.3.0 + compare-versions: 6.1.1 + concurrently: 9.2.1 + console.table: 0.10.0 + fs-extra: 11.3.4 + glob: 13.0.6 + proxy-agent: 6.5.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@nestjs/microservices' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - class-transformer + - class-validator + - debug + - encoding + - supports-color + + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.19.37 + + '@types/node@20.19.37': + dependencies: + undici-types: 6.21.0 + + '@types/wrap-ansi@3.0.0': {} + + agent-base@7.1.4: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + asynckit@0.4.0: {} + + axios@1.13.6: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@4.0.4: {} + + basic-ftp@5.2.0: {} + + brace-expansion@5.0.4: + dependencies: + balanced-match: 4.0.4 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: + optional: true + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@8.3.0: {} + + compare-versions@6.1.1: {} + + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + consola@2.15.3: {} + + consola@3.4.2: {} + + console.table@0.10.0: + dependencies: + easy-table: 1.1.0 + + data-uri-to-buffer@6.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + optional: true + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + delayed-stream@1.0.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + easy-table@1.1.0: + optionalDependencies: + wcwidth: 1.0.1 + + emoji-regex@8.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-safe-stringify@2.1.1: {} + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-type@21.3.0: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.4 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + + follow-redirects@1.15.11: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@11.3.4: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-uri@6.0.5: + dependencies: + basic-ftp: 5.2.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + glob@13.0.6: + dependencies: + minimatch: 10.2.4 + minipass: 7.1.3 + path-scurry: 2.0.2 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ieee754@1.2.1: {} + + ip-address@10.1.0: {} + + is-fullwidth-code-point@3.0.0: {} + + iterare@1.2.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + load-esm@1.0.3: {} + + lru-cache@11.2.6: {} + + lru-cache@7.18.3: {} + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@10.2.4: + dependencies: + brace-expansion: 5.0.4 + + minipass@7.1.3: {} + + ms@2.1.3: {} + + mute-stream@1.0.0: {} + + netmask@2.0.2: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.3 + + path-to-regexp@8.3.0: {} + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + + reflect-metadata@0.2.2: {} + + require-directory@2.1.1: {} + + run-async@3.0.0: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + shell-quote@1.8.3: {} + + signal-exit@4.1.0: {} + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + + source-map@0.6.1: + optional: true + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + + tslib@2.8.1: {} + + type-fest@0.21.3: {} + + uid@2.0.2: + dependencies: + '@lukeed/csprng': 1.1.0 + + uint8array-extras@1.5.0: {} + + undici-types@6.21.0: {} + + universalify@2.0.1: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + optional: true + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1