@betterportal/config-manager 10.5.0 → 10.6.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/lib/.bsb/clients/service-betterportal-config-manager.d.ts +1 -1
- package/lib/.bsb/clients/service-betterportal-config-manager.js +1 -1
- package/lib/bp-contracts/org.betterportal.config-manager.json +2330 -1
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts +1466 -0
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js +35 -0
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/adminApi.js +15 -2
- package/lib/plugins/service-betterportal-config-manager/adminApi.js.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.d.ts +8 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.js +10 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.d.ts +18 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.js +15 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.d.ts +8 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.js +10 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.d.ts +8 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.js +10 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.d.ts +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.js +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.d.ts +4 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.js +321 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.d.ts +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.js +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.d.ts +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.js +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.d.ts +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.js +2 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/index.d.ts +3 -0
- package/lib/plugins/service-betterportal-config-manager/index.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/index.js +57 -11
- package/lib/plugins/service-betterportal-config-manager/index.js.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/previewApi.d.ts +7 -0
- package/lib/plugins/service-betterportal-config-manager/previewApi.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/previewApi.js +112 -0
- package/lib/plugins/service-betterportal-config-manager/previewApi.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.d.ts +474 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.js +462 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironments.d.ts +61 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironments.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironments.js +738 -0
- package/lib/plugins/service-betterportal-config-manager/previewEnvironments.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts +3 -1
- package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/storage/core.js +12 -2
- package/lib/plugins/service-betterportal-config-manager/storage/core.js.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts +4 -1
- package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/syncApi.js +6 -3
- package/lib/plugins/service-betterportal-config-manager/syncApi.js.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/tenantManagement.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-config-manager/tenantManagement.js +12 -1
- package/lib/plugins/service-betterportal-config-manager/tenantManagement.js.map +1 -1
- package/lib/schemas/service-betterportal-config-manager.json +1 -1
- package/lib/schemas/service-betterportal-config-manager.plugin.json +1 -1
- package/package.json +10 -10
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ApiAuthRequirement } from "@betterportal/framework";
|
|
2
|
+
export declare const operationId = "admin.preview-environments.delete";
|
|
3
|
+
export declare const title = "Delete preview resources";
|
|
4
|
+
export declare const description = "Delete a preview deployment or group.";
|
|
5
|
+
export declare const auth: ApiAuthRequirement;
|
|
6
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
7
|
+
export { handleDelete as default } from "../../previewEnvironmentManagement.js";
|
|
8
|
+
//# sourceMappingURL=DELETE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DELETE.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,eAAO,MAAM,WAAW,sCAAsC,CAAC;AAC/D,eAAO,MAAM,KAAK,6BAA6B,CAAC;AAChD,eAAO,MAAM,WAAW,0CAA0C,CAAC;AACnE,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const operationId = "admin.preview-environments.delete";
|
|
2
|
+
export const title = "Delete preview resources";
|
|
3
|
+
export const description = "Delete a preview deployment or group.";
|
|
4
|
+
export const auth = {
|
|
5
|
+
required: true,
|
|
6
|
+
permissions: [{ serviceId: "org.betterportal.config-manager", viewId: "preview-environments.index", permissions: ["delete"] }]
|
|
7
|
+
};
|
|
8
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
9
|
+
export { handleDelete as default } from "../../previewEnvironmentManagement.js";
|
|
10
|
+
//# sourceMappingURL=DELETE.js.map
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DELETE.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,mCAAmC,CAAC;AAC/D,MAAM,CAAC,MAAM,KAAK,GAAG,0BAA0B,CAAC;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,uCAAuC,CAAC;AACnE,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE,MAAM,EAAE,4BAA4B,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC/H,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ApiAuthRequirement } from "@betterportal/framework";
|
|
2
|
+
export declare const operationId = "admin.preview-environments.view";
|
|
3
|
+
export declare const title = "View preview environments";
|
|
4
|
+
export declare const description = "List preview groups and their disposable deployments.";
|
|
5
|
+
export declare const dependencies: readonly [{
|
|
6
|
+
readonly operationId: "admin.preview-environments.create";
|
|
7
|
+
readonly method: "POST";
|
|
8
|
+
}, {
|
|
9
|
+
readonly operationId: "admin.preview-environments.update";
|
|
10
|
+
readonly method: "PUT";
|
|
11
|
+
}, {
|
|
12
|
+
readonly operationId: "admin.preview-environments.delete";
|
|
13
|
+
readonly method: "DELETE";
|
|
14
|
+
}];
|
|
15
|
+
export declare const auth: ApiAuthRequirement;
|
|
16
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
17
|
+
export { handleGet as default } from "../../previewEnvironmentManagement.js";
|
|
18
|
+
//# sourceMappingURL=GET.d.ts.map
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,eAAO,MAAM,WAAW,oCAAoC,CAAC;AAC7D,eAAO,MAAM,KAAK,8BAA8B,CAAC;AACjD,eAAO,MAAM,WAAW,0DAA0D,CAAC;AACnF,eAAO,MAAM,YAAY;;;;;;;;;EAIf,CAAC;AACX,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const operationId = "admin.preview-environments.view";
|
|
2
|
+
export const title = "View preview environments";
|
|
3
|
+
export const description = "List preview groups and their disposable deployments.";
|
|
4
|
+
export const dependencies = [
|
|
5
|
+
{ operationId: "admin.preview-environments.create", method: "POST" },
|
|
6
|
+
{ operationId: "admin.preview-environments.update", method: "PUT" },
|
|
7
|
+
{ operationId: "admin.preview-environments.delete", method: "DELETE" }
|
|
8
|
+
];
|
|
9
|
+
export const auth = {
|
|
10
|
+
required: true,
|
|
11
|
+
permissions: [{ serviceId: "org.betterportal.config-manager", viewId: "preview-environments.index", permissions: ["read"] }]
|
|
12
|
+
};
|
|
13
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
14
|
+
export { handleGet as default } from "../../previewEnvironmentManagement.js";
|
|
15
|
+
//# sourceMappingURL=GET.js.map
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAC;AAC7D,MAAM,CAAC,MAAM,KAAK,GAAG,2BAA2B,CAAC;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,uDAAuD,CAAC;AACnF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,EAAE,WAAW,EAAE,mCAAmC,EAAE,MAAM,EAAE,MAAM,EAAE;IACpE,EAAE,WAAW,EAAE,mCAAmC,EAAE,MAAM,EAAE,KAAK,EAAE;IACnE,EAAE,WAAW,EAAE,mCAAmC,EAAE,MAAM,EAAE,QAAQ,EAAE;CAC9D,CAAC;AACX,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE,MAAM,EAAE,4BAA4B,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;CAC7H,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ApiAuthRequirement } from "@betterportal/framework";
|
|
2
|
+
export declare const operationId = "admin.preview-environments.create";
|
|
3
|
+
export declare const title = "Create preview resources";
|
|
4
|
+
export declare const description = "Create preview groups, rotate group credentials, or create a preview deployment.";
|
|
5
|
+
export declare const auth: ApiAuthRequirement;
|
|
6
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
7
|
+
export { handlePost as default } from "../../previewEnvironmentManagement.js";
|
|
8
|
+
//# sourceMappingURL=POST.d.ts.map
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"POST.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,eAAO,MAAM,WAAW,sCAAsC,CAAC;AAC/D,eAAO,MAAM,KAAK,6BAA6B,CAAC;AAChD,eAAO,MAAM,WAAW,qFAAqF,CAAC;AAC9G,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const operationId = "admin.preview-environments.create";
|
|
2
|
+
export const title = "Create preview resources";
|
|
3
|
+
export const description = "Create preview groups, rotate group credentials, or create a preview deployment.";
|
|
4
|
+
export const auth = {
|
|
5
|
+
required: true,
|
|
6
|
+
permissions: [{ serviceId: "org.betterportal.config-manager", viewId: "preview-environments.index", permissions: ["create"] }]
|
|
7
|
+
};
|
|
8
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
9
|
+
export { handlePost as default } from "../../previewEnvironmentManagement.js";
|
|
10
|
+
//# sourceMappingURL=POST.js.map
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"POST.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,mCAAmC,CAAC;AAC/D,MAAM,CAAC,MAAM,KAAK,GAAG,0BAA0B,CAAC;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,kFAAkF,CAAC;AAC9G,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE,MAAM,EAAE,4BAA4B,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC/H,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ApiAuthRequirement } from "@betterportal/framework";
|
|
2
|
+
export declare const operationId = "admin.preview-environments.update";
|
|
3
|
+
export declare const title = "Update preview resources";
|
|
4
|
+
export declare const description = "Update a preview group or deployment expiry.";
|
|
5
|
+
export declare const auth: ApiAuthRequirement;
|
|
6
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
7
|
+
export { handlePut as default } from "../../previewEnvironmentManagement.js";
|
|
8
|
+
//# sourceMappingURL=PUT.d.ts.map
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PUT.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,eAAO,MAAM,WAAW,sCAAsC,CAAC;AAC/D,eAAO,MAAM,KAAK,6BAA6B,CAAC;AAChD,eAAO,MAAM,WAAW,iDAAiD,CAAC;AAC1E,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const operationId = "admin.preview-environments.update";
|
|
2
|
+
export const title = "Update preview resources";
|
|
3
|
+
export const description = "Update a preview group or deployment expiry.";
|
|
4
|
+
export const auth = {
|
|
5
|
+
required: true,
|
|
6
|
+
permissions: [{ serviceId: "org.betterportal.config-manager", viewId: "preview-environments.index", permissions: ["update"] }]
|
|
7
|
+
};
|
|
8
|
+
export { cacheHints, demoScenarios, ResponseSchema } from "../../previewEnvironmentManagement.js";
|
|
9
|
+
export { handlePut as default } from "../../previewEnvironmentManagement.js";
|
|
10
|
+
//# sourceMappingURL=PUT.js.map
|
package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PUT.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,mCAAmC,CAAC;AAC/D,MAAM,CAAC,MAAM,KAAK,GAAG,0BAA0B,CAAC;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,8CAA8C,CAAC;AAC1E,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE,MAAM,EAAE,4BAA4B,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC/H,CAAC;AACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DELETE.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DELETE.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AA8Y7E,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAyJzD"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
|
|
2
|
+
/** @jsxImportSource jsx-htmx */
|
|
3
|
+
import { js } from "jsx-htmx";
|
|
4
|
+
function pageScript() {
|
|
5
|
+
return js(`(() => {
|
|
6
|
+
const tenant = document.getElementById("bp-preview-source-tenant");
|
|
7
|
+
const app = document.getElementById("bp-preview-source-app");
|
|
8
|
+
const syncApps = () => {
|
|
9
|
+
if (!tenant || !app) return;
|
|
10
|
+
[...app.options].forEach((option) => {
|
|
11
|
+
option.hidden = !!option.value && option.dataset.tenantId !== tenant.value;
|
|
12
|
+
});
|
|
13
|
+
if (app.selectedOptions[0]?.hidden) app.value = "";
|
|
14
|
+
};
|
|
15
|
+
tenant?.addEventListener("change", syncApps);
|
|
16
|
+
syncApps();
|
|
17
|
+
|
|
18
|
+
document.querySelectorAll("[data-bp-copy-target]").forEach((button) => {
|
|
19
|
+
button.addEventListener("click", async () => {
|
|
20
|
+
const target = document.getElementById(button.dataset.bpCopyTarget);
|
|
21
|
+
if (!target) return;
|
|
22
|
+
await navigator.clipboard.writeText(target.value || target.textContent || "");
|
|
23
|
+
const original = button.textContent;
|
|
24
|
+
button.textContent = "Copied";
|
|
25
|
+
setTimeout(() => { button.textContent = original; }, 1500);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const decode64 = (value) => {
|
|
30
|
+
const base64 = value.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((value.length + 3) % 4);
|
|
31
|
+
return Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));
|
|
32
|
+
};
|
|
33
|
+
const encode64 = (value) => btoa(String.fromCharCode(...new Uint8Array(value)))
|
|
34
|
+
.replace(/\\+/g, "-").replace(/\\//g, "_").replace(/=+$/, "");
|
|
35
|
+
const importPreviewKey = async (value) => {
|
|
36
|
+
if (!value.startsWith("bp_pck_")) throw new Error("Config key must start with bp_pck_");
|
|
37
|
+
const bytes = decode64(value.slice(7));
|
|
38
|
+
if (bytes.length !== 32) throw new Error("Config key must contain 32 bytes");
|
|
39
|
+
return crypto.subtle.importKey("raw", bytes, "AES-GCM", false, ["encrypt", "decrypt"]);
|
|
40
|
+
};
|
|
41
|
+
const aad = (scope, key) => new TextEncoder().encode("betterportal.preview-config.v1\\n" + scope + "\\n" + key);
|
|
42
|
+
const encryptValue = async (cryptoKey, scope, path, value) => {
|
|
43
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
44
|
+
const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv, additionalData: aad(scope, path), tagLength: 128 }, cryptoKey, new TextEncoder().encode(value));
|
|
45
|
+
return "encrypted:bp-aes256gcm-v1:" + encode64(iv) + ":" + encode64(encrypted);
|
|
46
|
+
};
|
|
47
|
+
const decryptValue = async (cryptoKey, scope, path, value) => {
|
|
48
|
+
const prefix = "encrypted:bp-aes256gcm-v1:";
|
|
49
|
+
if (!value.startsWith(prefix)) throw new Error("Unsupported encrypted config envelope");
|
|
50
|
+
const [iv, encrypted] = value.slice(prefix.length).split(":");
|
|
51
|
+
const clear = await crypto.subtle.decrypt({ name: "AES-GCM", iv: decode64(iv), additionalData: aad(scope, path), tagLength: 128 }, cryptoKey, decode64(encrypted));
|
|
52
|
+
return new TextDecoder().decode(clear);
|
|
53
|
+
};
|
|
54
|
+
const hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value || {}, key);
|
|
55
|
+
const readJson = async (response, label) => {
|
|
56
|
+
const type = response.headers.get("content-type") || "";
|
|
57
|
+
if (type.includes("application/json")) return response.json();
|
|
58
|
+
throw new Error(label + " returned HTTP " + response.status);
|
|
59
|
+
};
|
|
60
|
+
const bpHeaders = () => {
|
|
61
|
+
try {
|
|
62
|
+
const auth = JSON.parse(localStorage.getItem("bp.headers") || "{}").Authorization;
|
|
63
|
+
return auth && typeof auth.value === "string" ? { Authorization: auth.value } : {};
|
|
64
|
+
} catch { return {}; }
|
|
65
|
+
};
|
|
66
|
+
const requestTicket = async (form, source) => {
|
|
67
|
+
const response = await fetch(form.dataset.ticketUrl, {
|
|
68
|
+
method: "POST",
|
|
69
|
+
headers: { ...bpHeaders(), "Content-Type": "application/json", Accept: "application/json" },
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
tenantId: form.dataset.sourceTenantId,
|
|
72
|
+
serviceInstanceId: source.instanceId,
|
|
73
|
+
hostname: source.hostname,
|
|
74
|
+
serviceId: source.serviceId,
|
|
75
|
+
actions: ["config.read"]
|
|
76
|
+
})
|
|
77
|
+
});
|
|
78
|
+
const data = await readJson(response, "Config ticket");
|
|
79
|
+
if (!response.ok || !data.token) throw new Error(data.error || data.message || "Config ticket was rejected");
|
|
80
|
+
return data.token;
|
|
81
|
+
};
|
|
82
|
+
const loadValues = async (form, source, token, appId) => {
|
|
83
|
+
const headers = {
|
|
84
|
+
Accept: "application/json",
|
|
85
|
+
Authorization: "Bearer " + token,
|
|
86
|
+
"x-bp-tenant-id": form.dataset.sourceTenantId
|
|
87
|
+
};
|
|
88
|
+
if (appId) headers["x-bp-app-id"] = appId;
|
|
89
|
+
const response = await fetch(source.hostname.replace(/\\/+$/, "") + "/.well-known/bp/config", {
|
|
90
|
+
headers,
|
|
91
|
+
cache: "no-store"
|
|
92
|
+
});
|
|
93
|
+
const data = await readJson(response, source.serviceId + " config");
|
|
94
|
+
if (!response.ok) throw new Error(data.error || data.message || "Config read failed");
|
|
95
|
+
return data.values || {};
|
|
96
|
+
};
|
|
97
|
+
const inputValue = (input) => input.type === "checkbox" ? String(input.checked) : input.value.trim();
|
|
98
|
+
const setInputValue = (input, value) => {
|
|
99
|
+
if (input.type === "checkbox") input.checked = value === "true";
|
|
100
|
+
else input.value = value;
|
|
101
|
+
};
|
|
102
|
+
const displayValue = (value) => typeof value === "string" ? value : JSON.stringify(value);
|
|
103
|
+
|
|
104
|
+
document.querySelectorAll("[data-bp-preview-config-form]").forEach((form) => {
|
|
105
|
+
const keyInput = form.querySelector("[data-bp-preview-key]");
|
|
106
|
+
const status = form.querySelector("[data-bp-preview-config-status]");
|
|
107
|
+
const dialog = form.querySelector("[data-bp-sync-dialog]");
|
|
108
|
+
const dialogBody = form.querySelector("[data-bp-sync-body]");
|
|
109
|
+
let pendingDiff = [];
|
|
110
|
+
const existing = {};
|
|
111
|
+
form.querySelectorAll("[data-bp-existing-config]").forEach((node) => {
|
|
112
|
+
existing[node.dataset.serviceId] = {
|
|
113
|
+
tenant: JSON.parse(node.dataset.tenant || "{}"),
|
|
114
|
+
app: JSON.parse(node.dataset.app || "{}")
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
const setSecretsEnabled = (enabled) => {
|
|
118
|
+
form.querySelectorAll("[data-bp-config-field][data-secret=true], [data-bp-clear-secret]").forEach((input) => {
|
|
119
|
+
input.disabled = !enabled;
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
setSecretsEnabled(false);
|
|
123
|
+
form.querySelector("[data-bp-generate-key]")?.addEventListener("click", () => {
|
|
124
|
+
keyInput.value = "bp_pck_" + encode64(crypto.getRandomValues(new Uint8Array(32)));
|
|
125
|
+
setSecretsEnabled(true);
|
|
126
|
+
status.textContent = "New key generated. Encrypted fields are unlocked.";
|
|
127
|
+
status.className = "alert alert-warning py-2";
|
|
128
|
+
});
|
|
129
|
+
form.querySelector("[data-bp-decrypt-config]")?.addEventListener("click", async () => {
|
|
130
|
+
try {
|
|
131
|
+
const cryptoKey = await importPreviewKey(keyInput.value.trim());
|
|
132
|
+
for (const input of form.querySelectorAll("[data-bp-config-field][data-secret=true]")) {
|
|
133
|
+
const encrypted = existing[input.dataset.serviceId]?.[input.dataset.scope]?.[input.dataset.key];
|
|
134
|
+
if (encrypted) input.value = await decryptValue(cryptoKey, input.dataset.scope, input.dataset.key, encrypted);
|
|
135
|
+
}
|
|
136
|
+
setSecretsEnabled(true);
|
|
137
|
+
status.textContent = "Secrets decrypted in this browser only.";
|
|
138
|
+
status.className = "alert alert-success py-2";
|
|
139
|
+
} catch (error) {
|
|
140
|
+
status.textContent = error.message || String(error);
|
|
141
|
+
status.className = "alert alert-danger py-2";
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
form.querySelector("[data-bp-sync-prod]")?.addEventListener("click", async () => {
|
|
145
|
+
pendingDiff = [];
|
|
146
|
+
dialogBody.replaceChildren();
|
|
147
|
+
const loading = document.createElement("div");
|
|
148
|
+
loading.className = "alert alert-secondary";
|
|
149
|
+
loading.textContent = "Reading production configuration...";
|
|
150
|
+
dialogBody.append(loading);
|
|
151
|
+
dialog.showModal();
|
|
152
|
+
const sources = [...form.querySelectorAll("[data-bp-existing-config]")];
|
|
153
|
+
for (const node of sources) {
|
|
154
|
+
const section = document.createElement("section");
|
|
155
|
+
section.className = "mb-4";
|
|
156
|
+
const heading = document.createElement("h4");
|
|
157
|
+
heading.className = "h6 font-monospace";
|
|
158
|
+
heading.textContent = node.dataset.serviceId;
|
|
159
|
+
section.append(heading);
|
|
160
|
+
dialogBody.append(section);
|
|
161
|
+
const source = {
|
|
162
|
+
serviceId: node.dataset.serviceId,
|
|
163
|
+
instanceId: node.dataset.sourceInstanceId,
|
|
164
|
+
hostname: node.dataset.sourceHostname
|
|
165
|
+
};
|
|
166
|
+
if (!source.instanceId || !source.hostname) {
|
|
167
|
+
const note = document.createElement("div");
|
|
168
|
+
note.className = "alert alert-warning py-2";
|
|
169
|
+
note.textContent = "Production service registration is unavailable.";
|
|
170
|
+
section.append(note);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const token = await requestTicket(form, source);
|
|
175
|
+
const serviceInputs = [...form.querySelectorAll("[data-bp-config-field]")].filter((input) => input.dataset.serviceId === source.serviceId);
|
|
176
|
+
const [tenantValues, appValues] = await Promise.all([
|
|
177
|
+
serviceInputs.some((input) => input.dataset.scope === "tenant") ? loadValues(form, source, token, "") : {},
|
|
178
|
+
serviceInputs.some((input) => input.dataset.scope === "app") ? loadValues(form, source, token, form.dataset.sourceAppId) : {}
|
|
179
|
+
]);
|
|
180
|
+
let changes = 0;
|
|
181
|
+
for (const input of serviceInputs) {
|
|
182
|
+
const production = input.dataset.scope === "app" ? appValues : tenantValues;
|
|
183
|
+
const hasProductionValue = hasOwn(production, input.dataset.key);
|
|
184
|
+
const fallback = input.dataset.defaultValue === undefined ? "" : JSON.parse(input.dataset.defaultValue);
|
|
185
|
+
const target = displayValue(hasProductionValue ? production[input.dataset.key] : fallback);
|
|
186
|
+
if (input.dataset.secret === "true") {
|
|
187
|
+
const line = document.createElement("div");
|
|
188
|
+
line.className = "font-monospace small bg-body-tertiary px-2 py-1";
|
|
189
|
+
const checkbox = document.createElement("input");
|
|
190
|
+
checkbox.type = "checkbox";
|
|
191
|
+
checkbox.disabled = true;
|
|
192
|
+
checkbox.className = "form-check-input me-2";
|
|
193
|
+
line.append(checkbox, document.createTextNode("+ " + input.dataset.scope + "." + input.dataset.key + " = [secret is not exported by the service]"));
|
|
194
|
+
section.append(line);
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (inputValue(input) === target) continue;
|
|
198
|
+
changes++;
|
|
199
|
+
const oldLine = document.createElement("div");
|
|
200
|
+
oldLine.className = "font-monospace small bg-danger-subtle text-danger-emphasis px-2 py-1";
|
|
201
|
+
oldLine.textContent = "- " + input.dataset.scope + "." + input.dataset.key + " = " + inputValue(input);
|
|
202
|
+
const newLine = document.createElement("div");
|
|
203
|
+
newLine.className = "font-monospace small bg-success-subtle text-success-emphasis px-2 py-1";
|
|
204
|
+
const checkbox = document.createElement("input");
|
|
205
|
+
checkbox.type = "checkbox";
|
|
206
|
+
checkbox.checked = true;
|
|
207
|
+
checkbox.className = "form-check-input me-2";
|
|
208
|
+
newLine.append(checkbox, document.createTextNode("+ " + input.dataset.scope + "." + input.dataset.key + " = " + target + (hasProductionValue ? "" : " (schema default)")));
|
|
209
|
+
section.append(oldLine, newLine);
|
|
210
|
+
pendingDiff.push({ checkbox, input, value: target });
|
|
211
|
+
}
|
|
212
|
+
if (changes === 0) {
|
|
213
|
+
const note = document.createElement("div");
|
|
214
|
+
note.className = "text-secondary small";
|
|
215
|
+
note.textContent = "No transferable changes.";
|
|
216
|
+
section.append(note);
|
|
217
|
+
}
|
|
218
|
+
} catch (error) {
|
|
219
|
+
const note = document.createElement("div");
|
|
220
|
+
note.className = "alert alert-warning py-2";
|
|
221
|
+
note.textContent = "Could not reach this service: " + (error.message || String(error));
|
|
222
|
+
section.append(note);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
loading.remove();
|
|
226
|
+
});
|
|
227
|
+
form.querySelector("[data-bp-sync-apply]")?.addEventListener("click", () => {
|
|
228
|
+
const selected = pendingDiff.filter((change) => change.checkbox.checked);
|
|
229
|
+
for (const change of selected) setInputValue(change.input, change.value);
|
|
230
|
+
dialog.close();
|
|
231
|
+
if (selected.length > 0) form.requestSubmit();
|
|
232
|
+
});
|
|
233
|
+
form.querySelectorAll("[data-bp-sync-close]").forEach((button) => button.addEventListener("click", () => dialog.close()));
|
|
234
|
+
form.addEventListener("submit", async (event) => {
|
|
235
|
+
event.preventDefault();
|
|
236
|
+
event.stopImmediatePropagation();
|
|
237
|
+
try {
|
|
238
|
+
const values = structuredClone(existing);
|
|
239
|
+
const clearedSecrets = new Set([...form.querySelectorAll("[data-bp-clear-secret]:checked")].map((input) =>
|
|
240
|
+
input.dataset.serviceId + "\\n" + input.dataset.scope + "\\n" + input.dataset.key
|
|
241
|
+
));
|
|
242
|
+
let cryptoKey;
|
|
243
|
+
for (const input of form.querySelectorAll("[data-bp-config-field]")) {
|
|
244
|
+
const service = values[input.dataset.serviceId] ||= { tenant: {}, app: {} };
|
|
245
|
+
const scope = service[input.dataset.scope] ||= {};
|
|
246
|
+
const value = inputValue(input);
|
|
247
|
+
if (!value) {
|
|
248
|
+
const secretKey = input.dataset.serviceId + "\\n" + input.dataset.scope + "\\n" + input.dataset.key;
|
|
249
|
+
if (input.dataset.secret === "true" && scope[input.dataset.key] && !clearedSecrets.has(secretKey)) continue;
|
|
250
|
+
if (input.required && !(input.dataset.secret === "true" && scope[input.dataset.key])) throw new Error(input.dataset.title + " is required");
|
|
251
|
+
if (!input.required || clearedSecrets.has(secretKey)) delete scope[input.dataset.key];
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (input.dataset.secret === "true") {
|
|
255
|
+
cryptoKey ||= await importPreviewKey(keyInput.value.trim());
|
|
256
|
+
scope[input.dataset.key] = await encryptValue(cryptoKey, input.dataset.scope, input.dataset.key, value);
|
|
257
|
+
} else {
|
|
258
|
+
scope[input.dataset.key] = value;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
status.textContent = "Saving encrypted config...";
|
|
262
|
+
status.className = "alert alert-info py-2";
|
|
263
|
+
await window.htmx.ajax("POST", form.dataset.path, {
|
|
264
|
+
source: form,
|
|
265
|
+
target: "#bp-main",
|
|
266
|
+
swap: "innerHTML",
|
|
267
|
+
values: { action: "save-config", groupId: form.dataset.groupId, configs: JSON.stringify(values) }
|
|
268
|
+
});
|
|
269
|
+
} catch (error) {
|
|
270
|
+
status.textContent = error.message || String(error);
|
|
271
|
+
status.className = "alert alert-danger py-2";
|
|
272
|
+
}
|
|
273
|
+
}, true);
|
|
274
|
+
});
|
|
275
|
+
})()`);
|
|
276
|
+
}
|
|
277
|
+
function oidcFields(prefix, oidc) {
|
|
278
|
+
return (_jsxs("details", { class: "border rounded p-3 mb-3", children: [_jsx("summary", { class: "fw-semibold", children: "OIDC restrictions (recommended for CI)" }), _jsxs("div", { class: "mt-3", children: [_jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: `${prefix}-oidc-issuer`, children: "Issuer" }), _jsx("input", { id: `${prefix}-oidc-issuer`, class: "form-control font-monospace", type: "url", name: "oidcIssuer", value: oidc?.issuer ?? "", placeholder: "https://token.actions.githubusercontent.com" })] }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: `${prefix}-oidc-audience`, children: "Audience" }), _jsx("input", { id: `${prefix}-oidc-audience`, class: "form-control font-monospace", name: "oidcAudience", value: oidc?.audience ?? "" })] }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: `${prefix}-oidc-jwks`, children: "JWKS URL" }), _jsx("input", { id: `${prefix}-oidc-jwks`, class: "form-control font-monospace", type: "url", name: "oidcJwksUri", value: oidc?.jwksUri ?? "", placeholder: "https://token.actions.githubusercontent.com/.well-known/jwks" })] }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: `${prefix}-oidc-subject`, children: "Subject prefix" }), _jsx("input", { id: `${prefix}-oidc-subject`, class: "form-control font-monospace", name: "oidcSubjectPrefix", value: oidc?.subjectPrefix ?? "", placeholder: "repo:org/repository:" })] }), _jsxs("div", { children: [_jsx("label", { class: "form-label", for: `${prefix}-oidc-claims`, children: "Required claims (JSON string values)" }), _jsx("textarea", { id: `${prefix}-oidc-claims`, class: "form-control font-monospace", name: "oidcRequiredClaims", rows: 3, children: oidc?.requiredClaimsJson ?? "{}" })] })] })] }));
|
|
279
|
+
}
|
|
280
|
+
function expiryInput(current, includeDefault = false, label = "Expiry") {
|
|
281
|
+
return _jsx("input", { class: "form-control", name: "expiresInDays", inputmode: "numeric", maxlength: "5", pattern: "(?:never|[1-9][0-9]{0,3})", value: current === undefined ? includeDefault ? "" : "never" : String(current), placeholder: includeDefault ? "Group default" : "30 or never", "aria-label": label, required: !includeDefault });
|
|
282
|
+
}
|
|
283
|
+
function credentials(data) {
|
|
284
|
+
if (!data.issuedApiKey && data.issuedCredentials.length === 0)
|
|
285
|
+
return null;
|
|
286
|
+
return (_jsxs("div", { class: "alert alert-warning", role: "status", children: [_jsx("h3", { class: "h6", children: "Copy these credentials now" }), _jsx("p", { class: "small mb-3", children: "They are shown once and cannot be recovered." }), data.issuedApiKey ? (_jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: "bp-issued-group-key", children: "Preview group API key" }), _jsxs("div", { class: "input-group", children: [_jsx("input", { id: "bp-issued-group-key", class: "form-control font-monospace", value: data.issuedApiKey, readonly: true }), _jsx("button", { class: "btn btn-outline-dark", type: "button", "data-bp-copy-target": "bp-issued-group-key", children: "Copy" })] })] })) : null, data.issuedCredentials.map((credential, index) => {
|
|
287
|
+
const id = `bp-issued-service-${index}`;
|
|
288
|
+
return (_jsxs("div", { class: "mb-3", children: [_jsx("div", { class: "fw-semibold", children: credential.serviceId }), _jsx("textarea", { id: id, class: "form-control font-monospace small", rows: 2, readonly: true, children: `BP_CONTROL_PLANE_URL=${credential.controlPlaneUrl}\nBP_SERVICE_API_KEY=${credential.apiKey}` }), _jsx("button", { class: "btn btn-sm btn-outline-dark mt-2", type: "button", "data-bp-copy-target": id, children: "Copy environment" })] }));
|
|
289
|
+
})] }));
|
|
290
|
+
}
|
|
291
|
+
function configEditor(group, path, ticketUrl) {
|
|
292
|
+
const hasFields = group.services.some((service) => service.fields.length > 0);
|
|
293
|
+
const existing = (service, scope) => {
|
|
294
|
+
try {
|
|
295
|
+
return JSON.parse(scope === "tenant" ? service.encryptedTenantConfig : service.encryptedAppConfig);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return {};
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
const fieldControl = (service, field) => {
|
|
302
|
+
const stored = existing(service, field.scope);
|
|
303
|
+
const current = Object.prototype.hasOwnProperty.call(stored, field.key) ? stored[field.key] : field.defaultValue;
|
|
304
|
+
const value = current == null ? "" : typeof current === "string" ? current : JSON.stringify(current);
|
|
305
|
+
if (!field.secret && field.control === "select" && field.options.length > 0) {
|
|
306
|
+
return _jsxs("select", { class: "form-select", "data-bp-config-field": "", "data-service-id": service.serviceId, "data-scope": field.scope, "data-key": field.key, "data-title": field.title, "data-secret": "false", "data-default-value": field.defaultValue === undefined ? undefined : JSON.stringify(field.defaultValue), required: field.required, children: [!field.required ? _jsx("option", { value: "", children: "Not set" }) : null, field.options.map((option) => _jsx("option", { value: option.value, selected: value === option.value, children: option.label }))] });
|
|
307
|
+
}
|
|
308
|
+
if (!field.secret && field.control === "checkbox") {
|
|
309
|
+
return _jsx("input", { class: "form-check-input", type: "checkbox", checked: value === "true" || value === "1" || value === "on", "data-bp-config-field": "", "data-service-id": service.serviceId, "data-scope": field.scope, "data-key": field.key, "data-title": field.title, "data-secret": "false", "data-default-value": field.defaultValue === undefined ? undefined : JSON.stringify(field.defaultValue) });
|
|
310
|
+
}
|
|
311
|
+
return _jsx("input", { class: "form-control", type: field.secret ? "password" : field.control === "email" || field.control === "url" || field.control === "number" ? field.control : "text", maxlength: "255", value: field.secret ? "" : value, autocomplete: field.secret ? "new-password" : "off", "data-bp-config-field": "", "data-service-id": service.serviceId, "data-scope": field.scope, "data-key": field.key, "data-title": field.title, "data-secret": field.secret ? "true" : "false", "data-default-value": field.defaultValue === undefined ? undefined : JSON.stringify(field.defaultValue), disabled: field.secret, required: field.required && !field.secret });
|
|
312
|
+
};
|
|
313
|
+
return (_jsxs("details", { class: "border rounded p-3 mt-3", children: [_jsx("summary", { class: "fw-semibold", children: "Encrypted service configuration" }), !hasFields ? _jsx("div", { class: "alert alert-secondary mt-3 mb-0", children: "No synced service config schemas are available for this group." }) : (_jsxs("form", { class: "mt-3", "data-bp-preview-config-form": "", "data-group-id": group.id, "data-path": path, "data-ticket-url": ticketUrl, "data-source-tenant-id": group.sourceTenantId, "data-source-app-id": group.sourceAppId, children: [_jsxs("div", { class: "alert alert-warning small", children: ["Use preview-only values. The key and decrypted secrets stay in this browser; BetterPortal stores only ", _jsx("code", { children: "encrypted:" }), " envelopes."] }), _jsx("label", { class: "form-label", for: `bp-preview-key-${group.id}`, children: "Preview config key" }), _jsxs("div", { class: "input-group mb-2", children: [_jsx("input", { id: `bp-preview-key-${group.id}`, class: "form-control font-monospace", type: "password", autocomplete: "off", "data-bp-preview-key": "" }), _jsx("button", { class: "btn btn-outline-secondary", type: "button", "data-bp-generate-key": "", children: "Generate" }), _jsx("button", { class: "btn btn-outline-secondary", type: "button", "data-bp-copy-target": `bp-preview-key-${group.id}`, children: "Copy" })] }), _jsxs("div", { class: "form-text mb-3", children: ["Set this exact value as ", _jsx("code", { children: "BP_PREVIEW_CONFIG_KEY" }), " on every configured preview service. Keep it outside BetterPortal."] }), _jsx("button", { class: "btn btn-sm btn-outline-secondary mb-3", type: "button", "data-bp-decrypt-config": "", children: "Decrypt stored secrets" }), group.services.map((service) => (_jsxs("fieldset", { class: "border rounded p-3 mb-3", children: [_jsx("legend", { class: "float-none w-auto px-2 fs-6", children: service.title }), _jsx("span", { hidden: true, "data-bp-existing-config": "", "data-service-id": service.serviceId, "data-tenant": service.encryptedTenantConfig, "data-app": service.encryptedAppConfig, "data-source-instance-id": service.source?.instanceId, "data-source-hostname": service.source?.hostname }), service.fields.length === 0 ? _jsx("div", { class: "alert alert-warning mb-0", children: "This service has not synced a config schema yet. Its existing preview config will be preserved." }) : null, ["tenant", "app"].map((scope) => {
|
|
314
|
+
const fields = service.fields.filter((field) => field.scope === scope);
|
|
315
|
+
return fields.length === 0 ? null : _jsxs("div", { class: "mb-3", children: [_jsxs("div", { class: "text-uppercase text-secondary small fw-semibold mb-2", children: [scope, " config"] }), _jsx("div", { class: "row g-3", children: fields.map((field) => _jsxs("div", { class: "col-12 col-lg-6", children: [_jsxs("label", { class: "form-label", children: [field.title, field.required ? " *" : ""] }), fieldControl(service, field), _jsxs("div", { class: "form-text", children: [field.description, field.secret ? " Unlock with a generated key or decrypt the stored values first." : ""] }), field.secret && !field.required ? _jsxs("div", { class: "form-check mt-1", children: [_jsx("input", { class: "form-check-input", type: "checkbox", disabled: true, "data-bp-clear-secret": "", "data-service-id": service.serviceId, "data-scope": field.scope, "data-key": field.key, id: `bp-clear-${group.id}-${service.serviceId}-${field.scope}-${field.key}` }), _jsx("label", { class: "form-check-label small", for: `bp-clear-${group.id}-${service.serviceId}-${field.scope}-${field.key}`, children: "Clear stored value" })] }) : null] })) })] });
|
|
316
|
+
})] }))), _jsx("div", { class: "alert alert-secondary py-2", "data-bp-preview-config-status": "", role: "status", children: "Key is never submitted." }), _jsxs("div", { class: "d-flex flex-wrap gap-2", children: [_jsx("button", { class: "btn btn-primary", type: "submit", children: "Encrypt and save config" }), _jsx("button", { class: "btn btn-outline-secondary", type: "button", "data-bp-sync-prod": "", children: "Sync from prod" })] }), _jsxs("dialog", { class: "border-0 rounded shadow p-0", style: "width:min(92vw,72rem);max-height:90vh", "data-bp-sync-dialog": "", children: [_jsxs("div", { class: "p-3 border-bottom d-flex justify-content-between align-items-center", children: [_jsx("h3", { class: "h5 mb-0", children: "Production config diff" }), _jsx("button", { class: "btn-close", type: "button", "aria-label": "Close", "data-bp-sync-close": "" })] }), _jsx("div", { class: "p-3 overflow-auto", style: "max-height:70vh", "data-bp-sync-body": "" }), _jsxs("div", { class: "p-3 border-top d-flex justify-content-end gap-2", children: [_jsx("button", { class: "btn btn-outline-secondary", type: "button", "data-bp-sync-close": "", children: "Cancel" }), _jsx("button", { class: "btn btn-primary", type: "button", "data-bp-sync-apply": "", children: "Apply selected and save" })] })] })] }))] }));
|
|
317
|
+
}
|
|
318
|
+
export function render(data) {
|
|
319
|
+
return (_jsxs("div", { class: "container-fluid px-0", children: [_jsxs("div", { class: "d-flex flex-wrap justify-content-between align-items-start gap-3 mb-4", children: [_jsxs("div", { children: [_jsx("h2", { class: "mb-1", children: data.title }), _jsx("p", { class: "text-secondary mb-0", children: "Clone an existing tenant/app configuration while CI owns where each service runs." })] }), _jsx("button", { class: "btn btn-primary", "data-bs-toggle": "offcanvas", "data-bs-target": "#bp-create-preview-group", children: "Create group" })] }), data.notice ? _jsx("div", { class: "alert alert-success", role: "status", children: data.notice }) : null, data.error ? _jsx("div", { class: "alert alert-danger", role: "alert", children: data.error }) : null, credentials(data), _jsxs("div", { class: "alert alert-info d-flex gap-2 align-items-start", children: [_jsx("span", { "aria-hidden": "true", children: "i" }), _jsxs("div", { children: [_jsx("strong", { children: "Pull setup only." }), " Services receive credentials from CI, publish their manifest on first sync, and rebuild preview routes/menu automatically."] })] }), data.groups.length === 0 ? (_jsx("div", { class: "card border-0 shadow-sm", children: _jsx("div", { class: "card-body py-5 text-center text-secondary", children: "No preview groups configured." }) })) : data.groups.map((group) => (_jsx("section", { class: "card border-0 shadow-sm mb-4", "aria-labelledby": `bp-group-${group.id}`, children: _jsxs("div", { class: "card-body", children: [_jsxs("div", { class: "d-flex flex-wrap justify-content-between align-items-start gap-3 mb-3", children: [_jsxs("div", { children: [_jsx("h3", { class: "h5 mb-1", id: `bp-group-${group.id}`, children: group.name }), _jsx("div", { class: "small text-secondary", children: group.sourceLabel }), _jsx("code", { class: "small", children: group.id })] }), _jsxs("div", { class: "d-flex flex-wrap gap-2", children: [_jsx("button", { class: "btn btn-sm btn-outline-primary", "data-bs-toggle": "collapse", "data-bs-target": `#bp-new-${group.id}`, children: "New preview" }), _jsx("button", { class: "btn btn-sm btn-outline-secondary", "data-bs-toggle": "collapse", "data-bs-target": `#bp-settings-${group.id}`, children: "Settings" }), _jsx("button", { class: "btn btn-sm btn-outline-danger", "hx-delete": `${data.previewPath}?entity=group&id=${encodeURIComponent(group.id)}`, "hx-confirm": `Delete ${group.name} and all of its previews?`, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: "Delete" })] })] }), _jsxs("div", { class: "row g-3 mb-3", children: [_jsxs("div", { class: "col-12 col-xl-7", children: [_jsx("div", { class: "small text-secondary mb-1", children: "CI endpoint" }), _jsxs("code", { class: "d-block text-break", children: ["POST ", data.deploymentApiBase, "/", group.id, "/deployments/<key>"] })] }), _jsxs("div", { class: "col-12 col-xl-5", children: [_jsx("div", { class: "small text-secondary mb-1", children: "Discovered services" }), _jsx("div", { class: "d-flex flex-wrap gap-1", children: group.services.length ? group.services.map((service) => _jsx("span", { class: "badge text-bg-secondary", children: service.serviceId })) : _jsx("span", { class: "small text-secondary", children: "Added by the first preview create request." }) })] })] }), _jsx("div", { class: "collapse mb-4", id: `bp-new-${group.id}`, children: _jsxs("div", { class: "border rounded p-3 bg-body-tertiary", children: [_jsx("h4", { class: "h6", children: "Create preview manually" }), _jsxs("form", { "hx-post": data.previewPath, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: [_jsx("input", { type: "hidden", name: "action", value: "create-deployment" }), _jsx("input", { type: "hidden", name: "groupId", value: group.id }), _jsxs("div", { class: "row g-3", children: [_jsxs("div", { class: "col-12 col-md-4", children: [_jsx("label", { class: "form-label", children: "Key" }), _jsx("input", { class: "form-control font-monospace", name: "key", maxlength: "255", pattern: "[A-Za-z0-9][A-Za-z0-9._:-]*", required: true })] }), _jsxs("div", { class: "col-12 col-md-4", children: [_jsx("label", { class: "form-label", children: "Name" }), _jsx("input", { class: "form-control", name: "name" })] }), _jsxs("div", { class: "col-12 col-md-4", children: [_jsx("label", { class: "form-label", children: "Expiry" }), expiryInput(undefined, true)] }), _jsxs("div", { class: "col-12", children: [_jsx("label", { class: "form-label", children: "App hostname or origin" }), _jsx("input", { class: "form-control font-monospace", name: "hostname", placeholder: "pr-123.preview.example.com", required: true })] }), _jsxs("div", { class: "col-12", children: [_jsx("label", { class: "form-label", for: `bp-preview-services-${group.id}`, children: "Services" }), _jsx("textarea", { id: `bp-preview-services-${group.id}`, class: "form-control font-monospace", name: "services", rows: Math.max(4, group.services.length + 2), required: true, children: JSON.stringify(Object.fromEntries(group.services.map((service) => [service.serviceId, ""])), null, 2) }), _jsx("div", { class: "form-text", children: "JSON object mapping service IDs to public HTTPS URLs." })] })] }), _jsx("button", { class: "btn btn-primary mt-3", type: "submit", children: "Create preview" })] })] }) }), _jsx("div", { class: "collapse mb-4", id: `bp-settings-${group.id}`, children: _jsxs("div", { class: "border rounded p-3", children: [_jsxs("form", { "hx-put": data.previewPath, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: [_jsx("input", { type: "hidden", name: "action", value: "update-group" }), _jsx("input", { type: "hidden", name: "groupId", value: group.id }), _jsxs("div", { class: "row g-3 mb-3", children: [_jsxs("div", { class: "col-12 col-md-8", children: [_jsx("label", { class: "form-label", children: "Group name" }), _jsx("input", { class: "form-control", name: "name", value: group.name, required: true })] }), _jsxs("div", { class: "col-12 col-md-4", children: [_jsx("label", { class: "form-label", children: "Maximum/default expiry" }), expiryInput(group.expiresInDays)] })] }), oidcFields(`bp-group-${group.id}`, group.oidc), _jsx("button", { class: "btn btn-primary", type: "submit", children: "Save settings" })] }), _jsx("hr", {}), _jsxs("form", { "hx-post": data.previewPath, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: [_jsx("input", { type: "hidden", name: "action", value: "rotate-key" }), _jsx("input", { type: "hidden", name: "groupId", value: group.id }), _jsx("button", { class: "btn btn-outline-warning", type: "submit", "hx-confirm": "Rotate this group API key? Existing CI credentials will stop working.", children: "Rotate API key" })] }), configEditor(group, data.previewPath, data.configTicketUrl)] }) }), group.deployments.length === 0 ? _jsx("div", { class: "text-secondary small", children: "No active previews." }) : (_jsx("div", { class: "table-responsive", children: _jsxs("table", { class: "table table-sm align-middle mb-0", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Preview" }), _jsx("th", { children: "App" }), _jsx("th", { children: "Services" }), _jsx("th", { children: "Expiry" }), _jsx("th", {})] }) }), _jsx("tbody", { children: group.deployments.map((deployment) => (_jsxs("tr", { children: [_jsxs("td", { children: [_jsx("div", { class: "fw-semibold", children: deployment.name }), _jsx("code", { class: "small", children: deployment.key }), _jsx("div", { children: _jsx("span", { class: `badge ${deployment.ready ? "text-bg-success" : "text-bg-warning"}`, children: deployment.ready ? "Synced" : "Waiting for sync" }) })] }), _jsx("td", { children: _jsx("a", { href: deployment.hostname.startsWith("http") ? deployment.hostname : `https://${deployment.hostname}`, target: "_blank", rel: "noreferrer", children: deployment.hostname }) }), _jsx("td", { children: deployment.services.map((service) => _jsxs("div", { class: "small", children: [_jsx("span", { class: `badge ${service.ready ? "text-bg-success" : "text-bg-warning"}`, children: service.ready ? "Synced" : "Waiting" }), " ", _jsx("span", { class: "font-monospace", children: service.serviceId })] })) }), _jsxs("td", { children: [_jsxs("form", { class: "d-flex gap-2", "hx-put": data.previewPath, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: [_jsx("input", { type: "hidden", name: "action", value: "update-expiry" }), _jsx("input", { type: "hidden", name: "deploymentId", value: deployment.id }), expiryInput(deployment.expiresInDays, false, `Expiry for ${deployment.name}`), _jsx("button", { class: "btn btn-sm btn-outline-secondary", type: "submit", children: "Save" })] }), _jsx("div", { class: "small text-secondary mt-1", children: deployment.expiresAt ? new Date(deployment.expiresAt).toLocaleString() : "Never expires" })] }), _jsx("td", { children: _jsx("button", { class: "btn btn-sm btn-outline-danger", "hx-delete": `${data.previewPath}?entity=deployment&id=${encodeURIComponent(deployment.id)}`, "hx-confirm": `Delete preview ${deployment.name}?`, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: "Delete" }) })] }))) })] }) }))] }) }))), _jsxs("aside", { class: "offcanvas offcanvas-end", tabindex: -1, id: "bp-create-preview-group", "aria-labelledby": "bp-create-preview-group-title", children: [_jsxs("div", { class: "offcanvas-header", children: [_jsx("h3", { class: "offcanvas-title h5", id: "bp-create-preview-group-title", children: "Create preview group" }), _jsx("button", { type: "button", class: "btn-close", "data-bs-dismiss": "offcanvas", "aria-label": "Close" })] }), _jsx("div", { class: "offcanvas-body", children: _jsxs("form", { "hx-post": data.previewPath, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: [_jsx("input", { type: "hidden", name: "action", value: "create-group" }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: "bp-preview-group-name", children: "Name" }), _jsx("input", { id: "bp-preview-group-name", class: "form-control", name: "name", maxlength: "120", required: true })] }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: "bp-preview-source-tenant", children: "Source tenant" }), _jsxs("select", { id: "bp-preview-source-tenant", class: "form-select", name: "sourceTenantId", required: true, children: [_jsx("option", { value: "", children: "Select tenant" }), data.sourceTenants.map((tenant) => _jsx("option", { value: tenant.id, children: tenant.title }))] })] }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", for: "bp-preview-source-app", children: "Source app" }), _jsxs("select", { id: "bp-preview-source-app", class: "form-select", name: "sourceAppId", required: true, children: [_jsx("option", { value: "", children: "Select app" }), data.sourceApps.map((app) => _jsx("option", { value: app.id, "data-tenant-id": app.tenantId, children: app.title }))] })] }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", children: "Maximum/default expiry" }), expiryInput(30)] }), oidcFields("bp-new-group"), _jsx("button", { class: "btn btn-primary w-100", type: "submit", children: "Create group" })] }) })] }), _jsx("script", { children: pageScript() })] }));
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=GET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"POST.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"POST.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PUT.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
|