@eclipse-che/che-devworkspace-generator 0.0.1-638fadc → 0.0.1-7f000bc

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 (66) hide show
  1. package/lib/bitbucket/bitbucket-module.d.ts +12 -0
  2. package/lib/bitbucket/bitbucket-module.js +21 -0
  3. package/lib/bitbucket/bitbucket-module.js.map +1 -0
  4. package/lib/bitbucket/bitbucket-resolver.d.ts +17 -0
  5. package/lib/bitbucket/bitbucket-resolver.js +56 -0
  6. package/lib/bitbucket/bitbucket-resolver.js.map +1 -0
  7. package/lib/bitbucket/bitbucket-url.d.ts +22 -0
  8. package/lib/bitbucket/bitbucket-url.js +38 -0
  9. package/lib/bitbucket/bitbucket-url.js.map +1 -0
  10. package/lib/bitbucket-server/bitbucket-server-module.d.ts +12 -0
  11. package/lib/bitbucket-server/bitbucket-server-module.js +21 -0
  12. package/lib/bitbucket-server/bitbucket-server-module.js.map +1 -0
  13. package/lib/bitbucket-server/bitbucket-server-resolver.d.ts +17 -0
  14. package/lib/bitbucket-server/bitbucket-server-resolver.js +64 -0
  15. package/lib/bitbucket-server/bitbucket-server-resolver.js.map +1 -0
  16. package/lib/bitbucket-server/bitbucket-server-url.d.ts +24 -0
  17. package/lib/bitbucket-server/bitbucket-server-url.js +43 -0
  18. package/lib/bitbucket-server/bitbucket-server-url.js.map +1 -0
  19. package/lib/generate.d.ts +1 -1
  20. package/lib/generate.js +24 -20
  21. package/lib/generate.js.map +1 -1
  22. package/lib/github/github-module.js +3 -1
  23. package/lib/github/github-module.js.map +1 -1
  24. package/lib/github/github-resolver.d.ts +6 -7
  25. package/lib/github/github-resolver.js +6 -3
  26. package/lib/github/github-resolver.js.map +1 -1
  27. package/lib/github/github-url.d.ts +2 -4
  28. package/lib/github/github-url.js +0 -3
  29. package/lib/github/github-url.js.map +1 -1
  30. package/lib/inversify/inversify-binding.js +6 -0
  31. package/lib/inversify/inversify-binding.js.map +1 -1
  32. package/lib/main.js +8 -8
  33. package/lib/main.js.map +1 -1
  34. package/lib/resolve/git-url-resolver.d.ts +5 -0
  35. package/lib/resolve/git-url-resolver.js +43 -0
  36. package/lib/resolve/git-url-resolver.js.map +1 -0
  37. package/lib/resolve/resolve-module.d.ts +12 -0
  38. package/lib/resolve/resolve-module.js +19 -0
  39. package/lib/resolve/resolve-module.js.map +1 -0
  40. package/lib/resolve/resolver.d.ts +22 -0
  41. package/lib/resolve/resolver.js +12 -0
  42. package/lib/resolve/resolver.js.map +1 -0
  43. package/lib/resolve/url.d.ts +35 -0
  44. package/lib/resolve/url.js +12 -0
  45. package/lib/resolve/url.js.map +1 -0
  46. package/lib/types.d.ts +13 -0
  47. package/lib/types.js +17 -0
  48. package/lib/types.js.map +1 -0
  49. package/package.json +1 -1
  50. package/src/bitbucket/bitbucket-module.ts +21 -0
  51. package/src/bitbucket/bitbucket-resolver.ts +46 -0
  52. package/src/bitbucket/bitbucket-url.ts +41 -0
  53. package/src/bitbucket-server/bitbucket-server-module.ts +21 -0
  54. package/src/bitbucket-server/bitbucket-server-resolver.ts +53 -0
  55. package/src/bitbucket-server/bitbucket-server-url.ts +51 -0
  56. package/src/generate.ts +30 -20
  57. package/src/github/github-module.ts +4 -1
  58. package/src/github/github-resolver.ts +13 -7
  59. package/src/github/github-url.ts +3 -4
  60. package/src/inversify/inversify-binding.ts +6 -0
  61. package/src/main.ts +8 -8
  62. package/src/resolve/git-url-resolver.ts +30 -0
  63. package/src/resolve/resolve-module.ts +18 -0
  64. package/src/resolve/resolver.ts +25 -0
  65. package/src/resolve/url.ts +40 -0
  66. 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,10 +23,14 @@ 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
 
@@ -73,7 +79,7 @@ export class Generate {
73
79
  const editorDevfile = jsYaml.load(editorContent);
74
80
 
75
81
  // transform it into a devWorkspace template
76
- const metadata = editorDevfile.metadata;
82
+ const metadata = this.createDevWorkspaceMetadata(editorDevfile);
77
83
  // add sufix
78
84
  metadata.name = `${metadata.name}-${suffix}`;
79
85
  delete editorDevfile.metadata;
@@ -86,7 +92,7 @@ export class Generate {
86
92
  };
87
93
 
88
94
  // transform it into a devWorkspace
89
- const devfileMetadata = devfile.metadata;
95
+ const devfileMetadata = this.createDevWorkspaceMetadata(devfile, true);
90
96
  const devfileCopy = Object.assign({}, devfile);
91
97
  delete devfileCopy.schemaVersion;
92
98
  delete devfileCopy.metadata;
@@ -118,24 +124,28 @@ export class Generate {
118
124
  suffix,
119
125
  };
120
126
 
121
- // grab container where to inject controller.devfile.io/merge-contribution attribute
122
- let devContainer: V1alpha2DevWorkspaceSpecTemplateComponents | undefined =
123
- await this.devContainerComponentFinder.find(context, injectDefaultComponent, defaultComponentImage);
127
+ // find devContainer component, add a default one if not found
128
+ await this.devContainerComponentFinder.find(context, injectDefaultComponent, defaultComponentImage);
124
129
 
125
- if (!devContainer) {
126
- return context;
127
- }
130
+ return context;
131
+ }
128
132
 
129
- // add attributes
130
- let devContainerAttributes = devContainer.attributes;
131
- if (!devContainerAttributes) {
132
- devContainerAttributes = {};
133
- devContainerAttributes[Generate.MERGE_CONTRIBUTION] = true;
134
- devContainer.attributes = devContainerAttributes;
135
- } else {
136
- devContainerAttributes[Generate.MERGE_CONTRIBUTION] = true;
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
+ };
137
147
  }
138
148
 
139
- return context;
149
+ return devWorkspaceMetadata;
140
150
  }
141
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(GithubResolver).toSelf().inSingletonScope();
18
+ bind(Resolver).to(GithubResolver).inSingletonScope();
16
19
  });
17
20
 
18
21
  export { githubModule };
@@ -10,17 +10,20 @@
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
- resolve(link: string): GithubUrl {
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}`);
@@ -28,13 +31,16 @@ export class GithubResolver {
28
31
  const scheme = this.getGroup(match, 'scheme');
29
32
  const hostName = this.getGroup(match, 'host');
30
33
  const repoUser = this.getGroup(match, 'repoUser');
31
- const repoName = this.getGroup(match, 'repoName');
34
+ let repoName = this.getGroup(match, 'repoName');
35
+ if (/^[\w-][\w.-]*?\.git$/.test(repoName)) {
36
+ repoName = repoName.substring(0, repoName.length - 4);
37
+ }
32
38
  const branchName = this.getGroup(match, 'branchName', 'HEAD');
33
39
  const subFolder = this.getGroup(match, 'subFolder');
34
40
  return new GithubUrl(scheme, hostName, repoUser, repoName, branchName, subFolder);
35
41
  }
36
42
 
37
- getGroup(match: RegExpExecArray, groupName: string, defaultValue?: string) {
43
+ private getGroup(match: RegExpExecArray, groupName: string, defaultValue?: string) {
38
44
  if (match.groups && match.groups[groupName]) {
39
45
  return match.groups[groupName];
40
46
  }
@@ -8,10 +8,9 @@
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 {
11
+ import { Url } from '../resolve/url';
12
+
13
+ export class GithubUrl implements Url {
15
14
  constructor(
16
15
  private readonly scheme: string,
17
16
  private readonly hostName: 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
@@ -11,13 +11,13 @@
11
11
  import * as axios from 'axios';
12
12
  import * as fs from 'fs-extra';
13
13
  import { Generate } from './generate';
14
- import { GithubResolver } from './github/github-resolver';
15
14
  import * as jsYaml from 'js-yaml';
16
15
  import { InversifyBinding } from './inversify/inversify-binding';
17
16
  import { UrlFetcher } from './fetch/url-fetcher';
18
17
  import { PluginRegistryResolver } from './plugin-registry/plugin-registry-resolver';
19
18
  import { V1alpha2DevWorkspaceSpecTemplate } from '@devfile/api';
20
19
  import { DevfileContext } from './api/devfile-context';
20
+ import { GitUrlResolver } from './resolve/git-url-resolver';
21
21
 
22
22
  export class Main {
23
23
  /**
@@ -69,12 +69,12 @@ export class Main {
69
69
  let devfileContent;
70
70
  let editorContent;
71
71
 
72
- // gets the github URL
72
+ // gets the repo URL
73
73
  if (params.devfileUrl) {
74
- const githubResolver = container.get(GithubResolver);
75
- const githubUrl = githubResolver.resolve(params.devfileUrl);
74
+ const resolver = container.get(GitUrlResolver);
75
+ const url = resolver.resolve(params.devfileUrl);
76
76
  // user devfile
77
- devfileContent = await container.get(UrlFetcher).fetchText(githubUrl.getContentUrl('devfile.yaml'));
77
+ devfileContent = await container.get(UrlFetcher).fetchText(url.getContentUrl('devfile.yaml'));
78
78
 
79
79
  // load content
80
80
  const devfileParsed = jsYaml.load(devfileContent);
@@ -84,10 +84,10 @@ export class Main {
84
84
  // no, so add the current project being cloned
85
85
  devfileParsed.projects = [
86
86
  {
87
- name: githubUrl.getRepoName(),
87
+ name: url.getRepoName(),
88
88
  git: {
89
- remotes: { origin: githubUrl.getCloneUrl() },
90
- checkoutFrom: { revision: githubUrl.getBranchName() },
89
+ remotes: { origin: url.getCloneUrl() },
90
+ checkoutFrom: { revision: url.getBranchName() },
91
91
  },
92
92
  },
93
93
  ];
@@ -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 };