import {z} from 'zod' export type GetApiEntitiesSegmentsIdArgs = {id: number}; export type GetApiEntitiesSegmentsIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; 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 relationshipsFolderJsonApiResource = z.object({data: z.object({id: z.string(), type: z.literal("folder-segment")}).optional()}); export const relationshipsUserJsonApiResource = z.object({data: z.object({id: z.string(), type: z.literal("user")}).nullable().optional()}); export const batchSegmentJsonApiResource = z.object({id: z.string(), type: z.literal("segment-batch"), attributes: z.object({audienceId: z.string(), name: z.string(), description: z.string().nullable(), population: z.number().nullable(), numSyndications: z.number().int().optional(), rule: partialV5RuleYamlV5IonRule, createdAt: z.string(), updatedAt: z.string(), countPopulation: z.boolean().optional(), segmentInsightDashboardId: z.number().int().nullable().optional(), isEmptyRule: z.boolean().optional()}), relationships: z.object({parentFolder: relationshipsFolderJsonApiResource.optional(), createdBy: relationshipsUserJsonApiResource.optional(), updatedBy: relationshipsUserJsonApiResource.optional()})}); export const realtimeSegmentJsonApiResource = z.object({id: z.string(), type: z.literal("segment-realtime"), attributes: z.object({audienceId: z.string(), name: z.string(), description: z.string().nullable(), population: z.number().nullable(), numSyndications: z.number().int().nullable().optional(), rule: partialV5RuleYamlV5IonRule, createdAt: z.string(), updatedAt: z.string(), countPopulation: z.boolean().optional()}), relationships: z.object({parentFolder: relationshipsFolderJsonApiResource.optional(), createdBy: relationshipsUserJsonApiResource.optional(), updatedBy: relationshipsUserJsonApiResource.optional()})}); export const funnelStageSegmentJsonApiResource = z.object({id: z.string(), type: z.literal("segment-funnel-stage"), attributes: z.object({audienceId: z.string(), name: z.string(), description: z.string().nullable(), population: z.number().nullable(), numSyndications: z.number().int().optional(), rule: partialV5RuleYamlV5IonRule, createdAt: z.string(), updatedAt: z.string(), countPopulation: z.boolean().optional()}), relationships: z.object({parentFolder: relationshipsFolderJsonApiResource.optional(), createdBy: relationshipsUserJsonApiResource.optional(), updatedBy: relationshipsUserJsonApiResource.optional()})}); export const userJsonApiResource = z.object({id: z.string(), type: z.literal("user"), attributes: z.object({tdUserId: z.string(), name: z.string()})}); export const entitiesGetSegmentJsonApiResponse = z.object({data: z.union([batchSegmentJsonApiResource, realtimeSegmentJsonApiResource, funnelStageSegmentJsonApiResource]), included: z.array(userJsonApiResource)}); 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 /entities/segments/{id} */ export const getApiEntitiesSegmentsId = async (args: GetApiEntitiesSegmentsIdArgs, options?: GetApiEntitiesSegmentsIdOptions) => { const {baseUrl = "https://api-cdp.treasuredata.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/vnd.treasuredata.v1+json") const url = `${baseUrl.replace(/\/+$/, '')}/entities/segments/${encodeURIComponent(String(args.id))}${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(entitiesGetSegmentJsonApiResponse, await res.json()) };