@nocobase/app-plugin-releases 0.0.0-stage → 0.1.0-beta.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/CHANGELOG.md +77 -0
- package/README.md +118 -2
- package/dist/client/components/actor-name.d.ts +5 -0
- package/dist/client/components/actor-name.d.ts.map +1 -0
- package/dist/client/components/actor-name.js +11 -0
- package/dist/client/components/actor-name.js.map +1 -0
- package/dist/client/components/advanced-section.d.ts +8 -0
- package/dist/client/components/advanced-section.d.ts.map +1 -0
- package/dist/client/components/advanced-section.js +13 -0
- package/dist/client/components/advanced-section.js.map +1 -0
- package/dist/client/components/app-operations.d.ts +10 -0
- package/dist/client/components/app-operations.d.ts.map +1 -0
- package/dist/client/components/app-operations.js +26 -0
- package/dist/client/components/app-operations.js.map +1 -0
- package/dist/client/components/app-settings-card.d.ts +7 -0
- package/dist/client/components/app-settings-card.d.ts.map +1 -0
- package/dist/client/components/app-settings-card.js +69 -0
- package/dist/client/components/app-settings-card.js.map +1 -0
- package/dist/client/components/artifacts.d.ts +9 -0
- package/dist/client/components/artifacts.d.ts.map +1 -0
- package/dist/client/components/artifacts.js +26 -0
- package/dist/client/components/artifacts.js.map +1 -0
- package/dist/client/components/config-secrets.d.ts +10 -0
- package/dist/client/components/config-secrets.d.ts.map +1 -0
- package/dist/client/components/config-secrets.js +34 -0
- package/dist/client/components/config-secrets.js.map +1 -0
- package/dist/client/components/confirm-dialog.d.ts +22 -0
- package/dist/client/components/confirm-dialog.d.ts.map +1 -0
- package/dist/client/components/confirm-dialog.js +47 -0
- package/dist/client/components/confirm-dialog.js.map +1 -0
- package/dist/client/components/connection-check.d.ts +13 -0
- package/dist/client/components/connection-check.d.ts.map +1 -0
- package/dist/client/components/connection-check.js +69 -0
- package/dist/client/components/connection-check.js.map +1 -0
- package/dist/client/components/data-table.d.ts +27 -0
- package/dist/client/components/data-table.d.ts.map +1 -0
- package/dist/client/components/data-table.js +41 -0
- package/dist/client/components/data-table.js.map +1 -0
- package/dist/client/components/driver-settings.d.ts +28 -0
- package/dist/client/components/driver-settings.d.ts.map +1 -0
- package/dist/client/components/driver-settings.js +158 -0
- package/dist/client/components/driver-settings.js.map +1 -0
- package/dist/client/components/environment-form.d.ts +18 -0
- package/dist/client/components/environment-form.d.ts.map +1 -0
- package/dist/client/components/environment-form.js +284 -0
- package/dist/client/components/environment-form.js.map +1 -0
- package/dist/client/components/image-source-fields.d.ts +16 -0
- package/dist/client/components/image-source-fields.d.ts.map +1 -0
- package/dist/client/components/image-source-fields.js +53 -0
- package/dist/client/components/image-source-fields.js.map +1 -0
- package/dist/client/components/labels-editor.d.ts +15 -0
- package/dist/client/components/labels-editor.d.ts.map +1 -0
- package/dist/client/components/labels-editor.js +40 -0
- package/dist/client/components/labels-editor.js.map +1 -0
- package/dist/client/components/page-container.d.ts +11 -0
- package/dist/client/components/page-container.d.ts.map +1 -0
- package/dist/client/components/page-container.js +13 -0
- package/dist/client/components/page-container.js.map +1 -0
- package/dist/client/components/page-header.d.ts +14 -0
- package/dist/client/components/page-header.d.ts.map +1 -0
- package/dist/client/components/page-header.js +10 -0
- package/dist/client/components/page-header.js.map +1 -0
- package/dist/client/components/page-tabs.d.ts +20 -0
- package/dist/client/components/page-tabs.d.ts.map +1 -0
- package/dist/client/components/page-tabs.js +7 -0
- package/dist/client/components/page-tabs.js.map +1 -0
- package/dist/client/components/people-picker.d.ts +5 -0
- package/dist/client/components/people-picker.d.ts.map +1 -0
- package/dist/client/components/people-picker.js +22 -0
- package/dist/client/components/people-picker.js.map +1 -0
- package/dist/client/components/refresh-button.d.ts +7 -0
- package/dist/client/components/refresh-button.d.ts.map +1 -0
- package/dist/client/components/refresh-button.js +21 -0
- package/dist/client/components/refresh-button.js.map +1 -0
- package/dist/client/components/registry-fields.d.ts +20 -0
- package/dist/client/components/registry-fields.d.ts.map +1 -0
- package/dist/client/components/registry-fields.js +47 -0
- package/dist/client/components/registry-fields.js.map +1 -0
- package/dist/client/components/release-badges.d.ts +42 -0
- package/dist/client/components/release-badges.d.ts.map +1 -0
- package/dist/client/components/release-badges.js +100 -0
- package/dist/client/components/release-badges.js.map +1 -0
- package/dist/client/components/request-decision.d.ts +8 -0
- package/dist/client/components/request-decision.d.ts.map +1 -0
- package/dist/client/components/request-decision.js +7 -0
- package/dist/client/components/request-decision.js.map +1 -0
- package/dist/client/components/route-dialog.d.ts +6 -0
- package/dist/client/components/route-dialog.d.ts.map +1 -0
- package/dist/client/components/route-dialog.js +7 -0
- package/dist/client/components/route-dialog.js.map +1 -0
- package/dist/client/components/route-overlay.d.ts +21 -0
- package/dist/client/components/route-overlay.d.ts.map +1 -0
- package/dist/client/components/route-overlay.js +87 -0
- package/dist/client/components/route-overlay.js.map +1 -0
- package/dist/client/components/row-actions.d.ts +9 -0
- package/dist/client/components/row-actions.d.ts.map +1 -0
- package/dist/client/components/row-actions.js +16 -0
- package/dist/client/components/row-actions.js.map +1 -0
- package/dist/client/components/runtime-policy-fields.d.ts +9 -0
- package/dist/client/components/runtime-policy-fields.d.ts.map +1 -0
- package/dist/client/components/runtime-policy-fields.js +26 -0
- package/dist/client/components/runtime-policy-fields.js.map +1 -0
- package/dist/client/components/section.d.ts +15 -0
- package/dist/client/components/section.d.ts.map +1 -0
- package/dist/client/components/section.js +6 -0
- package/dist/client/components/section.js.map +1 -0
- package/dist/client/components/states.d.ts +21 -0
- package/dist/client/components/states.d.ts.map +1 -0
- package/dist/client/components/states.js +29 -0
- package/dist/client/components/states.js.map +1 -0
- package/dist/client/components/tag.d.ts +15 -0
- package/dist/client/components/tag.d.ts.map +1 -0
- package/dist/client/components/tag.js +15 -0
- package/dist/client/components/tag.js.map +1 -0
- package/dist/client/components/ui/alert-dialog.d.ts +19 -0
- package/dist/client/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/client/components/ui/alert-dialog.js +42 -0
- package/dist/client/components/ui/alert-dialog.js.map +1 -0
- package/dist/client/components/ui/alert.d.ts +13 -0
- package/dist/client/components/ui/alert.d.ts.map +1 -0
- package/dist/client/components/ui/alert.js +31 -0
- package/dist/client/components/ui/alert.js.map +1 -0
- package/dist/client/components/ui/badge.d.ts +11 -0
- package/dist/client/components/ui/badge.d.ts.map +1 -0
- package/dist/client/components/ui/badge.js +37 -0
- package/dist/client/components/ui/badge.js.map +1 -0
- package/dist/client/components/ui/button.d.ts +12 -0
- package/dist/client/components/ui/button.d.ts.map +1 -0
- package/dist/client/components/ui/button.js +38 -0
- package/dist/client/components/ui/button.js.map +1 -0
- package/dist/client/components/ui/card.d.ts +12 -0
- package/dist/client/components/ui/card.d.ts.map +1 -0
- package/dist/client/components/ui/card.js +25 -0
- package/dist/client/components/ui/card.js.map +1 -0
- package/dist/client/components/ui/checkbox.d.ts +5 -0
- package/dist/client/components/ui/checkbox.d.ts.map +1 -0
- package/dist/client/components/ui/checkbox.js +9 -0
- package/dist/client/components/ui/checkbox.js.map +1 -0
- package/dist/client/components/ui/collapsible.d.ts +7 -0
- package/dist/client/components/ui/collapsible.d.ts.map +1 -0
- package/dist/client/components/ui/collapsible.js +13 -0
- package/dist/client/components/ui/collapsible.js.map +1 -0
- package/dist/client/components/ui/dialog.d.ts +18 -0
- package/dist/client/components/ui/dialog.d.ts.map +1 -0
- package/dist/client/components/ui/dialog.js +40 -0
- package/dist/client/components/ui/dialog.js.map +1 -0
- package/dist/client/components/ui/dropdown-menu.d.ts +30 -0
- package/dist/client/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/client/components/ui/dropdown-menu.js +51 -0
- package/dist/client/components/ui/dropdown-menu.js.map +1 -0
- package/dist/client/components/ui/empty.d.ts +15 -0
- package/dist/client/components/ui/empty.d.ts.map +1 -0
- package/dist/client/components/ui/empty.js +37 -0
- package/dist/client/components/ui/empty.js.map +1 -0
- package/dist/client/components/ui/field.d.ts +28 -0
- package/dist/client/components/ui/field.d.ts.map +1 -0
- package/dist/client/components/ui/field.js +71 -0
- package/dist/client/components/ui/field.js.map +1 -0
- package/dist/client/components/ui/input-group.d.ts +22 -0
- package/dist/client/components/ui/input-group.d.ts.map +1 -0
- package/dist/client/components/ui/input-group.js +63 -0
- package/dist/client/components/ui/input-group.js.map +1 -0
- package/dist/client/components/ui/input.d.ts +4 -0
- package/dist/client/components/ui/input.d.ts.map +1 -0
- package/dist/client/components/ui/input.js +8 -0
- package/dist/client/components/ui/input.js.map +1 -0
- package/dist/client/components/ui/label.d.ts +4 -0
- package/dist/client/components/ui/label.d.ts.map +1 -0
- package/dist/client/components/ui/label.js +7 -0
- package/dist/client/components/ui/label.js.map +1 -0
- package/dist/client/components/ui/radio-group.d.ts +7 -0
- package/dist/client/components/ui/radio-group.d.ts.map +1 -0
- package/dist/client/components/ui/radio-group.js +12 -0
- package/dist/client/components/ui/radio-group.js.map +1 -0
- package/dist/client/components/ui/select.d.ts +16 -0
- package/dist/client/components/ui/select.d.ts.map +1 -0
- package/dist/client/components/ui/select.js +34 -0
- package/dist/client/components/ui/select.js.map +1 -0
- package/dist/client/components/ui/separator.d.ts +5 -0
- package/dist/client/components/ui/separator.d.ts.map +1 -0
- package/dist/client/components/ui/separator.js +8 -0
- package/dist/client/components/ui/separator.js.map +1 -0
- package/dist/client/components/ui/sheet.d.ts +15 -0
- package/dist/client/components/ui/sheet.d.ts.map +1 -0
- package/dist/client/components/ui/sheet.js +39 -0
- package/dist/client/components/ui/sheet.js.map +1 -0
- package/dist/client/components/ui/skeleton.d.ts +4 -0
- package/dist/client/components/ui/skeleton.d.ts.map +1 -0
- package/dist/client/components/ui/skeleton.js +7 -0
- package/dist/client/components/ui/skeleton.js.map +1 -0
- package/dist/client/components/ui/spinner.d.ts +4 -0
- package/dist/client/components/ui/spinner.d.ts.map +1 -0
- package/dist/client/components/ui/spinner.js +11 -0
- package/dist/client/components/ui/spinner.js.map +1 -0
- package/dist/client/components/ui/table.d.ts +11 -0
- package/dist/client/components/ui/table.d.ts.map +1 -0
- package/dist/client/components/ui/table.js +28 -0
- package/dist/client/components/ui/table.js.map +1 -0
- package/dist/client/components/ui/tabs.d.ts +14 -0
- package/dist/client/components/ui/tabs.d.ts.map +1 -0
- package/dist/client/components/ui/tabs.js +32 -0
- package/dist/client/components/ui/tabs.js.map +1 -0
- package/dist/client/components/ui/textarea.d.ts +4 -0
- package/dist/client/components/ui/textarea.d.ts.map +1 -0
- package/dist/client/components/ui/textarea.js +7 -0
- package/dist/client/components/ui/textarea.js.map +1 -0
- package/dist/client/components/ui/tooltip.d.ts +8 -0
- package/dist/client/components/ui/tooltip.d.ts.map +1 -0
- package/dist/client/components/ui/tooltip.js +17 -0
- package/dist/client/components/ui/tooltip.js.map +1 -0
- package/dist/client/components/upload-release-dialog.d.ts +8 -0
- package/dist/client/components/upload-release-dialog.d.ts.map +1 -0
- package/dist/client/components/upload-release-dialog.js +39 -0
- package/dist/client/components/upload-release-dialog.js.map +1 -0
- package/dist/client/components/use-route-overlay.d.ts +15 -0
- package/dist/client/components/use-route-overlay.d.ts.map +1 -0
- package/dist/client/components/use-route-overlay.js +15 -0
- package/dist/client/components/use-route-overlay.js.map +1 -0
- package/dist/client/components/variable-alerts.d.ts +24 -0
- package/dist/client/components/variable-alerts.d.ts.map +1 -0
- package/dist/client/components/variable-alerts.js +85 -0
- package/dist/client/components/variable-alerts.js.map +1 -0
- package/dist/client/components/variable-dialogs.d.ts +30 -0
- package/dist/client/components/variable-dialogs.d.ts.map +1 -0
- package/dist/client/components/variable-dialogs.js +155 -0
- package/dist/client/components/variable-dialogs.js.map +1 -0
- package/dist/client/components/variables-table.d.ts +26 -0
- package/dist/client/components/variables-table.d.ts.map +1 -0
- package/dist/client/components/variables-table.js +374 -0
- package/dist/client/components/variables-table.js.map +1 -0
- package/dist/client/driver-forms/host.d.ts +3 -0
- package/dist/client/driver-forms/host.d.ts.map +1 -0
- package/dist/client/driver-forms/host.js +100 -0
- package/dist/client/driver-forms/host.js.map +1 -0
- package/dist/client/driver-forms/index.d.ts +25 -0
- package/dist/client/driver-forms/index.d.ts.map +1 -0
- package/dist/client/driver-forms/index.js +40 -0
- package/dist/client/driver-forms/index.js.map +1 -0
- package/dist/client/driver-forms/mapping.d.ts +56 -0
- package/dist/client/driver-forms/mapping.d.ts.map +1 -0
- package/dist/client/driver-forms/mapping.js +308 -0
- package/dist/client/driver-forms/mapping.js.map +1 -0
- package/dist/client/driver-forms/types.d.ts +168 -0
- package/dist/client/driver-forms/types.d.ts.map +1 -0
- package/dist/client/driver-forms/types.js +16 -0
- package/dist/client/driver-forms/types.js.map +1 -0
- package/dist/client/hooks/use-app-summary.d.ts +11 -0
- package/dist/client/hooks/use-app-summary.d.ts.map +1 -0
- package/dist/client/hooks/use-app-summary.js +108 -0
- package/dist/client/hooks/use-app-summary.js.map +1 -0
- package/dist/client/hooks/use-connection-check.d.ts +18 -0
- package/dist/client/hooks/use-connection-check.d.ts.map +1 -0
- package/dist/client/hooks/use-connection-check.js +19 -0
- package/dist/client/hooks/use-connection-check.js.map +1 -0
- package/dist/client/hooks/use-driver-forms.d.ts +4 -0
- package/dist/client/hooks/use-driver-forms.d.ts.map +1 -0
- package/dist/client/hooks/use-driver-forms.js +12 -0
- package/dist/client/hooks/use-driver-forms.js.map +1 -0
- package/dist/client/hooks/use-driver-names.d.ts +14 -0
- package/dist/client/hooks/use-driver-names.d.ts.map +1 -0
- package/dist/client/hooks/use-driver-names.js +33 -0
- package/dist/client/hooks/use-driver-names.js.map +1 -0
- package/dist/client/hooks/use-environment-check.d.ts +8 -0
- package/dist/client/hooks/use-environment-check.d.ts.map +1 -0
- package/dist/client/hooks/use-environment-check.js +28 -0
- package/dist/client/hooks/use-environment-check.js.map +1 -0
- package/dist/client/hooks/use-notify.d.ts +7 -0
- package/dist/client/hooks/use-notify.d.ts.map +1 -0
- package/dist/client/hooks/use-notify.js +22 -0
- package/dist/client/hooks/use-notify.js.map +1 -0
- package/dist/client/hooks/use-registries.d.ts +6 -0
- package/dist/client/hooks/use-registries.d.ts.map +1 -0
- package/dist/client/hooks/use-registries.js +9 -0
- package/dist/client/hooks/use-registries.js.map +1 -0
- package/dist/client/hooks/use-registry-check.d.ts +16 -0
- package/dist/client/hooks/use-registry-check.d.ts.map +1 -0
- package/dist/client/hooks/use-registry-check.js +29 -0
- package/dist/client/hooks/use-registry-check.js.map +1 -0
- package/dist/client/hooks/use-releases.d.ts +42 -0
- package/dist/client/hooks/use-releases.d.ts.map +1 -0
- package/dist/client/hooks/use-releases.js +82 -0
- package/dist/client/hooks/use-releases.js.map +1 -0
- package/dist/client/hooks/use-request-decisions.d.ts +15 -0
- package/dist/client/hooks/use-request-decisions.d.ts.map +1 -0
- package/dist/client/hooks/use-request-decisions.js +69 -0
- package/dist/client/hooks/use-request-decisions.js.map +1 -0
- package/dist/client/hooks/use-tab-param.d.ts +5 -0
- package/dist/client/hooks/use-tab-param.d.ts.map +1 -0
- package/dist/client/hooks/use-tab-param.js +33 -0
- package/dist/client/hooks/use-tab-param.js.map +1 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/lib/actor-names.d.ts +16 -0
- package/dist/client/lib/actor-names.d.ts.map +1 -0
- package/dist/client/lib/actor-names.js +8 -0
- package/dist/client/lib/actor-names.js.map +1 -0
- package/dist/client/lib/app-groups.d.ts +20 -0
- package/dist/client/lib/app-groups.d.ts.map +1 -0
- package/dist/client/lib/app-groups.js +36 -0
- package/dist/client/lib/app-groups.js.map +1 -0
- package/dist/client/lib/app-operations.d.ts +7 -0
- package/dist/client/lib/app-operations.d.ts.map +1 -0
- package/dist/client/lib/app-operations.js +27 -0
- package/dist/client/lib/app-operations.js.map +1 -0
- package/dist/client/lib/app-origin.d.ts +22 -0
- package/dist/client/lib/app-origin.d.ts.map +1 -0
- package/dist/client/lib/app-origin.js +10 -0
- package/dist/client/lib/app-origin.js.map +1 -0
- package/dist/client/lib/app-state.d.ts +7 -0
- package/dist/client/lib/app-state.d.ts.map +1 -0
- package/dist/client/lib/app-state.js +15 -0
- package/dist/client/lib/app-state.js.map +1 -0
- package/dist/client/lib/config-secrets.d.ts +12 -0
- package/dist/client/lib/config-secrets.d.ts.map +1 -0
- package/dist/client/lib/config-secrets.js +16 -0
- package/dist/client/lib/config-secrets.js.map +1 -0
- package/dist/client/lib/delete-app-impact.d.ts +17 -0
- package/dist/client/lib/delete-app-impact.d.ts.map +1 -0
- package/dist/client/lib/delete-app-impact.js +10 -0
- package/dist/client/lib/delete-app-impact.js.map +1 -0
- package/dist/client/lib/errors.d.ts +9 -0
- package/dist/client/lib/errors.d.ts.map +1 -0
- package/dist/client/lib/errors.js +76 -0
- package/dist/client/lib/errors.js.map +1 -0
- package/dist/client/lib/format.d.ts +8 -0
- package/dist/client/lib/format.d.ts.map +1 -0
- package/dist/client/lib/format.js +29 -0
- package/dist/client/lib/format.js.map +1 -0
- package/dist/client/lib/labels.d.ts +14 -0
- package/dist/client/lib/labels.d.ts.map +1 -0
- package/dist/client/lib/labels.js +42 -0
- package/dist/client/lib/labels.js.map +1 -0
- package/dist/client/lib/paths.d.ts +25 -0
- package/dist/client/lib/paths.d.ts.map +1 -0
- package/dist/client/lib/paths.js +31 -0
- package/dist/client/lib/paths.js.map +1 -0
- package/dist/client/lib/pending-requests.d.ts +7 -0
- package/dist/client/lib/pending-requests.d.ts.map +1 -0
- package/dist/client/lib/pending-requests.js +12 -0
- package/dist/client/lib/pending-requests.js.map +1 -0
- package/dist/client/lib/people-picker.d.ts +19 -0
- package/dist/client/lib/people-picker.d.ts.map +1 -0
- package/dist/client/lib/people-picker.js +8 -0
- package/dist/client/lib/people-picker.js.map +1 -0
- package/dist/client/lib/permissions.d.ts +6 -0
- package/dist/client/lib/permissions.d.ts.map +1 -0
- package/dist/client/lib/permissions.js +14 -0
- package/dist/client/lib/permissions.js.map +1 -0
- package/dist/client/lib/registry-draft.d.ts +26 -0
- package/dist/client/lib/registry-draft.d.ts.map +1 -0
- package/dist/client/lib/registry-draft.js +41 -0
- package/dist/client/lib/registry-draft.js.map +1 -0
- package/dist/client/lib/runtime-policy.d.ts +21 -0
- package/dist/client/lib/runtime-policy.d.ts.map +1 -0
- package/dist/client/lib/runtime-policy.js +63 -0
- package/dist/client/lib/runtime-policy.js.map +1 -0
- package/dist/client/lib/system-labels.d.ts +15 -0
- package/dist/client/lib/system-labels.d.ts.map +1 -0
- package/dist/client/lib/system-labels.js +14 -0
- package/dist/client/lib/system-labels.js.map +1 -0
- package/dist/client/lib/utils.d.ts +2 -0
- package/dist/client/lib/utils.d.ts.map +1 -0
- package/dist/client/lib/utils.js +2 -0
- package/dist/client/lib/utils.js.map +1 -0
- package/dist/client/lib/variables-text.d.ts +67 -0
- package/dist/client/lib/variables-text.d.ts.map +1 -0
- package/dist/client/lib/variables-text.js +156 -0
- package/dist/client/lib/variables-text.js.map +1 -0
- package/dist/client/locales/en-US.d.ts +680 -0
- package/dist/client/locales/en-US.d.ts.map +1 -0
- package/dist/client/locales/en-US.js +665 -0
- package/dist/client/locales/en-US.js.map +1 -0
- package/dist/client/locales/index.d.ts +4 -0
- package/dist/client/locales/index.d.ts.map +1 -0
- package/dist/client/locales/index.js +7 -0
- package/dist/client/locales/index.js.map +1 -0
- package/dist/client/locales/zh-CN.d.ts +4 -0
- package/dist/client/locales/zh-CN.d.ts.map +1 -0
- package/dist/client/locales/zh-CN.js +660 -0
- package/dist/client/locales/zh-CN.js.map +1 -0
- package/dist/client/pages/app-page.d.ts +3 -0
- package/dist/client/pages/app-page.d.ts.map +1 -0
- package/dist/client/pages/app-page.js +542 -0
- package/dist/client/pages/app-page.js.map +1 -0
- package/dist/client/pages/apps-page.d.ts +4 -0
- package/dist/client/pages/apps-page.d.ts.map +1 -0
- package/dist/client/pages/apps-page.js +116 -0
- package/dist/client/pages/apps-page.js.map +1 -0
- package/dist/client/pages/environment-page.d.ts +3 -0
- package/dist/client/pages/environment-page.d.ts.map +1 -0
- package/dist/client/pages/environment-page.js +147 -0
- package/dist/client/pages/environment-page.js.map +1 -0
- package/dist/client/pages/environments-page.d.ts +4 -0
- package/dist/client/pages/environments-page.d.ts.map +1 -0
- package/dist/client/pages/environments-page.js +115 -0
- package/dist/client/pages/environments-page.js.map +1 -0
- package/dist/client/pages/new-app-page.d.ts +10 -0
- package/dist/client/pages/new-app-page.d.ts.map +1 -0
- package/dist/client/pages/new-app-page.js +101 -0
- package/dist/client/pages/new-app-page.js.map +1 -0
- package/dist/client/pages/request-page.d.ts +7 -0
- package/dist/client/pages/request-page.d.ts.map +1 -0
- package/dist/client/pages/request-page.js +70 -0
- package/dist/client/pages/request-page.js.map +1 -0
- package/dist/client/pages.d.ts +10 -0
- package/dist/client/pages.d.ts.map +1 -0
- package/dist/client/pages.js +25 -0
- package/dist/client/pages.js.map +1 -0
- package/dist/client/plugin.d.ts +12 -0
- package/dist/client/plugin.d.ts.map +1 -0
- package/dist/client/plugin.js +12 -0
- package/dist/client/plugin.js.map +1 -0
- package/dist/client/routes.d.ts +19 -0
- package/dist/client/routes.d.ts.map +1 -0
- package/dist/client/routes.js +89 -0
- package/dist/client/routes.js.map +1 -0
- package/dist/client/service-provider.d.ts +11 -0
- package/dist/client/service-provider.d.ts.map +1 -0
- package/dist/client/service-provider.js +14 -0
- package/dist/client/service-provider.js.map +1 -0
- package/dist/database/migrations/.manifest.json +21 -0
- package/dist/database/migrations/202610020001_rel_create_tables.d.ts +8 -0
- package/dist/database/migrations/202610020001_rel_create_tables.d.ts.map +1 -0
- package/dist/database/migrations/202610020001_rel_create_tables.js +247 -0
- package/dist/database/migrations/202610020001_rel_create_tables.js.map +1 -0
- package/dist/database/migrations/202610100001_rel_variables_initial_admin.d.ts +16 -0
- package/dist/database/migrations/202610100001_rel_variables_initial_admin.d.ts.map +1 -0
- package/dist/database/migrations/202610100001_rel_variables_initial_admin.js +94 -0
- package/dist/database/migrations/202610100001_rel_variables_initial_admin.js.map +1 -0
- package/dist/database/migrations/202610170001_rel_drop_app_preview_values.d.ts +8 -0
- package/dist/database/migrations/202610170001_rel_drop_app_preview_values.d.ts.map +1 -0
- package/dist/database/migrations/202610170001_rel_drop_app_preview_values.js +25 -0
- package/dist/database/migrations/202610170001_rel_drop_app_preview_values.js.map +1 -0
- package/dist/database/migrations/202610210001_rel_protected_requires_approval.d.ts +9 -0
- package/dist/database/migrations/202610210001_rel_protected_requires_approval.d.ts.map +1 -0
- package/dist/database/migrations/202610210001_rel_protected_requires_approval.js +32 -0
- package/dist/database/migrations/202610210001_rel_protected_requires_approval.js.map +1 -0
- package/dist/package.d.ts +2 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +2 -0
- package/dist/package.js.map +1 -0
- package/dist/server/access/caller.d.ts +74 -0
- package/dist/server/access/caller.d.ts.map +1 -0
- package/dist/server/access/caller.js +141 -0
- package/dist/server/access/caller.js.map +1 -0
- package/dist/server/access/key-scope-objects.d.ts +20 -0
- package/dist/server/access/key-scope-objects.d.ts.map +1 -0
- package/dist/server/access/key-scope-objects.js +42 -0
- package/dist/server/access/key-scope-objects.js.map +1 -0
- package/dist/server/composition.d.ts +52 -0
- package/dist/server/composition.d.ts.map +1 -0
- package/dist/server/composition.js +105 -0
- package/dist/server/composition.js.map +1 -0
- package/dist/server/config.d.ts +127 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +2 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/drivers/host/driver.d.ts +87 -0
- package/dist/server/drivers/host/driver.d.ts.map +1 -0
- package/dist/server/drivers/host/driver.js +636 -0
- package/dist/server/drivers/host/driver.js.map +1 -0
- package/dist/server/drivers/types.d.ts +221 -0
- package/dist/server/drivers/types.d.ts.map +1 -0
- package/dist/server/drivers/types.js +27 -0
- package/dist/server/drivers/types.js.map +1 -0
- package/dist/server/errors.d.ts +20 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/errors.js +44 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/index.d.ts +14 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +13 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/locales/en-US.d.ts +6 -0
- package/dist/server/locales/en-US.d.ts.map +1 -0
- package/dist/server/locales/en-US.js +4 -0
- package/dist/server/locales/en-US.js.map +1 -0
- package/dist/server/locales/index.d.ts +4 -0
- package/dist/server/locales/index.d.ts.map +1 -0
- package/dist/server/locales/index.js +6 -0
- package/dist/server/locales/index.js.map +1 -0
- package/dist/server/locales/zh-CN.d.ts +4 -0
- package/dist/server/locales/zh-CN.d.ts.map +1 -0
- package/dist/server/locales/zh-CN.js +4 -0
- package/dist/server/locales/zh-CN.js.map +1 -0
- package/dist/server/plugin.d.ts +4 -0
- package/dist/server/plugin.d.ts.map +1 -0
- package/dist/server/plugin.js +16 -0
- package/dist/server/plugin.js.map +1 -0
- package/dist/server/providers/authorization.d.ts +17 -0
- package/dist/server/providers/authorization.d.ts.map +1 -0
- package/dist/server/providers/authorization.js +60 -0
- package/dist/server/providers/authorization.js.map +1 -0
- package/dist/server/providers/index.d.ts +4 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +8 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/releases.d.ts +23 -0
- package/dist/server/providers/releases.d.ts.map +1 -0
- package/dist/server/providers/releases.js +219 -0
- package/dist/server/providers/releases.js.map +1 -0
- package/dist/server/routes/api.d.ts +24 -0
- package/dist/server/routes/api.d.ts.map +1 -0
- package/dist/server/routes/api.js +1610 -0
- package/dist/server/routes/api.js.map +1 -0
- package/dist/server/routes/index.d.ts +7 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +39 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/schemas.d.ts +184 -0
- package/dist/server/routes/schemas.d.ts.map +1 -0
- package/dist/server/routes/schemas.js +763 -0
- package/dist/server/routes/schemas.js.map +1 -0
- package/dist/server/secrets-stores.d.ts +9 -0
- package/dist/server/secrets-stores.d.ts.map +1 -0
- package/dist/server/secrets-stores.js +80 -0
- package/dist/server/secrets-stores.js.map +1 -0
- package/dist/server/services/artifact.d.ts +30 -0
- package/dist/server/services/artifact.d.ts.map +1 -0
- package/dist/server/services/artifact.js +234 -0
- package/dist/server/services/artifact.js.map +1 -0
- package/dist/server/services/codec.d.ts +15 -0
- package/dist/server/services/codec.d.ts.map +1 -0
- package/dist/server/services/codec.js +58 -0
- package/dist/server/services/codec.js.map +1 -0
- package/dist/server/services/config-file.d.ts +26 -0
- package/dist/server/services/config-file.d.ts.map +1 -0
- package/dist/server/services/config-file.js +154 -0
- package/dist/server/services/config-file.js.map +1 -0
- package/dist/server/services/config-secrets.d.ts +23 -0
- package/dist/server/services/config-secrets.d.ts.map +1 -0
- package/dist/server/services/config-secrets.js +269 -0
- package/dist/server/services/config-secrets.js.map +1 -0
- package/dist/server/services/credentials.d.ts +44 -0
- package/dist/server/services/credentials.d.ts.map +1 -0
- package/dist/server/services/credentials.js +137 -0
- package/dist/server/services/credentials.js.map +1 -0
- package/dist/server/services/environments.d.ts +75 -0
- package/dist/server/services/environments.d.ts.map +1 -0
- package/dist/server/services/environments.js +508 -0
- package/dist/server/services/environments.js.map +1 -0
- package/dist/server/services/events.d.ts +11 -0
- package/dist/server/services/events.d.ts.map +1 -0
- package/dist/server/services/events.js +26 -0
- package/dist/server/services/events.js.map +1 -0
- package/dist/server/services/registries.d.ts +67 -0
- package/dist/server/services/registries.d.ts.map +1 -0
- package/dist/server/services/registries.js +409 -0
- package/dist/server/services/registries.js.map +1 -0
- package/dist/server/services/release-artifacts.d.ts +42 -0
- package/dist/server/services/release-artifacts.d.ts.map +1 -0
- package/dist/server/services/release-artifacts.js +165 -0
- package/dist/server/services/release-artifacts.js.map +1 -0
- package/dist/server/services/releases.d.ts +417 -0
- package/dist/server/services/releases.d.ts.map +1 -0
- package/dist/server/services/releases.js +2725 -0
- package/dist/server/services/releases.js.map +1 -0
- package/dist/server/services/requests.d.ts +54 -0
- package/dist/server/services/requests.d.ts.map +1 -0
- package/dist/server/services/requests.js +342 -0
- package/dist/server/services/requests.js.map +1 -0
- package/dist/server/services/secrets.d.ts +11 -0
- package/dist/server/services/secrets.d.ts.map +1 -0
- package/dist/server/services/secrets.js +36 -0
- package/dist/server/services/secrets.js.map +1 -0
- package/dist/server/services/validation.d.ts +21 -0
- package/dist/server/services/validation.d.ts.map +1 -0
- package/dist/server/services/validation.js +111 -0
- package/dist/server/services/validation.js.map +1 -0
- package/dist/server/services/variables.d.ts +132 -0
- package/dist/server/services/variables.d.ts.map +1 -0
- package/dist/server/services/variables.js +501 -0
- package/dist/server/services/variables.js.map +1 -0
- package/dist/server/tokens.d.ts +110 -0
- package/dist/server/tokens.d.ts.map +1 -0
- package/dist/server/tokens.js +9 -0
- package/dist/server/tokens.js.map +1 -0
- package/dist/shared/access.d.ts +212 -0
- package/dist/shared/access.d.ts.map +1 -0
- package/dist/shared/access.js +228 -0
- package/dist/shared/access.js.map +1 -0
- package/dist/shared/locales/access.en-US.d.ts +137 -0
- package/dist/shared/locales/access.en-US.d.ts.map +1 -0
- package/dist/shared/locales/access.en-US.js +133 -0
- package/dist/shared/locales/access.en-US.js.map +1 -0
- package/dist/shared/locales/access.zh-CN.d.ts +4 -0
- package/dist/shared/locales/access.zh-CN.d.ts.map +1 -0
- package/dist/shared/locales/access.zh-CN.js +127 -0
- package/dist/shared/locales/access.zh-CN.js.map +1 -0
- package/dist/shared/releases.d.ts +657 -0
- package/dist/shared/releases.d.ts.map +1 -0
- package/dist/shared/releases.js +56 -0
- package/dist/shared/releases.js.map +1 -0
- package/package.json +118 -3
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { DatabaseConnection, DatabaseManager } from '@nocobase/db';
|
|
2
|
+
import { type AppVariableView, type EnvironmentVariableView, type ReleaseVariable, type ReleaseVariablesManifest, type VariableGenerator, type VariableSource } from '../../shared/releases.js';
|
|
3
|
+
import { type ReleasesSecrets } from './secrets.js';
|
|
4
|
+
/** The configuration paths release management fills in itself when a build declares a variable for them. */
|
|
5
|
+
export declare const INITIAL_ADMIN_PATHS: {
|
|
6
|
+
readonly username: "users.initialAdmin.username";
|
|
7
|
+
readonly email: "users.initialAdmin.email";
|
|
8
|
+
readonly password: "users.initialAdmin.password";
|
|
9
|
+
};
|
|
10
|
+
export declare const PUBLIC_ORIGIN_PATH = "app.publicOrigin";
|
|
11
|
+
export declare const SAMPLE_DATA_PATH = "app.sampleData";
|
|
12
|
+
/** The first administrator when the build and its configuration name none: the authentication plugin's defaults. */
|
|
13
|
+
export declare const DEFAULT_INITIAL_ADMIN: {
|
|
14
|
+
readonly username: "nocobase";
|
|
15
|
+
readonly email: "admin@nocobase.com";
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* A manifest from an archive or from CI, checked: it comes from the build, which nobody vouched for. Unknown fields
|
|
19
|
+
* are dropped; names, counts and lengths are bounded.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseVariablesManifest(value: unknown): ReleaseVariablesManifest;
|
|
22
|
+
/** A stored manifest read back; one that no longer parses counts as none. */
|
|
23
|
+
export declare function decodeVariablesManifest(value: unknown): ReleaseVariablesManifest | null;
|
|
24
|
+
export declare function assertVariableName(name: string): void;
|
|
25
|
+
export declare function assertVariableValue(value: unknown): asserts value is string;
|
|
26
|
+
/** Whether a variable named so holds a secret, judged as a configuration key would be (`SMTP_PASSWORD`, `API_KEY`). */
|
|
27
|
+
export declare function isSecretName(name: string): boolean;
|
|
28
|
+
/** A value for a generator: 32 random bytes, a one-key `SECRETS_KEYS` list, or 16 letters and digits. */
|
|
29
|
+
export declare function generateVariable(kind: VariableGenerator): string;
|
|
30
|
+
/** A password of letters and digits without look-alikes, so it survives copying. */
|
|
31
|
+
export declare function randomPassword(length?: number): string;
|
|
32
|
+
export interface StoredEnvironmentVariable {
|
|
33
|
+
readonly id: string;
|
|
34
|
+
readonly environmentId: string;
|
|
35
|
+
readonly name: string;
|
|
36
|
+
readonly value: string | null;
|
|
37
|
+
readonly secret: boolean;
|
|
38
|
+
readonly description: string | null;
|
|
39
|
+
readonly updatedBy: string | null;
|
|
40
|
+
readonly updatedAt: Date;
|
|
41
|
+
}
|
|
42
|
+
export interface StoredAppVariable {
|
|
43
|
+
readonly id: string;
|
|
44
|
+
readonly appId: string;
|
|
45
|
+
readonly name: string;
|
|
46
|
+
readonly value: string | null;
|
|
47
|
+
readonly secret: boolean;
|
|
48
|
+
readonly generated: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** Where a sealed variable value is bound: its table, owner and name. */
|
|
51
|
+
export declare function variableIdentity(kind: 'environment' | 'app', ownerId: string, name: string): readonly string[];
|
|
52
|
+
export declare class VariableStore {
|
|
53
|
+
private readonly options;
|
|
54
|
+
constructor(options: {
|
|
55
|
+
readonly database: DatabaseManager;
|
|
56
|
+
readonly secrets?: ReleasesSecrets;
|
|
57
|
+
});
|
|
58
|
+
environmentVariables(environmentId: string): Promise<StoredEnvironmentVariable[]>;
|
|
59
|
+
appVariables(appId: string): Promise<StoredAppVariable[]>;
|
|
60
|
+
setEnvironmentVariable(environmentId: string, name: string, input: {
|
|
61
|
+
readonly value: string;
|
|
62
|
+
readonly secret: boolean;
|
|
63
|
+
readonly description?: string | null;
|
|
64
|
+
readonly by: string | null;
|
|
65
|
+
}): Promise<void>;
|
|
66
|
+
unsetEnvironmentVariable(environmentId: string, name: string): Promise<boolean>;
|
|
67
|
+
/** Sets the App's value. */
|
|
68
|
+
setAppVariable(appId: string, name: string, input: {
|
|
69
|
+
readonly value: string;
|
|
70
|
+
readonly secret: boolean;
|
|
71
|
+
readonly generated?: boolean;
|
|
72
|
+
readonly by: string | null;
|
|
73
|
+
}, connection?: DatabaseConnection): Promise<void>;
|
|
74
|
+
/** Removes an App's variable; answers whether it had a value. */
|
|
75
|
+
unsetAppVariable(appId: string, name: string): Promise<boolean>;
|
|
76
|
+
removeApp(appId: string, connection: DatabaseConnection): Promise<void>;
|
|
77
|
+
removeEnvironment(environmentId: string): Promise<void>;
|
|
78
|
+
seal(value: string, identity: readonly string[]): string;
|
|
79
|
+
/** A sealed value opened; one that no longer opens (another key, damaged) reads as unset. */
|
|
80
|
+
private open;
|
|
81
|
+
private query;
|
|
82
|
+
}
|
|
83
|
+
export declare function environmentVariableView(variable: StoredEnvironmentVariable): EnvironmentVariableView;
|
|
84
|
+
export interface ResolveVariablesInput {
|
|
85
|
+
/** The release's manifest; without one nothing is required and only values someone set reach the App. */
|
|
86
|
+
readonly manifest: ReleaseVariablesManifest | null;
|
|
87
|
+
readonly environment: readonly StoredEnvironmentVariable[];
|
|
88
|
+
readonly app: readonly StoredAppVariable[];
|
|
89
|
+
/** The configuration the App runs with, parsed. */
|
|
90
|
+
readonly configFile: unknown;
|
|
91
|
+
/** Values release management makes for this deployment (the public origin, sample data, the first password). */
|
|
92
|
+
readonly generated?: Readonly<Record<string, string>>;
|
|
93
|
+
/** Variables release management would generate if they were deployed now; shown as `generated`, never missing. */
|
|
94
|
+
readonly generatable?: ReadonlySet<string>;
|
|
95
|
+
/** What the running deployment got, to say what changed. */
|
|
96
|
+
readonly running?: Readonly<Record<string, string>> | null;
|
|
97
|
+
}
|
|
98
|
+
export interface ResolvedVariable {
|
|
99
|
+
readonly name: string;
|
|
100
|
+
readonly declaration: ReleaseVariable | null;
|
|
101
|
+
readonly source: VariableSource;
|
|
102
|
+
readonly secret: boolean;
|
|
103
|
+
readonly firstStartOnly: boolean;
|
|
104
|
+
readonly required: boolean;
|
|
105
|
+
/** What the App gets, when a variable gives it one. */
|
|
106
|
+
readonly value: string | undefined;
|
|
107
|
+
readonly missing: boolean;
|
|
108
|
+
readonly changed: boolean;
|
|
109
|
+
readonly app: StoredAppVariable | null;
|
|
110
|
+
readonly environment: StoredEnvironmentVariable | null;
|
|
111
|
+
}
|
|
112
|
+
export interface ResolvedVariables {
|
|
113
|
+
/** What the App's environment holds. */
|
|
114
|
+
readonly env: Record<string, string>;
|
|
115
|
+
readonly variables: readonly ResolvedVariable[];
|
|
116
|
+
readonly missing: readonly ReleaseVariable[];
|
|
117
|
+
/** Of `env` without what is read only on the first start: what tells a later change. */
|
|
118
|
+
readonly fingerprint: string;
|
|
119
|
+
/** Some variable that counts differs from `running`. */
|
|
120
|
+
readonly changed: boolean;
|
|
121
|
+
}
|
|
122
|
+
/** Resolves the variables of one deployment; nothing here reads or writes the database. */
|
|
123
|
+
export declare function resolveVariables(input: ResolveVariablesInput): ResolvedVariables;
|
|
124
|
+
/** The fingerprint of what a deployment's variables give, leaving out what is read only on the first start. */
|
|
125
|
+
export declare function fingerprintOf(env: Readonly<Record<string, string>>, manifest: ReleaseVariablesManifest | null): string;
|
|
126
|
+
/** How the App variables page shows a resolved variable. */
|
|
127
|
+
export declare function appVariableView(variable: ResolvedVariable): AppVariableView;
|
|
128
|
+
/** The value at a dotted path of a parsed configuration. */
|
|
129
|
+
export declare function configValueAt(config: unknown, path: string): unknown;
|
|
130
|
+
/** Whether the configuration holds a value at the path that is not an example's placeholder. */
|
|
131
|
+
export declare function hasRealValue(config: unknown, path: string): boolean;
|
|
132
|
+
//# sourceMappingURL=variables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../server/services/variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment variables: the environment variables an App runs with. A build declares the ones it reads in its manifest
|
|
3
|
+
* (`dist/variables.json`, stored on the release); values are set per environment and per App, sealed with the
|
|
4
|
+
* secrets service whether they are secrets or not, and resolved for each deployment, strongest first:
|
|
5
|
+
*
|
|
6
|
+
* | source | what |
|
|
7
|
+
* | ------------- | --------------------------------------------------------------------------------------------- |
|
|
8
|
+
* | `app` | the App's own value |
|
|
9
|
+
* | `environment` | the environment's value |
|
|
10
|
+
* | `configFile` | nothing above, and the App's `config.yml` holds a real value at the variable's path |
|
|
11
|
+
* | `generated` | release management made one: a secret kept as an App value, the public origin, sample data |
|
|
12
|
+
* | `default` | the build's code defaults give the path a value |
|
|
13
|
+
* | `unset` | nothing: a required variable is then missing, and a deployment is refused |
|
|
14
|
+
*
|
|
15
|
+
* Only `app`, `environment` and `generated` reach the App; the runtime reads them over `config.yml`.
|
|
16
|
+
*/
|
|
17
|
+
import { createHash, randomBytes, randomUUID } from 'node:crypto';
|
|
18
|
+
import { isExamplePlaceholder, isSecretPath, } from '@nocobase/app-server/config';
|
|
19
|
+
import { generateSecretKey } from '@nocobase/secrets';
|
|
20
|
+
import { MAX_MANIFEST_VARIABLES, MAX_VARIABLE_VALUE_BYTES, RESERVED_VARIABLE_NAMES, VARIABLE_NAME_PATTERN, } from '../../shared/releases.js';
|
|
21
|
+
import { ReleasesError } from '../errors.js';
|
|
22
|
+
import { decodeDate, isRecord, nullableString } from './codec.js';
|
|
23
|
+
import { decryptText, encryptText } from './secrets.js';
|
|
24
|
+
/** The configuration paths release management fills in itself when a build declares a variable for them. */
|
|
25
|
+
export const INITIAL_ADMIN_PATHS = {
|
|
26
|
+
username: 'users.initialAdmin.username',
|
|
27
|
+
email: 'users.initialAdmin.email',
|
|
28
|
+
password: 'users.initialAdmin.password',
|
|
29
|
+
};
|
|
30
|
+
export const PUBLIC_ORIGIN_PATH = 'app.publicOrigin';
|
|
31
|
+
export const SAMPLE_DATA_PATH = 'app.sampleData';
|
|
32
|
+
/** The first administrator when the build and its configuration name none: the authentication plugin's defaults. */
|
|
33
|
+
export const DEFAULT_INITIAL_ADMIN = {
|
|
34
|
+
username: 'nocobase',
|
|
35
|
+
email: 'admin@nocobase.com',
|
|
36
|
+
};
|
|
37
|
+
// --- Manifest ---------------------------------------------------------------------------------------------------
|
|
38
|
+
const GENERATORS = [
|
|
39
|
+
'secret',
|
|
40
|
+
'secretKeys',
|
|
41
|
+
'password',
|
|
42
|
+
];
|
|
43
|
+
function invalidManifest(message) {
|
|
44
|
+
return new ReleasesError(`Invalid variables manifest: ${message}`, 'INVALID_VARIABLES_MANIFEST', 'INVALID_ARGUMENT');
|
|
45
|
+
}
|
|
46
|
+
function optionalText(value, max, what) {
|
|
47
|
+
if (value === undefined || value === null)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (typeof value !== 'string' || value.length > max)
|
|
50
|
+
throw invalidManifest(`${what} must be text of at most ${max} characters.`);
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A manifest from an archive or from CI, checked: it comes from the build, which nobody vouched for. Unknown fields
|
|
55
|
+
* are dropped; names, counts and lengths are bounded.
|
|
56
|
+
*/
|
|
57
|
+
export function parseVariablesManifest(value) {
|
|
58
|
+
if (!isRecord(value))
|
|
59
|
+
throw invalidManifest('expected a JSON object.');
|
|
60
|
+
if (value.schemaVersion !== 1)
|
|
61
|
+
throw invalidManifest('schemaVersion must be 1.');
|
|
62
|
+
if (!Array.isArray(value.variables))
|
|
63
|
+
throw invalidManifest('variables must be a list.');
|
|
64
|
+
if (value.variables.length > MAX_MANIFEST_VARIABLES)
|
|
65
|
+
throw invalidManifest(`it may declare at most ${MAX_MANIFEST_VARIABLES} variables.`);
|
|
66
|
+
const seen = new Set();
|
|
67
|
+
const variables = value.variables.map((entry) => {
|
|
68
|
+
if (!isRecord(entry))
|
|
69
|
+
throw invalidManifest('each variable is an object.');
|
|
70
|
+
const name = entry.name;
|
|
71
|
+
if (typeof name !== 'string' || !VARIABLE_NAME_PATTERN.test(name))
|
|
72
|
+
throw invalidManifest(`${JSON.stringify(name)} is not a variable name (upper-case letters, digits and underscores).`);
|
|
73
|
+
if (seen.has(name))
|
|
74
|
+
throw invalidManifest(`${name} is declared twice.`);
|
|
75
|
+
seen.add(name);
|
|
76
|
+
const generate = entry.generate ?? null;
|
|
77
|
+
if (generate !== null &&
|
|
78
|
+
!GENERATORS.includes(generate))
|
|
79
|
+
throw invalidManifest(`${name}: unknown generator.`);
|
|
80
|
+
const path = optionalText(entry.path, 255, `${name}: path`);
|
|
81
|
+
const type = optionalText(entry.type, 32, `${name}: type`);
|
|
82
|
+
const description = optionalText(entry.description, 1000, `${name}: description`);
|
|
83
|
+
return {
|
|
84
|
+
name,
|
|
85
|
+
...(path === undefined ? {} : { path }),
|
|
86
|
+
...(type === undefined ? {} : { type }),
|
|
87
|
+
...(description === undefined ? {} : { description }),
|
|
88
|
+
secret: entry.secret === true,
|
|
89
|
+
required: entry.required === true,
|
|
90
|
+
...(entry.hasDefault === true ? { hasDefault: true } : {}),
|
|
91
|
+
...(entry.exampleProvided === true ? { exampleProvided: true } : {}),
|
|
92
|
+
firstStartOnly: entry.firstStartOnly === true,
|
|
93
|
+
generate: generate,
|
|
94
|
+
...(entry.runtime === true ? { runtime: true } : {}),
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
const app = isRecord(value.app)
|
|
98
|
+
? {
|
|
99
|
+
...(typeof value.app.name === 'string'
|
|
100
|
+
? { name: value.app.name.slice(0, 214) }
|
|
101
|
+
: {}),
|
|
102
|
+
...(typeof value.app.version === 'string'
|
|
103
|
+
? { version: value.app.version.slice(0, 255) }
|
|
104
|
+
: {}),
|
|
105
|
+
}
|
|
106
|
+
: undefined;
|
|
107
|
+
return {
|
|
108
|
+
schemaVersion: 1,
|
|
109
|
+
...(app ? { app } : {}),
|
|
110
|
+
...(typeof value.generatedAt === 'string'
|
|
111
|
+
? { generatedAt: value.generatedAt.slice(0, 64) }
|
|
112
|
+
: {}),
|
|
113
|
+
variables,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** A stored manifest read back; one that no longer parses counts as none. */
|
|
117
|
+
export function decodeVariablesManifest(value) {
|
|
118
|
+
if (value === null || value === undefined)
|
|
119
|
+
return null;
|
|
120
|
+
try {
|
|
121
|
+
return parseVariablesManifest(typeof value === 'string' ? JSON.parse(value) : value);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// --- Names and values -------------------------------------------------------------------------------------------
|
|
128
|
+
export function assertVariableName(name) {
|
|
129
|
+
if (!VARIABLE_NAME_PATTERN.test(name))
|
|
130
|
+
throw new ReleasesError('A variable name is an upper-case letter followed by upper-case letters, digits and underscores.', 'INVALID_VARIABLE_NAME', 'INVALID_ARGUMENT');
|
|
131
|
+
if (RESERVED_VARIABLE_NAMES.includes(name))
|
|
132
|
+
throw new ReleasesError(`${name} is set by the runtime and cannot be a variable.`, 'VARIABLE_RESERVED', 'INVALID_ARGUMENT');
|
|
133
|
+
}
|
|
134
|
+
export function assertVariableValue(value) {
|
|
135
|
+
if (typeof value !== 'string')
|
|
136
|
+
throw new ReleasesError('A variable value is text.', 'INVALID_VARIABLE_VALUE', 'INVALID_ARGUMENT');
|
|
137
|
+
if (Buffer.byteLength(value) > MAX_VARIABLE_VALUE_BYTES)
|
|
138
|
+
throw new ReleasesError('A variable value is at most 64 KiB.', 'INVALID_VARIABLE_VALUE', 'INVALID_ARGUMENT');
|
|
139
|
+
}
|
|
140
|
+
/** Whether a variable named so holds a secret, judged as a configuration key would be (`SMTP_PASSWORD`, `API_KEY`). */
|
|
141
|
+
export function isSecretName(name) {
|
|
142
|
+
return isSecretPath(name);
|
|
143
|
+
}
|
|
144
|
+
/** A value for a generator: 32 random bytes, a one-key `SECRETS_KEYS` list, or 16 letters and digits. */
|
|
145
|
+
export function generateVariable(kind) {
|
|
146
|
+
switch (kind) {
|
|
147
|
+
case 'secretKeys':
|
|
148
|
+
return `1:${generateSecretKey()}`;
|
|
149
|
+
case 'password':
|
|
150
|
+
return randomPassword();
|
|
151
|
+
default:
|
|
152
|
+
return randomBytes(32).toString('base64url');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** A password of letters and digits without look-alikes, so it survives copying. */
|
|
156
|
+
export function randomPassword(length = 16) {
|
|
157
|
+
const alphabet = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789';
|
|
158
|
+
return [...randomBytes(length)]
|
|
159
|
+
.map((byte) => alphabet[byte % alphabet.length])
|
|
160
|
+
.join('');
|
|
161
|
+
}
|
|
162
|
+
/** Where a sealed variable value is bound: its table, owner and name. */
|
|
163
|
+
export function variableIdentity(kind, ownerId, name) {
|
|
164
|
+
return [kind, ownerId, name];
|
|
165
|
+
}
|
|
166
|
+
export class VariableStore {
|
|
167
|
+
options;
|
|
168
|
+
constructor(options) {
|
|
169
|
+
this.options = options;
|
|
170
|
+
}
|
|
171
|
+
async environmentVariables(environmentId) {
|
|
172
|
+
const rows = await this.query()
|
|
173
|
+
.selectFrom('relEnvironmentVariables')
|
|
174
|
+
.selectAll()
|
|
175
|
+
.where('environmentId', '=', environmentId)
|
|
176
|
+
.orderBy('name', 'asc')
|
|
177
|
+
.execute();
|
|
178
|
+
return rows.map((row) => ({
|
|
179
|
+
id: String(row.id),
|
|
180
|
+
environmentId: String(row.environmentId),
|
|
181
|
+
name: String(row.name),
|
|
182
|
+
value: this.open(row.value, variableIdentity('environment', String(row.environmentId), String(row.name))),
|
|
183
|
+
secret: Boolean(row.secret),
|
|
184
|
+
description: nullableString(row.description),
|
|
185
|
+
updatedBy: nullableString(row.updatedBy),
|
|
186
|
+
updatedAt: decodeDate(row.updatedAt),
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
async appVariables(appId) {
|
|
190
|
+
const rows = await this.query()
|
|
191
|
+
.selectFrom('relAppVariables')
|
|
192
|
+
.selectAll()
|
|
193
|
+
.where('appId', '=', appId)
|
|
194
|
+
.orderBy('name', 'asc')
|
|
195
|
+
.execute();
|
|
196
|
+
return rows.map((row) => ({
|
|
197
|
+
id: String(row.id),
|
|
198
|
+
appId: String(row.appId),
|
|
199
|
+
name: String(row.name),
|
|
200
|
+
value: this.open(row.value, variableIdentity('app', String(row.appId), String(row.name))),
|
|
201
|
+
secret: Boolean(row.secret),
|
|
202
|
+
generated: Boolean(row.generated),
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
async setEnvironmentVariable(environmentId, name, input) {
|
|
206
|
+
const sealed = this.seal(input.value, variableIdentity('environment', environmentId, name));
|
|
207
|
+
const now = new Date();
|
|
208
|
+
const existing = await this.query()
|
|
209
|
+
.selectFrom('relEnvironmentVariables')
|
|
210
|
+
.select('id')
|
|
211
|
+
.where('environmentId', '=', environmentId)
|
|
212
|
+
.where('name', '=', name)
|
|
213
|
+
.executeTakeFirst();
|
|
214
|
+
if (existing)
|
|
215
|
+
await this.query()
|
|
216
|
+
.updateTable('relEnvironmentVariables')
|
|
217
|
+
.set({
|
|
218
|
+
value: sealed,
|
|
219
|
+
secret: input.secret,
|
|
220
|
+
...(input.description === undefined
|
|
221
|
+
? {}
|
|
222
|
+
: { description: input.description }),
|
|
223
|
+
updatedBy: input.by,
|
|
224
|
+
updatedAt: now,
|
|
225
|
+
})
|
|
226
|
+
.where('id', '=', String(existing.id))
|
|
227
|
+
.execute();
|
|
228
|
+
else
|
|
229
|
+
await this.query()
|
|
230
|
+
.insertInto('relEnvironmentVariables')
|
|
231
|
+
.values({
|
|
232
|
+
id: randomUUID(),
|
|
233
|
+
environmentId,
|
|
234
|
+
name,
|
|
235
|
+
value: sealed,
|
|
236
|
+
secret: input.secret,
|
|
237
|
+
description: input.description ?? null,
|
|
238
|
+
createdBy: input.by,
|
|
239
|
+
updatedBy: input.by,
|
|
240
|
+
createdAt: now,
|
|
241
|
+
updatedAt: now,
|
|
242
|
+
})
|
|
243
|
+
.execute();
|
|
244
|
+
}
|
|
245
|
+
async unsetEnvironmentVariable(environmentId, name) {
|
|
246
|
+
const result = await this.query()
|
|
247
|
+
.deleteFrom('relEnvironmentVariables')
|
|
248
|
+
.where('environmentId', '=', environmentId)
|
|
249
|
+
.where('name', '=', name)
|
|
250
|
+
.execute();
|
|
251
|
+
return Number(result.deletedCount ?? 0) > 0;
|
|
252
|
+
}
|
|
253
|
+
/** Sets the App's value. */
|
|
254
|
+
async setAppVariable(appId, name, input, connection) {
|
|
255
|
+
const query = connection?.query ?? this.query();
|
|
256
|
+
const sealed = this.seal(input.value, variableIdentity('app', appId, name));
|
|
257
|
+
const now = new Date();
|
|
258
|
+
const existing = await query
|
|
259
|
+
.selectFrom('relAppVariables')
|
|
260
|
+
.select('id')
|
|
261
|
+
.where('appId', '=', appId)
|
|
262
|
+
.where('name', '=', name)
|
|
263
|
+
.executeTakeFirst();
|
|
264
|
+
if (existing)
|
|
265
|
+
await query
|
|
266
|
+
.updateTable('relAppVariables')
|
|
267
|
+
.set({
|
|
268
|
+
value: sealed,
|
|
269
|
+
secret: input.secret,
|
|
270
|
+
generated: input.generated === true,
|
|
271
|
+
updatedBy: input.by,
|
|
272
|
+
updatedAt: now,
|
|
273
|
+
})
|
|
274
|
+
.where('id', '=', String(existing.id))
|
|
275
|
+
.execute();
|
|
276
|
+
else
|
|
277
|
+
await query
|
|
278
|
+
.insertInto('relAppVariables')
|
|
279
|
+
.values({
|
|
280
|
+
id: randomUUID(),
|
|
281
|
+
appId,
|
|
282
|
+
name,
|
|
283
|
+
value: sealed,
|
|
284
|
+
secret: input.secret,
|
|
285
|
+
generated: input.generated === true,
|
|
286
|
+
createdBy: input.by,
|
|
287
|
+
updatedBy: input.by,
|
|
288
|
+
createdAt: now,
|
|
289
|
+
updatedAt: now,
|
|
290
|
+
})
|
|
291
|
+
.execute();
|
|
292
|
+
}
|
|
293
|
+
/** Removes an App's variable; answers whether it had a value. */
|
|
294
|
+
async unsetAppVariable(appId, name) {
|
|
295
|
+
const row = await this.query()
|
|
296
|
+
.selectFrom('relAppVariables')
|
|
297
|
+
.select(['id', 'value'])
|
|
298
|
+
.where('appId', '=', appId)
|
|
299
|
+
.where('name', '=', name)
|
|
300
|
+
.executeTakeFirst();
|
|
301
|
+
if (!row)
|
|
302
|
+
return false;
|
|
303
|
+
await this.query()
|
|
304
|
+
.deleteFrom('relAppVariables')
|
|
305
|
+
.where('id', '=', String(row.id))
|
|
306
|
+
.execute();
|
|
307
|
+
return row.value != null;
|
|
308
|
+
}
|
|
309
|
+
async removeApp(appId, connection) {
|
|
310
|
+
await connection.query
|
|
311
|
+
.deleteFrom('relAppVariables')
|
|
312
|
+
.where('appId', '=', appId)
|
|
313
|
+
.execute();
|
|
314
|
+
}
|
|
315
|
+
async removeEnvironment(environmentId) {
|
|
316
|
+
await this.query()
|
|
317
|
+
.deleteFrom('relEnvironmentVariables')
|
|
318
|
+
.where('environmentId', '=', environmentId)
|
|
319
|
+
.execute();
|
|
320
|
+
}
|
|
321
|
+
seal(value, identity) {
|
|
322
|
+
return encryptText(value, identity, this.options.secrets, 'variables');
|
|
323
|
+
}
|
|
324
|
+
/** A sealed value opened; one that no longer opens (another key, damaged) reads as unset. */
|
|
325
|
+
open(value, identity) {
|
|
326
|
+
if (typeof value !== 'string' || value === '')
|
|
327
|
+
return null;
|
|
328
|
+
try {
|
|
329
|
+
return decryptText(value, identity, this.options.secrets, 'variables');
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
query() {
|
|
336
|
+
return this.options.database.connection().query;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
export function environmentVariableView(variable) {
|
|
340
|
+
return {
|
|
341
|
+
name: variable.name,
|
|
342
|
+
secret: variable.secret,
|
|
343
|
+
description: variable.description,
|
|
344
|
+
...valueView(variable.value, variable.secret),
|
|
345
|
+
updatedBy: variable.updatedBy,
|
|
346
|
+
updatedAt: variable.updatedAt.toISOString(),
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
function valueView(value, secret) {
|
|
350
|
+
return { set: value !== null, value: secret ? null : value };
|
|
351
|
+
}
|
|
352
|
+
/** Resolves the variables of one deployment; nothing here reads or writes the database. */
|
|
353
|
+
export function resolveVariables(input) {
|
|
354
|
+
const declared = new Map();
|
|
355
|
+
for (const variable of input.manifest?.variables ?? [])
|
|
356
|
+
if (!RESERVED_VARIABLE_NAMES.includes(variable.name))
|
|
357
|
+
declared.set(variable.name, variable);
|
|
358
|
+
const environment = new Map(input.environment.map((v) => [v.name, v]));
|
|
359
|
+
const app = new Map(input.app.map((v) => [v.name, v]));
|
|
360
|
+
const generated = input.generated ?? {};
|
|
361
|
+
const names = new Set([
|
|
362
|
+
...declared.keys(),
|
|
363
|
+
...environment.keys(),
|
|
364
|
+
...[...app.values()].filter((v) => v.value !== null).map((v) => v.name),
|
|
365
|
+
...Object.keys(generated),
|
|
366
|
+
]);
|
|
367
|
+
const variables = [];
|
|
368
|
+
const env = {};
|
|
369
|
+
for (const name of [...names].sort()) {
|
|
370
|
+
if (RESERVED_VARIABLE_NAMES.includes(name))
|
|
371
|
+
continue;
|
|
372
|
+
const declaration = declared.get(name) ?? null;
|
|
373
|
+
const own = app.get(name) ?? null;
|
|
374
|
+
const shared = environment.get(name) ?? null;
|
|
375
|
+
let source;
|
|
376
|
+
let value;
|
|
377
|
+
if (own?.value != null) {
|
|
378
|
+
source = own.generated ? 'generated' : 'app';
|
|
379
|
+
value = own.value;
|
|
380
|
+
}
|
|
381
|
+
else if (shared?.value != null) {
|
|
382
|
+
source = 'environment';
|
|
383
|
+
value = shared.value;
|
|
384
|
+
}
|
|
385
|
+
else if (declaration?.path &&
|
|
386
|
+
hasRealValue(input.configFile, declaration.path)) {
|
|
387
|
+
source = 'configFile';
|
|
388
|
+
}
|
|
389
|
+
else if (generated[name] !== undefined) {
|
|
390
|
+
source = 'generated';
|
|
391
|
+
value = generated[name];
|
|
392
|
+
}
|
|
393
|
+
else if (input.generatable?.has(name)) {
|
|
394
|
+
source = 'generated';
|
|
395
|
+
}
|
|
396
|
+
else if (declaration?.hasDefault) {
|
|
397
|
+
source = 'default';
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
source = 'unset';
|
|
401
|
+
}
|
|
402
|
+
if (value !== undefined)
|
|
403
|
+
env[name] = value;
|
|
404
|
+
const firstStartOnly = declaration?.firstStartOnly ?? false;
|
|
405
|
+
const required = declaration?.required ?? false;
|
|
406
|
+
const missing = required && source === 'unset';
|
|
407
|
+
const changed = !firstStartOnly &&
|
|
408
|
+
input.running !== undefined &&
|
|
409
|
+
input.running !== null &&
|
|
410
|
+
input.running[name] !== value;
|
|
411
|
+
variables.push({
|
|
412
|
+
name,
|
|
413
|
+
declaration,
|
|
414
|
+
source,
|
|
415
|
+
secret: (declaration?.secret ?? false) ||
|
|
416
|
+
Boolean(own?.secret || shared?.secret),
|
|
417
|
+
firstStartOnly,
|
|
418
|
+
required,
|
|
419
|
+
value,
|
|
420
|
+
missing,
|
|
421
|
+
changed,
|
|
422
|
+
app: own,
|
|
423
|
+
environment: shared,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
// A variable the running deployment had and nothing gives any more changed too.
|
|
427
|
+
const removed = input.running !== undefined && input.running !== null
|
|
428
|
+
? Object.keys(input.running).some((name) => !names.has(name) && !(declared.get(name)?.firstStartOnly ?? false))
|
|
429
|
+
: false;
|
|
430
|
+
return {
|
|
431
|
+
env,
|
|
432
|
+
variables,
|
|
433
|
+
missing: variables
|
|
434
|
+
.filter((variable) => variable.missing && variable.declaration)
|
|
435
|
+
.map((variable) => variable.declaration),
|
|
436
|
+
fingerprint: fingerprintOf(env, input.manifest),
|
|
437
|
+
changed: removed || variables.some((variable) => variable.changed),
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
/** The fingerprint of what a deployment's variables give, leaving out what is read only on the first start. */
|
|
441
|
+
export function fingerprintOf(env, manifest) {
|
|
442
|
+
const firstStartOnly = new Set((manifest?.variables ?? [])
|
|
443
|
+
.filter((variable) => variable.firstStartOnly)
|
|
444
|
+
.map((variable) => variable.name));
|
|
445
|
+
const entries = Object.entries(env)
|
|
446
|
+
.filter(([name]) => !firstStartOnly.has(name))
|
|
447
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
448
|
+
return createHash('sha256').update(JSON.stringify(entries)).digest('hex');
|
|
449
|
+
}
|
|
450
|
+
/** How the App variables page shows a resolved variable. */
|
|
451
|
+
export function appVariableView(variable) {
|
|
452
|
+
const { secret } = variable;
|
|
453
|
+
return {
|
|
454
|
+
name: variable.name,
|
|
455
|
+
declared: variable.declaration !== null,
|
|
456
|
+
description: variable.declaration?.description ??
|
|
457
|
+
variable.environment?.description ??
|
|
458
|
+
null,
|
|
459
|
+
secret,
|
|
460
|
+
required: variable.required,
|
|
461
|
+
firstStartOnly: variable.firstStartOnly,
|
|
462
|
+
generate: variable.declaration?.generate ?? null,
|
|
463
|
+
source: variable.source,
|
|
464
|
+
value: secret ? null : (variable.value ?? null),
|
|
465
|
+
missing: variable.missing,
|
|
466
|
+
changed: variable.changed,
|
|
467
|
+
app: variable.app
|
|
468
|
+
? {
|
|
469
|
+
...valueView(variable.app.value, secret),
|
|
470
|
+
generated: variable.app.generated,
|
|
471
|
+
}
|
|
472
|
+
: null,
|
|
473
|
+
environment: variable.environment
|
|
474
|
+
? valueView(variable.environment.value, secret)
|
|
475
|
+
: null,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
// --- Configuration file -----------------------------------------------------------------------------------------
|
|
479
|
+
/** The value at a dotted path of a parsed configuration. */
|
|
480
|
+
export function configValueAt(config, path) {
|
|
481
|
+
let value = config;
|
|
482
|
+
for (const segment of path.split('.')) {
|
|
483
|
+
if (!isRecord(value))
|
|
484
|
+
return undefined;
|
|
485
|
+
value = value[segment];
|
|
486
|
+
}
|
|
487
|
+
return value;
|
|
488
|
+
}
|
|
489
|
+
/** Whether the configuration holds a value at the path that is not an example's placeholder. */
|
|
490
|
+
export function hasRealValue(config, path) {
|
|
491
|
+
const value = configValueAt(config, path);
|
|
492
|
+
if (value === undefined || value === null || value === '')
|
|
493
|
+
return false;
|
|
494
|
+
if (Array.isArray(value) && value.length === 0)
|
|
495
|
+
return false;
|
|
496
|
+
return !isExamplePlaceholder(value) && !isPlaceholderText(value);
|
|
497
|
+
}
|
|
498
|
+
function isPlaceholderText(value) {
|
|
499
|
+
return typeof value === 'string' && /^replace-with-/u.test(value.trim());
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=variables.js.map
|