mirror of
https://github.com/RSSNext/Folo.git
synced 2026-10-17 05:08:13 +08:00
@@ -0,0 +1,107 @@
|
||||
import "dotenv/config"
|
||||
|
||||
import { readFileSync, writeFileSync } from "node:fs"
|
||||
import path, { dirname, resolve } from "node:path"
|
||||
import { fileURLToPath } from "node:url"
|
||||
import { inspect } from "node:util"
|
||||
|
||||
import { ofetch } from "ofetch"
|
||||
|
||||
const { POSTHOG_TOKEN } = process.env
|
||||
|
||||
if (!POSTHOG_TOKEN) {
|
||||
throw new Error("POSTHOG_TOKEN is not set")
|
||||
}
|
||||
// https://posthog.com/docs/api/feature-flags#post-api-organizations-parent_lookup_organization_id-feature_flags-copy_flags
|
||||
const listRes: ListRes = await ofetch(
|
||||
`https://app.posthog.com/api/projects/${process.env.POSTHOG_PROJECT_ID}/feature_flags/?limit=9999`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: `Bearer ${POSTHOG_TOKEN}`,
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
interface ListRes {
|
||||
count: number
|
||||
next: null
|
||||
previous: null
|
||||
results: ResultsItem[]
|
||||
}
|
||||
interface ResultsItem {
|
||||
id: number
|
||||
name: string
|
||||
key: string
|
||||
filters: any[]
|
||||
deleted: boolean
|
||||
active: boolean
|
||||
created_by: any[]
|
||||
created_at: string
|
||||
is_simple_flag: boolean
|
||||
rollout_percentage: number
|
||||
ensure_experience_continuity: boolean
|
||||
experiment_set: any[]
|
||||
surveys: any[]
|
||||
features: any[]
|
||||
rollback_conditions: any[]
|
||||
performed_rollback: boolean
|
||||
can_edit: boolean
|
||||
usage_dashboard: number
|
||||
analytics_dashboards: any[]
|
||||
has_enriched_analytics: boolean
|
||||
tags: any[]
|
||||
}
|
||||
|
||||
const existFlags = {} as Record<string, boolean>
|
||||
|
||||
listRes.results.forEach((flag) => (existFlags[flag.key] = true))
|
||||
|
||||
const __dirname = resolve(dirname(fileURLToPath(import.meta.url)))
|
||||
const localFlagsString = readFileSync(path.join(__dirname, "../constants/flags.json"), "utf8")
|
||||
const localFlags = JSON.parse(localFlagsString as string) as Record<string, boolean>
|
||||
|
||||
const updateToRmoteFlags = {} as Record<string, boolean>
|
||||
|
||||
// If remote key has but local not has, add to Local
|
||||
for (const key in existFlags) {
|
||||
if (!(key in localFlags)) {
|
||||
localFlags[key] = existFlags[key]
|
||||
}
|
||||
}
|
||||
|
||||
// Write to local flags
|
||||
writeFileSync(path.join(__dirname, "../constants/flags.json"), JSON.stringify(localFlags, null, 2))
|
||||
|
||||
console.info("update local flags", inspect(localFlags))
|
||||
|
||||
// Local first
|
||||
for (const key in localFlags) {
|
||||
// existFlags[key] = localFlags[key]
|
||||
if (existFlags[key] !== localFlags[key]) {
|
||||
updateToRmoteFlags[key] = localFlags[key]
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(updateToRmoteFlags).length > 0) {
|
||||
await Promise.allSettled(
|
||||
Object.entries(updateToRmoteFlags).map(([key, flag]) => {
|
||||
return fetch(
|
||||
`https://app.posthog.com/api/projects/${process.env.POSTHOG_PROJECT_ID}/feature_flags/`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: `Bearer ${process.env.POSTHOG_PRIVATE_KEY}`,
|
||||
},
|
||||
body: JSON.stringify({
|
||||
key,
|
||||
active: flag,
|
||||
}),
|
||||
},
|
||||
)
|
||||
}),
|
||||
)
|
||||
|
||||
console.info("update flags", inspect(updateToRmoteFlags))
|
||||
}
|
||||
Reference in New Issue
Block a user