@baruk/core 0.4.2 → 0.6.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/.baruk-provenance.json +4 -4
- package/CHANGELOG.md +42 -0
- package/dist/audit/repository.d.ts +33 -1
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +41 -7
- package/dist/audit/repository.js.map +1 -1
- package/dist/auth/service.d.ts +21 -0
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +46 -1
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +41 -1
- package/dist/billing/ar-repository.d.ts.map +1 -1
- package/dist/billing/ar-repository.js +82 -6
- package/dist/billing/ar-repository.js.map +1 -1
- package/dist/billing/provider-account.d.ts +38 -0
- package/dist/billing/provider-account.d.ts.map +1 -1
- package/dist/billing/provider-account.js +58 -2
- package/dist/billing/provider-account.js.map +1 -1
- package/dist/billing/repository.d.ts +44 -0
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +49 -5
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/audit/repository.js +41 -7
- package/dist/cjs/audit/repository.js.map +1 -1
- package/dist/cjs/auth/service.js +46 -1
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +82 -6
- package/dist/cjs/billing/ar-repository.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +60 -1
- package/dist/cjs/billing/provider-account.js.map +1 -1
- package/dist/cjs/billing/repository.js +51 -5
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +117 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/http.js +157 -0
- package/dist/cjs/clients/registry/http.js.map +1 -0
- package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
- package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/cjs/clients/registry/ibge.js +63 -0
- package/dist/cjs/clients/registry/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/lookup.js +191 -0
- package/dist/cjs/clients/registry/lookup.js.map +1 -0
- package/dist/cjs/clients/registry/provider.js +34 -0
- package/dist/cjs/clients/registry/provider.js.map +1 -0
- package/dist/cjs/clients/registry/resolve.js +47 -0
- package/dist/cjs/clients/registry/resolve.js.map +1 -0
- package/dist/cjs/clients/registry/serpro.js +149 -0
- package/dist/cjs/clients/registry/serpro.js.map +1 -0
- package/dist/cjs/clients/registry/service.js +230 -0
- package/dist/cjs/clients/registry/service.js.map +1 -0
- package/dist/cjs/clients/registry/synthetic.js +165 -0
- package/dist/cjs/clients/registry/synthetic.js.map +1 -0
- package/dist/cjs/clients/repository.js +190 -9
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +190 -0
- package/dist/cjs/collection/branding.js.map +1 -1
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +65 -2
- package/dist/cjs/collection/communication-runtime.js.map +1 -1
- package/dist/cjs/collection/engine.js +20 -0
- package/dist/cjs/collection/engine.js.map +1 -1
- package/dist/cjs/collection/policy.js +29 -1
- package/dist/cjs/collection/policy.js.map +1 -1
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +5 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
- package/dist/cjs/communication/engine.js +12 -0
- package/dist/cjs/communication/engine.js.map +1 -1
- package/dist/cjs/communication/policy.js.map +1 -1
- package/dist/cjs/competence/business-days.js +155 -0
- package/dist/cjs/competence/business-days.js.map +1 -0
- package/dist/cjs/competence/catalog-validation.js +174 -0
- package/dist/cjs/competence/catalog-validation.js.map +1 -0
- package/dist/cjs/competence/obligation-preview.js +190 -0
- package/dist/cjs/competence/obligation-preview.js.map +1 -0
- package/dist/cjs/competence/repository.js +330 -17
- package/dist/cjs/competence/repository.js.map +1 -1
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +116 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/collection/authorization.js +186 -0
- package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
- package/dist/cjs/fiscal/collection/competence.js +97 -0
- package/dist/cjs/fiscal/collection/competence.js.map +1 -0
- package/dist/cjs/fiscal/collection/first-contact.js +204 -0
- package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
- package/dist/cjs/fiscal/collection/plan.js +122 -0
- package/dist/cjs/fiscal/collection/plan.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +137 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/inspect.js +182 -0
- package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
- package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +190 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/enrollment.js +134 -0
- package/dist/cjs/fiscal/enrollment.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +380 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +461 -73
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +164 -19
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/index.js +3 -1
- package/dist/cjs/legal/index.js.map +1 -1
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +173 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/rbac/catalog.js +110 -0
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +9 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
- package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/cjs/subscription-billing/service.js +246 -78
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/tenancy/features.js +131 -0
- package/dist/cjs/tenancy/features.js.map +1 -0
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +24 -1
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +92 -5
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +112 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/registry/http.d.ts +61 -0
- package/dist/clients/registry/http.d.ts.map +1 -0
- package/dist/clients/registry/http.js +151 -0
- package/dist/clients/registry/http.js.map +1 -0
- package/dist/clients/registry/ibge-municipios.d.ts +25 -0
- package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
- package/dist/clients/registry/ibge-municipios.js +25 -0
- package/dist/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/clients/registry/ibge.d.ts +62 -0
- package/dist/clients/registry/ibge.d.ts.map +1 -0
- package/dist/clients/registry/ibge.js +57 -0
- package/dist/clients/registry/ibge.js.map +1 -0
- package/dist/clients/registry/lookup.d.ts +94 -0
- package/dist/clients/registry/lookup.d.ts.map +1 -0
- package/dist/clients/registry/lookup.js +184 -0
- package/dist/clients/registry/lookup.js.map +1 -0
- package/dist/clients/registry/provider.d.ts +124 -0
- package/dist/clients/registry/provider.d.ts.map +1 -0
- package/dist/clients/registry/provider.js +39 -0
- package/dist/clients/registry/provider.js.map +1 -0
- package/dist/clients/registry/resolve.d.ts +36 -0
- package/dist/clients/registry/resolve.d.ts.map +1 -0
- package/dist/clients/registry/resolve.js +44 -0
- package/dist/clients/registry/resolve.js.map +1 -0
- package/dist/clients/registry/serpro.d.ts +57 -0
- package/dist/clients/registry/serpro.d.ts.map +1 -0
- package/dist/clients/registry/serpro.js +143 -0
- package/dist/clients/registry/serpro.js.map +1 -0
- package/dist/clients/registry/service.d.ts +59 -0
- package/dist/clients/registry/service.d.ts.map +1 -0
- package/dist/clients/registry/service.js +225 -0
- package/dist/clients/registry/service.js.map +1 -0
- package/dist/clients/registry/synthetic.d.ts +30 -0
- package/dist/clients/registry/synthetic.d.ts.map +1 -0
- package/dist/clients/registry/synthetic.js +161 -0
- package/dist/clients/registry/synthetic.js.map +1 -0
- package/dist/clients/repository.d.ts +158 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +186 -9
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +65 -0
- package/dist/collection/branding.d.ts.map +1 -1
- package/dist/collection/branding.js +186 -0
- package/dist/collection/branding.js.map +1 -1
- package/dist/collection/clearance-store.d.ts +39 -0
- package/dist/collection/clearance-store.d.ts.map +1 -0
- package/dist/collection/clearance-store.js +69 -0
- package/dist/collection/clearance-store.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +37 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -1
- package/dist/collection/communication-runtime.js +63 -1
- package/dist/collection/communication-runtime.js.map +1 -1
- package/dist/collection/engine.d.ts +23 -0
- package/dist/collection/engine.d.ts.map +1 -1
- package/dist/collection/engine.js +20 -0
- package/dist/collection/engine.js.map +1 -1
- package/dist/collection/policy.d.ts +25 -0
- package/dist/collection/policy.d.ts.map +1 -1
- package/dist/collection/policy.js +27 -0
- package/dist/collection/policy.js.map +1 -1
- package/dist/communication/clearance.d.ts +53 -0
- package/dist/communication/clearance.d.ts.map +1 -0
- package/dist/communication/clearance.js +15 -0
- package/dist/communication/clearance.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -1
- package/dist/communication/dry-run-scenario.js +5 -0
- package/dist/communication/dry-run-scenario.js.map +1 -1
- package/dist/communication/engine.d.ts +10 -0
- package/dist/communication/engine.d.ts.map +1 -1
- package/dist/communication/engine.js +12 -0
- package/dist/communication/engine.js.map +1 -1
- package/dist/communication/policy.d.ts +16 -0
- package/dist/communication/policy.d.ts.map +1 -1
- package/dist/communication/policy.js.map +1 -1
- package/dist/competence/business-days.d.ts +51 -0
- package/dist/competence/business-days.d.ts.map +1 -0
- package/dist/competence/business-days.js +145 -0
- package/dist/competence/business-days.js.map +1 -0
- package/dist/competence/catalog-validation.d.ts +86 -0
- package/dist/competence/catalog-validation.d.ts.map +1 -0
- package/dist/competence/catalog-validation.js +168 -0
- package/dist/competence/catalog-validation.js.map +1 -0
- package/dist/competence/obligation-preview.d.ts +103 -0
- package/dist/competence/obligation-preview.d.ts.map +1 -0
- package/dist/competence/obligation-preview.js +184 -0
- package/dist/competence/obligation-preview.js.map +1 -0
- package/dist/competence/repository.d.ts +139 -1
- package/dist/competence/repository.d.ts.map +1 -1
- package/dist/competence/repository.js +325 -17
- package/dist/competence/repository.js.map +1 -1
- package/dist/dashboard/pilot-panel.d.ts +100 -0
- package/dist/dashboard/pilot-panel.d.ts.map +1 -0
- package/dist/dashboard/pilot-panel.js +87 -0
- package/dist/dashboard/pilot-panel.js.map +1 -0
- package/dist/dashboard/repository.d.ts.map +1 -1
- package/dist/dashboard/repository.js +11 -1
- package/dist/dashboard/repository.js.map +1 -1
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +16 -11
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +36 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +199 -32
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +114 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/collection/authorization.d.ts +152 -0
- package/dist/fiscal/collection/authorization.d.ts.map +1 -0
- package/dist/fiscal/collection/authorization.js +178 -0
- package/dist/fiscal/collection/authorization.js.map +1 -0
- package/dist/fiscal/collection/competence.d.ts +66 -0
- package/dist/fiscal/collection/competence.d.ts.map +1 -0
- package/dist/fiscal/collection/competence.js +90 -0
- package/dist/fiscal/collection/competence.js.map +1 -0
- package/dist/fiscal/collection/first-contact.d.ts +103 -0
- package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
- package/dist/fiscal/collection/first-contact.js +201 -0
- package/dist/fiscal/collection/first-contact.js.map +1 -0
- package/dist/fiscal/collection/plan.d.ts +74 -0
- package/dist/fiscal/collection/plan.d.ts.map +1 -0
- package/dist/fiscal/collection/plan.js +119 -0
- package/dist/fiscal/collection/plan.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +114 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +130 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/inspect.d.ts +114 -0
- package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
- package/dist/fiscal/credentials/inspect.js +178 -0
- package/dist/fiscal/credentials/inspect.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/onboarding.d.ts +119 -0
- package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
- package/dist/fiscal/credentials/onboarding.js +259 -0
- package/dist/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +119 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +186 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/enrollment.d.ts +91 -0
- package/dist/fiscal/enrollment.d.ts.map +1 -0
- package/dist/fiscal/enrollment.js +126 -0
- package/dist/fiscal/enrollment.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +99 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +374 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +145 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -7
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts +12 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +162 -18
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +2 -2
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/index.js +1 -1
- package/dist/legal/index.js.map +1 -1
- package/dist/legal/types.d.ts +114 -2
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +169 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +110 -0
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +8 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +4 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/platform-exemption.d.ts +89 -0
- package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
- package/dist/subscription-billing/platform-exemption.js +113 -0
- package/dist/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/subscription-billing/service.d.ts +74 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +182 -16
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/tenancy/features.d.ts +69 -0
- package/dist/tenancy/features.d.ts.map +1 -0
- package/dist/tenancy/features.js +123 -0
- package/dist/tenancy/features.js.map +1 -0
- package/dist/tenancy/settings.d.ts +63 -0
- package/dist/tenancy/settings.d.ts.map +1 -0
- package/dist/tenancy/settings.js +218 -0
- package/dist/tenancy/settings.js.map +1 -0
- package/dist/users/repository.d.ts +16 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +24 -1
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +69 -1
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +88 -5
- package/dist/vault/repository.js.map +1 -1
- package/package.json +10 -2
- package/src/db/migrations/0045_role_write_scope.sql +122 -0
- package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
- package/src/db/migrations/0047_recipient_clearance.sql +89 -0
- package/src/db/migrations/0048_item_type_note.sql +16 -0
- package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
- package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
- package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
- package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
- package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
- package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
- package/src/db/migrations/0055_job_capability_contract.sql +300 -0
- package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
- package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
- package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
- package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
- package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
- package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
- package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SecretNotRevealableError = void 0;
|
|
4
|
+
exports.exposureFor = exposureFor;
|
|
3
5
|
exports.createCredential = createCredential;
|
|
4
6
|
exports.listCredentials = listCredentials;
|
|
5
7
|
exports.getCredentialMeta = getCredentialMeta;
|
|
6
8
|
exports.revealSecret = revealSecret;
|
|
9
|
+
exports.revealWriteOnlySecretForProcess = revealWriteOnlySecretForProcess;
|
|
7
10
|
exports.revealSecretByName = revealSecretByName;
|
|
8
11
|
exports.rotateSecret = rotateSecret;
|
|
9
12
|
exports.softDeleteCredential = softDeleteCredential;
|
|
@@ -19,6 +22,7 @@ function mapMeta(r) {
|
|
|
19
22
|
name: r.name,
|
|
20
23
|
category: r.category,
|
|
21
24
|
provider: r.provider,
|
|
25
|
+
exposure: r.exposure ?? 'revealable',
|
|
22
26
|
keyVersion: r.key_version,
|
|
23
27
|
metadata: r.metadata ?? {},
|
|
24
28
|
expiresAt: r.expires_at ? r.expires_at.toISOString() : null,
|
|
@@ -28,26 +32,43 @@ function mapMeta(r) {
|
|
|
28
32
|
};
|
|
29
33
|
}
|
|
30
34
|
const META_COLUMNS = `
|
|
31
|
-
id, client_id, name, category, provider, key_version, metadata,
|
|
35
|
+
id, client_id, name, category, provider, exposure, key_version, metadata,
|
|
32
36
|
expires_at, rotated_at, created_at, updated_at
|
|
33
37
|
`;
|
|
38
|
+
/**
|
|
39
|
+
* A classe de exposição de uma categoria.
|
|
40
|
+
*
|
|
41
|
+
* Material de certificado NUNCA é revelável, e a regra vive nos dois lugares de
|
|
42
|
+
* propósito: aqui, para que a gravação nasça certa, e no CHECK da 0060, para que
|
|
43
|
+
* um caminho que ninguém escreveu ainda também nasça certo.
|
|
44
|
+
*
|
|
45
|
+
* Sem esta função, `createCredential` — a porta genérica do cofre, usada por
|
|
46
|
+
* rotas e seeds — gravaria `revealable` e receberia uma violação de constraint.
|
|
47
|
+
* O comportamento seria seguro e a mensagem, incompreensível: um 500 de
|
|
48
|
+
* constraint onde deveria haver uma gravação correta.
|
|
49
|
+
*/
|
|
50
|
+
function exposureFor(category) {
|
|
51
|
+
return category === 'certificate' ? 'write_only' : 'revealable';
|
|
52
|
+
}
|
|
34
53
|
async function createCredential(tx, keyring, tenantId, input) {
|
|
35
54
|
const enc = (0, crypto_js_1.encryptSecret)(keyring, tenantId, input.secret);
|
|
55
|
+
const category = input.category ?? 'generic';
|
|
36
56
|
const rows = await tx `
|
|
37
57
|
INSERT INTO vault_credential (
|
|
38
58
|
id, tenant_id, client_id, name, category, provider,
|
|
39
|
-
ciphertext, iv, auth_tag, key_version, metadata, expires_at, created_by
|
|
59
|
+
ciphertext, iv, auth_tag, key_version, metadata, expires_at, created_by, exposure
|
|
40
60
|
) VALUES (
|
|
41
61
|
${(0, shared_1.uuidv7)()},
|
|
42
62
|
current_setting('app.current_tenant')::uuid,
|
|
43
63
|
${input.clientId ?? null},
|
|
44
64
|
${input.name},
|
|
45
|
-
${
|
|
65
|
+
${category},
|
|
46
66
|
${input.provider ?? null},
|
|
47
67
|
${enc.ciphertext}, ${enc.iv}, ${enc.authTag}, ${enc.keyVersion},
|
|
48
68
|
${tx.json((input.metadata ?? {}))},
|
|
49
69
|
${input.expiresAt ?? null},
|
|
50
|
-
${input.createdBy ?? null}
|
|
70
|
+
${input.createdBy ?? null},
|
|
71
|
+
${exposureFor(category)}
|
|
51
72
|
)
|
|
52
73
|
RETURNING ${tx.unsafe(META_COLUMNS)}
|
|
53
74
|
`;
|
|
@@ -72,11 +93,77 @@ async function getCredentialMeta(tx, id) {
|
|
|
72
93
|
throw new shared_1.NotFoundError('Credencial não encontrada');
|
|
73
94
|
return mapMeta(rows[0]);
|
|
74
95
|
}
|
|
75
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Erro de quem pede para ver um segredo que não tem caminho de volta.
|
|
98
|
+
*
|
|
99
|
+
* Nomeado, e não um `NotFoundError`, porque a diferença importa para quem opera:
|
|
100
|
+
* "não existe" manda procurar; "não é revelável" manda substituir. Não carrega
|
|
101
|
+
* nome nem ponteiro — só a classe.
|
|
102
|
+
*/
|
|
103
|
+
class SecretNotRevealableError extends Error {
|
|
104
|
+
constructor() {
|
|
105
|
+
super('Esta credencial é write-only: não existe caminho de leitura para humano.');
|
|
106
|
+
this.name = 'SecretNotRevealableError';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.SecretNotRevealableError = SecretNotRevealableError;
|
|
110
|
+
/**
|
|
111
|
+
* Decifra e retorna o segredo em claro. A ROTA deve exigir
|
|
112
|
+
* `vault.credential.decrypt` e auditar.
|
|
113
|
+
*
|
|
114
|
+
* ## O portão que faltava
|
|
115
|
+
*
|
|
116
|
+
* Esta função era o caminho ÚNICO de saída do cofre, e ela não perguntava que
|
|
117
|
+
* tipo de segredo estava devolvendo. Para uma chave de API isso é o
|
|
118
|
+
* comportamento desejado. Para o envelope de um certificado digital — que
|
|
119
|
+
* carrega a CHAVE PRIVADA do cliente em base64 — era a porta dos fundos: um
|
|
120
|
+
* `POST .../reveal` devolvia o material inteiro para a tela, e o papel
|
|
121
|
+
* `accountant` do catálogo já carregava a permissão.
|
|
122
|
+
*
|
|
123
|
+
* A recusa acontece DEPOIS de ler a linha e ANTES de decifrar: nem o custo da
|
|
124
|
+
* decifração é pago, e o texto em claro nunca chega a existir em memória.
|
|
125
|
+
*/
|
|
76
126
|
async function revealSecret(tx, keyring, tenantId, id) {
|
|
77
127
|
const rows = await tx `
|
|
78
128
|
SELECT ${tx.unsafe(META_COLUMNS)}, ciphertext, iv, auth_tag
|
|
79
129
|
FROM vault_credential WHERE id = ${id} AND deleted_at IS NULL
|
|
130
|
+
`;
|
|
131
|
+
if (!rows[0])
|
|
132
|
+
throw new shared_1.NotFoundError('Credencial não encontrada');
|
|
133
|
+
const r = rows[0];
|
|
134
|
+
if ((r.exposure ?? 'revealable') === 'write_only')
|
|
135
|
+
throw new SecretNotRevealableError();
|
|
136
|
+
const secret = (0, crypto_js_1.decryptSecret)(keyring, tenantId, {
|
|
137
|
+
ciphertext: r.ciphertext,
|
|
138
|
+
iv: r.iv,
|
|
139
|
+
authTag: r.auth_tag,
|
|
140
|
+
keyVersion: r.key_version,
|
|
141
|
+
});
|
|
142
|
+
return { meta: mapMeta(r), secret };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* O caminho de PROCESSO para um segredo write-only.
|
|
146
|
+
*
|
|
147
|
+
* ## Por que ela precisa existir, e por que não é exportada
|
|
148
|
+
*
|
|
149
|
+
* `revealSecret` passou a recusar `write_only` — o que fecha a rota humana e,
|
|
150
|
+
* sem esta função, quebraria o motor fiscal: `loadFiscalTlsMaterial` também
|
|
151
|
+
* decifra o mesmo envelope, e ele é justamente quem deve conseguir.
|
|
152
|
+
*
|
|
153
|
+
* A diferença entre os dois chamadores não é a permissão de quem pediu; é o
|
|
154
|
+
* DESTINO do texto em claro. Em `revealSecret` ele vira corpo de resposta HTTP e
|
|
155
|
+
* chega a uma tela. Aqui ele vira `Buffer` dentro de um `https.Agent`, é usado
|
|
156
|
+
* num handshake e é zerado — nunca atravessa a fronteira do processo.
|
|
157
|
+
*
|
|
158
|
+
* O nome grita o que a função faz porque é o único aviso que sobrevive a um
|
|
159
|
+
* autocomplete. E ela NÃO é reexportada pelo `index` do pacote: fora de
|
|
160
|
+
* `@baruk/core` não existe caminho para chamá-la, do mesmo modo que
|
|
161
|
+
* `grantFiscalSecretAccess` não existe fora daqui.
|
|
162
|
+
*/
|
|
163
|
+
async function revealWriteOnlySecretForProcess(tx, keyring, tenantId, id) {
|
|
164
|
+
const rows = await tx `
|
|
165
|
+
SELECT ${tx.unsafe(META_COLUMNS)}, ciphertext, iv, auth_tag
|
|
166
|
+
FROM vault_credential WHERE id = ${id} AND deleted_at IS NULL
|
|
80
167
|
`;
|
|
81
168
|
if (!rows[0])
|
|
82
169
|
throw new shared_1.NotFoundError('Credencial não encontrada');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/vault/repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/vault/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** A UF que o próprio código declara, ou `null` se o prefixo não é de UF alguma. */
|
|
2
|
+
export declare function ufOfIbgeCode(code: string | null | undefined): string | null;
|
|
3
|
+
/** Só para o teste de equivalência e para a tela: as UFs que o motor reconhece. */
|
|
4
|
+
export declare function knownUfs(): string[];
|
|
5
|
+
/**
|
|
6
|
+
* Recusa o par (código, UF) quando ele se contradiz.
|
|
7
|
+
*
|
|
8
|
+
* Recebe o ESTADO RESULTANTE, nunca o corpo da requisição: num PATCH que muda
|
|
9
|
+
* só a UF, o código incoerente é o que já estava gravado. Validar o payload
|
|
10
|
+
* deixaria passar exatamente a metade dos casos.
|
|
11
|
+
*
|
|
12
|
+
* UF ausente não é contradição — é dado faltando, e o cliente pode ficar sem
|
|
13
|
+
* UF de propósito enquanto o escritório confere. O código sozinho já carrega a
|
|
14
|
+
* jurisdição estadual.
|
|
15
|
+
*/
|
|
16
|
+
export declare function assertIbgeCoherent(code: string | null, uf: string | null): void;
|
|
17
|
+
//# sourceMappingURL=ibge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ibge.d.ts","sourceRoot":"","sources":["../../src/clients/ibge.ts"],"names":[],"mappings":"AA4EA,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI3E;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,IAAI,MAAM,EAAE,CAEnC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAoB/E"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { ValidationError } from '@baruk/shared';
|
|
2
|
+
/**
|
|
3
|
+
* Coerência do código IBGE do município — SEM catálogo de municípios.
|
|
4
|
+
*
|
|
5
|
+
* O problema real: a validação anterior era `^[0-9]{7}$` e só. Um operador
|
|
6
|
+
* podia digitar 3550308 para um cliente declarado em Goiás, e o motor fiscal
|
|
7
|
+
* passaria a casar esse cliente com regra municipal de São Paulo. Nada no
|
|
8
|
+
* sistema contradizia o dado.
|
|
9
|
+
*
|
|
10
|
+
* O que este módulo faz é o pedaço da verificação que NÃO depende de fonte
|
|
11
|
+
* externa: os dois primeiros dígitos de todo código de município são o código
|
|
12
|
+
* da UF, e essa tabela é fechada em 27 valores desde 1988. Com ela dá para
|
|
13
|
+
* recusar (a) prefixo que não é UF nenhuma e (b) município de um estado
|
|
14
|
+
* atribuído a cliente de outro — que é o erro de digitação e de copiar-colar
|
|
15
|
+
* que produz jurisdição errada.
|
|
16
|
+
*
|
|
17
|
+
* O que este módulo deliberadamente NÃO faz:
|
|
18
|
+
*
|
|
19
|
+
* - Não confere o dígito verificador. O algoritmo circula publicamente, mas
|
|
20
|
+
* não temos aqui a lista dos 5.570 códigos reais para provar que todos
|
|
21
|
+
* fecham por ele. Um falso negativo recusaria o cadastro de um município
|
|
22
|
+
* legítimo — pior que a dívida que estamos fechando, porque quebra a
|
|
23
|
+
* operação do escritório em vez de apenas deixar passar um dado errado.
|
|
24
|
+
* - Não afirma que o município existe. 5299999 tem prefixo de Goiás e passa
|
|
25
|
+
* daqui; só um catálogo oficial recusaria. Continua dívida documentada.
|
|
26
|
+
*
|
|
27
|
+
* Ou seja: o que passa daqui é COERENTE, não é VERIFICADO. A distinção está
|
|
28
|
+
* na mensagem de erro e no relatório da fase, e não deve ser apagada.
|
|
29
|
+
*
|
|
30
|
+
* ## O catálogo passou a existir — e esta função continua como está
|
|
31
|
+
*
|
|
32
|
+
* `clients/registry/ibge.ts` traz os 5.571 municípios oficiais, e com ele dá
|
|
33
|
+
* para responder "este código existe?". Ligá-lo AQUI seria endurecer uma
|
|
34
|
+
* validação de escrita que já governa cadastro gravado: um código legítimo que
|
|
35
|
+
* o dataset não tivesse — município novo, dataset defasado — passaria a
|
|
36
|
+
* bloquear a edição de um cliente que hoje funciona, e a falha apareceria como
|
|
37
|
+
* "não consigo salvar" sem ninguém saber por quê.
|
|
38
|
+
*
|
|
39
|
+
* O catálogo entra pelo caminho novo, onde ele PROPÕE em vez de recusar: a
|
|
40
|
+
* consulta oficial resolve o nome do município para um código, e um nome que
|
|
41
|
+
* ele não conhece vira uma pergunta na tela. Endurecer esta função é uma
|
|
42
|
+
* decisão separada, com migração de dados por trás.
|
|
43
|
+
*/
|
|
44
|
+
/** Os 27 prefixos oficiais. Tabela fechada — não é fonte de dados externa. */
|
|
45
|
+
const UF_BY_PREFIX = Object.freeze({
|
|
46
|
+
'11': 'RO',
|
|
47
|
+
'12': 'AC',
|
|
48
|
+
'13': 'AM',
|
|
49
|
+
'14': 'RR',
|
|
50
|
+
'15': 'PA',
|
|
51
|
+
'16': 'AP',
|
|
52
|
+
'17': 'TO',
|
|
53
|
+
'21': 'MA',
|
|
54
|
+
'22': 'PI',
|
|
55
|
+
'23': 'CE',
|
|
56
|
+
'24': 'RN',
|
|
57
|
+
'25': 'PB',
|
|
58
|
+
'26': 'PE',
|
|
59
|
+
'27': 'AL',
|
|
60
|
+
'28': 'SE',
|
|
61
|
+
'29': 'BA',
|
|
62
|
+
'31': 'MG',
|
|
63
|
+
'32': 'ES',
|
|
64
|
+
'33': 'RJ',
|
|
65
|
+
'35': 'SP',
|
|
66
|
+
'41': 'PR',
|
|
67
|
+
'42': 'SC',
|
|
68
|
+
'43': 'RS',
|
|
69
|
+
'50': 'MS',
|
|
70
|
+
'51': 'MT',
|
|
71
|
+
'52': 'GO',
|
|
72
|
+
'53': 'DF',
|
|
73
|
+
});
|
|
74
|
+
/** A UF que o próprio código declara, ou `null` se o prefixo não é de UF alguma. */
|
|
75
|
+
export function ufOfIbgeCode(code) {
|
|
76
|
+
const t = code?.trim();
|
|
77
|
+
if (!t || !/^[0-9]{7}$/.test(t))
|
|
78
|
+
return null;
|
|
79
|
+
return UF_BY_PREFIX[t.slice(0, 2)] ?? null;
|
|
80
|
+
}
|
|
81
|
+
/** Só para o teste de equivalência e para a tela: as UFs que o motor reconhece. */
|
|
82
|
+
export function knownUfs() {
|
|
83
|
+
return Object.values(UF_BY_PREFIX).slice().sort();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Recusa o par (código, UF) quando ele se contradiz.
|
|
87
|
+
*
|
|
88
|
+
* Recebe o ESTADO RESULTANTE, nunca o corpo da requisição: num PATCH que muda
|
|
89
|
+
* só a UF, o código incoerente é o que já estava gravado. Validar o payload
|
|
90
|
+
* deixaria passar exatamente a metade dos casos.
|
|
91
|
+
*
|
|
92
|
+
* UF ausente não é contradição — é dado faltando, e o cliente pode ficar sem
|
|
93
|
+
* UF de propósito enquanto o escritório confere. O código sozinho já carrega a
|
|
94
|
+
* jurisdição estadual.
|
|
95
|
+
*/
|
|
96
|
+
export function assertIbgeCoherent(code, uf) {
|
|
97
|
+
if (!code)
|
|
98
|
+
return;
|
|
99
|
+
if (!/^[0-9]{7}$/.test(code)) {
|
|
100
|
+
throw new ValidationError('Código IBGE do município tem 7 dígitos.', {
|
|
101
|
+
field: 'municipalityIbgeCode',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const declared = ufOfIbgeCode(code);
|
|
105
|
+
if (declared === null) {
|
|
106
|
+
throw new ValidationError(`Código IBGE ${code} não começa com um código de UF válido — os dois primeiros dígitos identificam o estado.`, { field: 'municipalityIbgeCode' });
|
|
107
|
+
}
|
|
108
|
+
if (uf && declared !== uf) {
|
|
109
|
+
throw new ValidationError(`Código IBGE ${code} é de município de ${declared}, mas o cliente está em ${uf}. Corrija o código ou a UF.`, { field: 'municipalityIbgeCode', declaredUf: declared, clientUf: uf });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ibge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ibge.js","sourceRoot":"","sources":["../../src/clients/ibge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,8EAA8E;AAC9E,MAAM,YAAY,GAAqC,MAAM,CAAC,MAAM,CAAC;IACnE,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;CACX,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,IAA+B;IAC1D,MAAM,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAE,EAAiB;IACvE,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CAAC,yCAAyC,EAAE;YACnE,KAAK,EAAE,sBAAsB;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CACvB,eAAe,IAAI,0FAA0F,EAC7G,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAClC,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,eAAe,CACvB,eAAe,IAAI,sBAAsB,QAAQ,2BAA2B,EAAE,6BAA6B,EAC3G,EAAE,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CACtE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type CompanyRegistryProvider, type CompanyRegistryRecord } from './provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* O caminho de rede de uma consulta cadastral — e o que ele recusa.
|
|
4
|
+
*
|
|
5
|
+
* ## A allowlist não é higiene, é a defesa
|
|
6
|
+
*
|
|
7
|
+
* Um provedor de CNPJ é configurado por URL. Uma URL configurável é um pedido
|
|
8
|
+
* de SSRF assinado: quem conseguir escrever a configuração faz o servidor
|
|
9
|
+
* buscar `http://169.254.169.254/` e devolver as credenciais da instância na
|
|
10
|
+
* tela de cadastro de cliente. Por isso o host **não vem da configuração** — a
|
|
11
|
+
* configuração escolhe entre hosts que este arquivo já conhece.
|
|
12
|
+
*
|
|
13
|
+
* ## Redirecionamento é recusado, não seguido
|
|
14
|
+
*
|
|
15
|
+
* Uma allowlist que valida a primeira URL e segue redirects não é allowlist: o
|
|
16
|
+
* host permitido responde `302` para onde quiser e o destino final nunca é
|
|
17
|
+
* conferido. `redirect: 'error'` é o que torna a lista verdadeira.
|
|
18
|
+
*
|
|
19
|
+
* ## Nem a URL nem a resposta crua entram em erro
|
|
20
|
+
*
|
|
21
|
+
* Credencial de provedor viaja em cabeçalho — e, em alguns, em query string.
|
|
22
|
+
* Uma mensagem de erro que cita a URL copia o segredo para o log, para o Sentry
|
|
23
|
+
* e para a tela. Toda falha aqui vira um dos códigos fechados de
|
|
24
|
+
* `CompanyLookupFailure`, e nada mais.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Os hosts que este produto aceita consultar.
|
|
28
|
+
*
|
|
29
|
+
* Fontes OFICIAIS apenas. Um agregador comunitário gratuito não entra aqui nem
|
|
30
|
+
* como conveniência: o dado que ele devolve não tem autoria, e um cadastro
|
|
31
|
+
* fiscal montado sobre dado sem autoria é um cadastro que ninguém assina.
|
|
32
|
+
*/
|
|
33
|
+
export declare const ALLOWED_REGISTRY_HOSTS: readonly string[];
|
|
34
|
+
export declare class RegistryHostNotAllowedError extends Error {
|
|
35
|
+
readonly host: string;
|
|
36
|
+
constructor(host: string);
|
|
37
|
+
}
|
|
38
|
+
/** Recusa qualquer destino fora da lista — antes de existir socket. */
|
|
39
|
+
export declare function assertAllowedRegistryUrl(url: string): URL;
|
|
40
|
+
export declare const REGISTRY_REQUEST_TIMEOUT_MS = 12000;
|
|
41
|
+
/** Teto de corpo lido. Um provedor não manda megabytes para um CNPJ. */
|
|
42
|
+
export declare const REGISTRY_MAX_RESPONSE_BYTES: number;
|
|
43
|
+
export interface HttpRegistryOptions {
|
|
44
|
+
name: string;
|
|
45
|
+
official: boolean;
|
|
46
|
+
/** URL completa da consulta, já com o CNPJ. Passa pela allowlist. */
|
|
47
|
+
buildUrl(cnpj: string): string;
|
|
48
|
+
/** Cabeçalhos — é aqui que a credencial entra, e de onde ela nunca sai. */
|
|
49
|
+
headers(): Record<string, string>;
|
|
50
|
+
/** Traduz o corpo do provedor para o retrato normalizado. */
|
|
51
|
+
parse(body: unknown): CompanyRegistryRecord | null;
|
|
52
|
+
timeoutMs?: number;
|
|
53
|
+
/** Substituível só nos testes; em produção é o `fetch` do runtime. */
|
|
54
|
+
fetchImpl?: typeof fetch;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Monta um provedor sobre HTTP. Genérico de propósito: o Serpro é o primeiro,
|
|
58
|
+
* e não deve ser o único que este produto saiba falar.
|
|
59
|
+
*/
|
|
60
|
+
export declare function createHttpCompanyRegistry(options: HttpRegistryOptions): CompanyRegistryProvider;
|
|
61
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/clients/registry/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAGnD,CAAC;AAEF,qBAAa,2BAA4B,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAMlC;AAED,uEAAuE;AACvE,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAczD;AAED,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,wEAAwE;AACxE,eAAO,MAAM,2BAA2B,QAAa,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,2EAA2E;IAC3E,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,6DAA6D;IAC7D,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB,GAAG,IAAI,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAUD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,uBAAuB,CAkE/F"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { cnpjDigits, } from './provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* O caminho de rede de uma consulta cadastral — e o que ele recusa.
|
|
4
|
+
*
|
|
5
|
+
* ## A allowlist não é higiene, é a defesa
|
|
6
|
+
*
|
|
7
|
+
* Um provedor de CNPJ é configurado por URL. Uma URL configurável é um pedido
|
|
8
|
+
* de SSRF assinado: quem conseguir escrever a configuração faz o servidor
|
|
9
|
+
* buscar `http://169.254.169.254/` e devolver as credenciais da instância na
|
|
10
|
+
* tela de cadastro de cliente. Por isso o host **não vem da configuração** — a
|
|
11
|
+
* configuração escolhe entre hosts que este arquivo já conhece.
|
|
12
|
+
*
|
|
13
|
+
* ## Redirecionamento é recusado, não seguido
|
|
14
|
+
*
|
|
15
|
+
* Uma allowlist que valida a primeira URL e segue redirects não é allowlist: o
|
|
16
|
+
* host permitido responde `302` para onde quiser e o destino final nunca é
|
|
17
|
+
* conferido. `redirect: 'error'` é o que torna a lista verdadeira.
|
|
18
|
+
*
|
|
19
|
+
* ## Nem a URL nem a resposta crua entram em erro
|
|
20
|
+
*
|
|
21
|
+
* Credencial de provedor viaja em cabeçalho — e, em alguns, em query string.
|
|
22
|
+
* Uma mensagem de erro que cita a URL copia o segredo para o log, para o Sentry
|
|
23
|
+
* e para a tela. Toda falha aqui vira um dos códigos fechados de
|
|
24
|
+
* `CompanyLookupFailure`, e nada mais.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Os hosts que este produto aceita consultar.
|
|
28
|
+
*
|
|
29
|
+
* Fontes OFICIAIS apenas. Um agregador comunitário gratuito não entra aqui nem
|
|
30
|
+
* como conveniência: o dado que ele devolve não tem autoria, e um cadastro
|
|
31
|
+
* fiscal montado sobre dado sem autoria é um cadastro que ninguém assina.
|
|
32
|
+
*/
|
|
33
|
+
export const ALLOWED_REGISTRY_HOSTS = [
|
|
34
|
+
// Serpro — Consulta CNPJ (contrato comercial; ver `serpro.ts`).
|
|
35
|
+
'gateway.apiserpro.serpro.gov.br',
|
|
36
|
+
];
|
|
37
|
+
export class RegistryHostNotAllowedError extends Error {
|
|
38
|
+
host;
|
|
39
|
+
constructor(host) {
|
|
40
|
+
// A mensagem cita o HOST, nunca a URL: o host não carrega credencial, o
|
|
41
|
+
// caminho e a query podem carregar.
|
|
42
|
+
super(`host de consulta cadastral não permitido: ${host}`);
|
|
43
|
+
this.host = host;
|
|
44
|
+
this.name = 'RegistryHostNotAllowedError';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Recusa qualquer destino fora da lista — antes de existir socket. */
|
|
48
|
+
export function assertAllowedRegistryUrl(url) {
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = new URL(url);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new RegistryHostNotAllowedError('(url inválida)');
|
|
55
|
+
}
|
|
56
|
+
// `https` obrigatório: em `http` a credencial do cabeçalho viaja em claro, e
|
|
57
|
+
// um provedor oficial que só falasse `http` seria motivo para não integrar.
|
|
58
|
+
if (parsed.protocol !== 'https:')
|
|
59
|
+
throw new RegistryHostNotAllowedError(parsed.protocol);
|
|
60
|
+
if (!ALLOWED_REGISTRY_HOSTS.includes(parsed.hostname)) {
|
|
61
|
+
throw new RegistryHostNotAllowedError(parsed.hostname);
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
export const REGISTRY_REQUEST_TIMEOUT_MS = 12_000;
|
|
66
|
+
/** Teto de corpo lido. Um provedor não manda megabytes para um CNPJ. */
|
|
67
|
+
export const REGISTRY_MAX_RESPONSE_BYTES = 512 * 1024;
|
|
68
|
+
function classifyStatus(status) {
|
|
69
|
+
if (status === 404)
|
|
70
|
+
return 'not_found';
|
|
71
|
+
if (status === 429)
|
|
72
|
+
return 'rate_limited';
|
|
73
|
+
if (status === 401 || status === 403)
|
|
74
|
+
return 'provider_not_configured';
|
|
75
|
+
if (status >= 500)
|
|
76
|
+
return 'provider_unavailable';
|
|
77
|
+
return 'unexpected_payload';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Monta um provedor sobre HTTP. Genérico de propósito: o Serpro é o primeiro,
|
|
81
|
+
* e não deve ser o único que este produto saiba falar.
|
|
82
|
+
*/
|
|
83
|
+
export function createHttpCompanyRegistry(options) {
|
|
84
|
+
const doFetch = options.fetchImpl ?? fetch;
|
|
85
|
+
const timeoutMs = options.timeoutMs ?? REGISTRY_REQUEST_TIMEOUT_MS;
|
|
86
|
+
return {
|
|
87
|
+
name: options.name,
|
|
88
|
+
official: options.official,
|
|
89
|
+
async lookup(input) {
|
|
90
|
+
const cnpj = cnpjDigits(input);
|
|
91
|
+
const source = options.name;
|
|
92
|
+
const recusa = (reason) => ({
|
|
93
|
+
status: 'failed',
|
|
94
|
+
reason,
|
|
95
|
+
source,
|
|
96
|
+
});
|
|
97
|
+
let url;
|
|
98
|
+
try {
|
|
99
|
+
url = assertAllowedRegistryUrl(options.buildUrl(cnpj));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Destino fora da lista não é "provedor fora do ar": é configuração
|
|
103
|
+
// errada, e o operador precisa ver a diferença.
|
|
104
|
+
return recusa('provider_not_configured');
|
|
105
|
+
}
|
|
106
|
+
const abort = new AbortController();
|
|
107
|
+
const timer = setTimeout(() => abort.abort(), timeoutMs);
|
|
108
|
+
let res;
|
|
109
|
+
try {
|
|
110
|
+
res = await doFetch(url, {
|
|
111
|
+
method: 'GET',
|
|
112
|
+
headers: { accept: 'application/json', ...options.headers() },
|
|
113
|
+
signal: abort.signal,
|
|
114
|
+
// Ver o cabeçalho deste arquivo: seguir redirect anula a allowlist.
|
|
115
|
+
redirect: 'error',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return recusa('provider_unavailable');
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
clearTimeout(timer);
|
|
123
|
+
}
|
|
124
|
+
if (!res.ok)
|
|
125
|
+
return recusa(classifyStatus(res.status));
|
|
126
|
+
let body;
|
|
127
|
+
try {
|
|
128
|
+
const texto = await res.text();
|
|
129
|
+
if (texto.length > REGISTRY_MAX_RESPONSE_BYTES)
|
|
130
|
+
return recusa('unexpected_payload');
|
|
131
|
+
body = JSON.parse(texto);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return recusa('unexpected_payload');
|
|
135
|
+
}
|
|
136
|
+
let record;
|
|
137
|
+
try {
|
|
138
|
+
record = options.parse(body);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Um `parse` que estoura é payload inesperado, não indisponibilidade —
|
|
142
|
+
// e a distinção decide se o disjuntor abre.
|
|
143
|
+
return recusa('unexpected_payload');
|
|
144
|
+
}
|
|
145
|
+
if (!record)
|
|
146
|
+
return recusa('unexpected_payload');
|
|
147
|
+
return { status: 'ok', record, source, fetchedAt: new Date().toISOString() };
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/clients/registry/http.ts"],"names":[],"mappings":"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"}
|