@axis-backstage/plugin-statuspage-backend 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @axis-backstage/plugin-statuspage-backend
2
2
 
3
+ ## 0.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - e6bcc2f: - 6939770: **BREAKING**: The `statuspage-backend` plugin has been migrated to the new backend system. If
8
+ you are using the new backend system module, this does not affect you.
9
+
10
+ ## 0.6.0
11
+
12
+ ### Minor Changes
13
+
14
+ - ede8341: Updated to Backstage v1.36.1.
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies [ede8341]
19
+ - @axis-backstage/plugin-statuspage-common@0.6.0
20
+
3
21
  ## 0.5.2
4
22
 
5
23
  ### Patch Changes
package/README.md CHANGED
@@ -19,47 +19,8 @@ yarn --cwd packages/backend add @axis-backstage/plugin-statuspage-backend
19
19
 
20
20
  ### Integrating
21
21
 
22
- Here's how to get the backend plugin up and running:
23
-
24
- 1. Create a new file named `packages/backend/src/plugins/statuspage.ts`, and add the following to it:
25
-
26
- ```ts
27
- import { PluginEnvironment } from '../types';
28
- import { createRouter } from '@axis-backstage/plugin-statuspage-backend';
29
- import { Router } from 'express';
30
-
31
- export default async function createPlugin(
32
- env: PluginEnvironment,
33
- ): Promise<Router> {
34
- return await createRouter({
35
- logger: env.logger,
36
- config: env.config,
37
- });
38
- }
39
- ```
40
-
41
- 2. Wire this into the overall backend router by adding the following to `packages/backend/src/index.ts`:
42
-
43
- ```ts
44
- import statuspage from './plugins/statuspage';
45
- ...
46
-
47
- async function main() {
48
- // Add this line under the other lines that follow the useHotMemoize pattern
49
- const statuspageEnv = useHotMemoize(module, () => createEnv('statuspage'));
50
-
51
- ....
52
-
53
- // Add this under the lines that add their routers to apiRouter
54
- apiRouter.use('/statuspage', authMiddleware, await statuspage(statuspageEnv));
55
- }
56
- ```
57
-
58
- ### New Backend System
59
-
60
- The Jira Dashboard backend plugin has support for the [new backend system](https://backstage.io/docs/backend-system/). Here is how you can set it up:
61
-
62
- In your `packages/backend/src/index.ts` make the following changes:
22
+ Here's how to get the backend plugin up and running. In your `packages/backend/src/index.ts` make
23
+ the following changes:
63
24
 
64
25
  ```diff
65
26
 
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ function getStatuspageConfig(config) {
4
+ const statuspageConfig = config.getOptional("statuspage");
5
+ if (!statuspageConfig) {
6
+ return [];
7
+ }
8
+ return statuspageConfig;
9
+ }
10
+
11
+ exports.getStatuspageConfig = getStatuspageConfig;
12
+ //# sourceMappingURL=config.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.cjs.js","sources":["../src/config.ts"],"sourcesContent":["import { Config } from '@backstage/config';\nimport type { StatuspageConfig } from './types';\n\nexport function getStatuspageConfig(config: Config): StatuspageConfig {\n const statuspageConfig = config.getOptional('statuspage');\n if (!statuspageConfig) {\n return [];\n }\n return statuspageConfig as unknown as StatuspageConfig;\n}\n"],"names":[],"mappings":";;AAGO,SAAS,oBAAoB,MAAkC,EAAA;AACpE,EAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,WAAA,CAAY,YAAY,CAAA;AACxD,EAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,IAAA,OAAO,EAAC;AAAA;AAEV,EAAO,OAAA,gBAAA;AACT;;;;"}
package/dist/index.cjs.js CHANGED
@@ -2,122 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var backendCommon = require('@backstage/backend-common');
6
- var express = require('express');
7
- var Router = require('express-promise-router');
8
- var fetch = require('cross-fetch');
9
- var backendPluginApi = require('@backstage/backend-plugin-api');
5
+ var plugin = require('./plugin.cjs.js');
10
6
 
11
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
12
7
 
13
- var express__default = /*#__PURE__*/_interopDefaultCompat(express);
14
- var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
15
- var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
16
8
 
17
- const BASE_URL = "https://api.statuspage.io/v1/pages/";
18
- const getInstance = (config, name) => {
19
- const instance = config.find((i) => i.name === name);
20
- if (!instance) {
21
- throw new Error(
22
- `Config for instance '${name}' not found in statuspage.instances`
23
- );
24
- }
25
- return instance;
26
- };
27
- const fetchData = async (url, token) => {
28
- const response = await fetch__default.default(url, {
29
- headers: {
30
- Authorization: `OAuth ${token}`,
31
- Accept: "application/json"
32
- }
33
- });
34
- if (!response.ok) {
35
- throw new Error(`Failed to fetch status page data from ${url}`);
36
- }
37
- return response.json();
38
- };
39
- const fetchComponents = async (name, config) => {
40
- const instance = getInstance(config, name);
41
- const url = `${BASE_URL}${instance.pageid}/components`;
42
- return fetchData(url, instance.token);
43
- };
44
- const fetchComponentGroups = async (name, config) => {
45
- const instance = getInstance(config, name);
46
- const url = `${BASE_URL}${instance.pageid}/component-groups`;
47
- return fetchData(url, instance.token);
48
- };
49
- const getLink = (name, config) => {
50
- const instance = getInstance(config, name);
51
- return instance.link;
52
- };
53
-
54
- function getStatuspageConfig(config) {
55
- const statuspageConfig = config.getOptional("statuspage");
56
- if (!statuspageConfig) {
57
- return [];
58
- }
59
- return statuspageConfig;
60
- }
61
-
62
- const COMPONENT_GROUPS_KEY = "component-groups";
63
- const COMPONENTS_KEY = "components";
64
- async function createRouter(options) {
65
- const { logger, config } = options;
66
- logger.info("Setting up router for statuspage-backend");
67
- const pluginCache = backendCommon.CacheManager.fromConfig(config).forPlugin("statuspage");
68
- const statuspageConfig = getStatuspageConfig(config);
69
- const cache = pluginCache.getClient({ defaultTtl: 1e3 * 60 * 2 });
70
- const router = Router__default.default();
71
- router.use(express__default.default.json());
72
- router.get("/fetch-components/:name", async (request, response) => {
73
- const name = request.params.name;
74
- let components = await cache.get(`${COMPONENTS_KEY}-${name}`);
75
- if (!components) {
76
- components = await fetchComponents(name, statuspageConfig);
77
- await cache.set(`${COMPONENTS_KEY}-${name}`, components);
78
- }
79
- response.json(components);
80
- });
81
- router.get("/fetch-component-groups/:name", async (request, response) => {
82
- const name = request.params.name;
83
- let componentGroups = await cache.get(
84
- `${COMPONENT_GROUPS_KEY}-${name}`
85
- );
86
- if (!componentGroups) {
87
- componentGroups = await fetchComponentGroups(name, statuspageConfig);
88
- await cache.set(`${COMPONENT_GROUPS_KEY}-${name}`, componentGroups);
89
- }
90
- response.json(componentGroups);
91
- });
92
- router.get("/fetch-link/:name", (request, response) => {
93
- const name = request.params.name;
94
- response.json({ url: getLink(name, statuspageConfig) || "" });
95
- });
96
- router.use(backendCommon.errorHandler());
97
- return router;
98
- }
99
-
100
- const statuspagePlugin = backendPluginApi.createBackendPlugin({
101
- pluginId: "statuspage",
102
- register(env) {
103
- env.registerInit({
104
- deps: {
105
- config: backendPluginApi.coreServices.rootConfig,
106
- logger: backendPluginApi.coreServices.logger,
107
- httpRouter: backendPluginApi.coreServices.httpRouter
108
- },
109
- async init({ config, logger, httpRouter }) {
110
- httpRouter.use(
111
- await createRouter({
112
- config,
113
- logger
114
- })
115
- );
116
- }
117
- });
118
- }
119
- });
120
-
121
- exports.createRouter = createRouter;
122
- exports.default = statuspagePlugin;
9
+ exports.default = plugin.statuspagePlugin;
123
10
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/service/api.ts","../src/config.ts","../src/service/router.ts","../src/plugin.ts"],"sourcesContent":["import fetch from 'cross-fetch';\nimport type {\n Component,\n ComponentGroup,\n} from '@axis-backstage/plugin-statuspage-common';\nimport { StatuspageConfig } from '../types';\n\nconst BASE_URL = 'https://api.statuspage.io/v1/pages/';\n\nconst getInstance = (config: StatuspageConfig, name: string) => {\n const instance = config.find(i => i.name === name);\n\n if (!instance) {\n throw new Error(\n `Config for instance '${name}' not found in statuspage.instances`,\n );\n }\n\n return instance;\n};\n\nconst fetchData = async <T>(url: string, token: string): Promise<T> => {\n const response = await fetch(url, {\n headers: {\n Authorization: `OAuth ${token}`,\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch status page data from ${url}`);\n }\n\n return response.json() as T;\n};\n\nexport const fetchComponents = async (\n name: string,\n config: StatuspageConfig,\n): Promise<Component[]> => {\n const instance = getInstance(config, name);\n const url = `${BASE_URL}${instance.pageid}/components`;\n return fetchData<Component[]>(url, instance.token);\n};\n\nexport const fetchComponentGroups = async (\n name: string,\n config: StatuspageConfig,\n): Promise<ComponentGroup[]> => {\n const instance = getInstance(config, name);\n const url = `${BASE_URL}${instance.pageid}/component-groups`;\n return fetchData(url, instance.token);\n};\n\nexport const getLink = (\n name: string,\n config: StatuspageConfig,\n): string | undefined => {\n const instance = getInstance(config, name);\n return instance.link;\n};\n","import { Config } from '@backstage/config';\nimport type { StatuspageConfig } from './types';\n\nexport function getStatuspageConfig(config: Config): StatuspageConfig {\n const statuspageConfig = config.getOptional('statuspage');\n if (!statuspageConfig) {\n return [];\n }\n return statuspageConfig as unknown as StatuspageConfig;\n}\n","import { CacheManager, errorHandler } from '@backstage/backend-common';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport { fetchComponentGroups, fetchComponents, getLink } from './api';\nimport { Config } from '@backstage/config';\nimport { getStatuspageConfig } from '../config';\n\n/**\n * Router options.\n *\n * @deprecated Please migrate to the new backend system as this will be removed in the future.\n * @public\n */\nexport interface RouterOptions {\n /** The logger instance */\n logger: LoggerService;\n /** Backstage config object */\n config: Config;\n}\n\nconst COMPONENT_GROUPS_KEY = 'component-groups';\nconst COMPONENTS_KEY = 'components';\n\n/**\n * Create the router.\n *\n * @deprecated Please migrate to the new backend system as this will be removed in the future.\n * @public\n */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, config } = options;\n logger.info('Setting up router for statuspage-backend');\n const pluginCache = CacheManager.fromConfig(config).forPlugin('statuspage');\n const statuspageConfig = getStatuspageConfig(config);\n const cache = pluginCache.getClient({ defaultTtl: 1000 * 60 * 2 });\n\n const router = Router();\n router.use(express.json());\n\n router.get('/fetch-components/:name', async (request, response) => {\n const name = request.params.name;\n let components = (await cache.get(`${COMPONENTS_KEY}-${name}`)) as any;\n if (!components) {\n components = await fetchComponents(name, statuspageConfig);\n await cache.set(`${COMPONENTS_KEY}-${name}`, components);\n }\n response.json(components);\n });\n\n router.get('/fetch-component-groups/:name', async (request, response) => {\n const name = request.params.name;\n let componentGroups = (await cache.get(\n `${COMPONENT_GROUPS_KEY}-${name}`,\n )) as any;\n if (!componentGroups) {\n componentGroups = await fetchComponentGroups(name, statuspageConfig);\n await cache.set(`${COMPONENT_GROUPS_KEY}-${name}`, componentGroups);\n }\n response.json(componentGroups);\n });\n\n router.get('/fetch-link/:name', (request, response) => {\n const name = request.params.name;\n response.json({ url: getLink(name, statuspageConfig) || '' });\n });\n\n router.use(errorHandler());\n return router;\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\n\n/**\n * Entrypoint for our plugin.\n *\n * @public\n */\nexport const statuspagePlugin = createBackendPlugin({\n pluginId: 'statuspage',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n httpRouter: coreServices.httpRouter,\n },\n async init({ config, logger, httpRouter }) {\n httpRouter.use(\n await createRouter({\n config,\n logger,\n }),\n );\n },\n });\n },\n});\n"],"names":["fetch","CacheManager","Router","express","errorHandler","createBackendPlugin","coreServices"],"mappings":";;;;;;;;;;;;;;;;AAOA,MAAM,QAAW,GAAA,qCAAA,CAAA;AAEjB,MAAM,WAAA,GAAc,CAAC,MAAA,EAA0B,IAAiB,KAAA;AAC9D,EAAA,MAAM,WAAW,MAAO,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA,CAAA;AAEjD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,wBAAwB,IAAI,CAAA,mCAAA,CAAA;AAAA,KAC9B,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,QAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,SAAA,GAAY,OAAU,GAAA,EAAa,KAA8B,KAAA;AACrE,EAAM,MAAA,QAAA,GAAW,MAAMA,sBAAA,CAAM,GAAK,EAAA;AAAA,IAChC,OAAS,EAAA;AAAA,MACP,aAAA,EAAe,SAAS,KAAK,CAAA,CAAA;AAAA,MAC7B,MAAQ,EAAA,kBAAA;AAAA,KACV;AAAA,GACD,CAAA,CAAA;AAED,EAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAyC,sCAAA,EAAA,GAAG,CAAE,CAAA,CAAA,CAAA;AAAA,GAChE;AAEA,EAAA,OAAO,SAAS,IAAK,EAAA,CAAA;AACvB,CAAA,CAAA;AAEa,MAAA,eAAA,GAAkB,OAC7B,IAAA,EACA,MACyB,KAAA;AACzB,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AACzC,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAS,MAAM,CAAA,WAAA,CAAA,CAAA;AACzC,EAAO,OAAA,SAAA,CAAuB,GAAK,EAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AACnD,CAAA,CAAA;AAEa,MAAA,oBAAA,GAAuB,OAClC,IAAA,EACA,MAC8B,KAAA;AAC9B,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AACzC,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAS,MAAM,CAAA,iBAAA,CAAA,CAAA;AACzC,EAAO,OAAA,SAAA,CAAU,GAAK,EAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AACtC,CAAA,CAAA;AAEa,MAAA,OAAA,GAAU,CACrB,IAAA,EACA,MACuB,KAAA;AACvB,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AACzC,EAAA,OAAO,QAAS,CAAA,IAAA,CAAA;AAClB,CAAA;;ACzDO,SAAS,oBAAoB,MAAkC,EAAA;AACpE,EAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,WAAA,CAAY,YAAY,CAAA,CAAA;AACxD,EAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AACA,EAAO,OAAA,gBAAA,CAAA;AACT;;ACYA,MAAM,oBAAuB,GAAA,kBAAA,CAAA;AAC7B,MAAM,cAAiB,GAAA,YAAA,CAAA;AAQvB,eAAsB,aACpB,OACyB,EAAA;AACzB,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,OAAA,CAAA;AAC3B,EAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA,CAAA;AACtD,EAAA,MAAM,cAAcC,0BAAa,CAAA,UAAA,CAAW,MAAM,CAAA,CAAE,UAAU,YAAY,CAAA,CAAA;AAC1E,EAAM,MAAA,gBAAA,GAAmB,oBAAoB,MAAM,CAAA,CAAA;AACnD,EAAM,MAAA,KAAA,GAAQ,YAAY,SAAU,CAAA,EAAE,YAAY,GAAO,GAAA,EAAA,GAAK,GAAG,CAAA,CAAA;AAEjE,EAAA,MAAM,SAASC,uBAAO,EAAA,CAAA;AACtB,EAAO,MAAA,CAAA,GAAA,CAAIC,wBAAQ,CAAA,IAAA,EAAM,CAAA,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAI,CAAA,yBAAA,EAA2B,OAAO,OAAA,EAAS,QAAa,KAAA;AACjE,IAAM,MAAA,IAAA,GAAO,QAAQ,MAAO,CAAA,IAAA,CAAA;AAC5B,IAAI,IAAA,UAAA,GAAc,MAAM,KAAM,CAAA,GAAA,CAAI,GAAG,cAAc,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,CAAA,CAAA;AAC7D,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAa,UAAA,GAAA,MAAM,eAAgB,CAAA,IAAA,EAAM,gBAAgB,CAAA,CAAA;AACzD,MAAA,MAAM,MAAM,GAAI,CAAA,CAAA,EAAG,cAAc,CAAI,CAAA,EAAA,IAAI,IAAI,UAAU,CAAA,CAAA;AAAA,KACzD;AACA,IAAA,QAAA,CAAS,KAAK,UAAU,CAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,+BAAA,EAAiC,OAAO,OAAA,EAAS,QAAa,KAAA;AACvE,IAAM,MAAA,IAAA,GAAO,QAAQ,MAAO,CAAA,IAAA,CAAA;AAC5B,IAAI,IAAA,eAAA,GAAmB,MAAM,KAAM,CAAA,GAAA;AAAA,MACjC,CAAA,EAAG,oBAAoB,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,KACjC,CAAA;AACA,IAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,MAAkB,eAAA,GAAA,MAAM,oBAAqB,CAAA,IAAA,EAAM,gBAAgB,CAAA,CAAA;AACnE,MAAA,MAAM,MAAM,GAAI,CAAA,CAAA,EAAG,oBAAoB,CAAI,CAAA,EAAA,IAAI,IAAI,eAAe,CAAA,CAAA;AAAA,KACpE;AACA,IAAA,QAAA,CAAS,KAAK,eAAe,CAAA,CAAA;AAAA,GAC9B,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,mBAAA,EAAqB,CAAC,OAAA,EAAS,QAAa,KAAA;AACrD,IAAM,MAAA,IAAA,GAAO,QAAQ,MAAO,CAAA,IAAA,CAAA;AAC5B,IAAS,QAAA,CAAA,IAAA,CAAK,EAAE,GAAK,EAAA,OAAA,CAAQ,MAAM,gBAAgB,CAAA,IAAK,IAAI,CAAA,CAAA;AAAA,GAC7D,CAAA,CAAA;AAED,EAAO,MAAA,CAAA,GAAA,CAAIC,4BAAc,CAAA,CAAA;AACzB,EAAO,OAAA,MAAA,CAAA;AACT;;AC5DO,MAAM,mBAAmBC,oCAAoB,CAAA;AAAA,EAClD,QAAU,EAAA,YAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,YAAYA,6BAAa,CAAA,UAAA;AAAA,OAC3B;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,MAAQ,EAAA,MAAA,EAAQ,YAAc,EAAA;AACzC,QAAW,UAAA,CAAA,GAAA;AAAA,UACT,MAAM,YAAa,CAAA;AAAA,YACjB,MAAA;AAAA,YACA,MAAA;AAAA,WACD,CAAA;AAAA,SACH,CAAA;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,33 +1,10 @@
1
1
  import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
- import { LoggerService } from '@backstage/backend-plugin-api';
3
- import express from 'express';
4
- import { Config } from '@backstage/config';
5
2
 
6
3
  /**
7
- * Router options.
4
+ * Entrypoint for status page plugin.
8
5
  *
9
- * @deprecated Please migrate to the new backend system as this will be removed in the future.
10
6
  * @public
11
7
  */
12
- interface RouterOptions {
13
- /** The logger instance */
14
- logger: LoggerService;
15
- /** Backstage config object */
16
- config: Config;
17
- }
18
- /**
19
- * Create the router.
20
- *
21
- * @deprecated Please migrate to the new backend system as this will be removed in the future.
22
- * @public
23
- */
24
- declare function createRouter(options: RouterOptions): Promise<express.Router>;
25
-
26
- /**
27
- * Entrypoint for our plugin.
28
- *
29
- * @public
30
- */
31
- declare const statuspagePlugin: _backstage_backend_plugin_api.BackendFeatureCompat;
8
+ declare const statuspagePlugin: _backstage_backend_plugin_api.BackendFeature;
32
9
 
33
- export { type RouterOptions, createRouter, statuspagePlugin as default };
10
+ export { statuspagePlugin as default };
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var router = require('./service/router.cjs.js');
5
+
6
+ const statuspagePlugin = backendPluginApi.createBackendPlugin({
7
+ pluginId: "statuspage",
8
+ register(env) {
9
+ env.registerInit({
10
+ deps: {
11
+ cache: backendPluginApi.coreServices.cache,
12
+ httpRouter: backendPluginApi.coreServices.httpRouter,
13
+ logger: backendPluginApi.coreServices.logger,
14
+ rootConfig: backendPluginApi.coreServices.rootConfig
15
+ },
16
+ async init({ cache, httpRouter, logger, rootConfig }) {
17
+ httpRouter.use(
18
+ await router.createRouter({
19
+ rootConfig,
20
+ logger,
21
+ cache
22
+ })
23
+ );
24
+ }
25
+ });
26
+ }
27
+ });
28
+
29
+ exports.statuspagePlugin = statuspagePlugin;
30
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\n\n/**\n * Entrypoint for status page plugin.\n *\n * @public\n */\nexport const statuspagePlugin = createBackendPlugin({\n pluginId: 'statuspage',\n register(env) {\n env.registerInit({\n deps: {\n cache: coreServices.cache,\n httpRouter: coreServices.httpRouter,\n logger: coreServices.logger,\n rootConfig: coreServices.rootConfig,\n },\n async init({ cache, httpRouter, logger, rootConfig }) {\n httpRouter.use(\n await createRouter({\n rootConfig,\n logger,\n cache,\n }),\n );\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","createRouter"],"mappings":";;;;;AAWO,MAAM,mBAAmBA,oCAAoB,CAAA;AAAA,EAClD,QAAU,EAAA,YAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAOC,6BAAa,CAAA,KAAA;AAAA,QACpB,YAAYA,6BAAa,CAAA,UAAA;AAAA,QACzB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,YAAYA,6BAAa,CAAA;AAAA,OAC3B;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,OAAO,UAAY,EAAA,MAAA,EAAQ,YAAc,EAAA;AACpD,QAAW,UAAA,CAAA,GAAA;AAAA,UACT,MAAMC,mBAAa,CAAA;AAAA,YACjB,UAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD;AAAA,SACH;AAAA;AACF,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
@@ -0,0 +1,49 @@
1
+ 'use strict';
2
+
3
+ var fetch = require('cross-fetch');
4
+
5
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
6
+
7
+ var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
8
+
9
+ const BASE_URL = "https://api.statuspage.io/v1/pages/";
10
+ const getInstance = (config, name) => {
11
+ const instance = config.find((i) => i.name === name);
12
+ if (!instance) {
13
+ throw new Error(
14
+ `Config for instance '${name}' not found in statuspage.instances`
15
+ );
16
+ }
17
+ return instance;
18
+ };
19
+ const fetchData = async (url, token) => {
20
+ const response = await fetch__default.default(url, {
21
+ headers: {
22
+ Authorization: `OAuth ${token}`,
23
+ Accept: "application/json"
24
+ }
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`Failed to fetch status page data from ${url}`);
28
+ }
29
+ return response.json();
30
+ };
31
+ const fetchComponents = async (name, config) => {
32
+ const instance = getInstance(config, name);
33
+ const url = `${BASE_URL}${instance.pageid}/components`;
34
+ return fetchData(url, instance.token);
35
+ };
36
+ const fetchComponentGroups = async (name, config) => {
37
+ const instance = getInstance(config, name);
38
+ const url = `${BASE_URL}${instance.pageid}/component-groups`;
39
+ return fetchData(url, instance.token);
40
+ };
41
+ const getLink = (name, config) => {
42
+ const instance = getInstance(config, name);
43
+ return instance.link;
44
+ };
45
+
46
+ exports.fetchComponentGroups = fetchComponentGroups;
47
+ exports.fetchComponents = fetchComponents;
48
+ exports.getLink = getLink;
49
+ //# sourceMappingURL=api.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.cjs.js","sources":["../../src/service/api.ts"],"sourcesContent":["import fetch from 'cross-fetch';\nimport type {\n Component,\n ComponentGroup,\n} from '@axis-backstage/plugin-statuspage-common';\nimport { StatuspageConfig } from '../types';\n\nconst BASE_URL = 'https://api.statuspage.io/v1/pages/';\n\nconst getInstance = (config: StatuspageConfig, name: string) => {\n const instance = config.find(i => i.name === name);\n\n if (!instance) {\n throw new Error(\n `Config for instance '${name}' not found in statuspage.instances`,\n );\n }\n\n return instance;\n};\n\nconst fetchData = async <T>(url: string, token: string): Promise<T> => {\n const response = await fetch(url, {\n headers: {\n Authorization: `OAuth ${token}`,\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch status page data from ${url}`);\n }\n\n return response.json() as T;\n};\n\nexport const fetchComponents = async (\n name: string,\n config: StatuspageConfig,\n): Promise<Component[]> => {\n const instance = getInstance(config, name);\n const url = `${BASE_URL}${instance.pageid}/components`;\n return fetchData<Component[]>(url, instance.token);\n};\n\nexport const fetchComponentGroups = async (\n name: string,\n config: StatuspageConfig,\n): Promise<ComponentGroup[]> => {\n const instance = getInstance(config, name);\n const url = `${BASE_URL}${instance.pageid}/component-groups`;\n return fetchData(url, instance.token);\n};\n\nexport const getLink = (\n name: string,\n config: StatuspageConfig,\n): string | undefined => {\n const instance = getInstance(config, name);\n return instance.link;\n};\n"],"names":["fetch"],"mappings":";;;;;;;;AAOA,MAAM,QAAW,GAAA,qCAAA;AAEjB,MAAM,WAAA,GAAc,CAAC,MAAA,EAA0B,IAAiB,KAAA;AAC9D,EAAA,MAAM,WAAW,MAAO,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA;AAEjD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,wBAAwB,IAAI,CAAA,mCAAA;AAAA,KAC9B;AAAA;AAGF,EAAO,OAAA,QAAA;AACT,CAAA;AAEA,MAAM,SAAA,GAAY,OAAU,GAAA,EAAa,KAA8B,KAAA;AACrE,EAAM,MAAA,QAAA,GAAW,MAAMA,sBAAA,CAAM,GAAK,EAAA;AAAA,IAChC,OAAS,EAAA;AAAA,MACP,aAAA,EAAe,SAAS,KAAK,CAAA,CAAA;AAAA,MAC7B,MAAQ,EAAA;AAAA;AACV,GACD,CAAA;AAED,EAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAyC,sCAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAAA;AAGhE,EAAA,OAAO,SAAS,IAAK,EAAA;AACvB,CAAA;AAEa,MAAA,eAAA,GAAkB,OAC7B,IAAA,EACA,MACyB,KAAA;AACzB,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,MAAA,EAAQ,IAAI,CAAA;AACzC,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAS,MAAM,CAAA,WAAA,CAAA;AACzC,EAAO,OAAA,SAAA,CAAuB,GAAK,EAAA,QAAA,CAAS,KAAK,CAAA;AACnD;AAEa,MAAA,oBAAA,GAAuB,OAClC,IAAA,EACA,MAC8B,KAAA;AAC9B,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,MAAA,EAAQ,IAAI,CAAA;AACzC,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAS,MAAM,CAAA,iBAAA,CAAA;AACzC,EAAO,OAAA,SAAA,CAAU,GAAK,EAAA,QAAA,CAAS,KAAK,CAAA;AACtC;AAEa,MAAA,OAAA,GAAU,CACrB,IAAA,EACA,MACuB,KAAA;AACvB,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,MAAA,EAAQ,IAAI,CAAA;AACzC,EAAA,OAAO,QAAS,CAAA,IAAA;AAClB;;;;;;"}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
4
+ var express = require('express');
5
+ var Router = require('express-promise-router');
6
+ var api = require('./api.cjs.js');
7
+ var config = require('../config.cjs.js');
8
+
9
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
10
+
11
+ var express__default = /*#__PURE__*/_interopDefaultCompat(express);
12
+ var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
13
+
14
+ const COMPONENT_GROUPS_KEY = "component-groups";
15
+ const COMPONENTS_KEY = "components";
16
+ const CACHE_TTL = 1e3 * 60 * 2;
17
+ async function createRouter(options) {
18
+ const { cache, logger, rootConfig } = options;
19
+ logger.info("Setting up router for statuspage-backend");
20
+ const statuspageConfig = config.getStatuspageConfig(rootConfig);
21
+ const router = Router__default.default();
22
+ router.use(express__default.default.json());
23
+ router.get("/fetch-components/:name", async (request, response) => {
24
+ const name = request.params.name;
25
+ let components = await cache.get(`${COMPONENTS_KEY}-${name}`);
26
+ if (!components) {
27
+ components = await api.fetchComponents(name, statuspageConfig);
28
+ await cache.set(`${COMPONENTS_KEY}-${name}`, components, {
29
+ ttl: CACHE_TTL
30
+ });
31
+ }
32
+ response.json(components);
33
+ });
34
+ router.get("/fetch-component-groups/:name", async (request, response) => {
35
+ const name = request.params.name;
36
+ let componentGroups = await cache.get(
37
+ `${COMPONENT_GROUPS_KEY}-${name}`
38
+ );
39
+ if (!componentGroups) {
40
+ componentGroups = await api.fetchComponentGroups(name, statuspageConfig);
41
+ await cache.set(`${COMPONENT_GROUPS_KEY}-${name}`, componentGroups, {
42
+ ttl: CACHE_TTL
43
+ });
44
+ }
45
+ response.json(componentGroups);
46
+ });
47
+ router.get("/fetch-link/:name", (request, response) => {
48
+ const name = request.params.name;
49
+ response.json({ url: api.getLink(name, statuspageConfig) || "" });
50
+ });
51
+ const middleware = rootHttpRouter.MiddlewareFactory.create({ logger, config: rootConfig });
52
+ router.use(middleware.error());
53
+ return router;
54
+ }
55
+
56
+ exports.createRouter = createRouter;
57
+ //# sourceMappingURL=router.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n CacheService,\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport { fetchComponentGroups, fetchComponents, getLink } from './api';\nimport { getStatuspageConfig } from '../config';\n\nexport interface RouterOptions {\n cache: CacheService;\n logger: LoggerService;\n rootConfig: RootConfigService;\n}\n\nconst COMPONENT_GROUPS_KEY = 'component-groups';\nconst COMPONENTS_KEY = 'components';\nconst CACHE_TTL = 1000 * 60 * 2;\n\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { cache, logger, rootConfig } = options;\n logger.info('Setting up router for statuspage-backend');\n const statuspageConfig = getStatuspageConfig(rootConfig);\n\n const router = Router();\n router.use(express.json());\n\n router.get('/fetch-components/:name', async (request, response) => {\n const name = request.params.name;\n let components = (await cache.get(`${COMPONENTS_KEY}-${name}`)) as any;\n if (!components) {\n components = await fetchComponents(name, statuspageConfig);\n await cache.set(`${COMPONENTS_KEY}-${name}`, components, {\n ttl: CACHE_TTL,\n });\n }\n response.json(components);\n });\n\n router.get('/fetch-component-groups/:name', async (request, response) => {\n const name = request.params.name;\n let componentGroups = (await cache.get(\n `${COMPONENT_GROUPS_KEY}-${name}`,\n )) as any;\n if (!componentGroups) {\n componentGroups = await fetchComponentGroups(name, statuspageConfig);\n await cache.set(`${COMPONENT_GROUPS_KEY}-${name}`, componentGroups, {\n ttl: CACHE_TTL,\n });\n }\n response.json(componentGroups);\n });\n\n router.get('/fetch-link/:name', (request, response) => {\n const name = request.params.name;\n response.json({ url: getLink(name, statuspageConfig) || '' });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config: rootConfig });\n router.use(middleware.error());\n return router;\n}\n"],"names":["getStatuspageConfig","Router","express","fetchComponents","fetchComponentGroups","getLink","MiddlewareFactory"],"mappings":";;;;;;;;;;;;;AAiBA,MAAM,oBAAuB,GAAA,kBAAA;AAC7B,MAAM,cAAiB,GAAA,YAAA;AACvB,MAAM,SAAA,GAAY,MAAO,EAAK,GAAA,CAAA;AAE9B,eAAsB,aACpB,OACyB,EAAA;AACzB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAQ,EAAA,UAAA,EAAe,GAAA,OAAA;AACtC,EAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AACtD,EAAM,MAAA,gBAAA,GAAmBA,2BAAoB,UAAU,CAAA;AAEvD,EAAA,MAAM,SAASC,uBAAO,EAAA;AACtB,EAAO,MAAA,CAAA,GAAA,CAAIC,wBAAQ,CAAA,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAI,CAAA,yBAAA,EAA2B,OAAO,OAAA,EAAS,QAAa,KAAA;AACjE,IAAM,MAAA,IAAA,GAAO,QAAQ,MAAO,CAAA,IAAA;AAC5B,IAAI,IAAA,UAAA,GAAc,MAAM,KAAM,CAAA,GAAA,CAAI,GAAG,cAAc,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,CAAA;AAC7D,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAa,UAAA,GAAA,MAAMC,mBAAgB,CAAA,IAAA,EAAM,gBAAgB,CAAA;AACzD,MAAA,MAAM,MAAM,GAAI,CAAA,CAAA,EAAG,cAAc,CAAI,CAAA,EAAA,IAAI,IAAI,UAAY,EAAA;AAAA,QACvD,GAAK,EAAA;AAAA,OACN,CAAA;AAAA;AAEH,IAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,GACzB,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,+BAAA,EAAiC,OAAO,OAAA,EAAS,QAAa,KAAA;AACvE,IAAM,MAAA,IAAA,GAAO,QAAQ,MAAO,CAAA,IAAA;AAC5B,IAAI,IAAA,eAAA,GAAmB,MAAM,KAAM,CAAA,GAAA;AAAA,MACjC,CAAA,EAAG,oBAAoB,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,KACjC;AACA,IAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,MAAkB,eAAA,GAAA,MAAMC,wBAAqB,CAAA,IAAA,EAAM,gBAAgB,CAAA;AACnE,MAAA,MAAM,MAAM,GAAI,CAAA,CAAA,EAAG,oBAAoB,CAAI,CAAA,EAAA,IAAI,IAAI,eAAiB,EAAA;AAAA,QAClE,GAAK,EAAA;AAAA,OACN,CAAA;AAAA;AAEH,IAAA,QAAA,CAAS,KAAK,eAAe,CAAA;AAAA,GAC9B,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,mBAAA,EAAqB,CAAC,OAAA,EAAS,QAAa,KAAA;AACrD,IAAM,MAAA,IAAA,GAAO,QAAQ,MAAO,CAAA,IAAA;AAC5B,IAAS,QAAA,CAAA,IAAA,CAAK,EAAE,GAAK,EAAAC,WAAA,CAAQ,MAAM,gBAAgB,CAAA,IAAK,IAAI,CAAA;AAAA,GAC7D,CAAA;AAED,EAAA,MAAM,aAAaC,gCAAkB,CAAA,MAAA,CAAO,EAAE,MAAQ,EAAA,MAAA,EAAQ,YAAY,CAAA;AAC1E,EAAO,MAAA,CAAA,GAAA,CAAI,UAAW,CAAA,KAAA,EAAO,CAAA;AAC7B,EAAO,OAAA,MAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axis-backstage/plugin-statuspage-backend",
3
- "version": "0.5.2",
3
+ "version": "0.7.0",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -17,7 +17,10 @@
17
17
  "@axis-backstage/plugin-statuspage",
18
18
  "@axis-backstage/plugin-statuspage-backend",
19
19
  "@axis-backstage/plugin-statuspage-common"
20
- ]
20
+ ],
21
+ "features": {
22
+ ".": "@backstage/BackendFeature"
23
+ }
21
24
  },
22
25
  "scripts": {
23
26
  "start": "backstage-cli package start",
@@ -29,22 +32,29 @@
29
32
  "postpack": "backstage-cli package postpack"
30
33
  },
31
34
  "dependencies": {
32
- "@axis-backstage/plugin-statuspage-common": "^0.5.0",
33
- "@backstage/backend-common": "^0.25.0",
34
- "@backstage/backend-plugin-api": "^0.8.0",
35
- "@backstage/config": "^1.2.0",
35
+ "@axis-backstage/plugin-statuspage-common": "^0.6.0",
36
+ "@backstage/backend-defaults": "^0.8.1",
37
+ "@backstage/backend-plugin-api": "^1.2.0",
38
+ "@backstage/config": "^1.3.2",
36
39
  "@types/express": "*",
37
40
  "cross-fetch": "^4.0.0",
38
41
  "express": "^4.17.1",
39
42
  "express-promise-router": "^4.1.0"
40
43
  },
41
44
  "devDependencies": {
42
- "@backstage/cli": "^0.27.0"
45
+ "@backstage/cli": "^0.30.0"
43
46
  },
44
47
  "files": [
45
48
  "dist",
46
49
  "config.d.ts"
47
50
  ],
48
51
  "configSchema": "config.d.ts",
52
+ "typesVersions": {
53
+ "*": {
54
+ "index": [
55
+ "dist/index.d.ts"
56
+ ]
57
+ }
58
+ },
49
59
  "directory": "_release/package"
50
60
  }