@rosen-bridge/utils 0.3.0 → 2.0.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 (56) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/downloadRosenAssets.d.ts.map +1 -1
  3. package/dist/downloadRosenAssets.js +2 -2
  4. package/dist/downloadTssBinary.js +1 -1
  5. package/dist/utils/github.d.ts.map +1 -1
  6. package/dist/utils/github.js +1 -1
  7. package/dist/utils/rosen.d.ts +3 -1
  8. package/dist/utils/rosen.d.ts.map +1 -1
  9. package/dist/utils/rosen.js +9 -2
  10. package/package.json +19 -9
  11. package/.eslintignore +0 -1
  12. package/babel.config.json +0 -3
  13. package/dist/lib/constants.d.ts +0 -3
  14. package/dist/lib/constants.d.ts.map +0 -1
  15. package/dist/lib/constants.js +0 -3
  16. package/dist/lib/downloadRosenAssets.d.ts +0 -13
  17. package/dist/lib/downloadRosenAssets.d.ts.map +0 -1
  18. package/dist/lib/downloadRosenAssets.js +0 -48
  19. package/dist/lib/downloadTssBinary.d.ts +0 -13
  20. package/dist/lib/downloadTssBinary.d.ts.map +0 -1
  21. package/dist/lib/downloadTssBinary.js +0 -45
  22. package/dist/lib/error.d.ts +0 -4
  23. package/dist/lib/error.d.ts.map +0 -1
  24. package/dist/lib/error.js +0 -4
  25. package/dist/lib/index.d.ts +0 -4
  26. package/dist/lib/index.d.ts.map +0 -1
  27. package/dist/lib/index.js +0 -4
  28. package/dist/lib/types/index.d.ts +0 -7
  29. package/dist/lib/types/index.d.ts.map +0 -1
  30. package/dist/lib/types/index.js +0 -2
  31. package/dist/lib/utils/github.d.ts +0 -241
  32. package/dist/lib/utils/github.d.ts.map +0 -1
  33. package/dist/lib/utils/github.js +0 -113
  34. package/dist/lib/utils/rosen.d.ts +0 -19
  35. package/dist/lib/utils/rosen.d.ts.map +0 -1
  36. package/dist/lib/utils/rosen.js +0 -19
  37. package/dist/tsconfig.build.tsbuildinfo +0 -1
  38. package/jest.config.json +0 -7
  39. package/lib/constants.ts +0 -2
  40. package/lib/downloadRosenAssets.ts +0 -67
  41. package/lib/downloadTssBinary.ts +0 -61
  42. package/lib/error.ts +0 -3
  43. package/lib/index.ts +0 -4
  44. package/lib/types/index.ts +0 -13
  45. package/lib/utils/github.ts +0 -169
  46. package/lib/utils/rosen.ts +0 -29
  47. package/tests/data/octokit.data.ts +0 -208
  48. package/tests/downloadRosenAssets.spec.ts +0 -200
  49. package/tests/downloadTssBinary.spec.ts +0 -153
  50. package/tests/mocks/octokit.mock.ts +0 -41
  51. package/tests/setup.ts +0 -1
  52. package/tests/utils/github.spec.ts +0 -409
  53. package/tests/utils/rosen.spec.ts +0 -183
  54. package/tsconfig.build.json +0 -8
  55. package/tsconfig.build.tsbuildinfo +0 -1
  56. package/tsconfig.json +0 -8
package/jest.config.json DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "coverageReporters": ["lcov", "cobertura", "text", "text-summary"],
3
- "preset": "ts-jest/presets/js-with-babel",
4
- "setupFiles": ["./tests/setup.ts"],
5
- "testEnvironment": "node",
6
- "verbose": true
7
- }
package/lib/constants.ts DELETED
@@ -1,2 +0,0 @@
1
- export const DEFAULT_RELEASES_FETCHING_PAGE_SIZE = 5;
2
- export const ROSEN_BRIDGE_ORGANIZATION = 'rosen-bridge';
@@ -1,67 +0,0 @@
1
- import download from 'download';
2
-
3
- import {
4
- findLatestRelease,
5
- findLatestStableRelease,
6
- getReleaseByTag,
7
- } from './utils/github';
8
- import { isValidAssetName, truncateAssetName } from './utils/rosen';
9
-
10
- import { RosenAssetsDownloadError } from './error';
11
-
12
- const repo = 'contract';
13
-
14
- /**
15
- * Download all required Rosen assets (tokenMap and all chain address files) to a specific path
16
- * @param chainType chain type (e.g. mainnet, testnet, etc.)
17
- * @param includePrereleases weather to include prereleases into account when searching for a matching release in GitHub
18
- * @param config configs for including prereleases, adding name suffix, and getting specific release by tag
19
- */
20
- const downloadRosenAssets = async (
21
- chainType: string,
22
- destinationPath: string,
23
- config?: {
24
- includePrereleases?: boolean;
25
- nameSuffix?: string;
26
- tag?: string;
27
- }
28
- ) => {
29
- const getRelease = () => {
30
- if (config?.tag) return getReleaseByTag(repo, config.tag);
31
- if (config?.includePrereleases) return findLatestRelease(repo, chainType);
32
- return findLatestStableRelease(repo, chainType);
33
- };
34
- try {
35
- const release = await getRelease();
36
-
37
- if (release) {
38
- await Promise.all([
39
- ...(release &&
40
- release.assets
41
- .filter((asset) => isValidAssetName(chainType)(asset.name))
42
- .map(async (asset) =>
43
- download(asset.browser_download_url, destinationPath, {
44
- filename: truncateAssetName(asset.name, config?.nameSuffix),
45
- })
46
- )),
47
- ]);
48
- } else {
49
- console.error(`No release found for [${chainType}] chain type.`);
50
- if (!config?.includePrereleases) {
51
- console.error(
52
- 'Please note that `includePrereleases` is set to false. There may be some matching releases in prereleases.'
53
- );
54
- }
55
- }
56
- } catch (error) {
57
- console.error(
58
- `An error occurred while trying to download Rosen assets: ${error}`
59
- );
60
- if (error instanceof Error) {
61
- console.error(error.stack);
62
- }
63
- throw new RosenAssetsDownloadError('', { cause: error });
64
- }
65
- };
66
-
67
- export default downloadRosenAssets;
@@ -1,61 +0,0 @@
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/error.ts DELETED
@@ -1,3 +0,0 @@
1
- class RosenAssetsDownloadError extends Error {}
2
-
3
- export { RosenAssetsDownloadError };
package/lib/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export { default as downloadRosenAssets } from './downloadRosenAssets';
2
- export * from './downloadTssBinary';
3
-
4
- export { RosenAssetsDownloadError } from './error';
@@ -1,13 +0,0 @@
1
- import { Octokit } from 'octokit';
2
-
3
- export type ArrayElement<T extends any[]> = T extends (infer Element)[]
4
- ? Element
5
- : never;
6
-
7
- type GithubReleases = Awaited<
8
- ReturnType<InstanceType<typeof Octokit>['rest']['repos']['listReleases']>
9
- >['data'];
10
-
11
- export type GithubRelease = ArrayElement<GithubReleases>;
12
-
13
- export type SupportedRepo = 'contract' | 'sign-protocols';
@@ -1,169 +0,0 @@
1
- import { Octokit } from 'octokit';
2
-
3
- import { isValidAssetName } from './rosen';
4
-
5
- import {
6
- DEFAULT_RELEASES_FETCHING_PAGE_SIZE,
7
- ROSEN_BRIDGE_ORGANIZATION,
8
- } from '../constants';
9
-
10
- import { GithubRelease, SupportedRepo } from '../types';
11
-
12
- /**
13
- * Fetch a page of releases from Github Api in each iteration until there are no
14
- * more releases.
15
- * @param repoName
16
- * @param pageSize
17
- */
18
- async function* fetchReleasesPage(
19
- repoName: SupportedRepo,
20
- pageSize = DEFAULT_RELEASES_FETCHING_PAGE_SIZE
21
- ) {
22
- const octokit = new Octokit();
23
-
24
- let currentPage = 1;
25
-
26
- while (true) {
27
- const releasesPage = await octokit.rest.repos.listReleases({
28
- owner: ROSEN_BRIDGE_ORGANIZATION,
29
- repo: repoName,
30
- per_page: pageSize,
31
- page: currentPage,
32
- });
33
-
34
- if (releasesPage.data.length) {
35
- yield releasesPage.data;
36
- currentPage += 1;
37
- } else {
38
- return;
39
- }
40
- }
41
- }
42
-
43
- /**
44
- * Find the last release matching the predicate. If all releases are iterated and
45
- * no matching release is found, return null.
46
- * @param repoName
47
- * @param predicate
48
- */
49
- const findLastRelease = async (
50
- repoName: SupportedRepo,
51
- predicate: (release: GithubRelease) => boolean = () => true
52
- ) => {
53
- const releasesPageIterator = fetchReleasesPage(repoName);
54
-
55
- for await (const releasesPage of releasesPageIterator) {
56
- const foundRelease = releasesPage.find(predicate);
57
-
58
- if (foundRelease) {
59
- return foundRelease;
60
- }
61
- }
62
- return null;
63
- };
64
-
65
- /**
66
- * get a GitHub release by its tag
67
- * @param repoName
68
- * @param tag
69
- */
70
- const getReleaseByTag = async (repoName: SupportedRepo, tag: string) => {
71
- const octokit = new Octokit();
72
- const release = await octokit.rest.repos.getReleaseByTag({
73
- owner: ROSEN_BRIDGE_ORGANIZATION,
74
- repo: repoName,
75
- tag,
76
- });
77
-
78
- return release.data;
79
- };
80
-
81
- /**
82
- * Return a function which checks if a release has at least one asset for a
83
- * specific chain type
84
- * @param chainType
85
- * @param release
86
- */
87
- const hasAssetForChainType = (chainType: string) => (release: GithubRelease) =>
88
- release.assets.map((asset) => asset.name).some(isValidAssetName(chainType));
89
-
90
- /**
91
- * Return a function which checks if a release is a stable (that is, non-prerelease)
92
- * and has some asset matching a specific chain type
93
- * @param chainType
94
- */
95
- const isStableReleaseForChainType =
96
- (chainType: string) => (release: GithubRelease) =>
97
- !release.prerelease && hasAssetForChainType(chainType)(release);
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
-
117
- /**
118
- * Find latest release (prerelease or non-prerelease) having some asset matching
119
- * a specific chain type
120
- * @param repoName
121
- * @param chainType
122
- */
123
- const findLatestRelease = async (repoName: SupportedRepo, chainType: string) =>
124
- findLastRelease(repoName, hasAssetForChainType(chainType));
125
-
126
- /**
127
- * Find latest stable (that is, non-prerelease) release having some asset matching
128
- * a specific chain type
129
- * @param repoName
130
- * @param chainType
131
- */
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));
156
-
157
- export {
158
- fetchReleasesPage,
159
- findLastRelease,
160
- findLatestRelease,
161
- findLatestStableRelease,
162
- findLatestStableReleaseByPrefixTag,
163
- findLatestReleaseByPrefixTag,
164
- getReleaseByTag,
165
- hasAssetForChainType,
166
- isStableReleaseForChainType,
167
- isStableReleaseForRegexTagType,
168
- hasMatchedTagPrefix,
169
- };
@@ -1,29 +0,0 @@
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: string) => (assetName: string) =>
7
- new RegExp(`(contracts-.+|tokensMap)-${chainType}-.+.json`).test(assetName);
8
-
9
- /**
10
- * Check if an OS name is a valid supported tss OS
11
- * @param OSName
12
- */
13
- export const isValidOS = (OSName: string) => (releaseAssetName: string) =>
14
- new RegExp(`(rosenTss-${OSName}-.+).zip`).test(releaseAssetName);
15
-
16
- /**
17
- * Remove chain type and tag from the asset name and optionally replaces them
18
- * with a suffix
19
- * @param assetName
20
- * @param alternativeSuffix a suffix which will be added before `.json` (if provided)
21
- */
22
- export const truncateAssetName = (
23
- assetName: string,
24
- alternativeSuffix?: string
25
- ) =>
26
- assetName.replace(
27
- /(contracts-.+?|tokensMap)-.+.json/,
28
- alternativeSuffix ? `$1-${alternativeSuffix}.json` : '$1.json'
29
- );
@@ -1,208 +0,0 @@
1
- import { GithubRelease } from '../../lib/types';
2
-
3
- export type PartialReleases = Partial<GithubRelease>[];
4
-
5
- export const mainNetPrereleaseRelease = {
6
- id: 1,
7
- tag_name: '1',
8
- prerelease: true,
9
- assets: [
10
- {
11
- browser_download_url:
12
- 'https://example.com/contracts-awesomechain-mainnet-7.json',
13
- name: 'contracts-awesomechain-mainnet-7.json',
14
- } as any,
15
- {
16
- browser_download_url: 'https://example.com/tokensMap-mainnet-7.json',
17
- name: 'tokensMap-mainnet-6.json',
18
- } as any,
19
- ],
20
- };
21
-
22
- export const mainNetStableRelease = {
23
- id: 2,
24
- tag_name: '2',
25
- prerelease: false,
26
- assets: [
27
- {
28
- browser_download_url:
29
- 'https://example.com/contracts-awesomechain-mainnet-6.json',
30
- name: 'contracts-awesomechain-mainnet-6.json',
31
- } as any,
32
- {
33
- browser_download_url: 'https://example.com/tokensMap-mainnet-6.json',
34
- name: 'tokensMap-mainnet-6.json',
35
- } as any,
36
- ],
37
- };
38
-
39
- export const tssTag1 = {
40
- id: 1,
41
- tag_name: 'tss-api-1.0.0',
42
- name: 'tss-api-1.0.0',
43
- prerelease: false,
44
- assets: [
45
- {
46
- name: 'rosenTss-linux-tss-api-1.0.0.zip',
47
- browser_download_url:
48
- 'https://example.com/sign-protocols/releases/download/tss-api-1.0.0/rosenTss-linux-tss-api-1.0.0.zip',
49
- } as any,
50
- {
51
- name: 'rosenTss-macOS-tss-api-1.0.0.zip',
52
- browser_download_url:
53
- 'https://example.com/sign-protocols/releases/download/tss-api-1.0.0/rosenTss-macOS-tss-api-1.0.0.zip',
54
- } as any,
55
- {
56
- name: 'rosenTss-windows-tss-api-1.0.0.zip',
57
- browser_download_url:
58
- 'https://example.com/sign-protocols/releases/download/tss-api-1.0.0/rosenTss-windows-tss-api-1.0.0.zip',
59
- } as any,
60
- ],
61
- };
62
- export const tssTag2 = {
63
- id: 2,
64
- tag_name: 'tss-api-2.0.0',
65
- name: 'tss-api-2.0.0',
66
- prerelease: false,
67
- assets: [
68
- {
69
- name: 'rosenTss-linux-tss-api-2.0.0.zip',
70
- browser_download_url:
71
- 'https://example.com/sign-protocols/releases/download/tss-api-2.0.0/rosenTss-linux-tss-api-2.0.0.zip',
72
- } as any,
73
- {
74
- name: 'rosenTss-macOS-tss-api-2.0.0.zip',
75
- browser_download_url:
76
- 'https://example.com/sign-protocols/releases/download/tss-api-2.0.0/rosenTss-macOS-tss-api-2.0.0.zip',
77
- } as any,
78
- {
79
- name: 'rosenTss-windows-tss-api-2.0.0.zip',
80
- browser_download_url:
81
- 'https://example.com/sign-protocols/releases/download/tss-api-2.0.0/rosenTss-windows-tss-api-2.0.0.zip',
82
- } as any,
83
- ],
84
- };
85
-
86
- export const tssTag3PreRelease = {
87
- id: 3,
88
- tag_name: 'tss-api-3.0.0',
89
- name: 'tss-api-3.0.0',
90
- prerelease: true,
91
- assets: [
92
- {
93
- name: 'rosenTss-linux-tss-api-3.0.0.zip',
94
- browser_download_url:
95
- 'https://example.com/sign-protocols/releases/download/tss-api-3.0.0/rosenTss-linux-tss-api-3.0.0.zip',
96
- } as any,
97
- {
98
- name: 'rosenTss-macOS-tss-api-3.0.0.zip',
99
- browser_download_url:
100
- 'https://example.com/sign-protocols/releases/download/tss-api-3.0.0/rosenTss-macOS-tss-api-3.0.0.zip',
101
- } as any,
102
- {
103
- name: 'rosenTss-windows-tss-api-3.0.0.zip',
104
- browser_download_url:
105
- 'https://example.com/sign-protocols/releases/download/tss-api-3.0.0/rosenTss-windows-tss-api-3.0.0.zip',
106
- } as any,
107
- ],
108
- };
109
-
110
- export const testNetPrereleaseRelease = {
111
- id: 4,
112
- tag_name: '4',
113
- prerelease: true,
114
- assets: [
115
- {
116
- browser_download_url:
117
- 'https://example.com/contracts-awesomechain-testnet-1.json',
118
- name: 'contracts-awesomechain-testnet-1.json',
119
- } as any,
120
- ],
121
- };
122
-
123
- export const testNetStableRelease = {
124
- id: 5,
125
- tag_name: '5',
126
- prerelease: false,
127
- assets: [
128
- {
129
- browser_download_url:
130
- 'https://example.com/contracts-awesomechain-testnet-1.json',
131
- name: 'contracts-awesomechain-testnet-1.json',
132
- } as any,
133
- ],
134
- };
135
-
136
- export const contractReleases = [
137
- mainNetPrereleaseRelease,
138
- mainNetStableRelease,
139
- {
140
- id: 3,
141
- tag_name: '3',
142
- prerelease: false,
143
- assets: [
144
- {
145
- browser_download_url:
146
- 'https://example.com/contracts-awesomechain-mainnet-5.json',
147
- name: 'contracts-awesomechain-mainnet-5.json',
148
- } as any,
149
- ],
150
- },
151
- testNetPrereleaseRelease,
152
- testNetStableRelease,
153
- {
154
- id: 6,
155
- tag_name: '6',
156
- prerelease: false,
157
- assets: [
158
- {
159
- browser_download_url:
160
- 'https://example.com/contracts-awesomechain-mainnet-4.json',
161
- name: 'contracts-awesomechain-mainnet-4.json',
162
- } as any,
163
- ],
164
- },
165
- {
166
- id: 7,
167
- tag_name: '7',
168
- prerelease: false,
169
- assets: [
170
- {
171
- browser_download_url:
172
- 'https://example.com/contracts-awesomechain-mainnet-3.json',
173
- name: 'contracts-awesomechain-mainnet-3.json',
174
- } as any,
175
- ],
176
- },
177
- {
178
- id: 8,
179
- tag_name: '8',
180
- prerelease: false,
181
- assets: [
182
- {
183
- browser_download_url:
184
- 'https://example.com/contracts-awesomechain-mainnet-2.json',
185
- name: 'contracts-awesomechain-mainnet-2.json',
186
- } as any,
187
- ],
188
- },
189
- {
190
- id: 9,
191
- tag_name: '9',
192
- prerelease: false,
193
- assets: [
194
- {
195
- browser_download_url:
196
- 'https://example.com/contracts-awesomechain-mainnet-1.json',
197
- name: 'contracts-awesomechain-mainnet-1.json',
198
- } as any,
199
- ],
200
- },
201
- ] satisfies PartialReleases;
202
-
203
- export const tssReleases = [
204
- mainNetStableRelease, // in case of sign-protocols mono repo we have other tags
205
- tssTag3PreRelease,
206
- tssTag2,
207
- tssTag1,
208
- ] satisfies PartialReleases;