@solo.io/platform-portal-backstage-plugin-backend 0.0.25 → 0.0.27

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 CHANGED
@@ -13,41 +13,60 @@ This plugin will create the following Backstage catalog entities and relate them
13
13
 
14
14
  1. Install the plugin to your backstage instance:
15
15
 
16
+ > ⚠️ Projects that use an older version of Backstage (prior to `v1.27.0`) should use [@solo.io/platform-portal-backstage-plugin-backend@0.0.25](https://www.npmjs.com/package/@solo.io/platform-portal-backstage-plugin-backend/v/0.0.25).
17
+
16
18
  ```shell
17
19
  yarn add --cwd ./packages/backend @solo.io/platform-portal-backstage-plugin-backend
18
20
  ```
19
21
 
20
- 2. Update your backend plugin in `packages/backend/src/plugins/catalog.ts` with the following code. The parts that you will need to update should similar to what is described in the Backstage docs [here](https://backstage.io/docs/features/software-catalog/external-integrations/#installing-the-provider). **Make sure to add the code above and below the `await processingEngine.start();` lines**:
22
+ 2. Update your backend plugin in `packages/backend/src/index.ts` with the following code. The parts that you will need to update should similar to what is described in the Backstage docs [here](https://backstage.io/docs/features/software-catalog/external-integrations/#new-backend-system). The lines to create the backend variable and start the backend should already exist, and are included here as a frame of reference.
21
23
 
22
24
  ```ts
23
25
  // ...
24
- // -> Import the plugin.
26
+ // -> 1. Add the imports in.
27
+ import {
28
+ coreServices,
29
+ createBackendModule,
30
+ } from '@backstage/backend-plugin-api';
31
+ import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
25
32
  import { GlooPlatformPortalProvider } from '@solo.io/platform-portal-backstage-plugin-backend';
33
+
34
+ // -> 2. Create the provider for our plugin.
35
+ export const catalogGlooPlatformPortalBackendProvider = createBackendModule({
36
+ pluginId: 'catalog',
37
+ moduleId: 'gloo-platform-portal-backend-provider',
38
+ register(env) {
39
+ env.registerInit({
40
+ deps: {
41
+ catalog: catalogProcessingExtensionPoint,
42
+ logger: coreServices.logger,
43
+ config: coreServices.rootConfig,
44
+ scheduler: coreServices.scheduler,
45
+ },
46
+ async init({ catalog, logger, config, scheduler }) {
47
+ catalog.addEntityProvider(
48
+ new GlooPlatformPortalProvider(logger, config, scheduler),
49
+ );
50
+ },
51
+ });
52
+ },
53
+ });
54
+
55
+ // -> 3. Create the backend (this line should already exist).
56
+ const backend = createBackend();
57
+
26
58
  // ...
27
- export default async function createPlugin(
28
- env: PluginEnvironment,
29
- // ...
30
- ): Promise<Router> {
31
- // ...
32
-
33
- // -> Instantiate the plugin provider.
34
- const gppp = new GlooPlatformPortalProvider(
35
- 'production',
36
- env.logger,
37
- env.config,
38
- );
39
- // -> Add the plugin provider to the catalog builder.
40
- builder.addEntityProvider(gppp);
41
-
42
- // (These lines will be there, added by Backstage)
43
- const { processingEngine, router } = await builder.build();
44
- await processingEngine.start();
45
-
46
- // -> Start the scheduled update interval after the processing engine starts.
47
- await gppp.startScheduler(env.scheduler);
48
-
49
- //...
50
- }
59
+ // Other packages are added here.
60
+ // ...
61
+
62
+ // Add the @backstage/plugin-catalog-backend/alpha (this line should already exist).
63
+ backend.add(import('@backstage/plugin-catalog-backend/alpha'));
64
+
65
+ // -> 4. Add our provider to the backend.
66
+ backend.add(catalogGlooPlatformPortalBackendProvider);
67
+
68
+ // -> 5. The backend is started (this line should already exist).
69
+ backend.start();
51
70
  ```
52
71
 
53
72
  3. Update the `app-config.local` file for your backstage instance to include the following values, which should match your authorization server deployment:
@@ -75,6 +94,8 @@ glooPlatformPortal:
75
94
  milliseconds: 0
76
95
  ```
77
96
 
97
+ > &#x26a0;&#xfe0f; For Keycloak users, make sure the OIDC type is set to "confidential" on your client's settings page. On newer Keycloak versions, this is done by checking the "Client authentication" and "Service accounts roles" checkboxes. Older Keycloak versions have an "Access Type" dropdown that should be set to "Confidential", and a "Service Accounts Enabled" toggle button that must be enabled.
98
+
78
99
  ## Demo Image
79
100
 
80
101
  Solo.io provides a demo Backstage image with the `@solo.io/platform-portal-backstage-plugin-backend` package installed. It contains an `app-config.yaml` file which can be configured using Docker environment variables.
@@ -95,7 +116,9 @@ docker run \
95
116
  -d postgres:bookworm &
96
117
  ```
97
118
 
98
- Then run the Backstage example app, replacing any environment variables as-needed. This example uses gcr.io/solo-public/docs/portal-backstage-backend:latest, but you can check the GitHub release versions [here](https://github.com/solo-io/platform-portal-backstage-plugin-backend/releases). `host.docker.internal`.
119
+ Then run the Backstage example app, replacing any environment variables as-needed. This example uses `gcr.io/solo-public/docs/portal-backstage-backend:latest`, but you can check the GitHub release versions [here](https://github.com/solo-io/platform-portal-backstage-plugin-backend/releases).
120
+
121
+ > &#x26a0;&#xfe0f; For an older version of Backstage (prior to v1.27.0), you can use `gcr.io/solo-public/docs/portal-backstage-backend:legacy-backstage-backend`.
99
122
 
100
123
  ```sh
101
124
  docker run \
package/dist/index.cjs.js CHANGED
@@ -1,12 +1,10 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var fetch = require('node-fetch');
6
4
 
7
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
5
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
8
6
 
9
- var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);
7
+ var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
10
8
 
11
9
  const getPortalServerUrl = (logErr, _, config) => {
12
10
  if (!config) {
@@ -91,13 +89,7 @@ async function doAccessTokenRequest(grantType, tokenEndpoint, clientId, clientSe
91
89
  formData.grant_type = grantType;
92
90
  formData.client_id = clientId;
93
91
  formData.client_secret = clientSecret;
94
- if (grantType === "refresh_token") {
95
- if (!refreshToken) {
96
- return void 0;
97
- }
98
- formData.refresh_token = refreshToken;
99
- }
100
- const rawRes = await fetch__default["default"](tokenEndpoint, {
92
+ const rawRes = await fetch__default.default(tokenEndpoint, {
101
93
  headers: {
102
94
  "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
103
95
  },
@@ -155,25 +147,33 @@ class GlooPlatformPortalProvider {
155
147
  //
156
148
  // 1. Init class
157
149
  //
158
- constructor(env, logger, config) {
159
- __publicField(this, "env");
150
+ constructor(logger, config, scheduler) {
160
151
  __publicField(this, "connection");
161
152
  __publicField(this, "logger");
162
153
  __publicField(this, "config");
163
154
  __publicField(this, "latestTokensResponse");
164
155
  __publicField(this, "debugLogging", false);
165
- __publicField(this, "log", (s) => this.logger.info(`gloo-platform-portal: ${s}`));
166
- __publicField(this, "warn", (s) => this.logger.warn(`gloo-platform-portal: ${s}`));
167
- __publicField(this, "error", (s) => this.logger.error(`gloo-platform-portal: ${s}`));
168
- __publicField(this, "getProviderName", () => `gloo-platform-portal-${this.env}`);
169
- this.env = env;
156
+ __publicField(this, "log", (s) => {
157
+ var _a;
158
+ return (_a = this.logger) == null ? void 0 : _a.info(`gloo-platform-portal: ${s}`);
159
+ });
160
+ __publicField(this, "warn", (s) => {
161
+ var _a;
162
+ return (_a = this.logger) == null ? void 0 : _a.warn(`gloo-platform-portal: ${s}`);
163
+ });
164
+ __publicField(this, "error", (s) => {
165
+ var _a;
166
+ return (_a = this.logger) == null ? void 0 : _a.error(`gloo-platform-portal: ${s}`);
167
+ });
168
+ __publicField(this, "getProviderName", () => `gloo-platform-portal-backend-provider`);
169
+ var _a;
170
170
  this.logger = logger;
171
171
  this.config = config;
172
- this.debugLogging = !!config.getOptionalBoolean(
172
+ this.debugLogging = !!((_a = this.config) == null ? void 0 : _a.getOptionalBoolean(
173
173
  "glooPlatformPortal.backend.debugLogging"
174
- );
174
+ ));
175
175
  this.log("Initializing GlooPlatformPortalProvider.");
176
- this.startTokensRequests();
176
+ this.startTokensRequests().then(() => this.startScheduler(scheduler));
177
177
  }
178
178
  async connect(connection) {
179
179
  this.connection = connection;
@@ -232,14 +232,18 @@ class GlooPlatformPortalProvider {
232
232
  *
233
233
  * 3. Schedule sync.
234
234
  *
235
- * This is called during setup, and passes the user config into the
235
+ * This passes the user config into the
236
236
  * Backstage plugin task scheduler.
237
237
  * */
238
238
  async startScheduler(scheduler) {
239
- const frequency = this.config.getOptionalConfig(
239
+ var _a, _b;
240
+ if (this.debugLogging) {
241
+ this.log("Scheduling backstage catalog sync.");
242
+ }
243
+ const frequency = (_a = this.config) == null ? void 0 : _a.getOptionalConfig(
240
244
  "glooPlatformPortal.backend.syncFrequency"
241
245
  );
242
- const timeout = this.config.getOptionalConfig(
246
+ const timeout = (_b = this.config) == null ? void 0 : _b.getOptionalConfig(
243
247
  "glooPlatformPortal.backend.syncTimeout"
244
248
  );
245
249
  await scheduler.scheduleTask({
@@ -293,7 +297,7 @@ class GlooPlatformPortalProvider {
293
297
  `Fetching APIs from ${fullRequestURI} with header: "Authorization: Bearer ${this.latestTokensResponse.access_token}"`
294
298
  );
295
299
  }
296
- const res = await fetch__default["default"](fullRequestURI, {
300
+ const res = await fetch__default.default(fullRequestURI, {
297
301
  headers: {
298
302
  Authorization: `Bearer ${this.latestTokensResponse.access_token}`
299
303
  }
@@ -343,7 +347,7 @@ class GlooPlatformPortalProvider {
343
347
  const apiVersion = processedAPIs[i];
344
348
  let schema = apiVersion.openapiSpec;
345
349
  if (!schema && !apiVersion.openapiSpecFetchErr) {
346
- const schemaRes = await fetch__default["default"](
350
+ const schemaRes = await fetch__default.default(
347
351
  `${apisEndpoint}/${apiVersion.apiId}/schema`,
348
352
  {
349
353
  headers: {
@@ -392,7 +396,7 @@ class GlooPlatformPortalProvider {
392
396
  )}`
393
397
  );
394
398
  }
395
- const locationKey = `gloo-platform-portal-provider:${this.env}`;
399
+ const locationKey = `gloo-platform-portal-provider`;
396
400
  await this.connection.applyMutation({
397
401
  type: "full",
398
402
  entities: [
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/provider/configHelpers.ts","../src/provider/utility.ts","../src/provider/GlooPlatformPortalProvider.ts"],"sourcesContent":["import { Config } from '@backstage/config';\n\ntype logFn = (s: string) => any;\n\nexport const getPortalServerUrl = (logErr: logFn, _: logFn, config: Config) => {\n if (!config) {\n logErr('No backstage config found when getting portal server url.');\n return '';\n }\n let value = config.getOptionalString(\n 'glooPlatformPortal.backend.portalServerUrl',\n );\n // Remove trailing slash if supplied.\n if (!!value && value.at(-1) === '/')\n value = value.substring(0, value.length - 1);\n return value ?? 'http://localhost:31080/v1';\n};\n\nexport const getClientSecret = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client secret.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.clientSecret',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientSecret found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getClientId = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client id.');\n return '';\n }\n const value = config.getOptionalString('glooPlatformPortal.backend.clientId');\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientId found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getTokenEndpoint = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting token endpoint.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.tokenEndpoint',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.tokenEndpoint found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n","import fetch from 'node-fetch';\nimport { AccessTokensResponse } from './api-types';\n\nexport function parseJwt(token: string) {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(c => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)\n .join(''),\n );\n return JSON.parse(jsonPayload);\n}\n\nexport function objectToUrlFormEncodedPayload(\n requestJSON: Record<string, string>,\n) {\n const formBodyPieces = [] as string[];\n for (const property in requestJSON) {\n if (!requestJSON.hasOwnProperty(property)) continue;\n const encodedKey = encodeURIComponent(property);\n const encodedValue = encodeURIComponent(\n requestJSON[property as keyof typeof requestJSON],\n );\n formBodyPieces.push(`${encodedKey}=${encodedValue}`);\n }\n const formBodyString = formBodyPieces.join('&');\n return formBodyString;\n}\n\nexport async function doAccessTokenRequest(\n grantType: 'refresh_token' | 'client_credentials',\n tokenEndpoint: string,\n clientId: string,\n clientSecret: string,\n refreshToken?: string,\n) {\n const formData = {} as Record<string, string>;\n //\n // Build the request payload for a new oauth access token.\n //\n formData.grant_type = grantType;\n formData.client_id = clientId;\n formData.client_secret = clientSecret;\n if (grantType === 'refresh_token') {\n if (!refreshToken) {\n return undefined;\n }\n formData.refresh_token = refreshToken;\n }\n //\n // Make the request\n //\n const rawRes = await fetch(tokenEndpoint, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n },\n method: 'POST',\n body: objectToUrlFormEncodedPayload(formData),\n });\n let resJSON: any;\n try {\n resJSON = await rawRes.json();\n } catch {\n throw new Error('Error parsing oauth response.');\n }\n if (!!resJSON.error_description) {\n throw new Error(resJSON.error_description);\n }\n if (!!resJSON.error) {\n throw new Error(resJSON.error);\n }\n //\n // Check for the access token in the response.\n //\n if (!resJSON.access_token) {\n throw new Error(\n \"No 'access_token' property was found in the oauth response body.\",\n );\n }\n return resJSON as AccessTokensResponse;\n}\n\n//\n// From: https://backstage.io/docs/features/software-catalog/descriptor-format\n//\nconst sanitizeRegex = {\n // Each tag must be sequences of [a-z0-9:+#] separated by -, at most 63 characters in total\n tag: /[a-z]|[0-9]|\\:|\\+|\\#|\\-/,\n // Strings of length at least 1, and at most 63\n // Must consist of sequences of [a-z0-9A-Z] possibly separated by one of [-_.].\n name: /[a-z]|[0-9]|[A-Z]|\\-|\\_|\\./,\n // Namespaces must be sequences of [a-zA-Z0-9], possibly separated by -, at most 63 characters in total.\n namespace: /[a-z]|[0-9]|[A-Z]|\\-/,\n};\n\n/**\n * Sanitizes a string before adding it to a backstage entity.\n */\nexport const sanitizeStringForEntity = (\n propertyType: keyof typeof sanitizeRegex,\n propertyValue: string,\n) => {\n return propertyValue\n .split('')\n .map(ch => (!sanitizeRegex[propertyType].test(ch) ? '-' : ch))\n .reduce(\n (prev, cur) =>\n // Don't go over 63 characters.\n prev.length >= 62\n ? prev\n : // Don't repeat \"-\"\n prev.at(-1) === '-' && cur === '-'\n ? prev\n : prev + cur,\n '',\n );\n};\n","import { Entity, EntityMeta } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\n\nimport { PluginTaskScheduler } from '@backstage/backend-tasks';\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\nimport fetch from 'node-fetch';\nimport * as winston from 'winston';\nimport { API, APIProduct, APISchema, AccessTokensResponse } from './api-types';\nimport {\n getClientId,\n getClientSecret,\n getPortalServerUrl,\n getTokenEndpoint,\n} from './configHelpers';\nimport {\n doAccessTokenRequest,\n parseJwt,\n sanitizeStringForEntity,\n} from './utility';\n\n/**\n * Provides API entities from the Gloo Platform Portal REST server.\n */\nexport class GlooPlatformPortalProvider implements EntityProvider {\n private readonly env: string;\n private connection?: EntityProviderConnection;\n private logger: winston.Logger;\n private config: Config;\n private latestTokensResponse?: AccessTokensResponse;\n private debugLogging = false;\n\n log = (s: string) => this.logger.info(`gloo-platform-portal: ${s}`);\n warn = (s: string) => this.logger.warn(`gloo-platform-portal: ${s}`);\n error = (s: string) => this.logger.error(`gloo-platform-portal: ${s}`);\n getProviderName = () => `gloo-platform-portal-${this.env}`;\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n }\n\n //\n // 1. Init class\n //\n constructor(env: string, logger: winston.Logger, config: Config) {\n this.env = env;\n this.logger = logger;\n this.config = config;\n // Default extra debug-logging to false\n this.debugLogging = !!config.getOptionalBoolean(\n 'glooPlatformPortal.backend.debugLogging',\n );\n this.log('Initializing GlooPlatformPortalProvider.');\n this.startTokensRequests();\n }\n\n //\n // 2. Get access_token\n //\n async startTokensRequests() {\n //\n // Make the initial request for the access_token.\n if (this.debugLogging) {\n this.log('Making the initial access_token request.');\n }\n if (!this.config) {\n this.error(\n 'Backstage config object not found when doing access token request.',\n );\n return;\n }\n const res = await doAccessTokenRequest(\n 'client_credentials',\n getTokenEndpoint(this.error, this.warn, this.config),\n getClientId(this.error, this.warn, this.config),\n getClientSecret(this.error, this.warn, this.config),\n );\n this.latestTokensResponse = res;\n if (!this.latestTokensResponse) {\n // If there's a problem, wait to restart the access token\n // requests so as to not overload the auth server.\n this.warn('No latest access token. Re-requesting the access_token.');\n setTimeout(this.startTokensRequests.bind(this), 5000);\n return;\n }\n if (this.debugLogging) {\n this.log('Got the access_token.');\n }\n //\n // Parse the access_token JWT to find when it expires.\n const parsedToken = parseJwt(this.latestTokensResponse.access_token);\n if (!parsedToken.exp) {\n this.warn('No `exp` property found in the access_token JWT.');\n }\n const nowDate = new Date();\n const expiresDate = new Date(parsedToken.exp * 1000);\n const millisUntilExpires = expiresDate.getTime() - nowDate.getTime();\n if (millisUntilExpires <= 0) {\n this.warn('access token is expired!');\n this.latestTokensResponse = undefined;\n return;\n }\n if (this.debugLogging) {\n this.log('Setting a timeout to get the next access token.');\n }\n // Set the timeout to request new tokens.\n setTimeout(\n this.startTokensRequests.bind(this),\n // Don't make this request more than once a second,\n // and do the refresh 5 seconds early.\n Math.max(1000, millisUntilExpires - 5000),\n );\n }\n\n /**\n *\n * 3. Schedule sync.\n *\n * This is called during setup, and passes the user config into the\n * Backstage plugin task scheduler.\n * */\n async startScheduler(scheduler: PluginTaskScheduler) {\n const frequency = this.config.getOptionalConfig(\n 'glooPlatformPortal.backend.syncFrequency',\n );\n const timeout = this.config.getOptionalConfig(\n 'glooPlatformPortal.backend.syncTimeout',\n );\n await scheduler.scheduleTask({\n id: 'run_gloo_platform_portal_refresh',\n fn: async () => {\n await this.run();\n },\n frequency: !!frequency\n ? {\n hours: frequency.getOptionalNumber('hours'),\n minutes: frequency.getOptionalNumber('minutes'),\n seconds: frequency.getOptionalNumber('seconds'),\n milliseconds: frequency.getOptionalNumber('milliseconds'),\n }\n : {\n minutes: 5,\n },\n timeout: !!timeout\n ? {\n hours: timeout.getOptionalNumber('hours'),\n minutes: timeout.getOptionalNumber('minutes'),\n seconds: timeout.getOptionalNumber('seconds'),\n milliseconds: timeout.getOptionalNumber('milliseconds'),\n }\n : {\n seconds: 30,\n },\n });\n }\n\n /**\n *\n * 4. Return new Backstage entities.\n *\n * Requests API information from the Gloo Platform Portal REST server,\n * and transforms the response into Backstage API entities.\n */\n async run(): Promise<void> {\n if (!this.connection || !this.latestTokensResponse) {\n throw new Error('Not initialized');\n }\n\n const entities: Entity[] = [];\n const bsGroupName = 'solo-io-service-accounts';\n const bsServiceAccountName = 'gloo-platform-portal-service-account';\n const bsSystemName = 'gloo-platform-portal-apis';\n const portalServerUrl = getPortalServerUrl(\n this.error,\n this.warn,\n this.config,\n );\n const apisEndpoint = `${portalServerUrl}/apis`;\n //\n // Make API request\n try {\n const fullRequestURI = apisEndpoint + '?includeSchema=true';\n if (this.debugLogging) {\n this.log(\n `Fetching APIs from ${fullRequestURI} with header: \"Authorization: Bearer ${this.latestTokensResponse.access_token}\"`,\n );\n }\n const res = await fetch(fullRequestURI, {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n });\n const resText = await res.text();\n if (this.debugLogging) {\n this.log('Performed fetch and recieved the response text: ' + resText);\n }\n let processedAPIs = JSON.parse(resText) as API[];\n if (this.debugLogging) {\n this.log('Parsed the text into JSON.');\n }\n\n //\n // The server returns the APIs grouped by APIProduct,\n // so we can convert it back to a list here.\n //\n if (!!processedAPIs?.length && 'apiVersions' in processedAPIs[0]) {\n const apiProducts = processedAPIs as unknown as APIProduct[];\n processedAPIs = apiProducts.reduce((accum, curProd) => {\n accum.push(\n ...curProd.apiVersions.reduce((accumVer, api) => {\n if (!!api.openapiSpecFetchErr) {\n this.warn(\n `Schema fetch error for ${api.apiId} : ${JSON.stringify(\n api.openapiSpecFetchErr,\n )}`,\n );\n }\n accumVer.push({\n apiId: api.apiId,\n apiProductDisplayName: curProd.apiProductDisplayName,\n apiProductId: curProd.apiProductId,\n apiVersion: api.apiVersion,\n contact: api.contact,\n customMetadata: api.customMetadata,\n description: api.description,\n license: api.license,\n termsOfService: api.termsOfService,\n title: api.title,\n usagePlans: api.usagePlans,\n openapiSpec: api.openapiSpec,\n openapiSpecFetchErr: api.openapiSpecFetchErr,\n });\n return accumVer;\n }, [] as API[]),\n );\n return accum;\n }, [] as API[]);\n }\n\n //\n // Convert the APIs to entities\n for (let i = 0; i < processedAPIs.length; i++) {\n const apiVersion = processedAPIs[i];\n let schema = apiVersion.openapiSpec;\n if (!schema && !apiVersion.openapiSpecFetchErr) {\n // If the schema was not attempted to be fetched with\n // the /apis call, we individually fetch it here.\n // This is for backwards compatibility only, for\n // when the schema was not in the /apis response.\n const schemaRes = await fetch(\n `${apisEndpoint}/${apiVersion.apiId}/schema`,\n {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n },\n );\n schema = (await schemaRes.json()) as APISchema;\n }\n entities.push({\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n tags: [\n 'gloo-platform',\n ...(!!apiVersion.apiVersion\n ? [\n 'api-version-' +\n sanitizeStringForEntity('tag', apiVersion.apiVersion),\n ]\n : []),\n ],\n name: sanitizeStringForEntity('name', apiVersion.apiId),\n title: apiVersion.apiId,\n description: apiVersion.description,\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n type: 'openapi',\n lifecycle: 'production',\n system: bsSystemName,\n owner: `user:${bsServiceAccountName}`,\n definition: JSON.stringify(schema),\n },\n });\n }\n if (this.debugLogging) {\n this.log(\n 'Transformed APIs into new entities: ' + JSON.stringify(entities),\n );\n }\n } catch (e) {\n this.error(\n `Could not get APIs from the portal server endpoint or their schemas or transform them into entities (${apisEndpoint}). Error: ${JSON.stringify(\n e,\n )}`,\n );\n }\n\n const locationKey = `gloo-platform-portal-provider:${this.env}`;\n await this.connection.applyMutation({\n type: 'full',\n entities: [\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Group',\n metadata: {\n name: bsGroupName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n type: 'service-account-group',\n children: [],\n members: [bsServiceAccountName],\n },\n },\n },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'User',\n metadata: {\n name: bsServiceAccountName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n displayName: 'Solo.io Service Account',\n email: '',\n picture: '',\n memberOf: [bsGroupName],\n },\n },\n },\n // {\n // locationKey,\n // entity: {\n // apiVersion: 'backstage.io/v1alpha1',\n // kind: 'Domain',\n // metadata: {\n // tags: ['gloo-platform'],\n // name: 'api-product',\n // description: 'Gloo Platform Portal ApiProduct resources.',\n // annotations: {\n // 'backstage.io/managed-by-location': 'url:' + apisEndpoint,\n // 'backstage.io/managed-by-origin-location':\n // 'url:' + apisEndpoint,\n // },\n // } as EntityMeta,\n // spec: {\n // owner: 'user:' + bsServiceAccountName,\n // },\n // },\n // },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'System',\n metadata: {\n tags: ['gloo-platform'],\n name: bsSystemName,\n title: 'Gloo Platform Portal APIs',\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n owner: `user:${bsServiceAccountName}`,\n // domain: 'api-product',\n },\n },\n },\n ...entities.map(entity => ({ locationKey, entity })),\n ],\n });\n }\n}\n"],"names":["fetch"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/provider/configHelpers.ts","../src/provider/utility.ts","../src/provider/GlooPlatformPortalProvider.ts"],"sourcesContent":["import { Config } from '@backstage/config';\n\ntype logFn = (s: string) => any;\n\nexport const getPortalServerUrl = (\n logErr: logFn,\n _: logFn,\n config: Config | undefined,\n) => {\n if (!config) {\n logErr('No backstage config found when getting portal server url.');\n return '';\n }\n let value = config.getOptionalString(\n 'glooPlatformPortal.backend.portalServerUrl',\n );\n // Remove trailing slash if supplied.\n if (!!value && value.at(-1) === '/')\n value = value.substring(0, value.length - 1);\n return value ?? 'http://localhost:31080/v1';\n};\n\nexport const getClientSecret = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client secret.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.clientSecret',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientSecret found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getClientId = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client id.');\n return '';\n }\n const value = config.getOptionalString('glooPlatformPortal.backend.clientId');\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientId found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getTokenEndpoint = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting token endpoint.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.tokenEndpoint',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.tokenEndpoint found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n","import fetch from 'node-fetch';\nimport { AccessTokensResponse } from './api-types';\n\nexport function parseJwt(token: string) {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(c => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)\n .join(''),\n );\n return JSON.parse(jsonPayload);\n}\n\nexport function objectToUrlFormEncodedPayload(\n requestJSON: Record<string, string>,\n) {\n const formBodyPieces = [] as string[];\n for (const property in requestJSON) {\n if (!requestJSON.hasOwnProperty(property)) continue;\n const encodedKey = encodeURIComponent(property);\n const encodedValue = encodeURIComponent(\n requestJSON[property as keyof typeof requestJSON],\n );\n formBodyPieces.push(`${encodedKey}=${encodedValue}`);\n }\n const formBodyString = formBodyPieces.join('&');\n return formBodyString;\n}\n\nexport async function doAccessTokenRequest(\n grantType: 'refresh_token' | 'client_credentials',\n tokenEndpoint: string,\n clientId: string,\n clientSecret: string,\n refreshToken?: string,\n) {\n const formData = {} as Record<string, string>;\n //\n // Build the request payload for a new oauth access token.\n //\n formData.grant_type = grantType;\n formData.client_id = clientId;\n formData.client_secret = clientSecret;\n if (grantType === 'refresh_token') {\n if (!refreshToken) {\n return undefined;\n }\n formData.refresh_token = refreshToken;\n }\n //\n // Make the request\n //\n const rawRes = await fetch(tokenEndpoint, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n },\n method: 'POST',\n body: objectToUrlFormEncodedPayload(formData),\n });\n let resJSON: any;\n try {\n resJSON = await rawRes.json();\n } catch {\n throw new Error('Error parsing oauth response.');\n }\n if (!!resJSON.error_description) {\n throw new Error(resJSON.error_description);\n }\n if (!!resJSON.error) {\n throw new Error(resJSON.error);\n }\n //\n // Check for the access token in the response.\n //\n if (!resJSON.access_token) {\n throw new Error(\n \"No 'access_token' property was found in the oauth response body.\",\n );\n }\n return resJSON as AccessTokensResponse;\n}\n\n//\n// From: https://backstage.io/docs/features/software-catalog/descriptor-format\n//\nconst sanitizeRegex = {\n // Each tag must be sequences of [a-z0-9:+#] separated by -, at most 63 characters in total\n tag: /[a-z]|[0-9]|\\:|\\+|\\#|\\-/,\n // Strings of length at least 1, and at most 63\n // Must consist of sequences of [a-z0-9A-Z] possibly separated by one of [-_.].\n name: /[a-z]|[0-9]|[A-Z]|\\-|\\_|\\./,\n // Namespaces must be sequences of [a-zA-Z0-9], possibly separated by -, at most 63 characters in total.\n namespace: /[a-z]|[0-9]|[A-Z]|\\-/,\n};\n\n/**\n * Sanitizes a string before adding it to a backstage entity.\n */\nexport const sanitizeStringForEntity = (\n propertyType: keyof typeof sanitizeRegex,\n propertyValue: string,\n) => {\n return propertyValue\n .split('')\n .map(ch => (!sanitizeRegex[propertyType].test(ch) ? '-' : ch))\n .reduce(\n (prev, cur) =>\n // Don't go over 63 characters.\n prev.length >= 62\n ? prev\n : // Don't repeat \"-\"\n prev.at(-1) === '-' && cur === '-'\n ? prev\n : prev + cur,\n '',\n );\n};\n","import { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\nimport { Entity, EntityMeta } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\nimport fetch from 'node-fetch';\nimport { API, APIProduct, APISchema, AccessTokensResponse } from './api-types';\nimport {\n getClientId,\n getClientSecret,\n getPortalServerUrl,\n getTokenEndpoint,\n} from './configHelpers';\nimport {\n doAccessTokenRequest,\n parseJwt,\n sanitizeStringForEntity,\n} from './utility';\n\n/**\n * Provides API entities from the Gloo Platform Portal REST server.\n */\nexport class GlooPlatformPortalProvider implements EntityProvider {\n private connection?: EntityProviderConnection;\n private logger: LoggerService;\n private config: Config;\n private latestTokensResponse?: AccessTokensResponse;\n private debugLogging = false;\n\n log = (s: string) => this.logger?.info(`gloo-platform-portal: ${s}`);\n warn = (s: string) => this.logger?.warn(`gloo-platform-portal: ${s}`);\n error = (s: string) => this.logger?.error(`gloo-platform-portal: ${s}`);\n getProviderName = () => `gloo-platform-portal-backend-provider`;\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n }\n\n //\n // 1. Init class\n //\n constructor(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n ) {\n this.logger = logger;\n this.config = config;\n // Default extra debug-logging to false\n this.debugLogging = !!this.config?.getOptionalBoolean(\n 'glooPlatformPortal.backend.debugLogging',\n );\n this.log('Initializing GlooPlatformPortalProvider.');\n // Get the tokens, then schedule the task to update the catalog.\n this.startTokensRequests().then(() => this.startScheduler(scheduler));\n }\n\n //\n // 2. Get access_token\n //\n async startTokensRequests() {\n //\n // Make the initial request for the access_token.\n if (this.debugLogging) {\n this.log('Making the initial access_token request.');\n }\n if (!this.config) {\n this.error(\n 'Backstage config object not found when doing access token request.',\n );\n return;\n }\n const res = await doAccessTokenRequest(\n 'client_credentials',\n getTokenEndpoint(this.error, this.warn, this.config),\n getClientId(this.error, this.warn, this.config),\n getClientSecret(this.error, this.warn, this.config),\n );\n this.latestTokensResponse = res;\n if (!this.latestTokensResponse) {\n // If there's a problem, wait to restart the access token\n // requests so as to not overload the auth server.\n this.warn('No latest access token. Re-requesting the access_token.');\n setTimeout(this.startTokensRequests.bind(this), 5000);\n return;\n }\n if (this.debugLogging) {\n this.log('Got the access_token.');\n }\n //\n // Parse the access_token JWT to find when it expires.\n const parsedToken = parseJwt(this.latestTokensResponse.access_token);\n if (!parsedToken.exp) {\n this.warn('No `exp` property found in the access_token JWT.');\n }\n const nowDate = new Date();\n const expiresDate = new Date(parsedToken.exp * 1000);\n const millisUntilExpires = expiresDate.getTime() - nowDate.getTime();\n if (millisUntilExpires <= 0) {\n this.warn('access token is expired!');\n this.latestTokensResponse = undefined;\n return;\n }\n if (this.debugLogging) {\n this.log('Setting a timeout to get the next access token.');\n }\n // Set the timeout to request new tokens.\n setTimeout(\n this.startTokensRequests.bind(this),\n // Don't make this request more than once a second,\n // and do the refresh 5 seconds early.\n Math.max(1000, millisUntilExpires - 5000),\n );\n }\n\n /**\n *\n * 3. Schedule sync.\n *\n * This passes the user config into the\n * Backstage plugin task scheduler.\n * */\n async startScheduler(scheduler: SchedulerService) {\n if (this.debugLogging) {\n this.log('Scheduling backstage catalog sync.');\n }\n const frequency = this.config?.getOptionalConfig(\n 'glooPlatformPortal.backend.syncFrequency',\n );\n const timeout = this.config?.getOptionalConfig(\n 'glooPlatformPortal.backend.syncTimeout',\n );\n await scheduler.scheduleTask({\n id: 'run_gloo_platform_portal_refresh',\n fn: async () => {\n await this.run();\n },\n frequency: !!frequency\n ? {\n hours: frequency.getOptionalNumber('hours'),\n minutes: frequency.getOptionalNumber('minutes'),\n seconds: frequency.getOptionalNumber('seconds'),\n milliseconds: frequency.getOptionalNumber('milliseconds'),\n }\n : {\n minutes: 5,\n },\n timeout: !!timeout\n ? {\n hours: timeout.getOptionalNumber('hours'),\n minutes: timeout.getOptionalNumber('minutes'),\n seconds: timeout.getOptionalNumber('seconds'),\n milliseconds: timeout.getOptionalNumber('milliseconds'),\n }\n : {\n seconds: 30,\n },\n });\n }\n\n /**\n *\n * 4. Return new Backstage entities.\n *\n * Requests API information from the Gloo Platform Portal REST server,\n * and transforms the response into Backstage API entities.\n */\n async run(): Promise<void> {\n if (!this.connection || !this.latestTokensResponse) {\n throw new Error('Not initialized');\n }\n\n const entities: Entity[] = [];\n const bsGroupName = 'solo-io-service-accounts';\n const bsServiceAccountName = 'gloo-platform-portal-service-account';\n const bsSystemName = 'gloo-platform-portal-apis';\n const portalServerUrl = getPortalServerUrl(\n this.error,\n this.warn,\n this.config,\n );\n const apisEndpoint = `${portalServerUrl}/apis`;\n //\n // Make API request\n try {\n const fullRequestURI = apisEndpoint + '?includeSchema=true';\n if (this.debugLogging) {\n this.log(\n `Fetching APIs from ${fullRequestURI} with header: \"Authorization: Bearer ${this.latestTokensResponse.access_token}\"`,\n );\n }\n const res = await fetch(fullRequestURI, {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n });\n const resText = await res.text();\n if (this.debugLogging) {\n this.log('Performed fetch and recieved the response text: ' + resText);\n }\n let processedAPIs = JSON.parse(resText) as API[];\n if (this.debugLogging) {\n this.log('Parsed the text into JSON.');\n }\n\n //\n // The server returns the APIs grouped by APIProduct,\n // so we can convert it back to a list here.\n //\n if (!!processedAPIs?.length && 'apiVersions' in processedAPIs[0]) {\n const apiProducts = processedAPIs as unknown as APIProduct[];\n processedAPIs = apiProducts.reduce((accum, curProd) => {\n accum.push(\n ...curProd.apiVersions.reduce((accumVer, api) => {\n if (!!api.openapiSpecFetchErr) {\n this.warn(\n `Schema fetch error for ${api.apiId} : ${JSON.stringify(\n api.openapiSpecFetchErr,\n )}`,\n );\n }\n accumVer.push({\n apiId: api.apiId,\n apiProductDisplayName: curProd.apiProductDisplayName,\n apiProductId: curProd.apiProductId,\n apiVersion: api.apiVersion,\n contact: api.contact,\n customMetadata: api.customMetadata,\n description: api.description,\n license: api.license,\n termsOfService: api.termsOfService,\n title: api.title,\n usagePlans: api.usagePlans,\n openapiSpec: api.openapiSpec,\n openapiSpecFetchErr: api.openapiSpecFetchErr,\n });\n return accumVer;\n }, [] as API[]),\n );\n return accum;\n }, [] as API[]);\n }\n\n //\n // Convert the APIs to entities\n for (let i = 0; i < processedAPIs.length; i++) {\n const apiVersion = processedAPIs[i];\n let schema = apiVersion.openapiSpec;\n if (!schema && !apiVersion.openapiSpecFetchErr) {\n // If the schema was not attempted to be fetched with\n // the /apis call, we individually fetch it here.\n // This is for backwards compatibility only, for\n // when the schema was not in the /apis response.\n const schemaRes = await fetch(\n `${apisEndpoint}/${apiVersion.apiId}/schema`,\n {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n },\n );\n schema = (await schemaRes.json()) as APISchema;\n }\n entities.push({\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n tags: [\n 'gloo-platform',\n ...(!!apiVersion.apiVersion\n ? [\n 'api-version-' +\n sanitizeStringForEntity('tag', apiVersion.apiVersion),\n ]\n : []),\n ],\n name: sanitizeStringForEntity('name', apiVersion.apiId),\n title: apiVersion.apiId,\n description: apiVersion.description,\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n type: 'openapi',\n lifecycle: 'production',\n system: bsSystemName,\n owner: `user:${bsServiceAccountName}`,\n definition: JSON.stringify(schema),\n },\n });\n }\n if (this.debugLogging) {\n this.log(\n 'Transformed APIs into new entities: ' + JSON.stringify(entities),\n );\n }\n } catch (e) {\n this.error(\n `Could not get APIs from the portal server endpoint or their schemas or transform them into entities (${apisEndpoint}). Error: ${JSON.stringify(\n e,\n )}`,\n );\n }\n\n const locationKey = `gloo-platform-portal-provider`;\n await this.connection.applyMutation({\n type: 'full',\n entities: [\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Group',\n metadata: {\n name: bsGroupName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n type: 'service-account-group',\n children: [],\n members: [bsServiceAccountName],\n },\n },\n },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'User',\n metadata: {\n name: bsServiceAccountName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n displayName: 'Solo.io Service Account',\n email: '',\n picture: '',\n memberOf: [bsGroupName],\n },\n },\n },\n // {\n // locationKey,\n // entity: {\n // apiVersion: 'backstage.io/v1alpha1',\n // kind: 'Domain',\n // metadata: {\n // tags: ['gloo-platform'],\n // name: 'api-product',\n // description: 'Gloo Platform Portal ApiProduct resources.',\n // annotations: {\n // 'backstage.io/managed-by-location': 'url:' + apisEndpoint,\n // 'backstage.io/managed-by-origin-location':\n // 'url:' + apisEndpoint,\n // },\n // } as EntityMeta,\n // spec: {\n // owner: 'user:' + bsServiceAccountName,\n // },\n // },\n // },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'System',\n metadata: {\n tags: ['gloo-platform'],\n name: bsSystemName,\n title: 'Gloo Platform Portal APIs',\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n owner: `user:${bsServiceAccountName}`,\n // domain: 'api-product',\n },\n },\n },\n ...entities.map(entity => ({ locationKey, entity })),\n ],\n });\n }\n}\n"],"names":["fetch"],"mappings":";;;;;;;;AAIO,MAAM,kBAAqB,GAAA,CAChC,MACA,EAAA,CAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,2DAA2D,CAAA,CAAA;AAClE,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,QAAQ,MAAO,CAAA,iBAAA;AAAA,IACjB,4CAAA;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,CAAC,CAAC,KAAA,IAAS,KAAM,CAAA,EAAA,CAAG,EAAE,CAAM,KAAA,GAAA;AAC9B,IAAA,KAAA,GAAQ,KAAM,CAAA,SAAA,CAAU,CAAG,EAAA,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAC7C,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,2BAAA,CAAA;AAClB,CAAA,CAAA;AAEO,MAAM,eAAkB,GAAA,CAC7B,MACA,EAAA,UAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,uDAAuD,CAAA,CAAA;AAC9D,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,QAAQ,MAAO,CAAA,iBAAA;AAAA,IACnB,yCAAA;AAAA,GACF,CAAA;AACA,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,UAAA;AAAA,MACE,2EAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAA,CAAA;AAClB,CAAA,CAAA;AAEO,MAAM,WAAc,GAAA,CACzB,MACA,EAAA,UAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,mDAAmD,CAAA,CAAA;AAC1D,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,iBAAA,CAAkB,qCAAqC,CAAA,CAAA;AAC5E,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,UAAA;AAAA,MACE,uEAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAA,CAAA;AAClB,CAAA,CAAA;AAEO,MAAM,gBAAmB,GAAA,CAC9B,MACA,EAAA,UAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,wDAAwD,CAAA,CAAA;AAC/D,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,QAAQ,MAAO,CAAA,iBAAA;AAAA,IACnB,0CAAA;AAAA,GACF,CAAA;AACA,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,UAAA;AAAA,MACE,4EAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAA,CAAA;AAClB,CAAA;;AC3EO,SAAS,SAAS,KAAe,EAAA;AACtC,EAAA,MAAM,SAAY,GAAA,KAAA,CAAM,KAAM,CAAA,GAAG,EAAE,CAAC,CAAA,CAAA;AACpC,EAAM,MAAA,MAAA,GAAS,UAAU,OAAQ,CAAA,IAAA,EAAM,GAAG,CAAE,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AAC7D,EAAA,MAAM,WAAc,GAAA,kBAAA;AAAA,IAClB,IAAA,CAAK,MAAM,CAAA,CACR,KAAM,CAAA,EAAE,EACR,GAAI,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,EAAA,CAAA,EAAA,EAAK,CAAE,CAAA,UAAA,CAAW,CAAC,CAAE,CAAA,QAAA,CAAS,EAAE,CAAC,CAAG,CAAA,CAAA,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,CAC5D,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA,GACZ,CAAA;AACA,EAAO,OAAA,IAAA,CAAK,MAAM,WAAW,CAAA,CAAA;AAC/B,CAAA;AAEO,SAAS,8BACd,WACA,EAAA;AACA,EAAA,MAAM,iBAAiB,EAAC,CAAA;AACxB,EAAA,KAAA,MAAW,YAAY,WAAa,EAAA;AAClC,IAAI,IAAA,CAAC,WAAY,CAAA,cAAA,CAAe,QAAQ,CAAA;AAAG,MAAA,SAAA;AAC3C,IAAM,MAAA,UAAA,GAAa,mBAAmB,QAAQ,CAAA,CAAA;AAC9C,IAAA,MAAM,YAAe,GAAA,kBAAA;AAAA,MACnB,YAAY,QAAoC,CAAA;AAAA,KAClD,CAAA;AACA,IAAA,cAAA,CAAe,IAAK,CAAA,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,YAAY,CAAE,CAAA,CAAA,CAAA;AAAA,GACrD;AACA,EAAM,MAAA,cAAA,GAAiB,cAAe,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAC9C,EAAO,OAAA,cAAA,CAAA;AACT,CAAA;AAEA,eAAsB,oBACpB,CAAA,SAAA,EACA,aACA,EAAA,QAAA,EACA,cACA,YACA,EAAA;AACA,EAAA,MAAM,WAAW,EAAC,CAAA;AAIlB,EAAA,QAAA,CAAS,UAAa,GAAA,SAAA,CAAA;AACtB,EAAA,QAAA,CAAS,SAAY,GAAA,QAAA,CAAA;AACrB,EAAA,QAAA,CAAS,aAAgB,GAAA,YAAA,CAAA;AAUzB,EAAM,MAAA,MAAA,GAAS,MAAMA,sBAAA,CAAM,aAAe,EAAA;AAAA,IACxC,OAAS,EAAA;AAAA,MACP,cAAgB,EAAA,iDAAA;AAAA,KAClB;AAAA,IACA,MAAQ,EAAA,MAAA;AAAA,IACR,IAAA,EAAM,8BAA8B,QAAQ,CAAA;AAAA,GAC7C,CAAA,CAAA;AACD,EAAI,IAAA,OAAA,CAAA;AACJ,EAAI,IAAA;AACF,IAAU,OAAA,GAAA,MAAM,OAAO,IAAK,EAAA,CAAA;AAAA,GACtB,CAAA,MAAA;AACN,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAAA,GACjD;AACA,EAAI,IAAA,CAAC,CAAC,OAAA,CAAQ,iBAAmB,EAAA;AAC/B,IAAM,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAAA,GAC3C;AACA,EAAI,IAAA,CAAC,CAAC,OAAA,CAAQ,KAAO,EAAA;AACnB,IAAM,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,GAC/B;AAIA,EAAI,IAAA,CAAC,QAAQ,YAAc,EAAA;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,kEAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAKA,MAAM,aAAgB,GAAA;AAAA;AAAA,EAEpB,GAAK,EAAA,yBAAA;AAAA;AAAA;AAAA,EAGL,IAAM,EAAA,4BAAA;AAAA;AAAA,EAEN,SAAW,EAAA,sBAAA;AACb,CAAA,CAAA;AAKa,MAAA,uBAAA,GAA0B,CACrC,YAAA,EACA,aACG,KAAA;AACH,EAAA,OAAO,aACJ,CAAA,KAAA,CAAM,EAAE,CAAA,CACR,IAAI,CAAO,EAAA,KAAA,CAAC,aAAc,CAAA,YAAY,EAAE,IAAK,CAAA,EAAE,CAAI,GAAA,GAAA,GAAM,EAAG,CAC5D,CAAA,MAAA;AAAA,IACC,CAAC,IAAM,EAAA,GAAA;AAAA;AAAA,MAEL,IAAA,CAAK,UAAU,EACX,GAAA,IAAA;AAAA;AAAA,QAEF,IAAA,CAAK,GAAG,CAAE,CAAA,CAAA,KAAM,OAAO,GAAQ,KAAA,GAAA,GAC7B,OACA,IAAO,GAAA,GAAA;AAAA,OAAA;AAAA,KAAA;AAAA,IACb,EAAA;AAAA,GACF,CAAA;AACJ,CAAA;;;;;;;;AC9FO,MAAM,0BAAqD,CAAA;AAAA;AAAA;AAAA;AAAA,EAkBhE,WAAA,CACE,MACA,EAAA,MAAA,EACA,SACA,EAAA;AArBF,IAAQ,aAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,sBAAA,CAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAe,EAAA,KAAA,CAAA,CAAA;AAEvB,IAAA,aAAA,CAAA,IAAA,EAAA,KAAA,EAAM,CAAC,CAAW,KAAA;AA/BpB,MAAA,IAAA,EAAA,CAAA;AA+BuB,MAAA,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,IAAK,CAAA,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AACjE,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,EAAO,CAAC,CAAW,KAAA;AAhCrB,MAAA,IAAA,EAAA,CAAA;AAgCwB,MAAA,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,IAAK,CAAA,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAClE,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAQ,CAAC,CAAW,KAAA;AAjCtB,MAAA,IAAA,EAAA,CAAA;AAiCyB,MAAA,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,KAAM,CAAA,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AACpE,IAAA,aAAA,CAAA,IAAA,EAAA,iBAAA,EAAkB,MAAM,CAAA,qCAAA,CAAA,CAAA,CAAA;AAlC1B,IAAA,IAAA,EAAA,CAAA;AA+CI,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AAEd,IAAA,IAAA,CAAK,YAAe,GAAA,CAAC,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,WAAL,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,kBAAA;AAAA,MACjC,yCAAA;AAAA,KAAA,CAAA,CAAA;AAEF,IAAA,IAAA,CAAK,IAAI,0CAA0C,CAAA,CAAA;AAEnD,IAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,cAAA,CAAe,SAAS,CAAC,CAAA,CAAA;AAAA,GACtE;AAAA,EArBA,MAAM,QAAQ,UAAqD,EAAA;AACjE,IAAA,IAAA,CAAK,UAAa,GAAA,UAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,mBAAsB,GAAA;AAG1B,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,0CAA0C,CAAA,CAAA;AAAA,KACrD;AACA,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,MAAK,IAAA,CAAA,KAAA;AAAA,QACH,oEAAA;AAAA,OACF,CAAA;AACA,MAAA,OAAA;AAAA,KACF;AACA,IAAA,MAAM,MAAM,MAAM,oBAAA;AAAA,MAChB,oBAAA;AAAA,MACA,iBAAiB,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,MACnD,YAAY,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,MAC9C,gBAAgB,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,KACpD,CAAA;AACA,IAAA,IAAA,CAAK,oBAAuB,GAAA,GAAA,CAAA;AAC5B,IAAI,IAAA,CAAC,KAAK,oBAAsB,EAAA;AAG9B,MAAA,IAAA,CAAK,KAAK,yDAAyD,CAAA,CAAA;AACnE,MAAA,UAAA,CAAW,IAAK,CAAA,mBAAA,CAAoB,IAAK,CAAA,IAAI,GAAG,GAAI,CAAA,CAAA;AACpD,MAAA,OAAA;AAAA,KACF;AACA,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,uBAAuB,CAAA,CAAA;AAAA,KAClC;AAGA,IAAA,MAAM,WAAc,GAAA,QAAA,CAAS,IAAK,CAAA,oBAAA,CAAqB,YAAY,CAAA,CAAA;AACnE,IAAI,IAAA,CAAC,YAAY,GAAK,EAAA;AACpB,MAAA,IAAA,CAAK,KAAK,kDAAkD,CAAA,CAAA;AAAA,KAC9D;AACA,IAAM,MAAA,OAAA,uBAAc,IAAK,EAAA,CAAA;AACzB,IAAA,MAAM,WAAc,GAAA,IAAI,IAAK,CAAA,WAAA,CAAY,MAAM,GAAI,CAAA,CAAA;AACnD,IAAA,MAAM,kBAAqB,GAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAQ,EAAA,CAAA;AACnE,IAAA,IAAI,sBAAsB,CAAG,EAAA;AAC3B,MAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA,CAAA;AACpC,MAAA,IAAA,CAAK,oBAAuB,GAAA,KAAA,CAAA,CAAA;AAC5B,MAAA,OAAA;AAAA,KACF;AACA,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,iDAAiD,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,UAAA;AAAA,MACE,IAAA,CAAK,mBAAoB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA;AAAA;AAAA,MAGlC,IAAK,CAAA,GAAA,CAAI,GAAM,EAAA,kBAAA,GAAqB,GAAI,CAAA;AAAA,KAC1C,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,SAA6B,EAAA;AA3HpD,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4HI,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA,CAAA;AAAA,KAC/C;AACA,IAAM,MAAA,SAAA,GAAA,CAAY,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA;AAAA,MAC7B,0CAAA;AAAA,KAAA,CAAA;AAEF,IAAM,MAAA,OAAA,GAAA,CAAU,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA;AAAA,MAC3B,wCAAA;AAAA,KAAA,CAAA;AAEF,IAAA,MAAM,UAAU,YAAa,CAAA;AAAA,MAC3B,EAAI,EAAA,kCAAA;AAAA,MACJ,IAAI,YAAY;AACd,QAAA,MAAM,KAAK,GAAI,EAAA,CAAA;AAAA,OACjB;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SACT,GAAA;AAAA,QACE,KAAA,EAAO,SAAU,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,QAC1C,OAAA,EAAS,SAAU,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC9C,OAAA,EAAS,SAAU,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC9C,YAAA,EAAc,SAAU,CAAA,iBAAA,CAAkB,cAAc,CAAA;AAAA,OAE1D,GAAA;AAAA,QACE,OAAS,EAAA,CAAA;AAAA,OACX;AAAA,MACJ,OAAA,EAAS,CAAC,CAAC,OACP,GAAA;AAAA,QACE,KAAA,EAAO,OAAQ,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS,OAAQ,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC5C,OAAA,EAAS,OAAQ,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC5C,YAAA,EAAc,OAAQ,CAAA,iBAAA,CAAkB,cAAc,CAAA;AAAA,OAExD,GAAA;AAAA,QACE,OAAS,EAAA,EAAA;AAAA,OACX;AAAA,KACL,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAqB,GAAA;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAc,IAAA,CAAC,KAAK,oBAAsB,EAAA;AAClD,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA,CAAA;AAAA,KACnC;AAEA,IAAA,MAAM,WAAqB,EAAC,CAAA;AAC5B,IAAA,MAAM,WAAc,GAAA,0BAAA,CAAA;AACpB,IAAA,MAAM,oBAAuB,GAAA,sCAAA,CAAA;AAC7B,IAAA,MAAM,YAAe,GAAA,2BAAA,CAAA;AACrB,IAAA,MAAM,eAAkB,GAAA,kBAAA;AAAA,MACtB,IAAK,CAAA,KAAA;AAAA,MACL,IAAK,CAAA,IAAA;AAAA,MACL,IAAK,CAAA,MAAA;AAAA,KACP,CAAA;AACA,IAAM,MAAA,YAAA,GAAe,GAAG,eAAe,CAAA,KAAA,CAAA,CAAA;AAGvC,IAAI,IAAA;AACF,MAAA,MAAM,iBAAiB,YAAe,GAAA,qBAAA,CAAA;AACtC,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAK,IAAA,CAAA,GAAA;AAAA,UACH,CAAsB,mBAAA,EAAA,cAAc,CAAwC,qCAAA,EAAA,IAAA,CAAK,qBAAqB,YAAY,CAAA,CAAA,CAAA;AAAA,SACpH,CAAA;AAAA,OACF;AACA,MAAM,MAAA,GAAA,GAAM,MAAMA,sBAAA,CAAM,cAAgB,EAAA;AAAA,QACtC,OAAS,EAAA;AAAA,UACP,aAAe,EAAA,CAAA,OAAA,EAAU,IAAK,CAAA,oBAAA,CAAqB,YAAY,CAAA,CAAA;AAAA,SACjE;AAAA,OACD,CAAA,CAAA;AACD,MAAM,MAAA,OAAA,GAAU,MAAM,GAAA,CAAI,IAAK,EAAA,CAAA;AAC/B,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAK,IAAA,CAAA,GAAA,CAAI,qDAAqD,OAAO,CAAA,CAAA;AAAA,OACvE;AACA,MAAI,IAAA,aAAA,GAAgB,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACtC,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAA,IAAA,CAAK,IAAI,4BAA4B,CAAA,CAAA;AAAA,OACvC;AAMA,MAAA,IAAI,CAAC,EAAC,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,WAAU,aAAiB,IAAA,aAAA,CAAc,CAAC,CAAG,EAAA;AAChE,QAAA,MAAM,WAAc,GAAA,aAAA,CAAA;AACpB,QAAA,aAAA,GAAgB,WAAY,CAAA,MAAA,CAAO,CAAC,KAAA,EAAO,OAAY,KAAA;AACrD,UAAM,KAAA,CAAA,IAAA;AAAA,YACJ,GAAG,OAAQ,CAAA,WAAA,CAAY,MAAO,CAAA,CAAC,UAAU,GAAQ,KAAA;AAC/C,cAAI,IAAA,CAAC,CAAC,GAAA,CAAI,mBAAqB,EAAA;AAC7B,gBAAK,IAAA,CAAA,IAAA;AAAA,kBACH,CAA0B,uBAAA,EAAA,GAAA,CAAI,KAAK,CAAA,GAAA,EAAM,IAAK,CAAA,SAAA;AAAA,oBAC5C,GAAI,CAAA,mBAAA;AAAA,mBACL,CAAA,CAAA;AAAA,iBACH,CAAA;AAAA,eACF;AACA,cAAA,QAAA,CAAS,IAAK,CAAA;AAAA,gBACZ,OAAO,GAAI,CAAA,KAAA;AAAA,gBACX,uBAAuB,OAAQ,CAAA,qBAAA;AAAA,gBAC/B,cAAc,OAAQ,CAAA,YAAA;AAAA,gBACtB,YAAY,GAAI,CAAA,UAAA;AAAA,gBAChB,SAAS,GAAI,CAAA,OAAA;AAAA,gBACb,gBAAgB,GAAI,CAAA,cAAA;AAAA,gBACpB,aAAa,GAAI,CAAA,WAAA;AAAA,gBACjB,SAAS,GAAI,CAAA,OAAA;AAAA,gBACb,gBAAgB,GAAI,CAAA,cAAA;AAAA,gBACpB,OAAO,GAAI,CAAA,KAAA;AAAA,gBACX,YAAY,GAAI,CAAA,UAAA;AAAA,gBAChB,aAAa,GAAI,CAAA,WAAA;AAAA,gBACjB,qBAAqB,GAAI,CAAA,mBAAA;AAAA,eAC1B,CAAA,CAAA;AACD,cAAO,OAAA,QAAA,CAAA;AAAA,aACT,EAAG,EAAW,CAAA;AAAA,WAChB,CAAA;AACA,UAAO,OAAA,KAAA,CAAA;AAAA,SACT,EAAG,EAAW,CAAA,CAAA;AAAA,OAChB;AAIA,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,aAAA,CAAc,QAAQ,CAAK,EAAA,EAAA;AAC7C,QAAM,MAAA,UAAA,GAAa,cAAc,CAAC,CAAA,CAAA;AAClC,QAAA,IAAI,SAAS,UAAW,CAAA,WAAA,CAAA;AACxB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,CAAW,mBAAqB,EAAA;AAK9C,UAAA,MAAM,YAAY,MAAMA,sBAAA;AAAA,YACtB,CAAG,EAAA,YAAY,CAAI,CAAA,EAAA,UAAA,CAAW,KAAK,CAAA,OAAA,CAAA;AAAA,YACnC;AAAA,cACE,OAAS,EAAA;AAAA,gBACP,aAAe,EAAA,CAAA,OAAA,EAAU,IAAK,CAAA,oBAAA,CAAqB,YAAY,CAAA,CAAA;AAAA,eACjE;AAAA,aACF;AAAA,WACF,CAAA;AACA,UAAU,MAAA,GAAA,MAAM,UAAU,IAAK,EAAA,CAAA;AAAA,SACjC;AACA,QAAA,QAAA,CAAS,IAAK,CAAA;AAAA,UACZ,UAAY,EAAA,uBAAA;AAAA,UACZ,IAAM,EAAA,KAAA;AAAA,UACN,QAAU,EAAA;AAAA,YACR,IAAM,EAAA;AAAA,cACJ,eAAA;AAAA,cACA,GAAI,CAAC,CAAC,UAAA,CAAW,UACb,GAAA;AAAA,gBACE,cACE,GAAA,uBAAA,CAAwB,KAAO,EAAA,UAAA,CAAW,UAAU,CAAA;AAAA,kBAExD,EAAC;AAAA,aACP;AAAA,YACA,IAAM,EAAA,uBAAA,CAAwB,MAAQ,EAAA,UAAA,CAAW,KAAK,CAAA;AAAA,YACtD,OAAO,UAAW,CAAA,KAAA;AAAA,YAClB,aAAa,UAAW,CAAA,WAAA;AAAA,YACxB,WAAa,EAAA;AAAA,cACX,kCAAA,EAAoC,OAAO,YAAY,CAAA,CAAA;AAAA,cACvD,yCAAA,EAA2C,OAAO,YAAY,CAAA,CAAA;AAAA,aAChE;AAAA,WACF;AAAA,UACA,IAAM,EAAA;AAAA,YACJ,IAAM,EAAA,SAAA;AAAA,YACN,SAAW,EAAA,YAAA;AAAA,YACX,MAAQ,EAAA,YAAA;AAAA,YACR,KAAA,EAAO,QAAQ,oBAAoB,CAAA,CAAA;AAAA,YACnC,UAAA,EAAY,IAAK,CAAA,SAAA,CAAU,MAAM,CAAA;AAAA,WACnC;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AACA,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAK,IAAA,CAAA,GAAA;AAAA,UACH,sCAAA,GAAyC,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,SAClE,CAAA;AAAA,OACF;AAAA,aACO,CAAG,EAAA;AACV,MAAK,IAAA,CAAA,KAAA;AAAA,QACH,CAAA,qGAAA,EAAwG,YAAY,CAAA,UAAA,EAAa,IAAK,CAAA,SAAA;AAAA,UACpI,CAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACH,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,WAAc,GAAA,CAAA,6BAAA,CAAA,CAAA;AACpB,IAAM,MAAA,IAAA,CAAK,WAAW,aAAc,CAAA;AAAA,MAClC,IAAM,EAAA,MAAA;AAAA,MACN,QAAU,EAAA;AAAA,QACR;AAAA,UACE,WAAA;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,UAAY,EAAA,uBAAA;AAAA,YACZ,IAAM,EAAA,OAAA;AAAA,YACN,QAAU,EAAA;AAAA,cACR,IAAM,EAAA,WAAA;AAAA,cACN,WAAa,EAAA;AAAA,gBACX,kCAAA,EAAoC,OAAO,eAAe,CAAA,CAAA;AAAA,gBAC1D,yCAAA,EAA2C,OAAO,eAAe,CAAA,CAAA;AAAA,eACnE;AAAA,aACF;AAAA,YACA,IAAM,EAAA;AAAA,cACJ,IAAM,EAAA,uBAAA;AAAA,cACN,UAAU,EAAC;AAAA,cACX,OAAA,EAAS,CAAC,oBAAoB,CAAA;AAAA,aAChC;AAAA,WACF;AAAA,SACF;AAAA,QACA;AAAA,UACE,WAAA;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,UAAY,EAAA,uBAAA;AAAA,YACZ,IAAM,EAAA,MAAA;AAAA,YACN,QAAU,EAAA;AAAA,cACR,IAAM,EAAA,oBAAA;AAAA,cACN,WAAa,EAAA;AAAA,gBACX,kCAAA,EAAoC,OAAO,eAAe,CAAA,CAAA;AAAA,gBAC1D,yCAAA,EAA2C,OAAO,eAAe,CAAA,CAAA;AAAA,eACnE;AAAA,aACF;AAAA,YACA,IAAM,EAAA;AAAA,cACJ,WAAa,EAAA,yBAAA;AAAA,cACb,KAAO,EAAA,EAAA;AAAA,cACP,OAAS,EAAA,EAAA;AAAA,cACT,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,aACxB;AAAA,WACF;AAAA,SACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAqBA;AAAA,UACE,WAAA;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,UAAY,EAAA,uBAAA;AAAA,YACZ,IAAM,EAAA,QAAA;AAAA,YACN,QAAU,EAAA;AAAA,cACR,IAAA,EAAM,CAAC,eAAe,CAAA;AAAA,cACtB,IAAM,EAAA,YAAA;AAAA,cACN,KAAO,EAAA,2BAAA;AAAA,cACP,WAAa,EAAA;AAAA,gBACX,kCAAA,EAAoC,OAAO,YAAY,CAAA,CAAA;AAAA,gBACvD,yCAAA,EAA2C,OAAO,YAAY,CAAA,CAAA;AAAA,eAChE;AAAA,aACF;AAAA,YACA,IAAM,EAAA;AAAA,cACJ,KAAA,EAAO,QAAQ,oBAAoB,CAAA,CAAA;AAAA;AAAA,aAErC;AAAA,WACF;AAAA,SACF;AAAA,QACA,GAAG,QAAS,CAAA,GAAA,CAAI,aAAW,EAAE,WAAA,EAAa,QAAS,CAAA,CAAA;AAAA,OACrD;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,33 +1,31 @@
1
+ import { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';
1
2
  import { Config } from '@backstage/config';
2
- import { PluginTaskScheduler } from '@backstage/backend-tasks';
3
3
  import { EntityProvider, EntityProviderConnection } from '@backstage/plugin-catalog-node';
4
- import * as winston from 'winston';
5
4
 
6
5
  /**
7
6
  * Provides API entities from the Gloo Platform Portal REST server.
8
7
  */
9
8
  declare class GlooPlatformPortalProvider implements EntityProvider {
10
- private readonly env;
11
9
  private connection?;
12
10
  private logger;
13
11
  private config;
14
12
  private latestTokensResponse?;
15
13
  private debugLogging;
16
- log: (s: string) => winston.Logger;
17
- warn: (s: string) => winston.Logger;
18
- error: (s: string) => winston.Logger;
14
+ log: (s: string) => void;
15
+ warn: (s: string) => void;
16
+ error: (s: string) => void;
19
17
  getProviderName: () => string;
20
18
  connect(connection: EntityProviderConnection): Promise<void>;
21
- constructor(env: string, logger: winston.Logger, config: Config);
19
+ constructor(logger: LoggerService, config: Config, scheduler: SchedulerService);
22
20
  startTokensRequests(): Promise<void>;
23
21
  /**
24
22
  *
25
23
  * 3. Schedule sync.
26
24
  *
27
- * This is called during setup, and passes the user config into the
25
+ * This passes the user config into the
28
26
  * Backstage plugin task scheduler.
29
27
  * */
30
- startScheduler(scheduler: PluginTaskScheduler): Promise<void>;
28
+ startScheduler(scheduler: SchedulerService): Promise<void>;
31
29
  /**
32
30
  *
33
31
  * 4. Return new Backstage entities.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@solo.io/platform-portal-backstage-plugin-backend",
3
3
  "description": "A Backstage backend plugin that synchronizes Gloo Platform Portal APIs with the Backstage catalog.",
4
- "version": "0.0.25",
4
+ "version": "0.0.27",
5
5
  "main": "dist/index.cjs.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "Apache-2.0",