@qwickapps/server 1.5.2 → 1.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/CHANGELOG.md +86 -0
- package/README.md +177 -0
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +118 -261
- package/dist/core/control-panel.js.map +1 -1
- package/dist/core/plugin-registry.d.ts +20 -0
- package/dist/core/plugin-registry.d.ts.map +1 -1
- package/dist/core/plugin-registry.js +27 -2
- package/dist/core/plugin-registry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/plugins/api-keys/ApiKeysManagementPage.d.ts +9 -0
- package/dist/plugins/api-keys/ApiKeysManagementPage.d.ts.map +1 -0
- package/dist/plugins/api-keys/ApiKeysManagementPage.js +66 -0
- package/dist/plugins/api-keys/ApiKeysManagementPage.js.map +1 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.d.ts +9 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.d.ts.map +1 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.js +30 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.js.map +1 -0
- package/dist/plugins/api-keys/api-keys-plugin.d.ts +46 -0
- package/dist/plugins/api-keys/api-keys-plugin.d.ts.map +1 -0
- package/dist/plugins/api-keys/api-keys-plugin.js +452 -0
- package/dist/plugins/api-keys/api-keys-plugin.js.map +1 -0
- package/dist/plugins/api-keys/index.d.ts +18 -0
- package/dist/plugins/api-keys/index.d.ts.map +1 -0
- package/dist/plugins/api-keys/index.js +20 -0
- package/dist/plugins/api-keys/index.js.map +1 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.d.ts +74 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.d.ts.map +1 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.js +201 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.js.map +1 -0
- package/dist/plugins/api-keys/middleware/index.d.ts +8 -0
- package/dist/plugins/api-keys/middleware/index.d.ts.map +1 -0
- package/dist/plugins/api-keys/middleware/index.js +8 -0
- package/dist/plugins/api-keys/middleware/index.js.map +1 -0
- package/dist/plugins/api-keys/middleware/usage-logging.d.ts +21 -0
- package/dist/plugins/api-keys/middleware/usage-logging.d.ts.map +1 -0
- package/dist/plugins/api-keys/middleware/usage-logging.js +57 -0
- package/dist/plugins/api-keys/middleware/usage-logging.js.map +1 -0
- package/dist/plugins/api-keys/stores/index.d.ts +9 -0
- package/dist/plugins/api-keys/stores/index.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/index.js +9 -0
- package/dist/plugins/api-keys/stores/index.js.map +1 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.d.ts +81 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.js +155 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.js.map +1 -0
- package/dist/plugins/api-keys/stores/postgres-store.d.ts +34 -0
- package/dist/plugins/api-keys/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/postgres-store.js +360 -0
- package/dist/plugins/api-keys/stores/postgres-store.js.map +1 -0
- package/dist/plugins/api-keys/stores/usage-log-store.d.ts +119 -0
- package/dist/plugins/api-keys/stores/usage-log-store.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/usage-log-store.js +246 -0
- package/dist/plugins/api-keys/stores/usage-log-store.js.map +1 -0
- package/dist/plugins/api-keys/types.d.ts +309 -0
- package/dist/plugins/api-keys/types.d.ts.map +1 -0
- package/dist/plugins/api-keys/types.js +105 -0
- package/dist/plugins/api-keys/types.js.map +1 -0
- package/dist/plugins/auth/AuthManagementPage.d.ts +9 -0
- package/dist/plugins/auth/AuthManagementPage.d.ts.map +1 -0
- package/dist/plugins/auth/AuthManagementPage.js +73 -0
- package/dist/plugins/auth/AuthManagementPage.js.map +1 -0
- package/dist/plugins/auth/AuthStatusWidget.d.ts +9 -0
- package/dist/plugins/auth/AuthStatusWidget.d.ts.map +1 -0
- package/dist/plugins/auth/AuthStatusWidget.js +30 -0
- package/dist/plugins/auth/AuthStatusWidget.js.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -1
- package/dist/plugins/auth/adapters/basic-adapter.js +54 -0
- package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -1
- package/dist/plugins/auth/auth-plugin.js +1 -1
- package/dist/plugins/auth/auth-plugin.js.map +1 -1
- package/dist/plugins/auth/env-config.d.ts +15 -1
- package/dist/plugins/auth/env-config.d.ts.map +1 -1
- package/dist/plugins/auth/env-config.js +16 -6
- package/dist/plugins/auth/env-config.js.map +1 -1
- package/dist/plugins/auth/index.d.ts +5 -1
- package/dist/plugins/auth/index.d.ts.map +1 -1
- package/dist/plugins/auth/index.js +7 -1
- package/dist/plugins/auth/index.js.map +1 -1
- package/dist/plugins/bans/BansManagementPage.d.ts +9 -0
- package/dist/plugins/bans/BansManagementPage.d.ts.map +1 -0
- package/dist/plugins/bans/BansManagementPage.js +65 -0
- package/dist/plugins/bans/BansManagementPage.js.map +1 -0
- package/dist/plugins/bans/BansStatusWidget.d.ts +9 -0
- package/dist/plugins/bans/BansStatusWidget.d.ts.map +1 -0
- package/dist/plugins/bans/BansStatusWidget.js +30 -0
- package/dist/plugins/bans/BansStatusWidget.js.map +1 -0
- package/dist/plugins/bans/bans-plugin.js +1 -1
- package/dist/plugins/bans/bans-plugin.js.map +1 -1
- package/dist/plugins/bans/index.d.ts +4 -0
- package/dist/plugins/bans/index.d.ts.map +1 -1
- package/dist/plugins/bans/index.js +3 -0
- package/dist/plugins/bans/index.js.map +1 -1
- package/dist/plugins/cache/CacheManagementPage.d.ts +13 -0
- package/dist/plugins/cache/CacheManagementPage.d.ts.map +1 -0
- package/dist/plugins/cache/CacheManagementPage.js +175 -0
- package/dist/plugins/cache/CacheManagementPage.js.map +1 -0
- package/dist/plugins/cache/CacheStatusWidget.d.ts +13 -0
- package/dist/plugins/cache/CacheStatusWidget.d.ts.map +1 -0
- package/dist/plugins/cache/CacheStatusWidget.js +80 -0
- package/dist/plugins/cache/CacheStatusWidget.js.map +1 -0
- package/dist/plugins/cache/index.d.ts +10 -0
- package/dist/plugins/cache/index.d.ts.map +1 -0
- package/dist/plugins/cache/index.js +8 -0
- package/dist/plugins/cache/index.js.map +1 -0
- package/dist/plugins/cms/cms-plugin.d.ts +24 -0
- package/dist/plugins/cms/cms-plugin.d.ts.map +1 -0
- package/dist/plugins/cms/cms-plugin.js +220 -0
- package/dist/plugins/cms/cms-plugin.js.map +1 -0
- package/dist/plugins/cms/index.d.ts +8 -0
- package/dist/plugins/cms/index.d.ts.map +1 -0
- package/dist/plugins/cms/index.js +7 -0
- package/dist/plugins/cms/index.js.map +1 -0
- package/dist/plugins/config-plugin.js +4 -4
- package/dist/plugins/config-plugin.js.map +1 -1
- package/dist/plugins/core/index.d.ts +32 -0
- package/dist/plugins/core/index.d.ts.map +1 -0
- package/dist/plugins/core/index.js +129 -0
- package/dist/plugins/core/index.js.map +1 -0
- package/dist/plugins/devices/DevicesManagementPage.d.ts +9 -0
- package/dist/plugins/devices/DevicesManagementPage.d.ts.map +1 -0
- package/dist/plugins/devices/DevicesManagementPage.js +65 -0
- package/dist/plugins/devices/DevicesManagementPage.js.map +1 -0
- package/dist/plugins/devices/DevicesStatusWidget.d.ts +9 -0
- package/dist/plugins/devices/DevicesStatusWidget.d.ts.map +1 -0
- package/dist/plugins/devices/DevicesStatusWidget.js +30 -0
- package/dist/plugins/devices/DevicesStatusWidget.js.map +1 -0
- package/dist/plugins/devices/devices-plugin.js +1 -1
- package/dist/plugins/devices/devices-plugin.js.map +1 -1
- package/dist/plugins/devices/index.d.ts +4 -0
- package/dist/plugins/devices/index.d.ts.map +1 -1
- package/dist/plugins/devices/index.js +3 -0
- package/dist/plugins/devices/index.js.map +1 -1
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.d.ts +13 -0
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.d.ts.map +1 -0
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.js +78 -0
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.js.map +1 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.d.ts +13 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.js +87 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.js.map +1 -0
- package/dist/plugins/diagnostics/index.d.ts +10 -0
- package/dist/plugins/diagnostics/index.d.ts.map +1 -0
- package/dist/plugins/diagnostics/index.js +8 -0
- package/dist/plugins/diagnostics/index.js.map +1 -0
- package/dist/plugins/diagnostics-plugin.js +4 -3
- package/dist/plugins/diagnostics-plugin.js.map +1 -1
- package/dist/plugins/entitlements/EntitlementsManagementPage.d.ts +9 -0
- package/dist/plugins/entitlements/EntitlementsManagementPage.d.ts.map +1 -0
- package/dist/plugins/entitlements/EntitlementsManagementPage.js +59 -0
- package/dist/plugins/entitlements/EntitlementsManagementPage.js.map +1 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.d.ts +9 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.js +30 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.js.map +1 -0
- package/dist/plugins/entitlements/entitlements-plugin.js +1 -1
- package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -1
- package/dist/plugins/entitlements/index.d.ts +4 -0
- package/dist/plugins/entitlements/index.d.ts.map +1 -1
- package/dist/plugins/entitlements/index.js +3 -0
- package/dist/plugins/entitlements/index.js.map +1 -1
- package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
- package/dist/plugins/frontend-app-plugin.js +5 -2
- package/dist/plugins/frontend-app-plugin.js.map +1 -1
- package/dist/plugins/health/HealthManagementPage.d.ts +13 -0
- package/dist/plugins/health/HealthManagementPage.d.ts.map +1 -0
- package/dist/plugins/health/HealthManagementPage.js +120 -0
- package/dist/plugins/health/HealthManagementPage.js.map +1 -0
- package/dist/plugins/health/HealthStatusWidget.d.ts +13 -0
- package/dist/plugins/health/HealthStatusWidget.d.ts.map +1 -0
- package/dist/plugins/health/HealthStatusWidget.js +80 -0
- package/dist/plugins/health/HealthStatusWidget.js.map +1 -0
- package/dist/plugins/health/index.d.ts +10 -0
- package/dist/plugins/health/index.d.ts.map +1 -0
- package/dist/plugins/health/index.js +8 -0
- package/dist/plugins/health/index.js.map +1 -0
- package/dist/plugins/index.d.ts +9 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +6 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/logs/LogsManagementPage.d.ts +13 -0
- package/dist/plugins/logs/LogsManagementPage.d.ts.map +1 -0
- package/dist/plugins/logs/LogsManagementPage.js +151 -0
- package/dist/plugins/logs/LogsManagementPage.js.map +1 -0
- package/dist/plugins/logs/LogsStatusWidget.d.ts +13 -0
- package/dist/plugins/logs/LogsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/logs/LogsStatusWidget.js +76 -0
- package/dist/plugins/logs/LogsStatusWidget.js.map +1 -0
- package/dist/plugins/logs/index.d.ts +10 -0
- package/dist/plugins/logs/index.d.ts.map +1 -0
- package/dist/plugins/logs/index.js +8 -0
- package/dist/plugins/logs/index.js.map +1 -0
- package/dist/plugins/logs-plugin.js +6 -6
- package/dist/plugins/logs-plugin.js.map +1 -1
- package/dist/plugins/maintenance/MaintenanceManagementPage.d.ts +13 -0
- package/dist/plugins/maintenance/MaintenanceManagementPage.d.ts.map +1 -0
- package/dist/plugins/maintenance/MaintenanceManagementPage.js +40 -0
- package/dist/plugins/maintenance/MaintenanceManagementPage.js.map +1 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.d.ts +13 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.d.ts.map +1 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.js +76 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.js.map +1 -0
- package/dist/plugins/maintenance/SeedExecutor.d.ts +17 -0
- package/dist/plugins/maintenance/SeedExecutor.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedExecutor.js +154 -0
- package/dist/plugins/maintenance/SeedExecutor.js.map +1 -0
- package/dist/plugins/maintenance/SeedHistory.d.ts +14 -0
- package/dist/plugins/maintenance/SeedHistory.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedHistory.js +183 -0
- package/dist/plugins/maintenance/SeedHistory.js.map +1 -0
- package/dist/plugins/maintenance/SeedList.d.ts +15 -0
- package/dist/plugins/maintenance/SeedList.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedList.js +68 -0
- package/dist/plugins/maintenance/SeedList.js.map +1 -0
- package/dist/plugins/maintenance/SeedManagementPage.d.ts +14 -0
- package/dist/plugins/maintenance/SeedManagementPage.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedManagementPage.js +42 -0
- package/dist/plugins/maintenance/SeedManagementPage.js.map +1 -0
- package/dist/plugins/maintenance/index.d.ts +20 -0
- package/dist/plugins/maintenance/index.d.ts.map +1 -0
- package/dist/plugins/maintenance/index.js +15 -0
- package/dist/plugins/maintenance/index.js.map +1 -0
- package/dist/plugins/maintenance/seed-executor.d.ts +55 -0
- package/dist/plugins/maintenance/seed-executor.d.ts.map +1 -0
- package/dist/plugins/maintenance/seed-executor.js +178 -0
- package/dist/plugins/maintenance/seed-executor.js.map +1 -0
- package/dist/plugins/maintenance-plugin.d.ts +35 -0
- package/dist/plugins/maintenance-plugin.d.ts.map +1 -0
- package/dist/plugins/maintenance-plugin.js +321 -0
- package/dist/plugins/maintenance-plugin.js.map +1 -0
- package/dist/plugins/notifications/NotificationsManagementPage.d.ts +13 -0
- package/dist/plugins/notifications/NotificationsManagementPage.d.ts.map +1 -0
- package/dist/plugins/notifications/NotificationsManagementPage.js +59 -0
- package/dist/plugins/notifications/NotificationsManagementPage.js.map +1 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.d.ts +9 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.js +30 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.js.map +1 -0
- package/dist/plugins/notifications/index.d.ts +4 -0
- package/dist/plugins/notifications/index.d.ts.map +1 -1
- package/dist/plugins/notifications/index.js +3 -0
- package/dist/plugins/notifications/index.js.map +1 -1
- package/dist/plugins/notifications/notifications-plugin.js +1 -1
- package/dist/plugins/notifications/notifications-plugin.js.map +1 -1
- package/dist/plugins/parental/ParentalManagementPage.d.ts +9 -0
- package/dist/plugins/parental/ParentalManagementPage.d.ts.map +1 -0
- package/dist/plugins/parental/ParentalManagementPage.js +56 -0
- package/dist/plugins/parental/ParentalManagementPage.js.map +1 -0
- package/dist/plugins/parental/ParentalStatusWidget.d.ts +9 -0
- package/dist/plugins/parental/ParentalStatusWidget.d.ts.map +1 -0
- package/dist/plugins/parental/ParentalStatusWidget.js +30 -0
- package/dist/plugins/parental/ParentalStatusWidget.js.map +1 -0
- package/dist/plugins/parental/index.d.ts +4 -0
- package/dist/plugins/parental/index.d.ts.map +1 -1
- package/dist/plugins/parental/index.js +3 -0
- package/dist/plugins/parental/index.js.map +1 -1
- package/dist/plugins/parental/parental-plugin.js +1 -1
- package/dist/plugins/parental/parental-plugin.js.map +1 -1
- package/dist/plugins/postgres/PostgresManagementPage.d.ts +13 -0
- package/dist/plugins/postgres/PostgresManagementPage.d.ts.map +1 -0
- package/dist/plugins/postgres/PostgresManagementPage.js +139 -0
- package/dist/plugins/postgres/PostgresManagementPage.js.map +1 -0
- package/dist/plugins/postgres/PostgresStatusWidget.d.ts +13 -0
- package/dist/plugins/postgres/PostgresStatusWidget.d.ts.map +1 -0
- package/dist/plugins/postgres/PostgresStatusWidget.js +87 -0
- package/dist/plugins/postgres/PostgresStatusWidget.js.map +1 -0
- package/dist/plugins/postgres/index.d.ts +10 -0
- package/dist/plugins/postgres/index.d.ts.map +1 -0
- package/dist/plugins/postgres/index.js +8 -0
- package/dist/plugins/postgres/index.js.map +1 -0
- package/dist/plugins/preferences/PreferencesManagementPage.d.ts +9 -0
- package/dist/plugins/preferences/PreferencesManagementPage.d.ts.map +1 -0
- package/dist/plugins/preferences/PreferencesManagementPage.js +67 -0
- package/dist/plugins/preferences/PreferencesManagementPage.js.map +1 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.d.ts +9 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.d.ts.map +1 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.js +30 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.js.map +1 -0
- package/dist/plugins/preferences/index.d.ts +4 -0
- package/dist/plugins/preferences/index.d.ts.map +1 -1
- package/dist/plugins/preferences/index.js +3 -0
- package/dist/plugins/preferences/index.js.map +1 -1
- package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -1
- package/dist/plugins/preferences/preferences-plugin.js +9 -4
- package/dist/plugins/preferences/preferences-plugin.js.map +1 -1
- package/dist/plugins/preferences/types.d.ts +5 -0
- package/dist/plugins/preferences/types.d.ts.map +1 -1
- package/dist/plugins/preferences/types.js +5 -1
- package/dist/plugins/preferences/types.js.map +1 -1
- package/dist/plugins/profiles/ProfilesManagementPage.d.ts +9 -0
- package/dist/plugins/profiles/ProfilesManagementPage.d.ts.map +1 -0
- package/dist/plugins/profiles/ProfilesManagementPage.js +51 -0
- package/dist/plugins/profiles/ProfilesManagementPage.js.map +1 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.d.ts +9 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.d.ts.map +1 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.js +30 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.js.map +1 -0
- package/dist/plugins/profiles/index.d.ts +4 -0
- package/dist/plugins/profiles/index.d.ts.map +1 -1
- package/dist/plugins/profiles/index.js +3 -0
- package/dist/plugins/profiles/index.js.map +1 -1
- package/dist/plugins/profiles/profiles-plugin.js +1 -1
- package/dist/plugins/profiles/profiles-plugin.js.map +1 -1
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.d.ts +13 -0
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.d.ts.map +1 -0
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.js +59 -0
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.js.map +1 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.d.ts +9 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.d.ts.map +1 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.js +30 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.js.map +1 -0
- package/dist/plugins/qwickbrain/index.d.ts +4 -0
- package/dist/plugins/qwickbrain/index.d.ts.map +1 -1
- package/dist/plugins/qwickbrain/index.js +3 -0
- package/dist/plugins/qwickbrain/index.js.map +1 -1
- package/dist/plugins/qwickbrain/qwickbrain-plugin.d.ts.map +1 -1
- package/dist/plugins/qwickbrain/qwickbrain-plugin.js +12 -34
- package/dist/plugins/qwickbrain/qwickbrain-plugin.js.map +1 -1
- package/dist/plugins/qwickbrain/types.d.ts +0 -1
- package/dist/plugins/qwickbrain/types.d.ts.map +1 -1
- package/dist/plugins/rate-limit/RateLimitManagementPage.d.ts +13 -0
- package/dist/plugins/rate-limit/RateLimitManagementPage.d.ts.map +1 -0
- package/dist/plugins/rate-limit/RateLimitManagementPage.js +60 -0
- package/dist/plugins/rate-limit/RateLimitManagementPage.js.map +1 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.d.ts +9 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.d.ts.map +1 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.js +30 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.js.map +1 -0
- package/dist/plugins/rate-limit/index.d.ts +4 -0
- package/dist/plugins/rate-limit/index.d.ts.map +1 -1
- package/dist/plugins/rate-limit/index.js +3 -0
- package/dist/plugins/rate-limit/index.js.map +1 -1
- package/dist/plugins/rate-limit/rate-limit-plugin.js +5 -5
- package/dist/plugins/rate-limit/rate-limit-plugin.js.map +1 -1
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.d.ts +9 -0
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.d.ts.map +1 -0
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.js +66 -0
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.js.map +1 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.d.ts +9 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.js +30 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.js.map +1 -0
- package/dist/plugins/subscriptions/index.d.ts +4 -0
- package/dist/plugins/subscriptions/index.d.ts.map +1 -1
- package/dist/plugins/subscriptions/index.js +3 -0
- package/dist/plugins/subscriptions/index.js.map +1 -1
- package/dist/plugins/subscriptions/subscriptions-plugin.js +1 -1
- package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -1
- package/dist/plugins/usage/UsageManagementPage.d.ts +9 -0
- package/dist/plugins/usage/UsageManagementPage.d.ts.map +1 -0
- package/dist/plugins/usage/UsageManagementPage.js +42 -0
- package/dist/plugins/usage/UsageManagementPage.js.map +1 -0
- package/dist/plugins/usage/UsageStatusWidget.d.ts +9 -0
- package/dist/plugins/usage/UsageStatusWidget.d.ts.map +1 -0
- package/dist/plugins/usage/UsageStatusWidget.js +30 -0
- package/dist/plugins/usage/UsageStatusWidget.js.map +1 -0
- package/dist/plugins/usage/index.d.ts +4 -0
- package/dist/plugins/usage/index.d.ts.map +1 -1
- package/dist/plugins/usage/index.js +3 -0
- package/dist/plugins/usage/index.js.map +1 -1
- package/dist/plugins/usage/usage-plugin.js +1 -1
- package/dist/plugins/usage/usage-plugin.js.map +1 -1
- package/dist/plugins/users/UsersManagementPage.d.ts +13 -0
- package/dist/plugins/users/UsersManagementPage.d.ts.map +1 -0
- package/dist/plugins/users/UsersManagementPage.js +199 -0
- package/dist/plugins/users/UsersManagementPage.js.map +1 -0
- package/dist/plugins/users/UsersStatusWidget.d.ts +13 -0
- package/dist/plugins/users/UsersStatusWidget.d.ts.map +1 -0
- package/dist/plugins/users/UsersStatusWidget.js +79 -0
- package/dist/plugins/users/UsersStatusWidget.js.map +1 -0
- package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -1
- package/dist/plugins/users/stores/postgres-store.js +74 -19
- package/dist/plugins/users/stores/postgres-store.js.map +1 -1
- package/dist/plugins/users/types.d.ts +30 -1
- package/dist/plugins/users/types.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.js +118 -3
- package/dist/plugins/users/users-plugin.js.map +1 -1
- package/dist-ui/assets/index-BiEHWqD3.js +528 -0
- package/dist-ui/assets/index-BiEHWqD3.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/index.js +3682 -2765
- package/dist-ui-lib/index.js.map +1 -1
- package/dist-ui-lib/src/api/clientBuilder.d.ts +33 -0
- package/dist-ui-lib/{api → src/api}/controlPanelApi.d.ts +124 -0
- package/dist-ui-lib/src/api/index.d.ts +11 -0
- package/dist-ui-lib/src/api/types.d.ts +313 -0
- package/dist-ui-lib/{components → src/components}/ControlPanelApp.d.ts +2 -1
- package/dist-ui-lib/src/components/auth/AcceptInvitationPage.d.ts +21 -0
- package/dist-ui-lib/src/components/auth/LoginPage.d.ts +27 -0
- package/dist-ui-lib/src/components/auth/PasswordResetConfirmPage.d.ts +17 -0
- package/dist-ui-lib/src/components/auth/PasswordResetPage.d.ts +12 -0
- package/dist-ui-lib/src/components/auth/SignupPage.d.ts +27 -0
- package/dist-ui-lib/src/components/auth/VerifyEmailPage.d.ts +12 -0
- package/dist-ui-lib/src/components/auth/index.d.ts +19 -0
- package/dist-ui-lib/src/components/auth/shared/AuthError.d.ts +9 -0
- package/dist-ui-lib/src/components/auth/shared/AuthLayout.d.ts +11 -0
- package/dist-ui-lib/src/components/auth/shared/index.d.ts +7 -0
- package/dist-ui-lib/{components → src/components}/index.d.ts +5 -2
- package/dist-ui-lib/src/components/plugins/PluginConfigPanel.d.ts +65 -0
- package/dist-ui-lib/src/components/plugins/PluginManagementPage.d.ts +62 -0
- package/dist-ui-lib/src/components/plugins/PluginStatusWidget.d.ts +51 -0
- package/dist-ui-lib/src/components/plugins/index.d.ts +13 -0
- package/dist-ui-lib/src/config/preferences.d.ts +16 -0
- package/dist-ui-lib/src/dashboard/widgets/CMSMaintenanceWidget.d.ts +8 -0
- package/dist-ui-lib/src/dashboard/widgets/CMSStatusWidget.d.ts +8 -0
- package/dist-ui-lib/{dashboard → src/dashboard}/widgets/index.d.ts +2 -0
- package/dist-ui-lib/src/hooks/useJobStream.d.ts +38 -0
- package/dist-ui-lib/src/pages/AcceptInvitationPage.d.ts +28 -0
- package/dist-ui-lib/src/pages/PreferencesPage.d.ts +9 -0
- package/package.json +12 -5
- package/src/core/control-panel.ts +141 -286
- package/src/core/plugin-registry.ts +52 -3
- package/src/index.ts +27 -0
- package/src/plugins/api-keys/API_ROUTES.md +165 -0
- package/src/plugins/api-keys/ApiKeysManagementPage.test.tsx +58 -0
- package/src/plugins/api-keys/ApiKeysManagementPage.tsx +131 -0
- package/src/plugins/api-keys/ApiKeysStatusWidget.test.tsx +112 -0
- package/src/plugins/api-keys/ApiKeysStatusWidget.tsx +53 -0
- package/src/plugins/api-keys/api-keys-plugin.ts +533 -0
- package/src/plugins/api-keys/index.ts +55 -0
- package/src/plugins/api-keys/middleware/bearer-token-auth.ts +250 -0
- package/src/plugins/api-keys/middleware/index.ts +15 -0
- package/src/plugins/api-keys/middleware/usage-logging.ts +78 -0
- package/src/plugins/api-keys/stores/index.ts +21 -0
- package/src/plugins/api-keys/stores/plugin-scope-store.ts +280 -0
- package/src/plugins/api-keys/stores/postgres-store.ts +487 -0
- package/src/plugins/api-keys/stores/usage-log-store.ts +423 -0
- package/src/plugins/api-keys/types.ts +307 -0
- package/src/plugins/auth/API_ROUTES.md +110 -0
- package/src/plugins/auth/AuthManagementPage.test.tsx +58 -0
- package/src/plugins/auth/AuthManagementPage.tsx +170 -0
- package/src/plugins/auth/AuthStatusWidget.test.tsx +112 -0
- package/src/plugins/auth/AuthStatusWidget.tsx +53 -0
- package/src/plugins/auth/adapters/basic-adapter.ts +62 -0
- package/src/plugins/auth/auth-plugin.ts +1 -1
- package/src/plugins/auth/env-config.ts +16 -6
- package/src/plugins/auth/index.ts +9 -0
- package/src/plugins/bans/API_ROUTES.md +183 -0
- package/src/plugins/bans/BansManagementPage.test.tsx +58 -0
- package/src/plugins/bans/BansManagementPage.tsx +129 -0
- package/src/plugins/bans/BansStatusWidget.test.tsx +112 -0
- package/src/plugins/bans/BansStatusWidget.tsx +53 -0
- package/src/plugins/bans/bans-plugin.ts +1 -1
- package/src/plugins/bans/index.ts +6 -0
- package/src/plugins/cache/API_ROUTES.md +312 -0
- package/src/plugins/cache/CacheManagementPage.test.tsx +57 -0
- package/src/plugins/cache/CacheManagementPage.tsx +360 -0
- package/src/plugins/cache/CacheStatusWidget.test.tsx +113 -0
- package/src/plugins/cache/CacheStatusWidget.tsx +122 -0
- package/src/plugins/cache/index.ts +10 -0
- package/src/plugins/cms/cms-plugin.ts +259 -0
- package/src/plugins/cms/index.ts +8 -0
- package/src/plugins/config-plugin.ts +4 -4
- package/src/plugins/core/index.ts +164 -0
- package/src/plugins/devices/API_ROUTES.md +27 -0
- package/src/plugins/devices/DevicesManagementPage.test.tsx +58 -0
- package/src/plugins/devices/DevicesManagementPage.tsx +124 -0
- package/src/plugins/devices/DevicesStatusWidget.test.tsx +109 -0
- package/src/plugins/devices/DevicesStatusWidget.tsx +52 -0
- package/src/plugins/devices/devices-plugin.ts +1 -1
- package/src/plugins/devices/index.ts +6 -0
- package/src/plugins/diagnostics/API_ROUTES.md +316 -0
- package/src/plugins/diagnostics/DiagnosticsManagementPage.test.tsx +58 -0
- package/src/plugins/diagnostics/DiagnosticsManagementPage.tsx +306 -0
- package/src/plugins/diagnostics/DiagnosticsStatusWidget.test.tsx +112 -0
- package/src/plugins/diagnostics/DiagnosticsStatusWidget.tsx +129 -0
- package/src/plugins/diagnostics/index.ts +10 -0
- package/src/plugins/diagnostics-plugin.ts +3 -3
- package/src/plugins/entitlements/API_ROUTES.md +27 -0
- package/src/plugins/entitlements/EntitlementsManagementPage.test.tsx +58 -0
- package/src/plugins/entitlements/EntitlementsManagementPage.tsx +113 -0
- package/src/plugins/entitlements/EntitlementsStatusWidget.test.tsx +109 -0
- package/src/plugins/entitlements/EntitlementsStatusWidget.tsx +52 -0
- package/src/plugins/entitlements/entitlements-plugin.ts +1 -1
- package/src/plugins/entitlements/index.ts +6 -0
- package/src/plugins/frontend-app-plugin.ts +7 -2
- package/src/plugins/health/API_ROUTES.md +283 -0
- package/src/plugins/health/HealthManagementPage.test.tsx +57 -0
- package/src/plugins/health/HealthManagementPage.tsx +320 -0
- package/src/plugins/health/HealthStatusWidget.test.tsx +107 -0
- package/src/plugins/health/HealthStatusWidget.tsx +134 -0
- package/src/plugins/health/index.ts +10 -0
- package/src/plugins/index.ts +49 -0
- package/src/plugins/logs/API_ROUTES.md +297 -0
- package/src/plugins/logs/LogsManagementPage.test.tsx +58 -0
- package/src/plugins/logs/LogsManagementPage.tsx +283 -0
- package/src/plugins/logs/LogsStatusWidget.test.tsx +119 -0
- package/src/plugins/logs/LogsStatusWidget.tsx +123 -0
- package/src/plugins/logs/index.ts +10 -0
- package/src/plugins/logs-plugin.ts +6 -6
- package/src/plugins/maintenance/MaintenanceManagementPage.tsx +193 -0
- package/src/plugins/maintenance/MaintenanceStatusWidget.tsx +120 -0
- package/src/plugins/maintenance/SeedExecutor.tsx +236 -0
- package/src/plugins/maintenance/SeedHistory.tsx +360 -0
- package/src/plugins/maintenance/SeedList.tsx +130 -0
- package/src/plugins/maintenance/SeedManagementPage.tsx +91 -0
- package/src/plugins/maintenance/index.ts +24 -0
- package/src/plugins/maintenance/seed-executor.ts +224 -0
- package/src/plugins/maintenance-plugin.ts +409 -0
- package/src/plugins/notifications/NotificationsManagementPage.test.tsx +58 -0
- package/src/plugins/notifications/NotificationsManagementPage.tsx +128 -0
- package/src/plugins/notifications/NotificationsStatusWidget.test.tsx +109 -0
- package/src/plugins/notifications/NotificationsStatusWidget.tsx +52 -0
- package/src/plugins/notifications/index.ts +6 -0
- package/src/plugins/notifications/notifications-plugin.ts +1 -1
- package/src/plugins/parental/API_ROUTES.md +30 -0
- package/src/plugins/parental/ParentalManagementPage.test.tsx +58 -0
- package/src/plugins/parental/ParentalManagementPage.tsx +119 -0
- package/src/plugins/parental/ParentalStatusWidget.test.tsx +109 -0
- package/src/plugins/parental/ParentalStatusWidget.tsx +52 -0
- package/src/plugins/parental/index.ts +6 -0
- package/src/plugins/parental/parental-plugin.ts +1 -1
- package/src/plugins/postgres/API_ROUTES.md +243 -0
- package/src/plugins/postgres/PostgresManagementPage.test.tsx +62 -0
- package/src/plugins/postgres/PostgresManagementPage.tsx +362 -0
- package/src/plugins/postgres/PostgresStatusWidget.test.tsx +117 -0
- package/src/plugins/postgres/PostgresStatusWidget.tsx +131 -0
- package/src/plugins/postgres/index.ts +10 -0
- package/src/plugins/preferences/API_ROUTES.md +162 -0
- package/src/plugins/preferences/PreferencesManagementPage.test.tsx +58 -0
- package/src/plugins/preferences/PreferencesManagementPage.tsx +139 -0
- package/src/plugins/preferences/PreferencesStatusWidget.test.tsx +109 -0
- package/src/plugins/preferences/PreferencesStatusWidget.tsx +52 -0
- package/src/plugins/preferences/index.ts +6 -0
- package/src/plugins/preferences/preferences-plugin.ts +10 -5
- package/src/plugins/preferences/types.d.ts +95 -0
- package/src/plugins/preferences/types.ts +6 -0
- package/src/plugins/profiles/API_ROUTES.md +27 -0
- package/src/plugins/profiles/ProfilesManagementPage.test.tsx +58 -0
- package/src/plugins/profiles/ProfilesManagementPage.tsx +113 -0
- package/src/plugins/profiles/ProfilesStatusWidget.test.tsx +109 -0
- package/src/plugins/profiles/ProfilesStatusWidget.tsx +52 -0
- package/src/plugins/profiles/index.ts +6 -0
- package/src/plugins/profiles/profiles-plugin.ts +1 -1
- package/src/plugins/qwickbrain/QwickbrainManagementPage.test.tsx +58 -0
- package/src/plugins/qwickbrain/QwickbrainManagementPage.tsx +126 -0
- package/src/plugins/qwickbrain/QwickbrainStatusWidget.test.tsx +109 -0
- package/src/plugins/qwickbrain/QwickbrainStatusWidget.tsx +52 -0
- package/src/plugins/qwickbrain/index.ts +6 -0
- package/src/plugins/qwickbrain/qwickbrain-plugin.ts +12 -36
- package/src/plugins/qwickbrain/types.ts +0 -1
- package/src/plugins/rate-limit/RateLimitManagementPage.test.tsx +58 -0
- package/src/plugins/rate-limit/RateLimitManagementPage.tsx +127 -0
- package/src/plugins/rate-limit/RateLimitStatusWidget.test.tsx +109 -0
- package/src/plugins/rate-limit/RateLimitStatusWidget.tsx +52 -0
- package/src/plugins/rate-limit/index.ts +6 -0
- package/src/plugins/rate-limit/rate-limit-plugin.ts +5 -5
- package/src/plugins/subscriptions/API_ROUTES.md +27 -0
- package/src/plugins/subscriptions/SubscriptionsManagementPage.test.tsx +58 -0
- package/src/plugins/subscriptions/SubscriptionsManagementPage.tsx +125 -0
- package/src/plugins/subscriptions/SubscriptionsStatusWidget.test.tsx +109 -0
- package/src/plugins/subscriptions/SubscriptionsStatusWidget.tsx +52 -0
- package/src/plugins/subscriptions/index.ts +6 -0
- package/src/plugins/subscriptions/subscriptions-plugin.ts +1 -1
- package/src/plugins/usage/API_ROUTES.md +24 -0
- package/src/plugins/usage/UsageManagementPage.test.tsx +58 -0
- package/src/plugins/usage/UsageManagementPage.tsx +93 -0
- package/src/plugins/usage/UsageStatusWidget.test.tsx +109 -0
- package/src/plugins/usage/UsageStatusWidget.tsx +52 -0
- package/src/plugins/usage/index.ts +6 -0
- package/src/plugins/usage/usage-plugin.ts +1 -1
- package/src/plugins/users/API_ROUTES.md +311 -0
- package/src/plugins/users/UsersManagementPage.test.tsx +58 -0
- package/src/plugins/users/UsersManagementPage.tsx +384 -0
- package/src/plugins/users/UsersStatusWidget.test.tsx +114 -0
- package/src/plugins/users/UsersStatusWidget.tsx +120 -0
- package/src/plugins/users/__tests__/postgres-store.test.ts +1 -0
- package/src/plugins/users/__tests__/users-plugin.test.ts +22 -18
- package/src/plugins/users/stores/postgres-store.ts +95 -17
- package/src/plugins/users/types.ts +33 -1
- package/src/plugins/users/users-plugin.ts +137 -3
- package/ui/src/App.tsx +18 -4
- package/ui/src/api/clientBuilder.ts +206 -0
- package/ui/src/api/controlPanelApi.ts +309 -122
- package/ui/src/api/index.ts +12 -0
- package/ui/src/api/types.ts +276 -0
- package/ui/src/components/ControlPanelApp.tsx +4 -5
- package/ui/src/components/auth/AcceptInvitationPage.tsx +151 -0
- package/ui/src/components/auth/LoginPage.tsx +122 -0
- package/ui/src/components/auth/PasswordResetConfirmPage.tsx +109 -0
- package/ui/src/components/auth/PasswordResetPage.tsx +95 -0
- package/ui/src/components/auth/SignupPage.tsx +140 -0
- package/ui/src/components/auth/VerifyEmailPage.tsx +38 -0
- package/ui/src/components/auth/__tests__/AcceptInvitationPage.test.tsx +201 -0
- package/ui/src/components/auth/__tests__/LoginPage.test.tsx +207 -0
- package/ui/src/components/auth/__tests__/PasswordResetConfirmPage.test.tsx +183 -0
- package/ui/src/components/auth/__tests__/PasswordResetPage.test.tsx +174 -0
- package/ui/src/components/auth/__tests__/SignupPage.test.tsx +210 -0
- package/ui/src/components/auth/__tests__/VerifyEmailPage.test.tsx +53 -0
- package/ui/src/components/auth/index.ts +26 -0
- package/ui/src/components/auth/shared/AuthError.tsx +28 -0
- package/ui/src/components/auth/shared/AuthLayout.tsx +42 -0
- package/ui/src/components/auth/shared/index.ts +9 -0
- package/ui/src/components/index.ts +21 -2
- package/ui/src/components/plugins/PluginConfigPanel.tsx +315 -0
- package/ui/src/components/plugins/PluginManagementPage.tsx +218 -0
- package/ui/src/components/plugins/PluginStatusWidget.tsx +158 -0
- package/ui/src/components/plugins/index.ts +20 -0
- package/ui/src/config/preferences.ts +18 -0
- package/ui/src/dashboard/builtInWidgets.tsx +15 -1
- package/ui/src/dashboard/widgets/CMSMaintenanceWidget.tsx +229 -0
- package/ui/src/dashboard/widgets/CMSStatusWidget.tsx +115 -0
- package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +1 -1
- package/ui/src/dashboard/widgets/index.ts +2 -0
- package/ui/src/hooks/useJobStream.ts +194 -0
- package/ui/src/pages/APIKeysPage.tsx +849 -0
- package/ui/src/pages/AcceptInvitationPage.tsx +169 -0
- package/ui/src/pages/ContentOpsJobsPage.tsx +422 -0
- package/ui/src/pages/MaintenancePage.tsx +27 -0
- package/ui/src/pages/NotificationsPage.tsx +1 -1
- package/ui/src/pages/PluginPage.tsx +3 -1
- package/ui/src/pages/PreferencesPage.tsx +240 -0
- package/ui/src/pages/UsersPage.tsx +225 -2
- package/ui/src/pages/__tests__/PreferencesPage.test.tsx +273 -0
- package/ui/src/pages/index.ts +15 -0
- package/ui/tsconfig.lib.json +4 -2
- package/dist/plugins/auth/adapter-wrapper.test.d.ts +0 -7
- package/dist/plugins/auth/adapter-wrapper.test.d.ts.map +0 -1
- package/dist/plugins/auth/adapter-wrapper.test.js +0 -303
- package/dist/plugins/auth/adapter-wrapper.test.js.map +0 -1
- package/dist/plugins/auth/auth-plugin.test.d.ts +0 -9
- package/dist/plugins/auth/auth-plugin.test.d.ts.map +0 -1
- package/dist/plugins/auth/auth-plugin.test.js +0 -280
- package/dist/plugins/auth/auth-plugin.test.js.map +0 -1
- package/dist/plugins/auth/config-store.test.d.ts +0 -7
- package/dist/plugins/auth/config-store.test.d.ts.map +0 -1
- package/dist/plugins/auth/config-store.test.js +0 -299
- package/dist/plugins/auth/config-store.test.js.map +0 -1
- package/dist/plugins/auth/supertokens-adapter.test.d.ts +0 -10
- package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +0 -1
- package/dist/plugins/auth/supertokens-adapter.test.js +0 -486
- package/dist/plugins/auth/supertokens-adapter.test.js.map +0 -1
- package/dist/plugins/cache-plugin.test.d.ts +0 -8
- package/dist/plugins/cache-plugin.test.d.ts.map +0 -1
- package/dist/plugins/cache-plugin.test.js +0 -255
- package/dist/plugins/cache-plugin.test.js.map +0 -1
- package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +0 -11
- package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +0 -1
- package/dist/plugins/devices/__tests__/devices-plugin.test.js +0 -410
- package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +0 -1
- package/dist/plugins/devices/__tests__/token-utils.test.d.ts +0 -7
- package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +0 -1
- package/dist/plugins/devices/__tests__/token-utils.test.js +0 -199
- package/dist/plugins/devices/__tests__/token-utils.test.js.map +0 -1
- package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +0 -5
- package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +0 -1
- package/dist/plugins/notifications/__tests__/notifications-manager.test.js +0 -470
- package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +0 -1
- package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +0 -12
- package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +0 -1
- package/dist/plugins/parental/__tests__/parental-plugin.test.js +0 -349
- package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +0 -1
- package/dist/plugins/postgres-plugin.test.d.ts +0 -8
- package/dist/plugins/postgres-plugin.test.d.ts.map +0 -1
- package/dist/plugins/postgres-plugin.test.js +0 -186
- package/dist/plugins/postgres-plugin.test.js.map +0 -1
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +0 -7
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +0 -1
- package/dist/plugins/preferences/__tests__/deep-merge.test.js +0 -215
- package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +0 -1
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +0 -7
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +0 -1
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +0 -265
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +0 -1
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +0 -11
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +0 -1
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +0 -243
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +0 -1
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts +0 -7
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts.map +0 -1
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js +0 -220
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js.map +0 -1
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +0 -11
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +0 -1
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +0 -305
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +0 -1
- package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +0 -11
- package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +0 -1
- package/dist/plugins/usage/__tests__/usage-plugin.test.js +0 -218
- package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +0 -1
- package/dist/plugins/users/__tests__/postgres-store.test.d.ts +0 -10
- package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +0 -1
- package/dist/plugins/users/__tests__/postgres-store.test.js +0 -229
- package/dist/plugins/users/__tests__/postgres-store.test.js.map +0 -1
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts +0 -9
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +0 -1
- package/dist/plugins/users/__tests__/users-plugin.test.js +0 -549
- package/dist/plugins/users/__tests__/users-plugin.test.js.map +0 -1
- package/dist-ui/assets/index-BfC7mG5L.js +0 -469
- package/dist-ui/assets/index-BfC7mG5L.js.map +0 -1
- package/dist-ui-lib/components/StatCard.d.ts +0 -16
- package/dist-ui-lib/pages/ConfigPage.d.ts +0 -1
- package/dist-ui-lib/pages/DiagnosticsPage.d.ts +0 -1
- package/dist-ui-lib/pages/IntegrationsPage.d.ts +0 -1
- package/dist-ui-lib/pages/NotificationsPage.d.ts +0 -9
- package/dist-ui-lib/pages/PluginPage.d.ts +0 -15
- package/dist-ui-lib/pages/PluginsPage.d.ts +0 -1
- package/dist-ui-lib/pages/RateLimitPage.d.ts +0 -1
- package/ui/src/components/StatCard.tsx +0 -58
- /package/dist-ui-lib/{config → src/config}/AppConfig.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/DashboardWidgetRegistry.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/DashboardWidgetRenderer.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/PluginWidgetRenderer.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/WidgetComponentRegistry.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/builtInWidgets.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/index.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/AuthStatusWidget.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/IntegrationStatusWidget.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/NotificationsStatsWidget.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/ServiceHealthWidget.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/AuthPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/DashboardPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/EntitlementsPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/LogsPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/NotFoundPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/SystemPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/UsersPage.d.ts +0 -0
- /package/dist-ui-lib/{utils → src/utils}/formatters.d.ts +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bearer Token Authentication Middleware
|
|
3
|
+
*
|
|
4
|
+
* Middleware for authenticating API requests using Bearer tokens (API keys).
|
|
5
|
+
* Verifies the token, checks expiration and active status, and attaches
|
|
6
|
+
* the authenticated key info to the request.
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
import { getApiKeysStore } from '../api-keys-plugin.js';
|
|
11
|
+
import { incrementLimit, isLimited } from '../../rate-limit/rate-limit-service.js';
|
|
12
|
+
/**
|
|
13
|
+
* Extract Bearer token from Authorization header
|
|
14
|
+
*
|
|
15
|
+
* @param req Express request
|
|
16
|
+
* @returns Bearer token or null if not found
|
|
17
|
+
*/
|
|
18
|
+
function extractBearerToken(req) {
|
|
19
|
+
const authHeader = req.headers.authorization;
|
|
20
|
+
if (!authHeader) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
// Check for "Bearer <token>" format
|
|
24
|
+
const parts = authHeader.split(' ');
|
|
25
|
+
if (parts.length !== 2 || parts[0] !== 'Bearer') {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return parts[1];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if API key has all required scopes
|
|
32
|
+
*
|
|
33
|
+
* @param keyScopes Scopes granted to the API key
|
|
34
|
+
* @param requiredScopes Scopes required for the endpoint
|
|
35
|
+
* @returns True if key has all required scopes
|
|
36
|
+
*/
|
|
37
|
+
function hasRequiredScopes(keyScopes, requiredScopes) {
|
|
38
|
+
return requiredScopes.every(required => keyScopes.includes(required));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Default unauthorized handler
|
|
42
|
+
*/
|
|
43
|
+
function defaultUnauthorizedHandler(req, res, reason) {
|
|
44
|
+
res.status(401).json({
|
|
45
|
+
error: 'Unauthorized',
|
|
46
|
+
message: reason,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get rate limit identifier for API key authentication
|
|
51
|
+
* Uses IP address as the identifier
|
|
52
|
+
*/
|
|
53
|
+
function getRateLimitIdentifier(req) {
|
|
54
|
+
const ip = req.ip ||
|
|
55
|
+
req.headers['x-forwarded-for']?.toString().split(',')[0].trim() ||
|
|
56
|
+
req.socket?.remoteAddress ||
|
|
57
|
+
'unknown';
|
|
58
|
+
return `api-key-auth:${ip}`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if rate limit has been exceeded
|
|
62
|
+
* Uses the existing rate-limit plugin with specific limits for API key auth
|
|
63
|
+
*/
|
|
64
|
+
async function checkRateLimit(identifier) {
|
|
65
|
+
try {
|
|
66
|
+
// Check rate limit: 100 requests per 15 minutes
|
|
67
|
+
return await isLimited(identifier, {
|
|
68
|
+
maxRequests: 100,
|
|
69
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
70
|
+
strategy: 'sliding-window',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// If rate limit service not available, allow the request
|
|
75
|
+
// (fail open - let other security measures handle it)
|
|
76
|
+
console.warn('[bearerTokenAuth] Rate limit service unavailable:', error);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Record a failed authentication attempt
|
|
82
|
+
* Increments the rate limit counter
|
|
83
|
+
*/
|
|
84
|
+
async function recordFailedAttempt(identifier) {
|
|
85
|
+
try {
|
|
86
|
+
await incrementLimit(identifier, {
|
|
87
|
+
maxRequests: 100,
|
|
88
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
89
|
+
strategy: 'sliding-window',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
// Non-critical - log and continue
|
|
94
|
+
console.warn('[bearerTokenAuth] Failed to record attempt:', error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Bearer Token Authentication Middleware
|
|
99
|
+
*
|
|
100
|
+
* Validates API keys sent as Bearer tokens in the Authorization header.
|
|
101
|
+
* Attaches authenticated key info to the request for downstream handlers.
|
|
102
|
+
*
|
|
103
|
+
* @param options Configuration options
|
|
104
|
+
* @returns Express middleware function
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* import { bearerTokenAuth } from '@qwickapps/server';
|
|
109
|
+
*
|
|
110
|
+
* // Require authentication
|
|
111
|
+
* app.get('/api/data', bearerTokenAuth(), (req, res) => {
|
|
112
|
+
* const { apiKey } = req as ApiKeyAuthenticatedRequest;
|
|
113
|
+
* res.json({ user_id: apiKey?.user_id });
|
|
114
|
+
* });
|
|
115
|
+
*
|
|
116
|
+
* // Require specific scopes
|
|
117
|
+
* app.post('/api/data', bearerTokenAuth({
|
|
118
|
+
* requiredScopes: ['write'],
|
|
119
|
+
* }), (req, res) => {
|
|
120
|
+
* // Handler code
|
|
121
|
+
* });
|
|
122
|
+
*
|
|
123
|
+
* // Allow only M2M keys
|
|
124
|
+
* app.post('/api/admin', bearerTokenAuth({
|
|
125
|
+
* allowedKeyTypes: ['m2m'],
|
|
126
|
+
* requiredScopes: ['admin'],
|
|
127
|
+
* }), (req, res) => {
|
|
128
|
+
* // Handler code
|
|
129
|
+
* });
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export function bearerTokenAuth(options = {}) {
|
|
133
|
+
const { requiredScopes = [], allowedKeyTypes, onUnauthorized = defaultUnauthorizedHandler, } = options;
|
|
134
|
+
return async (req, res, next) => {
|
|
135
|
+
try {
|
|
136
|
+
// Check rate limit first
|
|
137
|
+
const rateLimitId = getRateLimitIdentifier(req);
|
|
138
|
+
if (await checkRateLimit(rateLimitId)) {
|
|
139
|
+
res.status(429).json({
|
|
140
|
+
error: 'Too Many Requests',
|
|
141
|
+
message: 'Too many authentication attempts. Please try again later.',
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Extract token from Authorization header
|
|
146
|
+
const token = extractBearerToken(req);
|
|
147
|
+
if (!token) {
|
|
148
|
+
recordFailedAttempt(rateLimitId);
|
|
149
|
+
onUnauthorized(req, res, 'Missing or invalid Authorization header');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Get store instance
|
|
153
|
+
const store = getApiKeysStore();
|
|
154
|
+
if (!store) {
|
|
155
|
+
console.error('[bearerTokenAuth] API Keys plugin not initialized');
|
|
156
|
+
res.status(500).json({ error: 'Authentication service unavailable' });
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Verify the token
|
|
160
|
+
const apiKey = await store.verify(token);
|
|
161
|
+
if (!apiKey) {
|
|
162
|
+
recordFailedAttempt(rateLimitId);
|
|
163
|
+
onUnauthorized(req, res, 'Invalid, expired, or inactive API key');
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Check key type if restrictions apply
|
|
167
|
+
if (allowedKeyTypes && !allowedKeyTypes.includes(apiKey.key_type)) {
|
|
168
|
+
onUnauthorized(req, res, `This endpoint requires ${allowedKeyTypes.join(' or ')} keys`);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Check scopes if required
|
|
172
|
+
if (requiredScopes.length > 0 && !hasRequiredScopes(apiKey.scopes, requiredScopes)) {
|
|
173
|
+
onUnauthorized(req, res, `Insufficient scopes. Required: ${requiredScopes.join(', ')}`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// Record usage (non-blocking)
|
|
177
|
+
store.recordUsage(apiKey.id).catch(err => {
|
|
178
|
+
console.error('[bearerTokenAuth] Failed to record key usage:', err);
|
|
179
|
+
});
|
|
180
|
+
// Attach authenticated key info to request
|
|
181
|
+
req.apiKey = {
|
|
182
|
+
id: apiKey.id,
|
|
183
|
+
user_id: apiKey.user_id,
|
|
184
|
+
scopes: apiKey.scopes,
|
|
185
|
+
key_type: apiKey.key_type,
|
|
186
|
+
};
|
|
187
|
+
next();
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
console.error('[bearerTokenAuth] Authentication error:', error);
|
|
191
|
+
res.status(500).json({ error: 'Authentication failed' });
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Helper type guard for API key authenticated requests
|
|
197
|
+
*/
|
|
198
|
+
export function isApiKeyAuthenticated(req) {
|
|
199
|
+
return 'apiKey' in req && req.apiKey !== undefined;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=bearer-token-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bearer-token-auth.js","sourceRoot":"","sources":["../../../../src/plugins/api-keys/middleware/bearer-token-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Keys Middleware Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { bearerTokenAuth, isApiKeyAuthenticated, type ApiKeyAuthenticatedRequest, type BearerTokenAuthOptions, } from './bearer-token-auth.js';
|
|
7
|
+
export { createUsageLoggingMiddleware, } from './usage-logging.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/api-keys/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Keys Middleware Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { bearerTokenAuth, isApiKeyAuthenticated, } from './bearer-token-auth.js';
|
|
7
|
+
export { createUsageLoggingMiddleware, } from './usage-logging.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/api-keys/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,qBAAqB,GAGtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Logging Middleware
|
|
3
|
+
*
|
|
4
|
+
* Logs all API key requests for audit trails and usage analytics.
|
|
5
|
+
* Logging is asynchronous and non-blocking to avoid performance impact.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
import type { RequestHandler } from 'express';
|
|
10
|
+
import type { UsageLogStore } from '../stores/usage-log-store.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create usage logging middleware
|
|
13
|
+
*
|
|
14
|
+
* Logs all requests made with API key authentication to the usage log store.
|
|
15
|
+
* Logging happens asynchronously after the response is sent to avoid latency.
|
|
16
|
+
*
|
|
17
|
+
* @param store Usage log storage backend
|
|
18
|
+
* @returns Express middleware
|
|
19
|
+
*/
|
|
20
|
+
export declare function createUsageLoggingMiddleware(store: UsageLogStore): RequestHandler;
|
|
21
|
+
//# sourceMappingURL=usage-logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-logging.d.ts","sourceRoot":"","sources":["../../../../src/plugins/api-keys/middleware/usage-logging.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAclE;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CA4CjF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Logging Middleware
|
|
3
|
+
*
|
|
4
|
+
* Logs all API key requests for audit trails and usage analytics.
|
|
5
|
+
* Logging is asynchronous and non-blocking to avoid performance impact.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Create usage logging middleware
|
|
11
|
+
*
|
|
12
|
+
* Logs all requests made with API key authentication to the usage log store.
|
|
13
|
+
* Logging happens asynchronously after the response is sent to avoid latency.
|
|
14
|
+
*
|
|
15
|
+
* @param store Usage log storage backend
|
|
16
|
+
* @returns Express middleware
|
|
17
|
+
*/
|
|
18
|
+
export function createUsageLoggingMiddleware(store) {
|
|
19
|
+
return (req, res, next) => {
|
|
20
|
+
const apiKeyReq = req;
|
|
21
|
+
// Skip if not API key authentication
|
|
22
|
+
if (!apiKeyReq.apiKey) {
|
|
23
|
+
return next();
|
|
24
|
+
}
|
|
25
|
+
// Capture request details
|
|
26
|
+
const keyId = apiKeyReq.apiKey.id;
|
|
27
|
+
const endpoint = req.path;
|
|
28
|
+
const method = req.method;
|
|
29
|
+
const ipAddress = (req.ip ||
|
|
30
|
+
req.headers['x-forwarded-for']?.split(',')[0].trim() ||
|
|
31
|
+
req.socket?.remoteAddress);
|
|
32
|
+
const userAgent = req.get('user-agent');
|
|
33
|
+
// Intercept response to capture status code
|
|
34
|
+
const originalSend = res.send;
|
|
35
|
+
res.send = function (data) {
|
|
36
|
+
const statusCode = res.statusCode;
|
|
37
|
+
// Log asynchronously after response is sent (non-blocking)
|
|
38
|
+
setImmediate(() => {
|
|
39
|
+
store.log({
|
|
40
|
+
key_id: keyId,
|
|
41
|
+
endpoint,
|
|
42
|
+
method,
|
|
43
|
+
status_code: statusCode,
|
|
44
|
+
ip_address: ipAddress,
|
|
45
|
+
user_agent: userAgent,
|
|
46
|
+
}).catch((error) => {
|
|
47
|
+
// Log error but don't fail the request
|
|
48
|
+
console.error('[UsageLogging] Failed to log API key usage:', error);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// Call original send
|
|
52
|
+
return originalSend.call(this, data);
|
|
53
|
+
};
|
|
54
|
+
next();
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=usage-logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-logging.js","sourceRoot":"","sources":["../../../../src/plugins/api-keys/middleware/usage-logging.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH;;;;;;;;GAQG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAoB;IAC/D,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,MAAM,SAAS,GAAG,GAAoB,CAAC;QAEvC,qCAAqC;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC1B,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE;YACtB,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAChE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAuB,CAAC;QACnD,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAExC,4CAA4C;QAC5C,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;QAC9B,GAAG,CAAC,IAAI,GAAG,UAAU,IAAc;YACjC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;YAElC,2DAA2D;YAC3D,YAAY,CAAC,GAAG,EAAE;gBAChB,KAAK,CAAC,GAAG,CAAC;oBACR,MAAM,EAAE,KAAK;oBACb,QAAQ;oBACR,MAAM;oBACN,WAAW,EAAE,UAAU;oBACvB,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,SAAS;iBACtB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;oBACxB,uCAAuC;oBACvC,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,qBAAqB;YACrB,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Keys Stores Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { postgresApiKeyStore } from './postgres-store.js';
|
|
7
|
+
export { createPostgresPluginScopeStore, type PluginScope, type PluginScopeStore, type PostgresPluginScopeStoreConfig, } from './plugin-scope-store.js';
|
|
8
|
+
export { createPostgresUsageLogStore, type UsageLogEntry, type UsageLogQueryOptions, type UsageLogStats, type UsageLogStore, type PostgresUsageLogStoreConfig, } from './usage-log-store.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/api-keys/stores/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,8BAA8B,EAC9B,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,8BAA8B,GACpC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,2BAA2B,EAC3B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,2BAA2B,GACjC,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Keys Stores Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { postgresApiKeyStore } from './postgres-store.js';
|
|
7
|
+
export { createPostgresPluginScopeStore, } from './plugin-scope-store.js';
|
|
8
|
+
export { createPostgresUsageLogStore, } from './usage-log-store.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/api-keys/stores/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,8BAA8B,GAI/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,2BAA2B,GAM5B,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Scope Store - PostgreSQL Implementation
|
|
3
|
+
*
|
|
4
|
+
* Manages plugin-declared scopes for fine-grained API key authorization.
|
|
5
|
+
* Plugins register their scopes during initialization, which are then available
|
|
6
|
+
* for selection during API key creation.
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
import type { Pool } from 'pg';
|
|
11
|
+
/**
|
|
12
|
+
* Plugin scope definition
|
|
13
|
+
*/
|
|
14
|
+
export interface PluginScope {
|
|
15
|
+
/** Scope name in format 'plugin-id:action' (e.g., 'qwickbrain:execute') */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Plugin ID that declares this scope */
|
|
18
|
+
plugin_id: string;
|
|
19
|
+
/** Human-readable description for UI */
|
|
20
|
+
description: string;
|
|
21
|
+
/** Optional category for grouping (read, write, admin) */
|
|
22
|
+
category?: 'read' | 'write' | 'admin';
|
|
23
|
+
/** When scope was registered */
|
|
24
|
+
created_at?: Date;
|
|
25
|
+
/** When scope was last updated */
|
|
26
|
+
updated_at?: Date;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Plugin scope store interface
|
|
30
|
+
*/
|
|
31
|
+
export interface PluginScopeStore {
|
|
32
|
+
/** Store name */
|
|
33
|
+
name: string;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the store (create tables, indexes, etc.)
|
|
36
|
+
*/
|
|
37
|
+
initialize(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Register scopes for a plugin (upsert operation)
|
|
40
|
+
* Existing scopes are updated, new scopes are inserted, removed scopes are deleted
|
|
41
|
+
*/
|
|
42
|
+
registerScopes(pluginId: string, scopes: Omit<PluginScope, 'plugin_id' | 'created_at' | 'updated_at'>[]): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Get all scopes for a specific plugin
|
|
45
|
+
*/
|
|
46
|
+
getPluginScopes(pluginId: string): Promise<PluginScope[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get all available scopes across all plugins
|
|
49
|
+
*/
|
|
50
|
+
getAllScopes(): Promise<PluginScope[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Verify a scope exists
|
|
53
|
+
*/
|
|
54
|
+
isValidScope(scopeName: string): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Delete all scopes for a plugin
|
|
57
|
+
*/
|
|
58
|
+
deletePluginScopes(pluginId: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Shutdown the store
|
|
61
|
+
*/
|
|
62
|
+
shutdown(): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* PostgreSQL plugin scope store configuration
|
|
66
|
+
*/
|
|
67
|
+
export interface PostgresPluginScopeStoreConfig {
|
|
68
|
+
/** PostgreSQL pool instance or a function that returns one (for lazy initialization) */
|
|
69
|
+
pool: Pool | (() => Pool);
|
|
70
|
+
/** Table name (default: 'plugin_scopes') */
|
|
71
|
+
tableName?: string;
|
|
72
|
+
/** Schema name (default: 'public') */
|
|
73
|
+
schema?: string;
|
|
74
|
+
/** Auto-create tables on init (default: true) */
|
|
75
|
+
autoCreateTables?: boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* PostgreSQL implementation of PluginScopeStore
|
|
79
|
+
*/
|
|
80
|
+
export declare function createPostgresPluginScopeStore(config: PostgresPluginScopeStoreConfig): PluginScopeStore;
|
|
81
|
+
//# sourceMappingURL=plugin-scope-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-scope-store.d.ts","sourceRoot":"","sources":["../../../../src/plugins/api-keys/stores/plugin-scope-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACtC,gCAAgC;IAChC,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,kCAAkC;IAClC,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExH;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE1D;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElD;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,wFAAwF;IACxF,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,8BAA8B,GACrC,gBAAgB,CA0LlB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Scope Store - PostgreSQL Implementation
|
|
3
|
+
*
|
|
4
|
+
* Manages plugin-declared scopes for fine-grained API key authorization.
|
|
5
|
+
* Plugins register their scopes during initialization, which are then available
|
|
6
|
+
* for selection during API key creation.
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* PostgreSQL implementation of PluginScopeStore
|
|
12
|
+
*/
|
|
13
|
+
export function createPostgresPluginScopeStore(config) {
|
|
14
|
+
const tableName = config.tableName || 'plugin_scopes';
|
|
15
|
+
const schema = config.schema || 'public';
|
|
16
|
+
const tableFullName = `"${schema}"."${tableName}"`;
|
|
17
|
+
const autoCreateTables = config.autoCreateTables !== false;
|
|
18
|
+
// In-memory cache for fast validation
|
|
19
|
+
const scopeCache = new Set();
|
|
20
|
+
let cacheInitialized = false;
|
|
21
|
+
/**
|
|
22
|
+
* Get PostgreSQL pool (lazy initialization support)
|
|
23
|
+
*/
|
|
24
|
+
function getPool() {
|
|
25
|
+
if (typeof config.pool === 'function') {
|
|
26
|
+
return config.pool();
|
|
27
|
+
}
|
|
28
|
+
return config.pool;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize scope cache
|
|
32
|
+
*/
|
|
33
|
+
async function initializeCache() {
|
|
34
|
+
if (cacheInitialized)
|
|
35
|
+
return;
|
|
36
|
+
const pool = getPool();
|
|
37
|
+
const result = await pool.query(`SELECT name FROM ${tableFullName}`);
|
|
38
|
+
scopeCache.clear();
|
|
39
|
+
result.rows.forEach(row => scopeCache.add(row.name));
|
|
40
|
+
cacheInitialized = true;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Refresh cache after modifications
|
|
44
|
+
*/
|
|
45
|
+
async function refreshCache() {
|
|
46
|
+
cacheInitialized = false;
|
|
47
|
+
await initializeCache();
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
name: 'postgres',
|
|
51
|
+
async initialize() {
|
|
52
|
+
if (!autoCreateTables)
|
|
53
|
+
return;
|
|
54
|
+
const pool = getPool();
|
|
55
|
+
// Create plugin_scopes table
|
|
56
|
+
await pool.query(`
|
|
57
|
+
CREATE TABLE IF NOT EXISTS ${tableFullName} (
|
|
58
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
59
|
+
plugin_id VARCHAR(255) NOT NULL,
|
|
60
|
+
name VARCHAR(255) NOT NULL UNIQUE,
|
|
61
|
+
description TEXT NOT NULL,
|
|
62
|
+
category VARCHAR(50),
|
|
63
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
64
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
65
|
+
|
|
66
|
+
-- Enforce naming convention: plugin-id:action
|
|
67
|
+
CONSTRAINT scope_name_format CHECK (name ~ '^[a-z0-9-]+:[a-z0-9-]+$')
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
-- Indexes for performance
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_plugin_id ON ${tableFullName}(plugin_id);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_category ON ${tableFullName}(category);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_name ON ${tableFullName}(name);
|
|
74
|
+
`);
|
|
75
|
+
// Insert system scopes for backwards compatibility
|
|
76
|
+
await pool.query(`
|
|
77
|
+
INSERT INTO ${tableFullName} (plugin_id, name, description, category)
|
|
78
|
+
VALUES
|
|
79
|
+
('system', 'system:read', 'Read access to system resources', 'read'),
|
|
80
|
+
('system', 'system:write', 'Write access to system resources', 'write'),
|
|
81
|
+
('system', 'system:admin', 'Administrative access to system resources', 'admin')
|
|
82
|
+
ON CONFLICT (name) DO NOTHING;
|
|
83
|
+
`);
|
|
84
|
+
// Initialize cache
|
|
85
|
+
await initializeCache();
|
|
86
|
+
},
|
|
87
|
+
async registerScopes(pluginId, scopes) {
|
|
88
|
+
const pool = getPool();
|
|
89
|
+
// Start transaction for atomic upsert
|
|
90
|
+
const client = await pool.connect();
|
|
91
|
+
try {
|
|
92
|
+
await client.query('BEGIN');
|
|
93
|
+
// Get existing scopes for this plugin
|
|
94
|
+
const existingResult = await client.query(`SELECT name FROM ${tableFullName} WHERE plugin_id = $1`, [pluginId]);
|
|
95
|
+
const existingScopes = new Set(existingResult.rows.map(r => r.name));
|
|
96
|
+
const newScopes = new Set(scopes.map(s => s.name));
|
|
97
|
+
// Delete scopes that are no longer declared
|
|
98
|
+
const scopesToDelete = [...existingScopes].filter(name => !newScopes.has(name));
|
|
99
|
+
if (scopesToDelete.length > 0) {
|
|
100
|
+
await client.query(`DELETE FROM ${tableFullName} WHERE plugin_id = $1 AND name = ANY($2)`, [pluginId, scopesToDelete]);
|
|
101
|
+
}
|
|
102
|
+
// Upsert scopes (insert new, update existing)
|
|
103
|
+
for (const scope of scopes) {
|
|
104
|
+
await client.query(`INSERT INTO ${tableFullName} (plugin_id, name, description, category)
|
|
105
|
+
VALUES ($1, $2, $3, $4)
|
|
106
|
+
ON CONFLICT (name) DO UPDATE SET
|
|
107
|
+
description = EXCLUDED.description,
|
|
108
|
+
category = EXCLUDED.category,
|
|
109
|
+
updated_at = NOW()`, [pluginId, scope.name, scope.description, scope.category || null]);
|
|
110
|
+
}
|
|
111
|
+
await client.query('COMMIT');
|
|
112
|
+
// Refresh cache
|
|
113
|
+
await refreshCache();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
await client.query('ROLLBACK');
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
client.release();
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
async getPluginScopes(pluginId) {
|
|
124
|
+
const pool = getPool();
|
|
125
|
+
const result = await pool.query(`SELECT plugin_id, name, description, category, created_at, updated_at
|
|
126
|
+
FROM ${tableFullName}
|
|
127
|
+
WHERE plugin_id = $1
|
|
128
|
+
ORDER BY name`, [pluginId]);
|
|
129
|
+
return result.rows;
|
|
130
|
+
},
|
|
131
|
+
async getAllScopes() {
|
|
132
|
+
const pool = getPool();
|
|
133
|
+
const result = await pool.query(`SELECT plugin_id, name, description, category, created_at, updated_at
|
|
134
|
+
FROM ${tableFullName}
|
|
135
|
+
ORDER BY plugin_id, name`);
|
|
136
|
+
return result.rows;
|
|
137
|
+
},
|
|
138
|
+
async isValidScope(scopeName) {
|
|
139
|
+
// Use cache for fast validation
|
|
140
|
+
await initializeCache();
|
|
141
|
+
return scopeCache.has(scopeName);
|
|
142
|
+
},
|
|
143
|
+
async deletePluginScopes(pluginId) {
|
|
144
|
+
const pool = getPool();
|
|
145
|
+
await pool.query(`DELETE FROM ${tableFullName} WHERE plugin_id = $1`, [pluginId]);
|
|
146
|
+
// Refresh cache
|
|
147
|
+
await refreshCache();
|
|
148
|
+
},
|
|
149
|
+
async shutdown() {
|
|
150
|
+
scopeCache.clear();
|
|
151
|
+
cacheInitialized = false;
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=plugin-scope-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-scope-store.js","sourceRoot":"","sources":["../../../../src/plugins/api-keys/stores/plugin-scope-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL API Keys Store
|
|
3
|
+
*
|
|
4
|
+
* API key storage implementation using PostgreSQL with Row-Level Security (RLS).
|
|
5
|
+
* Uses SHA-256 for token hashing (high-entropy keys don't need bcrypt's slowness).
|
|
6
|
+
*
|
|
7
|
+
* RLS Context Pattern:
|
|
8
|
+
* Each operation uses an explicit transaction and sets `app.current_user_id`
|
|
9
|
+
* as a transaction-local configuration variable. The RLS policy checks this
|
|
10
|
+
* variable to enforce that users can only access their own API keys.
|
|
11
|
+
*
|
|
12
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
13
|
+
*/
|
|
14
|
+
import type { ApiKeyStore, PostgresApiKeyStoreConfig } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Create a PostgreSQL API keys store with RLS
|
|
17
|
+
*
|
|
18
|
+
* @param config Configuration including a pg Pool instance
|
|
19
|
+
* @returns ApiKeyStore implementation
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { Pool } from 'pg';
|
|
24
|
+
* import { postgresApiKeyStore } from '@qwickapps/server';
|
|
25
|
+
*
|
|
26
|
+
* const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
27
|
+
* const store = postgresApiKeyStore({ pool });
|
|
28
|
+
*
|
|
29
|
+
* // Or with lazy initialization:
|
|
30
|
+
* const store = postgresApiKeyStore({ pool: () => getPostgres().getPool() });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function postgresApiKeyStore(config: PostgresApiKeyStoreConfig): ApiKeyStore;
|
|
34
|
+
//# sourceMappingURL=postgres-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../../../src/plugins/api-keys/stores/postgres-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EAK1B,MAAM,aAAa,CAAC;AAuKrB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,WAAW,CAsRlF"}
|