import {z} from 'zod' export type GetApiFeatureFlagsActivityLogsArgs = {type?: ('ENV_TURN_ON' | 'ENV_TURN_OFF' | 'ENV_CHANGE_DEFAULT_KEY' | 'RULE_ADD' | 'RULE_DELETE' | 'RULE_CHANGE_NAME' | 'RULE_CHANGE_VARIATION' | 'RULE_CHANGE_DEVIATION' | 'RULE_CHANGE_EXPOSITION' | 'RULE_CHANGE_ROLLOUT' | 'RULE_CHANGE_TARGETING' | 'RULE_CHANGE_SCHEDULING' | 'RULE_CHANGE_STATE' | 'RULE_RESHUFFLE' | 'RULE_CHANGE_ROLLBACK_CONDITIONS' | 'RULE_CHANGE_TRAFFIC_ALLOCATION_METHOD' | 'VARIATION_ADD' | 'VARIATION_UPDATE' | 'VARIATION_DELETE' | 'VARIABLE_ADD' | 'VARIABLE_UPDATE' | 'VARIABLE_DELETE' | 'GOAL_ADD' | 'GOAL_NEW_PRIMARY' | 'GOAL_DELETE') | undefined, page?: number | undefined, perPage?: number | undefined, sortKey?: string | undefined, sortOrder?: ('ASC' | 'DESC') | undefined}; export type GetApiFeatureFlagsActivityLogsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const activityLogGoalDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), goalId: z.number().int().optional(), goalName: z.string().optional()}); export const activityLogRuleAddDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleStatus: z.enum(["ACTIVE", "PAUSED", "PLANNED"]).optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleDeleteDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityFeatureDeviationDetailsResponse = z.object({exposition: z.number().optional(), variationKey: z.string().optional(), variationName: z.string().optional()}); export const activityLogRuleDeviationDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), newRuleDeviations: z.array(activityFeatureDeviationDetailsResponse).optional(), oldRuleDeviations: z.array(activityFeatureDeviationDetailsResponse).optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleExpositionDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), newRuleExposition: z.number().int().optional(), oldRuleExposition: z.number().int().optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleNameDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), oldRuleName: z.string().optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleReshuffleDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const rolloutStepResponse = z.object({dateTime: z.string().optional(), exposure: z.number().optional()}); export const customRampUpResponse = z.object({type: z.enum(["PROGRESSIVE_EXPOSURE", "CUSTOM_RAMP_UP"]).optional(), steps: z.array(rolloutStepResponse).optional()}); export const rolloutFrequencyResponse = z.object({unit: z.enum(["DAYS", "HOURS", "MINUTES"]).optional(), value: z.number().int().optional()}); export const percentageRangeResponse = z.object({start: z.number().optional(), stop: z.number().optional()}); export const progressiveExposureResponse = z.object({type: z.enum(["PROGRESSIVE_EXPOSURE", "CUSTOM_RAMP_UP"]).optional(), frequency: rolloutFrequencyResponse.optional(), increaseBy: z.number().optional(), percentageRange: percentageRangeResponse.optional(), releaseDateTime: z.string().optional()}); export const activityLogRuleRolloutDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), newRuleRollout: z.union([customRampUpResponse, progressiveExposureResponse]).optional(), oldRuleRollout: z.union([customRampUpResponse, progressiveExposureResponse]).optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const ruleReleasePeriodResponse = z.object({releaseEndTime: z.string().optional(), releaseEndTimeZone: z.string().optional(), releaseStartTime: z.string().optional(), releaseStartTimeZone: z.string().optional()}); export const activityLogRuleSchedulingDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), newRuleDateRelease: ruleReleasePeriodResponse.optional(), oldRuleDateRelease: ruleReleasePeriodResponse.optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleStateDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), oldRuleState: z.enum(["ACTIVE", "PAUSED"]).optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleState: z.enum(["ACTIVE", "PAUSED"]).optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleTargetingDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), newRuleSegmentId: z.number().int().optional(), oldRuleSegmentId: z.number().int().optional(), oldRuleSegmentName: z.string().optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleSegmentName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleTrafficAllocationMethodDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), newRuleDeviations: z.array(activityFeatureDeviationDetailsResponse).optional(), newTrafficAllocationMethod: z.enum(["CONTEXTUAL_BANDIT", "MANUAL", "MULTI_ARMED_BANDIT"]).optional(), oldRuleDeviations: z.array(activityFeatureDeviationDetailsResponse).optional(), oldTrafficAllocationMethod: z.enum(["CONTEXTUAL_BANDIT", "MANUAL", "MULTI_ARMED_BANDIT"]).optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional()}); export const activityLogRuleVariationDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), oldRuleVariationKey: z.string().optional(), oldRuleVariationName: z.string().optional(), ruleId: z.number().int().optional(), ruleName: z.string().optional(), ruleType: z.enum(["TARGETED_DELIVERY", "PROGRESSIVE_DELIVERY", "EXPERIMENTATION"]).optional(), ruleVariationKey: z.string().optional(), ruleVariationName: z.string().optional()}); export const activityLogRuleChangeDetails = z.union([activityLogRuleAddDetailsResponse, activityLogRuleDeleteDetailsResponse, activityLogRuleDeviationDetailsResponse, activityLogRuleExpositionDetailsResponse, activityLogRuleNameDetailsResponse, activityLogRuleReshuffleDetailsResponse, activityLogRuleRolloutDetailsResponse, activityLogRuleSchedulingDetailsResponse, activityLogRuleStateDetailsResponse, activityLogRuleTargetingDetailsResponse, activityLogRuleTrafficAllocationMethodDetailsResponse, activityLogRuleVariationDetailsResponse]); export const activityLogVariableDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), defaultValue: z.string().optional(), oldDefaultValue: z.string().optional(), variableKey: z.string().optional(), variableType: z.enum(["BOOLEAN", "NUMBER", "STRING", "JSON", "JS", "CSS", "ENUM"]).optional()}); export const activityLogVariationDetailsResponse = z.object({type: z.enum(["GOAL", "RULE_ADD", "RULE_DELETE", "RULE_DEVIATION", "RULE_EXPOSITION", "RULE_NAME", "RULE_RESHUFFLE", "RULE_ROLLOUT", "RULE_SCHEDULING", "RULE_STATE", "RULE_TARGETING", "RULE_TRAFFIC_ALLOCATION", "RULE_VARIATION", "VARIABLE", "VARIATION"]), oldVariationName: z.string().optional(), updatedVariableKeys: z.array(z.string()).optional(), variationKey: z.string().optional(), variationName: z.string().optional()}); export const featureActivityLogResponse = z.object({contributorId: z.number().int().optional(), details: z.union([activityLogGoalDetailsResponse, activityLogRuleChangeDetails, activityLogVariableDetailsResponse, activityLogVariationDetailsResponse]).optional(), environmentId: z.number().int().optional(), featureId: z.number().int().optional(), impersonatorId: z.number().int().optional(), logType: z.enum(["ENV_TURN_ON", "ENV_TURN_OFF", "ENV_CHANGE_DEFAULT_KEY", "RULE_ADD", "RULE_DELETE", "RULE_CHANGE_NAME", "RULE_CHANGE_VARIATION", "RULE_CHANGE_DEVIATION", "RULE_CHANGE_EXPOSITION", "RULE_CHANGE_ROLLOUT", "RULE_CHANGE_TARGETING", "RULE_CHANGE_SCHEDULING", "RULE_CHANGE_STATE", "RULE_RESHUFFLE", "RULE_CHANGE_ROLLBACK_CONDITIONS", "RULE_CHANGE_TRAFFIC_ALLOCATION_METHOD", "VARIATION_ADD", "VARIATION_UPDATE", "VARIATION_DELETE", "VARIABLE_ADD", "VARIABLE_UPDATE", "VARIABLE_DELETE", "GOAL_ADD", "GOAL_NEW_PRIMARY", "GOAL_DELETE"]).optional(), timestamp: z.string().optional()}); export const getApiFeatureFlagsActivityLogsResponse = z.array(featureActivityLogResponse); 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 }; /** * Get feature activity logs * * GET /feature-flags/activity-logs */ export const getApiFeatureFlagsActivityLogs = async (args: GetApiFeatureFlagsActivityLogsArgs, options?: GetApiFeatureFlagsActivityLogsOptions) => { const {baseUrl = "https://api.kameleoon.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.type != null) query.append("type", String(args.type)) if (args.page != null) query.append("page", String(args.page)) if (args.perPage != null) query.append("perPage", String(args.perPage)) if (args.sortKey != null) query.append("sortKey", String(args.sortKey)) if (args.sortOrder != null) query.append("sortOrder", String(args.sortOrder)) const url = `${baseUrl.replace(/\/+$/, '')}/feature-flags/activity-logs${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(getApiFeatureFlagsActivityLogsResponse, await res.json()) };