@rosen-bridge/utils 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/downloadRosenAssets.d.ts +13 -0
- package/dist/downloadRosenAssets.d.ts.map +1 -0
- package/dist/downloadRosenAssets.js +48 -0
- package/dist/downloadTssBinary.d.ts +13 -0
- package/dist/downloadTssBinary.d.ts.map +1 -0
- package/dist/downloadTssBinary.js +45 -0
- package/dist/error.d.ts +4 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/lib/constants.d.ts +0 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +1 -2
- package/dist/lib/downloadRosenAssets.d.ts.map +1 -1
- package/dist/lib/downloadRosenAssets.js +5 -4
- package/dist/lib/downloadTssBinary.d.ts.map +1 -1
- package/dist/lib/downloadTssBinary.js +2 -2
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +2 -1
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +1 -1
- package/dist/lib/utils/github.d.ts +123 -392
- package/dist/lib/utils/github.d.ts.map +1 -1
- package/dist/lib/utils/github.js +42 -11
- package/dist/lib/utils/rosen.d.ts +5 -0
- package/dist/lib/utils/rosen.d.ts.map +1 -1
- package/dist/lib/utils/rosen.js +6 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/github.d.ts +241 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +113 -0
- package/dist/utils/rosen.d.ts +19 -0
- package/dist/utils/rosen.d.ts.map +1 -0
- package/dist/utils/rosen.js +19 -0
- package/lib/constants.ts +0 -1
- package/lib/downloadRosenAssets.ts +5 -3
- package/lib/downloadTssBinary.ts +61 -0
- package/lib/index.ts +1 -0
- package/lib/types/index.ts +2 -0
- package/lib/utils/github.ts +60 -10
- package/lib/utils/rosen.ts +7 -0
- package/package.json +7 -12
- package/tests/data/octokit.data.ts +88 -10
- package/tests/downloadRosenAssets.spec.ts +9 -9
- package/tests/downloadTssBinary.spec.ts +153 -0
- package/tests/mocks/octokit.mock.ts +4 -4
- package/tests/utils/github.spec.ts +173 -21
- package/tests/utils/rosen.spec.ts +39 -1
- package/tsconfig.build.json +4 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +2 -2
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { GithubRelease, SupportedRepo } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Fetch a page of releases from Github Api in each iteration until there are no
|
|
4
|
+
* more releases.
|
|
5
|
+
* @param repoName
|
|
6
|
+
* @param pageSize
|
|
7
|
+
*/
|
|
8
|
+
declare function fetchReleasesPage(repoName: SupportedRepo, pageSize?: number): AsyncGenerator<{
|
|
9
|
+
url: string;
|
|
10
|
+
html_url: string;
|
|
11
|
+
assets_url: string;
|
|
12
|
+
upload_url: string;
|
|
13
|
+
tarball_url: string | null;
|
|
14
|
+
zipball_url: string | null;
|
|
15
|
+
id: number;
|
|
16
|
+
node_id: string;
|
|
17
|
+
tag_name: string;
|
|
18
|
+
target_commitish: string;
|
|
19
|
+
name: string | null;
|
|
20
|
+
body?: string | null;
|
|
21
|
+
draft: boolean;
|
|
22
|
+
prerelease: boolean;
|
|
23
|
+
created_at: string;
|
|
24
|
+
published_at: string | null;
|
|
25
|
+
author: import("@octokit/openapi-types").components["schemas"]["simple-user"];
|
|
26
|
+
assets: import("@octokit/openapi-types").components["schemas"]["release-asset"][];
|
|
27
|
+
body_html?: string;
|
|
28
|
+
body_text?: string;
|
|
29
|
+
mentions_count?: number;
|
|
30
|
+
discussion_url?: string;
|
|
31
|
+
reactions?: import("@octokit/openapi-types").components["schemas"]["reaction-rollup"];
|
|
32
|
+
}[], void, unknown>;
|
|
33
|
+
/**
|
|
34
|
+
* Find the last release matching the predicate. If all releases are iterated and
|
|
35
|
+
* no matching release is found, return null.
|
|
36
|
+
* @param repoName
|
|
37
|
+
* @param predicate
|
|
38
|
+
*/
|
|
39
|
+
declare const findLastRelease: (repoName: SupportedRepo, predicate?: (release: GithubRelease) => boolean) => Promise<{
|
|
40
|
+
url: string;
|
|
41
|
+
html_url: string;
|
|
42
|
+
assets_url: string;
|
|
43
|
+
upload_url: string;
|
|
44
|
+
tarball_url: string | null;
|
|
45
|
+
zipball_url: string | null;
|
|
46
|
+
id: number;
|
|
47
|
+
node_id: string;
|
|
48
|
+
tag_name: string;
|
|
49
|
+
target_commitish: string;
|
|
50
|
+
name: string | null;
|
|
51
|
+
body?: string | null;
|
|
52
|
+
draft: boolean;
|
|
53
|
+
prerelease: boolean;
|
|
54
|
+
created_at: string;
|
|
55
|
+
published_at: string | null;
|
|
56
|
+
author: import("@octokit/openapi-types").components["schemas"]["simple-user"];
|
|
57
|
+
assets: import("@octokit/openapi-types").components["schemas"]["release-asset"][];
|
|
58
|
+
body_html?: string;
|
|
59
|
+
body_text?: string;
|
|
60
|
+
mentions_count?: number;
|
|
61
|
+
discussion_url?: string;
|
|
62
|
+
reactions?: import("@octokit/openapi-types").components["schemas"]["reaction-rollup"];
|
|
63
|
+
} | null>;
|
|
64
|
+
/**
|
|
65
|
+
* get a GitHub release by its tag
|
|
66
|
+
* @param repoName
|
|
67
|
+
* @param tag
|
|
68
|
+
*/
|
|
69
|
+
declare const getReleaseByTag: (repoName: SupportedRepo, tag: string) => Promise<{
|
|
70
|
+
url: string;
|
|
71
|
+
html_url: string;
|
|
72
|
+
assets_url: string;
|
|
73
|
+
upload_url: string;
|
|
74
|
+
tarball_url: string | null;
|
|
75
|
+
zipball_url: string | null;
|
|
76
|
+
id: number;
|
|
77
|
+
node_id: string;
|
|
78
|
+
tag_name: string;
|
|
79
|
+
target_commitish: string;
|
|
80
|
+
name: string | null;
|
|
81
|
+
body?: string | null;
|
|
82
|
+
draft: boolean;
|
|
83
|
+
prerelease: boolean;
|
|
84
|
+
created_at: string;
|
|
85
|
+
published_at: string | null;
|
|
86
|
+
author: import("@octokit/openapi-types").components["schemas"]["simple-user"];
|
|
87
|
+
assets: import("@octokit/openapi-types").components["schemas"]["release-asset"][];
|
|
88
|
+
body_html?: string;
|
|
89
|
+
body_text?: string;
|
|
90
|
+
mentions_count?: number;
|
|
91
|
+
discussion_url?: string;
|
|
92
|
+
reactions?: import("@octokit/openapi-types").components["schemas"]["reaction-rollup"];
|
|
93
|
+
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Return a function which checks if a release has at least one asset for a
|
|
96
|
+
* specific chain type
|
|
97
|
+
* @param chainType
|
|
98
|
+
* @param release
|
|
99
|
+
*/
|
|
100
|
+
declare const hasAssetForChainType: (chainType: string) => (release: GithubRelease) => boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Return a function which checks if a release is a stable (that is, non-prerelease)
|
|
103
|
+
* and has some asset matching a specific chain type
|
|
104
|
+
* @param chainType
|
|
105
|
+
*/
|
|
106
|
+
declare const isStableReleaseForChainType: (chainType: string) => (release: GithubRelease) => boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Return a function which checks if tagPrefix is matched with release tag_name
|
|
109
|
+
* @param tagPrefix
|
|
110
|
+
*/
|
|
111
|
+
declare const hasMatchedTagPrefix: (tagPrefix: string) => (release: GithubRelease) => boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Return a function which checks if a release is a stable (that is, non-prerelease),
|
|
114
|
+
* and tagPrefix is matched with release tag_name
|
|
115
|
+
* @param tagPrefix
|
|
116
|
+
*/
|
|
117
|
+
declare const isStableReleaseForRegexTagType: (tagPrefix: string) => (release: GithubRelease) => boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Find latest release (prerelease or non-prerelease) having some asset matching
|
|
120
|
+
* a specific chain type
|
|
121
|
+
* @param repoName
|
|
122
|
+
* @param chainType
|
|
123
|
+
*/
|
|
124
|
+
declare const findLatestRelease: (repoName: SupportedRepo, chainType: string) => Promise<{
|
|
125
|
+
url: string;
|
|
126
|
+
html_url: string;
|
|
127
|
+
assets_url: string;
|
|
128
|
+
upload_url: string;
|
|
129
|
+
tarball_url: string | null;
|
|
130
|
+
zipball_url: string | null;
|
|
131
|
+
id: number;
|
|
132
|
+
node_id: string;
|
|
133
|
+
tag_name: string;
|
|
134
|
+
target_commitish: string;
|
|
135
|
+
name: string | null;
|
|
136
|
+
body?: string | null;
|
|
137
|
+
draft: boolean;
|
|
138
|
+
prerelease: boolean;
|
|
139
|
+
created_at: string;
|
|
140
|
+
published_at: string | null;
|
|
141
|
+
author: import("@octokit/openapi-types").components["schemas"]["simple-user"];
|
|
142
|
+
assets: import("@octokit/openapi-types").components["schemas"]["release-asset"][];
|
|
143
|
+
body_html?: string;
|
|
144
|
+
body_text?: string;
|
|
145
|
+
mentions_count?: number;
|
|
146
|
+
discussion_url?: string;
|
|
147
|
+
reactions?: import("@octokit/openapi-types").components["schemas"]["reaction-rollup"];
|
|
148
|
+
} | null>;
|
|
149
|
+
/**
|
|
150
|
+
* Find latest stable (that is, non-prerelease) release having some asset matching
|
|
151
|
+
* a specific chain type
|
|
152
|
+
* @param repoName
|
|
153
|
+
* @param chainType
|
|
154
|
+
*/
|
|
155
|
+
declare const findLatestStableRelease: (repoName: SupportedRepo, chainType: string) => Promise<{
|
|
156
|
+
url: string;
|
|
157
|
+
html_url: string;
|
|
158
|
+
assets_url: string;
|
|
159
|
+
upload_url: string;
|
|
160
|
+
tarball_url: string | null;
|
|
161
|
+
zipball_url: string | null;
|
|
162
|
+
id: number;
|
|
163
|
+
node_id: string;
|
|
164
|
+
tag_name: string;
|
|
165
|
+
target_commitish: string;
|
|
166
|
+
name: string | null;
|
|
167
|
+
body?: string | null;
|
|
168
|
+
draft: boolean;
|
|
169
|
+
prerelease: boolean;
|
|
170
|
+
created_at: string;
|
|
171
|
+
published_at: string | null;
|
|
172
|
+
author: import("@octokit/openapi-types").components["schemas"]["simple-user"];
|
|
173
|
+
assets: import("@octokit/openapi-types").components["schemas"]["release-asset"][];
|
|
174
|
+
body_html?: string;
|
|
175
|
+
body_text?: string;
|
|
176
|
+
mentions_count?: number;
|
|
177
|
+
discussion_url?: string;
|
|
178
|
+
reactions?: import("@octokit/openapi-types").components["schemas"]["reaction-rollup"];
|
|
179
|
+
} | null>;
|
|
180
|
+
/**
|
|
181
|
+
* Find the latest stable (that is, non-prerelease) release that tagPrefix is matched with release tag_name
|
|
182
|
+
* @param repoName
|
|
183
|
+
* @param tagPrefix
|
|
184
|
+
*/
|
|
185
|
+
declare const findLatestStableReleaseByPrefixTag: (repoName: SupportedRepo, tagPrefix: string) => Promise<{
|
|
186
|
+
url: string;
|
|
187
|
+
html_url: string;
|
|
188
|
+
assets_url: string;
|
|
189
|
+
upload_url: string;
|
|
190
|
+
tarball_url: string | null;
|
|
191
|
+
zipball_url: string | null;
|
|
192
|
+
id: number;
|
|
193
|
+
node_id: string;
|
|
194
|
+
tag_name: string;
|
|
195
|
+
target_commitish: string;
|
|
196
|
+
name: string | null;
|
|
197
|
+
body?: string | null;
|
|
198
|
+
draft: boolean;
|
|
199
|
+
prerelease: boolean;
|
|
200
|
+
created_at: string;
|
|
201
|
+
published_at: string | null;
|
|
202
|
+
author: import("@octokit/openapi-types").components["schemas"]["simple-user"];
|
|
203
|
+
assets: import("@octokit/openapi-types").components["schemas"]["release-asset"][];
|
|
204
|
+
body_html?: string;
|
|
205
|
+
body_text?: string;
|
|
206
|
+
mentions_count?: number;
|
|
207
|
+
discussion_url?: string;
|
|
208
|
+
reactions?: import("@octokit/openapi-types").components["schemas"]["reaction-rollup"];
|
|
209
|
+
} | null>;
|
|
210
|
+
/**
|
|
211
|
+
* Find the latest release that tagPrefix is matched with release tag_name
|
|
212
|
+
* @param repoName
|
|
213
|
+
* @param tagPrefix
|
|
214
|
+
*/
|
|
215
|
+
declare const findLatestReleaseByPrefixTag: (repoName: SupportedRepo, tagPrefix: string) => Promise<{
|
|
216
|
+
url: string;
|
|
217
|
+
html_url: string;
|
|
218
|
+
assets_url: string;
|
|
219
|
+
upload_url: string;
|
|
220
|
+
tarball_url: string | null;
|
|
221
|
+
zipball_url: string | null;
|
|
222
|
+
id: number;
|
|
223
|
+
node_id: string;
|
|
224
|
+
tag_name: string;
|
|
225
|
+
target_commitish: string;
|
|
226
|
+
name: string | null;
|
|
227
|
+
body?: string | null;
|
|
228
|
+
draft: boolean;
|
|
229
|
+
prerelease: boolean;
|
|
230
|
+
created_at: string;
|
|
231
|
+
published_at: string | null;
|
|
232
|
+
author: import("@octokit/openapi-types").components["schemas"]["simple-user"];
|
|
233
|
+
assets: import("@octokit/openapi-types").components["schemas"]["release-asset"][];
|
|
234
|
+
body_html?: string;
|
|
235
|
+
body_text?: string;
|
|
236
|
+
mentions_count?: number;
|
|
237
|
+
discussion_url?: string;
|
|
238
|
+
reactions?: import("@octokit/openapi-types").components["schemas"]["reaction-rollup"];
|
|
239
|
+
} | null>;
|
|
240
|
+
export { fetchReleasesPage, findLastRelease, findLatestRelease, findLatestStableRelease, findLatestStableReleaseByPrefixTag, findLatestReleaseByPrefixTag, getReleaseByTag, hasAssetForChainType, isStableReleaseForChainType, isStableReleaseForRegexTagType, hasMatchedTagPrefix, };
|
|
241
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../lib/utils/github.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD;;;;;GAKG;AACH,iBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,QAAQ,SAAsC;;;;;;;;;;;;;;;;;YAsJsor0B,sDAAsB;YAA8B,sDAAsB;;;;;gBAA0P,sDAAsB;oBAjI/gs0B;AAED;;;;;GAKG;AACH,QAAA,MAAM,eAAe,GACnB,UAAU,aAAa,EACvB,YAAW,CAAC,OAAO,EAAE,aAAa,KAAK,OAAoB;;;;;;;;;;;;;;;;;YAuHynr0B,sDAAsB;YAA8B,sDAAsB;;;;;gBAA0P,sDAAsB;SA3G/gs0B,CAAC;AAEF;;;;GAIG;AACH,QAAA,MAAM,eAAe,GAAU,UAAU,aAAa,EAAE,KAAK,MAAM;;;;;;;;;;;;;;;;;YAoGmnr0B,sDAAsB;YAA8B,sDAAsB;;;;;gBAA0P,sDAAsB;EA3F/gs0B,CAAC;AAEF;;;;;GAKG;AACH,QAAA,MAAM,oBAAoB,GAAI,WAAW,MAAM,MAAM,SAAS,aAAa,YACE,CAAC;AAE9E;;;;GAIG;AACH,QAAA,MAAM,2BAA2B,GAC9B,WAAW,MAAM,MAAM,SAAS,aAAa,YACmB,CAAC;AAEpE;;;GAGG;AACH,QAAA,MAAM,mBAAmB,GAAI,WAAW,MAAM,MAAM,SAAS,aAAa,YAGzE,CAAC;AAEF;;;;GAIG;AACH,QAAA,MAAM,8BAA8B,GACjC,WAAW,MAAM,MAAM,SAAS,aAAa,YACkB,CAAC;AAEnE;;;;;GAKG;AACH,QAAA,MAAM,iBAAiB,GAAU,UAAU,aAAa,EAAE,WAAW,MAAM;;;;;;;;;;;;;;;;;YA+C2mr0B,sDAAsB;YAA8B,sDAAsB;;;;;gBAA0P,sDAAsB;SA9Cp9r0B,CAAC;AAE7D;;;;;GAKG;AACH,QAAA,MAAM,uBAAuB,GAC3B,UAAU,aAAa,EACvB,WAAW,MAAM;;;;;;;;;;;;;;;;;YAoCmqr0B,sDAAsB;YAA8B,sDAAsB;;;;;gBAA0P,sDAAsB;SAnC18r0B,CAAC;AAEvE;;;;GAIG;AACH,QAAA,MAAM,kCAAkC,GACtC,UAAU,aAAa,EACvB,WAAW,MAAM;;;;;;;;;;;;;;;;;YA0Bmqr0B,sDAAsB;YAA8B,sDAAsB;;;;;gBAA0P,sDAAsB;SAzBv8r0B,CAAC;AAE1E;;;;GAIG;AACH,QAAA,MAAM,4BAA4B,GAChC,UAAU,aAAa,EACvB,WAAW,MAAM;;;;;;;;;;;;;;;;;YAgBmqr0B,sDAAsB;YAA8B,sDAAsB;;;;;gBAA0P,sDAAsB;SAfl9r0B,CAAC;AAE/D,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,kCAAkC,EAClC,4BAA4B,EAC5B,eAAe,EACf,oBAAoB,EACpB,2BAA2B,EAC3B,8BAA8B,EAC9B,mBAAmB,GACpB,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Octokit } from 'octokit';
|
|
2
|
+
import { isValidAssetName } from './rosen';
|
|
3
|
+
import { DEFAULT_RELEASES_FETCHING_PAGE_SIZE, ROSEN_BRIDGE_ORGANIZATION, } from '../constants';
|
|
4
|
+
/**
|
|
5
|
+
* Fetch a page of releases from Github Api in each iteration until there are no
|
|
6
|
+
* more releases.
|
|
7
|
+
* @param repoName
|
|
8
|
+
* @param pageSize
|
|
9
|
+
*/
|
|
10
|
+
async function* fetchReleasesPage(repoName, pageSize = DEFAULT_RELEASES_FETCHING_PAGE_SIZE) {
|
|
11
|
+
const octokit = new Octokit();
|
|
12
|
+
let currentPage = 1;
|
|
13
|
+
while (true) {
|
|
14
|
+
const releasesPage = await octokit.rest.repos.listReleases({
|
|
15
|
+
owner: ROSEN_BRIDGE_ORGANIZATION,
|
|
16
|
+
repo: repoName,
|
|
17
|
+
per_page: pageSize,
|
|
18
|
+
page: currentPage,
|
|
19
|
+
});
|
|
20
|
+
if (releasesPage.data.length) {
|
|
21
|
+
yield releasesPage.data;
|
|
22
|
+
currentPage += 1;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Find the last release matching the predicate. If all releases are iterated and
|
|
31
|
+
* no matching release is found, return null.
|
|
32
|
+
* @param repoName
|
|
33
|
+
* @param predicate
|
|
34
|
+
*/
|
|
35
|
+
const findLastRelease = async (repoName, predicate = () => true) => {
|
|
36
|
+
const releasesPageIterator = fetchReleasesPage(repoName);
|
|
37
|
+
for await (const releasesPage of releasesPageIterator) {
|
|
38
|
+
const foundRelease = releasesPage.find(predicate);
|
|
39
|
+
if (foundRelease) {
|
|
40
|
+
return foundRelease;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* get a GitHub release by its tag
|
|
47
|
+
* @param repoName
|
|
48
|
+
* @param tag
|
|
49
|
+
*/
|
|
50
|
+
const getReleaseByTag = async (repoName, tag) => {
|
|
51
|
+
const octokit = new Octokit();
|
|
52
|
+
const release = await octokit.rest.repos.getReleaseByTag({
|
|
53
|
+
owner: ROSEN_BRIDGE_ORGANIZATION,
|
|
54
|
+
repo: repoName,
|
|
55
|
+
tag,
|
|
56
|
+
});
|
|
57
|
+
return release.data;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Return a function which checks if a release has at least one asset for a
|
|
61
|
+
* specific chain type
|
|
62
|
+
* @param chainType
|
|
63
|
+
* @param release
|
|
64
|
+
*/
|
|
65
|
+
const hasAssetForChainType = (chainType) => (release) => release.assets.map((asset) => asset.name).some(isValidAssetName(chainType));
|
|
66
|
+
/**
|
|
67
|
+
* Return a function which checks if a release is a stable (that is, non-prerelease)
|
|
68
|
+
* and has some asset matching a specific chain type
|
|
69
|
+
* @param chainType
|
|
70
|
+
*/
|
|
71
|
+
const isStableReleaseForChainType = (chainType) => (release) => !release.prerelease && hasAssetForChainType(chainType)(release);
|
|
72
|
+
/**
|
|
73
|
+
* Return a function which checks if tagPrefix is matched with release tag_name
|
|
74
|
+
* @param tagPrefix
|
|
75
|
+
*/
|
|
76
|
+
const hasMatchedTagPrefix = (tagPrefix) => (release) => {
|
|
77
|
+
const regex = new RegExp(`^${tagPrefix}`);
|
|
78
|
+
return regex.test(release.tag_name);
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Return a function which checks if a release is a stable (that is, non-prerelease),
|
|
82
|
+
* and tagPrefix is matched with release tag_name
|
|
83
|
+
* @param tagPrefix
|
|
84
|
+
*/
|
|
85
|
+
const isStableReleaseForRegexTagType = (tagPrefix) => (release) => !release.prerelease && hasMatchedTagPrefix(tagPrefix)(release);
|
|
86
|
+
/**
|
|
87
|
+
* Find latest release (prerelease or non-prerelease) having some asset matching
|
|
88
|
+
* a specific chain type
|
|
89
|
+
* @param repoName
|
|
90
|
+
* @param chainType
|
|
91
|
+
*/
|
|
92
|
+
const findLatestRelease = async (repoName, chainType) => findLastRelease(repoName, hasAssetForChainType(chainType));
|
|
93
|
+
/**
|
|
94
|
+
* Find latest stable (that is, non-prerelease) release having some asset matching
|
|
95
|
+
* a specific chain type
|
|
96
|
+
* @param repoName
|
|
97
|
+
* @param chainType
|
|
98
|
+
*/
|
|
99
|
+
const findLatestStableRelease = async (repoName, chainType) => findLastRelease(repoName, isStableReleaseForChainType(chainType));
|
|
100
|
+
/**
|
|
101
|
+
* Find the latest stable (that is, non-prerelease) release that tagPrefix is matched with release tag_name
|
|
102
|
+
* @param repoName
|
|
103
|
+
* @param tagPrefix
|
|
104
|
+
*/
|
|
105
|
+
const findLatestStableReleaseByPrefixTag = async (repoName, tagPrefix) => findLastRelease(repoName, isStableReleaseForRegexTagType(tagPrefix));
|
|
106
|
+
/**
|
|
107
|
+
* Find the latest release that tagPrefix is matched with release tag_name
|
|
108
|
+
* @param repoName
|
|
109
|
+
* @param tagPrefix
|
|
110
|
+
*/
|
|
111
|
+
const findLatestReleaseByPrefixTag = async (repoName, tagPrefix) => findLastRelease(repoName, hasMatchedTagPrefix(tagPrefix));
|
|
112
|
+
export { fetchReleasesPage, findLastRelease, findLatestRelease, findLatestStableRelease, findLatestStableReleaseByPrefixTag, findLatestReleaseByPrefixTag, getReleaseByTag, hasAssetForChainType, isStableReleaseForChainType, isStableReleaseForRegexTagType, hasMatchedTagPrefix, };
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzL2dpdGh1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsbUNBQW1DLEVBQ25DLHlCQUF5QixHQUMxQixNQUFNLGNBQWMsQ0FBQztBQUl0Qjs7Ozs7R0FLRztBQUNILEtBQUssU0FBUyxDQUFDLENBQUMsaUJBQWlCLENBQy9CLFFBQXVCLEVBQ3ZCLFFBQVEsR0FBRyxtQ0FBbUM7SUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUU5QixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFFcEIsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ3pELEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUUsUUFBUTtZQUNsQixJQUFJLEVBQUUsV0FBVztTQUNsQixDQUFDLENBQUM7UUFFSCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3hCLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQzNCLFFBQXVCLEVBQ3ZCLFlBQWlELEdBQUcsRUFBRSxDQUFDLElBQUksRUFDM0QsRUFBRTtJQUNGLE1BQU0sb0JBQW9CLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFekQsSUFBSSxLQUFLLEVBQUUsTUFBTSxZQUFZLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQUUsUUFBdUIsRUFBRSxHQUFXLEVBQUUsRUFBRTtJQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQ3ZELEtBQUssRUFBRSx5QkFBeUI7UUFDaEMsSUFBSSxFQUFFLFFBQVE7UUFDZCxHQUFHO0tBQ0osQ0FBQyxDQUFDO0lBRUgsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBc0IsRUFBRSxFQUFFLENBQzdFLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFOUU7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQy9CLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFzQixFQUFFLEVBQUUsQ0FDaEQsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXBFOzs7R0FHRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQXNCLEVBQUUsRUFBRTtJQUM1RSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSw4QkFBOEIsR0FDbEMsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQXNCLEVBQUUsRUFBRSxDQUNoRCxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFbkU7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFBRSxRQUF1QixFQUFFLFNBQWlCLEVBQUUsRUFBRSxDQUM3RSxlQUFlLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFN0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFDbkMsUUFBdUIsRUFDdkIsU0FBaUIsRUFDakIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUV2RTs7OztHQUlHO0FBQ0gsTUFBTSxrQ0FBa0MsR0FBRyxLQUFLLEVBQzlDLFFBQXVCLEVBQ3ZCLFNBQWlCLEVBQ2pCLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFMUU7Ozs7R0FJRztBQUNILE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxFQUN4QyxRQUF1QixFQUN2QixTQUFpQixFQUNqQixFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBRS9ELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsa0NBQWtDLEVBQ2xDLDRCQUE0QixFQUM1QixlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUMzQiw4QkFBOEIsRUFDOUIsbUJBQW1CLEdBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnb2N0b2tpdCc7XG5cbmltcG9ydCB7IGlzVmFsaWRBc3NldE5hbWUgfSBmcm9tICcuL3Jvc2VuJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9SRUxFQVNFU19GRVRDSElOR19QQUdFX1NJWkUsXG4gIFJPU0VOX0JSSURHRV9PUkdBTklaQVRJT04sXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7IEdpdGh1YlJlbGVhc2UsIFN1cHBvcnRlZFJlcG8gfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogRmV0Y2ggYSBwYWdlIG9mIHJlbGVhc2VzIGZyb20gR2l0aHViIEFwaSBpbiBlYWNoIGl0ZXJhdGlvbiB1bnRpbCB0aGVyZSBhcmUgbm9cbiAqIG1vcmUgcmVsZWFzZXMuXG4gKiBAcGFyYW0gcmVwb05hbWVcbiAqIEBwYXJhbSBwYWdlU2l6ZVxuICovXG5hc3luYyBmdW5jdGlvbiogZmV0Y2hSZWxlYXNlc1BhZ2UoXG4gIHJlcG9OYW1lOiBTdXBwb3J0ZWRSZXBvLFxuICBwYWdlU2l6ZSA9IERFRkFVTFRfUkVMRUFTRVNfRkVUQ0hJTkdfUEFHRV9TSVpFXG4pIHtcbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KCk7XG5cbiAgbGV0IGN1cnJlbnRQYWdlID0gMTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHJlbGVhc2VzUGFnZSA9IGF3YWl0IG9jdG9raXQucmVzdC5yZXBvcy5saXN0UmVsZWFzZXMoe1xuICAgICAgb3duZXI6IFJPU0VOX0JSSURHRV9PUkdBTklaQVRJT04sXG4gICAgICByZXBvOiByZXBvTmFtZSxcbiAgICAgIHBlcl9wYWdlOiBwYWdlU2l6ZSxcbiAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlbGVhc2VzUGFnZS5kYXRhLmxlbmd0aCkge1xuICAgICAgeWllbGQgcmVsZWFzZXNQYWdlLmRhdGE7XG4gICAgICBjdXJyZW50UGFnZSArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluZCB0aGUgbGFzdCByZWxlYXNlIG1hdGNoaW5nIHRoZSBwcmVkaWNhdGUuIElmIGFsbCByZWxlYXNlcyBhcmUgaXRlcmF0ZWQgYW5kXG4gKiBubyBtYXRjaGluZyByZWxlYXNlIGlzIGZvdW5kLCByZXR1cm4gbnVsbC5cbiAqIEBwYXJhbSByZXBvTmFtZVxuICogQHBhcmFtIHByZWRpY2F0ZVxuICovXG5jb25zdCBmaW5kTGFzdFJlbGVhc2UgPSBhc3luYyAoXG4gIHJlcG9OYW1lOiBTdXBwb3J0ZWRSZXBvLFxuICBwcmVkaWNhdGU6IChyZWxlYXNlOiBHaXRodWJSZWxlYXNlKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZVxuKSA9PiB7XG4gIGNvbnN0IHJlbGVhc2VzUGFnZUl0ZXJhdG9yID0gZmV0Y2hSZWxlYXNlc1BhZ2UocmVwb05hbWUpO1xuXG4gIGZvciBhd2FpdCAoY29uc3QgcmVsZWFzZXNQYWdlIG9mIHJlbGVhc2VzUGFnZUl0ZXJhdG9yKSB7XG4gICAgY29uc3QgZm91bmRSZWxlYXNlID0gcmVsZWFzZXNQYWdlLmZpbmQocHJlZGljYXRlKTtcblxuICAgIGlmIChmb3VuZFJlbGVhc2UpIHtcbiAgICAgIHJldHVybiBmb3VuZFJlbGVhc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBnZXQgYSBHaXRIdWIgcmVsZWFzZSBieSBpdHMgdGFnXG4gKiBAcGFyYW0gcmVwb05hbWVcbiAqIEBwYXJhbSB0YWdcbiAqL1xuY29uc3QgZ2V0UmVsZWFzZUJ5VGFnID0gYXN5bmMgKHJlcG9OYW1lOiBTdXBwb3J0ZWRSZXBvLCB0YWc6IHN0cmluZykgPT4ge1xuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoKTtcbiAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IG9jdG9raXQucmVzdC5yZXBvcy5nZXRSZWxlYXNlQnlUYWcoe1xuICAgIG93bmVyOiBST1NFTl9CUklER0VfT1JHQU5JWkFUSU9OLFxuICAgIHJlcG86IHJlcG9OYW1lLFxuICAgIHRhZyxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlbGVhc2UuZGF0YTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGlmIGEgcmVsZWFzZSBoYXMgYXQgbGVhc3Qgb25lIGFzc2V0IGZvciBhXG4gKiBzcGVjaWZpYyBjaGFpbiB0eXBlXG4gKiBAcGFyYW0gY2hhaW5UeXBlXG4gKiBAcGFyYW0gcmVsZWFzZVxuICovXG5jb25zdCBoYXNBc3NldEZvckNoYWluVHlwZSA9IChjaGFpblR5cGU6IHN0cmluZykgPT4gKHJlbGVhc2U6IEdpdGh1YlJlbGVhc2UpID0+XG4gIHJlbGVhc2UuYXNzZXRzLm1hcCgoYXNzZXQpID0+IGFzc2V0Lm5hbWUpLnNvbWUoaXNWYWxpZEFzc2V0TmFtZShjaGFpblR5cGUpKTtcblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCBjaGVja3MgaWYgYSByZWxlYXNlIGlzIGEgc3RhYmxlICh0aGF0IGlzLCBub24tcHJlcmVsZWFzZSlcbiAqIGFuZCBoYXMgc29tZSBhc3NldCBtYXRjaGluZyBhIHNwZWNpZmljIGNoYWluIHR5cGVcbiAqIEBwYXJhbSBjaGFpblR5cGVcbiAqL1xuY29uc3QgaXNTdGFibGVSZWxlYXNlRm9yQ2hhaW5UeXBlID1cbiAgKGNoYWluVHlwZTogc3RyaW5nKSA9PiAocmVsZWFzZTogR2l0aHViUmVsZWFzZSkgPT5cbiAgICAhcmVsZWFzZS5wcmVyZWxlYXNlICYmIGhhc0Fzc2V0Rm9yQ2hhaW5UeXBlKGNoYWluVHlwZSkocmVsZWFzZSk7XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGlmIHRhZ1ByZWZpeCBpcyBtYXRjaGVkIHdpdGggcmVsZWFzZSB0YWdfbmFtZVxuICogQHBhcmFtIHRhZ1ByZWZpeFxuICovXG5jb25zdCBoYXNNYXRjaGVkVGFnUHJlZml4ID0gKHRhZ1ByZWZpeDogc3RyaW5nKSA9PiAocmVsZWFzZTogR2l0aHViUmVsZWFzZSkgPT4ge1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3RhZ1ByZWZpeH1gKTtcbiAgcmV0dXJuIHJlZ2V4LnRlc3QocmVsZWFzZS50YWdfbmFtZSk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIGNoZWNrcyBpZiBhIHJlbGVhc2UgaXMgYSBzdGFibGUgKHRoYXQgaXMsIG5vbi1wcmVyZWxlYXNlKSxcbiAqIGFuZCB0YWdQcmVmaXggaXMgbWF0Y2hlZCB3aXRoIHJlbGVhc2UgdGFnX25hbWVcbiAqIEBwYXJhbSB0YWdQcmVmaXhcbiAqL1xuY29uc3QgaXNTdGFibGVSZWxlYXNlRm9yUmVnZXhUYWdUeXBlID1cbiAgKHRhZ1ByZWZpeDogc3RyaW5nKSA9PiAocmVsZWFzZTogR2l0aHViUmVsZWFzZSkgPT5cbiAgICAhcmVsZWFzZS5wcmVyZWxlYXNlICYmIGhhc01hdGNoZWRUYWdQcmVmaXgodGFnUHJlZml4KShyZWxlYXNlKTtcblxuLyoqXG4gKiBGaW5kIGxhdGVzdCByZWxlYXNlIChwcmVyZWxlYXNlIG9yIG5vbi1wcmVyZWxlYXNlKSBoYXZpbmcgc29tZSBhc3NldCBtYXRjaGluZ1xuICogYSBzcGVjaWZpYyBjaGFpbiB0eXBlXG4gKiBAcGFyYW0gcmVwb05hbWVcbiAqIEBwYXJhbSBjaGFpblR5cGVcbiAqL1xuY29uc3QgZmluZExhdGVzdFJlbGVhc2UgPSBhc3luYyAocmVwb05hbWU6IFN1cHBvcnRlZFJlcG8sIGNoYWluVHlwZTogc3RyaW5nKSA9PlxuICBmaW5kTGFzdFJlbGVhc2UocmVwb05hbWUsIGhhc0Fzc2V0Rm9yQ2hhaW5UeXBlKGNoYWluVHlwZSkpO1xuXG4vKipcbiAqIEZpbmQgbGF0ZXN0IHN0YWJsZSAodGhhdCBpcywgbm9uLXByZXJlbGVhc2UpIHJlbGVhc2UgaGF2aW5nIHNvbWUgYXNzZXQgbWF0Y2hpbmdcbiAqIGEgc3BlY2lmaWMgY2hhaW4gdHlwZVxuICogQHBhcmFtIHJlcG9OYW1lXG4gKiBAcGFyYW0gY2hhaW5UeXBlXG4gKi9cbmNvbnN0IGZpbmRMYXRlc3RTdGFibGVSZWxlYXNlID0gYXN5bmMgKFxuICByZXBvTmFtZTogU3VwcG9ydGVkUmVwbyxcbiAgY2hhaW5UeXBlOiBzdHJpbmdcbikgPT4gZmluZExhc3RSZWxlYXNlKHJlcG9OYW1lLCBpc1N0YWJsZVJlbGVhc2VGb3JDaGFpblR5cGUoY2hhaW5UeXBlKSk7XG5cbi8qKlxuICogRmluZCB0aGUgbGF0ZXN0IHN0YWJsZSAodGhhdCBpcywgbm9uLXByZXJlbGVhc2UpIHJlbGVhc2UgdGhhdCB0YWdQcmVmaXggaXMgbWF0Y2hlZCB3aXRoIHJlbGVhc2UgdGFnX25hbWVcbiAqIEBwYXJhbSByZXBvTmFtZVxuICogQHBhcmFtIHRhZ1ByZWZpeFxuICovXG5jb25zdCBmaW5kTGF0ZXN0U3RhYmxlUmVsZWFzZUJ5UHJlZml4VGFnID0gYXN5bmMgKFxuICByZXBvTmFtZTogU3VwcG9ydGVkUmVwbyxcbiAgdGFnUHJlZml4OiBzdHJpbmdcbikgPT4gZmluZExhc3RSZWxlYXNlKHJlcG9OYW1lLCBpc1N0YWJsZVJlbGVhc2VGb3JSZWdleFRhZ1R5cGUodGFnUHJlZml4KSk7XG5cbi8qKlxuICogRmluZCB0aGUgbGF0ZXN0IHJlbGVhc2UgdGhhdCB0YWdQcmVmaXggaXMgbWF0Y2hlZCB3aXRoIHJlbGVhc2UgdGFnX25hbWVcbiAqIEBwYXJhbSByZXBvTmFtZVxuICogQHBhcmFtIHRhZ1ByZWZpeFxuICovXG5jb25zdCBmaW5kTGF0ZXN0UmVsZWFzZUJ5UHJlZml4VGFnID0gYXN5bmMgKFxuICByZXBvTmFtZTogU3VwcG9ydGVkUmVwbyxcbiAgdGFnUHJlZml4OiBzdHJpbmdcbikgPT4gZmluZExhc3RSZWxlYXNlKHJlcG9OYW1lLCBoYXNNYXRjaGVkVGFnUHJlZml4KHRhZ1ByZWZpeCkpO1xuXG5leHBvcnQge1xuICBmZXRjaFJlbGVhc2VzUGFnZSxcbiAgZmluZExhc3RSZWxlYXNlLFxuICBmaW5kTGF0ZXN0UmVsZWFzZSxcbiAgZmluZExhdGVzdFN0YWJsZVJlbGVhc2UsXG4gIGZpbmRMYXRlc3RTdGFibGVSZWxlYXNlQnlQcmVmaXhUYWcsXG4gIGZpbmRMYXRlc3RSZWxlYXNlQnlQcmVmaXhUYWcsXG4gIGdldFJlbGVhc2VCeVRhZyxcbiAgaGFzQXNzZXRGb3JDaGFpblR5cGUsXG4gIGlzU3RhYmxlUmVsZWFzZUZvckNoYWluVHlwZSxcbiAgaXNTdGFibGVSZWxlYXNlRm9yUmVnZXhUYWdUeXBlLFxuICBoYXNNYXRjaGVkVGFnUHJlZml4LFxufTtcbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if an asset name is a valid Rosen asset name and matches a specific
|
|
3
|
+
* chain type
|
|
4
|
+
* @param chainType
|
|
5
|
+
*/
|
|
6
|
+
export declare const isValidAssetName: (chainType: string) => (assetName: string) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Check if an OS name is a valid supported tss OS
|
|
9
|
+
* @param OSName
|
|
10
|
+
*/
|
|
11
|
+
export declare const isValidOS: (OSName: string) => (releaseAssetName: string) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Remove chain type and tag from the asset name and optionally replaces them
|
|
14
|
+
* with a suffix
|
|
15
|
+
* @param assetName
|
|
16
|
+
* @param alternativeSuffix a suffix which will be added before `.json` (if provided)
|
|
17
|
+
*/
|
|
18
|
+
export declare const truncateAssetName: (assetName: string, alternativeSuffix?: string) => string;
|
|
19
|
+
//# sourceMappingURL=rosen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rosen.d.ts","sourceRoot":"","sources":["../../lib/utils/rosen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,MAAM,WAAW,MAAM,YACI,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,MAAM,kBAAkB,MAAM,YACJ,CAAC;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,EACjB,oBAAoB,MAAM,WAKzB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if an asset name is a valid Rosen asset name and matches a specific
|
|
3
|
+
* chain type
|
|
4
|
+
* @param chainType
|
|
5
|
+
*/
|
|
6
|
+
export const isValidAssetName = (chainType) => (assetName) => new RegExp(`(contracts-.+|tokensMap)-${chainType}-.+.json`).test(assetName);
|
|
7
|
+
/**
|
|
8
|
+
* Check if an OS name is a valid supported tss OS
|
|
9
|
+
* @param OSName
|
|
10
|
+
*/
|
|
11
|
+
export const isValidOS = (OSName) => (releaseAssetName) => new RegExp(`(rosenTss-${OSName}-.+).zip`).test(releaseAssetName);
|
|
12
|
+
/**
|
|
13
|
+
* Remove chain type and tag from the asset name and optionally replaces them
|
|
14
|
+
* with a suffix
|
|
15
|
+
* @param assetName
|
|
16
|
+
* @param alternativeSuffix a suffix which will be added before `.json` (if provided)
|
|
17
|
+
*/
|
|
18
|
+
export const truncateAssetName = (assetName, alternativeSuffix) => assetName.replace(/(contracts-.+?|tokensMap)-.+.json/, alternativeSuffix ? `$1-${alternativeSuffix}.json` : '$1.json');
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMvcm9zZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDM0UsSUFBSSxNQUFNLENBQUMsNEJBQTRCLFNBQVMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRTlFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFLENBQ3hFLElBQUksTUFBTSxDQUFDLGFBQWEsTUFBTSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUVuRTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLFNBQWlCLEVBQ2pCLGlCQUEwQixFQUMxQixFQUFFLENBQ0YsU0FBUyxDQUFDLE9BQU8sQ0FDZixtQ0FBbUMsRUFDbkMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE1BQU0saUJBQWlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVjayBpZiBhbiBhc3NldCBuYW1lIGlzIGEgdmFsaWQgUm9zZW4gYXNzZXQgbmFtZSBhbmQgbWF0Y2hlcyBhIHNwZWNpZmljXG4gKiBjaGFpbiB0eXBlXG4gKiBAcGFyYW0gY2hhaW5UeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbGlkQXNzZXROYW1lID0gKGNoYWluVHlwZTogc3RyaW5nKSA9PiAoYXNzZXROYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBSZWdFeHAoYChjb250cmFjdHMtLit8dG9rZW5zTWFwKS0ke2NoYWluVHlwZX0tLisuanNvbmApLnRlc3QoYXNzZXROYW1lKTtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBPUyBuYW1lIGlzIGEgdmFsaWQgc3VwcG9ydGVkIHRzcyBPU1xuICogQHBhcmFtIE9TTmFtZVxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZE9TID0gKE9TTmFtZTogc3RyaW5nKSA9PiAocmVsZWFzZUFzc2V0TmFtZTogc3RyaW5nKSA9PlxuICBuZXcgUmVnRXhwKGAocm9zZW5Uc3MtJHtPU05hbWV9LS4rKS56aXBgKS50ZXN0KHJlbGVhc2VBc3NldE5hbWUpO1xuXG4vKipcbiAqIFJlbW92ZSBjaGFpbiB0eXBlIGFuZCB0YWcgZnJvbSB0aGUgYXNzZXQgbmFtZSBhbmQgb3B0aW9uYWxseSByZXBsYWNlcyB0aGVtXG4gKiB3aXRoIGEgc3VmZml4XG4gKiBAcGFyYW0gYXNzZXROYW1lXG4gKiBAcGFyYW0gYWx0ZXJuYXRpdmVTdWZmaXggYSBzdWZmaXggd2hpY2ggd2lsbCBiZSBhZGRlZCBiZWZvcmUgYC5qc29uYCAoaWYgcHJvdmlkZWQpXG4gKi9cbmV4cG9ydCBjb25zdCB0cnVuY2F0ZUFzc2V0TmFtZSA9IChcbiAgYXNzZXROYW1lOiBzdHJpbmcsXG4gIGFsdGVybmF0aXZlU3VmZml4Pzogc3RyaW5nXG4pID0+XG4gIGFzc2V0TmFtZS5yZXBsYWNlKFxuICAgIC8oY29udHJhY3RzLS4rP3x0b2tlbnNNYXApLS4rLmpzb24vLFxuICAgIGFsdGVybmF0aXZlU3VmZml4ID8gYCQxLSR7YWx0ZXJuYXRpdmVTdWZmaXh9Lmpzb25gIDogJyQxLmpzb24nXG4gICk7XG4iXX0=
|
package/lib/constants.ts
CHANGED
|
@@ -9,6 +9,8 @@ import { isValidAssetName, truncateAssetName } from './utils/rosen';
|
|
|
9
9
|
|
|
10
10
|
import { RosenAssetsDownloadError } from './error';
|
|
11
11
|
|
|
12
|
+
const repo = 'contract';
|
|
13
|
+
|
|
12
14
|
/**
|
|
13
15
|
* Download all required Rosen assets (tokenMap and all chain address files) to a specific path
|
|
14
16
|
* @param chainType chain type (e.g. mainnet, testnet, etc.)
|
|
@@ -25,9 +27,9 @@ const downloadRosenAssets = async (
|
|
|
25
27
|
}
|
|
26
28
|
) => {
|
|
27
29
|
const getRelease = () => {
|
|
28
|
-
if (config?.tag) return getReleaseByTag(config.tag);
|
|
29
|
-
if (config?.includePrereleases) return findLatestRelease(chainType);
|
|
30
|
-
return findLatestStableRelease(chainType);
|
|
30
|
+
if (config?.tag) return getReleaseByTag(repo, config.tag);
|
|
31
|
+
if (config?.includePrereleases) return findLatestRelease(repo, chainType);
|
|
32
|
+
return findLatestStableRelease(repo, chainType);
|
|
31
33
|
};
|
|
32
34
|
try {
|
|
33
35
|
const release = await getRelease();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import download from 'download';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
findLatestReleaseByPrefixTag,
|
|
5
|
+
findLatestStableReleaseByPrefixTag,
|
|
6
|
+
getReleaseByTag,
|
|
7
|
+
} from './utils/github';
|
|
8
|
+
import { isValidOS } from './utils/rosen';
|
|
9
|
+
|
|
10
|
+
import { RosenAssetsDownloadError } from './error';
|
|
11
|
+
|
|
12
|
+
const repo = 'sign-protocols';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Download release asset by tag to a specific path
|
|
16
|
+
* @param destinationPath where writes files
|
|
17
|
+
* @param config configs for including prereleases, set osName, getting specific release by tag or by regex tag
|
|
18
|
+
*/
|
|
19
|
+
const downloadTssBinary = async (
|
|
20
|
+
destinationPath: string,
|
|
21
|
+
config: {
|
|
22
|
+
osName: string;
|
|
23
|
+
tag: string;
|
|
24
|
+
regex: boolean;
|
|
25
|
+
includePrereleases?: boolean;
|
|
26
|
+
}
|
|
27
|
+
) => {
|
|
28
|
+
const getRelease = () => {
|
|
29
|
+
if (config.regex) {
|
|
30
|
+
if (config?.includePrereleases)
|
|
31
|
+
return findLatestReleaseByPrefixTag(repo, config.tag);
|
|
32
|
+
else return findLatestStableReleaseByPrefixTag(repo, config.tag);
|
|
33
|
+
} else return getReleaseByTag(repo, config.tag);
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
const release = await getRelease();
|
|
37
|
+
|
|
38
|
+
if (release) {
|
|
39
|
+
await Promise.all([
|
|
40
|
+
...(release &&
|
|
41
|
+
release.assets
|
|
42
|
+
.filter((asset) => isValidOS(config.osName)(asset.name))
|
|
43
|
+
.map(async (asset) =>
|
|
44
|
+
download(asset.browser_download_url, destinationPath)
|
|
45
|
+
)),
|
|
46
|
+
]);
|
|
47
|
+
} else {
|
|
48
|
+
console.error(`No release found for [${config.osName}] OS name.`);
|
|
49
|
+
}
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error(
|
|
52
|
+
`An error occurred while trying to download release assets: ${error}`
|
|
53
|
+
);
|
|
54
|
+
if (error instanceof Error) {
|
|
55
|
+
console.error(error.stack);
|
|
56
|
+
}
|
|
57
|
+
throw new RosenAssetsDownloadError('', { cause: error });
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { downloadTssBinary };
|
package/lib/index.ts
CHANGED
package/lib/types/index.ts
CHANGED
package/lib/utils/github.ts
CHANGED
|
@@ -3,19 +3,20 @@ import { Octokit } from 'octokit';
|
|
|
3
3
|
import { isValidAssetName } from './rosen';
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
CONTRACT_REPO_NAME,
|
|
7
6
|
DEFAULT_RELEASES_FETCHING_PAGE_SIZE,
|
|
8
7
|
ROSEN_BRIDGE_ORGANIZATION,
|
|
9
8
|
} from '../constants';
|
|
10
9
|
|
|
11
|
-
import { GithubRelease } from '../types';
|
|
10
|
+
import { GithubRelease, SupportedRepo } from '../types';
|
|
12
11
|
|
|
13
12
|
/**
|
|
14
13
|
* Fetch a page of releases from Github Api in each iteration until there are no
|
|
15
14
|
* more releases.
|
|
15
|
+
* @param repoName
|
|
16
16
|
* @param pageSize
|
|
17
17
|
*/
|
|
18
18
|
async function* fetchReleasesPage(
|
|
19
|
+
repoName: SupportedRepo,
|
|
19
20
|
pageSize = DEFAULT_RELEASES_FETCHING_PAGE_SIZE
|
|
20
21
|
) {
|
|
21
22
|
const octokit = new Octokit();
|
|
@@ -25,7 +26,7 @@ async function* fetchReleasesPage(
|
|
|
25
26
|
while (true) {
|
|
26
27
|
const releasesPage = await octokit.rest.repos.listReleases({
|
|
27
28
|
owner: ROSEN_BRIDGE_ORGANIZATION,
|
|
28
|
-
repo:
|
|
29
|
+
repo: repoName,
|
|
29
30
|
per_page: pageSize,
|
|
30
31
|
page: currentPage,
|
|
31
32
|
});
|
|
@@ -42,12 +43,14 @@ async function* fetchReleasesPage(
|
|
|
42
43
|
/**
|
|
43
44
|
* Find the last release matching the predicate. If all releases are iterated and
|
|
44
45
|
* no matching release is found, return null.
|
|
46
|
+
* @param repoName
|
|
45
47
|
* @param predicate
|
|
46
48
|
*/
|
|
47
49
|
const findLastRelease = async (
|
|
50
|
+
repoName: SupportedRepo,
|
|
48
51
|
predicate: (release: GithubRelease) => boolean = () => true
|
|
49
52
|
) => {
|
|
50
|
-
const releasesPageIterator = fetchReleasesPage();
|
|
53
|
+
const releasesPageIterator = fetchReleasesPage(repoName);
|
|
51
54
|
|
|
52
55
|
for await (const releasesPage of releasesPageIterator) {
|
|
53
56
|
const foundRelease = releasesPage.find(predicate);
|
|
@@ -61,13 +64,14 @@ const findLastRelease = async (
|
|
|
61
64
|
|
|
62
65
|
/**
|
|
63
66
|
* get a GitHub release by its tag
|
|
67
|
+
* @param repoName
|
|
64
68
|
* @param tag
|
|
65
69
|
*/
|
|
66
|
-
const getReleaseByTag = async (tag: string) => {
|
|
70
|
+
const getReleaseByTag = async (repoName: SupportedRepo, tag: string) => {
|
|
67
71
|
const octokit = new Octokit();
|
|
68
72
|
const release = await octokit.rest.repos.getReleaseByTag({
|
|
69
73
|
owner: ROSEN_BRIDGE_ORGANIZATION,
|
|
70
|
-
repo:
|
|
74
|
+
repo: repoName,
|
|
71
75
|
tag,
|
|
72
76
|
});
|
|
73
77
|
|
|
@@ -92,28 +96,74 @@ const isStableReleaseForChainType =
|
|
|
92
96
|
(chainType: string) => (release: GithubRelease) =>
|
|
93
97
|
!release.prerelease && hasAssetForChainType(chainType)(release);
|
|
94
98
|
|
|
99
|
+
/**
|
|
100
|
+
* Return a function which checks if tagPrefix is matched with release tag_name
|
|
101
|
+
* @param tagPrefix
|
|
102
|
+
*/
|
|
103
|
+
const hasMatchedTagPrefix = (tagPrefix: string) => (release: GithubRelease) => {
|
|
104
|
+
const regex = new RegExp(`^${tagPrefix}`);
|
|
105
|
+
return regex.test(release.tag_name);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Return a function which checks if a release is a stable (that is, non-prerelease),
|
|
110
|
+
* and tagPrefix is matched with release tag_name
|
|
111
|
+
* @param tagPrefix
|
|
112
|
+
*/
|
|
113
|
+
const isStableReleaseForRegexTagType =
|
|
114
|
+
(tagPrefix: string) => (release: GithubRelease) =>
|
|
115
|
+
!release.prerelease && hasMatchedTagPrefix(tagPrefix)(release);
|
|
116
|
+
|
|
95
117
|
/**
|
|
96
118
|
* Find latest release (prerelease or non-prerelease) having some asset matching
|
|
97
119
|
* a specific chain type
|
|
120
|
+
* @param repoName
|
|
98
121
|
* @param chainType
|
|
99
122
|
*/
|
|
100
|
-
const findLatestRelease = async (chainType: string) =>
|
|
101
|
-
findLastRelease(hasAssetForChainType(chainType));
|
|
123
|
+
const findLatestRelease = async (repoName: SupportedRepo, chainType: string) =>
|
|
124
|
+
findLastRelease(repoName, hasAssetForChainType(chainType));
|
|
102
125
|
|
|
103
126
|
/**
|
|
104
127
|
* Find latest stable (that is, non-prerelease) release having some asset matching
|
|
105
128
|
* a specific chain type
|
|
129
|
+
* @param repoName
|
|
106
130
|
* @param chainType
|
|
107
131
|
*/
|
|
108
|
-
const findLatestStableRelease = async (
|
|
109
|
-
|
|
132
|
+
const findLatestStableRelease = async (
|
|
133
|
+
repoName: SupportedRepo,
|
|
134
|
+
chainType: string
|
|
135
|
+
) => findLastRelease(repoName, isStableReleaseForChainType(chainType));
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Find the latest stable (that is, non-prerelease) release that tagPrefix is matched with release tag_name
|
|
139
|
+
* @param repoName
|
|
140
|
+
* @param tagPrefix
|
|
141
|
+
*/
|
|
142
|
+
const findLatestStableReleaseByPrefixTag = async (
|
|
143
|
+
repoName: SupportedRepo,
|
|
144
|
+
tagPrefix: string
|
|
145
|
+
) => findLastRelease(repoName, isStableReleaseForRegexTagType(tagPrefix));
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Find the latest release that tagPrefix is matched with release tag_name
|
|
149
|
+
* @param repoName
|
|
150
|
+
* @param tagPrefix
|
|
151
|
+
*/
|
|
152
|
+
const findLatestReleaseByPrefixTag = async (
|
|
153
|
+
repoName: SupportedRepo,
|
|
154
|
+
tagPrefix: string
|
|
155
|
+
) => findLastRelease(repoName, hasMatchedTagPrefix(tagPrefix));
|
|
110
156
|
|
|
111
157
|
export {
|
|
112
158
|
fetchReleasesPage,
|
|
113
159
|
findLastRelease,
|
|
114
160
|
findLatestRelease,
|
|
115
161
|
findLatestStableRelease,
|
|
162
|
+
findLatestStableReleaseByPrefixTag,
|
|
163
|
+
findLatestReleaseByPrefixTag,
|
|
116
164
|
getReleaseByTag,
|
|
117
165
|
hasAssetForChainType,
|
|
118
166
|
isStableReleaseForChainType,
|
|
167
|
+
isStableReleaseForRegexTagType,
|
|
168
|
+
hasMatchedTagPrefix,
|
|
119
169
|
};
|