@homeflare/alchemy 0.46.0 → 0.47.0
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/README.md +10 -10
- package/dist/argocd/cluster.d.ts +5 -5
- package/dist/argocd/cluster.d.ts.map +1 -1
- package/dist/argocd/fake-argocd.d.ts +1 -1
- package/dist/argocd/fake-argocd.d.ts.map +1 -1
- package/dist/argocd/index.js.map +1 -1
- package/dist/argocd/providers.d.ts +1 -1
- package/dist/argocd/providers.d.ts.map +1 -1
- package/dist/argocd/repo-creds.d.ts +5 -5
- package/dist/argocd/repo-creds.d.ts.map +1 -1
- package/dist/argocd/repository.d.ts +5 -5
- package/dist/argocd/repository.d.ts.map +1 -1
- package/dist/argocd/resource.d.ts +1 -1
- package/dist/argocd/resource.d.ts.map +1 -1
- package/dist/caddy/admin.d.ts +1 -1
- package/dist/caddy/admin.d.ts.map +1 -1
- package/dist/caddy/caddy-http-client.d.ts +2 -2
- package/dist/caddy/caddy-http-client.d.ts.map +1 -1
- package/dist/caddy/format.d.ts +1 -1
- package/dist/caddy/format.d.ts.map +1 -1
- package/dist/caddy/index.js +6 -6
- package/dist/caddy/index.js.map +4 -4
- package/dist/ceph/auth-entity.d.ts +1 -1
- package/dist/ceph/auth-entity.d.ts.map +1 -1
- package/dist/ceph/ceph-auth-reconcile.d.ts +1 -1
- package/dist/ceph/ceph-auth-reconcile.d.ts.map +1 -1
- package/dist/ceph/index.js +5 -5
- package/dist/ceph/index.js.map +4 -4
- package/dist/cloudflare/fake-mesh.d.ts +2 -2
- package/dist/cloudflare/fake-mesh.d.ts.map +1 -1
- package/dist/cloudflare/fake-r2-lock.d.ts +1 -1
- package/dist/cloudflare/fake-r2-lock.d.ts.map +1 -1
- package/dist/cloudflare/index.js +3 -3
- package/dist/cloudflare/index.js.map +3 -3
- package/dist/cloudflare/mesh-node-token.d.ts +1 -1
- package/dist/cloudflare/mesh-node-token.d.ts.map +1 -1
- package/dist/cloudflare/mesh-node.d.ts +1 -1
- package/dist/cloudflare/mesh-node.d.ts.map +1 -1
- package/dist/cloudflare/providers.d.ts +1 -1
- package/dist/cloudflare/providers.d.ts.map +1 -1
- package/dist/cloudflare/r2-bucket-lock.d.ts +1 -1
- package/dist/cloudflare/r2-bucket-lock.d.ts.map +1 -1
- package/dist/discord/application-command.d.ts +6 -6
- package/dist/discord/application-command.d.ts.map +1 -1
- package/dist/discord/fake-discord.d.ts +1 -1
- package/dist/discord/fake-discord.d.ts.map +1 -1
- package/dist/discord/guild-application-command.d.ts +6 -6
- package/dist/discord/guild-application-command.d.ts.map +1 -1
- package/dist/discord/index.js.map +1 -1
- package/dist/discord/providers.d.ts +1 -1
- package/dist/discord/providers.d.ts.map +1 -1
- package/dist/discord/resource.d.ts +1 -1
- package/dist/discord/resource.d.ts.map +1 -1
- package/dist/forgejo/branch-protection.d.ts +5 -5
- package/dist/forgejo/branch-protection.d.ts.map +1 -1
- package/dist/forgejo/fake-forgejo.d.ts +1 -1
- package/dist/forgejo/fake-forgejo.d.ts.map +1 -1
- package/dist/forgejo/index.js.map +1 -1
- package/dist/forgejo/org-actions-secrets.d.ts +5 -5
- package/dist/forgejo/org-actions-secrets.d.ts.map +1 -1
- package/dist/forgejo/org-label.d.ts +5 -5
- package/dist/forgejo/org-label.d.ts.map +1 -1
- package/dist/forgejo/org-team.d.ts +5 -5
- package/dist/forgejo/org-team.d.ts.map +1 -1
- package/dist/forgejo/repo-webhook.d.ts +5 -5
- package/dist/forgejo/repo-webhook.d.ts.map +1 -1
- package/dist/forgejo/repository.d.ts +5 -5
- package/dist/forgejo/repository.d.ts.map +1 -1
- package/dist/forgejo/resource.d.ts +1 -1
- package/dist/forgejo/resource.d.ts.map +1 -1
- package/dist/forgejo/team-member.d.ts +5 -5
- package/dist/forgejo/team-member.d.ts.map +1 -1
- package/dist/github/repository-ruleset-providers.d.ts +1 -1
- package/dist/github/repository-ruleset-providers.d.ts.map +1 -1
- package/dist/google-workspace/domain-alias.d.ts +5 -5
- package/dist/google-workspace/domain-alias.d.ts.map +1 -1
- package/dist/google-workspace/fake-google-workspace.d.ts +1 -1
- package/dist/google-workspace/fake-google-workspace.d.ts.map +1 -1
- package/dist/google-workspace/group-member.d.ts +5 -5
- package/dist/google-workspace/group-member.d.ts.map +1 -1
- package/dist/google-workspace/group.d.ts +5 -5
- package/dist/google-workspace/group.d.ts.map +1 -1
- package/dist/google-workspace/index.js.map +1 -1
- package/dist/google-workspace/org-unit.d.ts +5 -5
- package/dist/google-workspace/org-unit.d.ts.map +1 -1
- package/dist/google-workspace/providers.d.ts +1 -1
- package/dist/google-workspace/providers.d.ts.map +1 -1
- package/dist/google-workspace/resource.d.ts +1 -1
- package/dist/google-workspace/resource.d.ts.map +1 -1
- package/dist/grafana/alert-rule-group.d.ts +4 -4
- package/dist/grafana/alert-rule-group.d.ts.map +1 -1
- package/dist/grafana/contact-point.d.ts +4 -4
- package/dist/grafana/dashboard.d.ts +4 -4
- package/dist/grafana/datasource.d.ts +4 -4
- package/dist/grafana/fake-grafana.d.ts +1 -1
- package/dist/grafana/fake-grafana.d.ts.map +1 -1
- package/dist/grafana/folder.d.ts +4 -4
- package/dist/grafana/message-template.d.ts +4 -4
- package/dist/grafana/mute-timing.d.ts +4 -4
- package/dist/grafana/notification-policy.d.ts +4 -4
- package/dist/grafana/notification-policy.d.ts.map +1 -1
- package/dist/grafana/providers.d.ts +1 -1
- package/dist/grafana/providers.d.ts.map +1 -1
- package/dist/litellm/access-group.d.ts +1 -1
- package/dist/litellm/budget-operations.d.ts +1 -1
- package/dist/litellm/budget-operations.d.ts.map +1 -1
- package/dist/litellm/budget.d.ts +2 -2
- package/dist/litellm/credential-errors.d.ts +1 -1
- package/dist/litellm/credential-errors.d.ts.map +1 -1
- package/dist/litellm/credential.d.ts +1 -1
- package/dist/litellm/index.js +26 -5
- package/dist/litellm/index.js.map +8 -8
- package/dist/litellm/key-errors.d.ts +1 -1
- package/dist/litellm/key-errors.d.ts.map +1 -1
- package/dist/litellm/key.d.ts +2 -2
- package/dist/litellm/mcp-server-locate.d.ts +1 -1
- package/dist/litellm/mcp-server-locate.d.ts.map +1 -1
- package/dist/litellm/mcp-server.d.ts +2 -2
- package/dist/litellm/model-operations.d.ts +1 -1
- package/dist/litellm/model-operations.d.ts.map +1 -1
- package/dist/litellm/model.d.ts +2 -2
- package/dist/litellm/operations.d.ts +1 -1
- package/dist/litellm/operations.d.ts.map +1 -1
- package/dist/litellm/policy-attachment.d.ts +1 -1
- package/dist/litellm/policy.d.ts +1 -1
- package/dist/litellm/providers.d.ts +1 -1
- package/dist/litellm/providers.d.ts.map +1 -1
- package/dist/litellm/team-operations.d.ts +1 -1
- package/dist/litellm/team-operations.d.ts.map +1 -1
- package/dist/litellm/team.d.ts +1 -1
- package/dist/litellm/tool-policy-operations.d.ts +1 -1
- package/dist/litellm/tool-policy-operations.d.ts.map +1 -1
- package/dist/litellm/tool-policy.d.ts +1 -1
- package/dist/litellm/toolset.d.ts +1 -1
- package/dist/netbox/fake-netbox.d.ts +1 -1
- package/dist/netbox/fake-netbox.d.ts.map +1 -1
- package/dist/netbox/index.js.map +1 -1
- package/dist/netbox/prefix.d.ts +5 -5
- package/dist/netbox/prefix.d.ts.map +1 -1
- package/dist/netbox/resource.d.ts +1 -1
- package/dist/netbox/resource.d.ts.map +1 -1
- package/dist/openbao/approle-login.d.ts +1 -1
- package/dist/openbao/approle-login.d.ts.map +1 -1
- package/dist/openbao/auth-method-reconcile.d.ts +1 -1
- package/dist/openbao/auth-method-reconcile.d.ts.map +1 -1
- package/dist/openbao/auth-method-wire.d.ts +4 -4
- package/dist/openbao/auth-method-wire.d.ts.map +1 -1
- package/dist/openbao/auth-method.d.ts +1 -1
- package/dist/openbao/auth-method.d.ts.map +1 -1
- package/dist/openbao/auth-role-identity.d.ts +1 -1
- package/dist/openbao/auth-role-identity.d.ts.map +1 -1
- package/dist/openbao/auth-role-wire.d.ts +4 -4
- package/dist/openbao/auth-role-wire.d.ts.map +1 -1
- package/dist/openbao/auth-role.d.ts +1 -1
- package/dist/openbao/auth-role.d.ts.map +1 -1
- package/dist/openbao/bao-http.d.ts +1 -1
- package/dist/openbao/bao-http.d.ts.map +1 -1
- package/dist/openbao/bao-identity.d.ts +1 -1
- package/dist/openbao/bao-identity.d.ts.map +1 -1
- package/dist/openbao/cloudflare-permission-groups.d.ts +1 -1
- package/dist/openbao/cloudflare-permission-groups.d.ts.map +1 -1
- package/dist/openbao/cloudflare-role-wire.d.ts +1 -1
- package/dist/openbao/cloudflare-role-wire.d.ts.map +1 -1
- package/dist/openbao/cloudflare-role.d.ts +1 -1
- package/dist/openbao/cloudflare-role.d.ts.map +1 -1
- package/dist/openbao/distilled.d.ts +1 -1
- package/dist/openbao/distilled.d.ts.map +1 -1
- package/dist/openbao/fake-bao.d.ts +1 -1
- package/dist/openbao/fake-bao.d.ts.map +1 -1
- package/dist/openbao/fake-core.d.ts +1 -1
- package/dist/openbao/fake-core.d.ts.map +1 -1
- package/dist/openbao/fake-engines.d.ts +1 -1
- package/dist/openbao/fake-engines.d.ts.map +1 -1
- package/dist/openbao/fake-families.d.ts +2 -2
- package/dist/openbao/fake-families.d.ts.map +1 -1
- package/dist/openbao/fake-stack.d.ts +5 -0
- package/dist/openbao/fake-stack.d.ts.map +1 -1
- package/dist/openbao/forgejo-bootstrap.d.ts +1 -1
- package/dist/openbao/forgejo-bootstrap.d.ts.map +1 -1
- package/dist/openbao/index.js +31 -10
- package/dist/openbao/index.js.map +31 -31
- package/dist/openbao/jwt-config.d.ts +1 -1
- package/dist/openbao/jwt-config.d.ts.map +1 -1
- package/dist/openbao/jwt-role.d.ts +1 -1
- package/dist/openbao/jwt-role.d.ts.map +1 -1
- package/dist/openbao/kubernetes-role.d.ts +1 -1
- package/dist/openbao/kubernetes-role.d.ts.map +1 -1
- package/dist/openbao/mfa-enforcement.d.ts +1 -1
- package/dist/openbao/mfa-enforcement.d.ts.map +1 -1
- package/dist/openbao/mfa-totp.d.ts +1 -1
- package/dist/openbao/mfa-totp.d.ts.map +1 -1
- package/dist/openbao/mfa-wire.d.ts +1 -1
- package/dist/openbao/mfa-wire.d.ts.map +1 -1
- package/dist/openbao/mount-move.d.ts +1 -1
- package/dist/openbao/mount-move.d.ts.map +1 -1
- package/dist/openbao/mount-reconcile.d.ts +1 -1
- package/dist/openbao/mount-reconcile.d.ts.map +1 -1
- package/dist/openbao/mount-wire.d.ts +4 -4
- package/dist/openbao/mount-wire.d.ts.map +1 -1
- package/dist/openbao/mount.d.ts +1 -1
- package/dist/openbao/mount.d.ts.map +1 -1
- package/dist/openbao/pki-role.d.ts +1 -1
- package/dist/openbao/pki-role.d.ts.map +1 -1
- package/dist/openbao/plugin-reconcile.d.ts +1 -1
- package/dist/openbao/plugin-reconcile.d.ts.map +1 -1
- package/dist/openbao/plugin-wire.d.ts +1 -1
- package/dist/openbao/plugin-wire.d.ts.map +1 -1
- package/dist/openbao/plugin.d.ts +1 -1
- package/dist/openbao/plugin.d.ts.map +1 -1
- package/dist/openbao/policy-identity.d.ts +1 -1
- package/dist/openbao/policy-identity.d.ts.map +1 -1
- package/dist/openbao/policy-wire.d.ts +4 -4
- package/dist/openbao/policy-wire.d.ts.map +1 -1
- package/dist/openbao/policy.d.ts +1 -1
- package/dist/openbao/policy.d.ts.map +1 -1
- package/dist/openbao/proxmox-role-wire.d.ts +1 -1
- package/dist/openbao/proxmox-role-wire.d.ts.map +1 -1
- package/dist/openbao/proxmox-role.d.ts +1 -1
- package/dist/openbao/proxmox-role.d.ts.map +1 -1
- package/dist/openbao/remount-wire.d.ts +1 -1
- package/dist/openbao/remount-wire.d.ts.map +1 -1
- package/dist/openbao/rename-identity.d.ts +1 -1
- package/dist/openbao/rename-identity.d.ts.map +1 -1
- package/dist/openbao/rename.d.ts +1 -1
- package/dist/openbao/rename.d.ts.map +1 -1
- package/dist/openbao/role-reconcile.d.ts +1 -1
- package/dist/openbao/role-reconcile.d.ts.map +1 -1
- package/dist/openbao/ssh-role.d.ts +1 -1
- package/dist/openbao/ssh-role.d.ts.map +1 -1
- package/dist/opnsense/alias.d.ts +5 -5
- package/dist/opnsense/alias.d.ts.map +1 -1
- package/dist/opnsense/category.d.ts +5 -5
- package/dist/opnsense/category.d.ts.map +1 -1
- package/dist/opnsense/fake-opnsense.d.ts +1 -1
- package/dist/opnsense/fake-opnsense.d.ts.map +1 -1
- package/dist/opnsense/group.d.ts +5 -5
- package/dist/opnsense/group.d.ts.map +1 -1
- package/dist/opnsense/index.js.map +1 -1
- package/dist/opnsense/providers.d.ts +1 -1
- package/dist/opnsense/providers.d.ts.map +1 -1
- package/dist/opnsense/resource.d.ts +1 -1
- package/dist/opnsense/resource.d.ts.map +1 -1
- package/dist/ownership/probe.d.ts.map +1 -1
- package/dist/paperless/custom-field.d.ts +5 -5
- package/dist/paperless/custom-field.d.ts.map +1 -1
- package/dist/paperless/document-type.d.ts +5 -5
- package/dist/paperless/document-type.d.ts.map +1 -1
- package/dist/paperless/fake-paperless.d.ts +1 -1
- package/dist/paperless/fake-paperless.d.ts.map +1 -1
- package/dist/paperless/matching-types.d.ts +1 -1
- package/dist/paperless/matching-types.d.ts.map +1 -1
- package/dist/paperless/matching.d.ts +4 -4
- package/dist/paperless/providers.d.ts +1 -1
- package/dist/paperless/providers.d.ts.map +1 -1
- package/dist/paperless/storage-path.d.ts +5 -5
- package/dist/paperless/storage-path.d.ts.map +1 -1
- package/dist/paperless/tag.d.ts +5 -5
- package/dist/paperless/tag.d.ts.map +1 -1
- package/dist/postgres/connection.d.ts +2 -2
- package/dist/postgres/connection.d.ts.map +1 -1
- package/dist/postgres/database-sql.d.ts +1 -1
- package/dist/postgres/database-sql.d.ts.map +1 -1
- package/dist/postgres/database.d.ts +1 -1
- package/dist/postgres/database.d.ts.map +1 -1
- package/dist/postgres/fake-grants-read.d.ts +1 -1
- package/dist/postgres/fake-grants-read.d.ts.map +1 -1
- package/dist/postgres/fake-grants-write.d.ts +1 -1
- package/dist/postgres/fake-grants-write.d.ts.map +1 -1
- package/dist/postgres/fake-role-sql.d.ts +1 -1
- package/dist/postgres/fake-role-sql.d.ts.map +1 -1
- package/dist/postgres/fake-schema-drop.d.ts +13 -0
- package/dist/postgres/fake-schema-drop.d.ts.map +1 -0
- package/dist/postgres/fake-schema-sql.d.ts +6 -1
- package/dist/postgres/fake-schema-sql.d.ts.map +1 -1
- package/dist/postgres/fake-sql.d.ts +4 -0
- package/dist/postgres/fake-sql.d.ts.map +1 -1
- package/dist/postgres/grants-existence.d.ts +1 -1
- package/dist/postgres/grants-existence.d.ts.map +1 -1
- package/dist/postgres/grants-ops.d.ts +1 -1
- package/dist/postgres/grants-ops.d.ts.map +1 -1
- package/dist/postgres/grants-ownership.d.ts +1 -1
- package/dist/postgres/grants-ownership.d.ts.map +1 -1
- package/dist/postgres/grants-read-defaults.d.ts +1 -1
- package/dist/postgres/grants-read-defaults.d.ts.map +1 -1
- package/dist/postgres/grants-read.d.ts +1 -1
- package/dist/postgres/grants-read.d.ts.map +1 -1
- package/dist/postgres/index.d.ts +2 -1
- package/dist/postgres/index.d.ts.map +1 -1
- package/dist/postgres/index.js +523 -324
- package/dist/postgres/index.js.map +26 -22
- package/dist/postgres/installed-classifier.d.ts +1 -1
- package/dist/postgres/installed-classifier.d.ts.map +1 -1
- package/dist/postgres/psql-executor.d.ts.map +1 -1
- package/dist/postgres/role-membership-sql.d.ts +1 -1
- package/dist/postgres/role-membership-sql.d.ts.map +1 -1
- package/dist/postgres/role-sql.d.ts +1 -1
- package/dist/postgres/role-sql.d.ts.map +1 -1
- package/dist/postgres/role.d.ts +1 -1
- package/dist/postgres/role.d.ts.map +1 -1
- package/dist/postgres/schema-assert.d.ts +1 -1
- package/dist/postgres/schema-assert.d.ts.map +1 -1
- package/dist/postgres/schema-closure-sql.d.ts +45 -0
- package/dist/postgres/schema-closure-sql.d.ts.map +1 -0
- package/dist/postgres/schema-delete.d.ts +18 -9
- package/dist/postgres/schema-delete.d.ts.map +1 -1
- package/dist/postgres/schema-drop-sql.d.ts +66 -0
- package/dist/postgres/schema-drop-sql.d.ts.map +1 -0
- package/dist/postgres/schema-errors.d.ts +19 -1
- package/dist/postgres/schema-errors.d.ts.map +1 -1
- package/dist/postgres/schema-reconcile.d.ts +1 -1
- package/dist/postgres/schema-reconcile.d.ts.map +1 -1
- package/dist/postgres/schema-sequence-error.d.ts +29 -0
- package/dist/postgres/schema-sequence-error.d.ts.map +1 -0
- package/dist/postgres/schema-sql.d.ts +17 -1
- package/dist/postgres/schema-sql.d.ts.map +1 -1
- package/dist/postgres/schema-test-kit.d.ts +3 -1
- package/dist/postgres/schema-test-kit.d.ts.map +1 -1
- package/dist/postgres/schema.d.ts +1 -1
- package/dist/postgres/schema.d.ts.map +1 -1
- package/dist/postgres/search-path.d.ts +38 -0
- package/dist/postgres/search-path.d.ts.map +1 -0
- package/dist/proxmox/acl.d.ts +1 -1
- package/dist/proxmox/acl.d.ts.map +1 -1
- package/dist/proxmox/api-token.d.ts +1 -1
- package/dist/proxmox/api-token.d.ts.map +1 -1
- package/dist/proxmox/backup-job-distilled.d.ts +2 -2
- package/dist/proxmox/backup-job-distilled.d.ts.map +1 -1
- package/dist/proxmox/backup-job.d.ts +1 -1
- package/dist/proxmox/backup-job.d.ts.map +1 -1
- package/dist/proxmox/ceph-daemon-wire.d.ts +3 -3
- package/dist/proxmox/ceph-daemon-wire.d.ts.map +1 -1
- package/dist/proxmox/ceph-daemon.d.ts +2 -2
- package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
- package/dist/proxmox/ceph-flag-wire.d.ts +3 -3
- package/dist/proxmox/ceph-flag-wire.d.ts.map +1 -1
- package/dist/proxmox/ceph-flag.d.ts +1 -1
- package/dist/proxmox/ceph-flag.d.ts.map +1 -1
- package/dist/proxmox/ceph-fs-distilled.d.ts +3 -3
- package/dist/proxmox/ceph-fs-distilled.d.ts.map +1 -1
- package/dist/proxmox/ceph-fs.d.ts +1 -1
- package/dist/proxmox/ceph-fs.d.ts.map +1 -1
- package/dist/proxmox/ceph-osd-tree.d.ts +1 -1
- package/dist/proxmox/ceph-osd-tree.d.ts.map +1 -1
- package/dist/proxmox/ceph-osd-write.d.ts +2 -2
- package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
- package/dist/proxmox/ceph-osd.d.ts +1 -1
- package/dist/proxmox/ceph-osd.d.ts.map +1 -1
- package/dist/proxmox/ceph-pool-settle.d.ts +2 -2
- package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -1
- package/dist/proxmox/ceph-pool-wire.d.ts +1 -1
- package/dist/proxmox/ceph-pool-wire.d.ts.map +1 -1
- package/dist/proxmox/ceph-pool.d.ts +1 -1
- package/dist/proxmox/ceph-pool.d.ts.map +1 -1
- package/dist/proxmox/client.d.ts +1 -1
- package/dist/proxmox/client.d.ts.map +1 -1
- package/dist/proxmox/distilled-pbs.d.ts +1 -1
- package/dist/proxmox/distilled-pbs.d.ts.map +1 -1
- package/dist/proxmox/distilled-pve.d.ts +1 -1
- package/dist/proxmox/distilled-pve.d.ts.map +1 -1
- package/dist/proxmox/fake-pbs-jobs.d.ts +1 -1
- package/dist/proxmox/fake-pve.d.ts +1 -1
- package/dist/proxmox/fake-pve.d.ts.map +1 -1
- package/dist/proxmox/firewall-alias-lifecycle.d.ts +6 -6
- package/dist/proxmox/firewall-alias-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/firewall-alias.d.ts +1 -1
- package/dist/proxmox/firewall-alias.d.ts.map +1 -1
- package/dist/proxmox/group-wire.d.ts +2 -2
- package/dist/proxmox/group-wire.d.ts.map +1 -1
- package/dist/proxmox/group.d.ts +1 -1
- package/dist/proxmox/group.d.ts.map +1 -1
- package/dist/proxmox/ha-resource.d.ts +1 -1
- package/dist/proxmox/ha-resource.d.ts.map +1 -1
- package/dist/proxmox/ha-rule.d.ts +1 -1
- package/dist/proxmox/ha-rule.d.ts.map +1 -1
- package/dist/proxmox/index.js +38 -17
- package/dist/proxmox/index.js.map +9 -9
- package/dist/proxmox/lease-cache.d.ts +2 -2
- package/dist/proxmox/lease-cache.d.ts.map +1 -1
- package/dist/proxmox/live-core-fixtures.d.ts +1 -1
- package/dist/proxmox/live-core-fixtures.d.ts.map +1 -1
- package/dist/proxmox/lxc-lifecycle.d.ts +3 -3
- package/dist/proxmox/lxc-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/lxc-read.d.ts +1 -1
- package/dist/proxmox/lxc-read.d.ts.map +1 -1
- package/dist/proxmox/lxc-task.d.ts +1 -1
- package/dist/proxmox/lxc-task.d.ts.map +1 -1
- package/dist/proxmox/lxc.d.ts +1 -1
- package/dist/proxmox/lxc.d.ts.map +1 -1
- package/dist/proxmox/members.d.ts +3 -3
- package/dist/proxmox/members.d.ts.map +1 -1
- package/dist/proxmox/metric-server-distilled.d.ts +3 -3
- package/dist/proxmox/metric-server-distilled.d.ts.map +1 -1
- package/dist/proxmox/metric-server.d.ts +1 -1
- package/dist/proxmox/metric-server.d.ts.map +1 -1
- package/dist/proxmox/mint.d.ts +1 -1
- package/dist/proxmox/mint.d.ts.map +1 -1
- package/dist/proxmox/network-apply-read.d.ts +3 -3
- package/dist/proxmox/network-apply-read.d.ts.map +1 -1
- package/dist/proxmox/network-apply-run.d.ts +1 -1
- package/dist/proxmox/network-apply-run.d.ts.map +1 -1
- package/dist/proxmox/network-apply.d.ts +1 -1
- package/dist/proxmox/network-apply.d.ts.map +1 -1
- package/dist/proxmox/node-network-wire.d.ts +2 -2
- package/dist/proxmox/node-network-wire.d.ts.map +1 -1
- package/dist/proxmox/node-network.d.ts +1 -1
- package/dist/proxmox/node-network.d.ts.map +1 -1
- package/dist/proxmox/notification-matcher-distilled.d.ts +4 -4
- package/dist/proxmox/notification-matcher-distilled.d.ts.map +1 -1
- package/dist/proxmox/notification-matcher-lifecycle.d.ts +4 -4
- package/dist/proxmox/notification-matcher.d.ts +1 -1
- package/dist/proxmox/notification-matcher.d.ts.map +1 -1
- package/dist/proxmox/notification-target-distilled.d.ts +4 -4
- package/dist/proxmox/notification-target-distilled.d.ts.map +1 -1
- package/dist/proxmox/notification-target-lifecycle.d.ts +4 -4
- package/dist/proxmox/notification-target.d.ts +1 -1
- package/dist/proxmox/notification-target.d.ts.map +1 -1
- package/dist/proxmox/pbs-datastore-lifecycle.d.ts +4 -4
- package/dist/proxmox/pbs-datastore-wire.d.ts +4 -4
- package/dist/proxmox/pbs-datastore-wire.d.ts.map +1 -1
- package/dist/proxmox/pbs-datastore.d.ts +1 -1
- package/dist/proxmox/pbs-datastore.d.ts.map +1 -1
- package/dist/proxmox/pbs-notification-matcher-distilled.d.ts +4 -4
- package/dist/proxmox/pbs-notification-matcher-distilled.d.ts.map +1 -1
- package/dist/proxmox/pbs-notification-matcher.d.ts +1 -1
- package/dist/proxmox/pbs-notification-matcher.d.ts.map +1 -1
- package/dist/proxmox/pbs-notification-target-distilled.d.ts +4 -4
- package/dist/proxmox/pbs-notification-target-distilled.d.ts.map +1 -1
- package/dist/proxmox/pbs-notification-target-lifecycle.d.ts +4 -4
- package/dist/proxmox/pbs-notification-target.d.ts +1 -1
- package/dist/proxmox/pbs-notification-target.d.ts.map +1 -1
- package/dist/proxmox/pbs-prune-job-lifecycle.d.ts +4 -4
- package/dist/proxmox/pbs-prune-job-wire.d.ts +4 -4
- package/dist/proxmox/pbs-prune-job-wire.d.ts.map +1 -1
- package/dist/proxmox/pbs-prune-job.d.ts +1 -1
- package/dist/proxmox/pbs-prune-job.d.ts.map +1 -1
- package/dist/proxmox/pbs-sync-job-lifecycle.d.ts +4 -4
- package/dist/proxmox/pbs-sync-job-wire.d.ts +4 -4
- package/dist/proxmox/pbs-sync-job-wire.d.ts.map +1 -1
- package/dist/proxmox/pbs-sync-job.d.ts +1 -1
- package/dist/proxmox/pbs-sync-job.d.ts.map +1 -1
- package/dist/proxmox/pbs-verify-job-lifecycle.d.ts +4 -4
- package/dist/proxmox/pbs-verify-job-wire.d.ts +4 -4
- package/dist/proxmox/pbs-verify-job-wire.d.ts.map +1 -1
- package/dist/proxmox/pbs-verify-job.d.ts +1 -1
- package/dist/proxmox/pbs-verify-job.d.ts.map +1 -1
- package/dist/proxmox/pool.d.ts +3 -3
- package/dist/proxmox/pool.d.ts.map +1 -1
- package/dist/proxmox/provision-declare.d.ts +1 -1
- package/dist/proxmox/provision-declare.d.ts.map +1 -1
- package/dist/proxmox/qemu-lifecycle.d.ts +3 -3
- package/dist/proxmox/qemu-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/qemu-read.d.ts +1 -1
- package/dist/proxmox/qemu-read.d.ts.map +1 -1
- package/dist/proxmox/qemu-resize.d.ts +1 -1
- package/dist/proxmox/qemu-resize.d.ts.map +1 -1
- package/dist/proxmox/qemu-task.d.ts +1 -1
- package/dist/proxmox/qemu-task.d.ts.map +1 -1
- package/dist/proxmox/qemu.d.ts +1 -1
- package/dist/proxmox/qemu.d.ts.map +1 -1
- package/dist/proxmox/replication-job-lifecycle.d.ts +6 -6
- package/dist/proxmox/replication-job-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/replication-job.d.ts +1 -1
- package/dist/proxmox/replication-job.d.ts.map +1 -1
- package/dist/proxmox/resource-spec.d.ts +1 -1
- package/dist/proxmox/resource-spec.d.ts.map +1 -1
- package/dist/proxmox/resource.d.ts +8 -8
- package/dist/proxmox/role.d.ts +1 -1
- package/dist/proxmox/role.d.ts.map +1 -1
- package/dist/proxmox/sdn-apply-read.d.ts +1 -1
- package/dist/proxmox/sdn-apply-read.d.ts.map +1 -1
- package/dist/proxmox/sdn-apply.d.ts +1 -1
- package/dist/proxmox/sdn-apply.d.ts.map +1 -1
- package/dist/proxmox/sdn-subnet.d.ts +1 -1
- package/dist/proxmox/sdn-subnet.d.ts.map +1 -1
- package/dist/proxmox/sdn-vnet.d.ts +1 -1
- package/dist/proxmox/sdn-vnet.d.ts.map +1 -1
- package/dist/proxmox/sdn-zone.d.ts +1 -1
- package/dist/proxmox/sdn-zone.d.ts.map +1 -1
- package/dist/proxmox/storage-download-lifecycle.d.ts +6 -6
- package/dist/proxmox/storage-download-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/storage-download-task.d.ts +1 -1
- package/dist/proxmox/storage-download-task.d.ts.map +1 -1
- package/dist/proxmox/storage-download.d.ts +1 -1
- package/dist/proxmox/storage-download.d.ts.map +1 -1
- package/dist/proxmox/storage-wire.d.ts +2 -2
- package/dist/proxmox/storage-wire.d.ts.map +1 -1
- package/dist/proxmox/storage.d.ts +1 -1
- package/dist/proxmox/storage.d.ts.map +1 -1
- package/dist/proxmox/user-wire.d.ts +2 -2
- package/dist/proxmox/user-wire.d.ts.map +1 -1
- package/dist/proxmox/user.d.ts +1 -1
- package/dist/proxmox/user.d.ts.map +1 -1
- package/dist/proxmox/zfs-pool-form.d.ts +2 -2
- package/dist/proxmox/zfs-pool-form.d.ts.map +1 -1
- package/dist/proxmox/zfs-pool-wire.d.ts +2 -2
- package/dist/proxmox/zfs-pool-wire.d.ts.map +1 -1
- package/dist/proxmox/zfs-pool.d.ts +1 -1
- package/dist/proxmox/zfs-pool.d.ts.map +1 -1
- package/dist/release/binary.d.ts +1 -1
- package/dist/release/binary.d.ts.map +1 -1
- package/dist/release/download.d.ts +1 -1
- package/dist/release/download.d.ts.map +1 -1
- package/dist/release/index.js +6 -5
- package/dist/release/index.js.map +5 -5
- package/dist/talos/credentials-write.d.ts +1 -1
- package/dist/talos/credentials-write.d.ts.map +1 -1
- package/dist/talos/credentials.d.ts +1 -1
- package/dist/talos/credentials.d.ts.map +1 -1
- package/dist/talos/fake-process.d.ts +2 -2
- package/dist/talos/fake-process.d.ts.map +1 -1
- package/dist/talos/index.js +7 -7
- package/dist/talos/index.js.map +4 -4
- package/dist/talos/kubeconfig.d.ts +4 -4
- package/dist/talos/kubeconfig.d.ts.map +1 -1
- package/dist/talos/machine-config-fixtures.d.ts +1 -1
- package/dist/talos/machine-config-fixtures.d.ts.map +1 -1
- package/dist/talos/machine-config-read.d.ts +3 -3
- package/dist/talos/machine-config-read.d.ts.map +1 -1
- package/dist/talos/resource.d.ts +1 -1
- package/dist/talos/resource.d.ts.map +1 -1
- package/dist/talos/talos-bootstrap-etcd.d.ts +2 -2
- package/dist/talos/talos-bootstrap-etcd.d.ts.map +1 -1
- package/dist/talos/talos-bootstrap.d.ts +4 -4
- package/dist/talos/talos-bootstrap.d.ts.map +1 -1
- package/dist/talos/talos-cluster-health.d.ts +4 -4
- package/dist/talos/talos-cluster-health.d.ts.map +1 -1
- package/dist/talos/talos-machine-config.d.ts +2 -2
- package/dist/talos/talos-machine-config.d.ts.map +1 -1
- package/dist/talos/talosctl.d.ts +1 -1
- package/dist/talos/talosctl.d.ts.map +1 -1
- package/dist/telemetry/index.js +4 -4
- package/dist/telemetry/index.js.map +3 -3
- package/dist/telemetry/redact-serialization.d.ts +2 -2
- package/dist/telemetry/redact-serialization.d.ts.map +1 -1
- package/dist/unifi/acl-rule-ordering.d.ts +6 -6
- package/dist/unifi/acl-rule-ordering.d.ts.map +1 -1
- package/dist/unifi/acl-rule.d.ts +6 -6
- package/dist/unifi/acl-rule.d.ts.map +1 -1
- package/dist/unifi/dns-policy.d.ts +6 -6
- package/dist/unifi/dns-policy.d.ts.map +1 -1
- package/dist/unifi/fake-unifi.d.ts +1 -1
- package/dist/unifi/fake-unifi.d.ts.map +1 -1
- package/dist/unifi/firewall-policy-ordering.d.ts +6 -6
- package/dist/unifi/firewall-policy-ordering.d.ts.map +1 -1
- package/dist/unifi/firewall-policy.d.ts +6 -6
- package/dist/unifi/firewall-policy.d.ts.map +1 -1
- package/dist/unifi/firewall-zone.d.ts +6 -6
- package/dist/unifi/firewall-zone.d.ts.map +1 -1
- package/dist/unifi/index.js +2 -2
- package/dist/unifi/index.js.map +2 -2
- package/dist/unifi/network.d.ts +6 -6
- package/dist/unifi/network.d.ts.map +1 -1
- package/dist/unifi/providers.d.ts +1 -1
- package/dist/unifi/providers.d.ts.map +1 -1
- package/dist/unifi/resource.d.ts +1 -1
- package/dist/unifi/resource.d.ts.map +1 -1
- package/dist/unifi/traffic-matching-list.d.ts +6 -6
- package/dist/unifi/traffic-matching-list.d.ts.map +1 -1
- package/dist/unifi/wifi-broadcast.d.ts +6 -6
- package/dist/unifi/wifi-broadcast.d.ts.map +1 -1
- package/dist/verify/cli.js.map +1 -1
- package/dist/verify/index.js.map +1 -1
- package/docs/distilled-interim.md +1 -1
- package/docs/mesh-node.md +1 -1
- package/docs/paperless.md +1 -1
- package/docs/peers.md +8 -8
- package/docs/postgres-schema.md +22 -1
- package/docs/telemetry.md +1 -1
- package/package.json +20 -20
- package/src/argocd/fake-argocd.ts +1 -1
- package/src/argocd/resource.ts +1 -1
- package/src/caddy/admin-transport-scope.test.ts +2 -2
- package/src/caddy/admin.ts +1 -1
- package/src/caddy/caddy-http-client.ts +5 -5
- package/src/caddy/config-adopt.test.ts +2 -2
- package/src/caddy/format.ts +2 -2
- package/src/caddy/local-admin.test.ts +1 -1
- package/src/ceph/auth-entity.ts +1 -1
- package/src/ceph/ceph-auth-reconcile.ts +1 -1
- package/src/cloudflare/fake-mesh.ts +1 -1
- package/src/cloudflare/fake-r2-lock.ts +1 -1
- package/src/cloudflare/mesh-node-harness.ts +1 -1
- package/src/cloudflare/mesh-node.ts +1 -1
- package/src/cloudflare/r2-bucket-lock.ts +1 -1
- package/src/discord/fake-discord.ts +1 -1
- package/src/discord/resource.ts +1 -1
- package/src/forgejo/fake-forgejo.ts +1 -1
- package/src/forgejo/resource.ts +1 -1
- package/src/google-workspace/fake-google-workspace.ts +1 -1
- package/src/google-workspace/resource.ts +1 -1
- package/src/grafana/fake-grafana.ts +1 -1
- package/src/litellm/access-group.test.ts +1 -1
- package/src/litellm/credential-errors.ts +1 -1
- package/src/litellm/credential-guards.test.ts +1 -1
- package/src/litellm/credential-operations.ts +1 -1
- package/src/litellm/credential-rewrite.test.ts +1 -1
- package/src/litellm/fake-stack.ts +1 -1
- package/src/litellm/key-errors.ts +1 -1
- package/src/litellm/key-harness.ts +1 -1
- package/src/litellm/key-operations.ts +1 -1
- package/src/litellm/key.test.ts +2 -1
- package/src/litellm/mcp-server-handlers.test.ts +1 -1
- package/src/litellm/mcp-server-registry.test.ts +1 -1
- package/src/litellm/model-operations.test.ts +1 -1
- package/src/litellm/operations.ts +1 -1
- package/src/litellm/pass-through-endpoint-delete-swallow.test.ts +1 -1
- package/src/litellm/pass-through-endpoint.test.ts +1 -1
- package/src/litellm/pass-through-fetch-client.test.ts +2 -2
- package/src/litellm/policy-attachment.test.ts +1 -1
- package/src/litellm/policy.test.ts +1 -1
- package/src/litellm/team-members.test.ts +1 -1
- package/src/litellm/team-read.test.ts +1 -1
- package/src/litellm/tool-policy.test.ts +1 -1
- package/src/litellm/toolset.test.ts +1 -1
- package/src/netbox/fake-netbox.ts +1 -1
- package/src/netbox/resource.ts +1 -1
- package/src/openbao/adopt-core.test.ts +4 -1
- package/src/openbao/adopt-families.test.ts +4 -1
- package/src/openbao/adopt-holes.test.ts +1 -1
- package/src/openbao/adopt-recovery.test.ts +24 -0
- package/src/openbao/approle-login.ts +2 -2
- package/src/openbao/auth-method-reconcile.ts +1 -1
- package/src/openbao/auth-method.ts +1 -1
- package/src/openbao/auth-role-sdk.test.ts +1 -1
- package/src/openbao/auth-role.ts +1 -1
- package/src/openbao/bao-http.test.ts +3 -3
- package/src/openbao/bao-http.ts +4 -4
- package/src/openbao/bao-identity.ts +2 -2
- package/src/openbao/cloudflare-permission-groups.ts +1 -1
- package/src/openbao/cloudflare-role-wire.ts +1 -1
- package/src/openbao/cloudflare-role.ts +1 -1
- package/src/openbao/distilled-retry.test.ts +3 -3
- package/src/openbao/distilled.test.ts +3 -3
- package/src/openbao/distilled.ts +2 -2
- package/src/openbao/fake-bao.ts +2 -2
- package/src/openbao/fake-core.ts +1 -1
- package/src/openbao/fake-engines.ts +1 -1
- package/src/openbao/fake-families.ts +1 -1
- package/src/openbao/fake-stack.ts +13 -3
- package/src/openbao/jwt-config.ts +1 -1
- package/src/openbao/jwt-role.ts +1 -1
- package/src/openbao/kubernetes-role.ts +1 -1
- package/src/openbao/mfa-enforcement.ts +1 -1
- package/src/openbao/mfa-totp.ts +1 -1
- package/src/openbao/mfa-wire.ts +1 -1
- package/src/openbao/mount-move.ts +1 -1
- package/src/openbao/mount-reconcile.ts +1 -1
- package/src/openbao/mount.ts +1 -1
- package/src/openbao/pki-role.ts +1 -1
- package/src/openbao/plugin-reconcile.ts +1 -1
- package/src/openbao/plugin-wire.ts +1 -1
- package/src/openbao/plugin.ts +1 -1
- package/src/openbao/policy.ts +1 -1
- package/src/openbao/proxmox-role.ts +1 -1
- package/src/openbao/remount-wire.ts +1 -1
- package/src/openbao/rename-occupied.test.ts +1 -1
- package/src/openbao/role-reconcile.ts +1 -1
- package/src/openbao/role-rename.test.ts +1 -1
- package/src/openbao/ssh-role.ts +1 -1
- package/src/opnsense/fake-opnsense.ts +1 -1
- package/src/opnsense/resource.ts +1 -1
- package/src/ownership/probe.ts +51 -2
- package/src/paperless/fake-paperless.ts +1 -1
- package/src/paperless/matching-types.ts +1 -1
- package/src/postgres/connection.ts +11 -15
- package/src/postgres/database-bigint-serialization.test.ts +3 -3
- package/src/postgres/database-sql.ts +7 -7
- package/src/postgres/database.ts +1 -1
- package/src/postgres/fake-grants-read.ts +4 -4
- package/src/postgres/fake-grants-sql.ts +1 -1
- package/src/postgres/fake-grants-write.ts +1 -1
- package/src/postgres/fake-role-sql.ts +3 -3
- package/src/postgres/fake-schema-drop.ts +75 -0
- package/src/postgres/fake-schema-sql.ts +11 -2
- package/src/postgres/fake-sql.ts +11 -4
- package/src/postgres/grants-database.test.ts +5 -5
- package/src/postgres/grants-existence.ts +8 -8
- package/src/postgres/grants-ops.ts +1 -1
- package/src/postgres/grants-ownership.ts +6 -6
- package/src/postgres/grants-psql-lifecycle.test.ts +7 -3
- package/src/postgres/grants-read-defaults.ts +6 -6
- package/src/postgres/grants-read.ts +17 -17
- package/src/postgres/grants-relkind-wire.test.ts +6 -4
- package/src/postgres/index.ts +2 -0
- package/src/postgres/installed-classifier.ts +1 -1
- package/src/postgres/psql-executor-escaping.test.ts +3 -1
- package/src/postgres/psql-executor.test.ts +11 -5
- package/src/postgres/psql-executor.ts +5 -7
- package/src/postgres/role-adopt.test.ts +3 -1
- package/src/postgres/role-membership-options.test.ts +3 -1
- package/src/postgres/role-membership-repair.test.ts +3 -3
- package/src/postgres/role-membership-sql.ts +5 -5
- package/src/postgres/role-password-transports.test.ts +6 -4
- package/src/postgres/role-sql.ts +2 -2
- package/src/postgres/role.ts +1 -1
- package/src/postgres/schema-assert.ts +1 -1
- package/src/postgres/schema-closure-sql.ts +108 -0
- package/src/postgres/schema-delete-proofs.test.ts +7 -7
- package/src/postgres/schema-delete.ts +89 -47
- package/src/postgres/schema-drop-2bp01.test.ts +30 -18
- package/src/postgres/schema-drop-real.test.ts +190 -0
- package/src/postgres/schema-drop-sql.ts +135 -0
- package/src/postgres/schema-drop.test.ts +241 -0
- package/src/postgres/schema-errors.ts +26 -0
- package/src/postgres/schema-handlers.test.ts +21 -14
- package/src/postgres/schema-lifecycle.test.ts +6 -60
- package/src/postgres/schema-reconcile.ts +1 -1
- package/src/postgres/schema-sequence-error.ts +38 -0
- package/src/postgres/schema-socket.test.ts +20 -6
- package/src/postgres/schema-sql.ts +17 -12
- package/src/postgres/schema-takeover.test.ts +7 -4
- package/src/postgres/schema-test-kit.ts +18 -4
- package/src/postgres/search-path.test.ts +100 -0
- package/src/postgres/search-path.ts +62 -0
- package/src/proxmox/ceph-flag-wire.test.ts +1 -1
- package/src/proxmox/ceph-fs-destroy-sdk.test.ts +1 -1
- package/src/proxmox/ceph-pool-write.test.ts +1 -1
- package/src/proxmox/client.test.ts +2 -2
- package/src/proxmox/client.ts +2 -2
- package/src/proxmox/credentials.test.ts +1 -1
- package/src/proxmox/distilled-pbs.test.ts +1 -1
- package/src/proxmox/distilled-pbs.ts +1 -1
- package/src/proxmox/distilled-pve.test.ts +2 -2
- package/src/proxmox/distilled-pve.ts +1 -1
- package/src/proxmox/fake-pbs-jobs.ts +1 -1
- package/src/proxmox/fake-pve.ts +1 -1
- package/src/proxmox/lease-cache-mint.test.ts +1 -1
- package/src/proxmox/live-core-fixtures.ts +1 -1
- package/src/proxmox/lxc-distilled.test.ts +1 -1
- package/src/proxmox/lxc-harness.ts +1 -1
- package/src/proxmox/members-timeout.test.ts +3 -3
- package/src/proxmox/members.test.ts +1 -1
- package/src/proxmox/members.ts +4 -4
- package/src/proxmox/mint.ts +4 -4
- package/src/proxmox/node-network-read-failure.test.ts +1 -1
- package/src/proxmox/qemu-lifecycle.ts +1 -1
- package/src/proxmox/read-failure-propagation.test.ts +1 -1
- package/src/proxmox/resource-spec.ts +1 -1
- package/src/proxmox/storage-read-failure.test.ts +1 -1
- package/src/proxmox/typed-absence.test.ts +2 -2
- package/src/proxmox/unreadable-read.test.ts +1 -1
- package/src/proxmox/user.test.ts +1 -1
- package/src/proxmox/zfs-pool-read-failure.test.ts +1 -1
- package/src/release/adopt-parity.test.ts +3 -1
- package/src/release/apply-pins.test.ts +2 -2
- package/src/release/binary-root.test.ts +2 -2
- package/src/release/binary.ts +9 -2
- package/src/release/download.test.ts +3 -3
- package/src/release/download.ts +1 -1
- package/src/release/fake-deploy.ts +2 -2
- package/src/release/fake-engine.ts +2 -2
- package/src/release/fake-provider.ts +2 -2
- package/src/release/plan.test.ts +2 -2
- package/src/release/providers.ts +1 -1
- package/src/talos/credentials-write.test.ts +1 -1
- package/src/talos/credentials-write.ts +2 -2
- package/src/talos/credentials.test.ts +1 -1
- package/src/talos/credentials.ts +2 -2
- package/src/talos/fake-process.ts +2 -2
- package/src/talos/kubeconfig.test.ts +1 -1
- package/src/talos/machine-config-fixtures.ts +1 -1
- package/src/talos/resource.ts +1 -1
- package/src/talos/talos-bootstrap.test.ts +1 -1
- package/src/talos/talos-cluster-health.test.ts +1 -1
- package/src/talos/talosctl.ts +2 -2
- package/src/telemetry/http-client-sealing.test.ts +2 -2
- package/src/telemetry/layer.test.ts +3 -3
- package/src/telemetry/layer.ts +2 -2
- package/src/telemetry/redact-serialization.ts +2 -2
- package/src/unifi/fake-unifi.ts +1 -1
- package/src/unifi/get-only-guard.test.ts +3 -3
- package/src/unifi/resource.ts +1 -1
- package/src/verify/args.ts +1 -1
package/dist/postgres/index.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
// src/postgres/connection.ts
|
|
2
2
|
import * as PgClient from "@effect/sql-pg/PgClient";
|
|
3
3
|
import * as Context from "effect/Context";
|
|
4
|
-
import * as
|
|
4
|
+
import * as Effect4 from "effect/Effect";
|
|
5
5
|
import * as Layer from "effect/Layer";
|
|
6
6
|
|
|
7
7
|
// src/postgres/psql-executor.ts
|
|
8
|
-
import * as
|
|
9
|
-
import {
|
|
10
|
-
ConnectionError,
|
|
11
|
-
SqlError,
|
|
12
|
-
SqlSyntaxError,
|
|
13
|
-
UnknownError
|
|
14
|
-
} from "effect/unstable/sql/SqlError";
|
|
8
|
+
import * as Effect3 from "effect/Effect";
|
|
9
|
+
import { ConnectionError, SqlError, SqlSyntaxError, UnknownError } from "effect/sql/SqlError";
|
|
15
10
|
|
|
16
11
|
// src/postgres/database-sql.ts
|
|
17
12
|
import * as Effect from "effect/Effect";
|
|
@@ -49,15 +44,15 @@ var isDuplicateDatabaseRace = (error) => {
|
|
|
49
44
|
const cause = error.reason.cause;
|
|
50
45
|
return typeof cause === "object" && cause !== null && cause.code === "42P04";
|
|
51
46
|
};
|
|
52
|
-
var ROLE_EXISTS_SQL = "SELECT 1 AS present FROM pg_roles WHERE rolname = $1";
|
|
47
|
+
var ROLE_EXISTS_SQL = "SELECT 1 AS present FROM pg_catalog.pg_roles WHERE rolname = $1";
|
|
53
48
|
var roleExists = (pg, role) => Effect.map(pg.unsafe(ROLE_EXISTS_SQL, [role]), (rows) => rows.length > 0);
|
|
54
|
-
var DATABASE_EXISTS_SQL = "SELECT 1 AS present FROM pg_database WHERE datname = $1";
|
|
49
|
+
var DATABASE_EXISTS_SQL = "SELECT 1 AS present FROM pg_catalog.pg_database WHERE datname = $1";
|
|
55
50
|
var databaseExists = (pg, name) => Effect.map(pg.unsafe(DATABASE_EXISTS_SQL, [name]), (rows) => rows.length > 0);
|
|
56
51
|
var SELECT_DATABASE_SQL = `SELECT
|
|
57
52
|
d.oid AS oid,
|
|
58
53
|
d.datname AS name,
|
|
59
|
-
pg_get_userbyid(d.datdba) AS owner,
|
|
60
|
-
pg_encoding_to_char(d.encoding) AS encoding,
|
|
54
|
+
pg_catalog.pg_get_userbyid(d.datdba) AS owner,
|
|
55
|
+
pg_catalog.pg_encoding_to_char(d.encoding) AS encoding,
|
|
61
56
|
CASE d.datlocprovider
|
|
62
57
|
WHEN 'b' THEN 'builtin' WHEN 'i' THEN 'icu' WHEN 'c' THEN 'libc'
|
|
63
58
|
ELSE 'libc'
|
|
@@ -68,8 +63,8 @@ var SELECT_DATABASE_SQL = `SELECT
|
|
|
68
63
|
d.datconnlimit AS "connectionLimit",
|
|
69
64
|
d.datistemplate AS "isTemplate",
|
|
70
65
|
t.spcname AS tablespace
|
|
71
|
-
FROM pg_database d
|
|
72
|
-
JOIN pg_tablespace t ON t.oid = d.dattablespace
|
|
66
|
+
FROM pg_catalog.pg_database d
|
|
67
|
+
JOIN pg_catalog.pg_tablespace t ON t.oid = d.dattablespace
|
|
73
68
|
WHERE d.datname = $1`;
|
|
74
69
|
var selectDatabase = (pg, name) => Effect.map(pg.unsafe(SELECT_DATABASE_SQL, [name]), (rows) => rows[0]);
|
|
75
70
|
var firstDrift = (props, live) => {
|
|
@@ -90,6 +85,26 @@ var firstDrift = (props, live) => {
|
|
|
90
85
|
return;
|
|
91
86
|
};
|
|
92
87
|
|
|
88
|
+
// src/postgres/search-path.ts
|
|
89
|
+
import * as Effect2 from "effect/Effect";
|
|
90
|
+
var PIN_SEARCH_PATH_SQL = "SET search_path = pg_catalog, pg_temp";
|
|
91
|
+
var PIN_SCRIPT_PREFIX = `${PIN_SEARCH_PATH_SQL};
|
|
92
|
+
`;
|
|
93
|
+
var pinnedSocketExecutor = (pg) => Effect2.gen(function* () {
|
|
94
|
+
const connection = yield* pg.reserve;
|
|
95
|
+
const run = (sql, params) => Effect2.provideService(pg.unsafe(sql, params), pg.transactionService, [connection, 0]);
|
|
96
|
+
yield* run(PIN_SEARCH_PATH_SQL);
|
|
97
|
+
return {
|
|
98
|
+
unsafe: run,
|
|
99
|
+
transaction: (statements) => Effect2.gen(function* () {
|
|
100
|
+
yield* run("BEGIN");
|
|
101
|
+
for (const sql of statements)
|
|
102
|
+
yield* run(sql);
|
|
103
|
+
yield* run("COMMIT");
|
|
104
|
+
}).pipe(Effect2.onError(() => run("ROLLBACK").pipe(Effect2.ignore)), Effect2.asVoid)
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
|
|
93
108
|
// src/postgres/psql-executor.ts
|
|
94
109
|
var inlineParams = (sql, params) => params.length === 0 ? sql : sql.replace(/\$(\d+)/g, (_match, index) => {
|
|
95
110
|
const value = params[Number(index) - 1];
|
|
@@ -113,8 +128,8 @@ var failure = (operation, result) => {
|
|
|
113
128
|
const reason = state === undefined ? new ConnectionError(fields) : state.startsWith("42") ? new SqlSyntaxError(fields) : new UnknownError(fields);
|
|
114
129
|
return new SqlError({ reason });
|
|
115
130
|
};
|
|
116
|
-
var runScript = (run, target, stdin, operation) =>
|
|
117
|
-
const result = yield*
|
|
131
|
+
var runScript = (run, target, stdin, operation) => Effect3.gen(function* () {
|
|
132
|
+
const result = yield* Effect3.tryPromise({
|
|
118
133
|
try: () => run({
|
|
119
134
|
argv: [
|
|
120
135
|
"psql",
|
|
@@ -131,18 +146,18 @@ var runScript = (run, target, stdin, operation) => Effect2.gen(function* () {
|
|
|
131
146
|
"-d",
|
|
132
147
|
target.database
|
|
133
148
|
],
|
|
134
|
-
stdin
|
|
149
|
+
stdin: `${PIN_SCRIPT_PREFIX}${stdin}`
|
|
135
150
|
}),
|
|
136
151
|
catch: (cause) => new SqlError({ reason: new ConnectionError({ cause, operation: "psql exec" }) })
|
|
137
152
|
});
|
|
138
153
|
if (result.code !== 0) {
|
|
139
|
-
return yield*
|
|
154
|
+
return yield* Effect3.fail(failure(operation, result));
|
|
140
155
|
}
|
|
141
156
|
return result;
|
|
142
157
|
});
|
|
143
158
|
var makePsqlExecutor = (run, target) => ({
|
|
144
|
-
unsafe: (sql, params = []) =>
|
|
145
|
-
const inlined = yield*
|
|
159
|
+
unsafe: (sql, params = []) => Effect3.gen(function* () {
|
|
160
|
+
const inlined = yield* Effect3.try({
|
|
146
161
|
try: () => inlineParams(sql, params),
|
|
147
162
|
catch: (cause) => new SqlError({ reason: new UnknownError({ cause, operation: "psql inline params" }) })
|
|
148
163
|
});
|
|
@@ -150,13 +165,13 @@ var makePsqlExecutor = (run, target) => ({
|
|
|
150
165
|
const result = yield* runScript(run, target, rows ? wrapRows(inlined) : `${inlined};`, redactPasswordLiterals(inlined).slice(0, 40));
|
|
151
166
|
if (!rows)
|
|
152
167
|
return [];
|
|
153
|
-
const parsed = yield*
|
|
168
|
+
const parsed = yield* Effect3.try({
|
|
154
169
|
try: () => JSON.parse(result.stdout.trim() || "[]").map(normalizeRow),
|
|
155
170
|
catch: (cause) => new SqlError({ reason: new UnknownError({ cause, operation: "psql parse output" }) })
|
|
156
171
|
});
|
|
157
172
|
return parsed;
|
|
158
173
|
}),
|
|
159
|
-
transaction: (statements) =>
|
|
174
|
+
transaction: (statements) => Effect3.gen(function* () {
|
|
160
175
|
const script = ["BEGIN", ...statements, "COMMIT"].join(`;
|
|
161
176
|
`);
|
|
162
177
|
yield* runScript(run, target, `${script};`, "BEGIN");
|
|
@@ -166,13 +181,13 @@ var makePsqlExecutor = (run, target) => ({
|
|
|
166
181
|
// src/postgres/connection.ts
|
|
167
182
|
class PostgresConnection extends Context.Service()("Postgres.Connection") {
|
|
168
183
|
}
|
|
169
|
-
var postgresConnection = (config) => Layer.succeed(PostgresConnection,
|
|
170
|
-
var postgresRunnerConnection = (config) => Layer.succeed(PostgresConnection,
|
|
184
|
+
var postgresConnection = (config) => Layer.succeed(PostgresConnection, Effect4.succeed(config));
|
|
185
|
+
var postgresRunnerConnection = (config) => Layer.succeed(PostgresConnection, Effect4.succeed(config));
|
|
171
186
|
var PostgresPool = Context.Reference("homeflare/postgres/Pool", {
|
|
172
187
|
defaultValue: () => PgClient.layer
|
|
173
188
|
});
|
|
174
189
|
var isRunner = (c) => ("run" in c);
|
|
175
|
-
var withPg = (build, database) =>
|
|
190
|
+
var withPg = (build, database) => Effect4.gen(function* () {
|
|
176
191
|
const resolveConfig = yield* PostgresConnection;
|
|
177
192
|
const config = yield* resolveConfig;
|
|
178
193
|
const target = database === undefined ? config : { ...config, database };
|
|
@@ -183,13 +198,7 @@ var withPg = (build, database) => Effect3.gen(function* () {
|
|
|
183
198
|
});
|
|
184
199
|
}
|
|
185
200
|
const pool = yield* PostgresPool;
|
|
186
|
-
return yield*
|
|
187
|
-
unsafe: (sql, params) => pg.unsafe(sql, params),
|
|
188
|
-
transaction: (statements) => pg.withTransaction(Effect3.gen(function* () {
|
|
189
|
-
for (const sql of statements)
|
|
190
|
-
yield* pg.unsafe(sql).pipe(Effect3.asVoid);
|
|
191
|
-
}))
|
|
192
|
-
}, { database: target.database })), pool(target));
|
|
201
|
+
return yield* Effect4.provide(Effect4.scoped(Effect4.flatMap(PgClient.PgClient, (pg) => Effect4.flatMap(pinnedSocketExecutor(pg), (executor) => build(executor, { database: target.database })))), pool(target));
|
|
193
202
|
});
|
|
194
203
|
// src/postgres/database-attrs.ts
|
|
195
204
|
var POSTGRES_NAME_MAX_BYTES = 63;
|
|
@@ -203,7 +212,7 @@ import { Resource } from "alchemy";
|
|
|
203
212
|
import { Unowned } from "alchemy/AdoptPolicy";
|
|
204
213
|
import { isResolved } from "alchemy/Diff";
|
|
205
214
|
import * as Provider from "alchemy/Provider";
|
|
206
|
-
import * as
|
|
215
|
+
import * as Effect5 from "effect/Effect";
|
|
207
216
|
|
|
208
217
|
// src/postgres/errors.ts
|
|
209
218
|
import * as Data from "effect/Data";
|
|
@@ -255,23 +264,23 @@ var liveDrift = (props, live) => {
|
|
|
255
264
|
}
|
|
256
265
|
return firstDrift(props, live);
|
|
257
266
|
};
|
|
258
|
-
var reconcileWithClient = (pg, props, template) =>
|
|
267
|
+
var reconcileWithClient = (pg, props, template) => Effect5.gen(function* () {
|
|
259
268
|
const observed = yield* selectDatabase(pg, props.name);
|
|
260
269
|
if (observed === undefined) {
|
|
261
270
|
const ownerPresent = yield* roleExists(pg, props.owner);
|
|
262
271
|
if (!ownerPresent) {
|
|
263
|
-
return yield*
|
|
272
|
+
return yield* Effect5.fail(new PostgresDatabaseOwnerMissing({ database: props.name, owner: props.owner }));
|
|
264
273
|
}
|
|
265
|
-
yield* pg.unsafe(buildCreateDatabaseSql(props, template)).pipe(
|
|
274
|
+
yield* pg.unsafe(buildCreateDatabaseSql(props, template)).pipe(Effect5.asVoid, Effect5.catchTag("SqlError", (error) => isDuplicateDatabaseRace(error) ? Effect5.succeed(undefined) : Effect5.fail(error)));
|
|
266
275
|
const created = yield* selectDatabase(pg, props.name);
|
|
267
276
|
if (created === undefined) {
|
|
268
|
-
return yield*
|
|
277
|
+
return yield* Effect5.fail(new PostgresDatabaseCreateVanished({ database: props.name }));
|
|
269
278
|
}
|
|
270
279
|
return created;
|
|
271
280
|
}
|
|
272
281
|
const drift = liveDrift(props, observed);
|
|
273
282
|
if (drift !== undefined) {
|
|
274
|
-
return yield*
|
|
283
|
+
return yield* Effect5.fail(new PostgresDatabaseDrift({
|
|
275
284
|
database: props.name,
|
|
276
285
|
prop: drift.prop,
|
|
277
286
|
declared: drift.declared,
|
|
@@ -281,36 +290,36 @@ var reconcileWithClient = (pg, props, template) => Effect4.gen(function* () {
|
|
|
281
290
|
return observed;
|
|
282
291
|
});
|
|
283
292
|
var readWithClient = (pg, name) => selectDatabase(pg, name);
|
|
284
|
-
var diffPostgresDatabase = (news, output) =>
|
|
293
|
+
var diffPostgresDatabase = (news, output) => Effect5.gen(function* () {
|
|
285
294
|
if (output === undefined || !isResolved(news))
|
|
286
295
|
return;
|
|
287
296
|
if (news.name !== output.name) {
|
|
288
|
-
return yield*
|
|
297
|
+
return yield* Effect5.fail(new PostgresDatabaseRenameRefused({ from: output.name, to: news.name }));
|
|
289
298
|
}
|
|
290
299
|
const nameRefusal = nameByteRefusal(news.name);
|
|
291
300
|
if (nameRefusal !== undefined) {
|
|
292
|
-
return yield*
|
|
301
|
+
return yield* Effect5.fail(new PostgresDatabaseNameRefused({ name: news.name, ...nameRefusal }));
|
|
293
302
|
}
|
|
294
303
|
const changed = news.owner !== output.owner || firstDrift(news, output) !== undefined;
|
|
295
304
|
return changed ? { action: "update" } : { action: "noop" };
|
|
296
305
|
});
|
|
297
306
|
var postgresDatabaseHandlers = PostgresDatabase.Provider.of({
|
|
298
|
-
list: () =>
|
|
307
|
+
list: () => Effect5.succeed([]),
|
|
299
308
|
nuke: { skip: true },
|
|
300
|
-
read: ({ olds, output }) =>
|
|
309
|
+
read: ({ olds, output }) => Effect5.gen(function* () {
|
|
301
310
|
const name = output?.name ?? olds.name;
|
|
302
311
|
const live = yield* withPg((pg) => readWithClient(pg, name));
|
|
303
312
|
return live === undefined ? undefined : Unowned(live);
|
|
304
313
|
}),
|
|
305
314
|
diff: ({ news, output }) => diffPostgresDatabase(news, output),
|
|
306
|
-
reconcile: ({ news }) =>
|
|
315
|
+
reconcile: ({ news }) => Effect5.gen(function* () {
|
|
307
316
|
const nameRefusal = nameByteRefusal(news.name);
|
|
308
317
|
if (nameRefusal !== undefined) {
|
|
309
|
-
return yield*
|
|
318
|
+
return yield* Effect5.fail(new PostgresDatabaseNameRefused({ name: news.name, ...nameRefusal }));
|
|
310
319
|
}
|
|
311
320
|
return yield* withPg((pg, ctx) => reconcileWithClient(pg, news, ctx.template));
|
|
312
321
|
}),
|
|
313
|
-
delete: ({ olds }) =>
|
|
322
|
+
delete: ({ olds }) => Effect5.fail(new PostgresDatabaseDropRefused({ database: olds.name }))
|
|
314
323
|
});
|
|
315
324
|
var PostgresDatabaseProvider = () => Provider.succeed(PostgresDatabase, postgresDatabaseHandlers);
|
|
316
325
|
// src/postgres/schema-attrs.ts
|
|
@@ -320,34 +329,35 @@ var schemaNameByteRefusal = (name) => {
|
|
|
320
329
|
return byteLength > POSTGRES_NAME_MAX_BYTES ? { byteLength, limit: POSTGRES_NAME_MAX_BYTES } : undefined;
|
|
321
330
|
};
|
|
322
331
|
// src/postgres/schema-sql.ts
|
|
323
|
-
import * as
|
|
332
|
+
import * as Effect6 from "effect/Effect";
|
|
324
333
|
var buildCreateSchemaSql = (props) => `CREATE SCHEMA ${quoteIdent(props.name)}${props.owner === undefined ? "" : ` AUTHORIZATION ${quoteIdent(props.owner)}`}`;
|
|
325
334
|
var buildCommentSchemaSql = (name, comment) => `COMMENT ON SCHEMA ${quoteIdent(name)} IS ${quoteStringLiteral(comment)}`;
|
|
326
335
|
var buildDropSchemaSql = (name, cascade) => `DROP SCHEMA IF EXISTS ${quoteIdent(name)}${cascade ? " CASCADE" : ""}`;
|
|
327
336
|
var SELECT_SCHEMA_SQL = `SELECT
|
|
328
337
|
n.oid AS oid,
|
|
329
338
|
n.nspname AS name,
|
|
330
|
-
pg_get_userbyid(n.nspowner) AS owner,
|
|
331
|
-
obj_description(n.oid, 'pg_namespace') AS comment,
|
|
339
|
+
pg_catalog.pg_get_userbyid(n.nspowner) AS owner,
|
|
340
|
+
pg_catalog.obj_description(n.oid, 'pg_namespace') AS comment,
|
|
332
341
|
current_database() AS database
|
|
333
|
-
FROM pg_namespace n
|
|
342
|
+
FROM pg_catalog.pg_namespace n
|
|
334
343
|
WHERE n.nspname = $1`;
|
|
335
|
-
var selectSchema = (pg, name) =>
|
|
344
|
+
var selectSchema = (pg, name) => Effect6.map(pg.unsafe(SELECT_SCHEMA_SQL, [name]), (rows) => rows[0]);
|
|
336
345
|
var CURRENT_DATABASE_SQL = "SELECT current_database() AS database";
|
|
337
|
-
var currentDatabase = (pg) =>
|
|
346
|
+
var currentDatabase = (pg) => Effect6.map(pg.unsafe(CURRENT_DATABASE_SQL), (rows) => rows[0]?.database ?? "");
|
|
338
347
|
var CURRENT_USER_SQL = "SELECT current_user AS role";
|
|
339
|
-
var currentUser = (pg) =>
|
|
340
|
-
var
|
|
341
|
-
|
|
342
|
-
SELECT 1 FROM pg_class c WHERE c.relnamespace = (SELECT oid FROM ns)
|
|
348
|
+
var currentUser = (pg) => Effect6.map(pg.unsafe(CURRENT_USER_SQL), (rows) => rows[0]?.role ?? "");
|
|
349
|
+
var emptyPredicate = (ns) => `NOT EXISTS (
|
|
350
|
+
SELECT 1 FROM pg_catalog.pg_class c WHERE c.relnamespace = ${ns}
|
|
343
351
|
) AND NOT EXISTS (
|
|
344
|
-
SELECT 1 FROM pg_proc p WHERE p.pronamespace =
|
|
352
|
+
SELECT 1 FROM pg_catalog.pg_proc p WHERE p.pronamespace = ${ns}
|
|
345
353
|
) AND NOT EXISTS (
|
|
346
|
-
SELECT 1 FROM pg_type t WHERE t.typnamespace =
|
|
354
|
+
SELECT 1 FROM pg_catalog.pg_type t WHERE t.typnamespace = ${ns}
|
|
347
355
|
) AND NOT EXISTS (
|
|
348
|
-
SELECT 1 FROM pg_operator o WHERE o.oprnamespace =
|
|
349
|
-
)
|
|
350
|
-
var
|
|
356
|
+
SELECT 1 FROM pg_catalog.pg_operator o WHERE o.oprnamespace = ${ns}
|
|
357
|
+
)`;
|
|
358
|
+
var SCHEMA_EMPTY_SQL = `WITH ns AS (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
|
|
359
|
+
SELECT ${emptyPredicate("(SELECT oid FROM ns)")} AS empty`;
|
|
360
|
+
var schemaIsEmpty = (pg, name) => Effect6.map(pg.unsafe(SCHEMA_EMPTY_SQL, [name]), (rows) => rows[0]?.empty ?? true);
|
|
351
361
|
var isDependentObjectsError = (error) => {
|
|
352
362
|
const cause = error.reason.cause;
|
|
353
363
|
return typeof cause === "object" && cause !== null && cause.code === "2BP01";
|
|
@@ -360,10 +370,10 @@ var isDuplicateSchemaError = (error) => {
|
|
|
360
370
|
import { Resource as Resource2 } from "alchemy";
|
|
361
371
|
import { Unowned as Unowned2 } from "alchemy/AdoptPolicy";
|
|
362
372
|
import * as Provider2 from "alchemy/Provider";
|
|
363
|
-
import * as
|
|
373
|
+
import * as Effect12 from "effect/Effect";
|
|
364
374
|
|
|
365
375
|
// src/postgres/schema-identity.ts
|
|
366
|
-
import * as
|
|
376
|
+
import * as Effect7 from "effect/Effect";
|
|
367
377
|
|
|
368
378
|
// src/postgres/schema-errors.ts
|
|
369
379
|
import * as Data2 from "effect/Data";
|
|
@@ -404,6 +414,12 @@ class PostgresSchemaDropNotEmptyError extends Data2.TaggedError("PostgresSchemaD
|
|
|
404
414
|
}
|
|
405
415
|
}
|
|
406
416
|
|
|
417
|
+
class PostgresSchemaCascadeCrossSchemaRefused extends Data2.TaggedError("PostgresSchemaCascadeCrossSchemaRefused") {
|
|
418
|
+
get message() {
|
|
419
|
+
return `Postgres.Schema "${this.schema}": cascade: true refused — ${String(this.dependents)} ` + "dependent object(s) outside this schema would be dropped with it. No DROP was issued. " + "Remove or move those dependents first.";
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
407
423
|
class PostgresSchemaWrongDatabase extends Data2.TaggedError("PostgresSchemaWrongDatabase") {
|
|
408
424
|
get message() {
|
|
409
425
|
return `Postgres.Schema "${this.schema}": declared in database "${this.declared}" but the ` + `connection answers current_database() "${this.connected}". The handlers open the declared ` + "database themselves, so this points at broken provider wiring — fix it before touching any " + "schema, or the next create would land in the wrong database.";
|
|
@@ -436,15 +452,15 @@ class PostgresSchemaIdentityRefused extends Data2.TaggedError("PostgresSchemaIde
|
|
|
436
452
|
}
|
|
437
453
|
|
|
438
454
|
// src/postgres/schema-identity.ts
|
|
439
|
-
var assertSchemaTarget = (props, output) =>
|
|
455
|
+
var assertSchemaTarget = (props, output) => Effect7.gen(function* () {
|
|
440
456
|
if (output === undefined)
|
|
441
457
|
return;
|
|
442
458
|
if (props.name !== output.name)
|
|
443
|
-
return yield*
|
|
459
|
+
return yield* Effect7.fail(new PostgresSchemaRenameRefused({ from: output.name, to: props.name }));
|
|
444
460
|
if (props.database !== output.database)
|
|
445
|
-
return yield*
|
|
461
|
+
return yield* Effect7.fail(new PostgresSchemaDatabaseRefused({ from: output.database, to: props.database }));
|
|
446
462
|
});
|
|
447
|
-
var assertSchemaIdentity = (live, output) => live.oid === output.oid ?
|
|
463
|
+
var assertSchemaIdentity = (live, output) => live.oid === output.oid ? Effect7.void : Effect7.fail(new PostgresSchemaIdentityRefused({
|
|
448
464
|
schema: live.name,
|
|
449
465
|
storedOid: output.oid,
|
|
450
466
|
liveOid: live.oid
|
|
@@ -452,14 +468,14 @@ var assertSchemaIdentity = (live, output) => live.oid === output.oid ? Effect6.v
|
|
|
452
468
|
|
|
453
469
|
// src/postgres/schema-diff.ts
|
|
454
470
|
import { isResolved as isResolved2 } from "alchemy/Diff";
|
|
455
|
-
import * as
|
|
456
|
-
var diffPostgresSchema = (news, output, olds) =>
|
|
471
|
+
import * as Effect8 from "effect/Effect";
|
|
472
|
+
var diffPostgresSchema = (news, output, olds) => Effect8.gen(function* () {
|
|
457
473
|
if (output === undefined || !isResolved2(news))
|
|
458
474
|
return;
|
|
459
475
|
yield* assertSchemaTarget(news, output);
|
|
460
476
|
const nameRefusal = schemaNameByteRefusal(news.name);
|
|
461
477
|
if (nameRefusal !== undefined) {
|
|
462
|
-
return yield*
|
|
478
|
+
return yield* Effect8.fail(new PostgresSchemaNameRefused({ name: news.name, ...nameRefusal }));
|
|
463
479
|
}
|
|
464
480
|
const comment = normalizedComment(news.comment);
|
|
465
481
|
const changed = news.owner !== undefined && news.owner !== output.owner || comment !== undefined && comment !== (output.comment ?? undefined) || (news.cascade ?? false) !== (olds?.cascade ?? false);
|
|
@@ -467,11 +483,11 @@ var diffPostgresSchema = (news, output, olds) => Effect7.gen(function* () {
|
|
|
467
483
|
});
|
|
468
484
|
|
|
469
485
|
// src/postgres/schema-reconcile.ts
|
|
470
|
-
import * as
|
|
486
|
+
import * as Effect10 from "effect/Effect";
|
|
471
487
|
|
|
472
488
|
// src/postgres/schema-assert.ts
|
|
473
|
-
import * as
|
|
474
|
-
var assertDatabase = (props, pg) =>
|
|
489
|
+
import * as Effect9 from "effect/Effect";
|
|
490
|
+
var assertDatabase = (props, pg) => Effect9.flatMap(currentDatabase(pg), (connected) => connected === props.database ? Effect9.void : Effect9.fail(new PostgresSchemaWrongDatabase({
|
|
475
491
|
schema: props.name,
|
|
476
492
|
declared: props.database,
|
|
477
493
|
connected
|
|
@@ -491,7 +507,7 @@ var liveDrift2 = (props, live, executingRole) => {
|
|
|
491
507
|
}
|
|
492
508
|
return;
|
|
493
509
|
};
|
|
494
|
-
var refuse = (props, drift) =>
|
|
510
|
+
var refuse = (props, drift) => Effect9.fail(new PostgresSchemaDrift({
|
|
495
511
|
schema: props.name,
|
|
496
512
|
prop: drift.prop,
|
|
497
513
|
declared: drift.declared,
|
|
@@ -499,11 +515,11 @@ var refuse = (props, drift) => Effect8.fail(new PostgresSchemaDrift({
|
|
|
499
515
|
}));
|
|
500
516
|
var assertOwner = (props, row, executingRole) => {
|
|
501
517
|
const drift = ownerDrift(props, row, executingRole);
|
|
502
|
-
return drift === undefined ?
|
|
518
|
+
return drift === undefined ? Effect9.void : refuse(props, drift);
|
|
503
519
|
};
|
|
504
520
|
var assertLive = (props, row, executingRole) => {
|
|
505
521
|
const drift = liveDrift2(props, row, executingRole);
|
|
506
|
-
return drift === undefined ?
|
|
522
|
+
return drift === undefined ? Effect9.succeed(row) : refuse(props, drift);
|
|
507
523
|
};
|
|
508
524
|
var deleteForeignRefusal = (props, live, output) => {
|
|
509
525
|
if (output !== undefined && output.oid === live.oid && output.owner === live.owner) {
|
|
@@ -520,7 +536,7 @@ var deleteForeignRefusal = (props, live, output) => {
|
|
|
520
536
|
};
|
|
521
537
|
|
|
522
538
|
// src/postgres/schema-reconcile.ts
|
|
523
|
-
var reconcileWithClient2 = (pg, props, output) =>
|
|
539
|
+
var reconcileWithClient2 = (pg, props, output) => Effect10.gen(function* () {
|
|
524
540
|
yield* assertSchemaTarget(props, output);
|
|
525
541
|
yield* assertDatabase(props, pg);
|
|
526
542
|
const executingRole = props.owner !== undefined ? props.owner : yield* currentUser(pg);
|
|
@@ -529,55 +545,215 @@ var reconcileWithClient2 = (pg, props, output) => Effect9.gen(function* () {
|
|
|
529
545
|
if (props.owner !== undefined) {
|
|
530
546
|
const ownerPresent = yield* roleExists(pg, props.owner);
|
|
531
547
|
if (!ownerPresent) {
|
|
532
|
-
return yield*
|
|
548
|
+
return yield* Effect10.fail(new PostgresSchemaOwnerMissing({ schema: props.name, owner: props.owner }));
|
|
533
549
|
}
|
|
534
550
|
}
|
|
535
551
|
const createRefusal = (error) => isDuplicateSchemaError(error) ? new PostgresSchemaExistsRefused({ schema: props.name, database: props.database }) : error;
|
|
536
|
-
yield* pg.unsafe(buildCreateSchemaSql(props)).pipe(
|
|
552
|
+
yield* pg.unsafe(buildCreateSchemaSql(props)).pipe(Effect10.asVoid, Effect10.catchTag("SqlError", (error) => Effect10.fail(createRefusal(error))));
|
|
537
553
|
const created = yield* selectSchema(pg, props.name);
|
|
538
554
|
if (created === undefined) {
|
|
539
|
-
return yield*
|
|
555
|
+
return yield* Effect10.fail(new PostgresSchemaCreateVanished({ schema: props.name }));
|
|
540
556
|
}
|
|
541
557
|
yield* assertOwner(props, created, executingRole);
|
|
542
558
|
const comment = normalizedComment(props.comment);
|
|
543
559
|
if (comment !== undefined && comment !== (created.comment ?? undefined)) {
|
|
544
|
-
yield* pg.unsafe(buildCommentSchemaSql(props.name, comment)).pipe(
|
|
560
|
+
yield* pg.unsafe(buildCommentSchemaSql(props.name, comment)).pipe(Effect10.asVoid);
|
|
545
561
|
const commented = yield* selectSchema(pg, props.name);
|
|
546
562
|
if (commented === undefined) {
|
|
547
|
-
return yield*
|
|
563
|
+
return yield* Effect10.fail(new PostgresSchemaCreateVanished({ schema: props.name }));
|
|
548
564
|
}
|
|
549
565
|
return yield* assertLive(props, commented, executingRole);
|
|
550
566
|
}
|
|
551
567
|
return yield* assertLive(props, created, executingRole);
|
|
552
568
|
}
|
|
553
569
|
if (output === undefined) {
|
|
554
|
-
return yield*
|
|
570
|
+
return yield* Effect10.fail(new PostgresSchemaExistsRefused({ schema: props.name, database: props.database }));
|
|
555
571
|
}
|
|
556
572
|
yield* assertSchemaIdentity(observed, output);
|
|
557
573
|
return yield* assertLive(props, observed, executingRole);
|
|
558
574
|
});
|
|
559
575
|
|
|
560
576
|
// src/postgres/schema-delete.ts
|
|
561
|
-
import * as
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
577
|
+
import * as Effect11 from "effect/Effect";
|
|
578
|
+
|
|
579
|
+
// src/postgres/schema-closure-sql.ts
|
|
580
|
+
var cls = (name) => `'pg_catalog.${name}'::pg_catalog.regclass`;
|
|
581
|
+
var direct = (table, column) => `WHEN ${cls(table)} THEN (SELECT x.${column} FROM pg_catalog.${table} x WHERE x.oid = d.objid)`;
|
|
582
|
+
var viaRelation = (table, column) => `WHEN ${cls(table)} THEN (SELECT c.relnamespace FROM pg_catalog.${table} x JOIN pg_catalog.pg_class c ON c.oid = x.${column} WHERE x.oid = d.objid)`;
|
|
583
|
+
var viaFamily = (table, column) => `WHEN ${cls(table)} THEN (SELECT f.opfnamespace FROM pg_catalog.${table} x JOIN pg_catalog.pg_opfamily f ON f.oid = x.${column} WHERE x.oid = d.objid)`;
|
|
584
|
+
var RELATION_HOME = `WHEN ${cls("pg_class")} THEN COALESCE(
|
|
585
|
+
(SELECT o.relnamespace FROM pg_catalog.pg_class o
|
|
586
|
+
WHERE o.reltoastrelid <> 0
|
|
587
|
+
AND o.reltoastrelid IN (d.objid, (SELECT i.indrelid FROM pg_catalog.pg_index i WHERE i.indexrelid = d.objid))),
|
|
588
|
+
(SELECT x.relnamespace FROM pg_catalog.pg_class x WHERE x.oid = d.objid))`;
|
|
589
|
+
var HOME_OF_DEPENDENT = `CASE d.classid
|
|
590
|
+
WHEN ${cls("pg_namespace")} THEN d.objid
|
|
591
|
+
${RELATION_HOME}
|
|
592
|
+
${direct("pg_type", "typnamespace")}
|
|
593
|
+
${direct("pg_proc", "pronamespace")}
|
|
594
|
+
${direct("pg_operator", "oprnamespace")}
|
|
595
|
+
${direct("pg_collation", "collnamespace")}
|
|
596
|
+
${direct("pg_conversion", "connamespace")}
|
|
597
|
+
${direct("pg_opclass", "opcnamespace")}
|
|
598
|
+
${direct("pg_opfamily", "opfnamespace")}
|
|
599
|
+
${direct("pg_ts_config", "cfgnamespace")}
|
|
600
|
+
${direct("pg_ts_dict", "dictnamespace")}
|
|
601
|
+
${direct("pg_ts_parser", "prsnamespace")}
|
|
602
|
+
${direct("pg_ts_template", "tmplnamespace")}
|
|
603
|
+
${direct("pg_statistic_ext", "stxnamespace")}
|
|
604
|
+
${direct("pg_constraint", "connamespace")}
|
|
605
|
+
${direct("pg_default_acl", "defaclnamespace")}
|
|
606
|
+
${direct("pg_extension", "extnamespace")}
|
|
607
|
+
${viaRelation("pg_trigger", "tgrelid")}
|
|
608
|
+
${viaRelation("pg_rewrite", "ev_class")}
|
|
609
|
+
${viaRelation("pg_attrdef", "adrelid")}
|
|
610
|
+
${viaRelation("pg_policy", "polrelid")}
|
|
611
|
+
${viaRelation("pg_publication_rel", "prrelid")}
|
|
612
|
+
${viaFamily("pg_amop", "amopfamily")}
|
|
613
|
+
${viaFamily("pg_amproc", "amprocfamily")}
|
|
614
|
+
END`;
|
|
615
|
+
var OUTSIDE_DEPENDENTS_SQL = `v_count := (
|
|
616
|
+
WITH RECURSIVE reach (classid, objid, inside) AS (
|
|
617
|
+
SELECT ${cls("pg_namespace")}::pg_catalog.oid, v_ns, true
|
|
618
|
+
UNION
|
|
619
|
+
SELECT d.classid, d.objid, (${HOME_OF_DEPENDENT}) IS NOT DISTINCT FROM v_ns
|
|
620
|
+
FROM pg_catalog.pg_depend d
|
|
621
|
+
JOIN reach r ON d.refclassid = r.classid AND d.refobjid = r.objid AND r.inside
|
|
622
|
+
WHERE d.deptype <> 'p'
|
|
623
|
+
)
|
|
624
|
+
SELECT (SELECT pg_catalog.count(*) FROM reach WHERE NOT inside)
|
|
625
|
+
+ (SELECT pg_catalog.count(*) FROM pg_catalog.pg_depend e
|
|
626
|
+
JOIN reach r ON e.classid = r.classid AND e.objid = r.objid AND r.inside
|
|
627
|
+
WHERE e.deptype IN ('e', 'i') AND e.refobjid <> 0
|
|
628
|
+
AND NOT EXISTS (SELECT 1 FROM reach o
|
|
629
|
+
WHERE o.inside AND o.classid = e.refclassid AND o.objid = e.refobjid))
|
|
630
|
+
)`;
|
|
631
|
+
|
|
632
|
+
// src/postgres/schema-drop-sql.ts
|
|
633
|
+
var IDENTITY_CHANGED = "HF001";
|
|
634
|
+
var NOT_EMPTY = "HF002";
|
|
635
|
+
var CROSS_SCHEMA_DEPENDENTS = "HF003";
|
|
636
|
+
var CASCADE_SEQUENCES = "HF004";
|
|
637
|
+
var LOCK_TIMEOUT = "10s";
|
|
638
|
+
var buildAtomicDropSql = (drop) => {
|
|
639
|
+
const body = `DECLARE
|
|
640
|
+
v_name text := ${quoteStringLiteral(drop.name)};
|
|
641
|
+
v_oid oid := ${String(Math.trunc(drop.oid))};
|
|
642
|
+
v_owner text := ${quoteStringLiteral(drop.owner)};
|
|
643
|
+
v_cascade boolean := ${drop.cascade ? "true" : "false"};
|
|
644
|
+
v_ns oid;
|
|
645
|
+
v_count bigint;
|
|
646
|
+
v_comment text;
|
|
647
|
+
v_rel text;
|
|
648
|
+
BEGIN
|
|
649
|
+
SELECT n.oid INTO v_ns FROM pg_catalog.pg_namespace n WHERE n.nspname = v_name;
|
|
650
|
+
IF v_ns IS NULL THEN RETURN; END IF;
|
|
651
|
+
PERFORM pg_catalog.set_config('lock_timeout', '${LOCK_TIMEOUT}', true);
|
|
652
|
+
PERFORM pg_catalog.pg_advisory_xact_lock(v_ns::pg_catalog.int8);
|
|
653
|
+
v_comment := pg_catalog.obj_description(v_ns, 'pg_namespace');
|
|
654
|
+
EXECUTE pg_catalog.format('COMMENT ON SCHEMA %I IS %L', v_name, v_comment);
|
|
655
|
+
SELECT n.oid INTO v_ns FROM pg_catalog.pg_namespace n
|
|
656
|
+
WHERE n.nspname = v_name AND n.oid = v_oid
|
|
657
|
+
AND pg_catalog.pg_get_userbyid(n.nspowner) = v_owner;
|
|
658
|
+
IF v_ns IS NULL THEN
|
|
659
|
+
RAISE EXCEPTION 'schema identity changed' USING ERRCODE = '${IDENTITY_CHANGED}';
|
|
660
|
+
END IF;
|
|
661
|
+
IF NOT v_cascade THEN
|
|
662
|
+
IF NOT (${emptyPredicate("v_ns")}) THEN
|
|
663
|
+
RAISE EXCEPTION 'schema not empty' USING ERRCODE = '${NOT_EMPTY}';
|
|
664
|
+
END IF;
|
|
665
|
+
ELSE
|
|
666
|
+
SELECT count(*) INTO v_count FROM pg_catalog.pg_class c
|
|
667
|
+
WHERE c.relnamespace = v_ns AND c.relkind = 'S';
|
|
668
|
+
IF v_count > 0 THEN
|
|
669
|
+
RAISE EXCEPTION 'cascade sequences: %', v_count USING ERRCODE = '${CASCADE_SEQUENCES}';
|
|
670
|
+
END IF;
|
|
671
|
+
FOR v_rel IN SELECT c.oid::pg_catalog.regclass::pg_catalog.text FROM pg_catalog.pg_class c
|
|
672
|
+
WHERE c.relnamespace = v_ns AND c.relkind IN ('r', 'p', 'v', 'm', 'f') ORDER BY c.oid LOOP
|
|
673
|
+
EXECUTE pg_catalog.format('LOCK TABLE %s IN ACCESS EXCLUSIVE MODE', v_rel);
|
|
674
|
+
END LOOP;
|
|
675
|
+
${OUTSIDE_DEPENDENTS_SQL};
|
|
676
|
+
IF v_count > 0 THEN
|
|
677
|
+
RAISE EXCEPTION 'cross-schema dependents: %', v_count USING ERRCODE = '${CROSS_SCHEMA_DEPENDENTS}';
|
|
678
|
+
END IF;
|
|
679
|
+
END IF;
|
|
680
|
+
PERFORM 1 FROM pg_catalog.pg_namespace n WHERE n.oid = v_oid AND n.nspname = v_name;
|
|
681
|
+
IF NOT FOUND THEN
|
|
682
|
+
RAISE EXCEPTION 'schema identity changed' USING ERRCODE = '${IDENTITY_CHANGED}';
|
|
683
|
+
END IF;
|
|
684
|
+
EXECUTE ${quoteStringLiteral(buildDropSchemaSql(drop.name, drop.cascade))};
|
|
685
|
+
END`;
|
|
686
|
+
return `DO ${quoteStringLiteral(body)}`;
|
|
687
|
+
};
|
|
688
|
+
var sqlStateOf = (error) => {
|
|
689
|
+
const cause = error.reason.cause;
|
|
690
|
+
const code = typeof cause === "object" && cause !== null ? cause.code : "";
|
|
691
|
+
return typeof code === "string" ? code : undefined;
|
|
692
|
+
};
|
|
693
|
+
var dependentsCount = (error) => {
|
|
694
|
+
const cause = error.reason.cause;
|
|
695
|
+
const message = typeof cause === "object" && cause !== null ? cause.message : "";
|
|
696
|
+
const parsed = /dependents:\s*(\d+)/.exec(message ?? "")?.[1];
|
|
697
|
+
return Math.max(1, Number(parsed ?? 1));
|
|
698
|
+
};
|
|
699
|
+
|
|
700
|
+
// src/postgres/schema-sequence-error.ts
|
|
701
|
+
import * as Data3 from "effect/Data";
|
|
702
|
+
|
|
703
|
+
class PostgresSchemaCascadeSequencesRefused extends Data3.TaggedError("PostgresSchemaCascadeSequencesRefused") {
|
|
704
|
+
get message() {
|
|
705
|
+
return `Postgres.Schema "${this.schema}": cascade: true refused — the schema holds ` + `${String(this.sequences)} sequence(s) (serial/identity columns own one), which cannot be ` + "locked, so a concurrent dependent could escape the cascade proof. No DROP was issued. " + "Drop the schema contents first, then declare cascade: false.";
|
|
568
706
|
}
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
707
|
+
}
|
|
708
|
+
var sequencesCount = (error) => {
|
|
709
|
+
const cause = error.reason.cause;
|
|
710
|
+
const message = typeof cause === "object" && cause !== null ? cause.message : "";
|
|
711
|
+
return Math.max(1, Number(/sequences:\s*(\d+)/.exec(message ?? "")?.[1] ?? 1));
|
|
712
|
+
};
|
|
713
|
+
|
|
714
|
+
// src/postgres/schema-delete.ts
|
|
715
|
+
var dropAtomic = (pg, props, live) => {
|
|
716
|
+
const cascade = props.cascade === true;
|
|
717
|
+
const classify = (error) => {
|
|
718
|
+
const state = sqlStateOf(error);
|
|
719
|
+
if (state === NOT_EMPTY || !cascade && isDependentObjectsError(error)) {
|
|
720
|
+
return Effect11.fail(new PostgresSchemaDropNotEmptyError({ schema: props.name }));
|
|
721
|
+
}
|
|
722
|
+
if (state === CROSS_SCHEMA_DEPENDENTS) {
|
|
723
|
+
return Effect11.fail(new PostgresSchemaCascadeCrossSchemaRefused({
|
|
724
|
+
schema: props.name,
|
|
725
|
+
dependents: dependentsCount(error)
|
|
726
|
+
}));
|
|
727
|
+
}
|
|
728
|
+
if (state === CASCADE_SEQUENCES) {
|
|
729
|
+
return Effect11.fail(new PostgresSchemaCascadeSequencesRefused({
|
|
730
|
+
schema: props.name,
|
|
731
|
+
sequences: sequencesCount(error)
|
|
732
|
+
}));
|
|
733
|
+
}
|
|
734
|
+
if (state === IDENTITY_CHANGED) {
|
|
735
|
+
return Effect11.flatMap(selectSchema(pg, props.name), (now) => now === undefined ? Effect11.void : Effect11.fail(new PostgresSchemaDeleteForeignRefused({
|
|
736
|
+
schema: props.name,
|
|
737
|
+
database: props.database,
|
|
738
|
+
liveOid: now.oid,
|
|
739
|
+
liveOwner: now.owner,
|
|
740
|
+
lastOid: live.oid,
|
|
741
|
+
lastOwner: live.owner
|
|
742
|
+
})));
|
|
743
|
+
}
|
|
744
|
+
return Effect11.fail(error);
|
|
745
|
+
};
|
|
746
|
+
return pg.unsafe(buildAtomicDropSql({ name: props.name, oid: live.oid, owner: live.owner, cascade })).pipe(Effect11.asVoid, Effect11.catchTag("SqlError", classify));
|
|
747
|
+
};
|
|
748
|
+
var deleteWithClient = (pg, props, output) => Effect11.gen(function* () {
|
|
573
749
|
yield* assertDatabase(props, pg);
|
|
574
750
|
const live = yield* selectSchema(pg, props.name);
|
|
575
751
|
if (live === undefined)
|
|
576
752
|
return;
|
|
577
753
|
const refusal = deleteForeignRefusal(props, live, output);
|
|
578
754
|
if (refusal !== undefined)
|
|
579
|
-
return yield*
|
|
580
|
-
yield*
|
|
755
|
+
return yield* Effect11.fail(refusal);
|
|
756
|
+
yield* dropAtomic(pg, props, live);
|
|
581
757
|
});
|
|
582
758
|
|
|
583
759
|
// src/postgres/schema.ts
|
|
@@ -587,9 +763,9 @@ var PostgresSchema = Resource2("Postgres.Schema", {
|
|
|
587
763
|
var isPostgresSchema = (value) => (typeof value === "object" || typeof value === "function") && value !== null && value.Type === "Postgres.Schema";
|
|
588
764
|
var readWithClient2 = (pg, name) => selectSchema(pg, name);
|
|
589
765
|
var postgresSchemaHandlers = PostgresSchema.Provider.of({
|
|
590
|
-
list: () =>
|
|
766
|
+
list: () => Effect12.succeed([]),
|
|
591
767
|
nuke: { skip: true },
|
|
592
|
-
read: ({ olds, output }) =>
|
|
768
|
+
read: ({ olds, output }) => Effect12.gen(function* () {
|
|
593
769
|
const name = output?.name ?? olds.name;
|
|
594
770
|
const database = output?.database ?? olds.database;
|
|
595
771
|
const present = yield* withPg((pg) => databaseExists(pg, database));
|
|
@@ -597,7 +773,7 @@ var postgresSchemaHandlers = PostgresSchema.Provider.of({
|
|
|
597
773
|
return;
|
|
598
774
|
const live = yield* withPg((pg) => readWithClient2(pg, name), database);
|
|
599
775
|
if (live !== undefined && live.database !== database) {
|
|
600
|
-
return yield*
|
|
776
|
+
return yield* Effect12.fail(new PostgresSchemaWrongDatabase({
|
|
601
777
|
schema: name,
|
|
602
778
|
declared: database,
|
|
603
779
|
connected: live.database
|
|
@@ -608,15 +784,15 @@ var postgresSchemaHandlers = PostgresSchema.Provider.of({
|
|
|
608
784
|
return live === undefined ? undefined : Unowned2(live);
|
|
609
785
|
}),
|
|
610
786
|
diff: ({ news, output, olds }) => diffPostgresSchema(news, output, olds),
|
|
611
|
-
reconcile: ({ news, output }) =>
|
|
787
|
+
reconcile: ({ news, output }) => Effect12.gen(function* () {
|
|
612
788
|
const nameRefusal = schemaNameByteRefusal(news.name);
|
|
613
789
|
if (nameRefusal !== undefined) {
|
|
614
|
-
return yield*
|
|
790
|
+
return yield* Effect12.fail(new PostgresSchemaNameRefused({ name: news.name, ...nameRefusal }));
|
|
615
791
|
}
|
|
616
792
|
yield* assertSchemaTarget(news, output);
|
|
617
793
|
return yield* withPg((pg) => reconcileWithClient2(pg, news, output), news.database);
|
|
618
794
|
}),
|
|
619
|
-
delete: ({ olds, output }) =>
|
|
795
|
+
delete: ({ olds, output }) => Effect12.gen(function* () {
|
|
620
796
|
const present = yield* withPg((pg) => databaseExists(pg, olds.database));
|
|
621
797
|
if (!present)
|
|
622
798
|
return;
|
|
@@ -706,7 +882,7 @@ var revokePublicTablesSql = (schema) => `REVOKE ALL ON ALL TABLES IN SCHEMA ${qu
|
|
|
706
882
|
import { Resource as Resource3 } from "alchemy";
|
|
707
883
|
import { Unowned as Unowned3 } from "alchemy/AdoptPolicy";
|
|
708
884
|
import * as Provider3 from "alchemy/Provider";
|
|
709
|
-
import * as
|
|
885
|
+
import * as Effect18 from "effect/Effect";
|
|
710
886
|
|
|
711
887
|
// src/postgres/grants-declare.ts
|
|
712
888
|
var cleanWords = (words) => [...new Set(words)].sort();
|
|
@@ -781,7 +957,7 @@ var removedNames = (output, declared) => {
|
|
|
781
957
|
};
|
|
782
958
|
|
|
783
959
|
// src/postgres/grants-ops.ts
|
|
784
|
-
import * as
|
|
960
|
+
import * as Effect17 from "effect/Effect";
|
|
785
961
|
import { isResolved as isResolved3 } from "alchemy/Diff";
|
|
786
962
|
|
|
787
963
|
// src/postgres/grants-refuse.ts
|
|
@@ -1038,72 +1214,72 @@ var grantsDiffer = (declared, live) => {
|
|
|
1038
1214
|
};
|
|
1039
1215
|
|
|
1040
1216
|
// src/postgres/grants-existence.ts
|
|
1041
|
-
import * as
|
|
1217
|
+
import * as Effect13 from "effect/Effect";
|
|
1042
1218
|
|
|
1043
1219
|
// src/postgres/grants-errors.ts
|
|
1044
|
-
import * as
|
|
1220
|
+
import * as Data4 from "effect/Data";
|
|
1045
1221
|
|
|
1046
|
-
class PostgresGrantsPrivilegeRefused extends
|
|
1222
|
+
class PostgresGrantsPrivilegeRefused extends Data4.TaggedError("PostgresGrantsPrivilegeRefused") {
|
|
1047
1223
|
get message() {
|
|
1048
1224
|
return `Postgres.Grants: "${this.prop}" declares "${this.word}", which is not in the vocabulary ` + "PostgreSQL 18 grants on that object class (see grants-attrs.ts for the three sets, traced " + "to acl.h at REL_18_6). Column grants take select/insert/update/references only — TRUNCATE, " + "TRIGGER and MAINTAIN are table-wide.";
|
|
1049
1225
|
}
|
|
1050
1226
|
}
|
|
1051
1227
|
|
|
1052
|
-
class PostgresGrantsNameRefused extends
|
|
1228
|
+
class PostgresGrantsNameRefused extends Data4.TaggedError("PostgresGrantsNameRefused") {
|
|
1053
1229
|
get message() {
|
|
1054
1230
|
return `Postgres.Grants: the name "${this.name}" is ${String(this.byteLength)} UTF-8 bytes, over the ` + `${String(this.limit)}-byte limit (NAMEDATALEN 64, minus the terminator). PostgreSQL would ` + "accept the statement and silently truncate the name with only a NOTICE, so this plan refuses " + "it instead of granting on an object no later read will ever find again.";
|
|
1055
1231
|
}
|
|
1056
1232
|
}
|
|
1057
1233
|
|
|
1058
|
-
class PostgresGrantsDuplicateObject extends
|
|
1234
|
+
class PostgresGrantsDuplicateObject extends Data4.TaggedError("PostgresGrantsDuplicateObject") {
|
|
1059
1235
|
get message() {
|
|
1060
1236
|
return `Postgres.Grants: "${this.prop}" declares "${this.name}" twice. Merge the entries into one — ` + "the declaration must state each object at most once, and each privilege word in exactly one " + "form: plain, or WITH GRANT OPTION (`select` and `select*` cannot both hold, the server keeps " + "one aclitem per grantee per grantor).";
|
|
1061
1237
|
}
|
|
1062
1238
|
}
|
|
1063
1239
|
|
|
1064
|
-
class PostgresGrantsRetargetRefused extends
|
|
1240
|
+
class PostgresGrantsRetargetRefused extends Data4.TaggedError("PostgresGrantsRetargetRefused") {
|
|
1065
1241
|
get message() {
|
|
1066
1242
|
return `Postgres.Grants: the declared ${this.prop} changed from "${this.from}" to "${this.to}". A ` + "retarget is refused at plan — declare a new logical id for the new target and delete the old " + "one (its retain policy keeps the grants until a destroy revokes them).";
|
|
1067
1243
|
}
|
|
1068
1244
|
}
|
|
1069
1245
|
|
|
1070
|
-
class PostgresGrantsDatabaseMismatch extends
|
|
1246
|
+
class PostgresGrantsDatabaseMismatch extends Data4.TaggedError("PostgresGrantsDatabaseMismatch") {
|
|
1071
1247
|
get message() {
|
|
1072
1248
|
return `Postgres.Grants: the declaration names database "${this.declared}" but ` + `current_database() is "${this.connected}". The handlers open the declared database and ` + "prove it before any GRANT or REVOKE — a mismatch means that open did not land there.";
|
|
1073
1249
|
}
|
|
1074
1250
|
}
|
|
1075
1251
|
|
|
1076
|
-
class PostgresGrantsSchemaMissing extends
|
|
1252
|
+
class PostgresGrantsSchemaMissing extends Data4.TaggedError("PostgresGrantsSchemaMissing") {
|
|
1077
1253
|
get message() {
|
|
1078
1254
|
return `Postgres.Grants: schema "${this.schema}" is not in pg_namespace. Grants are written into a ` + "schema that already exists — declare a Postgres.Schema (or create it by hand) before the " + "grant set that scopes to it.";
|
|
1079
1255
|
}
|
|
1080
1256
|
}
|
|
1081
1257
|
|
|
1082
|
-
class PostgresGrantsDatabaseMissing extends
|
|
1258
|
+
class PostgresGrantsDatabaseMissing extends Data4.TaggedError("PostgresGrantsDatabaseMissing") {
|
|
1083
1259
|
get message() {
|
|
1084
1260
|
return `Postgres.Grants: database "${this.database}" is not in pg_database. Grants are written into ` + "a database that already exists — declare a Postgres.Database (or create it by hand) before " + "the grant set that scopes to it.";
|
|
1085
1261
|
}
|
|
1086
1262
|
}
|
|
1087
1263
|
|
|
1088
|
-
class PostgresGrantsRoleMissing extends
|
|
1264
|
+
class PostgresGrantsRoleMissing extends Data4.TaggedError("PostgresGrantsRoleMissing") {
|
|
1089
1265
|
get message() {
|
|
1090
1266
|
return `Postgres.Grants: role "${this.role}" is not in pg_roles. GRANT and ALTER DEFAULT PRIVILEGES ` + "would fail against it — create the role (a group role per seat, membership owned by a human) " + "before declaring its grants.";
|
|
1091
1267
|
}
|
|
1092
1268
|
}
|
|
1093
1269
|
|
|
1094
|
-
class PostgresGrantsTableMissing extends
|
|
1270
|
+
class PostgresGrantsTableMissing extends Data4.TaggedError("PostgresGrantsTableMissing") {
|
|
1095
1271
|
get message() {
|
|
1096
1272
|
return `Postgres.Grants: table "${this.schema}"."${this.table}" does not exist. The declaration ` + "names a relation before it is created; create the table (or fix the name) before granting.";
|
|
1097
1273
|
}
|
|
1098
1274
|
}
|
|
1099
1275
|
|
|
1100
|
-
class PostgresGrantsColumnMissing extends
|
|
1276
|
+
class PostgresGrantsColumnMissing extends Data4.TaggedError("PostgresGrantsColumnMissing") {
|
|
1101
1277
|
get message() {
|
|
1102
1278
|
return `Postgres.Grants: column "${this.column}" of "${this.schema}"."${this.table}" does not ` + "exist. Declare the column (or fix its name) before granting on it.";
|
|
1103
1279
|
}
|
|
1104
1280
|
}
|
|
1105
1281
|
|
|
1106
|
-
class PostgresGrantsRepairRefused extends
|
|
1282
|
+
class PostgresGrantsRepairRefused extends Data4.TaggedError("PostgresGrantsRepairRefused") {
|
|
1107
1283
|
get message() {
|
|
1108
1284
|
return `Postgres.Grants: the repair on schema "${this.schema}" for role "${this.role}" re-read as ` + `still drifted; these statements would run again: ${this.remaining.join(" ; ")}. A grant made ` + "by another role survives this resource’s REVOKE (only its grantor or the object’s " + "owner can revoke it) — revoke it as that grantor or the owner, or declare the privilege so " + "the set matches.";
|
|
1109
1285
|
}
|
|
@@ -1112,39 +1288,39 @@ class PostgresGrantsRepairRefused extends Data3.TaggedError("PostgresGrantsRepai
|
|
|
1112
1288
|
// src/postgres/grants-existence.ts
|
|
1113
1289
|
var TABLES_PRESENT_SQL = `SELECT
|
|
1114
1290
|
c.relname AS table
|
|
1115
|
-
FROM pg_class c
|
|
1116
|
-
WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
|
|
1117
|
-
AND c.relname::text IN (SELECT json_array_elements_text($2::json))`;
|
|
1118
|
-
var findMissingTable = (pg, schema, tables) => tables.length === 0 ?
|
|
1291
|
+
FROM pg_catalog.pg_class c
|
|
1292
|
+
WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
|
|
1293
|
+
AND c.relname::text IN (SELECT pg_catalog.json_array_elements_text($2::json))`;
|
|
1294
|
+
var findMissingTable = (pg, schema, tables) => tables.length === 0 ? Effect13.succeed(undefined) : Effect13.map(pg.unsafe(TABLES_PRESENT_SQL, [schema, JSON.stringify(tables)]), (rows) => {
|
|
1119
1295
|
const present = new Set(rows.map((row) => row.table));
|
|
1120
1296
|
return tables.find((table) => !present.has(table));
|
|
1121
1297
|
});
|
|
1122
1298
|
var COLUMNS_PRESENT_SQL = `SELECT
|
|
1123
1299
|
c.relname AS table,
|
|
1124
1300
|
a.attname AS column
|
|
1125
|
-
FROM pg_attribute a
|
|
1126
|
-
JOIN pg_class c ON c.oid = a.attrelid
|
|
1127
|
-
WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
|
|
1301
|
+
FROM pg_catalog.pg_attribute a
|
|
1302
|
+
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
|
|
1303
|
+
WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
|
|
1128
1304
|
AND a.attnum > 0
|
|
1129
1305
|
AND NOT a.attisdropped
|
|
1130
1306
|
AND (c.relname, a.attname) IN (
|
|
1131
|
-
SELECT x->>0, x->>1 FROM json_array_elements($2::json) x
|
|
1307
|
+
SELECT x->>0, x->>1 FROM pg_catalog.json_array_elements($2::json) x
|
|
1132
1308
|
)`;
|
|
1133
|
-
var findMissingColumn = (pg, schema, columns) => columns.length === 0 ?
|
|
1309
|
+
var findMissingColumn = (pg, schema, columns) => columns.length === 0 ? Effect13.succeed(undefined) : Effect13.map(pg.unsafe(COLUMNS_PRESENT_SQL, [
|
|
1134
1310
|
schema,
|
|
1135
1311
|
JSON.stringify(columns.map(({ table, column }) => [table, column]))
|
|
1136
1312
|
]), (rows) => {
|
|
1137
1313
|
const present = new Set(rows.map((row) => `${row.table}\x00${row.column}`));
|
|
1138
1314
|
return columns.find(({ table, column }) => !present.has(`${table}\x00${column}`));
|
|
1139
1315
|
});
|
|
1140
|
-
var requireDeclaredObjectsExist = (pg, declared) =>
|
|
1316
|
+
var requireDeclaredObjectsExist = (pg, declared) => Effect13.gen(function* () {
|
|
1141
1317
|
const missingTable = yield* findMissingTable(pg, declared.schema, declared.tables.map((table) => table.table));
|
|
1142
1318
|
if (missingTable !== undefined) {
|
|
1143
|
-
return yield*
|
|
1319
|
+
return yield* Effect13.fail(new PostgresGrantsTableMissing({ schema: declared.schema, table: missingTable }));
|
|
1144
1320
|
}
|
|
1145
1321
|
const missingColumn = yield* findMissingColumn(pg, declared.schema, declared.columns.map((column) => ({ table: column.table, column: column.column })));
|
|
1146
1322
|
if (missingColumn !== undefined) {
|
|
1147
|
-
return yield*
|
|
1323
|
+
return yield* Effect13.fail(new PostgresGrantsColumnMissing({
|
|
1148
1324
|
schema: declared.schema,
|
|
1149
1325
|
table: missingColumn.table,
|
|
1150
1326
|
column: missingColumn.column
|
|
@@ -1153,35 +1329,35 @@ var requireDeclaredObjectsExist = (pg, declared) => Effect12.gen(function* () {
|
|
|
1153
1329
|
});
|
|
1154
1330
|
|
|
1155
1331
|
// src/postgres/grants-read.ts
|
|
1156
|
-
import * as
|
|
1332
|
+
import * as Effect16 from "effect/Effect";
|
|
1157
1333
|
|
|
1158
1334
|
// src/postgres/grants-ownership.ts
|
|
1159
|
-
import * as
|
|
1335
|
+
import * as Effect14 from "effect/Effect";
|
|
1160
1336
|
var SCHEMA_OWNER_SQL = `SELECT
|
|
1161
|
-
n.nspowner = (SELECT oid FROM pg_roles WHERE rolname = $2) AS role_owns
|
|
1162
|
-
FROM pg_namespace n
|
|
1337
|
+
n.nspowner = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2) AS role_owns
|
|
1338
|
+
FROM pg_catalog.pg_namespace n
|
|
1163
1339
|
WHERE n.nspname = $1`;
|
|
1164
|
-
var readSchemaOwnership = (pg, schema, role) =>
|
|
1340
|
+
var readSchemaOwnership = (pg, schema, role) => Effect14.map(pg.unsafe(SCHEMA_OWNER_SQL, [schema, role]), (rows) => rows[0]?.role_owns === true);
|
|
1165
1341
|
var OWNED_TABLES_SQL = `SELECT c.relname AS table
|
|
1166
|
-
FROM pg_class c
|
|
1167
|
-
WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
|
|
1168
|
-
AND c.relowner = (SELECT oid FROM pg_roles WHERE rolname = $2)
|
|
1342
|
+
FROM pg_catalog.pg_class c
|
|
1343
|
+
WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
|
|
1344
|
+
AND c.relowner = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2)
|
|
1169
1345
|
ORDER BY c.relname`;
|
|
1170
|
-
var readOwnedTables = (pg, schema, role) =>
|
|
1346
|
+
var readOwnedTables = (pg, schema, role) => Effect14.map(pg.unsafe(OWNED_TABLES_SQL, [schema, role]), (rows) => rows.map((row) => row.table).sort((a, b) => a.localeCompare(b)));
|
|
1171
1347
|
|
|
1172
1348
|
// src/postgres/grants-read-defaults.ts
|
|
1173
|
-
import * as
|
|
1349
|
+
import * as Effect15 from "effect/Effect";
|
|
1174
1350
|
var DEFAULTS_SQL = `SELECT
|
|
1175
|
-
pg_get_userbyid(d.defaclrole) AS for_role,
|
|
1351
|
+
pg_catalog.pg_get_userbyid(d.defaclrole) AS for_role,
|
|
1176
1352
|
a.privilege_type AS privilege,
|
|
1177
1353
|
a.is_grantable AS grantable
|
|
1178
|
-
FROM pg_default_acl d
|
|
1179
|
-
CROSS JOIN LATERAL aclexplode(d.defaclacl) AS a
|
|
1180
|
-
WHERE d.defaclnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
|
|
1354
|
+
FROM pg_catalog.pg_default_acl d
|
|
1355
|
+
CROSS JOIN LATERAL pg_catalog.aclexplode(d.defaclacl) AS a
|
|
1356
|
+
WHERE d.defaclnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
|
|
1181
1357
|
AND d.defaclobjtype = 'r'
|
|
1182
|
-
AND a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2)
|
|
1358
|
+
AND a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2)
|
|
1183
1359
|
ORDER BY for_role`;
|
|
1184
|
-
var readDefaultAcls = (pg, schema, role) =>
|
|
1360
|
+
var readDefaultAcls = (pg, schema, role) => Effect15.map(pg.unsafe(DEFAULTS_SQL, [schema, role]), (rows) => {
|
|
1185
1361
|
const byRole = new Map;
|
|
1186
1362
|
for (const row of rows) {
|
|
1187
1363
|
const words = byRole.get(row.for_role) ?? [];
|
|
@@ -1192,17 +1368,17 @@ var readDefaultAcls = (pg, schema, role) => Effect14.map(pg.unsafe(DEFAULTS_SQL,
|
|
|
1192
1368
|
});
|
|
1193
1369
|
|
|
1194
1370
|
// src/postgres/grants-read.ts
|
|
1195
|
-
var SCHEMA_PRESENT_SQL = "SELECT 1 AS present FROM pg_namespace WHERE nspname = $1";
|
|
1196
|
-
var schemaExists = (pg, schema) =>
|
|
1371
|
+
var SCHEMA_PRESENT_SQL = "SELECT 1 AS present FROM pg_catalog.pg_namespace WHERE nspname = $1";
|
|
1372
|
+
var schemaExists = (pg, schema) => Effect16.map(pg.unsafe(SCHEMA_PRESENT_SQL, [schema]), (rows) => rows.length > 0);
|
|
1197
1373
|
var SCHEMA_ACL_SQL = `SELECT
|
|
1198
1374
|
a.grantee = 0 AS public,
|
|
1199
1375
|
a.privilege_type AS privilege,
|
|
1200
1376
|
a.is_grantable AS grantable
|
|
1201
|
-
FROM pg_namespace n
|
|
1202
|
-
CROSS JOIN LATERAL aclexplode(n.nspacl) AS a
|
|
1377
|
+
FROM pg_catalog.pg_namespace n
|
|
1378
|
+
CROSS JOIN LATERAL pg_catalog.aclexplode(n.nspacl) AS a
|
|
1203
1379
|
WHERE n.nspname = $1
|
|
1204
|
-
AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2))`;
|
|
1205
|
-
var readSchemaAcl = (pg, schema, role) =>
|
|
1380
|
+
AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2))`;
|
|
1381
|
+
var readSchemaAcl = (pg, schema, role) => Effect16.map(pg.unsafe(SCHEMA_ACL_SQL, [schema, role]), (rows) => ({
|
|
1206
1382
|
role: wordsOf(rows, false),
|
|
1207
1383
|
public: wordsOf(rows, true)
|
|
1208
1384
|
}));
|
|
@@ -1212,12 +1388,12 @@ var TABLES_SQL = `SELECT
|
|
|
1212
1388
|
a.grantee = 0 AS public,
|
|
1213
1389
|
a.privilege_type AS privilege,
|
|
1214
1390
|
a.is_grantable AS grantable
|
|
1215
|
-
FROM pg_class c
|
|
1216
|
-
CROSS JOIN LATERAL aclexplode(c.relacl) AS a
|
|
1217
|
-
WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
|
|
1218
|
-
AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2))
|
|
1391
|
+
FROM pg_catalog.pg_class c
|
|
1392
|
+
CROSS JOIN LATERAL pg_catalog.aclexplode(c.relacl) AS a
|
|
1393
|
+
WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
|
|
1394
|
+
AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2))
|
|
1219
1395
|
ORDER BY c.relname`;
|
|
1220
|
-
var readTableAcls = (pg, schema, role) =>
|
|
1396
|
+
var readTableAcls = (pg, schema, role) => Effect16.map(pg.unsafe(TABLES_SQL, [
|
|
1221
1397
|
schema,
|
|
1222
1398
|
role
|
|
1223
1399
|
]), (rows) => {
|
|
@@ -1240,19 +1416,19 @@ var COLUMNS_SQL = `SELECT
|
|
|
1240
1416
|
a.grantee = 0 AS public,
|
|
1241
1417
|
a.privilege_type AS privilege,
|
|
1242
1418
|
a.is_grantable AS grantable,
|
|
1243
|
-
pg_get_userbyid(a.grantor) AS grantor,
|
|
1244
|
-
pg_get_userbyid(c.relowner) AS owner,
|
|
1419
|
+
pg_catalog.pg_get_userbyid(a.grantor) AS grantor,
|
|
1420
|
+
pg_catalog.pg_get_userbyid(c.relowner) AS owner,
|
|
1245
1421
|
current_user AS revoker,
|
|
1246
|
-
pg_has_role(current_user, c.relowner, 'USAGE') AS revoker_as_owner
|
|
1247
|
-
FROM pg_attribute v
|
|
1248
|
-
JOIN pg_class c ON c.oid = v.attrelid
|
|
1249
|
-
CROSS JOIN LATERAL aclexplode(v.attacl) AS a
|
|
1250
|
-
WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
|
|
1422
|
+
pg_catalog.pg_has_role(current_user, c.relowner, 'USAGE') AS revoker_as_owner
|
|
1423
|
+
FROM pg_catalog.pg_attribute v
|
|
1424
|
+
JOIN pg_catalog.pg_class c ON c.oid = v.attrelid
|
|
1425
|
+
CROSS JOIN LATERAL pg_catalog.aclexplode(v.attacl) AS a
|
|
1426
|
+
WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
|
|
1251
1427
|
AND v.attnum > 0
|
|
1252
1428
|
AND NOT v.attisdropped
|
|
1253
|
-
AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2))
|
|
1429
|
+
AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2))
|
|
1254
1430
|
ORDER BY c.relname, v.attname`;
|
|
1255
|
-
var readColumnAcls = (pg, schema, role) =>
|
|
1431
|
+
var readColumnAcls = (pg, schema, role) => Effect16.map(pg.unsafe(COLUMNS_SQL, [schema, role]), (rows) => {
|
|
1256
1432
|
const byColumn = new Map;
|
|
1257
1433
|
for (const row of rows) {
|
|
1258
1434
|
const key = `${row.table}\x00${row.column}`;
|
|
@@ -1275,7 +1451,7 @@ var readColumnAcls = (pg, schema, role) => Effect15.map(pg.unsafe(COLUMNS_SQL, [
|
|
|
1275
1451
|
};
|
|
1276
1452
|
}).sort((a, b) => a.table.localeCompare(b.table) || a.column.localeCompare(b.column));
|
|
1277
1453
|
});
|
|
1278
|
-
var readGrants = (pg, schema, role) =>
|
|
1454
|
+
var readGrants = (pg, schema, role) => Effect16.all({
|
|
1279
1455
|
schemaExists: schemaExists(pg, schema),
|
|
1280
1456
|
schema: readSchemaAcl(pg, schema, role),
|
|
1281
1457
|
tables: readTableAcls(pg, schema, role),
|
|
@@ -1286,8 +1462,8 @@ var readGrants = (pg, schema, role) => Effect15.all({
|
|
|
1286
1462
|
});
|
|
1287
1463
|
|
|
1288
1464
|
// src/postgres/grants-ops.ts
|
|
1289
|
-
var failRefusal = (refusal) => refusal.kind === "privilege" ?
|
|
1290
|
-
var proveDatabase = (pg, declared) =>
|
|
1465
|
+
var failRefusal = (refusal) => refusal.kind === "privilege" ? Effect17.fail(new PostgresGrantsPrivilegeRefused({ prop: refusal.prop, word: refusal.word })) : Effect17.fail(new PostgresGrantsDuplicateObject({ prop: refusal.prop, name: refusal.name }));
|
|
1466
|
+
var proveDatabase = (pg, declared) => Effect17.flatMap(currentDatabase(pg), (connected) => connected === declared ? Effect17.void : Effect17.fail(new PostgresGrantsDatabaseMismatch({ declared, connected })));
|
|
1291
1467
|
var refuseNames = (props) => {
|
|
1292
1468
|
const declared = resolveProps(props);
|
|
1293
1469
|
const names = grantsNamesRefusal(declared);
|
|
@@ -1297,30 +1473,30 @@ var refuseNames = (props) => {
|
|
|
1297
1473
|
limit: names.limit
|
|
1298
1474
|
});
|
|
1299
1475
|
};
|
|
1300
|
-
var reconcileWithClient3 = (pg, props, output) =>
|
|
1476
|
+
var reconcileWithClient3 = (pg, props, output) => Effect17.gen(function* () {
|
|
1301
1477
|
const declared = resolveProps(props);
|
|
1302
1478
|
const declRefusal = declarationRefusal(declared);
|
|
1303
1479
|
if (declRefusal !== undefined)
|
|
1304
1480
|
return yield* failRefusal(declRefusal);
|
|
1305
1481
|
const nameRefusal = refuseNames(props);
|
|
1306
1482
|
if (nameRefusal !== undefined)
|
|
1307
|
-
return yield*
|
|
1483
|
+
return yield* Effect17.fail(nameRefusal);
|
|
1308
1484
|
for (const [prop, from, to] of [
|
|
1309
1485
|
["role", output?.role, declared.role],
|
|
1310
1486
|
["database", output?.database, declared.database],
|
|
1311
1487
|
["schema", output?.schema, declared.schema]
|
|
1312
1488
|
]) {
|
|
1313
1489
|
if (from !== undefined && from !== to) {
|
|
1314
|
-
return yield*
|
|
1490
|
+
return yield* Effect17.fail(new PostgresGrantsRetargetRefused({ prop, from, to }));
|
|
1315
1491
|
}
|
|
1316
1492
|
}
|
|
1317
1493
|
yield* proveDatabase(pg, declared.database);
|
|
1318
1494
|
if (!(yield* schemaExists(pg, declared.schema))) {
|
|
1319
|
-
return yield*
|
|
1495
|
+
return yield* Effect17.fail(new PostgresGrantsSchemaMissing({ schema: declared.schema }));
|
|
1320
1496
|
}
|
|
1321
1497
|
for (const role of [declared.role, ...declared.defaults.map((entry) => entry.forRole)]) {
|
|
1322
1498
|
if (!(yield* roleExists(pg, role))) {
|
|
1323
|
-
return yield*
|
|
1499
|
+
return yield* Effect17.fail(new PostgresGrantsRoleMissing({ role }));
|
|
1324
1500
|
}
|
|
1325
1501
|
}
|
|
1326
1502
|
yield* requireDeclaredObjectsExist(pg, declared);
|
|
@@ -1332,7 +1508,7 @@ var reconcileWithClient3 = (pg, props, output) => Effect16.gen(function* () {
|
|
|
1332
1508
|
const after = yield* readGrants(pg, declared.schema, declared.role);
|
|
1333
1509
|
const remaining = planReconcile(declared, after, removed);
|
|
1334
1510
|
if (remaining.length > 0) {
|
|
1335
|
-
return yield*
|
|
1511
|
+
return yield* Effect17.fail(new PostgresGrantsRepairRefused({
|
|
1336
1512
|
schema: declared.schema,
|
|
1337
1513
|
role: declared.role,
|
|
1338
1514
|
remaining
|
|
@@ -1340,7 +1516,7 @@ var reconcileWithClient3 = (pg, props, output) => Effect16.gen(function* () {
|
|
|
1340
1516
|
}
|
|
1341
1517
|
return attributesOf(after, declaredNames(declared));
|
|
1342
1518
|
});
|
|
1343
|
-
var readWithClient3 = (pg, names, stored) =>
|
|
1519
|
+
var readWithClient3 = (pg, names, stored) => Effect17.gen(function* () {
|
|
1344
1520
|
yield* proveDatabase(pg, names.database);
|
|
1345
1521
|
if (!(yield* schemaExists(pg, names.schema)))
|
|
1346
1522
|
return;
|
|
@@ -1349,7 +1525,7 @@ var readWithClient3 = (pg, names, stored) => Effect16.gen(function* () {
|
|
|
1349
1525
|
const holdsAnything = projected.schemaPrivileges.length > 0 || projected.tables.some((table) => table.privileges.length > 0) || projected.columns.some((column) => column.privileges.length > 0) || projected.defaults.some((entry) => entry.privileges.length > 0);
|
|
1350
1526
|
return stored || holdsAnything ? projected : undefined;
|
|
1351
1527
|
});
|
|
1352
|
-
var deleteWithClient2 = (pg, props) =>
|
|
1528
|
+
var deleteWithClient2 = (pg, props) => Effect17.gen(function* () {
|
|
1353
1529
|
yield* proveDatabase(pg, props.database);
|
|
1354
1530
|
if (!(yield* roleExists(pg, props.role)))
|
|
1355
1531
|
return;
|
|
@@ -1363,14 +1539,14 @@ var deleteWithClient2 = (pg, props) => Effect16.gen(function* () {
|
|
|
1363
1539
|
const after = yield* readGrants(pg, cleared.schema, cleared.role);
|
|
1364
1540
|
const remaining = planRepair(cleared, after);
|
|
1365
1541
|
if (remaining.length > 0) {
|
|
1366
|
-
return yield*
|
|
1542
|
+
return yield* Effect17.fail(new PostgresGrantsRepairRefused({
|
|
1367
1543
|
schema: cleared.schema,
|
|
1368
1544
|
role: cleared.role,
|
|
1369
1545
|
remaining
|
|
1370
1546
|
}));
|
|
1371
1547
|
}
|
|
1372
1548
|
});
|
|
1373
|
-
var diffPostgresGrants = (news, output) =>
|
|
1549
|
+
var diffPostgresGrants = (news, output) => Effect17.gen(function* () {
|
|
1374
1550
|
if (output === undefined || !isResolved3(news))
|
|
1375
1551
|
return;
|
|
1376
1552
|
const declared = resolveProps(news);
|
|
@@ -1380,12 +1556,12 @@ var diffPostgresGrants = (news, output) => Effect16.gen(function* () {
|
|
|
1380
1556
|
["schema", output.schema, declared.schema]
|
|
1381
1557
|
]) {
|
|
1382
1558
|
if (from !== to) {
|
|
1383
|
-
return yield*
|
|
1559
|
+
return yield* Effect17.fail(new PostgresGrantsRetargetRefused({ prop, from, to }));
|
|
1384
1560
|
}
|
|
1385
1561
|
}
|
|
1386
1562
|
const nameRefusal = refuseNames(news);
|
|
1387
1563
|
if (nameRefusal !== undefined)
|
|
1388
|
-
return yield*
|
|
1564
|
+
return yield* Effect17.fail(nameRefusal);
|
|
1389
1565
|
const declRefusal = declarationRefusal(declared);
|
|
1390
1566
|
if (declRefusal !== undefined)
|
|
1391
1567
|
return yield* failRefusal(declRefusal);
|
|
@@ -1398,9 +1574,9 @@ var PostgresGrants = Resource3("Postgres.Grants", {
|
|
|
1398
1574
|
});
|
|
1399
1575
|
var isPostgresGrants = (value) => (typeof value === "object" || typeof value === "function") && value !== null && value.Type === "Postgres.Grants";
|
|
1400
1576
|
var postgresGrantsHandlers = PostgresGrants.Provider.of({
|
|
1401
|
-
list: () =>
|
|
1577
|
+
list: () => Effect18.succeed([]),
|
|
1402
1578
|
nuke: { skip: true },
|
|
1403
|
-
read: ({ olds, output }) =>
|
|
1579
|
+
read: ({ olds, output }) => Effect18.gen(function* () {
|
|
1404
1580
|
const names = output !== undefined ? namesFromAttrs(output) : declaredNames(resolveProps(olds));
|
|
1405
1581
|
const present = yield* withPg((pg) => databaseExists(pg, names.database));
|
|
1406
1582
|
if (!present)
|
|
@@ -1409,14 +1585,14 @@ var postgresGrantsHandlers = PostgresGrants.Provider.of({
|
|
|
1409
1585
|
return live === undefined ? undefined : Unowned3(live);
|
|
1410
1586
|
}),
|
|
1411
1587
|
diff: ({ news, output }) => diffPostgresGrants(news, output),
|
|
1412
|
-
reconcile: ({ news, output }) =>
|
|
1588
|
+
reconcile: ({ news, output }) => Effect18.gen(function* () {
|
|
1413
1589
|
const present = yield* withPg((pg) => databaseExists(pg, news.database));
|
|
1414
1590
|
if (!present) {
|
|
1415
|
-
return yield*
|
|
1591
|
+
return yield* Effect18.fail(new PostgresGrantsDatabaseMissing({ database: news.database }));
|
|
1416
1592
|
}
|
|
1417
1593
|
return yield* withPg((pg) => reconcileWithClient3(pg, news, output), news.database);
|
|
1418
1594
|
}),
|
|
1419
|
-
delete: ({ olds }) =>
|
|
1595
|
+
delete: ({ olds }) => Effect18.gen(function* () {
|
|
1420
1596
|
const present = yield* withPg((pg) => databaseExists(pg, olds.database));
|
|
1421
1597
|
if (!present)
|
|
1422
1598
|
return;
|
|
@@ -1435,70 +1611,70 @@ var validUntilRefusal = (value) => {
|
|
|
1435
1611
|
};
|
|
1436
1612
|
var sameValidUntil = (declared, live) => live !== null && Date.parse(declared) === Date.parse(live);
|
|
1437
1613
|
// src/postgres/role-sql.ts
|
|
1438
|
-
import * as
|
|
1614
|
+
import * as Effect20 from "effect/Effect";
|
|
1439
1615
|
|
|
1440
1616
|
// src/postgres/role-membership-sql.ts
|
|
1441
|
-
import * as
|
|
1617
|
+
import * as Effect19 from "effect/Effect";
|
|
1442
1618
|
|
|
1443
1619
|
// src/postgres/role-errors.ts
|
|
1444
|
-
import * as
|
|
1620
|
+
import * as Data5 from "effect/Data";
|
|
1445
1621
|
|
|
1446
|
-
class PostgresRoleNameRefused extends
|
|
1622
|
+
class PostgresRoleNameRefused extends Data5.TaggedError("PostgresRoleNameRefused") {
|
|
1447
1623
|
get message() {
|
|
1448
1624
|
return `Postgres.Role "${this.name}": ${String(this.byteLength)} UTF-8 bytes, over the ` + `${String(this.limit)}-byte limit (NAMEDATALEN 64, minus the terminator). PostgreSQL would ` + "accept the CREATE and silently truncate the name with only a NOTICE, so this plan refuses " + "it instead of creating a role no later read will ever find again.";
|
|
1449
1625
|
}
|
|
1450
1626
|
}
|
|
1451
1627
|
|
|
1452
|
-
class PostgresRoleRenameRefused extends
|
|
1628
|
+
class PostgresRoleRenameRefused extends Data5.TaggedError("PostgresRoleRenameRefused") {
|
|
1453
1629
|
get message() {
|
|
1454
1630
|
return `Postgres.Role: the declared name changed from "${this.from}" to "${this.to}". A ` + "rename is refused at plan — this provider never replaces a role (that is DROP then " + "CREATE, which loses memberships, grants and ownerships). Declare a new logical id for " + "the new name, and remove the old one once its objects have moved.";
|
|
1455
1631
|
}
|
|
1456
1632
|
}
|
|
1457
1633
|
|
|
1458
|
-
class PostgresRolePasswordEnvUnsetError extends
|
|
1634
|
+
class PostgresRolePasswordEnvUnsetError extends Data5.TaggedError("PostgresRolePasswordEnvUnsetError") {
|
|
1459
1635
|
get message() {
|
|
1460
1636
|
return `Postgres.Role "${this.role}": password.fromEnv "${this.variable}" is unset or empty ` + "in the deploying process, but this write requires a password this stack has not sealed.";
|
|
1461
1637
|
}
|
|
1462
1638
|
}
|
|
1463
1639
|
|
|
1464
|
-
class PostgresRolePrivilegedRefused extends
|
|
1640
|
+
class PostgresRolePrivilegedRefused extends Data5.TaggedError("PostgresRolePrivilegedRefused") {
|
|
1465
1641
|
get message() {
|
|
1466
1642
|
return `Postgres.Role "${this.role}": the live role has ${this.flags.join(", ")} set. This ` + "family never declares those attributes (a create lands on the server default, all off), " + "and they are not inherited — a member who SET ROLEs to this role would exercise them. " + "Clear the flag on the cluster before this stack adopts the role.";
|
|
1467
1643
|
}
|
|
1468
1644
|
}
|
|
1469
1645
|
|
|
1470
|
-
class PostgresRoleValidUntilRefused extends
|
|
1646
|
+
class PostgresRoleValidUntilRefused extends Data5.TaggedError("PostgresRoleValidUntilRefused") {
|
|
1471
1647
|
get message() {
|
|
1472
1648
|
return `Postgres.Role "${this.role}": validUntil "${this.value}" is ${this.reason === "unparseable" ? "not a timestamp this kit can parse" : "missing its UTC designator or numeric offset"}. ` + 'Declare an explicit-zone ISO 8601 value such as "2027-01-01T00:00:00Z" — PostgreSQL would ' + "read a zone-free value in the session time zone while the plan compares UTC, and the two " + "would never agree.";
|
|
1473
1649
|
}
|
|
1474
1650
|
}
|
|
1475
1651
|
|
|
1476
|
-
class PostgresRoleCreateVanished extends
|
|
1652
|
+
class PostgresRoleCreateVanished extends Data5.TaggedError("PostgresRoleCreateVanished") {
|
|
1477
1653
|
get message() {
|
|
1478
1654
|
return `Postgres.Role "${this.role}": CREATE ROLE raised no error, but the role is still ` + "absent on the immediate re-read. Re-plan — this is not a state this provider expects to reach.";
|
|
1479
1655
|
}
|
|
1480
1656
|
}
|
|
1481
1657
|
|
|
1482
|
-
class PostgresRoleMembershipUnrepaired extends
|
|
1658
|
+
class PostgresRoleMembershipUnrepaired extends Data5.TaggedError("PostgresRoleMembershipUnrepaired") {
|
|
1483
1659
|
get message() {
|
|
1484
1660
|
const who = this.grantor === null ? "an unresolvable grantor (inconsistent catalog)" : `grantor "${this.grantor}"`;
|
|
1485
1661
|
return `Postgres.Role "${this.role}": membership of "${this.parent}" ` + `(${this.declared ? "declared, options unsafe" : "not declared"}) could not be repaired ` + `under ${who}. The server refused the repair or the catalog re-read still found the row ` + "outside the declaration. pg_auth_members keys a membership on (parent, member, grantor). " + "Check dependent grants, executor permissions and grantor identity before re-planning.";
|
|
1486
1662
|
}
|
|
1487
1663
|
}
|
|
1488
1664
|
|
|
1489
|
-
class PostgresRoleParentMissing extends
|
|
1665
|
+
class PostgresRoleParentMissing extends Data5.TaggedError("PostgresRoleParentMissing") {
|
|
1490
1666
|
get message() {
|
|
1491
1667
|
return `Postgres.Role "${this.role}": memberOf parent "${this.parent}" does not exist. ` + "Nothing was written — declare that role first (or drop it from memberOf). A GRANT of a " + "missing role fails only after CREATE ROLE has committed, and the next plan then needs " + "--adopt to finish the orphan.";
|
|
1492
1668
|
}
|
|
1493
1669
|
}
|
|
1494
1670
|
|
|
1495
|
-
class PostgresRoleIdentityRefused extends
|
|
1671
|
+
class PostgresRoleIdentityRefused extends Data5.TaggedError("PostgresRoleIdentityRefused") {
|
|
1496
1672
|
get message() {
|
|
1497
1673
|
return `Postgres.Role "${this.role}": the live oid is ${String(this.liveOid)}, but state recorded ` + `${String(this.storedOid)}. The name was dropped and recreated outside this stack. Nothing ` + "was altered and the live role was not dropped — remove the stale state, or adopt the new " + "role under a new logical id once you mean to own it.";
|
|
1498
1674
|
}
|
|
1499
1675
|
}
|
|
1500
1676
|
|
|
1501
|
-
class PostgresRolePasswordNonAsciiRefused extends
|
|
1677
|
+
class PostgresRolePasswordNonAsciiRefused extends Data5.TaggedError("PostgresRolePasswordNonAsciiRefused") {
|
|
1502
1678
|
get message() {
|
|
1503
1679
|
return `Postgres.Role "${this.role}": password must be ASCII; this provider does not implement PostgreSQL SASLprep normalization. Nothing was written.`;
|
|
1504
1680
|
}
|
|
@@ -1510,13 +1686,13 @@ var MEMBERSHIP_SQL = `SELECT parent.rolname AS parent,
|
|
|
1510
1686
|
m.admin_option AS admin,
|
|
1511
1687
|
m.set_option AS set,
|
|
1512
1688
|
m.inherit_option AS inherit
|
|
1513
|
-
FROM pg_auth_members m
|
|
1514
|
-
JOIN pg_roles member ON member.oid = m.member
|
|
1515
|
-
JOIN pg_roles parent ON parent.oid = m.roleid
|
|
1516
|
-
LEFT JOIN pg_roles grantor ON grantor.oid = m.grantor
|
|
1689
|
+
FROM pg_catalog.pg_auth_members m
|
|
1690
|
+
JOIN pg_catalog.pg_roles member ON member.oid = m.member
|
|
1691
|
+
JOIN pg_catalog.pg_roles parent ON parent.oid = m.roleid
|
|
1692
|
+
LEFT JOIN pg_catalog.pg_roles grantor ON grantor.oid = m.grantor
|
|
1517
1693
|
WHERE member.rolname = $1
|
|
1518
1694
|
ORDER BY parent.rolname, grantor.rolname NULLS FIRST`;
|
|
1519
|
-
var selectRoleMemberships = (pg, name) =>
|
|
1695
|
+
var selectRoleMemberships = (pg, name) => Effect19.map(pg.unsafe(MEMBERSHIP_SQL, [name]), (rows) => rows);
|
|
1520
1696
|
var buildGrantMembershipSql = (member, parent) => `GRANT ${quoteIdent(parent)} TO ${quoteIdent(member)} WITH SET FALSE`;
|
|
1521
1697
|
var buildRepairMembershipSql = (member, parent, grantor, option) => `REVOKE ${option} OPTION FOR ${quoteIdent(parent)} FROM ${quoteIdent(member)} GRANTED BY ${quoteIdent(grantor)} RESTRICT`;
|
|
1522
1698
|
var buildRevokeGrantorMembershipSql = (member, parent, grantor) => `REVOKE ${quoteIdent(parent)} FROM ${quoteIdent(member)} GRANTED BY ${quoteIdent(grantor)}`;
|
|
@@ -1534,16 +1710,16 @@ var membershipDrift = (declared, live, unsafe = new Set) => {
|
|
|
1534
1710
|
]
|
|
1535
1711
|
};
|
|
1536
1712
|
};
|
|
1537
|
-
var assertParentsExist = (pg, role, parents) =>
|
|
1713
|
+
var assertParentsExist = (pg, role, parents) => Effect19.gen(function* () {
|
|
1538
1714
|
if (parents === undefined)
|
|
1539
1715
|
return;
|
|
1540
1716
|
for (const parent of [...new Set(parents)].sort()) {
|
|
1541
1717
|
if (!(yield* roleExists(pg, parent))) {
|
|
1542
|
-
return yield*
|
|
1718
|
+
return yield* Effect19.fail(new PostgresRoleParentMissing({ role, parent }));
|
|
1543
1719
|
}
|
|
1544
1720
|
}
|
|
1545
1721
|
});
|
|
1546
|
-
var syncMemberships = (pg, props, rows) =>
|
|
1722
|
+
var syncMemberships = (pg, props, rows) => Effect19.gen(function* () {
|
|
1547
1723
|
if (props.memberOf === undefined) {
|
|
1548
1724
|
return [...new Set(rows.map((row) => row.parent))].sort();
|
|
1549
1725
|
}
|
|
@@ -1568,10 +1744,10 @@ var syncMemberships = (pg, props, rows) => Effect18.gen(function* () {
|
|
|
1568
1744
|
}
|
|
1569
1745
|
}
|
|
1570
1746
|
if (statements.length > 0)
|
|
1571
|
-
yield* pg.transaction(statements).pipe(
|
|
1747
|
+
yield* pg.transaction(statements).pipe(Effect19.catchTag("SqlError", (error) => {
|
|
1572
1748
|
const cause = error.reason.cause;
|
|
1573
1749
|
const code = typeof cause === "object" && cause !== null ? cause.code : undefined;
|
|
1574
|
-
return
|
|
1750
|
+
return Effect19.fail(code === "2BP01" || code === "42501" ? new PostgresRoleMembershipUnrepaired({
|
|
1575
1751
|
role: props.name,
|
|
1576
1752
|
parent: row.parent,
|
|
1577
1753
|
grantor: row.grantor,
|
|
@@ -1584,7 +1760,7 @@ var syncMemberships = (pg, props, rows) => Effect18.gen(function* () {
|
|
|
1584
1760
|
yield* pg.transaction(grants);
|
|
1585
1761
|
for (const row of yield* selectRoleMemberships(pg, props.name)) {
|
|
1586
1762
|
if (!wanted.includes(row.parent) || row.admin || row.set || row.inherit && !props.inherit) {
|
|
1587
|
-
return yield*
|
|
1763
|
+
return yield* Effect19.fail(new PostgresRoleMembershipUnrepaired({
|
|
1588
1764
|
role: props.name,
|
|
1589
1765
|
parent: row.parent,
|
|
1590
1766
|
grantor: row.grantor,
|
|
@@ -1608,10 +1784,10 @@ var SELECT_ROLE_SQL = `SELECT
|
|
|
1608
1784
|
r.rolreplication AS replication,
|
|
1609
1785
|
r.rolbypassrls AS bypassrls,
|
|
1610
1786
|
to_char(r.rolvaliduntil AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') AS "validUntil"
|
|
1611
|
-
FROM pg_roles r
|
|
1787
|
+
FROM pg_catalog.pg_roles r
|
|
1612
1788
|
WHERE r.rolname = $1`;
|
|
1613
|
-
var selectRole = (pg, name) =>
|
|
1614
|
-
var readRoleWithClient = (pg, name) =>
|
|
1789
|
+
var selectRole = (pg, name) => Effect20.map(pg.unsafe(SELECT_ROLE_SQL, [name]), (rows) => rows[0]);
|
|
1790
|
+
var readRoleWithClient = (pg, name) => Effect20.gen(function* () {
|
|
1615
1791
|
const row = yield* selectRole(pg, name);
|
|
1616
1792
|
if (row === undefined)
|
|
1617
1793
|
return;
|
|
@@ -1692,12 +1868,12 @@ var privilegedFlags = (live) => {
|
|
|
1692
1868
|
};
|
|
1693
1869
|
// src/postgres/role.ts
|
|
1694
1870
|
import { Resource as Resource4 } from "alchemy";
|
|
1695
|
-
import * as
|
|
1871
|
+
import * as Effect22 from "effect/Effect";
|
|
1696
1872
|
import * as Redacted2 from "effect/Redacted";
|
|
1697
1873
|
|
|
1698
1874
|
// src/postgres/role-secrets.ts
|
|
1699
1875
|
import * as Redacted from "effect/Redacted";
|
|
1700
|
-
import * as
|
|
1876
|
+
import * as Effect21 from "effect/Effect";
|
|
1701
1877
|
|
|
1702
1878
|
// src/secrets/write-only.ts
|
|
1703
1879
|
import { Buffer } from "node:buffer";
|
|
@@ -1737,7 +1913,7 @@ var sealMatches = (sealed, values) => {
|
|
|
1737
1913
|
};
|
|
1738
1914
|
|
|
1739
1915
|
// src/postgres/role-secrets.ts
|
|
1740
|
-
var assertPasswordAscii = (role, resolved) => resolved.value !== undefined && /[\u0080-\uffff]/.test(Redacted.value(resolved.value)) ?
|
|
1916
|
+
var assertPasswordAscii = (role, resolved) => resolved.value !== undefined && /[\u0080-\uffff]/.test(Redacted.value(resolved.value)) ? Effect21.fail(new PostgresRolePasswordNonAsciiRefused({ role })) : Effect21.void;
|
|
1741
1917
|
var resolvePassword = (props, env = process.env) => {
|
|
1742
1918
|
if (props.password === undefined)
|
|
1743
1919
|
return { variable: undefined, value: undefined };
|
|
@@ -1771,20 +1947,20 @@ var PostgresRole = Resource4("Postgres.Role", {
|
|
|
1771
1947
|
defaultRemovalPolicy: "retain"
|
|
1772
1948
|
});
|
|
1773
1949
|
var isPostgresRole = (value3) => (typeof value3 === "object" || typeof value3 === "function") && value3 !== null && value3.Type === "Postgres.Role";
|
|
1774
|
-
var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", storedOid) =>
|
|
1950
|
+
var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", storedOid) => Effect22.gen(function* () {
|
|
1775
1951
|
const resolved = resolvePassword(props, env);
|
|
1776
1952
|
yield* assertPasswordAscii(props.name, resolved);
|
|
1777
1953
|
const observed = yield* readRoleWithClient(pg, props.name);
|
|
1778
1954
|
if (observed === undefined) {
|
|
1779
1955
|
if (resolved.variable !== undefined && resolved.value === undefined) {
|
|
1780
|
-
return yield*
|
|
1956
|
+
return yield* Effect22.fail(new PostgresRolePasswordEnvUnsetError({ role: props.name, variable: resolved.variable }));
|
|
1781
1957
|
}
|
|
1782
1958
|
yield* assertParentsExist(pg, props.name, props.memberOf);
|
|
1783
1959
|
const verifier = resolved.value === undefined ? undefined : scramSha256Verifier(Redacted2.value(resolved.value));
|
|
1784
1960
|
yield* pg.transaction(buildCreateStatements(props, verifier));
|
|
1785
1961
|
const created = yield* readRoleWithClient(pg, props.name);
|
|
1786
1962
|
if (created === undefined) {
|
|
1787
|
-
return yield*
|
|
1963
|
+
return yield* Effect22.fail(new PostgresRoleCreateVanished({ role: props.name }));
|
|
1788
1964
|
}
|
|
1789
1965
|
return {
|
|
1790
1966
|
...storedAttributes(created),
|
|
@@ -1792,7 +1968,7 @@ var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", sto
|
|
|
1792
1968
|
};
|
|
1793
1969
|
}
|
|
1794
1970
|
if (storedOid !== undefined && observed.oid !== storedOid) {
|
|
1795
|
-
return yield*
|
|
1971
|
+
return yield* Effect22.fail(new PostgresRoleIdentityRefused({
|
|
1796
1972
|
role: props.name,
|
|
1797
1973
|
storedOid,
|
|
1798
1974
|
liveOid: observed.oid
|
|
@@ -1800,23 +1976,23 @@ var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", sto
|
|
|
1800
1976
|
}
|
|
1801
1977
|
const flags = privilegedFlags(observed);
|
|
1802
1978
|
if (flags.length > 0) {
|
|
1803
|
-
return yield*
|
|
1979
|
+
return yield* Effect22.fail(new PostgresRolePrivilegedRefused({ role: props.name, flags }));
|
|
1804
1980
|
}
|
|
1805
1981
|
if (resolved.variable !== undefined && resolved.value === undefined && previousSeal === "") {
|
|
1806
|
-
return yield*
|
|
1982
|
+
return yield* Effect22.fail(new PostgresRolePasswordEnvUnsetError({ role: props.name, variable: resolved.variable }));
|
|
1807
1983
|
}
|
|
1808
1984
|
yield* assertParentsExist(pg, props.name, props.memberOf);
|
|
1809
1985
|
for (const change of scalarDrift(props, observed)) {
|
|
1810
|
-
yield* pg.unsafe(buildAlterRoleSql(props.name, change)).pipe(
|
|
1986
|
+
yield* pg.unsafe(buildAlterRoleSql(props.name, change)).pipe(Effect22.asVoid);
|
|
1811
1987
|
}
|
|
1812
1988
|
const passwordMatched = resolved.value !== undefined && passwordMatchesSeal(resolved.value, previousSeal);
|
|
1813
1989
|
if (resolved.value !== undefined && !passwordMatched) {
|
|
1814
|
-
yield* pg.unsafe(buildSetPasswordSql(props.name, scramSha256Verifier(Redacted2.value(resolved.value)))).pipe(
|
|
1990
|
+
yield* pg.unsafe(buildSetPasswordSql(props.name, scramSha256Verifier(Redacted2.value(resolved.value)))).pipe(Effect22.asVoid);
|
|
1815
1991
|
}
|
|
1816
1992
|
yield* syncMemberships(pg, props, observed.memberships ?? []);
|
|
1817
1993
|
const after = yield* readRoleWithClient(pg, props.name);
|
|
1818
1994
|
if (after === undefined) {
|
|
1819
|
-
return yield*
|
|
1995
|
+
return yield* Effect22.fail(new PostgresRoleCreateVanished({ role: props.name }));
|
|
1820
1996
|
}
|
|
1821
1997
|
return {
|
|
1822
1998
|
...storedAttributes(after),
|
|
@@ -1824,15 +2000,15 @@ var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", sto
|
|
|
1824
2000
|
};
|
|
1825
2001
|
});
|
|
1826
2002
|
var readRole = (pg, name) => readRoleWithClient(pg, name);
|
|
1827
|
-
var refuseAtPlan = (props) =>
|
|
2003
|
+
var refuseAtPlan = (props) => Effect22.gen(function* () {
|
|
1828
2004
|
const nameRefusal = nameByteRefusal(props.name);
|
|
1829
2005
|
if (nameRefusal !== undefined) {
|
|
1830
|
-
return yield*
|
|
2006
|
+
return yield* Effect22.fail(new PostgresRoleNameRefused({ name: props.name, ...nameRefusal }));
|
|
1831
2007
|
}
|
|
1832
2008
|
if (props.validUntil !== undefined) {
|
|
1833
2009
|
const untilRefusal = validUntilRefusal(props.validUntil);
|
|
1834
2010
|
if (untilRefusal !== undefined) {
|
|
1835
|
-
return yield*
|
|
2011
|
+
return yield* Effect22.fail(new PostgresRoleValidUntilRefused({
|
|
1836
2012
|
role: props.name,
|
|
1837
2013
|
value: props.validUntil,
|
|
1838
2014
|
reason: untilRefusal.reason
|
|
@@ -1843,22 +2019,65 @@ var refuseAtPlan = (props) => Effect21.gen(function* () {
|
|
|
1843
2019
|
// src/postgres/role-provider.ts
|
|
1844
2020
|
import * as Provider4 from "alchemy/Provider";
|
|
1845
2021
|
import { isResolved as isResolved5 } from "alchemy/Diff";
|
|
1846
|
-
import * as
|
|
2022
|
+
import * as Effect29 from "effect/Effect";
|
|
1847
2023
|
|
|
1848
2024
|
// src/ownership/probe.ts
|
|
2025
|
+
import { Unowned as Unowned5 } from "alchemy/AdoptPolicy";
|
|
2026
|
+
import * as Effect26 from "effect/Effect";
|
|
2027
|
+
import * as Option4 from "effect/Option";
|
|
2028
|
+
|
|
2029
|
+
// src/ownership/resume.ts
|
|
1849
2030
|
import { Unowned as Unowned4 } from "alchemy/AdoptPolicy";
|
|
1850
|
-
import
|
|
2031
|
+
import { Artifacts } from "alchemy/Artifacts";
|
|
2032
|
+
import * as Effect23 from "effect/Effect";
|
|
2033
|
+
import * as Option from "effect/Option";
|
|
2034
|
+
var PROVEN = "homeflare/ownership/resumes";
|
|
2035
|
+
var UNFINISHED = "homeflare/ownership/unfinished";
|
|
2036
|
+
var note = (key, instanceId) => Effect23.gen(function* () {
|
|
2037
|
+
const bag = yield* Effect23.serviceOption(Artifacts);
|
|
2038
|
+
if (Option.isSome(bag))
|
|
2039
|
+
yield* bag.value.set(key, instanceId);
|
|
2040
|
+
});
|
|
2041
|
+
var noted = (key, instanceId) => Effect23.gen(function* () {
|
|
2042
|
+
const bag = yield* Effect23.serviceOption(Artifacts);
|
|
2043
|
+
if (Option.isNone(bag))
|
|
2044
|
+
return false;
|
|
2045
|
+
return (yield* bag.value.get(key)) === instanceId;
|
|
2046
|
+
});
|
|
2047
|
+
var noteUnfinished = (instanceId) => Effect23.as(note(UNFINISHED, instanceId), undefined);
|
|
2048
|
+
var noteResume = (instanceId, recovered) => Effect23.gen(function* () {
|
|
2049
|
+
yield* noteUnfinished(instanceId);
|
|
2050
|
+
const unproven = () => Effect23.succeed(undefined);
|
|
2051
|
+
const found = yield* recovered.pipe(Effect23.catch(unproven), Effect23.catchDefect(unproven));
|
|
2052
|
+
if (found === undefined || found === null || Unowned4.is(found))
|
|
2053
|
+
return;
|
|
2054
|
+
yield* note(PROVEN, instanceId);
|
|
2055
|
+
});
|
|
2056
|
+
var resumes = (instanceId) => noted(PROVEN, instanceId);
|
|
2057
|
+
var unfinished = (instanceId) => noted(UNFINISHED, instanceId);
|
|
2058
|
+
var provingResumes = (service) => {
|
|
2059
|
+
const { diff, read } = service;
|
|
2060
|
+
if (diff === undefined || read === undefined)
|
|
2061
|
+
return service;
|
|
2062
|
+
const proving = (input) => Effect23.gen(function* () {
|
|
2063
|
+
if (input.output === undefined) {
|
|
2064
|
+
yield* noteResume(input.instanceId, read({ ...input, output: undefined }));
|
|
2065
|
+
}
|
|
2066
|
+
return yield* diff(input);
|
|
2067
|
+
});
|
|
2068
|
+
return { ...service, diff: proving };
|
|
2069
|
+
};
|
|
1851
2070
|
|
|
1852
2071
|
// src/ownership/rows.ts
|
|
1853
2072
|
import { Stack as Stack2 } from "alchemy/Stack";
|
|
1854
2073
|
import { State, isActionState } from "alchemy/State/State";
|
|
1855
|
-
import * as
|
|
1856
|
-
import * as
|
|
2074
|
+
import * as Effect25 from "effect/Effect";
|
|
2075
|
+
import * as Option3 from "effect/Option";
|
|
1857
2076
|
|
|
1858
2077
|
// src/ownership/whole.ts
|
|
1859
2078
|
import { Stack } from "alchemy/Stack";
|
|
1860
|
-
import * as
|
|
1861
|
-
import * as
|
|
2079
|
+
import * as Effect24 from "effect/Effect";
|
|
2080
|
+
import * as Option2 from "effect/Option";
|
|
1862
2081
|
var absent = (value3) => value3 === undefined || value3 === null;
|
|
1863
2082
|
var isPlainObject = (value3) => {
|
|
1864
2083
|
if (typeof value3 !== "object" || value3 === null || Array.isArray(value3))
|
|
@@ -1883,22 +2102,22 @@ var carries = (declared, recorded) => {
|
|
|
1883
2102
|
}
|
|
1884
2103
|
return true;
|
|
1885
2104
|
};
|
|
1886
|
-
var wholeDeclaration = (fqn, props) =>
|
|
1887
|
-
const declared =
|
|
2105
|
+
var wholeDeclaration = (fqn, props) => Effect24.map(Effect24.serviceOption(Stack), (stack) => {
|
|
2106
|
+
const declared = Option2.isSome(stack) ? stack.value.resources[fqn] : undefined;
|
|
1888
2107
|
return declared !== undefined && carries(declared.Props, props);
|
|
1889
2108
|
});
|
|
1890
2109
|
|
|
1891
2110
|
// src/ownership/rows.ts
|
|
1892
|
-
var storeOf =
|
|
1893
|
-
const stack = yield*
|
|
1894
|
-
const state = yield*
|
|
1895
|
-
if (
|
|
2111
|
+
var storeOf = Effect25.gen(function* () {
|
|
2112
|
+
const stack = yield* Effect25.serviceOption(Stack2);
|
|
2113
|
+
const state = yield* Effect25.serviceOption(State);
|
|
2114
|
+
if (Option3.isNone(stack) || Option3.isNone(state))
|
|
1896
2115
|
return;
|
|
1897
2116
|
const store = yield* state.value;
|
|
1898
2117
|
const where = { stack: stack.value.name, stage: stack.value.stage };
|
|
1899
2118
|
return { resources: stack.value.resources, store, where };
|
|
1900
2119
|
});
|
|
1901
|
-
var rowAt = (store, where, fqn) => store.get({ ...where, fqn }).pipe(
|
|
2120
|
+
var rowAt = (store, where, fqn) => store.get({ ...where, fqn }).pipe(Effect25.orElseSucceed(() => {
|
|
1902
2121
|
return;
|
|
1903
2122
|
}));
|
|
1904
2123
|
var generationOf = (row, instanceId) => {
|
|
@@ -1911,7 +2130,7 @@ var generationOf = (row, instanceId) => {
|
|
|
1911
2130
|
}
|
|
1912
2131
|
return;
|
|
1913
2132
|
};
|
|
1914
|
-
var recordedGeneration = (fqn, instanceId) =>
|
|
2133
|
+
var recordedGeneration = (fqn, instanceId) => Effect25.gen(function* () {
|
|
1915
2134
|
const found = yield* storeOf;
|
|
1916
2135
|
if (found === undefined)
|
|
1917
2136
|
return;
|
|
@@ -1922,20 +2141,20 @@ var recordedGeneration = (fqn, instanceId) => Effect23.gen(function* () {
|
|
|
1922
2141
|
}
|
|
1923
2142
|
return;
|
|
1924
2143
|
});
|
|
1925
|
-
var recordedInstance = (fqn, instanceId) =>
|
|
2144
|
+
var recordedInstance = (fqn, instanceId) => Effect25.gen(function* () {
|
|
1926
2145
|
const generation = yield* recordedGeneration(fqn, instanceId);
|
|
1927
2146
|
if (generation === undefined)
|
|
1928
2147
|
return "absent";
|
|
1929
2148
|
return (yield* wholeDeclaration(fqn, generation.props)) ? "whole" : "partial";
|
|
1930
2149
|
});
|
|
1931
|
-
var isCreate = (fqn, instanceId) =>
|
|
2150
|
+
var isCreate = (fqn, instanceId) => Effect25.map(recordedGeneration(fqn, instanceId), (generation) => generation?.status === "creating");
|
|
1932
2151
|
var idOf = (attr) => {
|
|
1933
2152
|
if (typeof attr !== "object" || attr === null)
|
|
1934
2153
|
return;
|
|
1935
2154
|
const id = attr.id;
|
|
1936
2155
|
return typeof id === "string" && id !== "" ? id : undefined;
|
|
1937
2156
|
};
|
|
1938
|
-
var olderGenerationIds = (fqn, instanceId) =>
|
|
2157
|
+
var olderGenerationIds = (fqn, instanceId) => Effect25.gen(function* () {
|
|
1939
2158
|
const found = yield* storeOf;
|
|
1940
2159
|
if (found === undefined)
|
|
1941
2160
|
return [];
|
|
@@ -1963,7 +2182,7 @@ var collectOlder = (row, instanceId, ids) => {
|
|
|
1963
2182
|
at = generation.old;
|
|
1964
2183
|
}
|
|
1965
2184
|
};
|
|
1966
|
-
var forgetRefusedCreate = (fqn, instanceId) =>
|
|
2185
|
+
var forgetRefusedCreate = (fqn, instanceId) => Effect25.gen(function* () {
|
|
1967
2186
|
const found = yield* storeOf;
|
|
1968
2187
|
if (found === undefined)
|
|
1969
2188
|
return;
|
|
@@ -1972,97 +2191,75 @@ var forgetRefusedCreate = (fqn, instanceId) => Effect23.gen(function* () {
|
|
|
1972
2191
|
if (mine?.status !== "creating" || mine.instanceId !== instanceId || mine.attr !== undefined) {
|
|
1973
2192
|
return;
|
|
1974
2193
|
}
|
|
1975
|
-
yield* found.store.delete({ ...found.where, fqn }).pipe(
|
|
2194
|
+
yield* found.store.delete({ ...found.where, fqn }).pipe(Effect25.ignore);
|
|
1976
2195
|
});
|
|
1977
2196
|
|
|
1978
2197
|
// src/ownership/probe.ts
|
|
1979
|
-
var
|
|
2198
|
+
var inApplyResource = (span) => {
|
|
2199
|
+
let at = span;
|
|
2200
|
+
while (at !== undefined && at._tag === "Span") {
|
|
2201
|
+
if (at.name === "apply.resource")
|
|
2202
|
+
return true;
|
|
2203
|
+
at = Option4.getOrUndefined(at.parent);
|
|
2204
|
+
}
|
|
2205
|
+
return false;
|
|
2206
|
+
};
|
|
2207
|
+
var isCreatesRead = (span) => {
|
|
2208
|
+
const current = Option4.getOrUndefined(span);
|
|
2209
|
+
return current?.name === "provider.read" && inApplyResource(current);
|
|
2210
|
+
};
|
|
2211
|
+
var readsAtApply = Effect26.map(Effect26.option(Effect26.currentSpan), isCreatesRead);
|
|
2212
|
+
var provenOurs = (ask, settled) => Effect26.gen(function* () {
|
|
2213
|
+
if (yield* readsAtApply)
|
|
2214
|
+
return yield* resumes(ask.instanceId);
|
|
1980
2215
|
const recorded = yield* recordedInstance(ask.fqn, ask.instanceId);
|
|
1981
2216
|
if (recorded === "absent")
|
|
1982
2217
|
return false;
|
|
1983
2218
|
if (recorded === "partial") {
|
|
1984
|
-
yield*
|
|
2219
|
+
yield* Effect26.logWarning(`${ask.fqn}: the interrupted create's state row lacks part of the declaration (a prop ` + "was still an Output when it was written), so the live object is not proven ours");
|
|
1985
2220
|
return false;
|
|
1986
2221
|
}
|
|
1987
|
-
const unproven = (reason) =>
|
|
1988
|
-
return yield* settled.pipe(
|
|
2222
|
+
const unproven = (reason) => Effect26.as(Effect26.logWarning(`${ask.fqn}: the interrupted create's object could not be compared with its props ` + `(${reason instanceof Error ? reason.message : String(reason)}), so it is not treated as ours`), false);
|
|
2223
|
+
return yield* settled.pipe(Effect26.catch(unproven), Effect26.catchDefect(unproven));
|
|
1989
2224
|
});
|
|
1990
|
-
var ownedRead = (ask, found, settled) =>
|
|
2225
|
+
var ownedRead = (ask, found, settled) => Effect26.gen(function* () {
|
|
1991
2226
|
if (found === undefined || ask.output !== undefined)
|
|
1992
2227
|
return found;
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
import { Artifacts } from "alchemy/Artifacts";
|
|
1999
|
-
import * as Effect25 from "effect/Effect";
|
|
2000
|
-
import * as Option3 from "effect/Option";
|
|
2001
|
-
var PROVEN = "homeflare/ownership/resumes";
|
|
2002
|
-
var UNFINISHED = "homeflare/ownership/unfinished";
|
|
2003
|
-
var note = (key, instanceId) => Effect25.gen(function* () {
|
|
2004
|
-
const bag = yield* Effect25.serviceOption(Artifacts);
|
|
2005
|
-
if (Option3.isSome(bag))
|
|
2006
|
-
yield* bag.value.set(key, instanceId);
|
|
2007
|
-
});
|
|
2008
|
-
var noted = (key, instanceId) => Effect25.gen(function* () {
|
|
2009
|
-
const bag = yield* Effect25.serviceOption(Artifacts);
|
|
2010
|
-
if (Option3.isNone(bag))
|
|
2011
|
-
return false;
|
|
2012
|
-
return (yield* bag.value.get(key)) === instanceId;
|
|
2013
|
-
});
|
|
2014
|
-
var noteUnfinished = (instanceId) => Effect25.as(note(UNFINISHED, instanceId), undefined);
|
|
2015
|
-
var noteResume = (instanceId, recovered) => Effect25.gen(function* () {
|
|
2016
|
-
yield* noteUnfinished(instanceId);
|
|
2017
|
-
const unproven = () => Effect25.succeed(undefined);
|
|
2018
|
-
const found = yield* recovered.pipe(Effect25.catch(unproven), Effect25.catchDefect(unproven));
|
|
2019
|
-
if (found === undefined || found === null || Unowned5.is(found))
|
|
2020
|
-
return;
|
|
2021
|
-
yield* note(PROVEN, instanceId);
|
|
2228
|
+
if (yield* provenOurs(ask, settled))
|
|
2229
|
+
return found;
|
|
2230
|
+
if (yield* readsAtApply)
|
|
2231
|
+
yield* forgetRefusedCreate(ask.fqn, ask.instanceId);
|
|
2232
|
+
return Unowned5(found);
|
|
2022
2233
|
});
|
|
2023
|
-
var resumes = (instanceId) => noted(PROVEN, instanceId);
|
|
2024
|
-
var unfinished = (instanceId) => noted(UNFINISHED, instanceId);
|
|
2025
|
-
var provingResumes = (service) => {
|
|
2026
|
-
const { diff, read } = service;
|
|
2027
|
-
if (diff === undefined || read === undefined)
|
|
2028
|
-
return service;
|
|
2029
|
-
const proving = (input) => Effect25.gen(function* () {
|
|
2030
|
-
if (input.output === undefined) {
|
|
2031
|
-
yield* noteResume(input.instanceId, read({ ...input, output: undefined }));
|
|
2032
|
-
}
|
|
2033
|
-
return yield* diff(input);
|
|
2034
|
-
});
|
|
2035
|
-
return { ...service, diff: proving };
|
|
2036
|
-
};
|
|
2037
2234
|
|
|
2038
2235
|
// src/ownership/adopt.ts
|
|
2039
2236
|
import { AdoptPolicy } from "alchemy/AdoptPolicy";
|
|
2040
2237
|
import { AlchemyContext } from "alchemy/AlchemyContext";
|
|
2041
2238
|
import { Stack as Stack3 } from "alchemy/Stack";
|
|
2042
|
-
import * as
|
|
2043
|
-
import * as
|
|
2044
|
-
var adoptEnabled = (fqn) =>
|
|
2045
|
-
const stack = yield*
|
|
2046
|
-
const
|
|
2047
|
-
if (
|
|
2048
|
-
return
|
|
2049
|
-
const policy = yield*
|
|
2050
|
-
if (
|
|
2239
|
+
import * as Effect27 from "effect/Effect";
|
|
2240
|
+
import * as Option5 from "effect/Option";
|
|
2241
|
+
var adoptEnabled = (fqn) => Effect27.gen(function* () {
|
|
2242
|
+
const stack = yield* Effect27.serviceOption(Stack3);
|
|
2243
|
+
const scoped2 = Option5.isSome(stack) ? stack.value.resources[fqn]?.Adopt : undefined;
|
|
2244
|
+
if (scoped2 !== undefined)
|
|
2245
|
+
return scoped2;
|
|
2246
|
+
const policy = yield* Effect27.serviceOption(AdoptPolicy);
|
|
2247
|
+
if (Option5.isSome(policy))
|
|
2051
2248
|
return policy.value;
|
|
2052
|
-
const context = yield*
|
|
2053
|
-
return
|
|
2249
|
+
const context = yield* Effect27.serviceOption(AlchemyContext);
|
|
2250
|
+
return Option5.isSome(context) ? context.value.adopt : false;
|
|
2054
2251
|
});
|
|
2055
|
-
var adoptable = (owner) =>
|
|
2252
|
+
var adoptable = (owner) => Effect27.gen(function* () {
|
|
2056
2253
|
if (yield* isCreate(owner.fqn, owner.instanceId))
|
|
2057
2254
|
return true;
|
|
2058
2255
|
return yield* unfinished(owner.instanceId);
|
|
2059
2256
|
});
|
|
2060
|
-
var adoptsAtApply = (owner) =>
|
|
2257
|
+
var adoptsAtApply = (owner) => Effect27.gen(function* () {
|
|
2061
2258
|
if (!(yield* adoptEnabled(owner.fqn)))
|
|
2062
2259
|
return false;
|
|
2063
2260
|
return yield* adoptable(owner);
|
|
2064
2261
|
});
|
|
2065
|
-
var refuseTakeover = (owner, what) =>
|
|
2262
|
+
var refuseTakeover = (owner, what) => Effect27.gen(function* () {
|
|
2066
2263
|
if (owner.output !== undefined)
|
|
2067
2264
|
return;
|
|
2068
2265
|
if (yield* resumes(owner.instanceId))
|
|
@@ -2072,23 +2269,23 @@ var refuseTakeover = (owner, what) => Effect26.gen(function* () {
|
|
|
2072
2269
|
return;
|
|
2073
2270
|
yield* forgetRefusedCreate(owner.fqn, owner.instanceId);
|
|
2074
2271
|
const remedy = may ? "Deploy with --adopt (or wrap the resource in adopt(true)) to take it over, or remove it first." : "It is the new identity of a replace, which --adopt does not cover: remove it first.";
|
|
2075
|
-
return yield*
|
|
2272
|
+
return yield* Effect27.die(new Error(`${what}: already exists, and this stack holds no state for it — the plan could not ask ` + "first (a prop was still an Output, a replace moved onto it, or it appeared after the " + `plan). Nothing was written. ${remedy}`));
|
|
2076
2273
|
});
|
|
2077
2274
|
var claimFor = (owner) => (what) => refuseTakeover(owner, what);
|
|
2078
2275
|
|
|
2079
2276
|
// src/postgres/role-diff.ts
|
|
2080
2277
|
import { isResolved as isResolved4 } from "alchemy/Diff";
|
|
2081
|
-
import * as
|
|
2082
|
-
var diffPostgresRole = (news, output, env = process.env, observation) =>
|
|
2278
|
+
import * as Effect28 from "effect/Effect";
|
|
2279
|
+
var diffPostgresRole = (news, output, env = process.env, observation) => Effect28.gen(function* () {
|
|
2083
2280
|
if (output === undefined || !isResolved4(news))
|
|
2084
2281
|
return;
|
|
2085
2282
|
if (news.name !== output.name) {
|
|
2086
|
-
return yield*
|
|
2283
|
+
return yield* Effect28.fail(new PostgresRoleRenameRefused({ from: output.name, to: news.name }));
|
|
2087
2284
|
}
|
|
2088
2285
|
yield* refuseAtPlan(news);
|
|
2089
2286
|
const live = observation?.found;
|
|
2090
2287
|
if (live !== undefined && live.oid !== output.oid) {
|
|
2091
|
-
return yield*
|
|
2288
|
+
return yield* Effect28.fail(new PostgresRoleIdentityRefused({
|
|
2092
2289
|
role: output.name,
|
|
2093
2290
|
storedOid: output.oid,
|
|
2094
2291
|
liveOid: live.oid
|
|
@@ -2107,15 +2304,15 @@ var diffPostgresRole = (news, output, env = process.env, observation) => Effect2
|
|
|
2107
2304
|
|
|
2108
2305
|
// src/postgres/role-provider.ts
|
|
2109
2306
|
var postgresRoleHandlers = PostgresRole.Provider.of({
|
|
2110
|
-
list: () =>
|
|
2307
|
+
list: () => Effect29.succeed([]),
|
|
2111
2308
|
nuke: { skip: true },
|
|
2112
|
-
read: ({ fqn, instanceId, olds, output }) =>
|
|
2309
|
+
read: ({ fqn, instanceId, olds, output }) => Effect29.gen(function* () {
|
|
2113
2310
|
const name = output?.name ?? olds.name;
|
|
2114
2311
|
const live = yield* withPg((pg) => readRole(pg, name));
|
|
2115
2312
|
if (live === undefined)
|
|
2116
2313
|
return;
|
|
2117
2314
|
if (output !== undefined && live.oid !== output.oid) {
|
|
2118
|
-
return yield*
|
|
2315
|
+
return yield* Effect29.fail(new PostgresRoleIdentityRefused({
|
|
2119
2316
|
role: name,
|
|
2120
2317
|
storedOid: output.oid,
|
|
2121
2318
|
liveOid: live.oid
|
|
@@ -2123,9 +2320,9 @@ var postgresRoleHandlers = PostgresRole.Provider.of({
|
|
|
2123
2320
|
}
|
|
2124
2321
|
const passwordSeal = output?.passwordSeal ?? "";
|
|
2125
2322
|
const found = { ...storedAttributes(live), passwordSeal };
|
|
2126
|
-
return yield* ownedRead({ fqn, instanceId, output }, found,
|
|
2323
|
+
return yield* ownedRead({ fqn, instanceId, output }, found, Effect29.succeed(declarationMatches(olds, live)));
|
|
2127
2324
|
}),
|
|
2128
|
-
diff: ({ news, output, instanceId }) =>
|
|
2325
|
+
diff: ({ news, output, instanceId }) => Effect29.gen(function* () {
|
|
2129
2326
|
if (output === undefined)
|
|
2130
2327
|
return yield* noteUnfinished(instanceId);
|
|
2131
2328
|
if (!isResolved5(news))
|
|
@@ -2133,9 +2330,9 @@ var postgresRoleHandlers = PostgresRole.Provider.of({
|
|
|
2133
2330
|
const found = yield* withPg((pg) => readRole(pg, output.name));
|
|
2134
2331
|
return yield* diffPostgresRole(news, output, process.env, { found });
|
|
2135
2332
|
}),
|
|
2136
|
-
reconcile: ({ fqn, instanceId, news, output }) =>
|
|
2333
|
+
reconcile: ({ fqn, instanceId, news, output }) => Effect29.gen(function* () {
|
|
2137
2334
|
yield* refuseAtPlan(news);
|
|
2138
|
-
return yield* withPg((pg) =>
|
|
2335
|
+
return yield* withPg((pg) => Effect29.gen(function* () {
|
|
2139
2336
|
const observed = yield* readRole(pg, news.name);
|
|
2140
2337
|
if (observed !== undefined && output === undefined) {
|
|
2141
2338
|
yield* refuseTakeover({ fqn, instanceId, output }, "Postgres.Role");
|
|
@@ -2143,20 +2340,20 @@ var postgresRoleHandlers = PostgresRole.Provider.of({
|
|
|
2143
2340
|
return yield* reconcileWithClient4(pg, news, process.env, output?.passwordSeal, output?.oid);
|
|
2144
2341
|
}));
|
|
2145
2342
|
}),
|
|
2146
|
-
delete: ({ output }) => withPg((pg) =>
|
|
2343
|
+
delete: ({ output }) => withPg((pg) => Effect29.gen(function* () {
|
|
2147
2344
|
if (output === undefined)
|
|
2148
2345
|
return;
|
|
2149
2346
|
const live = yield* readRole(pg, output.name);
|
|
2150
2347
|
if (live === undefined)
|
|
2151
2348
|
return;
|
|
2152
2349
|
if (live.oid !== output.oid) {
|
|
2153
|
-
return yield*
|
|
2350
|
+
return yield* Effect29.fail(new PostgresRoleIdentityRefused({
|
|
2154
2351
|
role: output.name,
|
|
2155
2352
|
storedOid: output.oid,
|
|
2156
2353
|
liveOid: live.oid
|
|
2157
2354
|
}));
|
|
2158
2355
|
}
|
|
2159
|
-
yield* pg.unsafe(buildDropRoleSql(output.name)).pipe(
|
|
2356
|
+
yield* pg.unsafe(buildDropRoleSql(output.name)).pipe(Effect29.asVoid);
|
|
2160
2357
|
}))
|
|
2161
2358
|
});
|
|
2162
2359
|
var PostgresRoleProvider = () => Provider4.succeed(PostgresRole, postgresRoleHandlers);
|
|
@@ -2203,6 +2400,8 @@ export {
|
|
|
2203
2400
|
PostgresRoleRenameRefused,
|
|
2204
2401
|
PostgresRoleValidUntilRefused,
|
|
2205
2402
|
PostgresSchema,
|
|
2403
|
+
PostgresSchemaCascadeCrossSchemaRefused,
|
|
2404
|
+
PostgresSchemaCascadeSequencesRefused,
|
|
2206
2405
|
PostgresSchemaCreateVanished,
|
|
2207
2406
|
PostgresSchemaDatabaseRefused,
|
|
2208
2407
|
PostgresSchemaDeleteForeignRefused,
|
|
@@ -2281,5 +2480,5 @@ export {
|
|
|
2281
2480
|
withPg
|
|
2282
2481
|
};
|
|
2283
2482
|
|
|
2284
|
-
//# debugId=
|
|
2483
|
+
//# debugId=DBF1833AF422AC3264756E2164756E21
|
|
2285
2484
|
//# sourceMappingURL=index.js.map
|