{"_id":"@adatechnology/identity-reconciliation","_rev":"4-0cc1b649c06f717e98df1791553efc91","name":"@adatechnology/identity-reconciliation","dist-tags":{"rc":"0.1.0-rc.1","latest":"0.1.0"},"versions":{"0.1.0-rc.0":{"name":"@adatechnology/identity-reconciliation","version":"0.1.0-rc.0","keywords":["identity","reconciliation","keycloak","matching"],"license":"MIT","_id":"@adatechnology/identity-reconciliation@0.1.0-rc.0","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"49e011311a5fca6767208f59bb9e2e50fd264753","tarball":"https://registry.npmjs.org/@adatechnology/identity-reconciliation/-/identity-reconciliation-0.1.0-rc.0.tgz","fileCount":4,"integrity":"sha512-y1aarijcFB2Nns+x8Mc0Ervxvv2F+YXLLhna6Hl+pxFEMIeJzLbASLJ3JAhd4o4PEeWGGk3Ihr0U3amzqvT7Iw==","signatures":[{"sig":"MEUCIEn2M1/RFlSolNE4HsaGyuYrPkfsUHbrJtM44MxxyIG/AiEAn9z0YnmDYWM1STRnL1VNPhfjyKc1Ua/j3iJ/oeNiFHQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11195},"main":"dist/index.js","type":"module","_from":"file:adatechnology-identity-reconciliation-0.1.0-rc.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"bun test","build":"tsup","check":"tsc --noEmit"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/2f14f985b63b1c116586a9aaba135f2e/adatechnology-identity-reconciliation-0.1.0-rc.0.tgz","_integrity":"sha512-y1aarijcFB2Nns+x8Mc0Ervxvv2F+YXLLhna6Hl+pxFEMIeJzLbASLJ3JAhd4o4PEeWGGk3Ihr0U3amzqvT7Iw==","_npmVersion":"10.9.8","description":"Pure matching rules that reconcile a product user base against an identity provider realm","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/bun":"latest","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/identity-reconciliation_0.1.0-rc.0_1788099688895_0.7589522812506353","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-rc.1":{"name":"@adatechnology/identity-reconciliation","version":"0.1.0-rc.1","keywords":["identity","reconciliation","keycloak","matching"],"license":"MIT","_id":"@adatechnology/identity-reconciliation@0.1.0-rc.1","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"586cad6ce37ce6e2049b1d12a200860855c4a969","tarball":"https://registry.npmjs.org/@adatechnology/identity-reconciliation/-/identity-reconciliation-0.1.0-rc.1.tgz","fileCount":4,"integrity":"sha512-NHrTJmub5Fwk7kbS5+j3Yz6hNXgungnq5tQtV+ZBrH/PINnmq3u1pti8tDnMjn9lf4gXNQ9jjLRlB3KRICFgcw==","signatures":[{"sig":"MEQCIAnSZ4iPIVAVi2RW1+iRBl8oEKaSp2hRBhrFyagw26FeAiBqly2WSqTb2X3K50yRmG91SL7Zjbe4KhXbo7A7mU/zGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC1BVNbzlz624J6ImfXiV56PA+f9JI1El1Qc98OMebyBAIhALcD1Ibg2KGACmLCUii99vfLfMzW3lyVSBl93xRO4ewi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15870},"main":"dist/index.js","type":"module","_from":"file:adatechnology-identity-reconciliation-0.1.0-rc.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"bun test","build":"tsup","check":"tsc --noEmit"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/f6fb3047e86f10a6dedd6358cb9df711/adatechnology-identity-reconciliation-0.1.0-rc.1.tgz","_integrity":"sha512-NHrTJmub5Fwk7kbS5+j3Yz6hNXgungnq5tQtV+ZBrH/PINnmq3u1pti8tDnMjn9lf4gXNQ9jjLRlB3KRICFgcw==","_npmVersion":"10.9.8","description":"Pure matching rules that reconcile a product user base against an identity provider realm","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/bun":"latest","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/identity-reconciliation_0.1.0-rc.1_1788183408624_0.719343603477753","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"_id":"@adatechnology/identity-reconciliation@0.1.0","dist":{"shasum":"8b105ec7c494a8e836b29197ab0e2e0eeaee4b17","tarball":"https://registry.npmjs.org/@adatechnology/identity-reconciliation/-/identity-reconciliation-0.1.0.tgz","fileCount":4,"integrity":"sha512-VBwF/Kngmvt596C4oz28BVdMmFGukja4vxeMwub9/Q7TnM2Z/4gIPjlREvsDXmj+5NRR11ovLL5VR7S/vpafQQ==","signatures":[{"sig":"MEYCIQCUW0dw0AHqeBwGgqOlecHWOeZaxd9dtEL+8tyhQq+k0wIhAIUiH0PELnjyIWYf9aFGEEYrTPg22bAesNrRZTXSxN6t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDYhXrcFOc6jG5qzhq7lC02eda53ZU2t7i00sWIwkchUAIhAKuUU1OvBhMJpuV8jRSVD7M497t2itkz2Sid3W0P/Gx1"}],"unpackedSize":15865},"main":"dist/index.js","name":"@adatechnology/identity-reconciliation","type":"module","_from":"file:adatechnology-identity-reconciliation-0.1.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"license":"MIT","scripts":{"test":"bun test","build":"tsup","check":"tsc --noEmit"},"version":"0.1.0","_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"keywords":["identity","reconciliation","keycloak","matching"],"_resolved":"/tmp/36ccdf0be54783377c202c2ad4384b36/adatechnology-identity-reconciliation-0.1.0.tgz","_integrity":"sha512-VBwF/Kngmvt596C4oz28BVdMmFGukja4vxeMwub9/Q7TnM2Z/4gIPjlREvsDXmj+5NRR11ovLL5VR7S/vpafQQ==","_npmVersion":"10.9.8","description":"Pure matching rules that reconcile a product user base against an identity provider realm","directories":{},"maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/bun":"latest","typescript":"^5.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/identity-reconciliation_0.1.0_1788318242778_0.944554200305058"}}},"time":{"created":"2026-08-30T14:21:28.744Z","modified":"2026-09-02T03:04:03.059Z","0.1.0-rc.0":"2026-08-30T14:21:29.062Z","0.1.0-rc.1":"2026-08-31T13:36:48.709Z","0.1.0":"2026-09-02T03:04:02.880Z"},"license":"MIT","keywords":["identity","reconciliation","keycloak","matching"],"description":"Pure matching rules that reconcile a product user base against an identity provider realm","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"readme":"# @adatechnology/identity-reconciliation\n\nRegras puras que casam a base de usuários de um produto com o realm de um provedor de identidade.\nSem rede, sem banco, sem dependência: quem chama lê os dois lados e entrega nesta forma.\n\n## O contrato de vínculo\n\nCada produto extrai o dele — coluna de perfil, contato de convite, atributo do realm — e entrega:\n\n```ts\ntype LocalIdentityRecord = {\n  id: string          // o identificador da pessoa no produto; volta no resultado\n  document: string    // índice único: a pessoa tem um só\n  emails: string[]    // conjunto: a mesma pessoa costuma ter mais de um\n  subject?: string    // o `sub` do provedor, quando o produto já o gravou\n}\n\ntype RealmIdentityRecord = { subject: string; document: string; emails: string[] }\n```\n\nO tipo é pobre de propósito. Canal, papel, situação e vocabulário de domínio ficam no produto:\no que entra aqui passa a valer para todos os que consomem o pacote.\n\n## Os três degraus, nesta ordem\n\n1. **`subject`** — identidade, não palpite: alguém o gravou quando as duas contas nasceram juntas.\n2. **documento** — índice único da pessoa. Vem **antes** do e-mail, e é o que decide quando as duas\n   metades discordam. Normalizado sem máscara e em caixa alta, então serve a CPF, CNPJ alfanumérico,\n   NIF ou VAT sem o pacote conhecer nenhum deles.\n3. **e-mail** — por **interseção de conjuntos**: basta um endereço em comum, em qualquer posição.\n   O resultado diz **qual** endereço casou, que é o que poupa a investigação depois.\n\nCasar por e-mail antes do documento faria a mesma pessoa aparecer duas vezes sempre que os dois\nlados guardassem endereços diferentes — e é o caso comum, não a exceção.\n\n## O que nunca casa\n\n- **Chave em branco com chave em branco.** Duas pessoas sem documento cadastrado não são a mesma\n  pessoa, e tratá-las como uma esconde uma das duas para sempre.\n- **Duas pessoas na mesma conta.** Conta do provedor já reivindicada não é roubada por um degrau\n  mais fraco: a segunda pessoa desce para o degrau seguinte, e sai como divergência se não casar.\n- **Chave repetida no provedor.** Anomalia dele, não escolha nossa: o primeiro vence e o segundo\n  aparece como divergência, em vez de sumir.\n\n## Resultado\n\nCada linha sai como `linked`, `missing-in-realm` (tem vínculo no produto e não consegue entrar) ou\n`missing-locally` (conta no provedor que ninguém no produto reivindica), com `matchedBy` dizendo\npor qual degrau ela casou — a confiança é diferente em cada um, e quem decide o que fazer com a\ndivergência precisa saber disso.\n\n## O que este pacote **não** faz\n\nEle não lê o provedor (use `@adatechnology/keycloak-admin`), não escreve nada, e **não faz login\nfuncionar com vários e-mails**: casar por um conjunto de endereços é reconciliação; autenticar por\nqualquer um deles é configuração do realm — o Keycloak tem um campo `email` só, e endereço\nalternativo exige atributo próprio mais um autenticador que o consulte.\n","readmeFilename":"README.md"}