{"_id":"@agility-luhn/iam","_rev":"8-b62ab61ddee640a086953662511fb469","name":"@agility-luhn/iam","dist-tags":{"latest":"1.5.1"},"versions":{"1.0.0":{"name":"@agility-luhn/iam","version":"1.0.0","keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","_id":"@agility-luhn/iam@1.0.0","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"dist":{"shasum":"20598395cc049a2cfad8006ecdcede49c401c073","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.0.0.tgz","fileCount":148,"integrity":"sha512-CQZePrR1LCv5NoiOH3NOTefu0Z4P7p1aMyGghCsPdYqHJB8Z+pAODvhYZ7E4mjMECUQ5vP+LCLWvq9vlw62Jzw==","signatures":[{"sig":"MEYCIQC9KH8bOTUCPRwvrozWlnvplvUZDQwPiw5Ol446s2sctQIhALRxLkgaSWY7OpOBGKzVbodBeRZOtGCpyRGQ/AfjOR6M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205468},"luhn":{"plugin":true,"luhnDirs":["luhn"],"application":"iam"},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"4778544b0f5d0d851f0ee78d0df98e89a7feaec4","scripts":{"lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","build":"pnpm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","prepack":"pnpm run test","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run"},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"repository":{"url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","type":"git","directory":"iam"},"_npmVersion":"11.17.0","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"argon2":"^0.41.1","jsonwebtoken":"^9.0.0","@agility-luhn/database":"2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","typescript":"^5.4.0","@types/node":"latest","@agility-luhn/cli":"2.4.4","@types/jsonwebtoken":"^9.0.5","@agility-luhn/runtime":"2.2.2","@agility-luhn/release-config":"2.4.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/iam_1.0.0_1787370637646_0.9273604516968126","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@agility-luhn/iam","version":"1.1.0","keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","_id":"@agility-luhn/iam@1.1.0","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"dist":{"shasum":"bc887a267fc874a97336bfd5380a7897b223eaab","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.1.0.tgz","fileCount":148,"integrity":"sha512-GfwWinmbOqS+roDue+G164M/fU08t8rl2Cfc+8PemCj+N63h2FHOPuYOKgfYC2SiW5A8m4yCbHYR/RRBLq7M2A==","signatures":[{"sig":"MEQCIEHD5GBtx4wq6H2zwvPtfwhtY7ZVSoPiLT8a2hhFfiBTAiA+wmBAN+zgPCKKO5+SJC0A7HgdDEk6wCTvrc5JBQ8WUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205582},"luhn":{"plugin":true,"luhnDirs":["luhn"],"application":"iam"},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"3afd561658711cfa80d184cab336ed56e39280e6","scripts":{"lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","build":"pnpm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","prepack":"pnpm run test","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run"},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"repository":{"url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","type":"git","directory":"iam"},"_npmVersion":"11.17.0","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"argon2":"^0.41.1","jsonwebtoken":"^9.0.0","@agility-luhn/database":"2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","typescript":"^5.4.0","@types/node":"latest","@agility-luhn/cli":"2.4.4","@types/jsonwebtoken":"^9.0.5","@agility-luhn/runtime":"2.2.2","@agility-luhn/release-config":"2.4.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/iam_1.1.0_1787372932108_0.8251620917967537","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@agility-luhn/iam","version":"1.1.1","keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","_id":"@agility-luhn/iam@1.1.1","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"dist":{"shasum":"58acac23f827c93a624be4aa34d98ae6ef2e5523","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.1.1.tgz","fileCount":148,"integrity":"sha512-UnMt/q+7wpDsu+MwgcRw8CAbf3+501cV9kzUDxNA6Exv2yQKWgFtv5GC9iLn5lAG6pQcI9XeW702ITSOt4hivQ==","signatures":[{"sig":"MEYCIQCB4mqQjk5paKgqwxJe2zn/SdzUd97QaBCMwUw4oZjN9gIhANryQw1Y5TOLqQDH8uLMJcqBOp7odVkyFTmZY4y/enmT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205696},"luhn":{"plugin":true,"luhnDirs":["luhn"],"application":"iam"},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"8009b5a3ae80ec7382e829b69a89eb953404ae4f","scripts":{"lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","build":"pnpm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","prepack":"pnpm run test","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run"},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"repository":{"url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","type":"git","directory":"iam"},"_npmVersion":"11.17.0","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"argon2":"^0.41.1","jsonwebtoken":"^9.0.0","@agility-luhn/database":"2.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","typescript":"^5.4.0","@types/node":"latest","@agility-luhn/cli":"2.5.0","@types/jsonwebtoken":"^9.0.5","@agility-luhn/runtime":"2.3.0","@agility-luhn/release-config":"2.4.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/iam_1.1.1_1787375016805_0.48630609097565825","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@agility-luhn/iam","version":"1.2.0","keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","_id":"@agility-luhn/iam@1.2.0","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"dist":{"shasum":"11370ea2ddeda7e1d5ea621ee79034c5a264a1b9","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.2.0.tgz","fileCount":160,"integrity":"sha512-xKDVEAJLd4p4cKDoao7sX3NngESxeNibsB5HxM/R2+KC0qw4a0r8/C2abo+PRq8R2f13qMk/pyUKU+xM8F5IpA==","signatures":[{"sig":"MEUCIG7ZWz1NzFadQQgmjZkBpFWdZV65o+V9ccN7f/0qXAQuAiEA0ha502EIw5Uk/GsZV4fR+iNaRbvGes6W8hqn7QMNvro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215362},"luhn":{"plugin":true,"luhnDirs":["luhn"],"application":"iam"},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"42f8ac8c14903b9bc8c69e0953104b8b1c51c647","scripts":{"lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","build":"pnpm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","prepack":"pnpm run test","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run"},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"repository":{"url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","type":"git","directory":"iam"},"_npmVersion":"11.17.0","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"argon2":"^0.41.1","jsonwebtoken":"^9.0.0","@agility-luhn/database":"2.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","typescript":"^5.4.0","@types/node":"latest","@agility-luhn/cli":"2.5.0","@types/jsonwebtoken":"^9.0.5","@agility-luhn/runtime":"2.3.0","@agility-luhn/release-config":"2.4.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/iam_1.2.0_1787596903228_0.6364155518540018","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@agility-luhn/iam","version":"1.3.0","keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","_id":"@agility-luhn/iam@1.3.0","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"dist":{"shasum":"9edb8131316b49be262a48a9c11b3a3af7cbbf76","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.3.0.tgz","fileCount":160,"integrity":"sha512-M5ed63YjBQo1dBhjKbc8LC0UIyo6Nht7R3AqY+PJ3DQ0JnF2YlAsMFcwQydjgMbZu30JpxRunFNb7q8m9vjnrA==","signatures":[{"sig":"MEUCIQDuNg7CfBQkl2tsGTpeV9aTQyzPhFHQPyYYesKQ3QwsxQIgOxfinutsxOLwP0bzcldzLJ+oYcgA3LIpEMmOxc5Z4Xo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216135},"luhn":{"plugin":true,"luhnDirs":["luhn"],"application":"iam"},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"7b4e0c82840c3a48e0b6acbf540b1b49b0fd565e","scripts":{"lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","build":"pnpm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","prepack":"pnpm run test","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run"},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"repository":{"url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","type":"git","directory":"iam"},"_npmVersion":"11.17.0","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"argon2":"^0.41.1","jsonwebtoken":"^9.0.0","@agility-luhn/database":"2.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","typescript":"^5.4.0","@types/node":"latest","@agility-luhn/cli":"2.5.0","@types/jsonwebtoken":"^9.0.5","@agility-luhn/runtime":"2.3.0","@agility-luhn/release-config":"2.4.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/iam_1.3.0_1787603154288_0.2892616098355183","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@agility-luhn/iam","version":"1.4.0","keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","_id":"@agility-luhn/iam@1.4.0","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"dist":{"shasum":"2242dab88cd185d85ebfabd90af88aed7c4a4900","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.4.0.tgz","fileCount":160,"integrity":"sha512-vFTKEnCnB4pswGtFfRfsg+Z3QNcieIC0JxzSqqCiRvAKF0BM2Na8T9zFE7NJ1akIvll+gv+JB+cTjt21tvbLcg==","signatures":[{"sig":"MEUCIQD8IY3Xs1cqrmtxxVGCXAhBVo26m7OyKFS2MnlYhkh2LgIgSe6V/ACeK4i+UhBFBjcLR1KpCVQL1bUZxBcAnLy+NBk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220021},"luhn":{"plugin":true,"luhnDirs":["luhn"],"application":"iam"},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"5555c1857c213429d815386aa3ce37cab46f7036","scripts":{"lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","build":"pnpm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","prepack":"pnpm run test","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run"},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"repository":{"url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","type":"git","directory":"iam"},"_npmVersion":"11.17.0","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"argon2":"^0.41.1","jsonwebtoken":"^9.0.0","@agility-luhn/database":"2.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","typescript":"^5.4.0","@types/node":"latest","@agility-luhn/cli":"2.5.0","@types/jsonwebtoken":"^9.0.5","@agility-luhn/runtime":"2.3.0","@agility-luhn/release-config":"2.4.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/iam_1.4.0_1787608208290_0.10438052783018104","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@agility-luhn/iam","version":"1.4.1","keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","_id":"@agility-luhn/iam@1.4.1","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"dist":{"shasum":"1798cf00da2bfb6b98763dac7a866bc57d451ee1","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.4.1.tgz","fileCount":160,"integrity":"sha512-y69MdybTFDxWAktyQbWsLD/Q4GTp+UCIv1XSxnyC5UcrfPTLdEV+/nJcw505H9AX7LHlfWZq+cavStRTlzpsDQ==","signatures":[{"sig":"MEUCIQC8Trvt2gKFXHPl9F68EP/Cv08qZgAfL3z47QL9mmzyOwIgMmX+i387gwbFJ90zZnPo2vKBeuEYzkqY+wS/FuhsLks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221046},"luhn":{"plugin":true,"luhnDirs":["luhn"],"application":"iam"},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"134099c84dff9f51de7b08c9f36c8110b4d1846f","scripts":{"lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","build":"pnpm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","prepack":"pnpm run test","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run"},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"repository":{"url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","type":"git","directory":"iam"},"_npmVersion":"11.17.0","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"argon2":"^0.41.1","jsonwebtoken":"^9.0.0","@agility-luhn/database":"2.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","typescript":"^5.4.0","@types/node":"latest","@agility-luhn/cli":"2.5.0","@types/jsonwebtoken":"^9.0.5","@agility-luhn/runtime":"2.3.0","@agility-luhn/release-config":"2.4.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/iam_1.4.1_1787614539506_0.7624396802508249","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@agility-luhn/iam","version":"1.5.1","description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","type":"commonjs","main":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","directory":"iam"},"bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","scripts":{"clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","build":"pnpm run clean && tsc -p tsconfig.json","compile":"node -e \"require('fs').rmSync('./src/luhn', { recursive: true, force: true })\" && node ../cli/bin/luhn.js compile ./luhn -o ./src/luhn && node scripts/fix-generated-imports.mjs","lint":"eslint src --ext .ts","test":"pnpm run compile && pnpm run build","prepack":"pnpm run test","release:dry-run":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs --dry-run","release":"node ./node_modules/@agility-luhn/release-config/bin/semantic-release.cjs --config ./release.config.cjs"},"keywords":["iam","auth","luhn","security","mfa","oauth2"],"author":{"name":"Agility Soluções"},"license":"MIT","luhn":{"plugin":true,"application":"iam","luhnDirs":["luhn"]},"dependencies":{"@agility-luhn/database":"2.4.0","argon2":"^0.41.1","jsonwebtoken":"^9.0.0"},"peerDependencies":{"@agility-luhn/runtime":">=2.3.0"},"devDependencies":{"@agility-luhn/cli":"2.5.0","@agility-luhn/release-config":"2.4.0","@agility-luhn/runtime":"2.3.0","@types/jsonwebtoken":"^9.0.5","@types/node":"latest","typescript":"^5.4.0","eslint":"^8.56.0","jest":"^29.7.0"},"engines":{"node":">=22"},"packageManager":"pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd","gitHead":"b017468b6268ec64bad8c04260d73d28fa39973d","_id":"@agility-luhn/iam@1.5.1","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-wWzxlF+lbxvlHYdyOnicXJnfzUlmJYU5p7to8/mm/32kfaEpkQF45w874Pk76wuLQkL/blLhzwYTL1ruckw0bw==","shasum":"ec133d7e7b720d8c6a2af29b27f62f313e058e9e","tarball":"https://registry.npmjs.org/@agility-luhn/iam/-/iam-1.5.1.tgz","fileCount":160,"unpackedSize":221766,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAtI9K6xzW62Yx7xax97gSEIEdM0wTkqiyiqebKhcMioAiAqVFJi84AJP7AiV1Kd0OljuNbfGGnXGGVpgaSpD+Z3oQ=="}]},"_npmUser":{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"},"directories":{},"maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/iam_1.5.1_1788385387459_0.9760423511651442"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-22T03:50:37.502Z","modified":"2026-09-02T21:43:07.774Z","1.0.0":"2026-08-22T03:50:37.787Z","1.1.0":"2026-08-22T04:28:52.246Z","1.1.1":"2026-08-22T05:03:37.077Z","1.2.0":"2026-08-24T18:41:43.387Z","1.3.0":"2026-08-24T20:25:54.438Z","1.4.0":"2026-08-24T21:50:08.462Z","1.4.1":"2026-08-24T23:35:39.678Z","1.5.1":"2026-09-02T21:43:07.599Z"},"bugs":{"url":"https://github.com/flaviorafaelo-agility/luhn-workspace/issues"},"author":{"name":"Agility Soluções"},"license":"MIT","homepage":"https://github.com/flaviorafaelo-agility/luhn-workspace/tree/main/iam#readme","keywords":["iam","auth","luhn","security","mfa","oauth2"],"repository":{"type":"git","url":"git+https://github.com/flaviorafaelo-agility/luhn-workspace.git","directory":"iam"},"description":"IAM (Identity and Access Management) para Luhn: autenticação, autorização, MFA, controle de rotas e papéis.","maintainers":[{"name":"agilityti","email":"flavio.oliveira@agilityti.com.br"}],"readme":"# @agility-luhn/iam\n\nIAM (Identity and Access Management) para aplicações LUHN. Distribuído como **plugin do runtime**: ao registrar\no plugin em `createLuhnServer({ plugins: [createIamPlugin(...)] })`, o app hospedeiro ganha as entidades de\nidentidade, services de autenticação/senha/menu, e o enforcement automático de `Authorization: Bearer <jwt>`\nem todas as rotas (exceto allowlist pública).\n\nPacote público do monorepo LUHN, publicado como `@agility-luhn/iam` no npm.\n\n---\n\n## 1. O que o pacote entrega\n\n| Camada                    | Conteúdo |\n|---------------------------|----------|\n| Modelagem `.luhn`         | [luhn/iam.luhn](luhn/iam.luhn) — application; declarações organizadas nas pastas de cada módulo |\n| Artefatos gerados         | [src/luhn/](src/luhn) — interfaces/Zod/services/controllers/handles + DDL Postgres + OpenAPI |\n| Plugin para o runtime     | [src/plugin.ts](src/plugin.ts) — `createIamPlugin(options)` |\n| Hashing de senha          | [src/passwords.ts](src/passwords.ts) — argon2id com parâmetros OWASP 2024 |\n| Assinatura JWT            | [src/jwt.ts](src/jwt.ts) — `IamJwtSigner` (HS256 default, RS256 opcional) |\n| Tokens opacos             | [src/tokens.ts](src/tokens.ts) — geração, hash SHA-256 e verificação em tempo constante |\n| Implementação dos services | [src/services/](src/services) — `auth`, `password`, `menu` (handlers reais) |\n| Compilador embarcado      | [src/compile-iam.ts](src/compile-iam.ts) — regera os artefatos sob `src/luhn` |\n| Entrypoint público        | [src/index.ts](src/index.ts) |\n\n---\n\n## 2. Modelo de domínio (`luhn/`)\n\nA aplicação `iam` declara quatro módulos. Cada módulo mantém suas declarações na pasta de mesmo nome:\n\n```\napplication iam (v0.1.0)\n├── module identity (owner true) — records e businesses de identidade\n├── module auth             — login, refresh, logout e me\n├── module password         — define, change, requestRecovery e completeRecovery\n└── module access           — myRoutes\n```\n\nO arquivo `luhn/iam.luhn` contém somente a declaração da application. As demais declarações ficam em\n`luhn/<module>/`, fazendo do diretório a fonte de verdade para o módulo de cada símbolo.\n\n### 2.1 Tabelas Postgres geradas\n\nSchemas: `iam`. Tabelas:\n\n- `iam.user`, `iam.user_roles`, `iam.user_units`.\n- `iam.role`, `iam.role_permissions`.\n- `iam.app`.\n- `iam.app_module`, `iam.app_module_routes`.\n\nCada registro de `iam.app_module` pertence obrigatoriamente a uma aplicação por meio de `app_id`.\n\nTipos físicos relevantes:\n\n- Enums (`user_status`, `mfa_type`, `http_method`, etc.) são **enum nativo Postgres** — armazenam o\n  nome (`'ACTIVE'`, `'GET'`, `'POST'`, ...), não o ordinal.\n- `passwordHash` e `totpSecret` mapeiam para `TEXT` (encriptografia em repouso é responsabilidade do banco).\n- `registrationToken` e `recoveryToken` armazenam **apenas hash SHA-256** (veja [src/tokens.ts](src/tokens.ts)).\n\n> **O IAM não tem multitenancy próprio.** Todas as suas businesses usam `@scope global`. O app hospedeiro decide se acopla as entidades de IAM ao seu\n> conceito de `conta`/`unidade` (via mixin, FK extra, ou políticas RLS).\n\n---\n\n## 3. Plugin do Runtime\n\n```ts\nimport { createLuhnServer } from '@agility-luhn/runtime';\nimport { createIamPlugin, IamJwtSigner, PasswordHasher } from '@agility-luhn/iam';\n\nconst iamPlugin = createIamPlugin({\n  jwt: new IamJwtSigner({\n    signingKey: process.env.JWT_SECRET!,        // HS256: segredo simétrico\n    issuer: 'meu-app',\n    audience: 'meu-app-api',\n    accessTtlSeconds: 15 * 60,                   // default 15 min\n    refreshTtlSeconds: 14 * 24 * 60 * 60         // default 14 dias\n  }),\n  hasher: new PasswordHasher(),                  // argon2id (64 MiB / 3 it / 4 lanes)\n  mailer: async ({ to, subject, body }) => { /* opcional */ }\n});\n\nconst server = await createLuhnServer({\n  luhnDir: './luhn',\n  setup,\n  plugins: [iamPlugin]\n});\n\nawait server.listen(3300);\n```\n\n### 3.1 Contrato do plugin\n\n`createIamPlugin(options): LuhnPlugin` devolve:\n\n- **`name`**: `'@agility-luhn/iam'`.\n- **`luhnDirs: [<pasta luhn do pacote>]`** — adiciona as entidades/services do IAM à compilação do app.\n- **`install(ctx)`** — registra os handlers TS dos services (`auth.login`, `auth.refresh`, `auth.logout`,\n  `auth.me`, `password.define`, `password.change`, `password.requestRecovery`, `password.completeRecovery`,\n  `access.myRoutes`) injetando dependências (`db`, `jwt`, `hasher`, `mailer?`).\n- **`authenticate(req)`** — lê `Authorization: Bearer <jwt>`, valida com `jwt.verify`, exige\n  `token_type='access'`, e devolve `SecurityContext { userId, tenantId, roles, permissions }`.\n- **`authorize(req)`** — política default:\n  - libera apenas a **allowlist pública** abaixo;\n  - exige `req.user !== undefined` em **qualquer** outra rota (incluindo CRUD `/api/<mod>/<entidade>`).\n- **`dispose()`** — no-op atual; previsto para fechar caches/Redis em versões futuras.\n\n### 3.2 Allowlist pública (sem token)\n\n| Método | Path                                | Por quê |\n|--------|-------------------------------------|---------|\n| POST   | `/api/auth/login`                   | bootstrap do token |\n| POST   | `/api/auth/refresh`                 | renovação de access via refresh token |\n| POST   | `/api/password/define`              | primeiro acesso (token de cadastro por e-mail) |\n| POST   | `/api/password/request-recovery`    | usuário esqueceu a senha |\n| POST   | `/api/password/complete-recovery`   | consome token de recuperação |\n\nQualquer outra rota (`/api/auth/me`, `/api/auth/logout`, `/api/password/change`, `/api/access/my-routes`, CRUDs\ndo app inteiro) responde **401 UNAUTHORIZED** sem token e **403 FORBIDDEN** quando há token mas autorização nega.\n\n---\n\n## 4. Services Expostos\n\n### 4.1 `auth.login` — `POST /api/auth/login`\n\n```jsonc\n// request\n{ \"login\": \"admin\", \"password\": \"...\", \"unitId\": \"...\", \"mfaCode\": \"123456\" }\n// response\n{\n  \"accessToken\": \"...\",   \"refreshToken\": \"...\",\n  \"expiresIn\": 900,       \"tokenType\": \"Bearer\",\n  \"user\": { /* identity.user */ },\n  \"unitId\": \"...\",        \"mfaRequired\": false\n}\n```\n\nErros: `INVALID_CREDENTIALS`, `USER_INACTIVE`, `USER_PENDING`, `PASSWORD_EXPIRED`, `MFA_REQUIRED`,\n`MFA_INVALID`, `INVALID_UNIT`.\n\nInternamente: busca o business `identity.user`, compara hash com `hasher.verify`, atualiza `last_login_at`,\nemite par `access_token` + `refresh_token` via `IamJwtSigner`.\n\n### 4.2 `auth.refresh` — `POST /api/auth/refresh`\n\nConsome refresh token, valida `token_type='refresh'`, devolve novo `access_token` (rotacionando refresh quando\nconfigurado).\n\n### 4.3 `auth.logout` — `POST /api/auth/logout`\n\nInvalida o refresh token (idealmente via blacklist por `jti`).\n\n### 4.4 `auth.me` — `POST /api/auth/me`\n\nRetorna o usuário corrente derivado de `req.user.userId` (resolvido pelo `authenticate`).\n\n### 4.5 `password.define` — `POST /api/password/define`\n\nConsome `registrationToken` (hash conferido com `verifyToken`), grava `passwordHash` (argon2id), marca usuário\ncomo `ACTIVE` + `emailVerified`. Erros: `INVALID_TOKEN`, `EXPIRED_TOKEN`, `WEAK_PASSWORD`.\n\n### 4.6 `password.change` — `POST /api/password/change`\n\nExige autenticação. Valida senha atual, aplica nova com hasher, limpa `passwordExpired`.\n\n### 4.7 `password.requestRecovery` — `POST /api/password/request-recovery`\n\nGera `recoveryToken` opaco (32 bytes, base64url), persiste **só o hash** com expiração, dispara e-mail via\n`mailer` (quando configurado).\n\n### 4.8 `password.completeRecovery` — `POST /api/password/complete-recovery`\n\nConsome `recoveryToken`, redefine senha, limpa token.\n\n### 4.9 `access.myRoutes` — `POST /api/access/my-routes`\n\nCruza `identity.appModule` (+ `routes`) com os papéis do usuário corrente para devolver a árvore\nde menu autorizada. Base para a UI montar a navegação após login.\n\n---\n\n## 5. Helpers Framework\n\n### 5.1 `PasswordHasher` ([src/passwords.ts](src/passwords.ts))\n\n```ts\nconst hasher = new PasswordHasher({ memoryCost: 65536, timeCost: 3, parallelism: 4 });\nconst hash = await hasher.hash(plain);\nconst ok   = await hasher.verify(hash, plain);\nconst stale = hasher.needsRehash(hash); // true quando parâmetros mudaram\n```\n\nPadrões alinhados ao OWASP 2024+: **argon2id**, 64 MiB de memória, 3 iterações, 4 lanes. Construtor aceita\noverride para CI/testes.\n\n### 5.2 `IamJwtSigner` ([src/jwt.ts](src/jwt.ts))\n\n```ts\nconst signer = new IamJwtSigner({\n  algorithm: 'HS256',                  // default; suporta 'RS256' com par de chaves\n  signingKey: process.env.JWT_SECRET!,\n  verificationKey: undefined,          // RS256: chave pública PEM\n  issuer: 'meu-app',\n  audience: 'meu-app-api',\n  accessTtlSeconds: 900,\n  refreshTtlSeconds: 1209600\n});\n\nconst access  = signer.signAccessToken({ sub, conta_id, login, roles, mfa: true });\nconst refresh = signer.signRefreshToken({ sub, conta_id, jti });\nconst claims  = signer.verify(token, 'access');\n```\n\nClaims: `sub`, `conta_id`, `unidade_id?`, `login`, `roles[]`, `mfa?`, `token_type: 'access' | 'refresh'`.\n\n### 5.3 Tokens opacos ([src/tokens.ts](src/tokens.ts))\n\n```ts\nconst { raw, hash } = generateOpaqueToken(32);   // entrega `raw` por e-mail; grava `hash` no banco\nconst ok    = verifyToken(rawRecebido, hashArmazenado); // comparação timing-safe\nconst valid = tokenIsValid(expiraEmIso);\n```\n\n**Tokens em claro nunca são persistidos.** O banco recebe apenas o SHA-256 hex; a verificação usa\n`crypto.timingSafeEqual`.\n\n---\n\n## 6. Compilação e Regeneração\n\nSempre que `luhn/iam.luhn` mudar, regere os artefatos:\n\n```bash\npnpm --filter @agility-luhn/iam compile    # luhn compile -o ./src/luhn\npnpm --filter @agility-luhn/iam build      # tsc -p tsconfig.json\n```\n\nO `compile-iam.ts`:\n\n- usa `iamSetup` ([src/compile-iam.ts](src/compile-iam.ts)) — driver `postgres`, runtime importPath\n  `@agility-luhn/runtime/src/services`.\n- escreve em `src/luhn/` (artefatos TS + DDL `database.json` + `openapi.json` + `objects-map.json`).\n- imprime contagem de artefatos, erros e avisos.\n\n`tsconfig.json` exclui `compile-iam.ts` do build do pacote (é script, não código de runtime).\n\n---\n\n## 7. Bootstrap: usuário admin\n\nO playground inclui [`seed-admin.js`](seed-admin.js) (template) para gerar o hash argon2id do primeiro\nusuário e inseri-lo em `iam.user` com `status='ACTIVE'`. Em produção, prefira usar o fluxo\n`registrationToken` → `password.define`.\n\n---\n\n## 8. Integração com Banco (migração de rotas)\n\nO catálogo `identity.appModule` (+ `routes`) é a base do `access.myRoutes`. O app hospedeiro deve\npopular esse catálogo a partir das rotas compiladas da aplicação.\n\n---\n\n## 9. Limitações Atuais\n\n- **MFA**: campos modelados (`mfaEnabled`, `mfaType`, `mfaSecret`), mas o fluxo TOTP/SMS/email ainda é\n  placeholder em `auth.login`.\n- **Refresh blacklist**: depende da app hospedeira definir storage (Redis/coluna `refresh_tokens`).\n- **Audit log**: ainda não emitido pelo plugin.\n- **Policy beyond roles**: `authorize` atual é all-or-nothing por presença de usuário; políticas finas\n  (route_actions, scopes) ficam a cargo do app ou de evoluções da `authorize` chain.\n- **Multi-tenant**: nenhum filtro automático por `conta_id` em queries CRUD — o `SecurityContext` é exposto,\n  mas a propagação para `handleCrudRoute` está no roadmap.\n\n---\n\n## 10. Convenções\n\n- Comunicação no projeto: **pt-BR**. Comentários do código: **EN**.\n- `exactOptionalPropertyTypes: true` em todo o monorepo → opcionais saem com `| undefined` explícito.\n- Cross-package imports usam o nome do pacote (`@agility-luhn/runtime`), nunca caminhos relativos\n  para outras `packages/`.\n- Após alterar generators do compiler, regere IAM **e** playground para validar.\n","readmeFilename":"README.md"}