@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/constants.d.ts +3 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +3 -0
  5. package/dist/downloadRosenAssets.d.ts +13 -0
  6. package/dist/downloadRosenAssets.d.ts.map +1 -0
  7. package/dist/downloadRosenAssets.js +48 -0
  8. package/dist/downloadTssBinary.d.ts +13 -0
  9. package/dist/downloadTssBinary.d.ts.map +1 -0
  10. package/dist/downloadTssBinary.js +45 -0
  11. package/dist/error.d.ts +4 -0
  12. package/dist/error.d.ts.map +1 -0
  13. package/dist/error.js +4 -0
  14. package/dist/index.d.ts +4 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +4 -0
  17. package/dist/lib/constants.d.ts +0 -1
  18. package/dist/lib/constants.d.ts.map +1 -1
  19. package/dist/lib/constants.js +1 -2
  20. package/dist/lib/downloadRosenAssets.d.ts.map +1 -1
  21. package/dist/lib/downloadRosenAssets.js +5 -4
  22. package/dist/lib/downloadTssBinary.d.ts.map +1 -1
  23. package/dist/lib/downloadTssBinary.js +2 -2
  24. package/dist/lib/index.d.ts +1 -0
  25. package/dist/lib/index.d.ts.map +1 -1
  26. package/dist/lib/index.js +2 -1
  27. package/dist/lib/types/index.d.ts +1 -0
  28. package/dist/lib/types/index.d.ts.map +1 -1
  29. package/dist/lib/types/index.js +1 -1
  30. package/dist/lib/utils/github.d.ts +123 -392
  31. package/dist/lib/utils/github.d.ts.map +1 -1
  32. package/dist/lib/utils/github.js +42 -11
  33. package/dist/lib/utils/rosen.d.ts +5 -0
  34. package/dist/lib/utils/rosen.d.ts.map +1 -1
  35. package/dist/lib/utils/rosen.js +6 -1
  36. package/dist/tsconfig.build.tsbuildinfo +1 -1
  37. package/dist/types/index.d.ts +7 -0
  38. package/dist/types/index.d.ts.map +1 -0
  39. package/dist/types/index.js +2 -0
  40. package/dist/utils/github.d.ts +241 -0
  41. package/dist/utils/github.d.ts.map +1 -0
  42. package/dist/utils/github.js +113 -0
  43. package/dist/utils/rosen.d.ts +19 -0
  44. package/dist/utils/rosen.d.ts.map +1 -0
  45. package/dist/utils/rosen.js +19 -0
  46. package/lib/constants.ts +0 -1
  47. package/lib/downloadRosenAssets.ts +5 -3
  48. package/lib/downloadTssBinary.ts +61 -0
  49. package/lib/index.ts +1 -0
  50. package/lib/types/index.ts +2 -0
  51. package/lib/utils/github.ts +60 -10
  52. package/lib/utils/rosen.ts +7 -0
  53. package/package.json +7 -12
  54. package/tests/data/octokit.data.ts +88 -10
  55. package/tests/downloadRosenAssets.spec.ts +9 -9
  56. package/tests/downloadTssBinary.spec.ts +153 -0
  57. package/tests/mocks/octokit.mock.ts +4 -4
  58. package/tests/utils/github.spec.ts +173 -21
  59. package/tests/utils/rosen.spec.ts +39 -1
  60. package/tsconfig.build.json +4 -0
  61. package/tsconfig.build.tsbuildinfo +1 -0
  62. package/tsconfig.json +2 -2
  63. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzL2dpdGh1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsbUNBQW1DLEVBQ25DLHlCQUF5QixHQUMxQixNQUFNLGNBQWMsQ0FBQztBQUl0Qjs7Ozs7R0FLRztBQUNILEtBQUssU0FBUyxDQUFDLENBQUMsaUJBQWlCLENBQy9CLFFBQXVCLEVBQ3ZCLFFBQVEsR0FBRyxtQ0FBbUM7SUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUU5QixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFFcEIsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ3pELEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUUsUUFBUTtZQUNsQixJQUFJLEVBQUUsV0FBVztTQUNsQixDQUFDLENBQUM7UUFFSCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3hCLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQzNCLFFBQXVCLEVBQ3ZCLFlBQWlELEdBQUcsRUFBRSxDQUFDLElBQUksRUFDM0QsRUFBRTtJQUNGLE1BQU0sb0JBQW9CLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENB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RUFDakIsZUFBZSxFQUNmLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsa0NBQWtDLEVBQ2xDLDRCQUE0QixFQUM1QixlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUMzQiw4QkFBOEIsRUFDOUIsbUJBQW1CLEdBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnb2N0b2tpdCc7XG5cbmltcG9ydCB7IGlzVmFsaWRBc3NldE5hbWUgfSBmcm9tICcuL3Jvc2VuJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9SRUxFQVNFU19GRVRDSElOR19QQUdFX1NJWkUsXG4gIFJPU0VOX0JSSURHRV9PUkdBTklaQVRJT04sXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7IEdpdGh1YlJlbGVhc2UsIFN1cHBvcnRlZFJlcG8gfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogRmV0Y2ggYSBwYWdlIG9mIHJlbGVhc2VzIGZyb20gR2l0aHViIEFwaSBpbiBlYWNoIGl0ZXJhdGlvbiB1bnRpbCB0aGVyZSBhcmUgbm9cbiAqIG1vcmUgcmVsZWFzZXMuXG4gKiBAcGFyYW0gcmVwb05hbWVcbiAqIEBwYXJhbSBwYWdlU2l6ZVxuICovXG5hc3luYyBmdW5jdGlvbiogZmV0Y2hSZWxlYXNlc1BhZ2UoXG4gIHJlcG9OYW1lOiBTdXBwb3J0ZWRSZXBvLFxuICBwYWdlU2l6ZSA9IERFRkFVTFRfUkVMRUFTRVNfRkVUQ0hJTkdfUEFHRV9TSVpFXG4pIHtcbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KCk7XG5cbiAgbGV0IGN1cnJlbnRQYWdlID0gMTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHJlbGVhc2VzUGFnZSA9IGF3YWl0IG9jdG9raXQucmVzdC5yZXBvcy5saXN0UmVsZWFzZXMoe1xuICAgICAgb3duZXI6IFJPU0VOX0JSSURHRV9PUkdBTklaQVRJT04sXG4gICAgICByZXBvOiByZXBvTmFtZSxcbiAgICAgIHBlcl9wYWdlOiBwYWdlU2l6ZSxcbiAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlbGVhc2VzUGFnZS5kYXRhLmxlbmd0aCkge1xuICAgICAgeWllbGQgcmVsZWFzZXNQYWdlLmRhdGE7XG4gICAgICBjdXJyZW50UGFnZSArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluZCB0aGUgbGFzdCByZWxlYXNlIG1hdGNoaW5nIHRoZSBwcmVkaWNhdGUuIElmIGFsbCByZWxlYXNlcyBhcmUgaXRlcmF0ZWQgYW5kXG4gKiBubyBtYXRjaGluZyByZWxlYXNlIGlzIGZvdW5kLCByZXR1cm4gbnVsbC5cbiAqIEBwYXJhbSByZXBvTmFtZVxuICogQHBhcmFtIHByZWRpY2F0ZVxuICovXG5jb25zdCBmaW5kTGFzdFJlbGVhc2UgPSBhc3luYyAoXG4gIHJlcG9OYW1lOiBTdXBwb3J0ZWRSZXBvLFxuICBwcmVkaWNhdGU6IChyZWxlYXNlOiBHaXRodWJSZWxlYXNlKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZVxuKSA9PiB7XG4gIGNvbnN0IHJlbGVhc2VzUGFnZUl0ZXJhdG9yID0gZmV0Y2hSZWxlYXNlc1BhZ2UocmVwb05hbWUpO1xuXG4gIGZvciBhd2FpdCAoY29uc3QgcmVsZWFzZXNQYWdlIG9mIHJlbGVhc2VzUGFnZUl0ZXJhdG9yKSB7XG4gICAgY29uc3QgZm91bmRSZWxlYXNlID0gcmVsZWFzZXNQYWdlLmZpbmQocHJlZGljYXRlKTtcblxuICAgIGlmIChmb3VuZFJlbGVhc2UpIHtcbiAgICAgIHJldHVybiBmb3VuZFJlbGVhc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBnZXQgYSBHaXRIdWIgcmVsZWFzZSBieSBpdHMgdGFnXG4gKiBAcGFyYW0gcmVwb05hbWVcbiAqIEBwYXJhbSB0YWdcbiAqL1xuY29uc3QgZ2V0UmVsZWFzZUJ5VGFnID0gYXN5bmMgKHJlcG9OYW1lOiBTdXBwb3J0ZWRSZXBvLCB0YWc6IHN0cmluZykgPT4ge1xuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoKTtcbiAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IG9jdG9raXQucmVzdC5yZXBvcy5nZXRSZWxlYXNlQnlUYWcoe1xuICAgIG93bmVyOiBST1NFTl9CUklER0VfT1JHQU5JWkFUSU9OLFxuICAgIHJlcG86IHJlcG9OYW1lLFxuICAgIHRhZyxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlbGVhc2UuZGF0YTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGlmIGEgcmVsZWFzZSBoYXMgYXQgbGVhc3Qgb25lIGFzc2V0IGZvciBhXG4gKiBzcGVjaWZpYyBjaGFpbiB0eXBlXG4gKiBAcGFyYW0gY2hhaW5UeXBlXG4gKiBAcGFyYW0gcmVsZWFzZVxuICovXG5jb25zdCBoYXNBc3NldEZvckNoYWluVHlwZSA9IChjaGFpblR5cGU6IHN0cmluZykgPT4gKHJlbGVhc2U6IEdpdGh1YlJlbGVhc2UpID0+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
@@ -1,3 +1,2 @@
1
1
  export const DEFAULT_RELEASES_FETCHING_PAGE_SIZE = 5;
2
2
  export const ROSEN_BRIDGE_ORGANIZATION = 'rosen-bridge';
3
- export const CONTRACT_REPO_NAME = 'contract';
@@ -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
@@ -1,3 +1,4 @@
1
1
  export { default as downloadRosenAssets } from './downloadRosenAssets';
2
+ export * from './downloadTssBinary';
2
3
 
3
4
  export { RosenAssetsDownloadError } from './error';
@@ -9,3 +9,5 @@ type GithubReleases = Awaited<
9
9
  >['data'];
10
10
 
11
11
  export type GithubRelease = ArrayElement<GithubReleases>;
12
+
13
+ export type SupportedRepo = 'contract' | 'sign-protocols';
@@ -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: CONTRACT_REPO_NAME,
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: CONTRACT_REPO_NAME,
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 (chainType: string) =>
109
- findLastRelease(isStableReleaseForChainType(chainType));
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
  };