[
  {
    "path": ".editorconfig",
    "content": "[*]\nindent_style = space\nindent_size = 4\ncharset = utf-8\nend_of_line = lf\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nquote_type = single\nmax_line_length = 120\n\n[**/**.yml]\nindent_style = space\nindent_size = 2\nmax_line_length = 300\ncharset = utf-8\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Tests\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n\n      - name: yarn install\n        run: yarn\n\n      - name: yarn test\n        run: yarn test\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\nbuild\ncoverage\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 Jose Vinicius\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/22475804/114474255-346b1a00-9bcc-11eb-877f-0095c6fd5dba.jpg\" height=\"200px\" />\n  <h1 align=\"center\">QR Code PIX - NodeJS and Browser</h1>\n</p>\n<br />\n\nQR Code generator for the Brazilian payment system PIX\n\n[![badge-tests](https://github.com/joseviniciusnunes/qrcode-pix/workflows/Tests/badge.svg)](https://github.com/joseviniciusnunes/qrcode-pix/actions)\n[![npm-version](https://img.shields.io/npm/v/qrcode-pix?color=brightgreen&label=npm%20package)](https://www.npmjs.com/package/qrcode-pix)\n\n---\n\n## Installation\n\n```bash\nyarn add qrcode-pix --exact\n```\n\nor\n\n```bash\nnpm i qrcode-pix --save-exact\n```\n\n---\n\n## Quick Start\n\n```js\nimport { QrCodePix } from 'qrcode-pix';\n\nconst qrCodePix = QrCodePix({\n    version: '01',\n    key: 'test@mail.com.br', //or any PIX key\n    name: 'Fulano de Tal',\n    city: 'SAO PAULO',\n    transactionId: 'YOUR_TRANSACTION_ID', //max 25 characters\n    message: 'Pay me :)',\n    cep: '99999999',\n    value: 150.99,\n});\n\nconsole.log(qrCodePix.payload()); // '00020101021126510014BR.GOV.BCB.PIX...'\nconsole.log(await qrCodePix.base64()); // 'data:image/png;base64,iVBORw0...'\n```\n\n---\n\n## Interface\n\n```js\ninterface IParameter {\n    version: string;\n    key: string;\n    city: string;\n    name: string;\n    value?: number;\n    transactionId?: string;\n    message?: string;\n    cep?: string;\n    currency?: number; //default: 986 ('R$')\n    countryCode?: string; //default: 'BR'\n}\n\ninterface IResponse {\n    payload: () => string; //payload for QrCode\n    base64: (options?) => Promise<string>; //QrCode image base64\n}\n```\n\n---\n\n## Specification\n\n### Latest revision version: 3.0.2 (2022-02-04)\n\n### Specification by Bacen [(DOC)](https://www.bcb.gov.br/content/estabilidadefinanceira/forumpireunioes/AnexoI-PadroesParaIniciacaodoPix.pdf)\n\n---\n\n## Donate\n\n### Contribute to keeping revisions up to date.\n\n<img src=\"https://user-images.githubusercontent.com/22475804/152584043-f4e28661-66e5-4fef-a0c0-25ddea08a41d.png\" height=\"100px\" />\n"
  },
  {
    "path": "__tests__/QrCode.test.ts",
    "content": "import { QrCodePix, QrCodePixParams } from '../src/index';\n\ndescribe('QRCode PIX Generate', () => {\n    it('Test validate version schema', async () => {\n        const param: QrCodePixParams = {\n            version: '02', //02 is not valid\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n        };\n        expect(() => QrCodePix(param)).toThrow('Version not supported');\n    });\n    it('Test QrCode', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n        });\n        await expect(response.base64()).resolves.toBe(qrCodeTest);\n    });\n    it('01 - Basic Payload', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n        });\n        expect(response.payload()).toBe(\n            '00020126380014BR.GOV.BCB.PIX0116test@mail.com.br5204000053039865802BR5913FULANO DE TAL6009SAO PAULO62070503***6304102F'\n        );\n    });\n    it('02 - Basic - Currency', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            currency: 986,\n        });\n        expect(response.payload()).toBe(\n            '00020126380014BR.GOV.BCB.PIX0116test@mail.com.br5204000053039865802BR5913FULANO DE TAL6009SAO PAULO62070503***6304102F'\n        );\n    });\n    it('03 - Basic - Value', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            value: 100.99,\n        });\n        expect(response.payload()).toBe(\n            '00020126380014BR.GOV.BCB.PIX0116test@mail.com.br5204000053039865406100.995802BR5913FULANO DE TAL6009SAO PAULO62070503***63049359'\n        );\n    });\n    it('04 - Basic - countryCode', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            countryCode: 'BR',\n        });\n        expect(response.payload()).toBe(\n            '00020126380014BR.GOV.BCB.PIX0116test@mail.com.br5204000053039865802BR5913FULANO DE TAL6009SAO PAULO62070503***6304102F'\n        );\n    });\n    it('05 - Basic - cep', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            cep: '85000100',\n        });\n        expect(response.payload()).toBe(\n            '00020126380014BR.GOV.BCB.PIX0116test@mail.com.br5204000053039865802BR5913FULANO DE TAL6009SAO PAULO61088500010062070503***63041747'\n        );\n    });\n    it('06 - Basic - Transaction ID', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            transactionId: 'my_transaction_id',\n        });\n        expect(response.payload()).toBe(\n            '00020126380014BR.GOV.BCB.PIX0116test@mail.com.br5204000053039865802BR5913FULANO DE TAL6009SAO PAULO62210517my_transaction_id630461CE'\n        );\n    });\n    it('07 - Basic - message', async () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            message: 'is my message :)',\n        });\n        expect(response.payload()).toBe(\n            '00020126580014BR.GOV.BCB.PIX0116test@mail.com.br0216is my message :)5204000053039865802BR5913FULANO DE TAL6009SAO PAULO62070503***63045A4E'\n        );\n    });\n    it('ignore value zero', () => {\n        const response = QrCodePix({\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            value: 0,\n        });\n        expect(response.payload()).toBe(\n            '00020126380014BR.GOV.BCB.PIX0116test@mail.com.br5204000053039865802BR5913FULANO DE TAL6009SAO PAULO62070503***6304102F'\n        );\n    });\n    it('should not accept negative values', () => {\n        const param: QrCodePixParams = {\n            version: '01',\n            key: 'test@mail.com.br',\n            name: 'Fulano de Tal',\n            city: 'SAO PAULO',\n            value: -10,\n        };\n        expect(() => QrCodePix(param)).toThrow('Value must be a positive number');\n    });\n});\n\nconst qrCodeTest =\n    'data:image/png;base64,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';\n"
  },
  {
    "path": "example/example.ts",
    "content": "import { QrCodePix } from '../src';\n\nconst qrCodePix = QrCodePix({\n    version: '01',\n    key: 'test@mail.com.br', //or any PIX key\n    name: 'Fulano de Tal',\n    city: 'SAO PAULO',\n    transactionId: 'YOUR_TRANSACTION_ID',\n    message: 'Pay me :)',\n    cep: '99999999',\n    value: 150.99,\n});\n\nconsole.log(qrCodePix.payload());\n\nqrCodePix.base64().then((res) => {\n    console.log(res);\n});\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n    preset: 'ts-jest',\n    testEnvironment: 'node',\n    forceExit: true,\n    testTimeout: 10000,\n    collectCoverageFrom: ['src/*.ts'],\n    collectCoverage: true,\n    coverageThreshold: {\n        global: {\n            branches: 100,\n            functions: 100,\n            lines: 100,\n            statements: 100,\n        },\n    },\n    testMatch: ['**/**.test.ts'],\n};\n"
  },
  {
    "path": "lib/index.d.ts",
    "content": "import qrcode from 'qrcode';\ninterface QrCodePixParams {\n    version: string;\n    key: string;\n    city: string;\n    name: string;\n    value?: number;\n    transactionId?: string;\n    message?: string;\n    cep?: string;\n    currency?: number;\n    countryCode?: string;\n}\ndeclare function QrCodePix({ version, key, city, name, value, message, cep, transactionId, currency, countryCode, }: QrCodePixParams): {\n    payload: () => string;\n    base64: (options?: qrcode.QRCodeToDataURLOptions | undefined) => Promise<string>;\n};\nexport { QrCodePixParams, QrCodePix };\n"
  },
  {
    "path": "lib/index.js",
    "content": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.QrCodePix = void 0;\nconst qrcode_1 = __importDefault(require(\"qrcode\"));\nconst crc_1 = require(\"crc\");\nconst yup_1 = require(\"yup\");\nfunction QrCodePix({ version, key, city, name, value, message, cep, transactionId = '***', currency = 986, countryCode = 'BR', }) {\n    yup_1.string().equals(['01'], 'Version not supported').validateSync(version);\n    yup_1.string()\n        .min(2, 'countryCode: 2 characters')\n        .max(2, 'countryCode: 2 characters')\n        .nullable()\n        .validateSync(countryCode);\n    yup_1.string().min(8, 'cep: 8 characters').max(8, 'cep: 8 characters').nullable().validateSync(cep);\n    if (String(value) === '0') {\n        value = undefined;\n    }\n    yup_1.number().nullable().positive('Value must be a positive number').validateSync(value);\n    yup_1.string().max(25, 'transactionId: max 25 characters').nullable().validateSync(transactionId);\n    const payloadKeyString = generateKey(key, message);\n    const payload = [\n        genEMV('00', version),\n        genEMV('26', payloadKeyString),\n        genEMV('52', '0000'),\n        genEMV('53', String(currency)),\n    ];\n    if (value) {\n        payload.push(genEMV('54', value.toFixed(2)));\n    }\n    name = String(name)\n        .substring(0, 25)\n        .toUpperCase()\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '');\n    city = String(city)\n        .substring(0, 15)\n        .toUpperCase()\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '');\n    payload.push(genEMV('58', countryCode.toUpperCase()));\n    payload.push(genEMV('59', name));\n    payload.push(genEMV('60', city));\n    if (cep) {\n        payload.push(genEMV('61', cep));\n    }\n    payload.push(genEMV('62', genEMV('05', transactionId)));\n    payload.push('6304');\n    const stringPayload = payload.join('');\n    const crcResult = crc_1.crc16ccitt(stringPayload).toString(16).toUpperCase().padStart(4, '0');\n    const payloadPIX = `${stringPayload}${crcResult}`;\n    return {\n        payload: () => payloadPIX,\n        base64: (options) => qrcode_1.default.toDataURL(payloadPIX, options),\n    };\n}\nexports.QrCodePix = QrCodePix;\nfunction generateKey(key, message) {\n    const payload = [genEMV('00', 'BR.GOV.BCB.PIX'), genEMV('01', key)];\n    if (message) {\n        payload.push(genEMV('02', message));\n    }\n    return payload.join('');\n}\nfunction genEMV(id, parameter) {\n    const len = parameter.length.toString().padStart(2, '0');\n    return `${id}${len}${parameter}`;\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"qrcode-pix\",\n    \"author\": \"José Vinicius <joseviniciuus@outlook.com>\",\n    \"version\": \"5.0.0\",\n    \"main\": \"lib/index.js\",\n    \"license\": \"MIT\",\n    \"repository\": \"joseviniciusnunes/qrcode-pix\",\n    \"keywords\": [\n        \"qrcode\",\n        \"pix\"\n    ],\n    \"dependencies\": {\n        \"crc\": \"^4.1.1\",\n        \"qrcode\": \"^1.5.0\",\n        \"yup\": \"^0.32.11\"\n    },\n    \"scripts\": {\n        \"example\": \"ts-node-dev ./example/example.ts\",\n        \"test\": \"jest --detectOpenHandles --ci\",\n        \"build\": \"tsc --build\"\n    },\n    \"devDependencies\": {\n        \"@babel/preset-typescript\": \"^7.12.1\",\n        \"@types/jest\": \"^26.0.15\",\n        \"@types/qrcode\": \"^1.3.5\",\n        \"@types/yup\": \"^0.29.9\",\n        \"jest\": \"^26.6.3\",\n        \"ts-jest\": \"^26.4.4\",\n        \"ts-node-dev\": \"^1.0.0\",\n        \"typescript\": \"^4.1.2\"\n    }\n}\n"
  },
  {
    "path": "src/index.ts",
    "content": "import qrcode, { QRCodeToDataURLOptions } from 'qrcode';\nimport { crc16ccitt } from 'crc';\nimport { string, number } from 'yup';\n\ninterface QrCodePixParams {\n    version: string;\n    key: string;\n    city: string;\n    name: string;\n    value?: number;\n    transactionId?: string;\n    message?: string;\n    cep?: string;\n    currency?: number;\n    countryCode?: string;\n}\n\nfunction QrCodePix({\n    version,\n    key,\n    city,\n    name,\n    value,\n    message,\n    cep,\n    transactionId = '***',\n    currency = 986,\n    countryCode = 'BR',\n}: QrCodePixParams) {\n    string().equals(['01'], 'Version not supported').validateSync(version);\n\n    string()\n        .min(2, 'countryCode: 2 characters')\n        .max(2, 'countryCode: 2 characters')\n        .nullable()\n        .validateSync(countryCode);\n\n    string().min(8, 'cep: 8 characters').max(8, 'cep: 8 characters').nullable().validateSync(cep);\n\n    if (String(value) === '0') {\n        value = undefined;\n    }\n\n    number().nullable().positive('Value must be a positive number').validateSync(value);\n\n    string().max(25, 'transactionId: max 25 characters').nullable().validateSync(transactionId);\n\n    const payloadKeyString = generateKey(key, message);\n\n    const payload: string[] = [\n        genEMV('00', version),\n        genEMV('26', payloadKeyString),\n        genEMV('52', '0000'),\n        genEMV('53', String(currency)),\n    ];\n\n    if (value) {\n        payload.push(genEMV('54', value.toFixed(2)));\n    }\n\n    name = String(name)\n        .substring(0, 25)\n        .toUpperCase()\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '');\n\n    city = String(city)\n        .substring(0, 15)\n        .toUpperCase()\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '');\n\n    payload.push(genEMV('58', countryCode.toUpperCase()));\n    payload.push(genEMV('59', name));\n    payload.push(genEMV('60', city));\n\n    if (cep) {\n        payload.push(genEMV('61', cep));\n    }\n\n    payload.push(genEMV('62', genEMV('05', transactionId)));\n\n    payload.push('6304');\n\n    const stringPayload = payload.join('');\n    const crcResult = crc16ccitt(stringPayload).toString(16).toUpperCase().padStart(4, '0');\n\n    const payloadPIX = `${stringPayload}${crcResult}`;\n\n    return {\n        payload: () => payloadPIX,\n        base64: (options?: QRCodeToDataURLOptions) => qrcode.toDataURL(payloadPIX, options),\n    };\n}\n\nfunction generateKey(key: string, message?: string): string {\n    const payload: string[] = [genEMV('00', 'BR.GOV.BCB.PIX'), genEMV('01', key)];\n    if (message) {\n        payload.push(genEMV('02', message));\n    }\n    return payload.join('');\n}\n\nfunction genEMV(id: string, parameter: string): string {\n    const len = parameter.length.toString().padStart(2, '0');\n    return `${id}${len}${parameter}`;\n}\n\nexport { QrCodePixParams, QrCodePix };\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"es6\",\n        \"module\": \"commonjs\",\n        \"strict\": true,\n        \"declaration\": true,\n        \"esModuleInterop\": true,\n        \"skipLibCheck\": true,\n        \"allowJs\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"outDir\": \"./lib\"\n    },\n    \"include\": [\"src\"],\n    \"exclude\": [\"__tests__/**\"],\n    \"declaration\": true\n}\n"
  }
]