@backstage/plugin-catalog-backend-module-github 0.12.3-next.0 → 0.13.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,53 @@
1
1
  # @backstage/plugin-catalog-backend-module-github
2
2
 
3
+ ## 0.13.0-next.1
4
+
5
+ ### Minor Changes
6
+
7
+ - b11c2cd: The default user transformer now prefers organization verified domain emails over the user's public GitHub email when populating the user entity profile. It also strips plus-addressed routing tags that GitHub adds to these emails.
8
+
9
+ If you want to retain the old behavior, you can do so with a custom user transformer using the `githubOrgEntityProviderTransformsExtensionPoint`:
10
+
11
+ ```ts
12
+ import { createBackendModule } from '@backstage/backend-plugin-api';
13
+ import { githubOrgEntityProviderTransformsExtensionPoint } from '@backstage/plugin-catalog-backend-module-github-org';
14
+ import { defaultUserTransformer } from '@backstage/plugin-catalog-backend-module-github';
15
+
16
+ export default createBackendModule({
17
+ pluginId: 'catalog',
18
+ moduleId: 'github-org-custom-transforms',
19
+ register(env) {
20
+ env.registerInit({
21
+ deps: {
22
+ transforms: githubOrgEntityProviderTransformsExtensionPoint,
23
+ },
24
+ async init({ transforms }) {
25
+ transforms.setUserTransformer(async (item, ctx) => {
26
+ const entity = await defaultUserTransformer(item, ctx);
27
+ if (entity && item.email) {
28
+ entity.spec.profile!.email = item.email;
29
+ }
30
+ return entity;
31
+ });
32
+ },
33
+ });
34
+ },
35
+ });
36
+ ```
37
+
38
+ ### Patch Changes
39
+
40
+ - Updated dependencies
41
+ - @backstage/integration@2.0.0-next.1
42
+ - @backstage/plugin-catalog-node@2.1.0-next.1
43
+ - @backstage/backend-plugin-api@1.7.1-next.0
44
+ - @backstage/catalog-model@1.7.6
45
+ - @backstage/config@1.3.6
46
+ - @backstage/errors@1.2.7
47
+ - @backstage/types@1.2.2
48
+ - @backstage/plugin-catalog-common@1.1.8
49
+ - @backstage/plugin-events-node@0.4.20-next.0
50
+
3
51
  ## 0.12.3-next.0
4
52
 
5
53
  ### Patch Changes
@@ -20,7 +20,8 @@ const defaultUserTransformer = async (item, _ctx) => {
20
20
  };
21
21
  if (item.bio) entity.metadata.description = item.bio;
22
22
  if (item.name) entity.spec.profile.displayName = item.name;
23
- if (item.email) entity.spec.profile.email = item.email;
23
+ const email = item.organizationVerifiedDomainEmails?.length ? item.organizationVerifiedDomainEmails[0].replace(/\+[^@]*/, "") : item.email;
24
+ if (email) entity.spec.profile.email = email;
24
25
  if (item.avatarUrl) entity.spec.profile.picture = item.avatarUrl;
25
26
  return entity;
26
27
  };
@@ -1 +1 @@
1
- {"version":3,"file":"defaultTransformers.cjs.js","sources":["../../src/lib/defaultTransformers.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity, GroupEntity, UserEntity } from '@backstage/catalog-model';\nimport { graphql } from '@octokit/graphql';\nimport {\n ANNOTATION_GITHUB_TEAM_SLUG,\n ANNOTATION_GITHUB_USER_LOGIN,\n ANNOTATION_GITHUB_USER_ID,\n} from './annotation';\nimport { GithubTeam, GithubUser } from './github';\n\n/**\n * Context passed to Transformers\n *\n * @public\n */\nexport interface TransformerContext {\n client: typeof graphql;\n query: string;\n org: string;\n}\n\n/**\n * Transformer for GitHub users to an Entity\n *\n * @public\n */\nexport type UserTransformer = (\n item: GithubUser,\n ctx: TransformerContext,\n) => Promise<Entity | undefined>;\n\n/**\n * Transformer for GitHub Team to an Entity\n *\n * @public\n */\nexport type TeamTransformer = (\n item: GithubTeam,\n ctx: TransformerContext,\n) => Promise<Entity | undefined>;\n\n/**\n * Default transformer for GitHub users to UserEntity\n *\n * @public\n */\nexport const defaultUserTransformer = async (\n item: GithubUser,\n _ctx: TransformerContext,\n): Promise<UserEntity | undefined> => {\n const entity: UserEntity = {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'User',\n metadata: {\n name: item.login,\n annotations: {\n [ANNOTATION_GITHUB_USER_LOGIN]: item.login,\n ...(item.id && { [ANNOTATION_GITHUB_USER_ID]: item.id }),\n },\n },\n spec: {\n profile: {},\n memberOf: [],\n },\n };\n\n if (item.bio) entity.metadata.description = item.bio;\n if (item.name) entity.spec.profile!.displayName = item.name;\n if (item.email) entity.spec.profile!.email = item.email;\n if (item.avatarUrl) entity.spec.profile!.picture = item.avatarUrl;\n return entity;\n};\n\n/**\n * Default transformer for GitHub Team to GroupEntity\n *\n * @public\n */\nexport const defaultOrganizationTeamTransformer: TeamTransformer =\n async team => {\n const annotations: { [annotationName: string]: string } = {\n [ANNOTATION_GITHUB_TEAM_SLUG]: team.combinedSlug,\n };\n\n if (team.editTeamUrl) {\n annotations['backstage.io/edit-url'] = team.editTeamUrl;\n }\n\n const entity: GroupEntity = {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Group',\n metadata: {\n name: team.slug,\n annotations,\n },\n spec: {\n type: 'team',\n profile: {},\n children: [],\n },\n };\n\n if (team.description) {\n entity.metadata.description = team.description;\n }\n if (team.name) {\n entity.spec.profile!.displayName = team.name;\n }\n if (team.avatarUrl) {\n entity.spec.profile!.picture = team.avatarUrl;\n }\n if (team.parentTeam) {\n entity.spec.parent = team.parentTeam.slug;\n }\n\n entity.spec.members = team.members.map(user => user.login);\n\n return entity;\n };\n"],"names":["ANNOTATION_GITHUB_USER_LOGIN","ANNOTATION_GITHUB_USER_ID","ANNOTATION_GITHUB_TEAM_SLUG"],"mappings":";;;;AA6DO,MAAM,sBAAA,GAAyB,OACpC,IAAA,EACA,IAAA,KACoC;AACpC,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,UAAA,EAAY,uBAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,WAAA,EAAa;AAAA,QACX,CAACA,uCAA4B,GAAG,IAAA,CAAK,KAAA;AAAA,QACrC,GAAI,KAAK,EAAA,IAAM,EAAE,CAACC,oCAAyB,GAAG,KAAK,EAAA;AAAG;AACxD,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAS,EAAC;AAAA,MACV,UAAU;AAAC;AACb,GACF;AAEA,EAAA,IAAI,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAA,CAAS,cAAc,IAAA,CAAK,GAAA;AACjD,EAAA,IAAI,KAAK,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,cAAc,IAAA,CAAK,IAAA;AACvD,EAAA,IAAI,KAAK,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,QAAQ,IAAA,CAAK,KAAA;AAClD,EAAA,IAAI,KAAK,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,UAAU,IAAA,CAAK,SAAA;AACxD,EAAA,OAAO,MAAA;AACT;AAOO,MAAM,kCAAA,GACX,OAAM,IAAA,KAAQ;AACZ,EAAA,MAAM,WAAA,GAAoD;AAAA,IACxD,CAACC,sCAA2B,GAAG,IAAA,CAAK;AAAA,GACtC;AAEA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,WAAA,CAAY,uBAAuB,IAAI,IAAA,CAAK,WAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,UAAA,EAAY,uBAAA;AAAA,IACZ,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,IAAA,CAAK,IAAA;AAAA,MACX;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,EAAC;AAAA,MACV,UAAU;AAAC;AACb,GACF;AAEA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,QAAA,CAAS,cAAc,IAAA,CAAK,WAAA;AAAA,EACrC;AACA,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,WAAA,GAAc,IAAA,CAAK,IAAA;AAAA,EAC1C;AACA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,OAAA,GAAU,IAAA,CAAK,SAAA;AAAA,EACtC;AACA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,EACvC;AAEA,EAAA,MAAA,CAAO,KAAK,OAAA,GAAU,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA;AAEzD,EAAA,OAAO,MAAA;AACT;;;;;"}
1
+ {"version":3,"file":"defaultTransformers.cjs.js","sources":["../../src/lib/defaultTransformers.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity, GroupEntity, UserEntity } from '@backstage/catalog-model';\nimport { graphql } from '@octokit/graphql';\nimport {\n ANNOTATION_GITHUB_TEAM_SLUG,\n ANNOTATION_GITHUB_USER_LOGIN,\n ANNOTATION_GITHUB_USER_ID,\n} from './annotation';\nimport { GithubTeam, GithubUser } from './github';\n\n/**\n * Context passed to Transformers\n *\n * @public\n */\nexport interface TransformerContext {\n client: typeof graphql;\n query: string;\n org: string;\n}\n\n/**\n * Transformer for GitHub users to an Entity\n *\n * @public\n */\nexport type UserTransformer = (\n item: GithubUser,\n ctx: TransformerContext,\n) => Promise<Entity | undefined>;\n\n/**\n * Transformer for GitHub Team to an Entity\n *\n * @public\n */\nexport type TeamTransformer = (\n item: GithubTeam,\n ctx: TransformerContext,\n) => Promise<Entity | undefined>;\n\n/**\n * Default transformer for GitHub users to UserEntity\n *\n * @public\n */\nexport const defaultUserTransformer = async (\n item: GithubUser,\n _ctx: TransformerContext,\n): Promise<UserEntity | undefined> => {\n const entity: UserEntity = {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'User',\n metadata: {\n name: item.login,\n annotations: {\n [ANNOTATION_GITHUB_USER_LOGIN]: item.login,\n ...(item.id && { [ANNOTATION_GITHUB_USER_ID]: item.id }),\n },\n },\n spec: {\n profile: {},\n memberOf: [],\n },\n };\n\n if (item.bio) entity.metadata.description = item.bio;\n if (item.name) entity.spec.profile!.displayName = item.name;\n // GitHub returns verified domain emails as plus-addressed routing aliases\n // (e.g. user+abc123@example.com). Strip the tag to get the real address.\n const email = item.organizationVerifiedDomainEmails?.length\n ? item.organizationVerifiedDomainEmails[0].replace(/\\+[^@]*/, '')\n : item.email;\n if (email) entity.spec.profile!.email = email;\n if (item.avatarUrl) entity.spec.profile!.picture = item.avatarUrl;\n return entity;\n};\n\n/**\n * Default transformer for GitHub Team to GroupEntity\n *\n * @public\n */\nexport const defaultOrganizationTeamTransformer: TeamTransformer =\n async team => {\n const annotations: { [annotationName: string]: string } = {\n [ANNOTATION_GITHUB_TEAM_SLUG]: team.combinedSlug,\n };\n\n if (team.editTeamUrl) {\n annotations['backstage.io/edit-url'] = team.editTeamUrl;\n }\n\n const entity: GroupEntity = {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Group',\n metadata: {\n name: team.slug,\n annotations,\n },\n spec: {\n type: 'team',\n profile: {},\n children: [],\n },\n };\n\n if (team.description) {\n entity.metadata.description = team.description;\n }\n if (team.name) {\n entity.spec.profile!.displayName = team.name;\n }\n if (team.avatarUrl) {\n entity.spec.profile!.picture = team.avatarUrl;\n }\n if (team.parentTeam) {\n entity.spec.parent = team.parentTeam.slug;\n }\n\n entity.spec.members = team.members.map(user => user.login);\n\n return entity;\n };\n"],"names":["ANNOTATION_GITHUB_USER_LOGIN","ANNOTATION_GITHUB_USER_ID","ANNOTATION_GITHUB_TEAM_SLUG"],"mappings":";;;;AA6DO,MAAM,sBAAA,GAAyB,OACpC,IAAA,EACA,IAAA,KACoC;AACpC,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,UAAA,EAAY,uBAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,WAAA,EAAa;AAAA,QACX,CAACA,uCAA4B,GAAG,IAAA,CAAK,KAAA;AAAA,QACrC,GAAI,KAAK,EAAA,IAAM,EAAE,CAACC,oCAAyB,GAAG,KAAK,EAAA;AAAG;AACxD,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAS,EAAC;AAAA,MACV,UAAU;AAAC;AACb,GACF;AAEA,EAAA,IAAI,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAA,CAAS,cAAc,IAAA,CAAK,GAAA;AACjD,EAAA,IAAI,KAAK,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,cAAc,IAAA,CAAK,IAAA;AAGvD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gCAAA,EAAkC,MAAA,GACjD,IAAA,CAAK,gCAAA,CAAiC,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,GAC9D,IAAA,CAAK,KAAA;AACT,EAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,KAAA,GAAQ,KAAA;AACxC,EAAA,IAAI,KAAK,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,UAAU,IAAA,CAAK,SAAA;AACxD,EAAA,OAAO,MAAA;AACT;AAOO,MAAM,kCAAA,GACX,OAAM,IAAA,KAAQ;AACZ,EAAA,MAAM,WAAA,GAAoD;AAAA,IACxD,CAACC,sCAA2B,GAAG,IAAA,CAAK;AAAA,GACtC;AAEA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,WAAA,CAAY,uBAAuB,IAAI,IAAA,CAAK,WAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,UAAA,EAAY,uBAAA;AAAA,IACZ,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,IAAA,CAAK,IAAA;AAAA,MACX;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,EAAC;AAAA,MACV,UAAU;AAAC;AACb,GACF;AAEA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,QAAA,CAAS,cAAc,IAAA,CAAK,WAAA;AAAA,EACrC;AACA,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,WAAA,GAAc,IAAA,CAAK,IAAA;AAAA,EAC1C;AACA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAS,OAAA,GAAU,IAAA,CAAK,SAAA;AAAA,EACtC;AACA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,EACvC;AAEA,EAAA,MAAA,CAAO,KAAK,OAAA,GAAU,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA;AAEzD,EAAA,OAAO,MAAA;AACT;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-backend-module-github",
3
- "version": "0.12.3-next.0",
3
+ "version": "0.13.0-next.1",
4
4
  "description": "A Backstage catalog backend module that helps integrate towards GitHub",
5
5
  "backstage": {
6
6
  "role": "backend-plugin-module",
@@ -69,9 +69,9 @@
69
69
  "@backstage/catalog-model": "1.7.6",
70
70
  "@backstage/config": "1.3.6",
71
71
  "@backstage/errors": "1.2.7",
72
- "@backstage/integration": "1.21.0-next.0",
72
+ "@backstage/integration": "2.0.0-next.1",
73
73
  "@backstage/plugin-catalog-common": "1.1.8",
74
- "@backstage/plugin-catalog-node": "2.1.0-next.0",
74
+ "@backstage/plugin-catalog-node": "2.1.0-next.1",
75
75
  "@backstage/plugin-events-node": "0.4.20-next.0",
76
76
  "@backstage/types": "1.2.2",
77
77
  "@octokit/auth-callback": "^5.0.0",
@@ -87,12 +87,12 @@
87
87
  "uuid": "^11.0.0"
88
88
  },
89
89
  "devDependencies": {
90
- "@backstage/backend-defaults": "0.15.3-next.0",
91
- "@backstage/backend-test-utils": "1.11.1-next.0",
92
- "@backstage/cli": "0.35.5-next.0",
93
- "@backstage/plugin-catalog-backend": "3.5.0-next.0",
94
- "@backstage/plugin-events-backend": "0.5.12-next.0",
95
- "@backstage/plugin-events-backend-module-github": "0.4.10-next.0",
90
+ "@backstage/backend-defaults": "0.16.0-next.1",
91
+ "@backstage/backend-test-utils": "1.11.1-next.1",
92
+ "@backstage/cli": "0.36.0-next.1",
93
+ "@backstage/plugin-catalog-backend": "3.5.0-next.1",
94
+ "@backstage/plugin-events-backend": "0.6.0-next.1",
95
+ "@backstage/plugin-events-backend-module-github": "0.4.10-next.1",
96
96
  "@backstage/plugin-events-backend-module-google-pubsub": "0.2.1-next.0",
97
97
  "@types/lodash": "^4.14.151",
98
98
  "msw": "^2.0.0",