import {z} from 'zod' export type GetApiAudiencesAudienceIdSegmentsSegmentIdArgs = {audienceId: number, segmentId: number}; export type GetApiAudiencesAudienceIdSegmentsSegmentIdOptions = {baseUrl?: string | undefined, TdApikeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const user = z.object({id: z.string().optional(), td_user_id: z.string().optional(), name: z.string().optional()}); export const emptyCondition = z.object({}); export const orCondition = z.object({type: z.literal("Or"), conditions: z.array(z.lazy(() => condition))}); export const value = z.unknown(); export const operator = z.object({}); export const arrayMatching = z.union([z.enum(["any", "all"]), z.object({atLeast: z.number().optional()}), z.object({atMost: z.number().optional()}), z.object({exactly: z.number().optional()})]); export const valueCondition = z.object({type: z.literal("Value").optional(), leftValue: value.optional(), operator: operator.optional(), arrayMatching: arrayMatching.optional()}); export const referenceCondition = z.object({type: z.enum(["FunnelStageReference", "Reference", "AbTestVariantReference", "PredictiveScoreReference", "MlAttributeReference"]).optional()}); export const condition: z.ZodType = z.union([z.lazy(() => andCondition), orCondition, valueCondition, referenceCondition]); export const andCondition: z.ZodType = z.object({type: z.literal("And"), conditions: z.array(condition)}); export const compositeCondition = z.object({type: z.literal("Composite"), conditions: z.array(condition), expr: z.string()}); export const segmentRule = z.union([emptyCondition, andCondition, orCondition, compositeCondition]); export const partialV5RuleYamlV5IonRuleLocalDuration = z.object({day: z.number().optional(), hour: z.number().optional(), minute: z.number().optional(), month: z.number().optional(), quarter: z.number().optional(), second: z.number().optional(), week: z.number().optional(), year: z.number().optional()}); export const partialV5RuleYamlV5IonRuleUnit = z.enum(["year", "quarter", "month", "week", "day", "hour", "minute", "second"]); export const partialV5RuleYamlV5IonRuleDuration = z.union([z.object({year: z.number()}), z.object({quarter: z.number()}), z.object({month: z.number()}), z.object({week: z.number()}), z.object({day: z.number()}), z.object({hour: z.number()}), z.object({minute: z.number()}), z.object({second: z.number()})]); export const partialV5RuleYamlV5IonRuleValueOperator = z.union([z.object({not: z.boolean(), rightValue: z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("GreaterEqual")}), z.union([z.object({duration: partialV5RuleYamlV5IonRuleDuration, from: z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), not: z.boolean(), reverse: z.boolean(), type: z.literal("TimeRange")}), z.object({from: z.object({unit: partialV5RuleYamlV5IonRuleUnit}), not: z.literal(false), type: z.literal("TimeRange")}), z.object({type: z.literal("TimeToday")}), z.object({from: z.object({unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("TimeThis")}), z.object({from: z.object({unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("TimeNext")}), z.object({type: z.literal("TimeWithinNext"), unit: partialV5RuleYamlV5IonRuleUnit, value: z.string()}), z.object({type: z.literal("TimeWithinPast"), unit: partialV5RuleYamlV5IonRuleUnit, value: z.string()}), z.object({from: z.object({next: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), not: z.literal(false), to: z.object({next: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("TimeInBetweenNext")})]), z.object({not: z.boolean(), rightValue: z.object({timestamp: z.string()}), type: z.literal("Equal")}), z.object({not: z.literal(false), rightValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), type: z.literal("Greater")}), z.object({not: z.literal(false), rightValue: z.object({timestamp: z.string()}), type: z.literal("GreaterEqual")}), z.object({not: z.literal(false), rightValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), type: z.literal("Less")}), z.object({not: z.literal(false), rightValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), type: z.literal("LessEqual")}), z.object({maxValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), minValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), not: z.boolean(), type: z.literal("Between")}), z.object({not: z.boolean(), rightValue: z.union([z.number(), z.string(), z.boolean()]), type: z.literal("Equal")}), z.object({not: z.boolean(), rightValue: z.union([z.number(), z.string(), z.boolean()]), type: z.literal("IsNull")}), z.object({not: z.boolean(), rightValues: z.array(z.union([z.number(), z.string()])), type: z.literal("In")}), z.object({not: z.boolean(), rightValue: z.union([z.number(), z.string(), z.boolean()]), type: z.literal("Greater")}), z.object({not: z.boolean(), rightValue: z.union([z.number(), z.string(), z.boolean()]), type: z.literal("Less")}), z.object({not: z.boolean(), rightValue: z.union([z.number(), z.string(), z.boolean()]), type: z.literal("GreaterEqual")}), z.object({not: z.boolean(), rightValue: z.union([z.number(), z.string(), z.boolean()]), type: z.literal("LessEqual")}), z.object({maxValue: z.union([z.number(), z.string()]), minValue: z.union([z.number(), z.string()]), not: z.boolean(), rightValue: z.number(), type: z.literal("Between")}), z.object({not: z.boolean(), rightValues: z.array(z.string()), type: z.literal("Contain")}), z.object({not: z.boolean(), rightValues: z.array(z.string()), type: z.literal("StartWith")}), z.object({not: z.boolean(), rightValues: z.array(z.string()), type: z.literal("EndWith")}), z.object({not: z.boolean(), rightValue: z.string(), type: z.literal("Regexp")})]); export const partialV5RuleYamlV5IonRuleReferenceCondition = z.union([z.object({exclude: z.boolean(), id: z.string(), type: z.enum(["FunnelStageReference", "Reference", "AbTestVariantReference"])}), z.object({id: z.string(), includeConvertedCustomers: z.boolean(), maxGrade: z.number(), minGrade: z.number(), type: z.literal("PredictiveScoreReference")}), z.object({id: z.string(), leftValue: z.object({attribute: z.enum(["r_quartile", "f_quartile", "m_quartile", "rfm_segment", "rfm_score", "rfm_cluster_rank", "rfm_quartile"])}), operator: partialV5RuleYamlV5IonRuleValueOperator, solutionType: z.literal("rfm"), type: z.literal("MlAttributeReference")}), z.object({id: z.string(), leftValue: z.object({attribute: z.enum(["cltv_1m", "cltv_1m_pctile", "cltv_3m", "cltv_3m_pctile", "cltv_6m", "cltv_6m_pctile", "cltv_12m", "cltv_12m_pctile", "cltv_24m", "cltv_24m_pctile", "alive_prob", "cltv_segment"])}), operator: partialV5RuleYamlV5IonRuleValueOperator, solutionType: z.literal("cltv"), type: z.literal("MlAttributeReference")})]); export const partialV5RuleYamlV5IonRuleValueArrayMatching = z.union([z.unknown(), z.enum(["all", "any"]), z.object({atLeast: z.number()}), z.object({atMost: z.number()}), z.object({exactly: z.number()})]); export const partialV5RuleYamlV5IonRuleAttributeNameValue = z.object({name: z.string()}); export const partialV5RuleYamlV5IonRuleCustomerGroupAttributeValue = z.object({customerGroup: z.string(), name: z.string()}); export const partialV5RuleYamlV5IonRuleTimeframeOperator = z.union([z.object({not: z.boolean(), rightValue: z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("GreaterEqual")}), z.union([z.object({duration: partialV5RuleYamlV5IonRuleDuration, from: z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), not: z.boolean(), reverse: z.boolean(), type: z.literal("TimeRange")}), z.object({from: z.object({unit: partialV5RuleYamlV5IonRuleUnit}), not: z.literal(false), type: z.literal("TimeRange")}), z.object({type: z.literal("TimeToday")}), z.object({from: z.object({unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("TimeThis")}), z.object({from: z.object({unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("TimeNext")}), z.object({type: z.literal("TimeWithinNext"), unit: partialV5RuleYamlV5IonRuleUnit, value: z.string()}), z.object({type: z.literal("TimeWithinPast"), unit: partialV5RuleYamlV5IonRuleUnit, value: z.string()}), z.object({from: z.object({next: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), not: z.literal(false), to: z.object({next: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit}), type: z.literal("TimeInBetweenNext")})]), z.object({not: z.boolean(), rightValue: z.object({timestamp: z.string()}), type: z.literal("Equal")}), z.object({not: z.literal(false), rightValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), type: z.literal("Greater")}), z.object({not: z.literal(false), rightValue: z.object({timestamp: z.string()}), type: z.literal("GreaterEqual")}), z.object({not: z.literal(false), rightValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), type: z.literal("Less")}), z.object({not: z.literal(false), rightValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), type: z.literal("LessEqual")}), z.object({maxValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), minValue: z.union([z.object({timestamp: z.string()}), z.object({last: z.union([z.number(), partialV5RuleYamlV5IonRuleLocalDuration]), unit: partialV5RuleYamlV5IonRuleUnit})]), not: z.boolean(), type: z.literal("Between")})]); export const partialV5RuleYamlV5IonRuleColumnFilter = z.union([z.object({arrayMatching: partialV5RuleYamlV5IonRuleValueArrayMatching, column: z.string(), operator: partialV5RuleYamlV5IonRuleValueOperator, type: z.literal("Column")}), z.object({arrayMatching: partialV5RuleYamlV5IonRuleValueArrayMatching, column: z.literal("timestamp"), operator: partialV5RuleYamlV5IonRuleTimeframeOperator, type: z.literal("Column")})]); export const partialV5RuleYamlV5IonRuleOrFilter: z.ZodType = z.object({conditions: z.array(z.union([z.lazy(() => partialV5RuleYamlV5IonRuleAndFilter), z.lazy(() => partialV5RuleYamlV5IonRuleOrFilter), partialV5RuleYamlV5IonRuleColumnFilter])), type: z.literal("Or")}); export const partialV5RuleYamlV5IonRuleAndFilter: z.ZodType = z.object({conditions: z.array(z.union([z.lazy(() => partialV5RuleYamlV5IonRuleAndFilter), partialV5RuleYamlV5IonRuleOrFilter, partialV5RuleYamlV5IonRuleColumnFilter])), type: z.literal("And")}); export const partialV5RuleYamlV5IonRuleFilter = z.union([z.object({}).nullable(), partialV5RuleYamlV5IonRuleAndFilter, partialV5RuleYamlV5IonRuleOrFilter]); export const partialV5RuleYamlV5IonRuleAggregationValue = z.object({aggregation: z.union([z.object({column: z.string(), groupingColumns: z.array(z.string()).optional(), type: z.enum(["Sum", "Min", "Max", "Average"])}), z.object({groupingColumns: z.array(z.string()), type: z.literal("Count")}), z.object({columns: z.array(z.string()), type: z.literal("CountDistinct")}), z.object({column: z.string(), groupingColumns: z.array(z.string()).optional(), orderColumn: z.string(), type: z.enum(["First", "Last"])})]), filter: partialV5RuleYamlV5IonRuleFilter, source: z.object({name: z.string()}), window: z.object({duration: z.object({day: z.number().optional(), hour: z.number().optional(), minute: z.number().optional(), second: z.number().optional()}), type: z.literal("TimeSliding")}).optional()}); export const partialV5RuleYamlV5IonRuleValueLeftValue = z.union([partialV5RuleYamlV5IonRuleAttributeNameValue, partialV5RuleYamlV5IonRuleCustomerGroupAttributeValue, partialV5RuleYamlV5IonRuleAggregationValue]); export const partialV5RuleYamlV5IonRuleValueLimit = z.object({number: z.number(), orderColumns: z.array(z.union([z.object({column: z.string(), order: z.enum(["ascending", "descending"]), type: z.literal("Column")}), z.object({order: z.enum(["ascending", "descending"]), type: z.literal("Aggregation")})])).optional(), type: z.enum(["Count", "Percent"])}); export const partialV5RuleYamlV5IonRuleValueCondition = z.object({arrayMatching: partialV5RuleYamlV5IonRuleValueArrayMatching, exclude: z.boolean(), leftValue: partialV5RuleYamlV5IonRuleValueLeftValue, limit: partialV5RuleYamlV5IonRuleValueLimit.optional(), operator: partialV5RuleYamlV5IonRuleValueOperator, type: z.literal("Value")}); export const partialV5RuleYamlV5IonRuleValueConditionSet = z.object({conditions: z.array(z.union([partialV5RuleYamlV5IonRuleReferenceCondition, partialV5RuleYamlV5IonRuleValueCondition])), description: z.string().optional(), expr: z.string().optional(), type: z.enum(["Or", "And", "Composite"])}); export const partialV5RuleYamlV5IonRuleIonRule = z.object({conditions: z.array(partialV5RuleYamlV5IonRuleValueConditionSet), expr: z.string().optional(), limit: partialV5RuleYamlV5IonRuleValueLimit.optional(), type: z.enum(["Or", "And", "Composite"])}); export const partialV5RuleYamlV5IonRule = z.union([partialV5RuleYamlV5IonRuleIonRule, z.object({}).nullable()]); export const segment = z.object({audienceId: z.string().optional(), id: z.string().optional(), name: z.string().optional(), realtime: z.boolean().optional(), kind: z.number().int().optional(), description: z.string().nullable().optional(), segmentFolderId: z.string().optional(), population: z.number().int().nullable().optional(), createdAt: z.string().optional(), updatedAt: z.string().optional(), createdBy: user.optional(), updatedBy: user.optional(), rule: z.union([segmentRule, partialV5RuleYamlV5IonRule]).optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Retrieve segment by ID * * GET /audiences/{audienceId}/segments/{segmentId} */ export const getApiAudiencesAudienceIdSegmentsSegmentId = async (args: GetApiAudiencesAudienceIdSegmentsSegmentIdArgs, options?: GetApiAudiencesAudienceIdSegmentsSegmentIdOptions) => { const {baseUrl = "https://api-cdp.treasuredata.com", fetch: fetchFn = fetch, TdApikeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (TdApikeyAuth !== undefined) headers.set("Authorization", TdApikeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/audiences/${encodeURIComponent(String(args.audienceId))}/segments/${encodeURIComponent(String(args.segmentId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(segment, await res.json()) };