@rwdocs/backstage-plugin-rw-backend 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.d.ts +7 -0
- package/dist/plugin.cjs.js +3 -1
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/router.cjs.js.map +1 -1
- package/package.json +7 -2
package/config.d.ts
CHANGED
|
@@ -17,6 +17,13 @@ export interface Config {
|
|
|
17
17
|
endpoint?: string;
|
|
18
18
|
/** Root path within the bucket. */
|
|
19
19
|
bucketRootPath?: string;
|
|
20
|
+
/** AWS access key ID. */
|
|
21
|
+
accessKeyId?: string;
|
|
22
|
+
/**
|
|
23
|
+
* AWS secret access key.
|
|
24
|
+
* @visibility secret
|
|
25
|
+
*/
|
|
26
|
+
secretAccessKey?: string;
|
|
20
27
|
};
|
|
21
28
|
/** Diagram rendering configuration. */
|
|
22
29
|
diagrams?: {
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -23,7 +23,9 @@ const rwPlugin = backendPluginApi.createBackendPlugin({
|
|
|
23
23
|
entity: s3Config.getString("entity"),
|
|
24
24
|
region: s3Config.getOptionalString("region"),
|
|
25
25
|
endpoint: s3Config.getOptionalString("endpoint"),
|
|
26
|
-
bucketRootPath: s3Config.getOptionalString("bucketRootPath")
|
|
26
|
+
bucketRootPath: s3Config.getOptionalString("bucketRootPath"),
|
|
27
|
+
accessKeyId: s3Config.getOptionalString("accessKeyId"),
|
|
28
|
+
secretAccessKey: s3Config.getOptionalString("secretAccessKey")
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
31
|
if (!projectDir && !s3) {
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["import { coreServices, createBackendPlugin } from \"@backstage/backend-plugin-api\";\nimport { createRouter, type S3Options, type DiagramsOptions } from \"./router\";\n\nexport const rwPlugin = createBackendPlugin({\n pluginId: \"rw\",\n register(env) {\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n httpAuth: coreServices.httpAuth,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n },\n async init({ httpRouter, httpAuth, logger, config }) {\n const projectDir = config.getOptionalString(\"rw.projectDir\");\n\n let s3: S3Options | undefined;\n const s3Config = config.getOptionalConfig(\"rw.s3\");\n if (s3Config) {\n s3 = {\n bucket: s3Config.getString(\"bucket\"),\n entity: s3Config.getString(\"entity\"),\n region: s3Config.getOptionalString(\"region\"),\n endpoint: s3Config.getOptionalString(\"endpoint\"),\n bucketRootPath: s3Config.getOptionalString(\"bucketRootPath\"),\n };\n }\n\n if (!projectDir && !s3) {\n throw new Error(\"Either rw.projectDir or rw.s3 must be configured\");\n }\n\n let diagrams: DiagramsOptions | undefined;\n const diagramsConfig = config.getOptionalConfig(\"rw.diagrams\");\n if (diagramsConfig) {\n diagrams = {\n krokiUrl: diagramsConfig.getOptionalString(\"krokiUrl\"),\n dpi: diagramsConfig.getOptionalNumber(\"dpi\"),\n };\n }\n\n const linkPrefix = config.getOptionalString(\"rw.linkPrefix\");\n if (linkPrefix) {\n logger.info(`Using link prefix: ${linkPrefix}`);\n }\n const router = await createRouter({\n logger,\n httpAuth,\n projectDir,\n s3,\n linkPrefix,\n diagrams,\n });\n httpRouter.use(router);\n httpRouter.addAuthPolicy({\n path: \"/health\",\n allow: \"unauthenticated\",\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","router","createRouter"],"mappings":";;;;;AAGO,MAAM,WAAWA,oCAAA,CAAoB;AAAA,EAC1C,QAAA,EAAU,IAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,YAAYC,6BAAA,CAAa,UAAA;AAAA,QACzB,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,QAAQA,6BAAA,CAAa,MAAA;AAAA,QACrB,QAAQA,6BAAA,CAAa;AAAA,OACvB;AAAA,MACA,MAAM,IAAA,CAAK,EAAE,YAAY,QAAA,EAAU,MAAA,EAAQ,QAAO,EAAG;AACnD,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,iBAAA,CAAkB,eAAe,CAAA;AAE3D,QAAA,IAAI,EAAA;AACJ,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA;AACjD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,EAAA,GAAK;AAAA,YACH,MAAA,EAAQ,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA;AAAA,YACnC,MAAA,EAAQ,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA;AAAA,YACnC,MAAA,EAAQ,QAAA,CAAS,iBAAA,CAAkB,QAAQ,CAAA;AAAA,YAC3C,QAAA,EAAU,QAAA,CAAS,iBAAA,CAAkB,UAAU,CAAA;AAAA,YAC/C,cAAA,EAAgB,QAAA,CAAS,iBAAA,CAAkB,gBAAgB;AAAA,
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["import { coreServices, createBackendPlugin } from \"@backstage/backend-plugin-api\";\nimport { createRouter, type S3Options, type DiagramsOptions } from \"./router\";\n\nexport const rwPlugin = createBackendPlugin({\n pluginId: \"rw\",\n register(env) {\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n httpAuth: coreServices.httpAuth,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n },\n async init({ httpRouter, httpAuth, logger, config }) {\n const projectDir = config.getOptionalString(\"rw.projectDir\");\n\n let s3: S3Options | undefined;\n const s3Config = config.getOptionalConfig(\"rw.s3\");\n if (s3Config) {\n s3 = {\n bucket: s3Config.getString(\"bucket\"),\n entity: s3Config.getString(\"entity\"),\n region: s3Config.getOptionalString(\"region\"),\n endpoint: s3Config.getOptionalString(\"endpoint\"),\n bucketRootPath: s3Config.getOptionalString(\"bucketRootPath\"),\n accessKeyId: s3Config.getOptionalString(\"accessKeyId\"),\n secretAccessKey: s3Config.getOptionalString(\"secretAccessKey\"),\n };\n }\n\n if (!projectDir && !s3) {\n throw new Error(\"Either rw.projectDir or rw.s3 must be configured\");\n }\n\n let diagrams: DiagramsOptions | undefined;\n const diagramsConfig = config.getOptionalConfig(\"rw.diagrams\");\n if (diagramsConfig) {\n diagrams = {\n krokiUrl: diagramsConfig.getOptionalString(\"krokiUrl\"),\n dpi: diagramsConfig.getOptionalNumber(\"dpi\"),\n };\n }\n\n const linkPrefix = config.getOptionalString(\"rw.linkPrefix\");\n if (linkPrefix) {\n logger.info(`Using link prefix: ${linkPrefix}`);\n }\n const router = await createRouter({\n logger,\n httpAuth,\n projectDir,\n s3,\n linkPrefix,\n diagrams,\n });\n httpRouter.use(router);\n httpRouter.addAuthPolicy({\n path: \"/health\",\n allow: \"unauthenticated\",\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","router","createRouter"],"mappings":";;;;;AAGO,MAAM,WAAWA,oCAAA,CAAoB;AAAA,EAC1C,QAAA,EAAU,IAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,YAAYC,6BAAA,CAAa,UAAA;AAAA,QACzB,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,QAAQA,6BAAA,CAAa,MAAA;AAAA,QACrB,QAAQA,6BAAA,CAAa;AAAA,OACvB;AAAA,MACA,MAAM,IAAA,CAAK,EAAE,YAAY,QAAA,EAAU,MAAA,EAAQ,QAAO,EAAG;AACnD,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,iBAAA,CAAkB,eAAe,CAAA;AAE3D,QAAA,IAAI,EAAA;AACJ,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA;AACjD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,EAAA,GAAK;AAAA,YACH,MAAA,EAAQ,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA;AAAA,YACnC,MAAA,EAAQ,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA;AAAA,YACnC,MAAA,EAAQ,QAAA,CAAS,iBAAA,CAAkB,QAAQ,CAAA;AAAA,YAC3C,QAAA,EAAU,QAAA,CAAS,iBAAA,CAAkB,UAAU,CAAA;AAAA,YAC/C,cAAA,EAAgB,QAAA,CAAS,iBAAA,CAAkB,gBAAgB,CAAA;AAAA,YAC3D,WAAA,EAAa,QAAA,CAAS,iBAAA,CAAkB,aAAa,CAAA;AAAA,YACrD,eAAA,EAAiB,QAAA,CAAS,iBAAA,CAAkB,iBAAiB;AAAA,WAC/D;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,UAAA,IAAc,CAAC,EAAA,EAAI;AACtB,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AAEA,QAAA,IAAI,QAAA;AACJ,QAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,iBAAA,CAAkB,aAAa,CAAA;AAC7D,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,QAAA,GAAW;AAAA,YACT,QAAA,EAAU,cAAA,CAAe,iBAAA,CAAkB,UAAU,CAAA;AAAA,YACrD,GAAA,EAAK,cAAA,CAAe,iBAAA,CAAkB,KAAK;AAAA,WAC7C;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,iBAAA,CAAkB,eAAe,CAAA;AAC3D,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE,CAAA;AAAA,QAChD;AACA,QAAA,MAAMC,QAAA,GAAS,MAAMC,mBAAA,CAAa;AAAA,UAChC,MAAA;AAAA,UAEA,UAAA;AAAA,UACA,EAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,UAAA,CAAW,IAAID,QAAM,CAAA;AACrB,QAAA,UAAA,CAAW,aAAA,CAAc;AAAA,UACvB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
|
package/dist/router.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs.js","sources":["../src/router.ts"],"sourcesContent":["import Router from \"express-promise-router\";\nimport type { HttpAuthService, LoggerService } from \"@backstage/backend-plugin-api\";\nimport { InputError, NotFoundError } from \"@backstage/errors\";\nimport { createSite, type RwSite, type SiteConfig } from \"@rwdocs/core\";\n\nexport interface S3Options {\n bucket: string;\n entity: string;\n region?: string;\n endpoint?: string;\n bucketRootPath?: string;\n}\n\nexport interface DiagramsOptions {\n krokiUrl?: string;\n dpi?: number;\n}\n\nexport interface RouterOptions {\n logger: LoggerService;\n httpAuth: HttpAuthService;\n projectDir?: string;\n s3?: S3Options;\n linkPrefix?: string;\n diagrams?: DiagramsOptions;\n}\n\nexport async function createRouter(options: RouterOptions) {\n const { logger, projectDir, s3, linkPrefix, diagrams } = options;\n const router = Router();\n\n const config: SiteConfig = { projectDir, s3, linkPrefix, diagrams };\n logger.info(\n s3\n ? `Creating RW site from S3 (${s3.bucket}/${s3.entity})`\n : `Creating RW site from ${projectDir}`,\n );\n const site: RwSite = createSite(config);\n\n router.get(\"/health\", (_req, res) => {\n res.json({ status: \"ok\" });\n });\n\n router.get(\"/config\", (_req, res) => {\n res.json({ liveReloadEnabled: false });\n });\n\n router.get(\"/navigation\", (req, res) => {\n const scopeParam = req.query.scope;\n const scope = typeof scopeParam === \"string\" ? scopeParam : undefined;\n const nav = site.getNavigation(scope ?? null);\n res.json(nav);\n });\n\n router.get(\"/pages/\", async (_req, res) => {\n const page = await renderPageOrThrow(site, \"\");\n res.json(page);\n });\n\n router.get(\"/pages/:path(*)\", async (req, res) => {\n const pagePath = req.params.path || \"\";\n if (pagePath.split(\"/\").includes(\"..\")) {\n throw new InputError(\"Invalid path\");\n }\n const page = await renderPageOrThrow(site, pagePath);\n res.json(page);\n });\n\n return router;\n}\n\nasync function renderPageOrThrow(site: RwSite, pagePath: string) {\n try {\n return await site.renderPage(pagePath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"Content not found\")) {\n throw new NotFoundError(`Page not found: /${pagePath}`);\n }\n throw err;\n }\n}\n"],"names":["Router","createSite","InputError","NotFoundError"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../src/router.ts"],"sourcesContent":["import Router from \"express-promise-router\";\nimport type { HttpAuthService, LoggerService } from \"@backstage/backend-plugin-api\";\nimport { InputError, NotFoundError } from \"@backstage/errors\";\nimport { createSite, type RwSite, type SiteConfig } from \"@rwdocs/core\";\n\nexport interface S3Options {\n bucket: string;\n entity: string;\n region?: string;\n endpoint?: string;\n bucketRootPath?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\nexport interface DiagramsOptions {\n krokiUrl?: string;\n dpi?: number;\n}\n\nexport interface RouterOptions {\n logger: LoggerService;\n httpAuth: HttpAuthService;\n projectDir?: string;\n s3?: S3Options;\n linkPrefix?: string;\n diagrams?: DiagramsOptions;\n}\n\nexport async function createRouter(options: RouterOptions) {\n const { logger, projectDir, s3, linkPrefix, diagrams } = options;\n const router = Router();\n\n const config: SiteConfig = { projectDir, s3, linkPrefix, diagrams };\n logger.info(\n s3\n ? `Creating RW site from S3 (${s3.bucket}/${s3.entity})`\n : `Creating RW site from ${projectDir}`,\n );\n const site: RwSite = createSite(config);\n\n router.get(\"/health\", (_req, res) => {\n res.json({ status: \"ok\" });\n });\n\n router.get(\"/config\", (_req, res) => {\n res.json({ liveReloadEnabled: false });\n });\n\n router.get(\"/navigation\", (req, res) => {\n const scopeParam = req.query.scope;\n const scope = typeof scopeParam === \"string\" ? scopeParam : undefined;\n const nav = site.getNavigation(scope ?? null);\n res.json(nav);\n });\n\n router.get(\"/pages/\", async (_req, res) => {\n const page = await renderPageOrThrow(site, \"\");\n res.json(page);\n });\n\n router.get(\"/pages/:path(*)\", async (req, res) => {\n const pagePath = req.params.path || \"\";\n if (pagePath.split(\"/\").includes(\"..\")) {\n throw new InputError(\"Invalid path\");\n }\n const page = await renderPageOrThrow(site, pagePath);\n res.json(page);\n });\n\n return router;\n}\n\nasync function renderPageOrThrow(site: RwSite, pagePath: string) {\n try {\n return await site.renderPage(pagePath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"Content not found\")) {\n throw new NotFoundError(`Page not found: /${pagePath}`);\n }\n throw err;\n }\n}\n"],"names":["Router","createSite","InputError","NotFoundError"],"mappings":";;;;;;;;;;AA6BA,eAAsB,aAAa,OAAA,EAAwB;AACzD,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,EAAA,EAAI,UAAA,EAAY,UAAS,GAAI,OAAA;AACzD,EAAA,MAAM,SAASA,uBAAA,EAAO;AAEtB,EAAA,MAAM,MAAA,GAAqB,EAAE,UAAA,EAAY,EAAA,EAAI,YAAY,QAAA,EAAS;AAClE,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,EAAA,GACI,6BAA6B,EAAA,CAAG,MAAM,IAAI,EAAA,CAAG,MAAM,CAAA,CAAA,CAAA,GACnD,CAAA,sBAAA,EAAyB,UAAU,CAAA;AAAA,GACzC;AACA,EAAA,MAAM,IAAA,GAAeC,gBAAW,MAAM,CAAA;AAEtC,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,CAAC,IAAA,EAAM,GAAA,KAAQ;AACnC,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,CAAC,IAAA,EAAM,GAAA,KAAQ;AACnC,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,iBAAA,EAAmB,KAAA,EAAO,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,CAAC,GAAA,EAAK,GAAA,KAAQ;AACtC,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAM,KAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,KAAe,QAAA,GAAW,UAAA,GAAa,MAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,KAAA,IAAS,IAAI,CAAA;AAC5C,IAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACd,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,OAAO,IAAA,EAAM,GAAA,KAAQ;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,CAAkB,IAAA,EAAM,EAAE,CAAA;AAC7C,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACf,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,iBAAA,EAAmB,OAAO,GAAA,EAAK,GAAA,KAAQ;AAChD,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,EAAA;AACpC,IAAA,IAAI,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,IAAIC,kBAAW,cAAc,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAQ,CAAA;AACnD,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACf,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,iBAAA,CAAkB,MAAc,QAAA,EAAkB;AAC/D,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,EACvC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,EAAG;AACzC,MAAA,MAAM,IAAIC,oBAAA,CAAc,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACF;;;;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rwdocs/backstage-plugin-rw-backend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"license": "MIT OR Apache-2.0",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/rwdocs/backstage-plugins.git",
|
|
8
|
+
"directory": "plugins/rw-backend"
|
|
9
|
+
},
|
|
5
10
|
"main": "dist/index.cjs.js",
|
|
6
11
|
"types": "dist/index.d.ts",
|
|
7
12
|
"exports": {
|
|
@@ -49,7 +54,7 @@
|
|
|
49
54
|
},
|
|
50
55
|
"dependencies": {
|
|
51
56
|
"@backstage/errors": "^1.2.7",
|
|
52
|
-
"@rwdocs/core": "^0.1.
|
|
57
|
+
"@rwdocs/core": "^0.1.15",
|
|
53
58
|
"express": "^4.21.0",
|
|
54
59
|
"express-promise-router": "^4.1.0"
|
|
55
60
|
},
|