@archlast/server 0.0.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/LICENSE +21 -0
- package/README.md +32 -0
- package/dist/admin/auth.d.ts +79 -0
- package/dist/admin/auth.d.ts.map +1 -0
- package/dist/admin/auth.js +487 -0
- package/dist/admin/auth.js.map +1 -0
- package/dist/admin/schema.d.ts +240 -0
- package/dist/admin/schema.d.ts.map +1 -0
- package/dist/admin/schema.js +521 -0
- package/dist/admin/schema.js.map +1 -0
- package/dist/admin/seed.d.ts +9 -0
- package/dist/admin/seed.d.ts.map +1 -0
- package/dist/admin/seed.js +276 -0
- package/dist/admin/seed.js.map +1 -0
- package/dist/auth/api-key-resolver.d.ts +12 -0
- package/dist/auth/api-key-resolver.d.ts.map +1 -0
- package/dist/auth/api-key-resolver.js +24 -0
- package/dist/auth/api-key-resolver.js.map +1 -0
- package/dist/auth/archlast-auth-adapter.d.ts +22 -0
- package/dist/auth/archlast-auth-adapter.d.ts.map +1 -0
- package/dist/auth/archlast-auth-adapter.js +32 -0
- package/dist/auth/archlast-auth-adapter.js.map +1 -0
- package/dist/auth/audit.d.ts +65 -0
- package/dist/auth/audit.d.ts.map +1 -0
- package/dist/auth/audit.js +138 -0
- package/dist/auth/audit.js.map +1 -0
- package/dist/auth/better-auth-adapter.d.ts +35 -0
- package/dist/auth/better-auth-adapter.d.ts.map +1 -0
- package/dist/auth/better-auth-adapter.js +460 -0
- package/dist/auth/better-auth-adapter.js.map +1 -0
- package/dist/auth/better-auth-admin.d.ts +40 -0
- package/dist/auth/better-auth-admin.d.ts.map +1 -0
- package/dist/auth/better-auth-admin.js +80 -0
- package/dist/auth/better-auth-admin.js.map +1 -0
- package/dist/auth/better-auth-api-key-resolver.d.ts +39 -0
- package/dist/auth/better-auth-api-key-resolver.d.ts.map +1 -0
- package/dist/auth/better-auth-api-key-resolver.js +184 -0
- package/dist/auth/better-auth-api-key-resolver.js.map +1 -0
- package/dist/auth/better-auth-instance.d.ts +2464 -0
- package/dist/auth/better-auth-instance.d.ts.map +1 -0
- package/dist/auth/better-auth-instance.js +251 -0
- package/dist/auth/better-auth-instance.js.map +1 -0
- package/dist/auth/better-auth-seed.d.ts +23 -0
- package/dist/auth/better-auth-seed.d.ts.map +1 -0
- package/dist/auth/better-auth-seed.js +316 -0
- package/dist/auth/better-auth-seed.js.map +1 -0
- package/dist/auth/better-auth-session-adapter.d.ts +49 -0
- package/dist/auth/better-auth-session-adapter.d.ts.map +1 -0
- package/dist/auth/better-auth-session-adapter.js +254 -0
- package/dist/auth/better-auth-session-adapter.js.map +1 -0
- package/dist/auth/errors.d.ts +18 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +27 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/http/handlers.d.ts +17 -0
- package/dist/auth/http/handlers.d.ts.map +1 -0
- package/dist/auth/http/handlers.js +19 -0
- package/dist/auth/http/handlers.js.map +1 -0
- package/dist/auth/interfaces.d.ts +138 -0
- package/dist/auth/interfaces.d.ts.map +1 -0
- package/dist/auth/interfaces.js +105 -0
- package/dist/auth/interfaces.js.map +1 -0
- package/dist/auth/mfa/index.d.ts +6 -0
- package/dist/auth/mfa/index.d.ts.map +1 -0
- package/dist/auth/mfa/index.js +13 -0
- package/dist/auth/mfa/index.js.map +1 -0
- package/dist/auth/mfa/schema.d.ts +32 -0
- package/dist/auth/mfa/schema.d.ts.map +1 -0
- package/dist/auth/mfa/schema.js +35 -0
- package/dist/auth/mfa/schema.js.map +1 -0
- package/dist/auth/mfa/service.d.ts +65 -0
- package/dist/auth/mfa/service.d.ts.map +1 -0
- package/dist/auth/mfa/service.js +255 -0
- package/dist/auth/mfa/service.js.map +1 -0
- package/dist/auth/oauth-proxy.d.ts +58 -0
- package/dist/auth/oauth-proxy.d.ts.map +1 -0
- package/dist/auth/oauth-proxy.js +298 -0
- package/dist/auth/oauth-proxy.js.map +1 -0
- package/dist/auth/otp/index.d.ts +6 -0
- package/dist/auth/otp/index.d.ts.map +1 -0
- package/dist/auth/otp/index.js +13 -0
- package/dist/auth/otp/index.js.map +1 -0
- package/dist/auth/otp/schema.d.ts +32 -0
- package/dist/auth/otp/schema.d.ts.map +1 -0
- package/dist/auth/otp/schema.js +38 -0
- package/dist/auth/otp/schema.js.map +1 -0
- package/dist/auth/otp/service.d.ts +59 -0
- package/dist/auth/otp/service.d.ts.map +1 -0
- package/dist/auth/otp/service.js +183 -0
- package/dist/auth/otp/service.js.map +1 -0
- package/dist/auth/password-recovery.d.ts +61 -0
- package/dist/auth/password-recovery.d.ts.map +1 -0
- package/dist/auth/password-recovery.js +173 -0
- package/dist/auth/password-recovery.js.map +1 -0
- package/dist/auth/resolver.d.ts +29 -0
- package/dist/auth/resolver.d.ts.map +1 -0
- package/dist/auth/resolver.js +78 -0
- package/dist/auth/resolver.js.map +1 -0
- package/dist/auth/role-helpers.d.ts +56 -0
- package/dist/auth/role-helpers.d.ts.map +1 -0
- package/dist/auth/role-helpers.js +103 -0
- package/dist/auth/role-helpers.js.map +1 -0
- package/dist/auth/session-manager.d.ts +21 -0
- package/dist/auth/session-manager.d.ts.map +1 -0
- package/dist/auth/session-manager.js +30 -0
- package/dist/auth/session-manager.js.map +1 -0
- package/dist/auth/session-security.d.ts +14 -0
- package/dist/auth/session-security.d.ts.map +1 -0
- package/dist/auth/session-security.js +26 -0
- package/dist/auth/session-security.js.map +1 -0
- package/dist/auth/system/better-auth-schema.d.ts +144 -0
- package/dist/auth/system/better-auth-schema.d.ts.map +1 -0
- package/dist/auth/system/better-auth-schema.js +250 -0
- package/dist/auth/system/better-auth-schema.js.map +1 -0
- package/dist/auth/system/constants.d.ts +114 -0
- package/dist/auth/system/constants.d.ts.map +1 -0
- package/dist/auth/system/constants.js +205 -0
- package/dist/auth/system/constants.js.map +1 -0
- package/dist/auth/system/cookies.d.ts +83 -0
- package/dist/auth/system/cookies.d.ts.map +1 -0
- package/dist/auth/system/cookies.js +148 -0
- package/dist/auth/system/cookies.js.map +1 -0
- package/dist/auth/system/crypto.d.ts +53 -0
- package/dist/auth/system/crypto.d.ts.map +1 -0
- package/dist/auth/system/crypto.js +188 -0
- package/dist/auth/system/crypto.js.map +1 -0
- package/dist/auth/system/extended-schema.d.ts +145 -0
- package/dist/auth/system/extended-schema.d.ts.map +1 -0
- package/dist/auth/system/extended-schema.js +86 -0
- package/dist/auth/system/extended-schema.js.map +1 -0
- package/dist/auth/system/schema.d.ts +538 -0
- package/dist/auth/system/schema.d.ts.map +1 -0
- package/dist/auth/system/schema.js +306 -0
- package/dist/auth/system/schema.js.map +1 -0
- package/dist/cache/client.d.ts +77 -0
- package/dist/cache/client.d.ts.map +1 -0
- package/dist/cache/client.js +279 -0
- package/dist/cache/client.js.map +1 -0
- package/dist/cache/index.d.ts +9 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +14 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/layers.d.ts +125 -0
- package/dist/cache/layers.d.ts.map +1 -0
- package/dist/cache/layers.js +354 -0
- package/dist/cache/layers.js.map +1 -0
- package/dist/cache/manager.d.ts +101 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/manager.js +423 -0
- package/dist/cache/manager.js.map +1 -0
- package/dist/cache/protocol.d.ts +115 -0
- package/dist/cache/protocol.d.ts.map +1 -0
- package/dist/cache/protocol.js +36 -0
- package/dist/cache/protocol.js.map +1 -0
- package/dist/cache/run-sidecar.d.ts +8 -0
- package/dist/cache/run-sidecar.d.ts.map +1 -0
- package/dist/cache/run-sidecar.js +71 -0
- package/dist/cache/run-sidecar.js.map +1 -0
- package/dist/cache/sidecar-client.d.ts +90 -0
- package/dist/cache/sidecar-client.d.ts.map +1 -0
- package/dist/cache/sidecar-client.js +437 -0
- package/dist/cache/sidecar-client.js.map +1 -0
- package/dist/cache/sidecar-server.d.ts +18 -0
- package/dist/cache/sidecar-server.d.ts.map +1 -0
- package/dist/cache/sidecar-server.js +90 -0
- package/dist/cache/sidecar-server.js.map +1 -0
- package/dist/cache/store.d.ts +90 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +357 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/strategies.d.ts +52 -0
- package/dist/cache/strategies.d.ts.map +1 -0
- package/dist/cache/strategies.js +13 -0
- package/dist/cache/strategies.js.map +1 -0
- package/dist/cache/utils.d.ts +16 -0
- package/dist/cache/utils.d.ts.map +1 -0
- package/dist/cache/utils.js +101 -0
- package/dist/cache/utils.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +20 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/paths.d.ts +16 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +29 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +42 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +62 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/service.d.ts +56 -0
- package/dist/config/service.d.ts.map +1 -0
- package/dist/config/service.js +108 -0
- package/dist/config/service.js.map +1 -0
- package/dist/context.d.ts +48 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +6 -0
- package/dist/context.js.map +1 -0
- package/dist/controllers/admin/admin-tokens.controller.d.ts +159 -0
- package/dist/controllers/admin/admin-tokens.controller.d.ts.map +1 -0
- package/dist/controllers/admin/admin-tokens.controller.js +138 -0
- package/dist/controllers/admin/admin-tokens.controller.js.map +1 -0
- package/dist/controllers/admin/api-keys.controller.d.ts +187 -0
- package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -0
- package/dist/controllers/admin/api-keys.controller.js +124 -0
- package/dist/controllers/admin/api-keys.controller.js.map +1 -0
- package/dist/controllers/admin/app-users.controller.d.ts +376 -0
- package/dist/controllers/admin/app-users.controller.d.ts.map +1 -0
- package/dist/controllers/admin/app-users.controller.js +348 -0
- package/dist/controllers/admin/app-users.controller.js.map +1 -0
- package/dist/controllers/admin/auth.controller.d.ts +285 -0
- package/dist/controllers/admin/auth.controller.d.ts.map +1 -0
- package/dist/controllers/admin/auth.controller.js +221 -0
- package/dist/controllers/admin/auth.controller.js.map +1 -0
- package/dist/controllers/admin/backup.controller.d.ts +250 -0
- package/dist/controllers/admin/backup.controller.d.ts.map +1 -0
- package/dist/controllers/admin/backup.controller.js +316 -0
- package/dist/controllers/admin/backup.controller.js.map +1 -0
- package/dist/controllers/admin/data.controller.d.ts +250 -0
- package/dist/controllers/admin/data.controller.d.ts.map +1 -0
- package/dist/controllers/admin/data.controller.js +240 -0
- package/dist/controllers/admin/data.controller.js.map +1 -0
- package/dist/controllers/admin/provisioning.controller.d.ts +77 -0
- package/dist/controllers/admin/provisioning.controller.d.ts.map +1 -0
- package/dist/controllers/admin/provisioning.controller.js +141 -0
- package/dist/controllers/admin/provisioning.controller.js.map +1 -0
- package/dist/controllers/admin/settings.controller.d.ts +153 -0
- package/dist/controllers/admin/settings.controller.d.ts.map +1 -0
- package/dist/controllers/admin/settings.controller.js +120 -0
- package/dist/controllers/admin/settings.controller.js.map +1 -0
- package/dist/controllers/admin/setup.controller.d.ts +104 -0
- package/dist/controllers/admin/setup.controller.d.ts.map +1 -0
- package/dist/controllers/admin/setup.controller.js +113 -0
- package/dist/controllers/admin/setup.controller.js.map +1 -0
- package/dist/controllers/admin/tenants.controller.d.ts +275 -0
- package/dist/controllers/admin/tenants.controller.d.ts.map +1 -0
- package/dist/controllers/admin/tenants.controller.js +206 -0
- package/dist/controllers/admin/tenants.controller.js.map +1 -0
- package/dist/controllers/admin/users.controller.d.ts +253 -0
- package/dist/controllers/admin/users.controller.d.ts.map +1 -0
- package/dist/controllers/admin/users.controller.js +186 -0
- package/dist/controllers/admin/users.controller.js.map +1 -0
- package/dist/controllers/auth.controller.d.ts +308 -0
- package/dist/controllers/auth.controller.d.ts.map +1 -0
- package/dist/controllers/auth.controller.js +305 -0
- package/dist/controllers/auth.controller.js.map +1 -0
- package/dist/controllers/crud-generator.controller.d.ts +83 -0
- package/dist/controllers/crud-generator.controller.d.ts.map +1 -0
- package/dist/controllers/crud-generator.controller.js +201 -0
- package/dist/controllers/crud-generator.controller.js.map +1 -0
- package/dist/controllers/deployment-events.controller.d.ts +74 -0
- package/dist/controllers/deployment-events.controller.d.ts.map +1 -0
- package/dist/controllers/deployment-events.controller.js +143 -0
- package/dist/controllers/deployment-events.controller.js.map +1 -0
- package/dist/controllers/index.d.ts +18 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +42 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/introspection.controller.d.ts +430 -0
- package/dist/controllers/introspection.controller.d.ts.map +1 -0
- package/dist/controllers/introspection.controller.js +358 -0
- package/dist/controllers/introspection.controller.js.map +1 -0
- package/dist/controllers/invite.controller.d.ts +218 -0
- package/dist/controllers/invite.controller.d.ts.map +1 -0
- package/dist/controllers/invite.controller.js +218 -0
- package/dist/controllers/invite.controller.js.map +1 -0
- package/dist/controllers/mfa.controller.d.ts +211 -0
- package/dist/controllers/mfa.controller.d.ts.map +1 -0
- package/dist/controllers/mfa.controller.js +155 -0
- package/dist/controllers/mfa.controller.js.map +1 -0
- package/dist/controllers/otp.controller.d.ts +220 -0
- package/dist/controllers/otp.controller.d.ts.map +1 -0
- package/dist/controllers/otp.controller.js +223 -0
- package/dist/controllers/otp.controller.js.map +1 -0
- package/dist/controllers/storage.controller.d.ts +297 -0
- package/dist/controllers/storage.controller.d.ts.map +1 -0
- package/dist/controllers/storage.controller.js +304 -0
- package/dist/controllers/storage.controller.js.map +1 -0
- package/dist/controllers/system.controller.d.ts +176 -0
- package/dist/controllers/system.controller.d.ts.map +1 -0
- package/dist/controllers/system.controller.js +222 -0
- package/dist/controllers/system.controller.js.map +1 -0
- package/dist/controllers/tenant.controller.d.ts +316 -0
- package/dist/controllers/tenant.controller.d.ts.map +1 -0
- package/dist/controllers/tenant.controller.js +269 -0
- package/dist/controllers/tenant.controller.js.map +1 -0
- package/dist/db/cachedclient.d.ts +69 -0
- package/dist/db/cachedclient.d.ts.map +1 -0
- package/dist/db/cachedclient.js +331 -0
- package/dist/db/cachedclient.js.map +1 -0
- package/dist/db/distributed-client.d.ts +82 -0
- package/dist/db/distributed-client.d.ts.map +1 -0
- package/dist/db/distributed-client.js +477 -0
- package/dist/db/distributed-client.js.map +1 -0
- package/dist/db/factory.d.ts +19 -0
- package/dist/db/factory.d.ts.map +1 -0
- package/dist/db/factory.js +44 -0
- package/dist/db/factory.js.map +1 -0
- package/dist/db/interfaces.d.ts +67 -0
- package/dist/db/interfaces.d.ts.map +1 -0
- package/dist/db/interfaces.js +3 -0
- package/dist/db/interfaces.js.map +1 -0
- package/dist/db/socket-client.d.ts +122 -0
- package/dist/db/socket-client.d.ts.map +1 -0
- package/dist/db/socket-client.js +1092 -0
- package/dist/db/socket-client.js.map +1 -0
- package/dist/db/store-config.d.ts +19 -0
- package/dist/db/store-config.d.ts.map +1 -0
- package/dist/db/store-config.js +65 -0
- package/dist/db/store-config.js.map +1 -0
- package/dist/deployment/function-extractor.d.ts +11 -0
- package/dist/deployment/function-extractor.d.ts.map +1 -0
- package/dist/deployment/function-extractor.js +101 -0
- package/dist/deployment/function-extractor.js.map +1 -0
- package/dist/deployment/handler.d.ts +174 -0
- package/dist/deployment/handler.d.ts.map +1 -0
- package/dist/deployment/handler.js +1437 -0
- package/dist/deployment/handler.js.map +1 -0
- package/dist/deployment/persistence.d.ts +97 -0
- package/dist/deployment/persistence.d.ts.map +1 -0
- package/dist/deployment/persistence.js +238 -0
- package/dist/deployment/persistence.js.map +1 -0
- package/dist/deployment/protocol.d.ts +34 -0
- package/dist/deployment/protocol.d.ts.map +1 -0
- package/dist/deployment/protocol.js +7 -0
- package/dist/deployment/protocol.js.map +1 -0
- package/dist/di/container.d.ts +58 -0
- package/dist/di/container.d.ts.map +1 -0
- package/dist/di/container.js +121 -0
- package/dist/di/container.js.map +1 -0
- package/dist/di/decorators.d.ts +57 -0
- package/dist/di/decorators.d.ts.map +1 -0
- package/dist/di/decorators.js +80 -0
- package/dist/di/decorators.js.map +1 -0
- package/dist/di/index.d.ts +10 -0
- package/dist/di/index.d.ts.map +1 -0
- package/dist/di/index.js +21 -0
- package/dist/di/index.js.map +1 -0
- package/dist/di/resolver.d.ts +26 -0
- package/dist/di/resolver.d.ts.map +1 -0
- package/dist/di/resolver.js +32 -0
- package/dist/di/resolver.js.map +1 -0
- package/dist/docker/compose.d.ts +3 -0
- package/dist/docker/compose.d.ts.map +1 -0
- package/dist/docker/compose.js +106 -0
- package/dist/docker/compose.js.map +1 -0
- package/dist/docker/index.d.ts +4 -0
- package/dist/docker/index.d.ts.map +1 -0
- package/dist/docker/index.js +8 -0
- package/dist/docker/index.js.map +1 -0
- package/dist/docker/manager.d.ts +14 -0
- package/dist/docker/manager.d.ts.map +1 -0
- package/dist/docker/manager.js +76 -0
- package/dist/docker/manager.js.map +1 -0
- package/dist/docker/types.d.ts +18 -0
- package/dist/docker/types.d.ts.map +1 -0
- package/dist/docker/types.js +3 -0
- package/dist/docker/types.js.map +1 -0
- package/dist/email/index.d.ts +6 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +25 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/service.d.ts +89 -0
- package/dist/email/service.d.ts.map +1 -0
- package/dist/email/service.js +215 -0
- package/dist/email/service.js.map +1 -0
- package/dist/email/templates/MagicLinkEmail.d.ts +8 -0
- package/dist/email/templates/MagicLinkEmail.d.ts.map +1 -0
- package/dist/email/templates/MagicLinkEmail.js +84 -0
- package/dist/email/templates/MagicLinkEmail.js.map +1 -0
- package/dist/email/templates/OtpEmail.d.ts +8 -0
- package/dist/email/templates/OtpEmail.d.ts.map +1 -0
- package/dist/email/templates/OtpEmail.js +72 -0
- package/dist/email/templates/OtpEmail.js.map +1 -0
- package/dist/email/templates/PasswordResetEmail.d.ts +9 -0
- package/dist/email/templates/PasswordResetEmail.d.ts.map +1 -0
- package/dist/email/templates/PasswordResetEmail.js +103 -0
- package/dist/email/templates/PasswordResetEmail.js.map +1 -0
- package/dist/email/templates/WelcomeEmail.d.ts +8 -0
- package/dist/email/templates/WelcomeEmail.d.ts.map +1 -0
- package/dist/email/templates/WelcomeEmail.js +94 -0
- package/dist/email/templates/WelcomeEmail.js.map +1 -0
- package/dist/email/templates/index.d.ts +9 -0
- package/dist/email/templates/index.d.ts.map +1 -0
- package/dist/email/templates/index.js +16 -0
- package/dist/email/templates/index.js.map +1 -0
- package/dist/engine/context.d.ts +9 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +9 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/runner.d.ts +115 -0
- package/dist/engine/runner.d.ts.map +1 -0
- package/dist/engine/runner.js +617 -0
- package/dist/engine/runner.js.map +1 -0
- package/dist/functions/built-in/auth-apikey.d.ts +21 -0
- package/dist/functions/built-in/auth-apikey.d.ts.map +1 -0
- package/dist/functions/built-in/auth-apikey.js +344 -0
- package/dist/functions/built-in/auth-apikey.js.map +1 -0
- package/dist/functions/built-in/auth-email.d.ts +3 -0
- package/dist/functions/built-in/auth-email.d.ts.map +1 -0
- package/dist/functions/built-in/auth-email.js +63 -0
- package/dist/functions/built-in/auth-email.js.map +1 -0
- package/dist/functions/built-in/auth-invite.d.ts +5 -0
- package/dist/functions/built-in/auth-invite.d.ts.map +1 -0
- package/dist/functions/built-in/auth-invite.js +105 -0
- package/dist/functions/built-in/auth-invite.js.map +1 -0
- package/dist/functions/built-in/auth-password.d.ts +4 -0
- package/dist/functions/built-in/auth-password.d.ts.map +1 -0
- package/dist/functions/built-in/auth-password.js +107 -0
- package/dist/functions/built-in/auth-password.js.map +1 -0
- package/dist/functions/built-in/auth-session.d.ts +18 -0
- package/dist/functions/built-in/auth-session.d.ts.map +1 -0
- package/dist/functions/built-in/auth-session.js +221 -0
- package/dist/functions/built-in/auth-session.js.map +1 -0
- package/dist/functions/built-in/auth-signin.d.ts +20 -0
- package/dist/functions/built-in/auth-signin.d.ts.map +1 -0
- package/dist/functions/built-in/auth-signin.js +198 -0
- package/dist/functions/built-in/auth-signin.js.map +1 -0
- package/dist/functions/built-in/auth-signout.d.ts +18 -0
- package/dist/functions/built-in/auth-signout.d.ts.map +1 -0
- package/dist/functions/built-in/auth-signout.js +78 -0
- package/dist/functions/built-in/auth-signout.js.map +1 -0
- package/dist/functions/built-in/auth-signup.d.ts +21 -0
- package/dist/functions/built-in/auth-signup.d.ts.map +1 -0
- package/dist/functions/built-in/auth-signup.js +147 -0
- package/dist/functions/built-in/auth-signup.js.map +1 -0
- package/dist/functions/built-in/auth-tenant.d.ts +3 -0
- package/dist/functions/built-in/auth-tenant.d.ts.map +1 -0
- package/dist/functions/built-in/auth-tenant.js +86 -0
- package/dist/functions/built-in/auth-tenant.js.map +1 -0
- package/dist/functions/built-in/index.d.ts +55 -0
- package/dist/functions/built-in/index.d.ts.map +1 -0
- package/dist/functions/built-in/index.js +181 -0
- package/dist/functions/built-in/index.js.map +1 -0
- package/dist/functions/built-in/system-cache.d.ts +10 -0
- package/dist/functions/built-in/system-cache.d.ts.map +1 -0
- package/dist/functions/built-in/system-cache.js +98 -0
- package/dist/functions/built-in/system-cache.js.map +1 -0
- package/dist/functions/built-in/system-data.d.ts +13 -0
- package/dist/functions/built-in/system-data.d.ts.map +1 -0
- package/dist/functions/built-in/system-data.js +133 -0
- package/dist/functions/built-in/system-data.js.map +1 -0
- package/dist/functions/built-in/system-jobs.d.ts +22 -0
- package/dist/functions/built-in/system-jobs.d.ts.map +1 -0
- package/dist/functions/built-in/system-jobs.js +82 -0
- package/dist/functions/built-in/system-jobs.js.map +1 -0
- package/dist/functions/built-in/system-notifications.d.ts +41 -0
- package/dist/functions/built-in/system-notifications.d.ts.map +1 -0
- package/dist/functions/built-in/system-notifications.js +72 -0
- package/dist/functions/built-in/system-notifications.js.map +1 -0
- package/dist/functions/built-in/system-performance.d.ts +25 -0
- package/dist/functions/built-in/system-performance.d.ts.map +1 -0
- package/dist/functions/built-in/system-performance.js +83 -0
- package/dist/functions/built-in/system-performance.js.map +1 -0
- package/dist/functions/built-in-registry.d.ts +101 -0
- package/dist/functions/built-in-registry.d.ts.map +1 -0
- package/dist/functions/built-in-registry.js +165 -0
- package/dist/functions/built-in-registry.js.map +1 -0
- package/dist/functions/definition.d.ts +206 -0
- package/dist/functions/definition.d.ts.map +1 -0
- package/dist/functions/definition.js +178 -0
- package/dist/functions/definition.js.map +1 -0
- package/dist/functions/types.d.ts +151 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/functions/types.js +3 -0
- package/dist/functions/types.js.map +1 -0
- package/dist/http/context-helper.d.ts +60 -0
- package/dist/http/context-helper.d.ts.map +1 -0
- package/dist/http/context-helper.js +161 -0
- package/dist/http/context-helper.js.map +1 -0
- package/dist/http/definition.d.ts +76 -0
- package/dist/http/definition.d.ts.map +1 -0
- package/dist/http/definition.js +46 -0
- package/dist/http/definition.js.map +1 -0
- package/dist/http/index.d.ts +7 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/plugins/auth.d.ts +71 -0
- package/dist/http/plugins/auth.d.ts.map +1 -0
- package/dist/http/plugins/auth.js +67 -0
- package/dist/http/plugins/auth.js.map +1 -0
- package/dist/http/plugins/better-auth.d.ts +67 -0
- package/dist/http/plugins/better-auth.d.ts.map +1 -0
- package/dist/http/plugins/better-auth.js +48 -0
- package/dist/http/plugins/better-auth.js.map +1 -0
- package/dist/http/router.d.ts +59 -0
- package/dist/http/router.d.ts.map +1 -0
- package/dist/http/router.js +371 -0
- package/dist/http/router.js.map +1 -0
- package/dist/http/server.d.ts +15 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +217 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/types.d.ts +142 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +7 -0
- package/dist/http/types.js.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +116 -0
- package/dist/index.mjs.map +1 -0
- package/dist/ipc/run-sidecar.d.ts +8 -0
- package/dist/ipc/run-sidecar.d.ts.map +1 -0
- package/dist/ipc/run-sidecar.js +127 -0
- package/dist/ipc/run-sidecar.js.map +1 -0
- package/dist/ipc/socket-bridge.d.ts +114 -0
- package/dist/ipc/socket-bridge.d.ts.map +1 -0
- package/dist/ipc/socket-bridge.js +724 -0
- package/dist/ipc/socket-bridge.js.map +1 -0
- package/dist/jobs/index.d.ts +7 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +10 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/queue.d.ts +62 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +192 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/run-scheduler.d.ts +2 -0
- package/dist/jobs/run-scheduler.d.ts.map +1 -0
- package/dist/jobs/run-scheduler.js +245 -0
- package/dist/jobs/run-scheduler.js.map +1 -0
- package/dist/jobs/run-worker.d.ts +2 -0
- package/dist/jobs/run-worker.d.ts.map +1 -0
- package/dist/jobs/run-worker.js +123 -0
- package/dist/jobs/run-worker.js.map +1 -0
- package/dist/jobs/runtime-loader.d.ts +14 -0
- package/dist/jobs/runtime-loader.d.ts.map +1 -0
- package/dist/jobs/runtime-loader.js +122 -0
- package/dist/jobs/runtime-loader.js.map +1 -0
- package/dist/jobs/scheduler-client.d.ts +33 -0
- package/dist/jobs/scheduler-client.d.ts.map +1 -0
- package/dist/jobs/scheduler-client.js +69 -0
- package/dist/jobs/scheduler-client.js.map +1 -0
- package/dist/jobs/scheduler.d.ts +73 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +297 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/worker-thread.d.ts +27 -0
- package/dist/jobs/worker-thread.d.ts.map +1 -0
- package/dist/jobs/worker-thread.js +173 -0
- package/dist/jobs/worker-thread.js.map +1 -0
- package/dist/jobs/worker.d.ts +30 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +262 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/jobs/ws-client.d.ts +23 -0
- package/dist/jobs/ws-client.d.ts.map +1 -0
- package/dist/jobs/ws-client.js +105 -0
- package/dist/jobs/ws-client.js.map +1 -0
- package/dist/linq/async-enumerable.d.ts +91 -0
- package/dist/linq/async-enumerable.d.ts.map +1 -0
- package/dist/linq/async-enumerable.js +176 -0
- package/dist/linq/async-enumerable.js.map +1 -0
- package/dist/linq/enumerable.d.ts +94 -0
- package/dist/linq/enumerable.d.ts.map +1 -0
- package/dist/linq/enumerable.js +210 -0
- package/dist/linq/enumerable.js.map +1 -0
- package/dist/linq/index.d.ts +25 -0
- package/dist/linq/index.d.ts.map +1 -0
- package/dist/linq/index.js +27 -0
- package/dist/linq/index.js.map +1 -0
- package/dist/linq/interfaces.d.ts +23 -0
- package/dist/linq/interfaces.d.ts.map +1 -0
- package/dist/linq/interfaces.js +3 -0
- package/dist/linq/interfaces.js.map +1 -0
- package/dist/logging/logger.d.ts +85 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +217 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/query/builder.d.ts +91 -0
- package/dist/query/builder.d.ts.map +1 -0
- package/dist/query/builder.js +103 -0
- package/dist/query/builder.js.map +1 -0
- package/dist/query/types.d.ts +112 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +3 -0
- package/dist/query/types.js.map +1 -0
- package/dist/reactivity/graph.d.ts +8 -0
- package/dist/reactivity/graph.d.ts.map +1 -0
- package/dist/reactivity/graph.js +51 -0
- package/dist/reactivity/graph.js.map +1 -0
- package/dist/repository/db-set.d.ts +220 -0
- package/dist/repository/db-set.d.ts.map +1 -0
- package/dist/repository/db-set.js +515 -0
- package/dist/repository/db-set.js.map +1 -0
- package/dist/repository/ef-core.d.ts +177 -0
- package/dist/repository/ef-core.d.ts.map +1 -0
- package/dist/repository/ef-core.js +404 -0
- package/dist/repository/ef-core.js.map +1 -0
- package/dist/repository/factory.d.ts +117 -0
- package/dist/repository/factory.d.ts.map +1 -0
- package/dist/repository/factory.js +183 -0
- package/dist/repository/factory.js.map +1 -0
- package/dist/repository/interfaces.d.ts +449 -0
- package/dist/repository/interfaces.d.ts.map +1 -0
- package/dist/repository/interfaces.js +21 -0
- package/dist/repository/interfaces.js.map +1 -0
- package/dist/repository/provider.d.ts +16 -0
- package/dist/repository/provider.d.ts.map +1 -0
- package/dist/repository/provider.js +674 -0
- package/dist/repository/provider.js.map +1 -0
- package/dist/repository/queryable.d.ts +111 -0
- package/dist/repository/queryable.d.ts.map +1 -0
- package/dist/repository/queryable.js +566 -0
- package/dist/repository/queryable.js.map +1 -0
- package/dist/rpc/adapter.d.ts +18 -0
- package/dist/rpc/adapter.d.ts.map +1 -0
- package/dist/rpc/adapter.js +101 -0
- package/dist/rpc/adapter.js.map +1 -0
- package/dist/rpc/router.d.ts +82 -0
- package/dist/rpc/router.d.ts.map +1 -0
- package/dist/rpc/router.js +177 -0
- package/dist/rpc/router.js.map +1 -0
- package/dist/schema/definition.d.ts +51 -0
- package/dist/schema/definition.d.ts.map +1 -0
- package/dist/schema/definition.js +79 -0
- package/dist/schema/definition.js.map +1 -0
- package/dist/schema/input-types.d.ts +88 -0
- package/dist/schema/input-types.d.ts.map +1 -0
- package/dist/schema/input-types.js +81 -0
- package/dist/schema/input-types.js.map +1 -0
- package/dist/schema/modifiers.d.ts +173 -0
- package/dist/schema/modifiers.d.ts.map +1 -0
- package/dist/schema/modifiers.js +218 -0
- package/dist/schema/modifiers.js.map +1 -0
- package/dist/schema/relationship-types.d.ts +109 -0
- package/dist/schema/relationship-types.d.ts.map +1 -0
- package/dist/schema/relationship-types.js +11 -0
- package/dist/schema/relationship-types.js.map +1 -0
- package/dist/schema/type-helpers.d.ts +105 -0
- package/dist/schema/type-helpers.d.ts.map +1 -0
- package/dist/schema/type-helpers.js +215 -0
- package/dist/schema/type-helpers.js.map +1 -0
- package/dist/schema/types.d.ts +144 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +12 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/schema/validators.d.ts +127 -0
- package/dist/schema/validators.d.ts.map +1 -0
- package/dist/schema/validators.js +164 -0
- package/dist/schema/validators.js.map +1 -0
- package/dist/services/admin/app-users.service.d.ts +138 -0
- package/dist/services/admin/app-users.service.d.ts.map +1 -0
- package/dist/services/admin/app-users.service.js +435 -0
- package/dist/services/admin/app-users.service.js.map +1 -0
- package/dist/services/admin/auth.service.d.ts +104 -0
- package/dist/services/admin/auth.service.d.ts.map +1 -0
- package/dist/services/admin/auth.service.js +208 -0
- package/dist/services/admin/auth.service.js.map +1 -0
- package/dist/services/admin/backup/BackupOrchestrator.d.ts +38 -0
- package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -0
- package/dist/services/admin/backup/BackupOrchestrator.js +350 -0
- package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -0
- package/dist/services/admin/backup/DataStreamer.d.ts +11 -0
- package/dist/services/admin/backup/DataStreamer.d.ts.map +1 -0
- package/dist/services/admin/backup/DataStreamer.js +85 -0
- package/dist/services/admin/backup/DataStreamer.js.map +1 -0
- package/dist/services/admin/backup/LegacyAdapter.d.ts +28 -0
- package/dist/services/admin/backup/LegacyAdapter.d.ts.map +1 -0
- package/dist/services/admin/backup/LegacyAdapter.js +35 -0
- package/dist/services/admin/backup/LegacyAdapter.js.map +1 -0
- package/dist/services/admin/backup/SqliteGenerator.d.ts +15 -0
- package/dist/services/admin/backup/SqliteGenerator.d.ts.map +1 -0
- package/dist/services/admin/backup/SqliteGenerator.js +152 -0
- package/dist/services/admin/backup/SqliteGenerator.js.map +1 -0
- package/dist/services/admin/backup/StorageStreamer.d.ts +17 -0
- package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -0
- package/dist/services/admin/backup/StorageStreamer.js +117 -0
- package/dist/services/admin/backup/StorageStreamer.js.map +1 -0
- package/dist/services/admin/backup/ZipComposer.d.ts +17 -0
- package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -0
- package/dist/services/admin/backup/ZipComposer.js +95 -0
- package/dist/services/admin/backup/ZipComposer.js.map +1 -0
- package/dist/services/admin/backup/ZipExtractor.d.ts +24 -0
- package/dist/services/admin/backup/ZipExtractor.d.ts.map +1 -0
- package/dist/services/admin/backup/ZipExtractor.js +135 -0
- package/dist/services/admin/backup/ZipExtractor.js.map +1 -0
- package/dist/services/admin/backup/index.d.ts +9 -0
- package/dist/services/admin/backup/index.d.ts.map +1 -0
- package/dist/services/admin/backup/index.js +18 -0
- package/dist/services/admin/backup/index.js.map +1 -0
- package/dist/services/admin/backup/types.d.ts +48 -0
- package/dist/services/admin/backup/types.d.ts.map +1 -0
- package/dist/services/admin/backup/types.js +3 -0
- package/dist/services/admin/backup/types.js.map +1 -0
- package/dist/services/admin/backup.service.d.ts +117 -0
- package/dist/services/admin/backup.service.d.ts.map +1 -0
- package/dist/services/admin/backup.service.js +709 -0
- package/dist/services/admin/backup.service.js.map +1 -0
- package/dist/services/admin/data.service.d.ts +109 -0
- package/dist/services/admin/data.service.d.ts.map +1 -0
- package/dist/services/admin/data.service.js +734 -0
- package/dist/services/admin/data.service.js.map +1 -0
- package/dist/services/admin/tenants.service.d.ts +99 -0
- package/dist/services/admin/tenants.service.d.ts.map +1 -0
- package/dist/services/admin/tenants.service.js +173 -0
- package/dist/services/admin/tenants.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +155 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +401 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/introspection.service.d.ts +262 -0
- package/dist/services/introspection.service.d.ts.map +1 -0
- package/dist/services/introspection.service.js +400 -0
- package/dist/services/introspection.service.js.map +1 -0
- package/dist/services/invite.service.d.ts +87 -0
- package/dist/services/invite.service.d.ts.map +1 -0
- package/dist/services/invite.service.js +216 -0
- package/dist/services/invite.service.js.map +1 -0
- package/dist/services/storage.service.d.ts +79 -0
- package/dist/services/storage.service.d.ts.map +1 -0
- package/dist/services/storage.service.js +209 -0
- package/dist/services/storage.service.js.map +1 -0
- package/dist/services/system.service.d.ts +60 -0
- package/dist/services/system.service.d.ts.map +1 -0
- package/dist/services/system.service.js +176 -0
- package/dist/services/system.service.js.map +1 -0
- package/dist/services/tenant.service.d.ts +112 -0
- package/dist/services/tenant.service.d.ts.map +1 -0
- package/dist/services/tenant.service.js +359 -0
- package/dist/services/tenant.service.js.map +1 -0
- package/dist/settings/index.d.ts +6 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +13 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/schema.d.ts +39 -0
- package/dist/settings/schema.d.ts.map +1 -0
- package/dist/settings/schema.js +41 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/settings/service.d.ts +28 -0
- package/dist/settings/service.d.ts.map +1 -0
- package/dist/settings/service.js +133 -0
- package/dist/settings/service.js.map +1 -0
- package/dist/startup/bootstrap.d.ts +13 -0
- package/dist/startup/bootstrap.d.ts.map +1 -0
- package/dist/startup/bootstrap.js +262 -0
- package/dist/startup/bootstrap.js.map +1 -0
- package/dist/startup/cluster-manager.d.ts +59 -0
- package/dist/startup/cluster-manager.d.ts.map +1 -0
- package/dist/startup/cluster-manager.js +238 -0
- package/dist/startup/cluster-manager.js.map +1 -0
- package/dist/startup/process-manager.d.ts +46 -0
- package/dist/startup/process-manager.d.ts.map +1 -0
- package/dist/startup/process-manager.js +288 -0
- package/dist/startup/process-manager.js.map +1 -0
- package/dist/startup/processes.d.mts +15 -0
- package/dist/startup/processes.d.mts.map +1 -0
- package/dist/startup/processes.mjs +162 -0
- package/dist/startup/processes.mjs.map +1 -0
- package/dist/startup.js +42 -0
- package/dist/storage/fs-backend.d.ts +38 -0
- package/dist/storage/fs-backend.d.ts.map +1 -0
- package/dist/storage/fs-backend.js +129 -0
- package/dist/storage/fs-backend.js.map +1 -0
- package/dist/storage/manager.d.ts +88 -0
- package/dist/storage/manager.d.ts.map +1 -0
- package/dist/storage/manager.js +416 -0
- package/dist/storage/manager.js.map +1 -0
- package/dist/storage/s3-backend.d.ts +30 -0
- package/dist/storage/s3-backend.d.ts.map +1 -0
- package/dist/storage/s3-backend.js +65 -0
- package/dist/storage/s3-backend.js.map +1 -0
- package/dist/storage/types.d.ts +56 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +3 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/utils/http.d.ts +16 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +61 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/introspection-helpers.d.ts +35 -0
- package/dist/utils/introspection-helpers.d.ts.map +1 -0
- package/dist/utils/introspection-helpers.js +246 -0
- package/dist/utils/introspection-helpers.js.map +1 -0
- package/dist/webhook/definition.d.ts +79 -0
- package/dist/webhook/definition.d.ts.map +1 -0
- package/dist/webhook/definition.js +33 -0
- package/dist/webhook/definition.js.map +1 -0
- package/dist/webhook/guard.d.ts +34 -0
- package/dist/webhook/guard.d.ts.map +1 -0
- package/dist/webhook/guard.js +86 -0
- package/dist/webhook/guard.js.map +1 -0
- package/dist/webhook/index.d.ts +9 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +19 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/verifier.d.ts +24 -0
- package/dist/webhook/verifier.d.ts.map +1 -0
- package/dist/webhook/verifier.js +107 -0
- package/dist/webhook/verifier.js.map +1 -0
- package/dist/websocket/server.d.ts +74 -0
- package/dist/websocket/server.d.ts.map +1 -0
- package/dist/websocket/server.js +693 -0
- package/dist/websocket/server.js.map +1 -0
- package/dist/websocket/types.d.ts +53 -0
- package/dist/websocket/types.d.ts.map +1 -0
- package/dist/websocket/types.js +3 -0
- package/dist/websocket/types.js.map +1 -0
- package/dist/websocket/ws-compat.d.ts +26 -0
- package/dist/websocket/ws-compat.d.ts.map +1 -0
- package/dist/websocket/ws-compat.js +35 -0
- package/dist/websocket/ws-compat.js.map +1 -0
- package/docker/README.md +5 -0
- package/package.json +210 -0
- package/scripts/postinstall.js +31 -0
- package/templates/.env.example +55 -0
- package/templates/archlast.config.js +36 -0
- package/templates/docker-compose.dev.yml +8 -0
- package/templates/docker-compose.prod.yml +15 -0
- package/templates/docker-compose.yml +33 -0
|
@@ -0,0 +1,1437 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeploymentHandler = void 0;
|
|
4
|
+
const persistence_js_1 = require("./persistence.js");
|
|
5
|
+
const logger_js_1 = require("../logging/logger.js");
|
|
6
|
+
const function_extractor_js_1 = require("./function-extractor.js");
|
|
7
|
+
const schema_js_1 = require("../auth/system/schema.js");
|
|
8
|
+
const definition_js_1 = require("../functions/definition.js");
|
|
9
|
+
const deployment_events_controller_js_1 = require("../controllers/deployment-events.controller.js");
|
|
10
|
+
class DeploymentHandler {
|
|
11
|
+
uploadedFunctions = new Map();
|
|
12
|
+
uploadedHttpRoutes = new Map();
|
|
13
|
+
uploadedRpcRoutes = new Map();
|
|
14
|
+
uploadedSchema = null;
|
|
15
|
+
engine;
|
|
16
|
+
db;
|
|
17
|
+
persistence;
|
|
18
|
+
httpRouter = null;
|
|
19
|
+
rpcRouter = null; // Will be initialized as RpcRouter
|
|
20
|
+
deploymentLock = false;
|
|
21
|
+
constructor(engine, db) {
|
|
22
|
+
this.engine = engine;
|
|
23
|
+
this.db = db;
|
|
24
|
+
this.persistence = new persistence_js_1.DeploymentPersistence();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Acquire deployment lock
|
|
28
|
+
*/
|
|
29
|
+
async acquireLock() {
|
|
30
|
+
if (this.deploymentLock) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
this.deploymentLock = true;
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Release deployment lock
|
|
38
|
+
*/
|
|
39
|
+
releaseLock() {
|
|
40
|
+
this.deploymentLock = false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set the HTTP router for registering user-defined routes
|
|
44
|
+
*/
|
|
45
|
+
setHttpRouter(router) {
|
|
46
|
+
this.httpRouter = router;
|
|
47
|
+
}
|
|
48
|
+
async initialize() {
|
|
49
|
+
const state = await this.persistence.load();
|
|
50
|
+
if (state) {
|
|
51
|
+
await this.restoreDeployment(state);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async restoreDeployment(state) {
|
|
55
|
+
try {
|
|
56
|
+
const { join } = await import("path");
|
|
57
|
+
const fs = await import("fs/promises");
|
|
58
|
+
const deployDir = join(process.cwd(), ".archlast-deploy");
|
|
59
|
+
// Ensure deploy directory exists
|
|
60
|
+
await fs.mkdir(deployDir, { recursive: true });
|
|
61
|
+
// Write all files with directory structure preserved
|
|
62
|
+
for (const file of state.files) {
|
|
63
|
+
const filePath = join(deployDir, file.filePath);
|
|
64
|
+
const fileDir = join(filePath, "..");
|
|
65
|
+
await fs.mkdir(fileDir, { recursive: true });
|
|
66
|
+
// Rewrite imports for files in src/, keep others as-is
|
|
67
|
+
const code = file.filePath.startsWith("src/")
|
|
68
|
+
? await this.rewriteImports(file.code)
|
|
69
|
+
: file.code;
|
|
70
|
+
await Bun.write(filePath, code);
|
|
71
|
+
}
|
|
72
|
+
// Load schema and functions
|
|
73
|
+
let restoredCount = 0;
|
|
74
|
+
// Check for static tRPC router (Phase 4: prioritize static router over dynamic registry)
|
|
75
|
+
const trpcRouterFile = state.files.find((f) => f.filePath.endsWith("_generated/trpc-router.ts") ||
|
|
76
|
+
f.filePath.endsWith("_generated/trpc-router.js"));
|
|
77
|
+
if (trpcRouterFile) {
|
|
78
|
+
try {
|
|
79
|
+
const routerPath = join(deployDir, trpcRouterFile.filePath);
|
|
80
|
+
const routerMod = await import(routerPath + `?t=${Date.now()}`);
|
|
81
|
+
if (routerMod && routerMod.appRouter) {
|
|
82
|
+
this.rpcRouter = routerMod.appRouter;
|
|
83
|
+
logger_js_1.logger.log({
|
|
84
|
+
timestamp: Date.now(),
|
|
85
|
+
level: "info",
|
|
86
|
+
kind: "deployment",
|
|
87
|
+
message: "[Restore] Loaded static tRPC appRouter from trpc-router.ts",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
logger_js_1.logger.log({
|
|
93
|
+
timestamp: Date.now(),
|
|
94
|
+
level: "error",
|
|
95
|
+
kind: "deployment",
|
|
96
|
+
message: "[Restore] Failed to load static tRPC router:",
|
|
97
|
+
context: { err },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// First, look for DI registration
|
|
102
|
+
const diFile = state.files.find((f) => f.filePath.endsWith("_generated/di.ts") ||
|
|
103
|
+
f.filePath.endsWith("_generated/di.js"));
|
|
104
|
+
if (diFile) {
|
|
105
|
+
try {
|
|
106
|
+
const diPath = join(deployDir, diFile.filePath);
|
|
107
|
+
const diMod = await import(diPath + `?t=${Date.now()}`);
|
|
108
|
+
if (diMod && typeof diMod.registerProviders === "function") {
|
|
109
|
+
const { globalContainer } = await import("../di/container.js");
|
|
110
|
+
diMod.registerProviders(globalContainer);
|
|
111
|
+
logger_js_1.logger.log({
|
|
112
|
+
timestamp: Date.now(),
|
|
113
|
+
level: "info",
|
|
114
|
+
kind: "deployment",
|
|
115
|
+
message: `[Restore] Registered DI providers from ${diFile.filePath}`,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
logger_js_1.logger.log({
|
|
121
|
+
timestamp: Date.now(),
|
|
122
|
+
level: "error",
|
|
123
|
+
kind: "deployment",
|
|
124
|
+
message: "[Restore] Failed to register DI providers:",
|
|
125
|
+
context: { err },
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
for (const file of state.files) {
|
|
130
|
+
const fullPath = join(deployDir, file.filePath);
|
|
131
|
+
const fileName = file.filePath.split(/[\\/]/).pop() || "unknown.ts";
|
|
132
|
+
const moduleName = fileName.replace(/\.(ts|js)$/, "");
|
|
133
|
+
// Load schema
|
|
134
|
+
if (file.filePath.endsWith("schema.ts")) {
|
|
135
|
+
const mod = await import(fullPath + `?t=${Date.now()}`);
|
|
136
|
+
if (mod.default && mod.default.tables) {
|
|
137
|
+
const mergedSchema = {
|
|
138
|
+
...mod.default,
|
|
139
|
+
tables: {
|
|
140
|
+
...(mod.default.tables ?? {}),
|
|
141
|
+
...schema_js_1.authSchema.tables,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
this.uploadedSchema = mergedSchema;
|
|
145
|
+
await this.db.applySchema(mergedSchema);
|
|
146
|
+
}
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// Load functions and routes
|
|
150
|
+
const hasFunctions = /export\s+(?:const|let)\s+\w+\s*=\s*(?:query|mutation|action|http\.\w+|webhook|rpc\.\w+|t\.router)\s*\(/g.test(file.code);
|
|
151
|
+
if (hasFunctions) {
|
|
152
|
+
const mod = await import(fullPath + `?t=${Date.now()}`);
|
|
153
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
154
|
+
// Check for HTTP route definitions
|
|
155
|
+
if ((0, definition_js_1.isHttpDefinition)(value)) {
|
|
156
|
+
const routeKey = `${moduleName}:${key}`;
|
|
157
|
+
this.uploadedHttpRoutes.set(routeKey, value);
|
|
158
|
+
if (this.httpRouter) {
|
|
159
|
+
this.httpRouter.register(value);
|
|
160
|
+
}
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
// Check for webhook definitions
|
|
164
|
+
if ((0, definition_js_1.isWebhookDefinition)(value)) {
|
|
165
|
+
const routeKey = `${moduleName}:${key}`;
|
|
166
|
+
this.uploadedHttpRoutes.set(routeKey, value);
|
|
167
|
+
if (this.httpRouter) {
|
|
168
|
+
this.httpRouter.register(value);
|
|
169
|
+
}
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// Check for RPC definitions
|
|
173
|
+
if ((0, definition_js_1.isRpcDefinition)(value)) {
|
|
174
|
+
const routeKey = `${moduleName}:${key}`;
|
|
175
|
+
this.uploadedRpcRoutes.set(routeKey, value);
|
|
176
|
+
if (this.rpcRouter && typeof this.rpcRouter.register === 'function') {
|
|
177
|
+
this.rpcRouter.register(moduleName, key, value);
|
|
178
|
+
}
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
// Check for generated appRouter (tRPC static router)
|
|
182
|
+
if (key === "appRouter" && value && typeof value === "object") {
|
|
183
|
+
this.rpcRouter = value;
|
|
184
|
+
logger_js_1.logger.log({
|
|
185
|
+
timestamp: Date.now(),
|
|
186
|
+
level: "info",
|
|
187
|
+
kind: "deployment",
|
|
188
|
+
message: `[Restore] Registered static tRPC router (AppRouter)`,
|
|
189
|
+
});
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
// Check for query/mutation/action functions
|
|
193
|
+
if (value &&
|
|
194
|
+
typeof value === "object" &&
|
|
195
|
+
"type" in value &&
|
|
196
|
+
"handler" in value) {
|
|
197
|
+
const fnName = `${moduleName}.${key}`;
|
|
198
|
+
this.engine.registerFunction(fnName, value);
|
|
199
|
+
this.uploadedFunctions.set(`${moduleName}:${key}`, {
|
|
200
|
+
name: key,
|
|
201
|
+
type: value.type,
|
|
202
|
+
filePath: fullPath,
|
|
203
|
+
fullName: fnName,
|
|
204
|
+
// Preserve args schema (ZodObject) if provided by query/mutation config.
|
|
205
|
+
args: value.args,
|
|
206
|
+
timestamp: Date.now(),
|
|
207
|
+
});
|
|
208
|
+
restoredCount++;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// restoredCount can be surfaced via logger if needed
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
// swallow to avoid noisy console logs during restore
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async handleDeploy(payload) {
|
|
220
|
+
// Acquire deployment lock
|
|
221
|
+
if (!(await this.acquireLock())) {
|
|
222
|
+
return {
|
|
223
|
+
success: false,
|
|
224
|
+
message: "Deployment in progress, please wait",
|
|
225
|
+
functions: 0,
|
|
226
|
+
schema: false,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
// Validate payload
|
|
231
|
+
if (!payload || !Array.isArray(payload.files)) {
|
|
232
|
+
throw new Error("Invalid payload: 'files' array is missing or invalid");
|
|
233
|
+
}
|
|
234
|
+
const { join } = await import("path");
|
|
235
|
+
const fs = await import("fs/promises");
|
|
236
|
+
const deployDir = join(process.cwd(), ".archlast-deploy");
|
|
237
|
+
// Calculate file hash for diff detection
|
|
238
|
+
const fileHashes = new Map();
|
|
239
|
+
let filesHashStr = "";
|
|
240
|
+
payload.files.sort((a, b) => a.filePath.localeCompare(b.filePath));
|
|
241
|
+
for (const file of payload.files) {
|
|
242
|
+
const hash = this.hashString(file.code);
|
|
243
|
+
fileHashes.set(file.filePath, hash);
|
|
244
|
+
filesHashStr += `${file.filePath}:${hash};`;
|
|
245
|
+
}
|
|
246
|
+
const overallHash = this.hashString(filesHashStr);
|
|
247
|
+
// Load current state and check for changes
|
|
248
|
+
const currentState = await this.persistence.load();
|
|
249
|
+
const hasChanges = this.hasFileChanges(currentState, payload.files);
|
|
250
|
+
let functionCount = 0;
|
|
251
|
+
const schemaFile = payload.files.find((f) => f.filePath.endsWith("schema.ts"));
|
|
252
|
+
const hasSchema = !!schemaFile;
|
|
253
|
+
// Count functions in payload
|
|
254
|
+
for (const file of payload.files) {
|
|
255
|
+
if (file.code.includes("query(") ||
|
|
256
|
+
file.code.includes("mutation(") ||
|
|
257
|
+
file.code.includes("action(")) {
|
|
258
|
+
functionCount++;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (!hasChanges && currentState) {
|
|
262
|
+
await this.persistence.saveHistory({ files: payload.files, lastDeployment: payload.timestamp }, {
|
|
263
|
+
timestamp: payload.timestamp,
|
|
264
|
+
functionCount,
|
|
265
|
+
schemaChanged: false, // No changes at all
|
|
266
|
+
hash: overallHash,
|
|
267
|
+
});
|
|
268
|
+
return {
|
|
269
|
+
success: true,
|
|
270
|
+
message: "No changes detected",
|
|
271
|
+
functions: functionCount,
|
|
272
|
+
schema: hasSchema,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// Clear old registrations before loading new ones
|
|
276
|
+
this.uploadedFunctions.clear();
|
|
277
|
+
this.uploadedHttpRoutes.clear();
|
|
278
|
+
this.uploadedSchema = null;
|
|
279
|
+
if (this.httpRouter) {
|
|
280
|
+
this.httpRouter.clear();
|
|
281
|
+
}
|
|
282
|
+
// Ensure deploy directory exists
|
|
283
|
+
await fs.mkdir(deployDir, { recursive: true });
|
|
284
|
+
// Delete files that are no longer in the incoming payload
|
|
285
|
+
const incomingPaths = new Set(payload.files.map((f) => f.filePath));
|
|
286
|
+
if (currentState && currentState.files.length > 0) {
|
|
287
|
+
const filesToDelete = [];
|
|
288
|
+
for (const file of currentState.files) {
|
|
289
|
+
if (!incomingPaths.has(file.filePath)) {
|
|
290
|
+
filesToDelete.push(file.filePath);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Delete stale files
|
|
294
|
+
for (const filePath of filesToDelete) {
|
|
295
|
+
const fullPath = join(deployDir, filePath);
|
|
296
|
+
try {
|
|
297
|
+
await fs.rm(fullPath, { force: true });
|
|
298
|
+
logger_js_1.logger.log({
|
|
299
|
+
timestamp: Date.now(),
|
|
300
|
+
level: "info",
|
|
301
|
+
kind: "deployment",
|
|
302
|
+
message: `Deleted stale file: ${filePath}`,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
catch (err) {
|
|
306
|
+
logger_js_1.logger.log({
|
|
307
|
+
timestamp: Date.now(),
|
|
308
|
+
level: "warn",
|
|
309
|
+
kind: "deployment",
|
|
310
|
+
message: `Failed to delete stale file: ${filePath}`,
|
|
311
|
+
context: { err },
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Clean up empty directories
|
|
316
|
+
await this.cleanEmptyDirs(deployDir);
|
|
317
|
+
}
|
|
318
|
+
// Write all files with directory structure preserved
|
|
319
|
+
for (const file of payload.files) {
|
|
320
|
+
const filePath = join(deployDir, file.filePath);
|
|
321
|
+
const fileDir = join(filePath, "..");
|
|
322
|
+
await fs.mkdir(fileDir, { recursive: true });
|
|
323
|
+
// Rewrite imports for files in src/, keep others as-is
|
|
324
|
+
const code = file.filePath.startsWith("src/")
|
|
325
|
+
? await this.rewriteImports(file.code)
|
|
326
|
+
: file.code;
|
|
327
|
+
await Bun.write(filePath, code);
|
|
328
|
+
}
|
|
329
|
+
// Scan and load files that contain functions or schema
|
|
330
|
+
const filesToLoad = [];
|
|
331
|
+
for (const file of payload.files) {
|
|
332
|
+
const fullPath = join(deployDir, file.filePath);
|
|
333
|
+
const fileName = file.filePath.split(/[\\/]/).pop() || "unknown.ts";
|
|
334
|
+
const moduleName = fileName.replace(/\.(ts|js)$/, "");
|
|
335
|
+
// Check if file is schema
|
|
336
|
+
if (file.filePath.endsWith("schema.ts")) {
|
|
337
|
+
filesToLoad.push({ moduleName: "schema", filePath: fullPath, isSchema: true });
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
// Check if file contains functions or HTTP routes
|
|
341
|
+
const hasFunctions = /export\s+(?:const|let)\s+\w+\s*=\s*(?:query|mutation|action|http\.(?:get|post|put|patch|delete)|webhook|t\.router)\s*\(/g.test(file.code);
|
|
342
|
+
if (hasFunctions) {
|
|
343
|
+
filesToLoad.push({ moduleName, filePath: fullPath, isSchema: false });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Load and register functions
|
|
347
|
+
let functionsRegistered = 0;
|
|
348
|
+
let schemaApplied = false;
|
|
349
|
+
// First, look for DI registration
|
|
350
|
+
const diFile = payload.files.find((f) => f.filePath.endsWith("_generated/di.ts") ||
|
|
351
|
+
f.filePath.endsWith("_generated/di.js"));
|
|
352
|
+
if (diFile) {
|
|
353
|
+
try {
|
|
354
|
+
const diPath = join(deployDir, diFile.filePath);
|
|
355
|
+
const diMod = await import(diPath + `?t=${Date.now()}`);
|
|
356
|
+
if (diMod && typeof diMod.registerProviders === "function") {
|
|
357
|
+
const { globalContainer } = await import("../di/container.js");
|
|
358
|
+
diMod.registerProviders(globalContainer);
|
|
359
|
+
logger_js_1.logger.log({
|
|
360
|
+
timestamp: Date.now(),
|
|
361
|
+
level: "info",
|
|
362
|
+
kind: "deployment",
|
|
363
|
+
message: `Registered DI providers from ${diFile.filePath}`,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
logger_js_1.logger.log({
|
|
369
|
+
timestamp: Date.now(),
|
|
370
|
+
level: "error",
|
|
371
|
+
kind: "deployment",
|
|
372
|
+
message: "Failed to register DI providers:",
|
|
373
|
+
context: { err },
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Check for static tRPC router (Phase 4: prioritize static router over dynamic registry)
|
|
378
|
+
const trpcRouterFile = payload.files.find((f) => f.filePath.endsWith("_generated/trpc-router.ts") ||
|
|
379
|
+
f.filePath.endsWith("_generated/trpc-router.js"));
|
|
380
|
+
if (trpcRouterFile) {
|
|
381
|
+
try {
|
|
382
|
+
const routerPath = join(deployDir, trpcRouterFile.filePath);
|
|
383
|
+
const routerMod = await import(routerPath + `?t=${Date.now()}`);
|
|
384
|
+
if (routerMod && routerMod.appRouter) {
|
|
385
|
+
this.rpcRouter = routerMod.appRouter;
|
|
386
|
+
logger_js_1.logger.log({
|
|
387
|
+
timestamp: Date.now(),
|
|
388
|
+
level: "info",
|
|
389
|
+
kind: "deployment",
|
|
390
|
+
message: "Loaded static tRPC appRouter from trpc-router.ts",
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
logger_js_1.logger.log({
|
|
396
|
+
timestamp: Date.now(),
|
|
397
|
+
level: "error",
|
|
398
|
+
kind: "deployment",
|
|
399
|
+
message: "Failed to load static tRPC router:",
|
|
400
|
+
context: { err },
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
for (const { moduleName, filePath, isSchema } of filesToLoad) {
|
|
405
|
+
const mod = await import(filePath + `?t=${Date.now()}`);
|
|
406
|
+
if (isSchema) {
|
|
407
|
+
if (mod.default && mod.default.tables) {
|
|
408
|
+
const mergedSchema = {
|
|
409
|
+
...mod.default,
|
|
410
|
+
tables: {
|
|
411
|
+
...(mod.default.tables ?? {}),
|
|
412
|
+
...schema_js_1.authSchema.tables,
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
this.uploadedSchema = mergedSchema;
|
|
416
|
+
await this.db.applySchema(mergedSchema);
|
|
417
|
+
schemaApplied = true;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
// Register all exported functions, HTTP routes, webhooks, and RPC procedures
|
|
422
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
423
|
+
// Check for HTTP route definitions
|
|
424
|
+
if ((0, definition_js_1.isHttpDefinition)(value)) {
|
|
425
|
+
const routeKey = `${moduleName}:${key}`;
|
|
426
|
+
this.uploadedHttpRoutes.set(routeKey, value);
|
|
427
|
+
if (this.httpRouter) {
|
|
428
|
+
this.httpRouter.register(value);
|
|
429
|
+
logger_js_1.logger.log({
|
|
430
|
+
timestamp: Date.now(),
|
|
431
|
+
level: "info",
|
|
432
|
+
kind: "deployment",
|
|
433
|
+
message: `Registered HTTP route: ${value.method} ${value.path}`,
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
// Check for webhook definitions
|
|
439
|
+
if ((0, definition_js_1.isWebhookDefinition)(value)) {
|
|
440
|
+
const routeKey = `${moduleName}:${key}`;
|
|
441
|
+
this.uploadedHttpRoutes.set(routeKey, value);
|
|
442
|
+
if (this.httpRouter) {
|
|
443
|
+
this.httpRouter.register(value);
|
|
444
|
+
logger_js_1.logger.log({
|
|
445
|
+
timestamp: Date.now(),
|
|
446
|
+
level: "info",
|
|
447
|
+
kind: "deployment",
|
|
448
|
+
message: `Registered webhook: ${value.method ?? "POST"} ${value.path}`,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
continue;
|
|
452
|
+
}
|
|
453
|
+
// Check for RPC definitions
|
|
454
|
+
if ((0, definition_js_1.isRpcDefinition)(value)) {
|
|
455
|
+
const routeKey = `${moduleName}:${key}`;
|
|
456
|
+
this.uploadedRpcRoutes.set(routeKey, value);
|
|
457
|
+
if (this.rpcRouter && typeof this.rpcRouter.register === 'function') {
|
|
458
|
+
this.rpcRouter.register(moduleName, key, value);
|
|
459
|
+
logger_js_1.logger.log({
|
|
460
|
+
timestamp: Date.now(),
|
|
461
|
+
level: "info",
|
|
462
|
+
kind: "deployment",
|
|
463
|
+
message: `Registered RPC procedure: ${moduleName}.${key} (${value.procedureType})`,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
// Check for generated appRouter (tRPC static router)
|
|
469
|
+
if (key === "appRouter" && value && typeof value === "object") {
|
|
470
|
+
this.rpcRouter = value;
|
|
471
|
+
logger_js_1.logger.log({
|
|
472
|
+
timestamp: Date.now(),
|
|
473
|
+
level: "info",
|
|
474
|
+
kind: "deployment",
|
|
475
|
+
message: `Registered static tRPC router (AppRouter)`,
|
|
476
|
+
});
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
// Check for query/mutation/action functions
|
|
480
|
+
if (value &&
|
|
481
|
+
typeof value === "object" &&
|
|
482
|
+
"type" in value &&
|
|
483
|
+
"handler" in value) {
|
|
484
|
+
const fnName = `${moduleName}.${key}`;
|
|
485
|
+
this.engine.registerFunction(fnName, value);
|
|
486
|
+
this.uploadedFunctions.set(`${moduleName}:${key}`, {
|
|
487
|
+
name: key,
|
|
488
|
+
type: value.type,
|
|
489
|
+
filePath: filePath,
|
|
490
|
+
fullName: fnName,
|
|
491
|
+
// Preserve args schema (ZodObject) if provided by query/mutation config.
|
|
492
|
+
args: value.args,
|
|
493
|
+
timestamp: payload.timestamp,
|
|
494
|
+
});
|
|
495
|
+
functionsRegistered++;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
// Extract function and schema metadata for smart pull
|
|
501
|
+
const metadata = this.extractDeploymentMetadata(payload.files, payload.timestamp);
|
|
502
|
+
// Save deployment state and history with metadata
|
|
503
|
+
const newState = {
|
|
504
|
+
files: payload.files,
|
|
505
|
+
lastDeployment: payload.timestamp,
|
|
506
|
+
functions: metadata.functions,
|
|
507
|
+
schema: metadata.schema,
|
|
508
|
+
};
|
|
509
|
+
await this.persistence.save(newState);
|
|
510
|
+
await this.persistence.saveHistory(newState, {
|
|
511
|
+
timestamp: payload.timestamp,
|
|
512
|
+
functionCount: functionsRegistered,
|
|
513
|
+
schemaChanged: schemaApplied, // Approximation
|
|
514
|
+
hash: overallHash,
|
|
515
|
+
});
|
|
516
|
+
// Broadcast deployment notification
|
|
517
|
+
try {
|
|
518
|
+
const { broadcastNotification } = await import("../functions/built-in/system-notifications.js");
|
|
519
|
+
broadcastNotification({
|
|
520
|
+
title: "Deployment Complete",
|
|
521
|
+
description: `${functionsRegistered} function(s) deployed${schemaApplied ? ", schema updated" : ""}`,
|
|
522
|
+
type: "success",
|
|
523
|
+
data: {
|
|
524
|
+
functionCount: functionsRegistered,
|
|
525
|
+
schemaChanged: schemaApplied,
|
|
526
|
+
timestamp: payload.timestamp,
|
|
527
|
+
},
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
catch (err) {
|
|
531
|
+
// Ignore notification errors
|
|
532
|
+
logger_js_1.logger.log({
|
|
533
|
+
timestamp: Date.now(),
|
|
534
|
+
level: "warn",
|
|
535
|
+
kind: "deployment",
|
|
536
|
+
message: "Failed to broadcast deployment notification:",
|
|
537
|
+
context: { err },
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
// Emit deployment complete event for reactive CLI
|
|
541
|
+
(0, deployment_events_controller_js_1.emitDeploymentComplete)("full");
|
|
542
|
+
setTimeout(() => {
|
|
543
|
+
logger_js_1.logger.log({
|
|
544
|
+
timestamp: Date.now(),
|
|
545
|
+
level: "info",
|
|
546
|
+
kind: "deployment",
|
|
547
|
+
message: "Restarting server after deployment...",
|
|
548
|
+
});
|
|
549
|
+
process.exit(0);
|
|
550
|
+
}, 200);
|
|
551
|
+
return {
|
|
552
|
+
success: true,
|
|
553
|
+
message: "Deployment successful",
|
|
554
|
+
functions: functionsRegistered,
|
|
555
|
+
schema: schemaApplied,
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
catch (error) {
|
|
559
|
+
return {
|
|
560
|
+
success: false,
|
|
561
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
562
|
+
functions: 0,
|
|
563
|
+
schema: false,
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
finally {
|
|
567
|
+
// Always release the lock
|
|
568
|
+
this.releaseLock();
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
async rewriteImports(code) {
|
|
572
|
+
const { join } = await import("path");
|
|
573
|
+
const deployDir = join(process.cwd(), ".archlast-deploy");
|
|
574
|
+
// Don't rewrite imports from _generated/server since we now include that file
|
|
575
|
+
// Only rewrite schema/definition imports
|
|
576
|
+
let rewritten = code.replace(/from\s+["']@archlast\/server\/schema\/definition["']/g, 'from "@archlast/server/schema/definition"');
|
|
577
|
+
// Rewrite relative module imports to absolute paths within .archlast-deploy
|
|
578
|
+
// e.g., from '../modules/tasks/task.helper' -> from 'F:/path/.archlast-deploy/modules/tasks/task.helper'
|
|
579
|
+
rewritten = rewritten.replace(/from\s+["']\.\.\/((modules|src)\/[^"']+)["']/g, (match, modulePath) => {
|
|
580
|
+
const absolutePath = join(deployDir, modulePath).replace(/\\/g, "/");
|
|
581
|
+
return `from "${absolutePath}"`;
|
|
582
|
+
});
|
|
583
|
+
return rewritten;
|
|
584
|
+
}
|
|
585
|
+
hasFileChanges(currentState, incomingFiles) {
|
|
586
|
+
if (!currentState)
|
|
587
|
+
return true;
|
|
588
|
+
// Create maps for comparison
|
|
589
|
+
const currentMap = new Map(currentState.files.map((f) => [f.filePath, f.code.trim()]));
|
|
590
|
+
const incomingMap = new Map(incomingFiles.map((f) => [f.filePath, f.code.trim()]));
|
|
591
|
+
// Check if file count changed
|
|
592
|
+
if (currentMap.size !== incomingMap.size)
|
|
593
|
+
return true;
|
|
594
|
+
// Check if any file content changed
|
|
595
|
+
for (const [path, code] of incomingMap) {
|
|
596
|
+
const currentCode = currentMap.get(path);
|
|
597
|
+
if (!currentCode || currentCode !== code) {
|
|
598
|
+
return true;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
return false;
|
|
602
|
+
}
|
|
603
|
+
hashString(str) {
|
|
604
|
+
let hash = 0;
|
|
605
|
+
for (let i = 0; i < str.length; i++) {
|
|
606
|
+
const char = str.charCodeAt(i);
|
|
607
|
+
hash = (hash << 5) - hash + char;
|
|
608
|
+
hash = hash & hash;
|
|
609
|
+
}
|
|
610
|
+
return Math.abs(hash).toString(36);
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* Recursively clean up empty directories
|
|
614
|
+
*/
|
|
615
|
+
async cleanEmptyDirs(dirPath) {
|
|
616
|
+
try {
|
|
617
|
+
const { readdir } = await import("fs/promises");
|
|
618
|
+
const { join } = await import("path");
|
|
619
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
620
|
+
for (const entry of entries) {
|
|
621
|
+
const fullPath = join(dirPath, entry.name);
|
|
622
|
+
if (entry.isDirectory()) {
|
|
623
|
+
await this.cleanEmptyDirs(fullPath);
|
|
624
|
+
// Check if directory is now empty
|
|
625
|
+
const remainingEntries = await readdir(fullPath);
|
|
626
|
+
if (remainingEntries.length === 0) {
|
|
627
|
+
const { rmdir } = await import("fs/promises");
|
|
628
|
+
await rmdir(fullPath);
|
|
629
|
+
logger_js_1.logger.log({
|
|
630
|
+
timestamp: Date.now(),
|
|
631
|
+
level: "info",
|
|
632
|
+
kind: "deployment",
|
|
633
|
+
message: `Removed empty directory: ${fullPath}`,
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
catch (error) {
|
|
640
|
+
// Ignore errors during cleanup
|
|
641
|
+
logger_js_1.logger.log({
|
|
642
|
+
timestamp: Date.now(),
|
|
643
|
+
level: "warn",
|
|
644
|
+
kind: "deployment",
|
|
645
|
+
message: "Failed to clean empty directories",
|
|
646
|
+
context: { error },
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
getFunction(filePath, name) {
|
|
651
|
+
return this.uploadedFunctions.get(`${filePath}:${name}`);
|
|
652
|
+
}
|
|
653
|
+
getSchema() {
|
|
654
|
+
return this.uploadedSchema;
|
|
655
|
+
}
|
|
656
|
+
listFunctions() {
|
|
657
|
+
return Array.from(this.uploadedFunctions.values()).map((f) => ({
|
|
658
|
+
// IMPORTANT: For the dashboard registry, return the fully-qualified runtime name
|
|
659
|
+
// (e.g. "tasks.list") so the UI can call it over WS without guessing module prefixes.
|
|
660
|
+
name: f.fullName,
|
|
661
|
+
fullName: f.fullName,
|
|
662
|
+
type: f.type,
|
|
663
|
+
filePath: f.filePath,
|
|
664
|
+
// Best-effort: attach the Zod args object (when present) so the dashboard can scaffold JSON args.
|
|
665
|
+
// This is derived from the exported FunctionDefinition object loaded during deploy.
|
|
666
|
+
args: f.args,
|
|
667
|
+
}));
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* List all registered HTTP routes and webhooks with detailed metadata
|
|
671
|
+
*/
|
|
672
|
+
listHttpRoutes() {
|
|
673
|
+
return Array.from(this.uploadedHttpRoutes.entries()).map(([key, route]) => {
|
|
674
|
+
const [moduleName, exportName] = key.split(":");
|
|
675
|
+
return {
|
|
676
|
+
path: route.path,
|
|
677
|
+
method: route.type === "webhook" ? (route.method ?? "POST") : route.method,
|
|
678
|
+
type: route.type,
|
|
679
|
+
auth: route.auth,
|
|
680
|
+
exportName,
|
|
681
|
+
moduleName,
|
|
682
|
+
permissions: route.type === "http" ? (route.permissions ?? undefined) : undefined,
|
|
683
|
+
};
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* List all registered RPC procedures with detailed metadata
|
|
688
|
+
*/
|
|
689
|
+
listRpcRoutes() {
|
|
690
|
+
return Array.from(this.uploadedRpcRoutes.entries()).map(([key, route]) => {
|
|
691
|
+
const [moduleName, exportName] = key.split(":");
|
|
692
|
+
return {
|
|
693
|
+
name: exportName,
|
|
694
|
+
namespace: moduleName,
|
|
695
|
+
fullName: `${moduleName}.${exportName}`,
|
|
696
|
+
procedureType: route.procedureType,
|
|
697
|
+
auth: route.auth,
|
|
698
|
+
exportName,
|
|
699
|
+
moduleName,
|
|
700
|
+
permissions: route.permissions,
|
|
701
|
+
};
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
// --- New Deployment History Methods ---
|
|
705
|
+
async listDeployments() {
|
|
706
|
+
return this.persistence.listHistory();
|
|
707
|
+
}
|
|
708
|
+
async getDeployment(id) {
|
|
709
|
+
return this.persistence.getHistory(id);
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Get manifest of current deployment (file paths and hashes)
|
|
713
|
+
*/
|
|
714
|
+
getManifest() {
|
|
715
|
+
const currentState = this.persistence.loadSync();
|
|
716
|
+
if (!currentState) {
|
|
717
|
+
return {};
|
|
718
|
+
}
|
|
719
|
+
const manifest = {};
|
|
720
|
+
for (const file of currentState.files) {
|
|
721
|
+
manifest[file.filePath] = this.hashString(file.code.trim());
|
|
722
|
+
}
|
|
723
|
+
return manifest;
|
|
724
|
+
}
|
|
725
|
+
async getDeploymentDiff(id, baseId) {
|
|
726
|
+
const target = await this.persistence.getHistory(id);
|
|
727
|
+
if (!target)
|
|
728
|
+
return null;
|
|
729
|
+
let base = null;
|
|
730
|
+
if (baseId) {
|
|
731
|
+
base = await this.persistence.getHistory(baseId);
|
|
732
|
+
}
|
|
733
|
+
else {
|
|
734
|
+
// If no base specified, try to find the one immediately before 'id'
|
|
735
|
+
// This is naive and assumes listHistory is ordered.
|
|
736
|
+
const history = await this.persistence.listHistory();
|
|
737
|
+
const idx = history.findIndex((d) => d.id === id);
|
|
738
|
+
if (idx !== -1 && idx < history.length - 1) {
|
|
739
|
+
base = await this.persistence.getHistory(history[idx + 1].id);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
if (!base) {
|
|
743
|
+
// First deployment: everything is added
|
|
744
|
+
return target.files.map((f) => ({
|
|
745
|
+
filePath: f.filePath,
|
|
746
|
+
status: "added",
|
|
747
|
+
chunks: [], // Lightweight diff
|
|
748
|
+
}));
|
|
749
|
+
}
|
|
750
|
+
const baseMap = new Map(base.files.map((f) => [f.filePath, f.code]));
|
|
751
|
+
const targetMap = new Map(target.files.map((f) => [f.filePath, f.code]));
|
|
752
|
+
const diffs = [];
|
|
753
|
+
// Check for added/changed
|
|
754
|
+
for (const [path, code] of targetMap) {
|
|
755
|
+
if (!baseMap.has(path)) {
|
|
756
|
+
diffs.push({ filePath: path, status: "added" });
|
|
757
|
+
}
|
|
758
|
+
else if (baseMap.get(path) !== code) {
|
|
759
|
+
diffs.push({ filePath: path, status: "modified" });
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
// Check for removed
|
|
763
|
+
for (const [path] of baseMap) {
|
|
764
|
+
if (!targetMap.has(path)) {
|
|
765
|
+
diffs.push({ filePath: path, status: "removed" });
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
return diffs;
|
|
769
|
+
}
|
|
770
|
+
/**
|
|
771
|
+
* Handle delta deployment - only process changed files
|
|
772
|
+
* @returns Deployment result with deployment type indicator
|
|
773
|
+
*/
|
|
774
|
+
async handleDeltaDeploy(payload) {
|
|
775
|
+
// Acquire deployment lock
|
|
776
|
+
if (!(await this.acquireLock())) {
|
|
777
|
+
return {
|
|
778
|
+
success: false,
|
|
779
|
+
message: "Deployment in progress, please wait",
|
|
780
|
+
functions: 0,
|
|
781
|
+
schema: false,
|
|
782
|
+
deploymentType: "delta",
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
try {
|
|
786
|
+
// Validate payload
|
|
787
|
+
if (!payload || !payload.changes) {
|
|
788
|
+
throw new Error("Invalid delta payload: 'changes' object is missing");
|
|
789
|
+
}
|
|
790
|
+
const { added, modified, removed } = payload.changes;
|
|
791
|
+
const hasChanges = added.length > 0 || modified.length > 0 || removed.length > 0;
|
|
792
|
+
if (!hasChanges) {
|
|
793
|
+
return {
|
|
794
|
+
success: true,
|
|
795
|
+
message: "No changes to apply",
|
|
796
|
+
functions: 0,
|
|
797
|
+
schema: false,
|
|
798
|
+
deploymentType: "delta",
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
const currentState = await this.persistence.load();
|
|
802
|
+
if (!currentState) {
|
|
803
|
+
// No existing state - fall back to full deployment
|
|
804
|
+
logger_js_1.logger.log({
|
|
805
|
+
timestamp: Date.now(),
|
|
806
|
+
level: "info",
|
|
807
|
+
kind: "deployment",
|
|
808
|
+
message: "No existing state, falling back to full deployment",
|
|
809
|
+
});
|
|
810
|
+
return this.fallbackToFullDeploy(payload);
|
|
811
|
+
}
|
|
812
|
+
// Verify integrity if manifest hash provided
|
|
813
|
+
if (payload.manifestHash) {
|
|
814
|
+
const expectedHash = payload.manifestHash;
|
|
815
|
+
const computedHash = this.computeExpectedHash(currentState, payload.changes);
|
|
816
|
+
if (expectedHash !== computedHash) {
|
|
817
|
+
logger_js_1.logger.log({
|
|
818
|
+
timestamp: Date.now(),
|
|
819
|
+
level: "warn",
|
|
820
|
+
kind: "deployment",
|
|
821
|
+
message: "Manifest hash mismatch, falling back to full deployment",
|
|
822
|
+
context: { expected: expectedHash, computed: computedHash },
|
|
823
|
+
});
|
|
824
|
+
return this.fallbackToFullDeploy(payload);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
const { join } = await import("path");
|
|
828
|
+
const fs = await import("fs/promises");
|
|
829
|
+
const deployDir = join(process.cwd(), ".archlast-deploy");
|
|
830
|
+
// Track affected modules for reloading
|
|
831
|
+
const affectedModules = new Set();
|
|
832
|
+
const schemaChanged = this.checkSchemaChanged(payload.changes);
|
|
833
|
+
const diChanged = this.checkDIChanged(payload.changes);
|
|
834
|
+
const trpcRouterChanged = this.checkTrpcRouterChanged(payload.changes);
|
|
835
|
+
// Apply removals first
|
|
836
|
+
for (const filePath of removed) {
|
|
837
|
+
const fullPath = join(deployDir, filePath);
|
|
838
|
+
try {
|
|
839
|
+
await fs.rm(fullPath, { force: true });
|
|
840
|
+
affectedModules.add(this.getModuleName(filePath));
|
|
841
|
+
// Unregister functions from this file
|
|
842
|
+
await this.unregisterFunctionsFromFile(filePath);
|
|
843
|
+
logger_js_1.logger.log({
|
|
844
|
+
timestamp: Date.now(),
|
|
845
|
+
level: "info",
|
|
846
|
+
kind: "deployment",
|
|
847
|
+
message: `[Delta] Removed file: ${filePath}`,
|
|
848
|
+
});
|
|
849
|
+
}
|
|
850
|
+
catch (err) {
|
|
851
|
+
logger_js_1.logger.log({
|
|
852
|
+
timestamp: Date.now(),
|
|
853
|
+
level: "warn",
|
|
854
|
+
kind: "deployment",
|
|
855
|
+
message: `[Delta] Failed to remove file: ${filePath}`,
|
|
856
|
+
context: { err },
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
// Apply additions and modifications
|
|
861
|
+
const allChanges = [...added, ...modified];
|
|
862
|
+
for (const file of allChanges) {
|
|
863
|
+
const filePath = join(deployDir, file.filePath);
|
|
864
|
+
const fileDir = join(filePath, "..");
|
|
865
|
+
await fs.mkdir(fileDir, { recursive: true });
|
|
866
|
+
// Rewrite imports for files in src/
|
|
867
|
+
const code = file.filePath.startsWith("src/")
|
|
868
|
+
? await this.rewriteImports(file.code)
|
|
869
|
+
: file.code;
|
|
870
|
+
await Bun.write(filePath, code);
|
|
871
|
+
affectedModules.add(this.getModuleName(file.filePath));
|
|
872
|
+
logger_js_1.logger.log({
|
|
873
|
+
timestamp: Date.now(),
|
|
874
|
+
level: "info",
|
|
875
|
+
kind: "deployment",
|
|
876
|
+
message: `[Delta] ${added.includes(file) ? "Added" : "Modified"}: ${file.filePath}`,
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
// Update state in memory
|
|
880
|
+
const newState = this.applyDeltaToState(currentState, payload.changes);
|
|
881
|
+
// Incremental reload of affected modules
|
|
882
|
+
let functionsRegistered = 0;
|
|
883
|
+
// Reload DI if changed
|
|
884
|
+
if (diChanged) {
|
|
885
|
+
const diFile = newState.files.find((f) => f.filePath.endsWith("_generated/di.ts") ||
|
|
886
|
+
f.filePath.endsWith("_generated/di.js"));
|
|
887
|
+
if (diFile) {
|
|
888
|
+
try {
|
|
889
|
+
const diPath = join(deployDir, diFile.filePath);
|
|
890
|
+
const diMod = await import(diPath + `?t=${Date.now()}`);
|
|
891
|
+
if (diMod && typeof diMod.registerProviders === "function") {
|
|
892
|
+
const { globalContainer } = await import("../di/container.js");
|
|
893
|
+
diMod.registerProviders(globalContainer);
|
|
894
|
+
logger_js_1.logger.log({
|
|
895
|
+
timestamp: Date.now(),
|
|
896
|
+
level: "info",
|
|
897
|
+
kind: "deployment",
|
|
898
|
+
message: "[Delta] Re-registered DI providers",
|
|
899
|
+
});
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
catch (err) {
|
|
903
|
+
logger_js_1.logger.log({
|
|
904
|
+
timestamp: Date.now(),
|
|
905
|
+
level: "error",
|
|
906
|
+
kind: "deployment",
|
|
907
|
+
message: "[Delta] Failed to re-register DI providers",
|
|
908
|
+
context: { err },
|
|
909
|
+
});
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
// Reload tRPC router if changed
|
|
914
|
+
if (trpcRouterChanged) {
|
|
915
|
+
const trpcRouterFile = newState.files.find((f) => f.filePath.endsWith("_generated/trpc-router.ts") ||
|
|
916
|
+
f.filePath.endsWith("_generated/trpc-router.js"));
|
|
917
|
+
if (trpcRouterFile) {
|
|
918
|
+
try {
|
|
919
|
+
const routerPath = join(deployDir, trpcRouterFile.filePath);
|
|
920
|
+
const routerMod = await import(routerPath + `?t=${Date.now()}`);
|
|
921
|
+
if (routerMod && routerMod.appRouter) {
|
|
922
|
+
this.rpcRouter = routerMod.appRouter;
|
|
923
|
+
logger_js_1.logger.log({
|
|
924
|
+
timestamp: Date.now(),
|
|
925
|
+
level: "info",
|
|
926
|
+
kind: "deployment",
|
|
927
|
+
message: "[Delta] Reloaded static tRPC appRouter from trpc-router.ts",
|
|
928
|
+
});
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
catch (err) {
|
|
932
|
+
logger_js_1.logger.log({
|
|
933
|
+
timestamp: Date.now(),
|
|
934
|
+
level: "error",
|
|
935
|
+
kind: "deployment",
|
|
936
|
+
message: "[Delta] Failed to reload tRPC router",
|
|
937
|
+
context: { err },
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
// Reload schema if changed
|
|
943
|
+
if (schemaChanged) {
|
|
944
|
+
const schemaFile = newState.files.find((f) => f.filePath.endsWith("schema.ts"));
|
|
945
|
+
if (schemaFile) {
|
|
946
|
+
try {
|
|
947
|
+
const schemaPath = join(deployDir, schemaFile.filePath);
|
|
948
|
+
const mod = await import(schemaPath + `?t=${Date.now()}`);
|
|
949
|
+
if (mod.default && mod.default.tables) {
|
|
950
|
+
const mergedSchema = {
|
|
951
|
+
...mod.default,
|
|
952
|
+
tables: {
|
|
953
|
+
...(mod.default.tables ?? {}),
|
|
954
|
+
...schema_js_1.authSchema.tables,
|
|
955
|
+
},
|
|
956
|
+
};
|
|
957
|
+
this.uploadedSchema = mergedSchema;
|
|
958
|
+
await this.db.applySchema(mergedSchema);
|
|
959
|
+
logger_js_1.logger.log({
|
|
960
|
+
timestamp: Date.now(),
|
|
961
|
+
level: "info",
|
|
962
|
+
kind: "deployment",
|
|
963
|
+
message: "[Delta] Schema reloaded",
|
|
964
|
+
});
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
catch (err) {
|
|
968
|
+
logger_js_1.logger.log({
|
|
969
|
+
timestamp: Date.now(),
|
|
970
|
+
level: "error",
|
|
971
|
+
kind: "deployment",
|
|
972
|
+
message: "[Delta] Failed to reload schema",
|
|
973
|
+
context: { err },
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
// Reload affected modules
|
|
979
|
+
for (const moduleName of affectedModules) {
|
|
980
|
+
const files = newState.files.filter((f) => this.getModuleName(f.filePath) === moduleName);
|
|
981
|
+
for (const file of files) {
|
|
982
|
+
if (file.filePath.endsWith("schema.ts") ||
|
|
983
|
+
file.filePath.includes("_generated/")) {
|
|
984
|
+
continue; // Already handled
|
|
985
|
+
}
|
|
986
|
+
const fullPath = join(deployDir, file.filePath);
|
|
987
|
+
const hasFunctions = /export\s+(?:const|let)\s+\w+\s*=\s*(?:query|mutation|action|http\.(?:get|post|put|patch|delete)|webhook|rpc\.(?:query|mutation))\s*\(/g.test(file.code);
|
|
988
|
+
if (hasFunctions) {
|
|
989
|
+
try {
|
|
990
|
+
const mod = await import(fullPath + `?t=${Date.now()}`);
|
|
991
|
+
// Unregister old functions from this module
|
|
992
|
+
await this.unregisterFunctionsFromFile(file.filePath);
|
|
993
|
+
// Register new functions
|
|
994
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
995
|
+
if ((0, definition_js_1.isHttpDefinition)(value) || (0, definition_js_1.isWebhookDefinition)(value)) {
|
|
996
|
+
const routeKey = `${moduleName}:${key}`;
|
|
997
|
+
this.uploadedHttpRoutes.set(routeKey, value);
|
|
998
|
+
if (this.httpRouter) {
|
|
999
|
+
this.httpRouter.register(value);
|
|
1000
|
+
}
|
|
1001
|
+
continue;
|
|
1002
|
+
}
|
|
1003
|
+
if ((0, definition_js_1.isRpcDefinition)(value)) {
|
|
1004
|
+
const routeKey = `${moduleName}:${key}`;
|
|
1005
|
+
this.uploadedRpcRoutes.set(routeKey, value);
|
|
1006
|
+
if (this.rpcRouter) {
|
|
1007
|
+
this.rpcRouter.register(moduleName, key, value);
|
|
1008
|
+
}
|
|
1009
|
+
continue;
|
|
1010
|
+
}
|
|
1011
|
+
if (value &&
|
|
1012
|
+
typeof value === "object" &&
|
|
1013
|
+
"type" in value &&
|
|
1014
|
+
"handler" in value) {
|
|
1015
|
+
const fnName = `${moduleName}.${key}`;
|
|
1016
|
+
this.engine.registerFunction(fnName, value);
|
|
1017
|
+
this.uploadedFunctions.set(`${moduleName}:${key}`, {
|
|
1018
|
+
name: key,
|
|
1019
|
+
type: value.type,
|
|
1020
|
+
filePath: fullPath,
|
|
1021
|
+
fullName: fnName,
|
|
1022
|
+
args: value.args,
|
|
1023
|
+
timestamp: payload.timestamp,
|
|
1024
|
+
});
|
|
1025
|
+
functionsRegistered++;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
catch (err) {
|
|
1030
|
+
logger_js_1.logger.log({
|
|
1031
|
+
timestamp: Date.now(),
|
|
1032
|
+
level: "error",
|
|
1033
|
+
kind: "deployment",
|
|
1034
|
+
message: `[Delta] Failed to reload module: ${moduleName}`,
|
|
1035
|
+
context: { err },
|
|
1036
|
+
});
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
// Clean up empty directories
|
|
1042
|
+
await this.cleanEmptyDirs(deployDir);
|
|
1043
|
+
// Save updated state
|
|
1044
|
+
await this.persistence.save(newState);
|
|
1045
|
+
await this.persistence.saveHistory({ ...newState, lastDeployment: payload.timestamp }, {
|
|
1046
|
+
timestamp: payload.timestamp,
|
|
1047
|
+
functionCount: functionsRegistered,
|
|
1048
|
+
schemaChanged,
|
|
1049
|
+
hash: this.hashString(JSON.stringify(newState)),
|
|
1050
|
+
});
|
|
1051
|
+
// Broadcast notification
|
|
1052
|
+
try {
|
|
1053
|
+
const { broadcastNotification } = await import("../functions/built-in/system-notifications.js");
|
|
1054
|
+
broadcastNotification({
|
|
1055
|
+
title: "Delta Deployment Complete",
|
|
1056
|
+
description: `${functionsRegistered} function(s) updated${schemaChanged ? ", schema updated" : ""}`,
|
|
1057
|
+
type: "success",
|
|
1058
|
+
data: {
|
|
1059
|
+
functionCount: functionsRegistered,
|
|
1060
|
+
schemaChanged,
|
|
1061
|
+
added: added.length,
|
|
1062
|
+
modified: modified.length,
|
|
1063
|
+
removed: removed.length,
|
|
1064
|
+
timestamp: payload.timestamp,
|
|
1065
|
+
},
|
|
1066
|
+
});
|
|
1067
|
+
}
|
|
1068
|
+
catch (err) {
|
|
1069
|
+
// Ignore notification errors
|
|
1070
|
+
}
|
|
1071
|
+
// Emit deployment complete event for reactive CLI
|
|
1072
|
+
(0, deployment_events_controller_js_1.emitDeploymentComplete)("delta");
|
|
1073
|
+
setTimeout(() => {
|
|
1074
|
+
logger_js_1.logger.log({
|
|
1075
|
+
timestamp: Date.now(),
|
|
1076
|
+
level: "info",
|
|
1077
|
+
kind: "deployment",
|
|
1078
|
+
message: "Restarting server after delta deployment...",
|
|
1079
|
+
});
|
|
1080
|
+
process.exit(0);
|
|
1081
|
+
}, 200);
|
|
1082
|
+
return {
|
|
1083
|
+
success: true,
|
|
1084
|
+
message: `Delta deployment successful: ${added.length} added, ${modified.length} modified, ${removed.length} removed`,
|
|
1085
|
+
functions: functionsRegistered,
|
|
1086
|
+
schema: schemaChanged,
|
|
1087
|
+
deploymentType: "delta",
|
|
1088
|
+
};
|
|
1089
|
+
}
|
|
1090
|
+
catch (error) {
|
|
1091
|
+
logger_js_1.logger.log({
|
|
1092
|
+
timestamp: Date.now(),
|
|
1093
|
+
level: "error",
|
|
1094
|
+
kind: "deployment",
|
|
1095
|
+
message: "Delta deployment failed",
|
|
1096
|
+
context: { error },
|
|
1097
|
+
});
|
|
1098
|
+
return {
|
|
1099
|
+
success: false,
|
|
1100
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
1101
|
+
functions: 0,
|
|
1102
|
+
schema: false,
|
|
1103
|
+
deploymentType: "delta",
|
|
1104
|
+
};
|
|
1105
|
+
}
|
|
1106
|
+
finally {
|
|
1107
|
+
// Always release the lock
|
|
1108
|
+
this.releaseLock();
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
/**
|
|
1112
|
+
* Apply delta changes to deployment state
|
|
1113
|
+
*/
|
|
1114
|
+
applyDeltaToState(currentState, changes) {
|
|
1115
|
+
const fileMap = new Map(currentState.files.map((f) => [f.filePath, f]));
|
|
1116
|
+
// Remove files
|
|
1117
|
+
for (const filePath of changes.removed) {
|
|
1118
|
+
fileMap.delete(filePath);
|
|
1119
|
+
}
|
|
1120
|
+
// Add or update files
|
|
1121
|
+
const allChanges = [...changes.added, ...changes.modified];
|
|
1122
|
+
for (const file of allChanges) {
|
|
1123
|
+
fileMap.set(file.filePath, { filePath: file.filePath, code: file.code });
|
|
1124
|
+
}
|
|
1125
|
+
return {
|
|
1126
|
+
files: Array.from(fileMap.values()),
|
|
1127
|
+
lastDeployment: Date.now(),
|
|
1128
|
+
};
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Check if schema file changed
|
|
1132
|
+
*/
|
|
1133
|
+
checkSchemaChanged(changes) {
|
|
1134
|
+
const allFiles = [...changes.added, ...changes.modified];
|
|
1135
|
+
return allFiles.some((f) => f.filePath.endsWith("schema.ts"));
|
|
1136
|
+
}
|
|
1137
|
+
/**
|
|
1138
|
+
* Check if DI file changed
|
|
1139
|
+
*/
|
|
1140
|
+
checkDIChanged(changes) {
|
|
1141
|
+
const allFiles = [...changes.added, ...changes.modified];
|
|
1142
|
+
return allFiles.some((f) => f.filePath.endsWith("_generated/di.ts") || f.filePath.endsWith("_generated/di.js"));
|
|
1143
|
+
}
|
|
1144
|
+
/**
|
|
1145
|
+
* Check if tRPC router file changed
|
|
1146
|
+
*/
|
|
1147
|
+
checkTrpcRouterChanged(changes) {
|
|
1148
|
+
const allFiles = [...changes.added, ...changes.modified];
|
|
1149
|
+
return allFiles.some((f) => f.filePath.endsWith("_generated/trpc-router.ts") ||
|
|
1150
|
+
f.filePath.endsWith("_generated/trpc-router.js"));
|
|
1151
|
+
}
|
|
1152
|
+
/**
|
|
1153
|
+
* Get module name from file path
|
|
1154
|
+
*/
|
|
1155
|
+
getModuleName(filePath) {
|
|
1156
|
+
const parts = filePath.split(/[\\/]/);
|
|
1157
|
+
const fileName = parts[parts.length - 1];
|
|
1158
|
+
return fileName.replace(/\.(ts|js)$/, "");
|
|
1159
|
+
}
|
|
1160
|
+
/**
|
|
1161
|
+
* Unregister functions from a specific file
|
|
1162
|
+
*/
|
|
1163
|
+
async unregisterFunctionsFromFile(filePath) {
|
|
1164
|
+
const moduleName = this.getModuleName(filePath);
|
|
1165
|
+
// Find and remove functions registered from this file
|
|
1166
|
+
for (const [key, value] of this.uploadedFunctions.entries()) {
|
|
1167
|
+
if (value.filePath.endsWith(filePath)) {
|
|
1168
|
+
this.engine.unregisterFunction(value.fullName);
|
|
1169
|
+
this.uploadedFunctions.delete(key);
|
|
1170
|
+
logger_js_1.logger.log({
|
|
1171
|
+
timestamp: Date.now(),
|
|
1172
|
+
level: "info",
|
|
1173
|
+
kind: "deployment",
|
|
1174
|
+
message: `[Delta] Unregistered function: ${value.fullName}`,
|
|
1175
|
+
});
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
// Remove HTTP routes from this module
|
|
1179
|
+
const routesToRemove = [];
|
|
1180
|
+
for (const [key] of this.uploadedHttpRoutes.entries()) {
|
|
1181
|
+
if (key.startsWith(`${moduleName}:`)) {
|
|
1182
|
+
routesToRemove.push(key);
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
for (const key of routesToRemove) {
|
|
1186
|
+
const value = this.uploadedHttpRoutes.get(key);
|
|
1187
|
+
if (value) {
|
|
1188
|
+
// Remove from our tracking
|
|
1189
|
+
this.uploadedHttpRoutes.delete(key);
|
|
1190
|
+
// Note: HttpRouter doesn't support unregister, so we need to clear and reload all routes
|
|
1191
|
+
// This will be handled by the caller via a full route reload if needed
|
|
1192
|
+
logger_js_1.logger.log({
|
|
1193
|
+
timestamp: Date.now(),
|
|
1194
|
+
level: "info",
|
|
1195
|
+
kind: "deployment",
|
|
1196
|
+
message: `[Delta] Removed route from tracking: ${value.path}`,
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
// Remove RPC routes from this module
|
|
1201
|
+
const rpcRoutesToRemove = [];
|
|
1202
|
+
for (const [key] of this.uploadedRpcRoutes.entries()) {
|
|
1203
|
+
if (key.startsWith(`${moduleName}:`)) {
|
|
1204
|
+
rpcRoutesToRemove.push(key);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
for (const key of rpcRoutesToRemove) {
|
|
1208
|
+
const value = this.uploadedRpcRoutes.get(key);
|
|
1209
|
+
if (value && this.rpcRouter) {
|
|
1210
|
+
this.rpcRouter.unregister(moduleName, key.split(":")[1]);
|
|
1211
|
+
this.uploadedRpcRoutes.delete(key);
|
|
1212
|
+
logger_js_1.logger.log({
|
|
1213
|
+
timestamp: Date.now(),
|
|
1214
|
+
level: "info",
|
|
1215
|
+
kind: "deployment",
|
|
1216
|
+
message: `[Delta] Unregistered RPC procedure: ${moduleName}.${key.split(":")[1]}`,
|
|
1217
|
+
});
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
/**
|
|
1222
|
+
* Compute expected hash after applying delta
|
|
1223
|
+
*/
|
|
1224
|
+
computeExpectedHash(currentState, changes) {
|
|
1225
|
+
const newState = this.applyDeltaToState(currentState, changes);
|
|
1226
|
+
const filesHashStr = newState.files
|
|
1227
|
+
.sort((a, b) => a.filePath.localeCompare(b.filePath))
|
|
1228
|
+
.map((f) => `${f.filePath}:${this.hashString(f.code.trim())}`)
|
|
1229
|
+
.join(";");
|
|
1230
|
+
return this.hashString(filesHashStr);
|
|
1231
|
+
}
|
|
1232
|
+
/**
|
|
1233
|
+
* Fall back to full deployment when delta is not possible
|
|
1234
|
+
*/
|
|
1235
|
+
async fallbackToFullDeploy(deltaPayload) {
|
|
1236
|
+
// Reconstruct full payload from current state + delta
|
|
1237
|
+
const currentState = await this.persistence.load();
|
|
1238
|
+
const fullPayload = {
|
|
1239
|
+
timestamp: deltaPayload.timestamp,
|
|
1240
|
+
files: [],
|
|
1241
|
+
};
|
|
1242
|
+
if (currentState) {
|
|
1243
|
+
// Start with existing files
|
|
1244
|
+
fullPayload.files = [...currentState.files];
|
|
1245
|
+
}
|
|
1246
|
+
// Apply delta to reconstruct full state
|
|
1247
|
+
const fileMap = new Map(fullPayload.files.map((f) => [f.filePath, f]));
|
|
1248
|
+
// Remove deleted files
|
|
1249
|
+
for (const filePath of deltaPayload.changes.removed) {
|
|
1250
|
+
fileMap.delete(filePath);
|
|
1251
|
+
}
|
|
1252
|
+
// Add/update files
|
|
1253
|
+
for (const file of [...deltaPayload.changes.added, ...deltaPayload.changes.modified]) {
|
|
1254
|
+
fileMap.set(file.filePath, { filePath: file.filePath, code: file.code });
|
|
1255
|
+
}
|
|
1256
|
+
fullPayload.files = Array.from(fileMap.values());
|
|
1257
|
+
// Delegate to existing full deploy handler
|
|
1258
|
+
const result = await this.handleDeploy(fullPayload);
|
|
1259
|
+
return {
|
|
1260
|
+
...result,
|
|
1261
|
+
deploymentType: "full",
|
|
1262
|
+
};
|
|
1263
|
+
}
|
|
1264
|
+
/**
|
|
1265
|
+
* Get schema source code from current deployment
|
|
1266
|
+
*/
|
|
1267
|
+
getSchemaSource() {
|
|
1268
|
+
const currentState = this.persistence.loadSync();
|
|
1269
|
+
if (!currentState)
|
|
1270
|
+
return null;
|
|
1271
|
+
const schemaFile = currentState.files.find((f) => f.filePath === "src/schema.ts");
|
|
1272
|
+
if (!schemaFile)
|
|
1273
|
+
return null;
|
|
1274
|
+
return {
|
|
1275
|
+
source: schemaFile.code,
|
|
1276
|
+
filePath: schemaFile.filePath,
|
|
1277
|
+
};
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Update schema with validation and hot reload
|
|
1281
|
+
*/
|
|
1282
|
+
async updateSchema(source) {
|
|
1283
|
+
try {
|
|
1284
|
+
const currentState = this.persistence.loadSync();
|
|
1285
|
+
if (!currentState) {
|
|
1286
|
+
return {
|
|
1287
|
+
success: false,
|
|
1288
|
+
errors: [{ line: 0, column: 0, message: "No deployment found" }],
|
|
1289
|
+
};
|
|
1290
|
+
}
|
|
1291
|
+
const schemaFile = currentState.files.find((f) => f.filePath === "src/schema.ts");
|
|
1292
|
+
if (!schemaFile) {
|
|
1293
|
+
return {
|
|
1294
|
+
success: false,
|
|
1295
|
+
errors: [
|
|
1296
|
+
{ line: 0, column: 0, message: "Schema file not found in deployment" },
|
|
1297
|
+
],
|
|
1298
|
+
};
|
|
1299
|
+
}
|
|
1300
|
+
const { join } = await import("path");
|
|
1301
|
+
const fs = await import("fs/promises");
|
|
1302
|
+
const deployDir = join(process.cwd(), ".archlast-deploy");
|
|
1303
|
+
const schemaPath = join(deployDir, "src/schema.ts");
|
|
1304
|
+
const rewrittenSource = await this.rewriteImports(source);
|
|
1305
|
+
await Bun.write(schemaPath, rewrittenSource);
|
|
1306
|
+
const errors = [];
|
|
1307
|
+
try {
|
|
1308
|
+
const mod = await import(schemaPath + `?t=${Date.now()}`);
|
|
1309
|
+
if (!mod.default || !mod.default.tables) {
|
|
1310
|
+
errors.push({
|
|
1311
|
+
line: 0,
|
|
1312
|
+
column: 0,
|
|
1313
|
+
message: "Schema must export default with tables",
|
|
1314
|
+
});
|
|
1315
|
+
}
|
|
1316
|
+
else {
|
|
1317
|
+
const tables = mod.default.tables;
|
|
1318
|
+
for (const [tableName, tableDef] of Object.entries(tables)) {
|
|
1319
|
+
if (!tableDef || typeof tableDef !== "object") {
|
|
1320
|
+
errors.push({
|
|
1321
|
+
line: 0,
|
|
1322
|
+
column: 0,
|
|
1323
|
+
message: `Table "${tableName}" is not a valid table definition`,
|
|
1324
|
+
});
|
|
1325
|
+
continue;
|
|
1326
|
+
}
|
|
1327
|
+
if (!tableDef.schema ||
|
|
1328
|
+
typeof tableDef.schema !== "object") {
|
|
1329
|
+
errors.push({
|
|
1330
|
+
line: 0,
|
|
1331
|
+
column: 0,
|
|
1332
|
+
message: `Table "${tableName}" missing schema definition`,
|
|
1333
|
+
});
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
catch (parseError) {
|
|
1339
|
+
const errorStr = String(parseError);
|
|
1340
|
+
const lineMatch = errorStr.match(/:(\d+):(\d+)/);
|
|
1341
|
+
if (lineMatch) {
|
|
1342
|
+
errors.push({
|
|
1343
|
+
line: parseInt(lineMatch[1], 10),
|
|
1344
|
+
column: parseInt(lineMatch[2], 10),
|
|
1345
|
+
message: errorStr.split("\n").pop() || "Parse error",
|
|
1346
|
+
});
|
|
1347
|
+
}
|
|
1348
|
+
else {
|
|
1349
|
+
errors.push({ line: 0, column: 0, message: errorStr });
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
if (errors.length > 0) {
|
|
1353
|
+
return { success: false, errors };
|
|
1354
|
+
}
|
|
1355
|
+
const newState = {
|
|
1356
|
+
...currentState,
|
|
1357
|
+
files: currentState.files.map((f) => f.filePath === "src/schema.ts" ? { ...f, code: source } : f),
|
|
1358
|
+
};
|
|
1359
|
+
await this.persistence.save(newState);
|
|
1360
|
+
const mod = await import(schemaPath + `?t=${Date.now()}`);
|
|
1361
|
+
if (mod.default && mod.default.tables) {
|
|
1362
|
+
const mergedSchema = {
|
|
1363
|
+
...mod.default,
|
|
1364
|
+
tables: {
|
|
1365
|
+
...(mod.default.tables ?? {}),
|
|
1366
|
+
...schema_js_1.authSchema.tables,
|
|
1367
|
+
},
|
|
1368
|
+
};
|
|
1369
|
+
this.uploadedSchema = mergedSchema;
|
|
1370
|
+
await this.db.applySchema(mergedSchema);
|
|
1371
|
+
}
|
|
1372
|
+
return { success: true };
|
|
1373
|
+
}
|
|
1374
|
+
catch (error) {
|
|
1375
|
+
return {
|
|
1376
|
+
success: false,
|
|
1377
|
+
errors: [
|
|
1378
|
+
{
|
|
1379
|
+
line: 0,
|
|
1380
|
+
column: 0,
|
|
1381
|
+
message: error instanceof Error ? error.message : String(error),
|
|
1382
|
+
},
|
|
1383
|
+
],
|
|
1384
|
+
};
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
/**
|
|
1388
|
+
* Get deployment files for CLI pull
|
|
1389
|
+
*/
|
|
1390
|
+
getDeploymentFiles(filePaths) {
|
|
1391
|
+
const currentState = this.persistence.loadSync();
|
|
1392
|
+
if (!currentState)
|
|
1393
|
+
return [];
|
|
1394
|
+
const filesToReturn = filePaths
|
|
1395
|
+
? currentState.files.filter((f) => filePaths.includes(f.filePath))
|
|
1396
|
+
: currentState.files;
|
|
1397
|
+
return filesToReturn.map((f) => ({
|
|
1398
|
+
filePath: f.filePath,
|
|
1399
|
+
code: f.code,
|
|
1400
|
+
}));
|
|
1401
|
+
}
|
|
1402
|
+
/**
|
|
1403
|
+
* Get pull metadata for smart diff detection
|
|
1404
|
+
* @param localHashes Optional map of local file hashes from CLI
|
|
1405
|
+
* @returns Pull metadata with change information
|
|
1406
|
+
*/
|
|
1407
|
+
getPullMetadata(localHashes) {
|
|
1408
|
+
return this.persistence.computePullMetadata(localHashes);
|
|
1409
|
+
}
|
|
1410
|
+
/**
|
|
1411
|
+
* Extract function and schema metadata from deployment files
|
|
1412
|
+
* @param files Deployment files
|
|
1413
|
+
* @param timestamp Deployment timestamp
|
|
1414
|
+
* @returns Object containing functions and schema metadata
|
|
1415
|
+
*/
|
|
1416
|
+
extractDeploymentMetadata(files, timestamp) {
|
|
1417
|
+
const functions = [];
|
|
1418
|
+
let schema = null;
|
|
1419
|
+
for (const file of files) {
|
|
1420
|
+
// Extract functions from source files
|
|
1421
|
+
if (file.filePath.startsWith("src/") &&
|
|
1422
|
+
(file.code.includes("query(") ||
|
|
1423
|
+
file.code.includes("mutation(") ||
|
|
1424
|
+
file.code.includes("action("))) {
|
|
1425
|
+
const fileFunctions = (0, function_extractor_js_1.extractFunctionsFromSource)(file.code, file.filePath, timestamp);
|
|
1426
|
+
functions.push(...fileFunctions);
|
|
1427
|
+
}
|
|
1428
|
+
// Extract schema metadata
|
|
1429
|
+
if (file.filePath.endsWith("schema.ts")) {
|
|
1430
|
+
schema = (0, function_extractor_js_1.extractSchemaMetadata)(file.code, file.filePath, timestamp);
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
return { functions, schema };
|
|
1434
|
+
}
|
|
1435
|
+
}
|
|
1436
|
+
exports.DeploymentHandler = DeploymentHandler;
|
|
1437
|
+
//# sourceMappingURL=handler.js.map
|