@parsifal-m/backstage-plugin-opa-node 0.1.2 → 0.1.4
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
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# @parsifal-m/backstage-plugin-opa-node
|
|
2
|
+
|
|
3
|
+
## 0.1.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 644e665: Bumps core Backstage dependencies to 1.50.4.
|
|
8
|
+
- 129a32e: Adds a standalone dev setup (dev/index.ts) so the service can be run and tested in isolation without a full Backstage app.
|
|
9
|
+
- dc40942: chore: bump opa-node, fix workspace dep
|
|
10
|
+
- Updated dependencies [e273d1d]
|
|
11
|
+
- @parsifal-m/backstage-plugin-opa-common@0.1.2
|
|
12
|
+
|
|
13
|
+
## 0.1.3
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [923b236]
|
|
18
|
+
- @parsifal-m/backstage-plugin-opa-common@0.1.1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opaClient.cjs.js","sources":["../../src/api/opaClient.ts"],"sourcesContent":["import { LoggerService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport {\n PolicyInput,\n PolicyResult,\n} from '@parsifal-m/backstage-plugin-opa-common';\n\nexport class OpaClient {\n private readonly logger: LoggerService;\n private readonly config: Config;\n private readonly baseUrl: string;\n\n constructor(config: Config, logger: LoggerService) {\n this.config = config;\n this.logger = logger;\n this.baseUrl = this.config.getString('openPolicyAgent.baseUrl');\n }\n\n async evaluatePolicy(\n input: PolicyInput,\n entryPoint: string,\n ): Promise<PolicyResult> {\n if (!this.baseUrl) {\n this.logger.error('The OPA URL is not set in the app-config!');\n throw new Error('The OPA URL is not set in the app-config!');\n }\n\n if (!entryPoint) {\n this.logger.error(\n 'You have not defined a policy entrypoint! Please provide one.',\n );\n throw new Error(\n 'You have not defined a policy entrypoint! Please provide one.',\n );\n }\n\n if (!input) {\n this.logger.error('The policy input is missing!');\n throw new Error('The policy input is missing!');\n }\n\n const opaUrl = `${this.baseUrl}/v1/data/${entryPoint}`;\n\n try {\n const response = await fetch(opaUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ input }),\n });\n\n if (!response.ok) {\n const message = `An error response was returned after sending the policy input to the OPA server: ${response.status} - ${response.statusText}`;\n this.logger.error(message);\n throw new Error(message);\n }\n\n const evalResult = (await response.json()) as PolicyResult;\n this.logger.debug(\n `Received data from OPA: ${JSON.stringify(evalResult)}`,\n );\n\n return evalResult;\n } catch (error: unknown) {\n this.logger.error(\n `An error occurred while sending the policy input to the OPA server: ${error}`,\n );\n throw new Error(\n `An error occurred while sending the policy input to the OPA server: ${error}`,\n );\n }\n }\n}\n"],"names":[],"mappings":";;AAOO,MAAM,
|
|
1
|
+
{"version":3,"file":"opaClient.cjs.js","sources":["../../src/api/opaClient.ts"],"sourcesContent":["import { LoggerService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport {\n PolicyInput,\n PolicyResult,\n} from '@parsifal-m/backstage-plugin-opa-common';\n\nexport class OpaClient {\n private readonly logger: LoggerService;\n private readonly config: Config;\n private readonly baseUrl: string;\n\n constructor(config: Config, logger: LoggerService) {\n this.config = config;\n this.logger = logger;\n this.baseUrl = this.config.getString('openPolicyAgent.baseUrl');\n }\n\n async evaluatePolicy(\n input: PolicyInput,\n entryPoint: string,\n ): Promise<PolicyResult> {\n if (!this.baseUrl) {\n this.logger.error('The OPA URL is not set in the app-config!');\n throw new Error('The OPA URL is not set in the app-config!');\n }\n\n if (!entryPoint) {\n this.logger.error(\n 'You have not defined a policy entrypoint! Please provide one.',\n );\n throw new Error(\n 'You have not defined a policy entrypoint! Please provide one.',\n );\n }\n\n if (!input) {\n this.logger.error('The policy input is missing!');\n throw new Error('The policy input is missing!');\n }\n\n const opaUrl = `${this.baseUrl}/v1/data/${entryPoint}`;\n\n try {\n const response = await fetch(opaUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ input }),\n });\n\n if (!response.ok) {\n const message = `An error response was returned after sending the policy input to the OPA server: ${response.status} - ${response.statusText}`;\n this.logger.error(message);\n throw new Error(message);\n }\n\n const evalResult = (await response.json()) as PolicyResult;\n this.logger.debug(\n `Received data from OPA: ${JSON.stringify(evalResult)}`,\n );\n\n return evalResult;\n } catch (error: unknown) {\n this.logger.error(\n `An error occurred while sending the policy input to the OPA server: ${error}`,\n );\n throw new Error(\n `An error occurred while sending the policy input to the OPA server: ${error}`,\n );\n }\n }\n}\n"],"names":[],"mappings":";;AAOO,MAAM,SAAA,CAAU;AAAA,EACJ,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAEjB,WAAA,CAAY,QAAgB,MAAA,EAAuB;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,yBAAyB,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,cAAA,CACJ,KAAA,EACA,UAAA,EACuB;AACvB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,2CAA2C,CAAA;AAC7D,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,8BAA8B,CAAA;AAChD,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,OAAO,YAAY,UAAU,CAAA,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,QACnC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,OAC/B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,UAAU,CAAA,iFAAA,EAAoF,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,SAAS,UAAU,CAAA,CAAA;AAC5I,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAO,CAAA;AACzB,QAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,MACzB;AAEA,MAAA,MAAM,UAAA,GAAc,MAAM,QAAA,CAAS,IAAA,EAAK;AACxC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,OACvD;AAEA,MAAA,OAAO,UAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,uEAAuE,KAAK,CAAA;AAAA,OAC9E;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,uEAAuE,KAAK,CAAA;AAAA,OAC9E;AAAA,IACF;AAAA,EACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.cjs.js","sources":["../../src/lib/service.ts"],"sourcesContent":["import {\n coreServices,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { DefaultOpaService, OpaService } from '../../service';\n\nexport const opaService = createServiceRef<OpaService>({\n id: 'opa.service',\n scope: 'plugin',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n },\n factory({ config, logger }) {\n return DefaultOpaService.create({\n config,\n logger,\n });\n },\n }),\n});\n"],"names":["createServiceRef","createServiceFactory","coreServices","DefaultOpaService"],"mappings":";;;;;AAOO,MAAM,aAAaA,
|
|
1
|
+
{"version":3,"file":"service.cjs.js","sources":["../../src/lib/service.ts"],"sourcesContent":["import {\n coreServices,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { DefaultOpaService, OpaService } from '../../service';\n\nexport const opaService = createServiceRef<OpaService>({\n id: 'opa.service',\n scope: 'plugin',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n },\n factory({ config, logger }) {\n return DefaultOpaService.create({\n config,\n logger,\n });\n },\n }),\n});\n"],"names":["createServiceRef","createServiceFactory","coreServices","DefaultOpaService"],"mappings":";;;;;AAOO,MAAM,aAAaA,iCAAA,CAA6B;AAAA,EACrD,EAAA,EAAI,aAAA;AAAA,EACJ,KAAA,EAAO,QAAA;AAAA,EACP,cAAA,EAAgB,OAAM,OAAA,KACpBC,qCAAA,CAAqB;AAAA,IACnB,OAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,QAAQC,6BAAA,CAAa,UAAA;AAAA,MACrB,QAAQA,6BAAA,CAAa;AAAA,KACvB;AAAA,IACA,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAG;AAC1B,MAAA,OAAOC,oCAAkB,MAAA,CAAO;AAAA,QAC9B,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,GACD;AACL,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultOpaService.cjs.js","sources":["../../service/DefaultOpaService.ts"],"sourcesContent":["import { LoggerService } from '@backstage/backend-plugin-api';\nimport { OpaClient } from '../src/api/opaClient';\nimport { Config } from '@backstage/config';\nimport {\n PolicyResult,\n PolicyInput,\n} from '@parsifal-m/backstage-plugin-opa-common';\n\n/**\n * OPA Service interface for evaluating policies.\n *\n * @public\n */\nexport interface OpaService {\n /**\n * Evaluate a policy at the given entry point.\n *\n * @param input - The policy input data\n * @param entryPoint - The OPA policy entry point d\n * @returns Promise resolving to the policy evaluation result\n */\n evaluatePolicy<T = PolicyResult>(\n input: PolicyInput,\n entryPoint: string,\n ): Promise<T>;\n}\n\nexport class DefaultOpaService implements OpaService {\n private readonly opaClient: OpaClient;\n\n constructor(opaClient: OpaClient) {\n this.opaClient = opaClient;\n }\n\n static create(options: {\n config: Config;\n logger: LoggerService;\n }): DefaultOpaService {\n const opaClient = new OpaClient(options.config, options.logger);\n return new DefaultOpaService(opaClient);\n }\n\n async evaluatePolicy<T = PolicyResult>(\n input: PolicyInput,\n entryPoint: string,\n ): Promise<T> {\n return this.opaClient.evaluatePolicy(input, entryPoint) as Promise<T>;\n }\n}\n"],"names":["opaClient","OpaClient"],"mappings":";;;;AA2BO,MAAM,
|
|
1
|
+
{"version":3,"file":"DefaultOpaService.cjs.js","sources":["../../service/DefaultOpaService.ts"],"sourcesContent":["import { LoggerService } from '@backstage/backend-plugin-api';\nimport { OpaClient } from '../src/api/opaClient';\nimport { Config } from '@backstage/config';\nimport {\n PolicyResult,\n PolicyInput,\n} from '@parsifal-m/backstage-plugin-opa-common';\n\n/**\n * OPA Service interface for evaluating policies.\n *\n * @public\n */\nexport interface OpaService {\n /**\n * Evaluate a policy at the given entry point.\n *\n * @param input - The policy input data\n * @param entryPoint - The OPA policy entry point d\n * @returns Promise resolving to the policy evaluation result\n */\n evaluatePolicy<T = PolicyResult>(\n input: PolicyInput,\n entryPoint: string,\n ): Promise<T>;\n}\n\nexport class DefaultOpaService implements OpaService {\n private readonly opaClient: OpaClient;\n\n constructor(opaClient: OpaClient) {\n this.opaClient = opaClient;\n }\n\n static create(options: {\n config: Config;\n logger: LoggerService;\n }): DefaultOpaService {\n const opaClient = new OpaClient(options.config, options.logger);\n return new DefaultOpaService(opaClient);\n }\n\n async evaluatePolicy<T = PolicyResult>(\n input: PolicyInput,\n entryPoint: string,\n ): Promise<T> {\n return this.opaClient.evaluatePolicy(input, entryPoint) as Promise<T>;\n }\n}\n"],"names":["opaClient","OpaClient"],"mappings":";;;;AA2BO,MAAM,iBAAA,CAAwC;AAAA,EAClC,SAAA;AAAA,EAEjB,YAAY,SAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,OAAO,OAAO,OAAA,EAGQ;AACpB,IAAA,MAAMA,cAAY,IAAIC,mBAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAC9D,IAAA,OAAO,IAAI,kBAAkBD,WAAS,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,cAAA,CACJ,KAAA,EACA,UAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,KAAA,EAAO,UAAU,CAAA;AAAA,EACxD;AACF;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parsifal-m/backstage-plugin-opa-node",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Provides a Node.js service for integrating Open Policy Agent (OPA) with Backstage backend modules and plugins.",
|
|
6
6
|
"main": "dist/index.cjs.js",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"RBAC"
|
|
32
32
|
],
|
|
33
33
|
"scripts": {
|
|
34
|
+
"start": "backstage-cli package start",
|
|
34
35
|
"build": "backstage-cli package build",
|
|
35
36
|
"lint": "backstage-cli package lint",
|
|
36
37
|
"test": "backstage-cli package test",
|
|
@@ -39,16 +40,20 @@
|
|
|
39
40
|
"postpack": "backstage-cli package postpack"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
|
-
"@backstage/backend-
|
|
43
|
-
"@backstage/
|
|
43
|
+
"@backstage/backend-defaults": "^0.17.0",
|
|
44
|
+
"@backstage/backend-test-utils": "^1.11.2",
|
|
45
|
+
"@backstage/cli": "^0.36.1",
|
|
46
|
+
"@types/express": "^4.17.6",
|
|
47
|
+
"express": "^4.17.1",
|
|
48
|
+
"express-promise-router": "^4.1.0"
|
|
44
49
|
},
|
|
45
50
|
"files": [
|
|
46
51
|
"dist"
|
|
47
52
|
],
|
|
48
53
|
"dependencies": {
|
|
49
|
-
"@backstage/backend-plugin-api": "^1.
|
|
50
|
-
"@backstage/config": "^1.3.
|
|
51
|
-
"@parsifal-m/backstage-plugin-opa-common": "^0.1.
|
|
54
|
+
"@backstage/backend-plugin-api": "^1.9.0",
|
|
55
|
+
"@backstage/config": "^1.3.7",
|
|
56
|
+
"@parsifal-m/backstage-plugin-opa-common": "^0.1.2"
|
|
52
57
|
},
|
|
53
58
|
"typesVersions": {
|
|
54
59
|
"*": {
|