@eclipse-che/che-devworkspace-generator 0.0.1-95a24f0 → 0.0.1-99986b8
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/README.md +42 -14
- package/lib/bitbucket/bitbucket-module.d.ts +12 -0
- package/lib/bitbucket/bitbucket-module.js +21 -0
- package/lib/bitbucket/bitbucket-module.js.map +1 -0
- package/lib/bitbucket/bitbucket-resolver.d.ts +17 -0
- package/lib/bitbucket/bitbucket-resolver.js +56 -0
- package/lib/bitbucket/bitbucket-resolver.js.map +1 -0
- package/lib/bitbucket/bitbucket-url.d.ts +22 -0
- package/lib/bitbucket/bitbucket-url.js +38 -0
- package/lib/bitbucket/bitbucket-url.js.map +1 -0
- package/lib/bitbucket-server/bitbucket-server-module.d.ts +12 -0
- package/lib/bitbucket-server/bitbucket-server-module.js +21 -0
- package/lib/bitbucket-server/bitbucket-server-module.js.map +1 -0
- package/lib/bitbucket-server/bitbucket-server-resolver.d.ts +17 -0
- package/lib/bitbucket-server/bitbucket-server-resolver.js +64 -0
- package/lib/bitbucket-server/bitbucket-server-resolver.js.map +1 -0
- package/lib/bitbucket-server/bitbucket-server-url.d.ts +24 -0
- package/lib/bitbucket-server/bitbucket-server-url.js +43 -0
- package/lib/bitbucket-server/bitbucket-server-url.js.map +1 -0
- package/lib/devfile/dev-container-component-finder.d.ts +2 -1
- package/lib/devfile/dev-container-component-finder.js +20 -7
- package/lib/devfile/dev-container-component-finder.js.map +1 -1
- package/lib/devfile/dev-container-component-inserter.d.ts +18 -0
- package/lib/devfile/dev-container-component-inserter.js +98 -0
- package/lib/devfile/dev-container-component-inserter.js.map +1 -0
- package/lib/devfile/devfile-module.js +2 -0
- package/lib/devfile/devfile-module.js.map +1 -1
- package/lib/generate.d.ts +3 -3
- package/lib/generate.js +29 -21
- package/lib/generate.js.map +1 -1
- package/lib/github/github-module.js +3 -1
- package/lib/github/github-module.js.map +1 -1
- package/lib/github/github-resolver.d.ts +6 -7
- package/lib/github/github-resolver.js +10 -5
- package/lib/github/github-resolver.js.map +1 -1
- package/lib/github/github-url.d.ts +5 -6
- package/lib/github/github-url.js +7 -9
- package/lib/github/github-url.js.map +1 -1
- package/lib/inversify/inversify-binding.js +6 -0
- package/lib/inversify/inversify-binding.js.map +1 -1
- package/lib/main.d.ts +2 -0
- package/lib/main.js +19 -11
- package/lib/main.js.map +1 -1
- package/lib/resolve/git-url-resolver.d.ts +5 -0
- package/lib/resolve/git-url-resolver.js +43 -0
- package/lib/resolve/git-url-resolver.js.map +1 -0
- package/lib/resolve/resolve-module.d.ts +12 -0
- package/lib/resolve/resolve-module.js +19 -0
- package/lib/resolve/resolve-module.js.map +1 -0
- package/lib/resolve/resolver.d.ts +22 -0
- package/lib/resolve/resolver.js +12 -0
- package/lib/resolve/resolver.js.map +1 -0
- package/lib/resolve/url.d.ts +35 -0
- package/lib/resolve/url.js +12 -0
- package/lib/resolve/url.js.map +1 -0
- package/lib/types.d.ts +13 -0
- package/lib/types.js +17 -0
- package/lib/types.js.map +1 -0
- package/package.json +1 -1
- package/src/bitbucket/bitbucket-module.ts +21 -0
- package/src/bitbucket/bitbucket-resolver.ts +46 -0
- package/src/bitbucket/bitbucket-url.ts +41 -0
- package/src/bitbucket-server/bitbucket-server-module.ts +21 -0
- package/src/bitbucket-server/bitbucket-server-resolver.ts +53 -0
- package/src/bitbucket-server/bitbucket-server-url.ts +51 -0
- package/src/devfile/dev-container-component-finder.ts +23 -4
- package/src/devfile/dev-container-component-inserter.ts +49 -0
- package/src/devfile/devfile-module.ts +2 -0
- package/src/generate.ts +52 -20
- package/src/github/github-module.ts +4 -1
- package/src/github/github-resolver.ts +17 -9
- package/src/github/github-url.ts +8 -9
- package/src/inversify/inversify-binding.ts +6 -0
- package/src/main.ts +27 -8
- package/src/resolve/git-url-resolver.ts +30 -0
- package/src/resolve/resolve-module.ts +18 -0
- package/src/resolve/resolver.ts +25 -0
- package/src/resolve/url.ts +40 -0
- package/src/types.ts +14 -0
package/src/generate.ts
CHANGED
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
***********************************************************************/
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
|
+
V221Devfile,
|
|
13
|
+
V221DevfileMetadata,
|
|
12
14
|
V1alpha2DevWorkspace,
|
|
15
|
+
V1alpha2DevWorkspaceMetadata,
|
|
13
16
|
V1alpha2DevWorkspaceSpecContributions,
|
|
14
|
-
V1alpha2DevWorkspaceSpecTemplateComponents,
|
|
15
17
|
V1alpha2DevWorkspaceTemplate,
|
|
16
18
|
V1alpha2DevWorkspaceTemplateSpec,
|
|
17
19
|
} from '@devfile/api';
|
|
@@ -21,15 +23,30 @@ import * as fs from 'fs-extra';
|
|
|
21
23
|
import { DevfileContext } from './api/devfile-context';
|
|
22
24
|
import { DevContainerComponentFinder } from './devfile/dev-container-component-finder';
|
|
23
25
|
|
|
26
|
+
type DevfileLike = V221Devfile & {
|
|
27
|
+
metadata: V221DevfileMetadata & {
|
|
28
|
+
generateName?: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
|
|
24
32
|
@injectable()
|
|
25
33
|
export class Generate {
|
|
26
|
-
static readonly MERGE_CONTRIBUTION = 'controller.devfile.io/merge-contribution';
|
|
27
|
-
|
|
28
34
|
@inject(DevContainerComponentFinder)
|
|
29
35
|
private devContainerComponentFinder: DevContainerComponentFinder;
|
|
30
36
|
|
|
31
|
-
async generate(
|
|
32
|
-
|
|
37
|
+
async generate(
|
|
38
|
+
devfileContent: string,
|
|
39
|
+
editorContent: string,
|
|
40
|
+
outputFile?: string,
|
|
41
|
+
injectDefaultComponent?: string,
|
|
42
|
+
defaultComponentImage?: string
|
|
43
|
+
): Promise<DevfileContext> {
|
|
44
|
+
const context = await this.generateContent(
|
|
45
|
+
devfileContent,
|
|
46
|
+
editorContent,
|
|
47
|
+
injectDefaultComponent,
|
|
48
|
+
defaultComponentImage
|
|
49
|
+
);
|
|
33
50
|
|
|
34
51
|
// write the result
|
|
35
52
|
if (outputFile) {
|
|
@@ -46,7 +63,12 @@ export class Generate {
|
|
|
46
63
|
return context;
|
|
47
64
|
}
|
|
48
65
|
|
|
49
|
-
async generateContent(
|
|
66
|
+
async generateContent(
|
|
67
|
+
devfileContent: string,
|
|
68
|
+
editorContent: string,
|
|
69
|
+
injectDefaultComponent?: string,
|
|
70
|
+
defaultComponentImage?: string
|
|
71
|
+
): Promise<DevfileContext> {
|
|
50
72
|
const devfile = jsYaml.load(devfileContent);
|
|
51
73
|
|
|
52
74
|
// const originalDevfile = Object.assign({}, devfile);
|
|
@@ -57,7 +79,7 @@ export class Generate {
|
|
|
57
79
|
const editorDevfile = jsYaml.load(editorContent);
|
|
58
80
|
|
|
59
81
|
// transform it into a devWorkspace template
|
|
60
|
-
const metadata = editorDevfile
|
|
82
|
+
const metadata = this.createDevWorkspaceMetadata(editorDevfile);
|
|
61
83
|
// add sufix
|
|
62
84
|
metadata.name = `${metadata.name}-${suffix}`;
|
|
63
85
|
delete editorDevfile.metadata;
|
|
@@ -70,7 +92,7 @@ export class Generate {
|
|
|
70
92
|
};
|
|
71
93
|
|
|
72
94
|
// transform it into a devWorkspace
|
|
73
|
-
const devfileMetadata = devfile
|
|
95
|
+
const devfileMetadata = this.createDevWorkspaceMetadata(devfile, true);
|
|
74
96
|
const devfileCopy = Object.assign({}, devfile);
|
|
75
97
|
delete devfileCopy.schemaVersion;
|
|
76
98
|
delete devfileCopy.metadata;
|
|
@@ -86,6 +108,7 @@ export class Generate {
|
|
|
86
108
|
metadata: devfileMetadata,
|
|
87
109
|
spec: {
|
|
88
110
|
started: true,
|
|
111
|
+
routingClass: 'che',
|
|
89
112
|
template: devfileCopy,
|
|
90
113
|
contributions: [editorSpecContribution],
|
|
91
114
|
},
|
|
@@ -101,19 +124,28 @@ export class Generate {
|
|
|
101
124
|
suffix,
|
|
102
125
|
};
|
|
103
126
|
|
|
104
|
-
//
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// add attributes
|
|
108
|
-
let devContainerAttributes = devContainer.attributes;
|
|
109
|
-
if (!devContainerAttributes) {
|
|
110
|
-
devContainerAttributes = {};
|
|
111
|
-
devContainerAttributes[Generate.MERGE_CONTRIBUTION] = true;
|
|
112
|
-
devContainer.attributes = devContainerAttributes;
|
|
113
|
-
} else {
|
|
114
|
-
devContainerAttributes[Generate.MERGE_CONTRIBUTION] = true;
|
|
115
|
-
}
|
|
127
|
+
// find devContainer component, add a default one if not found
|
|
128
|
+
await this.devContainerComponentFinder.find(context, injectDefaultComponent, defaultComponentImage);
|
|
116
129
|
|
|
117
130
|
return context;
|
|
118
131
|
}
|
|
132
|
+
|
|
133
|
+
private createDevWorkspaceMetadata(devfile: DevfileLike, addDevfileContent = false): V1alpha2DevWorkspaceMetadata {
|
|
134
|
+
const devWorkspaceMetadata = {} as V1alpha2DevWorkspaceMetadata;
|
|
135
|
+
const devfileMetadata = devfile.metadata;
|
|
136
|
+
|
|
137
|
+
if (devfileMetadata.name) {
|
|
138
|
+
devWorkspaceMetadata.name = devfileMetadata.name;
|
|
139
|
+
}
|
|
140
|
+
if (devfileMetadata.generateName) {
|
|
141
|
+
devWorkspaceMetadata.generateName = devfileMetadata.generateName;
|
|
142
|
+
}
|
|
143
|
+
if (addDevfileContent) {
|
|
144
|
+
devWorkspaceMetadata.annotations = {
|
|
145
|
+
'che.eclipse.org/devfile': jsYaml.dump(devfile),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return devWorkspaceMetadata;
|
|
150
|
+
}
|
|
119
151
|
}
|
|
@@ -10,9 +10,12 @@
|
|
|
10
10
|
import { ContainerModule, interfaces } from 'inversify';
|
|
11
11
|
|
|
12
12
|
import { GithubResolver } from './github-resolver';
|
|
13
|
+
import { TYPES } from '../types';
|
|
14
|
+
|
|
15
|
+
const { Resolver } = TYPES;
|
|
13
16
|
|
|
14
17
|
const githubModule = new ContainerModule((bind: interfaces.Bind) => {
|
|
15
|
-
bind(
|
|
18
|
+
bind(Resolver).to(GithubResolver).inSingletonScope();
|
|
16
19
|
});
|
|
17
20
|
|
|
18
21
|
export { githubModule };
|
|
@@ -10,29 +10,37 @@
|
|
|
10
10
|
|
|
11
11
|
import { GithubUrl } from './github-url';
|
|
12
12
|
import { injectable } from 'inversify';
|
|
13
|
+
import { Url } from '../resolve/url';
|
|
14
|
+
import { Resolver } from '../resolve/resolver';
|
|
13
15
|
|
|
14
|
-
/**
|
|
15
|
-
* Provides a github URL object allowing to interact
|
|
16
|
-
*/
|
|
17
16
|
@injectable()
|
|
18
|
-
export class GithubResolver {
|
|
17
|
+
export class GithubResolver implements Resolver {
|
|
19
18
|
// eslint-disable-next-line max-len
|
|
20
19
|
static readonly GITHUB_URL_PATTERN =
|
|
21
|
-
/^(
|
|
20
|
+
/^(?<scheme>https?):\/\/(?<host>github(\..+)?\.[^\/]+)\/(?<repoUser>[^\/]+)\/(?<repoName>[^\/]+)((\/)|\/(blob|tree)\/(?<branchName>[^\/]+)(?:\/(?<subFolder>.*))?)?$/;
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
isValid(url: string): boolean {
|
|
23
|
+
return GithubResolver.GITHUB_URL_PATTERN.test(url);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
resolve(link: string): Url {
|
|
24
27
|
const match = GithubResolver.GITHUB_URL_PATTERN.exec(link);
|
|
25
28
|
if (!match) {
|
|
26
29
|
throw new Error(`Invalid github URL: ${link}`);
|
|
27
30
|
}
|
|
31
|
+
const scheme = this.getGroup(match, 'scheme');
|
|
32
|
+
const hostName = this.getGroup(match, 'host');
|
|
28
33
|
const repoUser = this.getGroup(match, 'repoUser');
|
|
29
|
-
|
|
34
|
+
let repoName = this.getGroup(match, 'repoName');
|
|
35
|
+
if (/^[\w-][\w.-]*?\.git$/.test(repoName)) {
|
|
36
|
+
repoName = repoName.substring(0, repoName.length - 4);
|
|
37
|
+
}
|
|
30
38
|
const branchName = this.getGroup(match, 'branchName', 'HEAD');
|
|
31
39
|
const subFolder = this.getGroup(match, 'subFolder');
|
|
32
|
-
return new GithubUrl(repoUser, repoName, branchName, subFolder);
|
|
40
|
+
return new GithubUrl(scheme, hostName, repoUser, repoName, branchName, subFolder);
|
|
33
41
|
}
|
|
34
42
|
|
|
35
|
-
getGroup(match: RegExpExecArray, groupName: string, defaultValue?: string) {
|
|
43
|
+
private getGroup(match: RegExpExecArray, groupName: string, defaultValue?: string) {
|
|
36
44
|
if (match.groups && match.groups[groupName]) {
|
|
37
45
|
return match.groups[groupName];
|
|
38
46
|
}
|
package/src/github/github-url.ts
CHANGED
|
@@ -8,14 +8,12 @@
|
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
***********************************************************************/
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
* Provides helper methods on top of github URL to get for example raw content of get relative links
|
|
13
|
-
*/
|
|
14
|
-
export class GithubUrl {
|
|
15
|
-
// raw link
|
|
16
|
-
static readonly RAW_LINK = 'https://raw.githubusercontent.com';
|
|
11
|
+
import { Url } from '../resolve/url';
|
|
17
12
|
|
|
13
|
+
export class GithubUrl implements Url {
|
|
18
14
|
constructor(
|
|
15
|
+
private readonly scheme: string,
|
|
16
|
+
private readonly hostName: string,
|
|
19
17
|
private readonly repoUser: string,
|
|
20
18
|
private readonly repoName: string,
|
|
21
19
|
private readonly branchName: string,
|
|
@@ -26,15 +24,16 @@ export class GithubUrl {
|
|
|
26
24
|
* Provides the raw link to the given path based on the current repository information
|
|
27
25
|
*/
|
|
28
26
|
getContentUrl(path: string): string {
|
|
29
|
-
|
|
27
|
+
const hostName = this.hostName === 'github.com' ? 'githubusercontent.com' : this.hostName;
|
|
28
|
+
return `${this.scheme}://raw.${hostName}/${this.repoUser}/${this.repoName}/${this.branchName}/${path}`;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
getUrl(): string {
|
|
33
|
-
return
|
|
32
|
+
return `${this.scheme}://${this.hostName}/${this.repoUser}/${this.repoName}/tree/${this.branchName}/${this.subFolder}`;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
getCloneUrl(): string {
|
|
37
|
-
return
|
|
36
|
+
return `${this.scheme}://${this.hostName}/${this.repoUser}/${this.repoName}.git`;
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
getRepoName(): string {
|
|
@@ -14,7 +14,10 @@ import { Container } from 'inversify';
|
|
|
14
14
|
import { devfileModule } from '../devfile/devfile-module';
|
|
15
15
|
import { fetchModule } from '../fetch/fetch-module';
|
|
16
16
|
import { githubModule } from '../github/github-module';
|
|
17
|
+
import { resolveModule } from '../resolve/resolve-module';
|
|
17
18
|
import { pluginRegistryModule } from '../plugin-registry/plugin-registry-module';
|
|
19
|
+
import { bitbucketModule } from '../bitbucket/bitbucket-module';
|
|
20
|
+
import { bitbucketServerModule } from '../bitbucket-server/bitbucket-server-module';
|
|
18
21
|
|
|
19
22
|
/**
|
|
20
23
|
* Manage all bindings for inversify
|
|
@@ -28,6 +31,9 @@ export class InversifyBinding {
|
|
|
28
31
|
this.container.load(devfileModule);
|
|
29
32
|
this.container.load(fetchModule);
|
|
30
33
|
this.container.load(githubModule);
|
|
34
|
+
this.container.load(bitbucketModule);
|
|
35
|
+
this.container.load(bitbucketServerModule);
|
|
36
|
+
this.container.load(resolveModule);
|
|
31
37
|
this.container.load(pluginRegistryModule);
|
|
32
38
|
|
|
33
39
|
this.container.bind(Symbol.for('AxiosInstance')).toConstantValue(options.axiosInstance);
|
package/src/main.ts
CHANGED
|
@@ -18,6 +18,7 @@ import { UrlFetcher } from './fetch/url-fetcher';
|
|
|
18
18
|
import { PluginRegistryResolver } from './plugin-registry/plugin-registry-resolver';
|
|
19
19
|
import { V1alpha2DevWorkspaceSpecTemplate } from '@devfile/api';
|
|
20
20
|
import { DevfileContext } from './api/devfile-context';
|
|
21
|
+
import { GitUrlResolver } from './resolve/git-url-resolver';
|
|
21
22
|
|
|
22
23
|
export class Main {
|
|
23
24
|
/**
|
|
@@ -38,6 +39,8 @@ export class Main {
|
|
|
38
39
|
editorEntry?: string;
|
|
39
40
|
pluginRegistryUrl?: string;
|
|
40
41
|
projects: { name: string; location: string }[];
|
|
42
|
+
injectDefaultComponent?: string;
|
|
43
|
+
defaultComponentImage?: string;
|
|
41
44
|
},
|
|
42
45
|
axiosInstance: axios.AxiosInstance
|
|
43
46
|
): Promise<DevfileContext> {
|
|
@@ -67,12 +70,12 @@ export class Main {
|
|
|
67
70
|
let devfileContent;
|
|
68
71
|
let editorContent;
|
|
69
72
|
|
|
70
|
-
// gets the
|
|
73
|
+
// gets the repo URL
|
|
71
74
|
if (params.devfileUrl) {
|
|
72
|
-
const
|
|
73
|
-
const
|
|
75
|
+
const resolver = container.get(GitUrlResolver);
|
|
76
|
+
const url = resolver.resolve(params.devfileUrl);
|
|
74
77
|
// user devfile
|
|
75
|
-
devfileContent = await container.get(UrlFetcher).fetchText(
|
|
78
|
+
devfileContent = await container.get(UrlFetcher).fetchText(url.getContentUrl('devfile.yaml'));
|
|
76
79
|
|
|
77
80
|
// load content
|
|
78
81
|
const devfileParsed = jsYaml.load(devfileContent);
|
|
@@ -82,10 +85,10 @@ export class Main {
|
|
|
82
85
|
// no, so add the current project being cloned
|
|
83
86
|
devfileParsed.projects = [
|
|
84
87
|
{
|
|
85
|
-
name:
|
|
88
|
+
name: url.getRepoName(),
|
|
86
89
|
git: {
|
|
87
|
-
remotes: { origin:
|
|
88
|
-
checkoutFrom: { revision:
|
|
90
|
+
remotes: { origin: url.getCloneUrl() },
|
|
91
|
+
checkoutFrom: { revision: url.getBranchName() },
|
|
89
92
|
},
|
|
90
93
|
},
|
|
91
94
|
];
|
|
@@ -112,7 +115,13 @@ export class Main {
|
|
|
112
115
|
}
|
|
113
116
|
|
|
114
117
|
const generate = container.get(Generate);
|
|
115
|
-
return generate.generate(
|
|
118
|
+
return generate.generate(
|
|
119
|
+
devfileContent,
|
|
120
|
+
editorContent,
|
|
121
|
+
params.outputFile,
|
|
122
|
+
params.injectDefaultComponent,
|
|
123
|
+
params.defaultComponentImage
|
|
124
|
+
);
|
|
116
125
|
}
|
|
117
126
|
|
|
118
127
|
// Update project entry based on the projects passed as parameter
|
|
@@ -149,6 +158,8 @@ export class Main {
|
|
|
149
158
|
let editorPath: string | undefined;
|
|
150
159
|
let pluginRegistryUrl: string | undefined;
|
|
151
160
|
let editorEntry: string | undefined;
|
|
161
|
+
let injectDefaultComponent: string | undefined;
|
|
162
|
+
let defaultComponentImage: string | undefined;
|
|
152
163
|
const projects: { name: string; location: string }[] = [];
|
|
153
164
|
|
|
154
165
|
const args = process.argv.slice(2);
|
|
@@ -178,6 +189,12 @@ export class Main {
|
|
|
178
189
|
|
|
179
190
|
projects.push({ name, location });
|
|
180
191
|
}
|
|
192
|
+
if (arg.startsWith('--injectDefaultComponent:')) {
|
|
193
|
+
injectDefaultComponent = arg.substring('--injectDefaultComponent:'.length);
|
|
194
|
+
}
|
|
195
|
+
if (arg.startsWith('--defaultComponentImage:')) {
|
|
196
|
+
defaultComponentImage = arg.substring('--defaultComponentImage:'.length);
|
|
197
|
+
}
|
|
181
198
|
});
|
|
182
199
|
|
|
183
200
|
try {
|
|
@@ -199,6 +216,8 @@ export class Main {
|
|
|
199
216
|
pluginRegistryUrl,
|
|
200
217
|
editorEntry,
|
|
201
218
|
projects,
|
|
219
|
+
injectDefaultComponent,
|
|
220
|
+
defaultComponentImage,
|
|
202
221
|
},
|
|
203
222
|
axios.default
|
|
204
223
|
);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
* Copyright (c) 2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
***********************************************************************/
|
|
10
|
+
import { injectable, multiInject } from 'inversify';
|
|
11
|
+
import { Url } from './url';
|
|
12
|
+
import { TYPES } from '../types';
|
|
13
|
+
import { Resolver } from './resolver';
|
|
14
|
+
|
|
15
|
+
const { Resolver } = TYPES;
|
|
16
|
+
|
|
17
|
+
@injectable()
|
|
18
|
+
export class GitUrlResolver {
|
|
19
|
+
@multiInject(Resolver)
|
|
20
|
+
private resolvers: Resolver[];
|
|
21
|
+
|
|
22
|
+
resolve(link: string): Url {
|
|
23
|
+
const resolver = this.resolvers.find(r => r.isValid(link));
|
|
24
|
+
if (resolver) {
|
|
25
|
+
return resolver.resolve(link);
|
|
26
|
+
} else {
|
|
27
|
+
throw new Error('Can not resolver the URL');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
* Copyright (c) 2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
***********************************************************************/
|
|
10
|
+
import { ContainerModule, interfaces } from 'inversify';
|
|
11
|
+
|
|
12
|
+
import { GitUrlResolver } from './git-url-resolver';
|
|
13
|
+
|
|
14
|
+
const resolveModule = new ContainerModule((bind: interfaces.Bind) => {
|
|
15
|
+
bind(GitUrlResolver).toSelf().inSingletonScope();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export { resolveModule };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
* Copyright (c) 2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
***********************************************************************/
|
|
10
|
+
|
|
11
|
+
import { Url } from './url';
|
|
12
|
+
|
|
13
|
+
export interface Resolver {
|
|
14
|
+
/**
|
|
15
|
+
* Validates the string url for belonging to a specific Git provider.
|
|
16
|
+
* @param url string representation of Url.
|
|
17
|
+
*/
|
|
18
|
+
isValid(url: string): boolean;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Resolves repository string URL to a {@class Url} object.
|
|
22
|
+
* @param url string representation of Url.
|
|
23
|
+
*/
|
|
24
|
+
resolve(url: string): Url;
|
|
25
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
* Copyright (c) 2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
***********************************************************************/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Url object
|
|
13
|
+
*/
|
|
14
|
+
export interface Url {
|
|
15
|
+
/**
|
|
16
|
+
* Provides RAW file content url
|
|
17
|
+
* @param path file path
|
|
18
|
+
*/
|
|
19
|
+
getContentUrl(path: string);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Provides repositories Url
|
|
23
|
+
*/
|
|
24
|
+
getUrl(): string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Provides Git clone url
|
|
28
|
+
*/
|
|
29
|
+
getCloneUrl(): string;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Provides repository name
|
|
33
|
+
*/
|
|
34
|
+
getRepoName(): string;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Provides branch name if initialised.
|
|
38
|
+
*/
|
|
39
|
+
getBranchName(): string;
|
|
40
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
* Copyright (c) 2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
***********************************************************************/
|
|
10
|
+
const TYPES = {
|
|
11
|
+
Resolver: Symbol.for('Resolver'),
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { TYPES };
|