-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathsource.ts
141 lines (112 loc) · 3.52 KB
/
source.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import yargs from "https://cdn.deno.land/yargs/versions/yargs-v16.2.1-deno/raw/deno.ts";
import {
ensureDir,
ensureDirSync,
} from "https://deno.land/[email protected]/fs/mod.ts";
import { consoleLogger, delay, ldAPIRequest, writeSourceData } from "./utils.ts";
interface Arguments {
projKey: string;
apikey: string;
domain: string;
}
let inputArgs: Arguments = yargs(Deno.args)
.alias("p", "projKey")
.alias("k", "apikey")
.alias("u", "domain")
.default("u", "app.launchdarkly.com").argv;
// ensure output directory exists
const projPath = `./source/project/${inputArgs.projKey}`;
ensureDirSync(projPath);
// Project Data //
const projResp = await fetch(
ldAPIRequest(
inputArgs.apikey,
inputArgs.domain,
`projects/${inputArgs.projKey}?expand=environments`,
),
);
if (projResp == null) {
console.log("Failed getting project");
Deno.exit(1);
}
const projData = await projResp.json();
await writeSourceData(projPath, "project", projData);
// Segment Data //
if (projData.environments.items.length > 0) {
console.log(`Found ${projData.environments.items.length} environments`);
projData.environments.items.forEach(async (env: any) => {
console.log(`Getting Segments for environment: ${env.key}`);
const segmentResp = await fetch(
ldAPIRequest(
inputArgs.apikey,
inputArgs.domain,
`segments/${inputArgs.projKey}/${env.key}`,
),
);
if (segmentResp == null) {
console.log("Failed getting Segments");
Deno.exit(1);
}
const segmentData = await segmentResp.json();
await writeSourceData(projPath, `segment-${env.key}`, segmentData);
const end = Date.now() + 2_000;
while (Date.now() < end);
});
}
// Get List of all Flags
const pageSize : number = 5;
let offset: number = 0;
let moreFlags : boolean = true;
const flags : string[] = [];
let path = `flags/${inputArgs.projKey}?summary=true&limit=${pageSize}&offset=${offset}`;
while (moreFlags) {
console.log(`Building flag list: ${offset} to ${offset + pageSize}`);
const flagsResp = await fetch(
ldAPIRequest(
inputArgs.apikey,
inputArgs.domain,
path,
),
);
if (flagsResp.status > 201) {
consoleLogger(flagsResp.status, `Error getting flags: ${flagsResp.status}`);
consoleLogger(flagsResp.status, await flagsResp.text());
}
if (flagsResp == null) {
console.log("Failed getting Flags");
Deno.exit(1);
}
const flagsData = await flagsResp.json();
flags.push( ...flagsData.items.map((flag: any) => flag.key) );
if (flagsData._links.next) {
offset += pageSize;
path = `flags/${inputArgs.projKey}?summary=true&limit=${pageSize}&offset=${offset}`;
} else {
moreFlags = false;
}
}
console.log(`Found ${flags.length} flags`);
await writeSourceData(projPath, "flags", flags);
// Get Individual Flag Data //
ensureDirSync(`${projPath}/flags`);
for (const [index, flagKey] of flags.entries()) {
console.log(`Getting flag ${index + 1} of ${flags.length}: ${flagKey}`)
await delay(200);
const flagResp = await fetch(
ldAPIRequest(
inputArgs.apikey,
inputArgs.domain,
`flags/${inputArgs.projKey}/${flagKey}`,
),
);
if (flagResp.status > 201) {
consoleLogger(flagResp.status, `Error getting flag '${flagKey}': ${flagResp.status}`);
consoleLogger(flagResp.status, await flagResp.text());
}
if (flagResp == null) {
console.log("Failed getting flag '${flagKey}'");
Deno.exit(1);
}
const flagData = await flagResp.json();
await writeSourceData(`${projPath}/flags`, flagKey, flagData);
}