[
  {
    "path": ".editorconfig",
    "content": "# EditorConfig is awesome: http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nindent_style = space\nindent_size = 2\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"extends\": \"@bubkoo/eslint-config\"\n}\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: 'bug'\nassignees: ''\n---\n\n<!--- Provide a general summary of the issue in the Title above. -->\n\n### Expected Behavior\n\n<!--- What should happen. -->\n\n### Current Behavior\n\n<!--- What happens instead. -->\n\n### Possible Solution\n\n<!--- Suggest a fix/reason for the bug. -->\n<!--- Any solutions you've considered. -->\n\n### Steps To Reproduce\n\n<!--- Provide a link to a live example, or an unambiguous -->\n<!--- set of steps to reproduce this bug. Include code to -->\n<!--- reproduce if relevant. -->\n\n1. ...\n2. ...\n3. ...\n\n<details><summary>Error Message & Stack Trace</summary><p>\n\n```txt\n<!-- Provide a log message if relevant -->\n```\n\n</p></details>\n\n### Additional Context\n\n<!--- How has this issue affected you? -->\n<!--- What are you trying to accomplish? -->\n<!--- Provide screenshots if possible. -->\n\n<!--- Providing context helps us come up with a -->\n<!--- solution that is most useful in the real world. -->\n\n### Your Environment\n\n<!--- Include as many relevant details about the -->\n<!--- environment you experienced the bug in. -->\n\n- html-to-image: [e.g. 0.1.0]\n- OS: [e.g. macOS Sierra 10.12.3]\n- Browser: [e.g. chrome 78.0.3904.108]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: 'enhancement'\nassignees: ''\n---\n\n<!--- Provide a general summary of the feature in the Title above. -->\n\n### Expected Behavior\n\n<!--- What should happen. -->\n\n### Possible Solution\n\n<!--- Any solutions you've considered. -->\n\n### Additional Context\n\n<!--- How has this issue affected you? -->\n<!--- What are you trying to accomplish? -->\n<!--- Provide screenshots if possible. -->\n\n<!--- Providing context helps us come up with a -->\n<!--- solution that is most useful in the real world. -->\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--- Provide a general summary of your changes in the Title above -->\n\n### Description\n\n<!--- Describe your changes in detail -->\n\n### Motivation and Context\n\n<!--- Why is this change required? What problem does it solve? -->\n<!--- If it fixes an open issue, please link to the issue here. -->\n<!--- GIF or snapshot should be provided if includes UI/interactive modification. -->\n<!--- How to fix the problem, and list final API implementation and usage sample if that is an new feature. -->\n\n### Types of changes\n\n<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->\n\n- [ ] Bug fix (non-breaking change which fixes an issue)\n- [ ] New feature (non-breaking change which adds functionality)\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\n- [ ] Enhancement (changes that improvement of current feature or performance)\n- [ ] Refactoring (changes that neither fixes a bug nor adds a feature)\n- [ ] Test Case (changes that add missing tests or correct existing tests)\n- [ ] Code style optimization (changes that do not affect the meaning of the code)\n- [ ] Docs (changes that only update documentation)\n- [ ] Chore (changes that don't modify src or test files)\n\n### Self Check before Merge\n\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\n\n- [ ] My code follows the code style of this project.\n- [ ] My change requires a change to the documentation.\n- [ ] I have updated the documentation accordingly.\n- [ ] I have read the [**CONTRIBUTING**](https://github.com/bubkoo/html-to-image/blob/master/CONTRIBUTING.md) document.\n- [ ] I have added tests to cover my changes.\n- [ ] All new and existing tests passed.\n"
  },
  {
    "path": ".github/workflows/backup/stale.yml",
    "content": "name: 👻　Stale\non:\n  schedule:\n  - cron: \"0 0 * * *\"\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: actions/stale@v3\n        with:\n          repo-token: ${{ env.bot_token }}\n          stale-issue-message: >\n            Hiya!\n\n            This issue has gone quiet. Spooky quiet. 👻\n\n            We get a lot of issues, so we currently close issues after 60 days of inactivity. It’s been at least 20 days since the last update here.\n            If we missed this issue or if you want to keep it open, please reply here. You can also add the label \"not-stale\" to keep this issue open!\n            As a friendly reminder: the best way to see this issue, or any other, fixed is to open a Pull Request.\n\n\n            Thanks for being a part of the Antv community! 💪💯\n\n          close-issue-message: >\n            Hey again!\n\n            It’s been 60 days since anything happened on this issue, so our friendly neighborhood robot (that’s me!) is going to close it.\n            Please keep in mind that I’m only a robot, so if I’ve closed this issue in error, I’m `HUMAN_EMOTION_SORRY`. Please feel free to comment on this issue or create a new one if you need anything else.\n            As a friendly reminder: the best way to see this issue, or any other, fixed is to open a Pull Request.\n\n            Thanks again for being part of the Antv community! 💪💯\n\n          stale-pr-message: >\n            Hiya!\n\n            This PR has gone quiet. Spooky quiet. 👻\n\n            We get a lot of PRs, so we currently close PRs after 60 days of inactivity. It’s been at least 20 days since the last update here.\n            If we missed this PR or if you want to keep it open, please reply here. You can also add the label \"not-stale\" to keep this PR open!\n\n            Thanks for being a part of the Antv community! 💪💯\n\n          close-pr-message: >\n            Hey again!\n\n            It’s been 60 days since anything happened on this PR, so our friendly neighborhood robot (that’s me!) is going to close it.\n            Please keep in mind that I’m only a robot, so if I’ve closed this PR in error, I’m `HUMAN_EMOTION_SORRY`. Please feel free to comment on this PR or create a new one if you need anything else.\n\n            Thanks again for being part of the Antv community! 💪💯\n\n          days-before-stale: 20\n          days-before-close: 40\n          stale-issue-label: 'stale'\n          exempt-issue-label: 'not-stale,awaiting-approval,work-in-progress'\n          stale-pr-label: 'stale'\n          exempt-pr-label: 'not-stale,awaiting-approval,work-in-progress'\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: 👷　CI\non:\n  pull_request: \n  pull_request_target:\n  push:\n    branches:\n      - master\n      - next\n      - next-major\n      - alpha\n      - beta\njobs:\n  ci:\n    runs-on: ubuntu-latest\n    steps:\n      - name: ⤵️　Checkout\n        uses: actions/checkout@v3\n\n      - name: 🎉　Setup nodejs\n        uses: actions/setup-node@v3\n        with:\n          node-version: 16.x\n\n      - name: 🎉　Setup pnpm\n        uses: pnpm/action-setup@v2\n        with:\n          version: 7\n          run_install: false\n\n      - name: 🌱　Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: |\n          echo \"STORE_PATH=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n      - name: 🚸　Setup pnpm cache\n        uses: actions/cache@v3\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: 🚧　Install dependencies\n        run: pnpm install --no-frozen-lockfile --ignore-scripts\n\n      - name: 📦　Build\n        run: pnpm run build\n\n      - name: ✅　Test\n        run: pnpm run test\n\n      - name: 🔑　Generate Token\n        uses: wow-actions/use-app-token@v2\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n\n      - name: 💡　Coveralls\n        uses: coverallsapp/github-action@master\n        with:\n          github-token: ${{ env.BOT_TOKEN }}\n          path-to-lcov: ./test/coverage/lcov.info\n\n      - name: 💡　Codecov\n        uses: codecov/codecov-action@v1\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n          files: ./test/coverage/lcov.info\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: ⛵️　CodeQL\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n  schedule:\n    - cron: \"21 15 * * 5\"\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ javascript ]\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v2\n        with:\n          languages: ${{ matrix.language }}\n          queries: +security-and-quality\n\n      - name: Autobuild\n        uses: github/codeql-action/autobuild@v2\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v2\n        with:\n          category: \"/language:${{ matrix.language }}\"\n"
  },
  {
    "path": ".github/workflows/config/label-commands.yml",
    "content": "heated:\n  lock: true\n  lockReason: too heated\n  comment: The thread has been temporarily locked.\n\n-heated:\n  unlock: true\n\nissues:\n  feature:\n    close: true\n    comment: >\n      :wave: @{{ author }}, please use our idea board to request new features.\n  -wontfix:\n    open: true\n\n  needs-more-info:\n    close: true\n    comment: >\n      @{{ author }}\n\n\n      In order to communicate effectively, we have a certain format requirement for the issue, your issue is automatically closed because there is no recurring step or reproducible warehouse, and will be REOPEN after the offer.\n\n  -needs-more-info:\n    open: true\n"
  },
  {
    "path": ".github/workflows/config/needs-more-info.yml",
    "content": "# common config\n# -------------\n\n# chenck issue and PR template\ncheckTemplate: true\n# minimum title length required\nminiTitleLength: 8\n# add label to trigger a label command, see ./label-commands.yml\nlabelToAdd: needs-more-info\n# reactions to add\nreactions:\n  - '-1'\n  - confused\n\n\n# config for issues\n# -----------------\nissue:\n  badTitles:\n    - update\n    - updates\n    - test\n    - issue\n    - debug\n    - demo\n  badTitleComment: ''\n  badBodyComment: ''\n\n\n# config for PRs\n# --------------\npullRequest:\n  badTitles:\n    - update\n    - updates\n    - test\n  badTitleComment: >\n    @{{ author }} Please provide us with more info about this pull request title.\n\n  badBodyComment: >\n    @{{ author }} Please provide us with more info about this pull request.\n"
  },
  {
    "path": ".github/workflows/config/pr-label-branch-name.yml",
    "content": "# https://github.com/marketplace/actions/PR-labeler\n\nPR(fix): ['fix/*', 'bug/*']\nPR(chore): chore/*\nPR(test): ['testing/*', 'test/*']\nPR(feature): ['feature/*', 'feat/*']\nPR(breaking): ['breaking/*', 'break/*']\nPR(internal): ['internal/*', 'inter/*']\nPR(documentation): ['documentation/*', 'document/*', 'doc/*']\nPR(enhancement): ['enhancement/*', 'enhance/*']\nPR(dependency): ['dependency/*', 'dep/*']\nPR(refactor): ['refactoring/*', 'refactor/*']\n"
  },
  {
    "path": ".github/workflows/label-commands.yml",
    "content": "name: 👾　Label Commands\non:\n  pull_request_target:\n    types: [labeled, unlabeled]\n  issues:\n    types: [labeled, unlabeled]\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: bubkoo/label-commands@v1\n        with:\n          GITHUB_TOKEN: ${{ env.bot_token }}\n          CONFIG_FILE: .github/workflows/config/label-commands.yml\n"
  },
  {
    "path": ".github/workflows/lock.yml",
    "content": "name: ⛔️　Lock Threads\non:\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: dessant/lock-threads@v2\n        with:\n          github-token: ${{ env.bot_token }}\n          issue-lock-inactive-days: 365\n          issue-lock-comment: >\n            This thread has been automatically locked because it has not had recent\n            activity. Please open a new issue for related bugs and link to relevant\n            comments in this thread.\n          process-only: issues\n"
  },
  {
    "path": ".github/workflows/needs-more-info.yml",
    "content": "name: 🚨　Needs More Info\non:\n  pull_request_target:\n    types: [opened]\n  issues:\n    types: [opened]\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: bubkoo/needs-more-info@v1\n        with:\n          GITHUB_TOKEN: ${{ env.bot_token }}\n          CONFIG_FILE: .github/workflows/config/needs-more-info.yml\n\n"
  },
  {
    "path": ".github/workflows/potential-duplicates.yml",
    "content": "name: 🆖　Potential Duplicates\non:\n  issues:\n    types: [opened, edited]\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: bubkoo/potential-duplicates@v1\n        with:\n          GITHUB_TOKEN: ${{ env.bot_token }}\n"
  },
  {
    "path": ".github/workflows/pr-label-branch-name.yml",
    "content": "name: 🏷️　Label(Branch Name)\non:\n  pull_request_target:\n    types: [opened]\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: TimonVS/pr-labeler-action@v3\n        with:\n          configuration-path: .github/workflows/config/pr-label-branch-name.yml\n        env:\n          GITHUB_TOKEN: ${{ env.bot_token }}\n"
  },
  {
    "path": ".github/workflows/pr-label-patch-size.yml",
    "content": "name: 🏷️　Label(Patch Size)\non: pull_request_target\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: pascalgn/size-label-action@v0.1.1\n        env:\n          GITHUB_TOKEN: \"${{ env.bot_token }}\"\n          IGNORED: \"!.gitignore\\npnpm-lock.yaml\"\n"
  },
  {
    "path": ".github/workflows/pr-label-status.yml",
    "content": "name: 🏷️　Label(Status)\non:\n  pull_request_target:\n    types: [opened, closed, edited, reopened, synchronize, ready_for_review]\n  pull_request_review:\n    types: [submitted, dismissed]\njobs:\n  triage:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          env_name: bot_token\n      - uses: bubkoo/pr-triage@v1\n        with:\n          GITHUB_TOKEN: ${{ env.bot_token }}\n"
  },
  {
    "path": ".github/workflows/pr-label-title-body.yml",
    "content": "# Github action for automatically adding label or setting assignee when a new\n# Issue or PR is opened. https://github.com/marketplace/actions/issue-labeler\n\nname: 🏷️　Label(Title and Body)\non:\n  issues:\n    types: [opened]\n  pull_request_target:\n    types: [opened]\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: Naturalclar/issue-action@v2.0.1\n        with:\n          github-token: ${{ env.bot_token }}\n          title-or-body: title\n          parameters: >\n            [\n              {\n                \"keywords\": [\"bug\", \"error\"],\n                \"labels\": [\"bug\"]\n              },\n              {\n                \"keywords\": [\"help\", \"guidance\"],\n                \"labels\": [\"help-wanted\"]\n              }\n            ]\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: 🚀　Release\non:\n  push:\n    branches:\n      - master\n      - next\n      - next-major\n      - alpha\n      - beta\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - name: ⤵️　Checkout\n        uses: actions/checkout@v3\n        with:\n          persist-credentials: false\n\n      - name: 🎉　Setup nodejs\n        uses: actions/setup-node@v3\n        with:\n          node-version: 16.x\n\n      - name: 🎉　Setup pnpm\n        uses: pnpm/action-setup@v2\n        with:\n          version: 7\n          run_install: false\n\n      - name: 🌱　Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: |\n          echo \"STORE_PATH=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n      - name: 🚸　Setup pnpm cache\n        uses: actions/cache@v3\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: 🚧　Install dependencies\n        run: pnpm install --no-frozen-lockfile --ignore-scripts\n\n      - name: 📦　Build\n        run: pnpm run build\n\n      - name: ✅　Test\n        run: pnpm run test\n\n      - name: 🔑　Generate Token\n        uses: wow-actions/use-app-token@v2\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n\n      - name: 📦　Semantic Release\n        uses: cycjimmy/semantic-release-action@v3\n        id: semantic\n        with:\n          extends: '@bubkoo/semantic-release-config'\n          extra_plugins: |\n            @semantic-release/changelog\n            @semantic-release/git\n        env:\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n          GITHUB_TOKEN: ${{ env.BOT_TOKEN }}\n          GIT_AUTHOR_NAME: ${{ env.BOT_NAME }}[bot]\n          GIT_AUTHOR_EMAIL: ${{ env.BOT_NAME }}[bot]@users.noreply.github.com\n          GIT_COMMITTER_NAME: ${{ env.BOT_NAME }}[bot]\n          GIT_COMMITTER_EMAIL: ${{ env.BOT_NAME }}[bot]@users.noreply.github.com\n\n      - name: 🎉　Setup Node.js with GitHub Package Registry\n        if: steps.semantic.outputs.new_release_published == 'true'\n        uses: actions/setup-node@v3\n        with:\n          node-version: 16\n          registry-url: https://npm.pkg.github.com\n          scope: bubkoo\n\n      - name: 🔀　Publish To GitHub Package Registry\n        if: steps.semantic.outputs.new_release_published == 'true'\n        run: |\n          sed -i 's/\\(\"name\"\\:[[:space:]]*\"\\)\\(html-to-image\"\\)/\\1@bubkoo\\/\\2/' package.json\n          npm publish\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/update-authors.yml",
    "content": "name: 🎗　Update Authors\non:\n  push:\n    branches:\n      - master\n      - alpha\n      - beta\njobs:\n  authors:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          env_name: bot_token\n      - uses: bubkoo/update-authors@v1\n        with:\n          GITHUB_TOKEN: ${{ env.bot_token  }}\n          bots: false\n          path: CONTRIBUTORS\n          commit: 'chore: update CONTRIBUTORS [skip ci]'\n"
  },
  {
    "path": ".github/workflows/update-contributors.yml",
    "content": "name: 🤝　Update Contributors\non:\n  schedule:\n    - cron: '0 1 * * *'\n  push:\n    branches:\n      - master\n      - alpha\n      - beta\njobs:\n  contributors:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          env_name: bot_token\n      - uses: bubkoo/contributors-list@v1\n        with:\n          GITHUB_TOKEN: ${{ env.bot_token }}\n          excludeUsers: semantic-release-bot ImgBotApp\n"
  },
  {
    "path": ".github/workflows/update-license.yml",
    "content": "name: 🔑　Update License\non:\n  schedule:\n    - cron: '0 3 1 1 *' # At 03:00 on day-of-month 1 in January.\njobs:\n  update:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n      with:\n        fetch-depth: 0\n    - uses: bubkoo/use-app-token@v1\n      with:\n        app_id: ${{ secrets.APP_ID }}\n        private_key: ${{ secrets.PRIVATE_KEY }}\n        env_name: bot_token\n    - uses: FantasticFiasco/action-update-license-year@v2\n      with:\n        token: ${{ env.bot_token }}\n"
  },
  {
    "path": ".github/workflows/welcome.yml",
    "content": "name: 👋　Welcome\non:\n  pull_request_target:\n    types: [opened, closed]\n  issues:\n    types: [opened]\njobs:\n  run:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: bubkoo/use-app-token@v1\n        with:\n          app_id: ${{ secrets.APP_ID }}\n          private_key: ${{ secrets.PRIVATE_KEY }}\n          variable_name: bot_token\n      - uses: bubkoo/welcome-action@v1\n        with:\n          GITHUB_TOKEN: ${{ env.bot_token }}\n          FIRST_ISSUE: |\n            👋 @{{ author }}\n\n            Thanks for opening your first issue here! If you're reporting a 🐞 bug, please make sure you include steps to reproduce it.\n            To help make it easier for us to investigate your issue, please follow the [contributing guidelines](https://github.com/antvis/X6/blob/master/CONTRIBUTING.md).\n\n            We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can.\n\n          FIRST_PR: |\n            👋 @{{ author }}\n\n            💖 Thanks for opening this pull request! 💖\n\n            Please follow the [contributing guidelines](https://github.com/antvis/X6/blob/master/CONTRIBUTING.md). And we use [semantic commit messages](https://www.conventionalcommits.org/en/v1.0.0/) to streamline the release process.\n\n            Examples of commit messages with semantic prefixes:\n            - `fix: don't overwrite prevent_default if default wasn't prevented`\n            - `feat: add graph.scale() method`\n            - `docs: graph.getShortestPath is now available`\n\n            Things that will help get your PR across the finish line:\n            - Follow the TypeScript coding style.\n            - Run `npm run lint` locally to catch formatting errors earlier.\n            - Document any user-facing changes you've made.\n            - Include tests when adding/changing behavior.\n            - Include screenshots and animated GIFs whenever possible.\n\n            We get a lot of pull requests on this repo, so please be patient and we will get back to you as soon as we can.\n\n\n          FIRST_PR_MERGED: |\n            👋 @{{ author }} Congrats on merging your first pull request! 🎉🎉🎉\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.idea\n.vscode\n.nyc_output\n.DS_Store\n.vscode\nnpm-debug.log\nyarn-error.log\nnode_modules\ndist\nes\nlib\ntest/coverage\n"
  },
  {
    "path": ".husky/.gitignore",
    "content": "_\n"
  },
  {
    "path": ".husky/commit-msg",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx @commitlint/cli --extends @bubkoo/commitlint-config --edit \"$1\"\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx lint-staged\n"
  },
  {
    "path": ".prettierignore",
    "content": "*.md\n*.sh\n*.yml\n*.svg\n*.gif\n.DS_Store\n.gitignore\n.npmignore\n.prettierignore\n.babelrc\n.editorconfig\n.eslintrc\n.eslintignore\n.stylelintrc.json\npackage.json\ntsconfig.json\ntslint.json\nCNAME\nLICENSE\nlib/\nes/\ndist/\ncoverage/\nyarn.lock\nyarn-error.log\nnpm-debug.log\nlerna-debug.log\npnpm-lock.yaml\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"semi\": false,\n  \"singleQuote\": true,\n  \"printWidth\": 80,\n  \"trailingComma\": \"all\",\n  \"proseWrap\": \"never\",\n  \"overrides\": [\n    { \"files\": \".eslintrc\", \"options\": { \"parser\": \"json\" } },\n    { \"files\": \".prettierrc\", \"options\": { \"parser\": \"json\" } }\n  ]\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "## [1.11.13](https://github.com/bubkoo/html-to-image/compare/v1.11.12...v1.11.13) (2025-02-14)\n\n\n### Bug Fixes\n\n* **mask:** add support for -webkit-mask and -webkit-mask-image ([#382](https://github.com/bubkoo/html-to-image/issues/382)) ([5bdfda7](https://github.com/bubkoo/html-to-image/commit/5bdfda75cc41248f4e161ea434bbfc535e72f95e))\n\n## [1.11.12](https://github.com/bubkoo/html-to-image/compare/v1.11.11...v1.11.12) (2025-02-12)\n\n\n### Bug Fixes\n\n* add possibility to use own handling of onerror which will not en… ([#453](https://github.com/bubkoo/html-to-image/issues/453)) ([04160c3](https://github.com/bubkoo/html-to-image/commit/04160c3e77f55e95082cbd4879847d0afda92883))\n* ensure images are totally prcoessed before using them (ios) ([#478](https://github.com/bubkoo/html-to-image/issues/478)) ([51fb98f](https://github.com/bubkoo/html-to-image/commit/51fb98f69b6eef6c391a5a7859711a5f0601f467))\n* Fix `fontEmbedCSS ` incorrect sizing ([#422](https://github.com/bubkoo/html-to-image/issues/422)) ([7020162](https://github.com/bubkoo/html-to-image/commit/702016256cc03b5637e75645f3d70131ddd0e45f))\n\n\n### Performance Improvements\n\n* embed only used fonts ([#476](https://github.com/bubkoo/html-to-image/issues/476)) ([09bee44](https://github.com/bubkoo/html-to-image/commit/09bee442c27bde2af06442417f4269e763e6b6cd))\n* svg cloning optimized using deep clone ([#462](https://github.com/bubkoo/html-to-image/issues/462)) ([9aac2fd](https://github.com/bubkoo/html-to-image/commit/9aac2fd11333ca302d10f2c438cd16be07a1429d))\n\n## [1.11.11](https://github.com/bubkoo/html-to-image/compare/v1.11.10...v1.11.11) (2023-02-01)\n\n## [1.11.10](https://github.com/bubkoo/html-to-image/compare/v1.11.9...v1.11.10) (2023-02-01)\n\n\n### Bug Fixes\n\n* revert the change in the pre-install hook ([ed7db4d](https://github.com/bubkoo/html-to-image/commit/ed7db4d090c600da632c2c7ef9319ed033d9c3e5)), closes [#365](https://github.com/bubkoo/html-to-image/issues/365)\n\n## [1.11.9](https://github.com/bubkoo/html-to-image/compare/v1.11.8...v1.11.9) (2023-01-31)\n\n\n### Bug Fixes\n\n* use \"secrets.GITHUB_TOKEN\" to publish to GPR ([2652288](https://github.com/bubkoo/html-to-image/commit/2652288af04f6a4775cf107981f3292b0a231973))\n\n## [1.11.8](https://github.com/bubkoo/html-to-image/compare/v1.11.7...v1.11.8) (2023-01-31)\n\n\n### Bug Fixes\n\n* specify plugins ([d90ec23](https://github.com/bubkoo/html-to-image/commit/d90ec23daca23cda0d515cd7dda8d80cdf75546b))\n\n## [1.11.7](https://github.com/bubkoo/html-to-image/compare/v1.11.6...v1.11.7) (2023-01-30)\n\n## [1.11.6](https://github.com/bubkoo/html-to-image/compare/v1.11.5...v1.11.6) (2023-01-30)\n\n\n### Bug Fixes\n\n* clone iframe nodes better ([#352](https://github.com/bubkoo/html-to-image/issues/352)) ([bc6b865](https://github.com/bubkoo/html-to-image/commit/bc6b8652f0504cf5be19ed77f9c88b986e7aaeed))\n\n## [1.11.5](https://github.com/bubkoo/html-to-image/compare/v1.11.4...v1.11.5) (2023-01-30)\n\n\n### Bug Fixes\n\n* **cloneCSSStyle:** rounded values of d attr fix ([#358](https://github.com/bubkoo/html-to-image/issues/358)) ([6d28bdb](https://github.com/bubkoo/html-to-image/commit/6d28bdb96f15877666b222067bfb082da300f355)), closes [#357](https://github.com/bubkoo/html-to-image/issues/357)\n* include source in npm package ([#316](https://github.com/bubkoo/html-to-image/issues/316)) ([b609415](https://github.com/bubkoo/html-to-image/commit/b6094151fb199fad699e74d93a8cef14089dda71))\n* switch lazy loading images to eager ([#359](https://github.com/bubkoo/html-to-image/issues/359)) ([f7c311b](https://github.com/bubkoo/html-to-image/commit/f7c311b5285d4ca8383c5fe7c3dfb0c9fbc6f630))\n\n## [1.11.4](https://github.com/bubkoo/html-to-image/compare/v1.11.3...v1.11.4) (2023-01-01)\n\n## [1.11.3](https://github.com/bubkoo/html-to-image/compare/v1.11.2...v1.11.3) (2022-12-16)\n\n## [1.11.2](https://github.com/bubkoo/html-to-image/compare/v1.11.1...v1.11.2) (2022-12-13)\n\n\n### Bug Fixes\n\n* fallback to `poster` when `currentSrc` of video is null ([5d79666](https://github.com/bubkoo/html-to-image/commit/5d7966691a0dae64de8fb2bf9e56be7d274cef83))\n* use frames for video capture & add iframes ([#346](https://github.com/bubkoo/html-to-image/issues/346)) ([e316c61](https://github.com/bubkoo/html-to-image/commit/e316c610364d6a774b736e36e310be79d0085d60))\n\n## [1.11.1](https://github.com/bubkoo/html-to-image/compare/v1.11.0...v1.11.1) (2022-12-05)\n\n\n### Bug Fixes\n\n* clone svg symbols ([#344](https://github.com/bubkoo/html-to-image/issues/344)) ([aec6fa1](https://github.com/bubkoo/html-to-image/commit/aec6fa1573d0f64be6e2879e54a8e4d7e9e300ac))\n\n# [1.11.0](https://github.com/bubkoo/html-to-image/compare/v1.10.10...v1.11.0) (2022-12-05)\n\n\n### Features\n\n* support webp format ([#343](https://github.com/bubkoo/html-to-image/issues/343)) ([09d4810](https://github.com/bubkoo/html-to-image/commit/09d4810ce3084e43f039c63efd65ba500451b9df)), closes [#326](https://github.com/bubkoo/html-to-image/issues/326)\n\n## [1.10.10](https://github.com/bubkoo/html-to-image/compare/v1.10.9...v1.10.10) (2022-12-03)\n\n\n### Bug Fixes\n\n* build script ([db7d435](https://github.com/bubkoo/html-to-image/commit/db7d43507c9419fb84ee126b8c334ffa1655b8b3))\n* type errors ([b516783](https://github.com/bubkoo/html-to-image/commit/b516783244e9aa847c89cd3ca3b8114bc6157934))\n\n## [1.10.9](https://github.com/bubkoo/html-to-image/compare/v1.10.8...v1.10.9) (2022-12-01)\n\n## [1.10.8](https://github.com/bubkoo/html-to-image/compare/v1.10.7...v1.10.8) (2022-09-01)\n\n## [1.10.7](https://github.com/bubkoo/html-to-image/compare/v1.10.6...v1.10.7) (2022-09-01)\n\n\n### Bug Fixes\n\n* handle 404 status of fetch ([ecfdbcc](https://github.com/bubkoo/html-to-image/commit/ecfdbcc189771c3fe212ee2ce6f641495b0d650a))\n\n## [1.10.6](https://github.com/bubkoo/html-to-image/compare/v1.10.5...v1.10.6) (2022-08-26)\n\n\n### Bug Fixes\n\n* apply skipFonts option ([6b7e923](https://github.com/bubkoo/html-to-image/commit/6b7e923ca6a82dddb409a8ab2cda24c469640014)), closes [#93](https://github.com/bubkoo/html-to-image/issues/93) [#310](https://github.com/bubkoo/html-to-image/issues/310)\n\n## [1.10.5](https://github.com/bubkoo/html-to-image/compare/v1.10.4...v1.10.5) (2022-08-26)\n\n## [1.10.4](https://github.com/bubkoo/html-to-image/compare/v1.10.3...v1.10.4) (2022-08-16)\n\n## [1.10.3](https://github.com/bubkoo/html-to-image/compare/v1.10.2...v1.10.3) (2022-08-16)\n\n## [1.10.2](https://github.com/bubkoo/html-to-image/compare/v1.10.1...v1.10.2) (2022-08-15)\n\n## [1.10.1](https://github.com/bubkoo/html-to-image/compare/v1.10.0...v1.10.1) (2022-08-15)\n\n\n### Bug Fixes\n\n* node version ([13a6989](https://github.com/bubkoo/html-to-image/commit/13a6989d00440984ea631bb92cb484d3bedbfb02))\n\n# [1.10.0](https://github.com/bubkoo/html-to-image/compare/v1.9.0...v1.10.0) (2022-08-11)\n\n\n### Bug Fixes\n\n* 🐛 cloneCSSStyle: copy transformOriginProp ([#297](https://github.com/bubkoo/html-to-image/issues/297)) ([76b978a](https://github.com/bubkoo/html-to-image/commit/76b978a943ee11ad78ef09f9b3363377baebcbb3))\n* 🐛 font format could be without qoutation ([#217](https://github.com/bubkoo/html-to-image/issues/217)) ([2a96149](https://github.com/bubkoo/html-to-image/commit/2a9614966f636636be133d3e16d8fe93cf26db0d))\n* 🐛 set selected attribute on option to draw it ([#280](https://github.com/bubkoo/html-to-image/issues/280)) ([caf97c8](https://github.com/bubkoo/html-to-image/commit/caf97c80a3b6ef6f7205d12ab59ef42c5ab2f071))\n* 🐛 text breaks on the last word ([#270](https://github.com/bubkoo/html-to-image/issues/270)) ([062c98a](https://github.com/bubkoo/html-to-image/commit/062c98ab3491fb731d660780b1a0408e1f53549a))\n* test specs ([c7a664e](https://github.com/bubkoo/html-to-image/commit/c7a664e8148bfa813391e124e33ba44c60e1cdae))\n\n\n### Features\n\n* ✨ add 'fetchRequestInit' option ([#210](https://github.com/bubkoo/html-to-image/issues/210)) ([c51da3a](https://github.com/bubkoo/html-to-image/commit/c51da3a5cc7421c530ffb7cbaa7b5009c677c2d8))\n* ✨ added includeQueryParams flag ([#260](https://github.com/bubkoo/html-to-image/issues/260)) ([259d71e](https://github.com/bubkoo/html-to-image/commit/259d71e431445ba0c32bc081d9164fa094b4da32))\n\n# [1.9.0](https://github.com/bubkoo/html-to-image/compare/v1.8.5...v1.9.0) (2021-10-09)\n\n\n### Bug Fixes\n\n* Large Dom sizes failing to be drawn correctly into canvas when exporting to PNG ([#197](https://github.com/bubkoo/html-to-image/issues/197)) ([1ee2e7f](https://github.com/bubkoo/html-to-image/commit/1ee2e7f366ccbaf247caefdcf479f52a2abd22bb))\n\n\n### Features\n\n* ✨ add svg image with href support ([#198](https://github.com/bubkoo/html-to-image/issues/198)) ([cb6f916](https://github.com/bubkoo/html-to-image/commit/cb6f91692fd0ff06852bf83751e0606df841f429))\n\n## [1.8.5](https://github.com/bubkoo/html-to-image/compare/v1.8.4...v1.8.5) (2021-09-15)\n\n\n### Bug Fixes\n\n* 🐛 config changelog ([297b17f](https://github.com/bubkoo/html-to-image/commit/297b17f6e213c2278e7655dec3fd2444a3e705bf))\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nbubkoo.wy@gmail.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contribution Guide\n\nIf you have any comment or advice, please report your [issue](https://github.com/bubkoo/html-to-image/issues),\nor make any change as you wish and submit a [PR](https://github.com/bubkoo/html-to-image/pulls).\n\n## Reporting New Issues\n\n- Please specify what kind of issue it is.\n- Before you report an issue, please search for related issues. Make sure you are not going to open a duplicate issue.\n- Explain your purpose clearly in labels, title, or content.\n\nWe will confirm the purpose of the issue, replace more accurate labels for it, identify related milestone, and assign developers working on it.\n\n## Submitting Code\n\n### Pull Request Guide\n\n1. [Fork][fork] and clone the repository\n2. Configure and install the dependencies `pnpm`\n3. Make sure the tests pass on your machine `pnpm test`, note: these tests also run the TypeScript compiler (`tsc`) to check for type errors, so there's no need to run these commands separately.\n4. Create a new branch `git checkout -b my-branch-name` for development. The name of branch should be semantic, avoiding words like 'update' or 'tmp'. We suggest to use `'feature/xxx'`, if the modification is about to implement a new feature.\n5. Run the test `pnpm test` after you finish your modification. Add new test cases or change old ones if you feel necessary.\n6. Push to your fork and [submit a pull request][pr]\n7. Pat your self on the back and wait for your pull request to be reviewed and merged.\n\nNo one can guarantee how much will be remembered about certain PR after some time. To make sure we can easily recap what happened previously, please provide the following information in your PR.\n\n1. Need: What function you want to achieve (Generally, please point out which issue is related).\n2. Updating Reason: Different with issue. Briefly describe your reason and logic about why you need to make such modification.\n3. Related Testing: Briefly describe what part of testing is relevant to your modification.\n4. User Tips: Notice for html-to-image users. You can skip this part, if the PR is not about update in API or potential compatibility problem.\n\n### Style Guide\n\ntslint can help to identify styling issues that may exist in your code. Your code is required to pass the test from tslint. Run the test locally by `$ pnpm lint`.\n\n### Commit Message Format\n\nYou are encouraged to use [angular commit-message-format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) to write commit message. In this way, we could have a more trackable history and an automatically generated changelog.\n\n```xml\n<type>(<scope>): <subject>\n<BLANK LINE>\n<body>\n<BLANK LINE>\n<footer>\n```\n\n（1）type\n\nMust be one of the following:\n\n- feat: A new feature\n- fix: A bug fix\n- docs: Documentation-only changes\n- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)\n- refactor: A code change that neither fixes a bug nor adds a feature\n- perf: A code change that improves performance\n- test: Adding missing tests\n- chore: Changes to the build process or auxiliary tools and libraries such as documentation generation\n- deps: Updates about dependencies\n\n（2）scope\n\nThe scope could be anything specifying place of the commit change.\n\n（3）subject\n\nUse succinct words to describe what did you do in the commit change.\n\n（4）body\n\nFeel free to add more content in the body, if you think subject is not self-explanatory enough, such as what it is the purpose or reasons of you commit.\n\n（5）footer\n\n- **If the commit is a Breaking Change, please note it clearly in this part.**\n- related issues, like `Closes #1, Closes #2, #3`\n\ne.g.\n\n```\nfix($compile): [BREAKING_CHANGE] couple of unit tests for IE9\n\nOlder IEs serialize html uppercased, but IE9 does not...\nWould be better to expect case insensitive, unfortunately jasmine does\nnot allow to user regexps for throw expectations.\n\nDocument change on bubkoo/html-to-image#123\n\nCloses #392\n\nBREAKING CHANGE:\n\n  Breaks foo.bar api, foo.baz should be used instead\n```\n\nLook at [these files](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit) for more details.\n\n## Release\n\nWe use semantic versioning in release process based on [semver](https://semver.org/).\n\n### Branch Strategy\n\n`master` branch is the latest stable version.\n\n- Just checkout develop branch from `master`\n- All new features will be added into `master` or `next` branch as well as all bug-fix except security issues. In such way, we can motivate developers to update to the latest stable version.\n\n### Release Strategy\n\nIn the release of every stable version, there will be a PM who has the following responsibilities in different stages of the release.\n\n#### Preparation\n\n- Set up milestone. Confirm that request is related to milestone.\n\n#### Before Release\n\n- Confirm that performance test is passed and all issues in current Milestone are either closed or can be delayed to later versions.\n- Open a new [Release Proposal MR](https://github.com/nodejs/node/pull/4181), and write `History` as [node CHANGELOG](https://github.com/nodejs/node/blob/master/CHANGELOG.md). Don't forget to correct content in documentation which is related to the releasing version.\n- Nominate PM for next stable version.\n"
  },
  {
    "path": "CONTRIBUTORS",
    "content": "Amirata Khodaparast <amiratak88@gmail.com>\nAndrei Gheorghiu <andrei.gheorghiu@kmap.io>\nAndrewN93 <31307316+AndrewN93@users.noreply.github.com>\nAndrey K <43050331+andreynocap@users.noreply.github.com>\nAndy Earnshaw <andyearnshaw@gmail.com>\nAnonymous <anon@ymo.us>\nArtemTumin <77966804+ArtemTumin@users.noreply.github.com>\nArun Rana <arun0808rana@gmail.com>\nCalvin Zheng <Calvin.Zheng@westpharma.com>\nDan Crevier <dancrevier@hotmail.com>\nDanang Arbansa <danang.arbansa@gmail.com>\nDarren Impey <darren@jaxxtec.com>\nDima <dima.horror@gmail.com>\nDragos Nedelcu <dragos199993@gmail.com>\nDustin Brett <dustinbrett@gmail.com>\nGU Yiling <justice360@gmail.com>\nGordon Smith <GordonSmith@users.noreply.github.com>\nGuillermo López <lopermo.g@gmail.com>\nHal Li <leadream4@gmail.com>\nJean-Francois Couture <jeanfrancois8512@gmail.com>\nJim Raptis <dimitrisraptis96@gmail.com>\nJobin <425605679@qq.com>\nLin Jie <linjie997@gmail.com>\nMarcel Voß <marcel.voss@web.de>\nMarcin Pietruszka <marcin@webskill.pl>\nMarcus Delang <marcus.nilsson@scrive.com>\nMarshal27 <marshalthompson1980@gmail.com>\nMartin Trobäck <lekoaf@users.noreply.github.com>\nMichal Biros <birosh@gmail.com>\nNick Loveridge <lovenick@users.noreply.github.com>\nPerry Huang <31561213+PerryHuan9@users.noreply.github.com>\nPrashoonB <prashoonbhattacharjee@gmail.com>\nSahin D <5789670+seahindeniz@users.noreply.github.com>\nShachar <34343793+ShaMan123@users.noreply.github.com>\nSureshtr1998 <82634485+Sureshtr1998@users.noreply.github.com>\nSérgio Ferreira de Mendonça <sergiofm@CIASC.LOCAL>\nW.Y <bubkoo@163.com>\nW.Y <pengxingjian.pxj@alibaba-inc.com>\nWill <11353590+june07@users.noreply.github.com>\nWill McKenzie <will.mckenzie@coolblue.co.uk>\nYuhao <liyuhao20001118@gmail.com>\nbubkoo <bubkoo.wy@gmail.com>\nisergey87 <isergey87@users.noreply.github.com>\njagermesh <jagermesh@gmail.com>\nmjr9804 <mjr9804@gmail.com>\npengxingjian.pxj <pengxingjian.pxj@alibaba-inc.com>\nramadis <rramiro.o@hotmail.com>\nrunkow <84323714+runkow@users.noreply.github.com>\nsasithahtl <sasithaasaranga@gmail.com>\nsbel-odoo <151751676+sbel-odoo@users.noreply.github.com>\nsemantic-release-bot <semantic-release-bot@martynus.net>\ntavo <gchava92@gmail.com>\ntuhm1 <50200070+tuhm1@users.noreply.github.com>\nyour-bot <bubkoo.wy@gmail.com>\n崖 <bubkoo.wy@gmail.com>\n崖崖崖 <bubkoo@163.com>\n李尔王 <46747508+happy-func@users.noreply.github.com>\n问崖 <bubkoo.wy@gmail.com>"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017-2025 W.Y.\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": "<h1 align=\"center\">html-to-image</h1>\n\n<p align=\"center\"><strong>✂️ Generates an image from a DOM node using HTML5 canvas and SVG.</strong></p>\n\n<p align=\"center\">Fork from <a href=\"https://github.com/tsayen/dom-to-image\" rel=\"nofollow\">dom-to-image</a> with more maintainable code and some new features.</p>\n\n<p align=\"center\">\n<a href=\"https://github.com/bubkoo/html-to-image/actions/workflows/ci.yml\"><img alt=\"build\" src=\"https://img.shields.io/github/actions/workflow/status/bubkoo/html-to-image/ci.yml?branch=master&logo=github&style=for-the-badge\"></a>\n<a href=\"https://app.codecov.io/gh/bubkoo/html-to-image\"><img alt=\"coverage\" src=\"https://img.shields.io/codecov/c/gh/bubkoo/html-to-image?logo=codecov&style=for-the-badge&token=BWweeU2uNX\"></a>\n<a href=\"https://www.npmjs.com/package/html-to-image\" rel=\"nofollow\"><img alt=\"NPM Package\" src=\"https://img.shields.io/npm/v/html-to-image.svg?logo=npm&style=for-the-badge\" /></a>\n<a href=\"https://www.npmjs.com/package/html-to-image\" rel=\"nofollow\"><img alt=\"NPM Downloads\" src=\"http://img.shields.io/npm/dm/html-to-image.svg?logo=npm&style=for-the-badge\" /></a>\n\n\n</p>\n\n<p align=\"center\">\n<a href=\"/LICENSE\"><img src=\"https://img.shields.io/github/license/bubkoo/html-to-image?style=for-the-badge\" alt=\"MIT License\"></a>\n<a href=\"https://www.typescriptlang.org\"><img alt=\"Language\" src=\"https://img.shields.io/badge/language-TypeScript-blue.svg?style=for-the-badge\"></a>\n<a href=\"https://github.com/bubkoo/html-to-image/pulls\"><img alt=\"PRs Welcome\" src=\"https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=for-the-badge\"></a>\n</p>\n\n## Install\n\n```shell\nnpm install --save html-to-image\n```\n\n## Usage\n\n```js\n/* ES6 */\nimport * as htmlToImage from 'html-to-image';\nimport { toPng, toJpeg, toBlob, toPixelData, toSvg } from 'html-to-image';\n\n/* ES5 */\nvar htmlToImage = require('html-to-image');\n```\n\nAll the top level functions accept DOM node and rendering options, and return a promise fulfilled with corresponding dataURL:\n\n- [toPng](#toPng)\n- [toSvg](#toSvg)\n- [toJpeg](#toJpeg)\n- [toBlob](#toBlob)\n- [toCanvas](#toCanvas)\n- [toPixelData](#toPixelData)\n\nGo with the following examples.\n\n#### toPng\nGet a PNG image base64-encoded data URL and display it right away:\n\n```js\nconst node = document.getElementById('my-node');\n\nhtmlToImage\n  .toPng(node)\n  .then((dataUrl) => {\n    const img = new Image();\n    img.src = dataUrl;\n    document.body.appendChild(img);\n  })\n  .catch((err) => {\n    console.error('oops, something went wrong!', err);\n  });\n```\n\nGet a PNG image base64-encoded data URL and download it (using [download](https://github.com/rndme/download)):\n\n```js\nhtmlToImage\n  .toPng(document.getElementById('my-node'))\n  .then((dataUrl) => download(dataUrl, 'my-node.png'));\n```\n\n#### toSvg\nGet an SVG data URL, but filter out all the `<i>` elements:\n\n```js\nfunction filter (node) {\n  return (node.tagName !== 'i');\n}\n\nhtmlToImage\n  .toSvg(document.getElementById('my-node'), { filter: filter })\n  .then(function (dataUrl) {\n    /* do something */\n  });\n```\n\n#### toJpeg\nSave and download a compressed JPEG image:\n\n```js\nhtmlToImage\n  .toJpeg(document.getElementById('my-node'), { quality: 0.95 })\n  .then(function (dataUrl) {\n    var link = document.createElement('a');\n    link.download = 'my-image-name.jpeg';\n    link.href = dataUrl;\n    link.click();\n  });\n```\n\n#### toBlob\nGet a PNG image blob and download it (using [FileSaver](https://github.com/eligrey/FileSaver.js)):\n\n```js\nhtmlToImage\n  .toBlob(document.getElementById('my-node'))\n  .then(function (blob) {\n    if (window.saveAs) {\n      window.saveAs(blob, 'my-node.png');\n    } else {\n     FileSaver.saveAs(blob, 'my-node.png');\n   }\n  });\n```\n\n#### toCanvas\nGet a HTMLCanvasElement, and display it right away:\n\n```js\nhtmlToImage\n  .toCanvas(document.getElementById('my-node'))\n  .then(function (canvas) {\n    document.body.appendChild(canvas);\n  });\n```\n\n#### toPixelData\nGet the raw pixel data as a [Uint8Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) with every 4 array elements representing the RGBA data of a pixel:\n\n```js\nvar node = document.getElementById('my-node');\n\nhtmlToImage\n  .toPixelData(node)\n  .then(function (pixels) {\n    for (var y = 0; y < node.scrollHeight; ++y) {\n      for (var x = 0; x < node.scrollWidth; ++x) {\n        pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x);\n        /* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */\n        pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4);\n      }\n    }\n  });\n```\n\n#### React\n```tsx\nimport React, { useCallback, useRef } from 'react';\nimport { toPng } from 'html-to-image';\n\nconst App: React.FC = () => {\n  const ref = useRef<HTMLDivElement>(null)\n\n  const onButtonClick = useCallback(() => {\n    if (ref.current === null) {\n      return\n    }\n\n    toPng(ref.current, { cacheBust: true, })\n      .then((dataUrl) => {\n        const link = document.createElement('a')\n        link.download = 'my-image-name.png'\n        link.href = dataUrl\n        link.click()\n      })\n      .catch((err) => {\n        console.log(err)\n      })\n  }, [ref])\n\n  return (\n    <>\n      <div ref={ref}>\n      {/* DOM nodes you want to convert to PNG */}\n      </div>\n      <button onClick={onButtonClick}>Click me</button>\n    </>\n  )\n}\n```\n\n## Options\n\n### filter\n\n```ts\n(domNode: HTMLElement) => boolean\n```\n\nA function taking DOM node as argument. Should return true if passed node should be included in the output. Excluding node means excluding it's children as well.\n\nYou can add filter to every image function. For example, \n\n```ts\nconst filter = (node: HTMLElement) => {\n  const exclusionClasses = ['remove-me', 'secret-div'];\n  return !exclusionClasses.some((classname) => node.classList?.contains(classname));\n}\n\nhtmlToImage.toJpeg(node, { quality: 0.95, filter: filter});\n```\nor\n\n```js\nhtmlToImage.toPng(node, {filter:filter})\n```\n\nNot called on the root node.\n\n### backgroundColor\n\nA string value for the background color, any valid CSS color value.\n\n### width, height\n\nWidth and height in pixels to be applied to node before rendering.\n\n### canvasWidth, canvasHeight\n\nAllows to scale the canva's size including the elements inside to a given width and height (in pixels).\n\n### style\n\nAn object whose properties to be copied to node's style before rendering. You might want to check [this reference](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Properties_Reference) for JavaScript names of CSS properties.\n\n### quality\n\nA number between `0` and `1` indicating image quality (e.g. `0.92` => `92%`) of the JPEG image.\n\nDefaults to `1.0` (`100%`)\n\n### cacheBust\n\nSet to true to append the current time as a query string to URL requests to enable cache busting.\n\nDefaults to `false`\n\n### includeQueryParams\n\nSet false to use all URL as cache key.\nIf the value has falsy value, it will exclude query params from the provided URL.\n\nDefaults to `false`\n\n### imagePlaceholder\n\nA data URL for a placeholder image that will be used when fetching an image fails.\n\nDefaults to an empty string and will render empty areas for failed images.\n\n### pixelRatio\n\nThe pixel ratio of the captured image. Default use the actual pixel ratio of the device. Set `1` to\nuse as initial-scale `1` for the image.\n\n### preferredFontFormat\n\nThe format required for font embedding. This is a useful optimisation when a webfont provider\nspecifies several different formats for fonts in the CSS, for example:\n\n```css\n@font-face {\n  name: 'proxima-nova';\n  src: url(\"...\") format(\"woff2\"), url(\"...\") format(\"woff\"), url(\"...\") format(\"opentype\");\n}\n```\n\nInstead of embedding each format, all formats other than the one specified will be discarded. If\nthis option is not specified then all formats will be downloaded and embedded.\n\n### fontEmbedCSS\n\nWhen supplied, the library will skip the process of parsing and embedding webfont URLs in CSS,\ninstead using this value. This is useful when combined with `getFontEmbedCSS()` to only perform the\nembedding process a single time across multiple calls to library functions.\n\n```javascript\nconst fontEmbedCSS = await htmlToImage.getFontEmbedCSS(element1);\nhtml2Image.toSVG(element1, { fontEmbedCSS });\nhtml2Image.toSVG(element2, { fontEmbedCSS });\n```\n\n### skipAutoScale\n\nWhen supplied, the library will skip the process of scaling extra large doms into the canvas object.\nYou may experience loss of parts of the image if set to `true` and you are exporting a very large image.\n\nDefaults to `false`  \n\n### type\n\nA string indicating the image format. The default type is image/png; that type is also used if the given type isn't supported.\nWhen supplied, the toCanvas function will return a blob matching the given image type and quality. \n\nDefaults to `image/png`\n\n### includeStyleProperties\n\nAn array of style property names. Can be used to manually specify which style properties are included when cloning nodes. This can be useful for performance-critical scenarios.\n\n## Browsers\n\nOnly standard lib is currently used, but make sure your browser supports:\n\n- [Promise](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise)\n- SVG `<foreignObject>` tag\n\nIt's tested on latest Chrome, Firefox and Safari (49, 45 and 16 respectively at the time of writing), with Chrome performing significantly better on big DOM trees, possibly due to it's more performant SVG support, and the fact that it supports `CSSStyleDeclaration.cssText` property.\n\n*Internet Explorer is not (and will not be) supported, as it does not support SVG `<foreignObject>` tag.*\n\n## How it works\n\nThere might some day exist (or maybe already exists?) a simple and standard way of exporting parts of the HTML to image (and then this script can only serve as an evidence of all the hoops I had to jump through in order to get such obvious thing done) but I haven't found one so far.\n\nThis library uses a feature of SVG that allows having arbitrary HTML content inside of the `<foreignObject>` tag. So, in order to render that DOM node for you, following steps are taken:\n\n1. Clone the original DOM node recursively\n2. Compute the style for the node and each sub-node and copy it to corresponding clone \n   - and don't forget to recreate pseudo-elements, as they are not cloned in any way, of course\n3. Embed web fonts\n   - find all the `@font-face` declarations that might represent web fonts\n   - parse file URLs, download corresponding files\n   - base64-encode and inline content as dataURLs\n   - concatenate all the processed CSS rules and put them into one `<style>` element, then attach it to the clone\n4. Embed images\n   - embed image URLs in `<img>` elements\n   - inline images used in `background` CSS property, in a fashion similar to fonts\n5. Serialize the cloned node to XML\n6. Wrap XML into the `<foreignObject>` tag, then into the SVG, then make it a data URL\n7. Optionally, to get PNG content or raw pixel data as a Uint8Array, create an Image element with the SVG as a source, and render it on an off-screen canvas, that you have also created, then read the content from the canvas\n8. Done!\n\n\n## Things to watch out for\n\n- If the DOM node you want to render includes a `<canvas>` element with something drawn on it, it should be handled fine, unless the canvas is [tainted](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image) - in this case rendering will rather not succeed.\n- Rendering will failed on huge DOM due to the dataURI [limit varies](https://stackoverflow.com/questions/695151/data-protocol-url-size-limitations/41755526#41755526).\n\n## Contributing\n\nPlease let us know how can we help. Do check out [issues](https://github.com/bubkoo/html-to-image/issues) for bug reports or suggestions first.\n\nTo become a contributor, please follow our [contributing guide](/CONTRIBUTING.md).\n\n<a href=\"https://github.com/bubkoo/html-to-image/graphs/contributors\">\n  <img src=\"/CONTRIBUTORS.svg\" alt=\"Contributors\" width=\"740\" />\n</a>\n\n\n## License\n\nThe scripts and documentation in this project are released under the [MIT License](LICENSE)\n"
  },
  {
    "path": "karma.conf.js",
    "content": "/* eslint-disable */\n\nconst cpuCount = require('os').cpus().length\nconst reportsDir = 'test/coverage'\n\nmodule.exports = function (config) {\n  const hasFlag = (flag) => process.argv.some((arg) => arg === flag)\n  const isDebug = hasFlag('--debug')\n  const isWatch = hasFlag('--auto-watch')\n\n  config.set({\n    files: [\n      {\n        pattern: 'test/resources/**/*',\n        included: false,\n        served: true,\n      },\n      {\n        pattern: 'node_modules/@fortawesome/fontawesome-free/css/*.*',\n        included: false,\n        served: true,\n      },\n      {\n        pattern: 'node_modules/@fortawesome/fontawesome-free/webfonts/*.*',\n        included: false,\n        served: true,\n      },\n      'src/**/*.ts',\n      'test/spec/**/*.ts',\n    ],\n    plugins: [\n      'jasmine-core',\n      'karma-jasmine',\n      'karma-typescript',\n      'karma-spec-reporter',\n      'karma-chrome-launcher',\n    ],\n\n    frameworks: ['jasmine', 'karma-typescript'],\n    preprocessors: {\n      '**/*.ts': ['karma-typescript'],\n    },\n    reporters: ['spec', 'karma-typescript'],\n    specReporter: {\n      suppressPassed: isWatch || isDebug,\n    },\n    browsers: [process.env.CI ? 'ChromeHeadless' : 'ChromeHeadless'],\n    customLaunchers: {\n      ChromeHeadless: {\n        base: 'Chrome',\n        flags: [\n          '--headless',\n          '--no-sandbox',\n          '--disable-gpu',\n          '--disable-translate',\n          '--disable-extensions',\n          '--remote-debugging-port=9222',\n        ],\n      },\n    },\n    karmaTypescriptConfig: {\n      tsconfig: './tsconfig.json',\n      include: ['src/**/*.ts', 'test/spec/**/*.ts'],\n      bundlerOptions: { sourceMap: true },\n      coverageOptions: {\n        instrumentation: !isDebug,\n        exclude: [/spec\\/.*\\.ts$/],\n      },\n      reports: {\n        html: reportsDir,\n        lcovonly: {\n          directory: reportsDir,\n          subdirectory: './',\n          filename: 'lcov.info',\n        },\n        cobertura: {\n          directory: reportsDir,\n          subdirectory: './',\n          filename: 'coverage.xml',\n        },\n        'text-summary': '',\n      },\n    },\n\n    client: {\n      jasmine: {\n        random: false,\n      },\n    },\n\n    // web server port\n    port: 9876,\n\n    // enable / disable colors in the output (reporters and logs)\n    colors: true,\n\n    // level of logging\n    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG\n    logLevel: config.LOG_INFO,\n\n    // enable / disable watching file and executing tests whenever any file changes\n    autoWatch: false,\n\n    // Continuous Integration mode\n    // if true, Karma captures browsers, runs the tests and exits\n    singleRun: true,\n\n    // Concurrency level\n    // how many browser should be started simultaneous\n    concurrency: cpuCount || Infinity,\n  })\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"html-to-image\",\n  \"version\": \"1.11.13\",\n  \"description\": \"Generates an image from a DOM node using HTML5 canvas and SVG.\",\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"unpkg\": \"dist/html-to-image.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"dist\",\n    \"es\",\n    \"lib\",\n    \"src\"\n  ],\n  \"keywords\": [\n    \"screenshot\",\n    \"capture\",\n    \"canvas\",\n    \"html\",\n    \"dom\",\n    \"image\",\n    \"vector\",\n    \"svg\"\n  ],\n  \"scripts\": {\n    \"lint\": \"eslint 'src/**/*.{js,ts}?(x)' --fix\",\n    \"clean\": \"rimraf dist es lib\",\n    \"build:esm\": \"tsc --module esnext --target es2017 --outDir ./es\",\n    \"build:cjs\": \"tsc --module commonjs --target es5 --outDir ./lib\",\n    \"build:umd\": \"rollup -c --bundleConfigAsCjs\",\n    \"build\": \"run-s build:esm build:cjs build:umd\",\n    \"prebuild\": \"run-s lint clean\",\n    \"test\": \"karma start\",\n    \"test:watch\": \"karma start --single-run=false --auto-watch\",\n    \"test:debug\": \"karma start --browsers=Chrome --single-run=false --auto-watch --debug\",\n    \"coveralls\": \"cat ./test/coverage/lcov.info | coveralls\",\n    \"pretest\": \"rimraf ./test/coverage\",\n    \"prepare\": \"is-ci || husky install .husky\"\n  },\n  \"lint-staged\": {\n    \"**/*.{js,jsx,tsx,ts,less,md,json}\": [\n      \"pretty-quick —-staged\"\n    ],\n    \"*.ts\": [\n      \"eslint --fix\"\n    ]\n  },\n  \"release\": {\n    \"extends\": \"@bubkoo/semantic-release-config\"\n  },\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"bubkooo\",\n    \"email\": \"bubkoo.wy@gmail.com\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/bubkoo/html-to-image.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/bubkoo/html-to-image/issues\"\n  },\n  \"homepage\": \"https://github.com/bubkoo/html-to-image#readme\",\n  \"devDependencies\": {\n    \"@bubkoo/commitlint-config\": \"^1.0.2\",\n    \"@bubkoo/eslint-config\": \"^1.3.1\",\n    \"@bubkoo/rollup-config\": \"^1.2.1\",\n    \"@bubkoo/semantic-release-config\": \"^1.6.1\",\n    \"@bubkoo/tsconfig\": \"^1.0.0\",\n    \"@fortawesome/fontawesome-free\": \"^6.1.2\",\n    \"@types/jasmine\": \"^4.3.1\",\n    \"@types/pixelmatch\": \"^5.2.4\",\n    \"coveralls\": \"^3.1.1\",\n    \"eslint\": \"^8.22.0\",\n    \"husky\": \"^8.0.1\",\n    \"is-ci\": \"^3.0.1\",\n    \"jasmine-core\": \"^4.3.0\",\n    \"karma\": \"^6.4.0\",\n    \"karma-chrome-launcher\": \"^3.1.1\",\n    \"karma-coverage\": \"^2.2.0\",\n    \"karma-jasmine\": \"^5.1.0\",\n    \"karma-spec-reporter\": \"^0.0.36\",\n    \"karma-typescript\": \"^5.5.3\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"pixelmatch\": \"^5.3.0\",\n    \"prettier\": \"^2.8.1\",\n    \"pretty-quick\": \"^3.1.3\",\n    \"rimraf\": \"^4.1.2\",\n    \"rollup\": \"^3.7.4\",\n    \"tslib\": \"^2.4.0\",\n    \"typescript\": \"^4.9.5\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import config from '@bubkoo/rollup-config'\n\nexport default config({\n  output: [\n    {\n      name: 'htmlToImage',\n      format: 'umd',\n      file: 'dist/html-to-image.js',\n      sourcemap: true,\n    },\n  ],\n})\n"
  },
  {
    "path": "src/apply-style.ts",
    "content": "import type { Options } from './types'\n\nexport function applyStyle<T extends HTMLElement>(\n  node: T,\n  options: Options,\n): T {\n  const { style } = node\n\n  if (options.backgroundColor) {\n    style.backgroundColor = options.backgroundColor\n  }\n\n  if (options.width) {\n    style.width = `${options.width}px`\n  }\n\n  if (options.height) {\n    style.height = `${options.height}px`\n  }\n\n  const manual = options.style\n  if (manual != null) {\n    Object.keys(manual).forEach((key: any) => {\n      style[key] = manual[key] as string\n    })\n  }\n\n  return node\n}\n"
  },
  {
    "path": "src/clone-node.ts",
    "content": "import type { Options } from './types'\nimport { clonePseudoElements } from './clone-pseudos'\nimport {\n  createImage,\n  toArray,\n  isInstanceOfElement,\n  getStyleProperties,\n} from './util'\nimport { getMimeType } from './mimes'\nimport { resourceToDataURL } from './dataurl'\n\nasync function cloneCanvasElement(canvas: HTMLCanvasElement) {\n  const dataURL = canvas.toDataURL()\n  if (dataURL === 'data:,') {\n    return canvas.cloneNode(false) as HTMLCanvasElement\n  }\n  return createImage(dataURL)\n}\n\nasync function cloneVideoElement(video: HTMLVideoElement, options: Options) {\n  if (video.currentSrc) {\n    const canvas = document.createElement('canvas')\n    const ctx = canvas.getContext('2d')\n    canvas.width = video.clientWidth\n    canvas.height = video.clientHeight\n    ctx?.drawImage(video, 0, 0, canvas.width, canvas.height)\n    const dataURL = canvas.toDataURL()\n    return createImage(dataURL)\n  }\n\n  const poster = video.poster\n  const contentType = getMimeType(poster)\n  const dataURL = await resourceToDataURL(poster, contentType, options)\n  return createImage(dataURL)\n}\n\nasync function cloneIFrameElement(iframe: HTMLIFrameElement, options: Options) {\n  try {\n    if (iframe?.contentDocument?.body) {\n      return (await cloneNode(\n        iframe.contentDocument.body,\n        options,\n        true,\n      )) as HTMLBodyElement\n    }\n  } catch {\n    // Failed to clone iframe\n  }\n\n  return iframe.cloneNode(false) as HTMLIFrameElement\n}\n\nasync function cloneSingleNode<T extends HTMLElement>(\n  node: T,\n  options: Options,\n): Promise<HTMLElement> {\n  if (isInstanceOfElement(node, HTMLCanvasElement)) {\n    return cloneCanvasElement(node)\n  }\n\n  if (isInstanceOfElement(node, HTMLVideoElement)) {\n    return cloneVideoElement(node, options)\n  }\n\n  if (isInstanceOfElement(node, HTMLIFrameElement)) {\n    return cloneIFrameElement(node, options)\n  }\n\n  return node.cloneNode(isSVGElement(node)) as T\n}\n\nconst isSlotElement = (node: HTMLElement): node is HTMLSlotElement =>\n  node.tagName != null && node.tagName.toUpperCase() === 'SLOT'\n\nconst isSVGElement = (node: HTMLElement): node is HTMLSlotElement =>\n  node.tagName != null && node.tagName.toUpperCase() === 'SVG'\n\nasync function cloneChildren<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n): Promise<T> {\n  if (isSVGElement(clonedNode)) {\n    return clonedNode\n  }\n\n  let children: T[] = []\n\n  if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n    children = toArray<T>(nativeNode.assignedNodes())\n  } else if (\n    isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n    nativeNode.contentDocument?.body\n  ) {\n    children = toArray<T>(nativeNode.contentDocument.body.childNodes)\n  } else {\n    children = toArray<T>((nativeNode.shadowRoot ?? nativeNode).childNodes)\n  }\n\n  if (\n    children.length === 0 ||\n    isInstanceOfElement(nativeNode, HTMLVideoElement)\n  ) {\n    return clonedNode\n  }\n\n  await children.reduce(\n    (deferred, child) =>\n      deferred\n        .then(() => cloneNode(child, options))\n        .then((clonedChild: HTMLElement | null) => {\n          if (clonedChild) {\n            clonedNode.appendChild(clonedChild)\n          }\n        }),\n    Promise.resolve(),\n  )\n\n  return clonedNode\n}\n\nfunction cloneCSSStyle<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n) {\n  const targetStyle = clonedNode.style\n  if (!targetStyle) {\n    return\n  }\n\n  const sourceStyle = window.getComputedStyle(nativeNode)\n  if (sourceStyle.cssText) {\n    targetStyle.cssText = sourceStyle.cssText\n    targetStyle.transformOrigin = sourceStyle.transformOrigin\n  } else {\n    getStyleProperties(options).forEach((name) => {\n      let value = sourceStyle.getPropertyValue(name)\n      if (name === 'font-size' && value.endsWith('px')) {\n        const reducedFont =\n          Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1\n        value = `${reducedFont}px`\n      }\n\n      if (\n        isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n        name === 'display' &&\n        value === 'inline'\n      ) {\n        value = 'block'\n      }\n\n      if (name === 'd' && clonedNode.getAttribute('d')) {\n        value = `path(${clonedNode.getAttribute('d')})`\n      }\n\n      targetStyle.setProperty(\n        name,\n        value,\n        sourceStyle.getPropertyPriority(name),\n      )\n    })\n  }\n}\n\nfunction cloneInputValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n  if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n    clonedNode.innerHTML = nativeNode.value\n  }\n\n  if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n    clonedNode.setAttribute('value', nativeNode.value)\n  }\n}\n\nfunction cloneSelectValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n  if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n    const clonedSelect = clonedNode as any as HTMLSelectElement\n    const selectedOption = Array.from(clonedSelect.children).find(\n      (child) => nativeNode.value === child.getAttribute('value'),\n    )\n\n    if (selectedOption) {\n      selectedOption.setAttribute('selected', '')\n    }\n  }\n}\n\nfunction decorate<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n): T {\n  if (isInstanceOfElement(clonedNode, Element)) {\n    cloneCSSStyle(nativeNode, clonedNode, options)\n    clonePseudoElements(nativeNode, clonedNode, options)\n    cloneInputValue(nativeNode, clonedNode)\n    cloneSelectValue(nativeNode, clonedNode)\n  }\n\n  return clonedNode\n}\n\nasync function ensureSVGSymbols<T extends HTMLElement>(\n  clone: T,\n  options: Options,\n) {\n  const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : []\n  if (uses.length === 0) {\n    return clone\n  }\n\n  const processedDefs: { [key: string]: HTMLElement } = {}\n  for (let i = 0; i < uses.length; i++) {\n    const use = uses[i]\n    const id = use.getAttribute('xlink:href')\n    if (id) {\n      const exist = clone.querySelector(id)\n      const definition = document.querySelector(id) as HTMLElement\n      if (!exist && definition && !processedDefs[id]) {\n        // eslint-disable-next-line no-await-in-loop\n        processedDefs[id] = (await cloneNode(definition, options, true))!\n      }\n    }\n  }\n\n  const nodes = Object.values(processedDefs)\n  if (nodes.length) {\n    const ns = 'http://www.w3.org/1999/xhtml'\n    const svg = document.createElementNS(ns, 'svg')\n    svg.setAttribute('xmlns', ns)\n    svg.style.position = 'absolute'\n    svg.style.width = '0'\n    svg.style.height = '0'\n    svg.style.overflow = 'hidden'\n    svg.style.display = 'none'\n\n    const defs = document.createElementNS(ns, 'defs')\n    svg.appendChild(defs)\n\n    for (let i = 0; i < nodes.length; i++) {\n      defs.appendChild(nodes[i])\n    }\n\n    clone.appendChild(svg)\n  }\n\n  return clone\n}\n\nexport async function cloneNode<T extends HTMLElement>(\n  node: T,\n  options: Options,\n  isRoot?: boolean,\n): Promise<T | null> {\n  if (!isRoot && options.filter && !options.filter(node)) {\n    return null\n  }\n\n  return Promise.resolve(node)\n    .then((clonedNode) => cloneSingleNode(clonedNode, options) as Promise<T>)\n    .then((clonedNode) => cloneChildren(node, clonedNode, options))\n    .then((clonedNode) => decorate(node, clonedNode, options))\n    .then((clonedNode) => ensureSVGSymbols(clonedNode, options))\n}\n"
  },
  {
    "path": "src/clone-pseudos.ts",
    "content": "import type { Options } from './types'\nimport { uuid, getStyleProperties } from './util'\n\ntype Pseudo = ':before' | ':after'\n\nfunction formatCSSText(style: CSSStyleDeclaration) {\n  const content = style.getPropertyValue('content')\n  return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`\n}\n\nfunction formatCSSProperties(style: CSSStyleDeclaration, options: Options) {\n  return getStyleProperties(options)\n    .map((name) => {\n      const value = style.getPropertyValue(name)\n      const priority = style.getPropertyPriority(name)\n\n      return `${name}: ${value}${priority ? ' !important' : ''};`\n    })\n    .join(' ')\n}\n\nfunction getPseudoElementStyle(\n  className: string,\n  pseudo: Pseudo,\n  style: CSSStyleDeclaration,\n  options: Options,\n): Text {\n  const selector = `.${className}:${pseudo}`\n  const cssText = style.cssText\n    ? formatCSSText(style)\n    : formatCSSProperties(style, options)\n\n  return document.createTextNode(`${selector}{${cssText}}`)\n}\n\nfunction clonePseudoElement<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  pseudo: Pseudo,\n  options: Options,\n) {\n  const style = window.getComputedStyle(nativeNode, pseudo)\n  const content = style.getPropertyValue('content')\n  if (content === '' || content === 'none') {\n    return\n  }\n\n  const className = uuid()\n  try {\n    clonedNode.className = `${clonedNode.className} ${className}`\n  } catch (err) {\n    return\n  }\n\n  const styleElement = document.createElement('style')\n  styleElement.appendChild(\n    getPseudoElementStyle(className, pseudo, style, options),\n  )\n  clonedNode.appendChild(styleElement)\n}\n\nexport function clonePseudoElements<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n) {\n  clonePseudoElement(nativeNode, clonedNode, ':before', options)\n  clonePseudoElement(nativeNode, clonedNode, ':after', options)\n}\n"
  },
  {
    "path": "src/dataurl.ts",
    "content": "import { Options } from './types'\n\nfunction getContentFromDataUrl(dataURL: string) {\n  return dataURL.split(/,/)[1]\n}\n\nexport function isDataUrl(url: string) {\n  return url.search(/^(data:)/) !== -1\n}\n\nexport function makeDataUrl(content: string, mimeType: string) {\n  return `data:${mimeType};base64,${content}`\n}\n\nexport async function fetchAsDataURL<T>(\n  url: string,\n  init: RequestInit | undefined,\n  process: (data: { result: string; res: Response }) => T,\n): Promise<T> {\n  const res = await fetch(url, init)\n  if (res.status === 404) {\n    throw new Error(`Resource \"${res.url}\" not found`)\n  }\n  const blob = await res.blob()\n  return new Promise<T>((resolve, reject) => {\n    const reader = new FileReader()\n    reader.onerror = reject\n    reader.onloadend = () => {\n      try {\n        resolve(process({ res, result: reader.result as string }))\n      } catch (error) {\n        reject(error)\n      }\n    }\n\n    reader.readAsDataURL(blob)\n  })\n}\n\nconst cache: { [url: string]: string } = {}\n\nfunction getCacheKey(\n  url: string,\n  contentType: string | undefined,\n  includeQueryParams: boolean | undefined,\n) {\n  let key = url.replace(/\\?.*/, '')\n\n  if (includeQueryParams) {\n    key = url\n  }\n\n  // font resource\n  if (/ttf|otf|eot|woff2?/i.test(key)) {\n    key = key.replace(/.*\\//, '')\n  }\n\n  return contentType ? `[${contentType}]${key}` : key\n}\n\nexport async function resourceToDataURL(\n  resourceUrl: string,\n  contentType: string | undefined,\n  options: Options,\n) {\n  const cacheKey = getCacheKey(\n    resourceUrl,\n    contentType,\n    options.includeQueryParams,\n  )\n\n  if (cache[cacheKey] != null) {\n    return cache[cacheKey]\n  }\n\n  // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n  if (options.cacheBust) {\n    // eslint-disable-next-line no-param-reassign\n    resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime()\n  }\n\n  let dataURL: string\n  try {\n    const content = await fetchAsDataURL(\n      resourceUrl,\n      options.fetchRequestInit,\n      ({ res, result }) => {\n        if (!contentType) {\n          // eslint-disable-next-line no-param-reassign\n          contentType = res.headers.get('Content-Type') || ''\n        }\n        return getContentFromDataUrl(result)\n      },\n    )\n    dataURL = makeDataUrl(content, contentType!)\n  } catch (error) {\n    dataURL = options.imagePlaceholder || ''\n\n    let msg = `Failed to fetch resource: ${resourceUrl}`\n    if (error) {\n      msg = typeof error === 'string' ? error : error.message\n    }\n\n    if (msg) {\n      console.warn(msg)\n    }\n  }\n\n  cache[cacheKey] = dataURL\n  return dataURL\n}\n"
  },
  {
    "path": "src/embed-images.ts",
    "content": "import { Options } from './types'\nimport { embedResources } from './embed-resources'\nimport { toArray, isInstanceOfElement } from './util'\nimport { isDataUrl, resourceToDataURL } from './dataurl'\nimport { getMimeType } from './mimes'\n\nasync function embedProp(\n  propName: string,\n  node: HTMLElement,\n  options: Options,\n) {\n  const propValue = node.style?.getPropertyValue(propName)\n  if (propValue) {\n    const cssString = await embedResources(propValue, null, options)\n    node.style.setProperty(\n      propName,\n      cssString,\n      node.style.getPropertyPriority(propName),\n    )\n    return true\n  }\n  return false\n}\n\nasync function embedBackground<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  ;(await embedProp('background', clonedNode, options)) ||\n    (await embedProp('background-image', clonedNode, options))\n  ;(await embedProp('mask', clonedNode, options)) ||\n    (await embedProp('-webkit-mask', clonedNode, options)) ||\n    (await embedProp('mask-image', clonedNode, options)) ||\n    (await embedProp('-webkit-mask-image', clonedNode, options))\n}\n\nasync function embedImageNode<T extends HTMLElement | SVGImageElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement)\n\n  if (\n    !(isImageElement && !isDataUrl(clonedNode.src)) &&\n    !(\n      isInstanceOfElement(clonedNode, SVGImageElement) &&\n      !isDataUrl(clonedNode.href.baseVal)\n    )\n  ) {\n    return\n  }\n\n  const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal\n\n  const dataURL = await resourceToDataURL(url, getMimeType(url), options)\n  await new Promise((resolve, reject) => {\n    clonedNode.onload = resolve\n    clonedNode.onerror = options.onImageErrorHandler\n      ? (...attributes) => {\n          try {\n            resolve(options.onImageErrorHandler!(...attributes))\n          } catch (error) {\n            reject(error)\n          }\n        }\n      : reject\n\n    const image = clonedNode as HTMLImageElement\n    if (image.decode) {\n      image.decode = resolve as any\n    }\n\n    if (image.loading === 'lazy') {\n      image.loading = 'eager'\n    }\n\n    if (isImageElement) {\n      clonedNode.srcset = ''\n      clonedNode.src = dataURL\n    } else {\n      clonedNode.href.baseVal = dataURL\n    }\n  })\n}\n\nasync function embedChildren<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  const children = toArray<HTMLElement>(clonedNode.childNodes)\n  const deferreds = children.map((child) => embedImages(child, options))\n  await Promise.all(deferreds).then(() => clonedNode)\n}\n\nexport async function embedImages<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  if (isInstanceOfElement(clonedNode, Element)) {\n    await embedBackground(clonedNode, options)\n    await embedImageNode(clonedNode, options)\n    await embedChildren(clonedNode, options)\n  }\n}\n"
  },
  {
    "path": "src/embed-resources.ts",
    "content": "import { Options } from './types'\nimport { resolveUrl } from './util'\nimport { getMimeType } from './mimes'\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl'\n\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g\n\nfunction toRegex(url: string): RegExp {\n  // eslint-disable-next-line no-useless-escape\n  const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1')\n  return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g')\n}\n\nexport function parseURLs(cssText: string): string[] {\n  const urls: string[] = []\n\n  cssText.replace(URL_REGEX, (raw, quotation, url) => {\n    urls.push(url)\n    return raw\n  })\n\n  return urls.filter((url) => !isDataUrl(url))\n}\n\nexport async function embed(\n  cssText: string,\n  resourceURL: string,\n  baseURL: string | null,\n  options: Options,\n  getContentFromUrl?: (url: string) => Promise<string>,\n): Promise<string> {\n  try {\n    const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL\n    const contentType = getMimeType(resourceURL)\n    let dataURL: string\n    if (getContentFromUrl) {\n      const content = await getContentFromUrl(resolvedURL)\n      dataURL = makeDataUrl(content, contentType)\n    } else {\n      dataURL = await resourceToDataURL(resolvedURL, contentType, options)\n    }\n    return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`)\n  } catch (error) {\n    // pass\n  }\n  return cssText\n}\n\nfunction filterPreferredFontFormat(\n  str: string,\n  { preferredFontFormat }: Options,\n): string {\n  return !preferredFontFormat\n    ? str\n    : str.replace(FONT_SRC_REGEX, (match: string) => {\n        // eslint-disable-next-line no-constant-condition\n        while (true) {\n          const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || []\n          if (!format) {\n            return ''\n          }\n\n          if (format === preferredFontFormat) {\n            return `src: ${src};`\n          }\n        }\n      })\n}\n\nexport function shouldEmbed(url: string): boolean {\n  return url.search(URL_REGEX) !== -1\n}\n\nexport async function embedResources(\n  cssText: string,\n  baseUrl: string | null,\n  options: Options,\n): Promise<string> {\n  if (!shouldEmbed(cssText)) {\n    return cssText\n  }\n\n  const filteredCSSText = filterPreferredFontFormat(cssText, options)\n  const urls = parseURLs(filteredCSSText)\n  return urls.reduce(\n    (deferred, url) =>\n      deferred.then((css) => embed(css, url, baseUrl, options)),\n    Promise.resolve(filteredCSSText),\n  )\n}\n"
  },
  {
    "path": "src/embed-webfonts.ts",
    "content": "import type { Options } from './types'\nimport { toArray } from './util'\nimport { fetchAsDataURL } from './dataurl'\nimport { shouldEmbed, embedResources } from './embed-resources'\n\ninterface Metadata {\n  url: string\n  cssText: string\n}\n\nconst cssFetchCache: { [href: string]: Metadata } = {}\n\nasync function fetchCSS(url: string) {\n  let cache = cssFetchCache[url]\n  if (cache != null) {\n    return cache\n  }\n\n  const res = await fetch(url)\n  const cssText = await res.text()\n  cache = { url, cssText }\n\n  cssFetchCache[url] = cache\n\n  return cache\n}\n\nasync function embedFonts(data: Metadata, options: Options): Promise<string> {\n  let cssText = data.cssText\n  const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g\n  const fontLocs = cssText.match(/url\\([^)]+\\)/g) || []\n  const loadFonts = fontLocs.map(async (loc: string) => {\n    let url = loc.replace(regexUrl, '$1')\n    if (!url.startsWith('https://')) {\n      url = new URL(url, data.url).href\n    }\n\n    return fetchAsDataURL<[string, string]>(\n      url,\n      options.fetchRequestInit,\n      ({ result }) => {\n        cssText = cssText.replace(loc, `url(${result})`)\n        return [loc, result]\n      },\n    )\n  })\n\n  return Promise.all(loadFonts).then(() => cssText)\n}\n\nfunction parseCSS(source: string) {\n  if (source == null) {\n    return []\n  }\n\n  const result: string[] = []\n  const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi\n  // strip out comments\n  let cssText = source.replace(commentsRegex, '')\n\n  // eslint-disable-next-line prefer-regex-literals\n  const keyframesRegex = new RegExp(\n    '((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})',\n    'gi',\n  )\n\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    const matches = keyframesRegex.exec(cssText)\n    if (matches === null) {\n      break\n    }\n    result.push(matches[0])\n  }\n  cssText = cssText.replace(keyframesRegex, '')\n\n  const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi\n  // to match css & media queries together\n  const combinedCSSRegex =\n    '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n    '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})'\n  // unified regex\n  const unifiedRegex = new RegExp(combinedCSSRegex, 'gi')\n\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    let matches = importRegex.exec(cssText)\n    if (matches === null) {\n      matches = unifiedRegex.exec(cssText)\n      if (matches === null) {\n        break\n      } else {\n        importRegex.lastIndex = unifiedRegex.lastIndex\n      }\n    } else {\n      unifiedRegex.lastIndex = importRegex.lastIndex\n    }\n    result.push(matches[0])\n  }\n\n  return result\n}\n\nasync function getCSSRules(\n  styleSheets: CSSStyleSheet[],\n  options: Options,\n): Promise<CSSStyleRule[]> {\n  const ret: CSSStyleRule[] = []\n  const deferreds: Promise<number | void>[] = []\n\n  // First loop inlines imports\n  styleSheets.forEach((sheet) => {\n    if ('cssRules' in sheet) {\n      try {\n        toArray<CSSRule>(sheet.cssRules || []).forEach((item, index) => {\n          if (item.type === CSSRule.IMPORT_RULE) {\n            let importIndex = index + 1\n            const url = (item as CSSImportRule).href\n            const deferred = fetchCSS(url)\n              .then((metadata) => embedFonts(metadata, options))\n              .then((cssText) =>\n                parseCSS(cssText).forEach((rule) => {\n                  try {\n                    sheet.insertRule(\n                      rule,\n                      rule.startsWith('@import')\n                        ? (importIndex += 1)\n                        : sheet.cssRules.length,\n                    )\n                  } catch (error) {\n                    console.error('Error inserting rule from remote css', {\n                      rule,\n                      error,\n                    })\n                  }\n                }),\n              )\n              .catch((e) => {\n                console.error('Error loading remote css', e.toString())\n              })\n\n            deferreds.push(deferred)\n          }\n        })\n      } catch (e) {\n        const inline =\n          styleSheets.find((a) => a.href == null) || document.styleSheets[0]\n        if (sheet.href != null) {\n          deferreds.push(\n            fetchCSS(sheet.href)\n              .then((metadata) => embedFonts(metadata, options))\n              .then((cssText) =>\n                parseCSS(cssText).forEach((rule) => {\n                  inline.insertRule(rule, inline.cssRules.length)\n                }),\n              )\n              .catch((err: unknown) => {\n                console.error('Error loading remote stylesheet', err)\n              }),\n          )\n        }\n        console.error('Error inlining remote css file', e)\n      }\n    }\n  })\n\n  return Promise.all(deferreds).then(() => {\n    // Second loop parses rules\n    styleSheets.forEach((sheet) => {\n      if ('cssRules' in sheet) {\n        try {\n          toArray<CSSStyleRule>(sheet.cssRules || []).forEach((item) => {\n            ret.push(item)\n          })\n        } catch (e) {\n          console.error(`Error while reading CSS rules from ${sheet.href}`, e)\n        }\n      }\n    })\n\n    return ret\n  })\n}\n\nfunction getWebFontRules(cssRules: CSSStyleRule[]): CSSStyleRule[] {\n  return cssRules\n    .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n    .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')))\n}\n\nasync function parseWebFontRules<T extends HTMLElement>(\n  node: T,\n  options: Options,\n) {\n  if (node.ownerDocument == null) {\n    throw new Error('Provided element is not within a Document')\n  }\n\n  const styleSheets = toArray<CSSStyleSheet>(node.ownerDocument.styleSheets)\n  const cssRules = await getCSSRules(styleSheets, options)\n\n  return getWebFontRules(cssRules)\n}\n\nfunction normalizeFontFamily(font: string) {\n  return font.trim().replace(/[\"']/g, '')\n}\n\nfunction getUsedFonts(node: HTMLElement) {\n  const fonts = new Set<string>()\n  function traverse(node: HTMLElement) {\n    const fontFamily =\n      node.style.fontFamily || getComputedStyle(node).fontFamily\n    fontFamily.split(',').forEach((font) => {\n      fonts.add(normalizeFontFamily(font))\n    })\n\n    Array.from(node.children).forEach((child) => {\n      if (child instanceof HTMLElement) {\n        traverse(child)\n      }\n    })\n  }\n  traverse(node)\n  return fonts\n}\n\nexport async function getWebFontCSS<T extends HTMLElement>(\n  node: T,\n  options: Options,\n): Promise<string> {\n  const rules = await parseWebFontRules(node, options)\n  const usedFonts = getUsedFonts(node)\n  const cssTexts = await Promise.all(\n    rules\n      .filter((rule) =>\n        usedFonts.has(normalizeFontFamily(rule.style.fontFamily)),\n      )\n      .map((rule) => {\n        const baseUrl = rule.parentStyleSheet\n          ? rule.parentStyleSheet.href\n          : null\n        return embedResources(rule.cssText, baseUrl, options)\n      }),\n  )\n\n  return cssTexts.join('\\n')\n}\n\nexport async function embedWebFonts<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  const cssText =\n    options.fontEmbedCSS != null\n      ? options.fontEmbedCSS\n      : options.skipFonts\n      ? null\n      : await getWebFontCSS(clonedNode, options)\n\n  if (cssText) {\n    const styleNode = document.createElement('style')\n    const sytleContent = document.createTextNode(cssText)\n\n    styleNode.appendChild(sytleContent)\n\n    if (clonedNode.firstChild) {\n      clonedNode.insertBefore(styleNode, clonedNode.firstChild)\n    } else {\n      clonedNode.appendChild(styleNode)\n    }\n  }\n}\n"
  },
  {
    "path": "src/index.ts",
    "content": "import { Options } from './types'\nimport { cloneNode } from './clone-node'\nimport { embedImages } from './embed-images'\nimport { applyStyle } from './apply-style'\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts'\nimport {\n  getImageSize,\n  getPixelRatio,\n  createImage,\n  canvasToBlob,\n  nodeToDataURL,\n  checkCanvasDimensions,\n} from './util'\n\nexport async function toSvg<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  const { width, height } = getImageSize(node, options)\n  const clonedNode = (await cloneNode(node, options, true)) as HTMLElement\n  await embedWebFonts(clonedNode, options)\n  await embedImages(clonedNode, options)\n  applyStyle(clonedNode, options)\n  const datauri = await nodeToDataURL(clonedNode, width, height)\n  return datauri\n}\n\nexport async function toCanvas<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<HTMLCanvasElement> {\n  const { width, height } = getImageSize(node, options)\n  const svg = await toSvg(node, options)\n  const img = await createImage(svg)\n\n  const canvas = document.createElement('canvas')\n  const context = canvas.getContext('2d')!\n  const ratio = options.pixelRatio || getPixelRatio()\n  const canvasWidth = options.canvasWidth || width\n  const canvasHeight = options.canvasHeight || height\n\n  canvas.width = canvasWidth * ratio\n  canvas.height = canvasHeight * ratio\n\n  if (!options.skipAutoScale) {\n    checkCanvasDimensions(canvas)\n  }\n  canvas.style.width = `${canvasWidth}`\n  canvas.style.height = `${canvasHeight}`\n\n  if (options.backgroundColor) {\n    context.fillStyle = options.backgroundColor\n    context.fillRect(0, 0, canvas.width, canvas.height)\n  }\n\n  context.drawImage(img, 0, 0, canvas.width, canvas.height)\n\n  return canvas\n}\n\nexport async function toPixelData<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<Uint8ClampedArray> {\n  const { width, height } = getImageSize(node, options)\n  const canvas = await toCanvas(node, options)\n  const ctx = canvas.getContext('2d')!\n  return ctx.getImageData(0, 0, width, height).data\n}\n\nexport async function toPng<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  const canvas = await toCanvas(node, options)\n  return canvas.toDataURL()\n}\n\nexport async function toJpeg<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  const canvas = await toCanvas(node, options)\n  return canvas.toDataURL('image/jpeg', options.quality || 1)\n}\n\nexport async function toBlob<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<Blob | null> {\n  const canvas = await toCanvas(node, options)\n  const blob = await canvasToBlob(canvas)\n  return blob\n}\n\nexport async function getFontEmbedCSS<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  return getWebFontCSS(node, options)\n}\n"
  },
  {
    "path": "src/mimes.ts",
    "content": "const WOFF = 'application/font-woff'\nconst JPEG = 'image/jpeg'\nconst mimes: { [key: string]: string } = {\n  woff: WOFF,\n  woff2: WOFF,\n  ttf: 'application/font-truetype',\n  eot: 'application/vnd.ms-fontobject',\n  png: 'image/png',\n  jpg: JPEG,\n  jpeg: JPEG,\n  gif: 'image/gif',\n  tiff: 'image/tiff',\n  svg: 'image/svg+xml',\n  webp: 'image/webp',\n}\n\nfunction getExtension(url: string): string {\n  const match = /\\.([^./]*?)$/g.exec(url)\n  return match ? match[1] : ''\n}\n\nexport function getMimeType(url: string): string {\n  const extension = getExtension(url).toLowerCase()\n  return mimes[extension] || ''\n}\n"
  },
  {
    "path": "src/types.ts",
    "content": "export interface Options {\n  /**\n   * Width in pixels to be applied to node before rendering.\n   */\n  width?: number\n  /**\n   * Height in pixels to be applied to node before rendering.\n   */\n  height?: number\n  /**\n   * A string value for the background color, any valid CSS color value.\n   */\n  backgroundColor?: string\n  /**\n   * Width in pixels to be applied to canvas on export.\n   */\n  canvasWidth?: number\n  /**\n   * Height in pixels to be applied to canvas on export.\n   */\n  canvasHeight?: number\n  /**\n   * An object whose properties to be copied to node's style before rendering.\n   */\n  style?: Partial<CSSStyleDeclaration>\n  /**\n   * An array of style properties to be copied to node's style before rendering.\n   * For performance-critical scenarios, users may want to specify only the\n   * required properties instead of all styles.\n   */\n  includeStyleProperties?: string[]\n  /**\n   * A function taking DOM node as argument. Should return `true` if passed\n   * node should be included in the output. Excluding node means excluding\n   * it's children as well.\n   */\n  filter?: (domNode: HTMLElement) => boolean\n  /**\n   * A number between `0` and `1` indicating image quality (e.g. 0.92 => 92%)\n   * of the JPEG image.\n   */\n  quality?: number\n  /**\n   * Set to `true` to append the current time as a query string to URL\n   * requests to enable cache busting.\n   */\n  cacheBust?: boolean\n  /**\n   * Set false to use all URL as cache key.\n   * Default: false | undefined - which strips away the query parameters\n   */\n  includeQueryParams?: boolean\n  /**\n   * A data URL for a placeholder image that will be used when fetching\n   * an image fails. Defaults to an empty string and will render empty\n   * areas for failed images.\n   */\n  imagePlaceholder?: string\n  /**\n   * The pixel ratio of captured image. Defalut is the actual pixel ratio of\n   * the device. Set 1 to use as initial-scale 1 for the image\n   */\n  pixelRatio?: number\n  /**\n   * Option to skip the fonts download and embed.\n   */\n  skipFonts?: boolean\n  /**\n   * The preferred font format. If specified all other font formats are ignored.\n   */\n  preferredFontFormat?:\n    | 'woff'\n    | 'woff2'\n    | 'truetype'\n    | 'opentype'\n    | 'embedded-opentype'\n    | 'svg'\n    | string\n  /**\n   * A CSS string to specify for font embeds. If specified only this CSS will\n   * be present in the resulting image. Use with `getFontEmbedCSS()` to\n   * create embed CSS for use across multiple calls to library functions.\n   */\n  fontEmbedCSS?: string\n  /**\n   * A boolean to turn off auto scaling for truly massive images..\n   */\n  skipAutoScale?: boolean\n  /**\n   * A string indicating the image format. The default type is image/png; that type is also used if the given type isn't supported.\n   */\n  type?: string\n\n  /**\n   *\n   *the second parameter of  window.fetch (Promise<Response> fetch(input[, init]))\n   *\n   */\n  fetchRequestInit?: RequestInit\n  /**\n   * An event handler for the error event when any image in html has problem with loading.\n   */\n  onImageErrorHandler?: OnErrorEventHandler\n}\n"
  },
  {
    "path": "src/util.ts",
    "content": "import type { Options } from './types'\n\nexport function resolveUrl(url: string, baseUrl: string | null): string {\n  // url is absolute already\n  if (url.match(/^[a-z]+:\\/\\//i)) {\n    return url\n  }\n\n  // url is absolute already, without protocol\n  if (url.match(/^\\/\\//)) {\n    return window.location.protocol + url\n  }\n\n  // dataURI, mailto:, tel:, etc.\n  if (url.match(/^[a-z]+:/i)) {\n    return url\n  }\n\n  const doc = document.implementation.createHTMLDocument()\n  const base = doc.createElement('base')\n  const a = doc.createElement('a')\n\n  doc.head.appendChild(base)\n  doc.body.appendChild(a)\n\n  if (baseUrl) {\n    base.href = baseUrl\n  }\n\n  a.href = url\n\n  return a.href\n}\n\nexport const uuid = (() => {\n  // generate uuid for className of pseudo elements.\n  // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n  let counter = 0\n\n  // ref: http://stackoverflow.com/a/6248722/2519373\n  const random = () =>\n    // eslint-disable-next-line no-bitwise\n    `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4)\n\n  return () => {\n    counter += 1\n    return `u${random()}${counter}`\n  }\n})()\n\nexport function delay<T>(ms: number) {\n  return (args: T) =>\n    new Promise<T>((resolve) => {\n      setTimeout(() => resolve(args), ms)\n    })\n}\n\nexport function toArray<T>(arrayLike: any): T[] {\n  const arr: T[] = []\n\n  for (let i = 0, l = arrayLike.length; i < l; i++) {\n    arr.push(arrayLike[i])\n  }\n\n  return arr\n}\n\nlet styleProps: string[] | null = null\nexport function getStyleProperties(options: Options = {}): string[] {\n  if (styleProps) {\n    return styleProps\n  }\n\n  if (options.includeStyleProperties) {\n    styleProps = options.includeStyleProperties\n    return styleProps\n  }\n\n  styleProps = toArray(window.getComputedStyle(document.documentElement))\n\n  return styleProps\n}\n\nfunction px(node: HTMLElement, styleProperty: string) {\n  const win = node.ownerDocument.defaultView || window\n  const val = win.getComputedStyle(node).getPropertyValue(styleProperty)\n  return val ? parseFloat(val.replace('px', '')) : 0\n}\n\nfunction getNodeWidth(node: HTMLElement) {\n  const leftBorder = px(node, 'border-left-width')\n  const rightBorder = px(node, 'border-right-width')\n  return node.clientWidth + leftBorder + rightBorder\n}\n\nfunction getNodeHeight(node: HTMLElement) {\n  const topBorder = px(node, 'border-top-width')\n  const bottomBorder = px(node, 'border-bottom-width')\n  return node.clientHeight + topBorder + bottomBorder\n}\n\nexport function getImageSize(targetNode: HTMLElement, options: Options = {}) {\n  const width = options.width || getNodeWidth(targetNode)\n  const height = options.height || getNodeHeight(targetNode)\n\n  return { width, height }\n}\n\nexport function getPixelRatio() {\n  let ratio\n\n  let FINAL_PROCESS\n  try {\n    FINAL_PROCESS = process\n  } catch (e) {\n    // pass\n  }\n\n  const val =\n    FINAL_PROCESS && FINAL_PROCESS.env\n      ? FINAL_PROCESS.env.devicePixelRatio\n      : null\n  if (val) {\n    ratio = parseInt(val, 10)\n    if (Number.isNaN(ratio)) {\n      ratio = 1\n    }\n  }\n  return ratio || window.devicePixelRatio || 1\n}\n\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384\n\nexport function checkCanvasDimensions(canvas: HTMLCanvasElement) {\n  if (\n    canvas.width > canvasDimensionLimit ||\n    canvas.height > canvasDimensionLimit\n  ) {\n    if (\n      canvas.width > canvasDimensionLimit &&\n      canvas.height > canvasDimensionLimit\n    ) {\n      if (canvas.width > canvas.height) {\n        canvas.height *= canvasDimensionLimit / canvas.width\n        canvas.width = canvasDimensionLimit\n      } else {\n        canvas.width *= canvasDimensionLimit / canvas.height\n        canvas.height = canvasDimensionLimit\n      }\n    } else if (canvas.width > canvasDimensionLimit) {\n      canvas.height *= canvasDimensionLimit / canvas.width\n      canvas.width = canvasDimensionLimit\n    } else {\n      canvas.width *= canvasDimensionLimit / canvas.height\n      canvas.height = canvasDimensionLimit\n    }\n  }\n}\n\nexport function canvasToBlob(\n  canvas: HTMLCanvasElement,\n  options: Options = {},\n): Promise<Blob | null> {\n  if (canvas.toBlob) {\n    return new Promise((resolve) => {\n      canvas.toBlob(\n        resolve,\n        options.type ? options.type : 'image/png',\n        options.quality ? options.quality : 1,\n      )\n    })\n  }\n\n  return new Promise((resolve) => {\n    const binaryString = window.atob(\n      canvas\n        .toDataURL(\n          options.type ? options.type : undefined,\n          options.quality ? options.quality : undefined,\n        )\n        .split(',')[1],\n    )\n    const len = binaryString.length\n    const binaryArray = new Uint8Array(len)\n\n    for (let i = 0; i < len; i += 1) {\n      binaryArray[i] = binaryString.charCodeAt(i)\n    }\n\n    resolve(\n      new Blob([binaryArray], {\n        type: options.type ? options.type : 'image/png',\n      }),\n    )\n  })\n}\n\nexport function createImage(url: string): Promise<HTMLImageElement> {\n  return new Promise((resolve, reject) => {\n    const img = new Image()\n    img.onload = () => {\n      img.decode().then(() => {\n        requestAnimationFrame(() => resolve(img))\n      })\n    }\n    img.onerror = reject\n    img.crossOrigin = 'anonymous'\n    img.decoding = 'async'\n    img.src = url\n  })\n}\n\nexport async function svgToDataURL(svg: SVGElement): Promise<string> {\n  return Promise.resolve()\n    .then(() => new XMLSerializer().serializeToString(svg))\n    .then(encodeURIComponent)\n    .then((html) => `data:image/svg+xml;charset=utf-8,${html}`)\n}\n\nexport async function nodeToDataURL(\n  node: HTMLElement,\n  width: number,\n  height: number,\n): Promise<string> {\n  const xmlns = 'http://www.w3.org/2000/svg'\n  const svg = document.createElementNS(xmlns, 'svg')\n  const foreignObject = document.createElementNS(xmlns, 'foreignObject')\n\n  svg.setAttribute('width', `${width}`)\n  svg.setAttribute('height', `${height}`)\n  svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n\n  foreignObject.setAttribute('width', '100%')\n  foreignObject.setAttribute('height', '100%')\n  foreignObject.setAttribute('x', '0')\n  foreignObject.setAttribute('y', '0')\n  foreignObject.setAttribute('externalResourcesRequired', 'true')\n\n  svg.appendChild(foreignObject)\n  foreignObject.appendChild(node)\n  return svgToDataURL(svg)\n}\n\nexport const isInstanceOfElement = <\n  T extends typeof Element | typeof HTMLElement | typeof SVGImageElement,\n>(\n  node: Element | HTMLElement | SVGImageElement,\n  instance: T,\n): node is T['prototype'] => {\n  if (node instanceof instance) return true\n\n  const nodePrototype = Object.getPrototypeOf(node)\n\n  if (nodePrototype === null) return false\n\n  return (\n    nodePrototype.constructor.name === instance.name ||\n    isInstanceOfElement(nodePrototype, instance)\n  )\n}\n"
  },
  {
    "path": "test/resources/bgcolor/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABAUlEQVR4nO3RsQ0AIADDsP7/NJxBhDx4r5ptOz84n9jrIwURJE2QGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBIkRJEaQGEFiBInZ6wEIkiZIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEiNIjCAxgsQIEnMB2SoboVG5JJoAAAAASUVORK5CYII=\n"
  },
  {
    "path": "test/resources/bgcolor/node.html",
    "content": "<div id=\"content\"></div>\n"
  },
  {
    "path": "test/resources/bgcolor/style.css",
    "content": "#dom-node {\n  height: 100px;\n  width: 100px;\n}\n\n#content {\n  height: 50px;\n  width: 50px;\n  background-color: black;\n}\n"
  },
  {
    "path": "test/resources/bigger/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABjCAYAAABt56XsAAAB10lEQVR4Xu3dgW3CQBAAQegHV0OdVPP0A7IRj54KRvKmggujnLxvO1zHGK9LP8wncN1BbtvGDHTmQZ5jXA6QM38I2u8eCCZygGyPVpbgMu6tLMFhmaGVhZF8VtZ2w8Y65zhjPLvK0uhbWZhIYQiBFIYQxneUVhaGUhhCIIUhhNHKAjH2kQpDCKYwhDBaWSDGXFndMTR0CkPDoeN30GGOVBhCOoUhhNFVFohRGGIohSEGMv9CwLlOO1J3DCH6whDC6CoLxPhdZfUoKcFTGBIM6xA95IChdMcQAikMIYyuskCM7hhiKIUhBtJZlgrSO4aGTGFoOCxTFIYYSmEIgRSGEEZhCGIUhhhKYYiBFIYqSGFoyBSGhkNhCDrMkQpDSKcwhDAKQxCjMMRQCkMMpDBUQQpDQ6YwNBwKQ9ChMBRRCkNQpYccMJTeMYRACkMIo7MsEGOWemFo6BSGhkNhCDoUhiJKYQiqFIYYSmEIgRSGEEZhCGIUhhhKYYiB9JCDCtL3GBoyhaHh0FkW6LCeZfV1FQZRYWg4tLJAh7/j9/4rKWFUGBIM6xAdv2MovWMIgRSGEEbH7yDGPFwsDA2dwtBwKAxBh8JQRCkMQZXCEEMpDCGQwhDC+I7yBsViutvRkyz3AAAAAElFTkSuQmCC\n"
  },
  {
    "path": "test/resources/bigger/node.html",
    "content": "<div class=\"dom-child-node\">\n  <div class=\"red\"></div>\n  <div class=\"green\"></div>\n  <div class=\"blue\"></div>\n</div>\n"
  },
  {
    "path": "test/resources/bigger/style.css",
    "content": "#dom-node {\n  width: 100px;\n}\n\n.child-node {\n  height: auto;\n}\n\n.red {\n  background-color: red;\n}\n\n.green {\n  background-color: green;\n}\n\n.blue {\n  background-color: blue;\n}\n\n.red,\n.green,\n.blue {\n  height: 3px;\n  border: 1px solid lightgrey;\n}\n"
  },
  {
    "path": "test/resources/border/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAACBElEQVR4Xu3dQQrDQAzAwPT/j25pX2DoYHxQzkZrJJaQU17P87yfnjMGXgU50+K3SEFu9SjIsR4FKcg1A8f26R1SkGMGjq3TDSnIMQPH1hnfkD7n/yv3FT15CjKxBGYKAiRKREGkTcAqCJAoEQWRNgGrIECiRBRE2gSsggCJElEQaROwCgIkSkRBpE3AKgiQKBEFkTYBqyBAokQURNoErIIAiRJREGkTsAoCJEpEQaRNwCoIkCgRBZE2AasgQKJEFETaBKyCAIkSURBpE7AKAiRKREGkTcAqCJAoEQWRNgGrIECiRBRE2gSsggCJElEQaROwCgIkSkRBpE3AKgiQKBEFkTYBqyBAokQURNoErIIAiRJREGkTsAoCJEpEQaRNwCoIkCgRBZE2AasgQKJEFETaBKyCAIkSURBpE7AKAiRKREGkTcAqCJAoEQWRNgGrIECiRBRE2gSsggCJElEQaROwCgIkSkRBpE3AKgiQKBEFkTYBqyBAokQURNoErIIAiRJREGkTsAoCJEpEQaRNwCoIkCgRBZE2AasgQKJEFETaBKyCAIkSURBpE7AKAiRKREGkTcAqCJAoEQWRNgGrIECiRBRE2gQsHgTsFGJg4Buuf9cPRG2NFGTL9PCcggxFbY0VZMv08JyCDEVtjRVky/TwnIIMRW2NFWTL9PCcggxFbY19AL3RtAEdMr15AAAAAElFTkSuQmCC"
  },
  {
    "path": "test/resources/border/node.html",
    "content": ""
  },
  {
    "path": "test/resources/border/style.css",
    "content": "#dom-node {\n  font-size: 16px;\n  width: 100px;\n  height: 100px;\n  background-color: red;\n  border-color: black;\n  border: solid;\n  border-width: 10px 10px 0.625em 10px;\n}\n"
  },
  {
    "path": "test/resources/canvas/image",
    "content": "data:image/png;base64,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\n"
  },
  {
    "path": "test/resources/canvas/node.html",
    "content": "<canvas id=\"content\"></canvas>\n"
  },
  {
    "path": "test/resources/canvas/style.css",
    "content": "#dom-node {\n  height: 100px;\n  width: 200px;\n}\n\n#content {\n  height: 100px;\n  width: 200px;\n}\n"
  },
  {
    "path": "test/resources/css-bg/node.html",
    "content": "<div class=\"with-background\"></div>\n"
  },
  {
    "path": "test/resources/css-bg/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 100px;\n}\n.with-background {\n  background: url(/base/test/resources/images/image.jpeg) no-repeat left top;\n  background-size: 100px 100px;\n  width: 100px;\n  height: 100px;\n}\n"
  },
  {
    "path": "test/resources/custom-element/image",
    "content": "data:image/png;base64,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\n"
  },
  {
    "path": "test/resources/custom-element/node.html",
    "content": "<math-field\n  value=\"S_{\\triangle }=\\frac{ab\\sin \\left(\\gamma \\right)}{2}\"\n  scrollingelement=\"[object HTMLHtmlElement]\"\n  class=\"math no-touch\"\n  role=\"textbox\"\n  tabindex=\"0\"\n  read-only=\"\"\n  >S_{\\triangle }=\\frac{ab\\sin \\left(\\gamma \\right)}{2}\n</math-field>\n"
  },
  {
    "path": "test/resources/custom-element/style.css",
    "content": "#dom-node {\n  width: 200px;\n  height: 100px;\n}\n"
  },
  {
    "path": "test/resources/dimensions/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFJklEQVR4Xu3VsRGAQAwEsaf/oqEBINj0RO7A8u9w3efcx0eAwKvAJRAvg8C3gEC8DgI/AgLxPAgIxBsg0AT8QZqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIwAOn4Y9IyHT+ZAAAAABJRU5ErkJggg=="
  },
  {
    "path": "test/resources/dimensions/node.html",
    "content": ""
  },
  {
    "path": "test/resources/dimensions/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 100px;\n  background-color: red;\n}\n"
  },
  {
    "path": "test/resources/ext-css/node.html",
    "content": "<link\n  href=\"http://fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,400,600\"\n  crossorigin=\"anonymous\"\n  rel=\"stylesheet\"\n/>\n"
  },
  {
    "path": "test/resources/ext-css/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 100px;\n  background-color: black;\n}\n"
  },
  {
    "path": "test/resources/filter/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABbUlEQVR4Xu3VgQkAIAzEwHb/oRWc4sA4QUj6uDPnTI8xsAVhWjyQglg9CoL1KEhBNAMYT39IQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcxXi+xykIdgIFKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00IKghnAcFpIQTADGM4FBilkAQH5WFMAAAAASUVORK5CYII=\n"
  },
  {
    "path": "test/resources/filter/node.html",
    "content": "<div class=\"include\"></div>\n<div class=\"omit\"></div>\n"
  },
  {
    "path": "test/resources/filter/style.css",
    "content": "#dom-node {\n  width: 100px;\n}\n\n.include {\n  height: 50px;\n  background-color: blue;\n}\n\n.omit {\n  height: 50px;\n  background-color: red;\n}\n"
  },
  {
    "path": "test/resources/fonts/node.html",
    "content": "<link\n  rel=\"stylesheet\"\n  href=\"/base/node_modules/@fortawesome/fontawesome-free/css/all.css\"\n/>\n<i class=\"fab fa-apper\"></i>\n"
  },
  {
    "path": "test/resources/fonts/style.css",
    "content": "#dom-node {\n  padding: 16px;\n  width: 100px;\n  height: 100px;\n  font-size: 60px;\n  background-color: white;\n}\n"
  },
  {
    "path": "test/resources/fonts/web-fonts/embedded.css",
    "content": "@font-face {\n  font-family: 'Font1';\n  src: url('data:application/x-font-woff2;base64,AAA') format('woff2'),\n    local(Arial);\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "test/resources/fonts/web-fonts/empty.html",
    "content": "<div style=\"font-family: Font1\"></div>\n"
  },
  {
    "path": "test/resources/fonts/web-fonts/remote.css",
    "content": "@font-face {\n  font-family: 'Font1';\n  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2')\n      format('woff2'),\n    url('https://fonts.gstatic.com/s/raleway/v28/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCFPrcVIT9d0c-dYA.woff')\n      format('woff'),\n    local(Arial);\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "test/resources/fonts/web-fonts/rules-relative.css",
    "content": "@font-face {\n  font-family: 'Font1';\n  src: url('../font1.woff') format('woff');\n}\n@font-face {\n  font-family: 'Font2';\n  src: url('font2.woff2') format('woff2');\n}\n"
  },
  {
    "path": "test/resources/fonts/web-fonts/rules-relative.html",
    "content": "<link\n  rel=\"stylesheet\"\n  href=\"/base/resources/fonts/web-fonts/rules-relative.css\"\n/>\n"
  },
  {
    "path": "test/resources/fonts/web-fonts/rules.css",
    "content": "@font-face {\n  font-family: 'Font1';\n  src: url('https://fonts.gstatic.com/s/raleway/v28/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCFPrcVIT9d0c-dYA.woff')\n      format('woff'),\n    url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2')\n      format('woff2'),\n    local('Arial');\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: 'Font2';\n  src: url('http://fonts.com/font2.ttf?v1.1.3') format('truetype'),\n    local('Ubuntu');\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: 'Font3';\n  src: url('data:font/woff2;base64,AAA') format('woff2'), local('Ubuntu');\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: 'Font4';\n  src: local('Comic Sans');\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "test/resources/fonts/web-fonts/with-query.css",
    "content": "@font-face {\n  font-family: 'Font1';\n  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2?v=4.3.0')\n      format('woff2'),\n    local(Arial);\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "test/resources/hash/node.html",
    "content": "<div class=\"red\" data-stroke=\"#234\"></div>\n<div class=\"green\"></div>\n<div class=\"blue\"></div>\n"
  },
  {
    "path": "test/resources/hash/style.css",
    "content": "#dom-node {\n  width: 100px;\n}\n\n.red {\n  background-color: #ff0000;\n}\n\n.green {\n  background-color: green;\n}\n\n.blue {\n  background-color: #0000ff;\n}\n\n.red,\n.green,\n.blue {\n  height: 3px;\n  border: 1px solid lightgrey;\n}\n"
  },
  {
    "path": "test/resources/images/loading.html",
    "content": "<div>\n  <div>\n    <img src=\"/base/test/resources/images/image.jpeg\" loading=\"lazy\" />\n  </div>\n  <span>\n    <img src=\"/base/test/resources/images/image.png\" loading=\"lazy\" />\n  </span>\n</div>\n"
  },
  {
    "path": "test/resources/images/node.html",
    "content": "<div>\n  <div>\n    <img src=\"/base/test/resources/images/image.jpeg\" />\n  </div>\n  <span>\n    <img src=\"/base/test/resources/images/image.png\" />\n  </span>\n</div>\n"
  },
  {
    "path": "test/resources/images/style.css",
    "content": "#dom-node {\n  width: 300px;\n  height: 300px;\n  background-color: white;\n}\n"
  },
  {
    "path": "test/resources/input/node.html",
    "content": "<input id=\"input\" />\n"
  },
  {
    "path": "test/resources/input/style.css",
    "content": "#dom-node {\n  width: 400px;\n  background-color: white;\n  padding: 1em;\n}\ninput {\n  height: 100%;\n  width: 100%;\n  font-family: monospace;\n  font-size: 20px;\n  border: 1px solid grey;\n  padding: 1em;\n}\n"
  },
  {
    "path": "test/resources/page.html",
    "content": "<style>\n  * {\n    box-sizing: border-box;\n  }\n</style>\n\n<style id=\"style\"></style>\n\n<div>\n  <h2>DOM Node</h2>\n  <div id=\"dom-node\"></div>\n</div>\n\n<div>\n  <h2>Captured Image</h2>\n  <canvas id=\"canvas\"></canvas>\n</div>\n\n<div>\n  <h2>Reference Image</h2>\n  <img id=\"ref-image\" />\n</div>\n"
  },
  {
    "path": "test/resources/pixeldata/node.html",
    "content": "<div id=\"dom-node\">\n  <div class=\"pixel top left\"></div>\n  <div class=\"pixel top center\"></div>\n  <div class=\"pixel top right\"></div>\n  <div class=\"pixel middle left\"></div>\n  <div class=\"pixel middle center\"></div>\n  <div class=\"pixel middle right\"></div>\n  <div class=\"pixel bottom left\"></div>\n  <div class=\"pixel bottom center\"></div>\n  <div class=\"pixel bottom right\"></div>\n</div>\n"
  },
  {
    "path": "test/resources/pixeldata/style.css",
    "content": ".pixel {\n  width: 10px;\n  height: 10px;\n  float: left;\n}\n.top {\n  background-color: rgb(255, 0, 0);\n}\n.middle {\n  background-color: rgb(0, 255, 0);\n}\n.bottom {\n  background-color: rgb(0, 0, 255);\n}\n.left {\n  clear: left;\n}\n.center {\n  opacity: 0.4;\n}\n.right {\n  opacity: 0.2;\n}\n#dom-node {\n  width: 30px;\n  height: 30px;\n}\n"
  },
  {
    "path": "test/resources/placeholder/image",
    "content": "data: image / png; base64, iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAAAXNSR0IArs4c6QAAErpJREFUeF7tnQdsV9UXx0 / dWveWOhGVqbhNGlONUkXrHlVqiuCKGgfuusVRF2hE48IBsWDjQoIjaGKiNpq4UEFxoajg3nvWfI459fGzpa / 9rfveOy / 5p / 75vXfffeee7z3jnlFRWVnZLiKyyiqrSHV1tfz999 / 8X7 + cApmkwBJLLCFtbW3y3Xff6fdXVFdXt19xxRVy9913Cz + eeuqp0qdPH1l++eUzSSD / 6GxS4JdffpGFCxfK9ddfr0LiyCOPlHPPPVcqampq2u + 8805Zd911ZcGCBdLa2iqffvqpnH766VJVVSVLL720VFRUZJNq / tWppkB7e7v88ccfyvfjxo1TDNTX1yvfg4HRo0f / C5BJkybJRhttJDzw888 / y9y5c2XGjBny008 / SUNDg / Tr108qKytTTSz / uGxRAN5 + 9913paWlRXm7rq5O + vfvLyussIIKhPnz58vIkSMXBYiRCBHz++ + /y5w5c3SAddZZR2pra2WLLbaQZZddVpZccslsUdO/NhUU + Ouvv + S3336Tt956S2bOnCmfffaZCoBBgwbJMsssoyaGXYsFSJQav / 76q3z88cdy3nnnyXrrrScnnXSS / l1uueUWGTAVFPSPSCUF2PDh408++UQmTJigfy +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\n"
  },
  {
    "path": "test/resources/placeholder/node.html",
    "content": "<img src=\"./bg.jpg\" />\n"
  },
  {
    "path": "test/resources/placeholder/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 50px;\n}\n\n#dom-node img {\n  width: 100px;\n  height: 50px;\n}\n"
  },
  {
    "path": "test/resources/pseudo/node.html",
    "content": "<div class=\"with-before\"></div>\n<div class=\"with-after\"></div>\n<div class=\"with-both\"></div>\n"
  },
  {
    "path": "test/resources/pseudo/style.css",
    "content": ".with-before::before {\n  content: 'JUSTBEFORE';\n}\n.with-after::after {\n  content: 'JUSTAFTER';\n}\n.with-both::before {\n  content: 'BOTHBEFORE';\n}\n.with-both::after {\n  content: 'BOTHAFTER';\n}\n\n#dom-node {\n  background-color: white;\n  font-family: sans-serif;\n  font-size: 20px;\n}\n"
  },
  {
    "path": "test/resources/scale/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFOklEQVR4Xu3TwQ2EMBRDwaVzGko1FMQW8W5mcv+RPJav53ne34feOedDaUWtApeBVEL3ywIGstyubFnAQDKhD5YFDGS5XdmygIFkQh8sCxjIcruyZQEDyYQ+WBYwkOV2ZcsCBpIJfbAsYCDL7cqWBQwkE/pgWcBAltuVLQsYSCb0wbKAgSy3K1sWMJBM6INlAQNZble2LGAgmdAHywIGstyubFnAQDKhD5YFDGS5XdmygIFkQh8sCxjIcruyZQEDyYQ+WBYwkOV2ZcsCBpIJfbAsYCDL7cqWBQwkE/pgWcBAltuVLQsYSCb0wbKAgSy3K1sWMJBM6INlAQNZble2LGAgmdAHywIGstyubFnAQDKhD5YFDGS5XdmygIFkQh8sCxjIcruyZQEDyYQ+WBYwkOV2ZcsCBpIJfbAsYCDL7cqWBQwkE/pgWcBAltuVLQsYSCb0wbKAgSy3K1sWMJBM6INlAQNZble2LGAgmdAHywIGstyubFnAQDKhD5YFDGS5XdmygIFkQh8sCxjIcruyZQEDyYQ+WBYwkOV2ZcsCBpIJfbAsYCDL7cqWBQwkE/pgWeC67/tdDigbgSJgIEXP7byAgcxXLGARMJCi53ZewEDmKxawCBhI0XM7L2Ag8xULWAQMpOi5nRcwkPmKBSwCBlL03M4LGMh8xQIWAQMpem7nBQxkvmIBi4CBFD238wIGMl+xgEXAQIqe23kBA5mvWMAiYCBFz+28gIHMVyxgETCQoud2XsBA5isWsAgYSNFzOy9gIPMVC1gEDKTouZ0XMJD5igUsAgZS9NzOCxjIfMUCFgEDKXpu5wUMZL5iAYuAgRQ9t/MCBjJfsYBFwECKntt5AQOZr1jAImAgRc/tvICBzFcsYBEwkKLndl7AQOYrFrAIGEjRczsvYCDzFQtYBAyk6LmdFzCQ+YoFLAIGUvTczgsYyHzFAhYBAyl6bucFDGS+YgGLgIEUPbfzAgYyX7GARcBAip7beQEDma9YwCJgIEXP7byAgcxXLGARMJCi53ZewEDmKxawCBhI0XM7L2Ag8xULWAQMpOi5nRcwkPmKBSwCBlL03M4LGMh8xQIWAQMpem7nBQxkvmIBi4CBFD238wIGMl+xgEXAQIqe23kBA5mvWMAiYCBFz+28gIHMVyxgETCQoud2XsBA5isWsAgYSNFzOy9gIPMVC1gEDKTouZ0XMJD5igUsAgZS9NzOCxjIfMUCFgEDKXpu5wUMZL5iAYuAgRQ9t/MCBjJfsYBFwECKntt5AQOZr1jAImAgRc/tvICBzFcsYBEwkKLndl7AQOYrFrAIGEjRczsvYCDzFQtYBAyk6LmdFzCQ+YoFLAIGUvTczgsYyHzFAhYBAyl6bucFDGS+YgGLgIEUPbfzAgYyX7GARcBAip7beQEDma9YwCJgIEXP7byAgcxXLGARMJCi53ZewEDmKxawCBhI0XM7L2Ag8xULWAQMpOi5nRcwkPmKBSwCBlL03M4LGMh8xQIWAQMpem7nBQxkvmIBi4CBFD238wIGMl+xgEXAQIqe23kBA5mvWMAiYCBFz+28gIHMVyxgETCQoud2XsBA5isWsAgYSNFzOy9gIPMVC1gEDKTouZ0XMJD5igUsAgZS9NzOCxjIfMUCFgEDKXpu5wUMZL5iAYuAgRQ9t/MCBjJfsYBFwECKntt5AQOZr1jAImAgRc/tvICBzFcsYBEwkKLndl7AQOYrFrAIGEjRczsvYCDzFQtYBAyk6LmdFzCQ+YoFLAIGUvTczgsYyHzFAhYBAyl6bucF/iqvqB9WL0mLAAAAAElFTkSuQmCC"
  },
  {
    "path": "test/resources/scale/node.html",
    "content": "<div id=\"child\"></div>\n"
  },
  {
    "path": "test/resources/scale/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 100px;\n  background-color: grey;\n}\n\n#child {\n  height: 30px;\n  width: 30px;\n  background-color: lightgrey;\n}\n"
  },
  {
    "path": "test/resources/scroll/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABa0lEQVR4Xu3VwQkAQAjEQO2/aA+uijzGCkLC4s7cjcsYWEEyLT6IIK0egsR6CCJIzUCMxw8RJGYghmMhgsQMxHAsRJCYgRiOhQgSMxDDsRBBYgZiOBYiSMxADMdCBIkZiOFYiCAxAzEcCxEkZiCGYyGCxAzEcCxEkJiBGI6FCBIzEMOxEEFiBmI4FiJIzEAMx0IEiRmI4ViIIDEDMRwLESRmIIZjIYLEDMRwLESQmIEYjoUIEjMQw7EQQWIGYjgWIkjMQAzHQgSJGYjhWIggMQMxHAsRJGYghmMhgsQMxHAsRJCYgRiOhQgSMxDDsRBBYgZiOBYiSMxADMdCBIkZiOFYiCAxAzEcCxEkZiCGYyGCxAzEcCxEkJiBGI6FCBIzEMOxEEFiBmI4FiJIzEAMx0IEiRmI4ViIIDEDMRwLESRmIIZjIYLEDMRwLESQmIEYjoUIEjMQw7EQQWIGYjgWIkjMQAzHQgSJGYjhPE5Hx53K44yoAAAAAElFTkSuQmCC\n"
  },
  {
    "path": "test/resources/scroll/node.html",
    "content": "<div id=\"scrolled\"></div>\n"
  },
  {
    "path": "test/resources/scroll/style.css",
    "content": "#dom-node {\n  width: 50px;\n  height: 50px;\n  overflow: auto;\n}\n\n#scrolled {\n  width: 100px;\n  height: 100px;\n  background-color: blue;\n}\n"
  },
  {
    "path": "test/resources/select/first",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAAAXNSR0IArs4c6QAAA3JJREFUaEPtmTtIa0EQhv9jEomi8W2VxlLFF1YihIhaiAqx1M4ihQ/QwieCGkSDsZBAQGxVUASx0UIRtDBoaQixFgtRRLDw1d3LLCRE71X2qBlz4p4qCbM7u9+XndkQbWRk5A9++ePz+bRkQaCRkPn5+WRZD/s6RkdHoYSwY38/oRKSRDJoKYYRcn19je3tbTw8PKCqqgpFRUWoqanRjfP5+RkZGRm6x3ENMIyQhoYGnJ+fo6mpCY+PjygtLYXX69XFaWJiAllZWRgfH9c1jjPYMEJsNhuWl5fR2dmJp6cnpKWlwWq16mLV2NgohHIKmZ6exuDgIHJzc1+t9f7+Hn6/H1NTU68+N4SQuro6nJ6eori4GAMDA7i5uUFJSYnYaF9fnyhBq6urKCsrw9raGtxuN46Pj5GTk4Ouri7MzMxgcXERY2NjyM7OxtDQECYnJ3XJ/EwwyfB4PKiursbh4WFMCsmgE392diaEUFz0MYQQKlXl5eUIBALo6OhAb29vrGS1tbVhd3dXAM/Pz8fJyQkikYiIvbq6QktLC9bX1+FwOOByuUByh4eHYbfbP8NY1xgC73Q6EQqFYlJogqgM6oVHR0evTo8hhNAmNE3Dzs4OWltbBdhoDyEhmZmZ2NzcFLBI1t7eHmZnZ9Hc3IyXlxcUFBSI8vYTJeutFFojnYz/yTDULesjIRUVFbEGf3t7i56eHmxtbQlBJIV6D5W4nxBCa4iXQu/fk5EyQmpra0WtpiccDoveQafi4OAA/f39okSsrKz8mJB4KfT6bZmKr4MpUbLihXR3d+Pi4kL0DbPZjPb2dlRWVopTQqUuLy8PCwsLKCws1NUPviOYTgo9b29chhRC116CHO0hdKOam5sD9ZB4IZeXl+JmFQwGxT7r6+uxsbEhmvjS0pLoMVTG9vf3v4Pxt89hmBOid+d3d3cwmUz/fBvpR6XFYkF6erreKVniU1YIC70EJFFCEgD1K1MqIV+hl4CxSSkkAfs01JRJ9QeVocj9gsUmzX/Jv4C11BaVEClMfEFKCB9rqUxKiBQmviAlhI+1VCYlRAoTX5ASwsdaKpMSIoWJL0gJ4WMtlUkJkcLEF6SE8LGWyqSESGHiC1JC+FhLZVJCpDDxBSkhfKylMikhUpj4gpQQPtZSmZQQKUx8QUoIH2upTEqIFCa+oL93XZA4iVClpQAAAABJRU5ErkJggg==\n"
  },
  {
    "path": "test/resources/select/first-option.html",
    "content": "<select>\n  <option selected>first</option>\n  <option>second</option>\n  <option>third</option>\n</select>\n"
  },
  {
    "path": "test/resources/select/second",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAAAXNSR0IArs4c6QAABKZJREFUaEPtmVkormsUx5eQebpBkpKp7EK4ciEujBlSQgnZGZIIF4aQKcRuy0wRtgvbkEQhN7gxJRluKIlMF8o2tUWGc/qv0yefDGdHer5znlXi87zv8673/1v/tR5Ry87O/ov+51FdXa0migRqAFJVVSVKPp+eR05ODkkgny77yw+UQASCgVQkkHcC2djYoN3dXfL19X3nTv/cLoG8U8ampibq6OigpaWld+4kgXyIgG8BKS4upoyMDDI2NlZ63unpKdXV1VFRUZHS71XCIbe3t5SZmUk/fvzg5P39/am2tpYsLCzo+vqaSktLqbu7m87OzigiIoK+fftGJiYmdH9/zy/c09PD90VGRvK1GhoatLi4SG1tbdTb20vW1tYE4cLCwvg6Nzc3io2N5crf3t6m0NBQgvCGhoZ0dXVFWVlZNDg4SObm5mRnZ8fXPOcQ7FlSUkIuLi40NTX1AAUwvL29aWVlhfPDdYpQCSAQLSkpicbGxkhHR4fF8vT0pJaWFsrPz6f29nZqbGwkfX19ys3NJQcHB+rv7+eXbW1tpZqaGrKysqLw8HAWKD4+nj8HBQVRYmIiDQ0N4ahJMzMz5OHhQWpqamRqakrNzc2kra3N19XX11NaWhp/IQ9U9/7+PqWkpJCrq+uzQCC8l5cXra6uPkCB8AoYzs7OND09reQelQDS19dHUVFRLEpgYCAZGRmRpqYmf0fVQmBULWJiYoKSk5Pp5OSEKx2uqKio4LXZ2Vl2zc7ODsXExNDl5SUDRtjY2PBgBmQAgXsSEhJ4LSQkhGxtben79+/8TFS04nlw5NbW1osz5CkU7AdnPAdDZYY6WlZBQQFX7MXFBdnb23MLcXd359aEMDAwUOrFqDwAGRkZoeDgYKU1VDVOR2gjioD4h4eHXP0Agu8BAQG8DHiYAYWFhWRmZsb3ofIRcGZnZ+erQ/0xFNzzEgyVAbK3t8cV7+joSAsLC1RWVkbLy8t0cHDATkFLwoxBYI6sr69zG9HS0mJ35OXl8drk5CRtbm7S0dERz5lfv37xPEF8+fKF/Pz8eC8AGR8f51n1GAjalLq6OkNITU3lNbQwOO+tU5YCCu552qYeV4tKtKyuri5KT0+nubk5HsBwy/DwMLeK6Ohomp+f58GN2YFZg98DHKoew/vnz59c4T4+PryO6oa7Kisr+TNchLancNNLQBoaGtgta2trvOf5+TkPfEtLyzeBQHRAQTw9cakcELSsuLi4h9MSBu7AwAAPdlT7169faXR0lN8LYqOSnZyceA0HAMwVRaVjyOvq6vIJCsdRtEC0u/Lycq52BIDgHsUfe4qWBSCAgHkGByEA+fj4+F8BeSz8Sz+rhEMUyf/+/ZsFxHHzaWDt5ubm2epDG0Nr0tPTU7rt7u6OoWE/QPiTQAsFWLTFjwyVAvKRLy7qXhKIYGQkEAnkVQX4H1SCafTp6Qj1D6pPf3v5wNcdIvURS4E/O3uKlft/MhsJRDCsEogEIpgCgqUjHSKBCKaAYOlIh0gggikgWDrSIRKIYAoIlo50iAQimAKCpSMdIoEIpoBg6UiHSCCCKSBYOtIhEohgCgiWjnSIYED+BpSYaEcn+mrLAAAAAElFTkSuQmCC\n"
  },
  {
    "path": "test/resources/select/second-option.html",
    "content": "<select>\n  <option>first</option>\n  <option selected>second</option>\n  <option>third</option>\n</select>\n"
  },
  {
    "path": "test/resources/select/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 40px;\n}\n"
  },
  {
    "path": "test/resources/select/third",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAAAXNSR0IArs4c6QAAA3xJREFUaEPtmU0odGEUx/+ToXwUWSiNhQUL8pmUjMVYKhQbJbFnwWxM2fgqH5OaRA01U77K18JC2BBpFpNSviY2ymoWksiK5H07T9E1M7y3dMe5vedsZu7tmfuc+//d/zlnupbe3t4/+M/D7XZbuEhgISDj4+Nc8ol7Hi6XCwIk7rJ/vaEAYQSDUjENkLe3N7y+viIpKQkHBwdIT09HeXl5lJyXl5e4ublBXV2dLqnX19dRU1OD7OxsXeuNXmQKIATDbrdjYmJCfTY2NqKoqAgjIyNR+kxNTWFxcRFHR0e6tLNYLNje3tYNUNdFf7DIFEDIGYmJiQgEAv8E8vz8rJyUmpqqSxajgQwMDKCnpwcZGRmf8nl4eMDk5CT6+/s/nTcFkObmZmxsbCAnJwczMzOYnZ1VN/H09ITj42NUVlbC7/cjNzcXS0tL2NrawvLyMrq6upCcnKwcU1hYiL29Pezu7mJoaAhnZ2fo6OjA9PS0YQ4hGIODgygrK8P+/v4HFIJRW1uLk5MTBYTWvYcpgFxdXaGgoADz8/NoaGhQQm5ubsLn8yEvLw+dnZ2qhK2urkJbsurr6xUcj8eDzMxMVFdXIz8/H06nE01NTRgdHcXOzo5hQEh4h8OB09PTDygk/DuM0tJS1Q+17jEFkFgli558AkDhdrsVrFAoFAUkJSUFa2trap3X61XwXl5eVAk8Pz9HSUmJYUBoz0godI6cEQuGaaasWECoBI2NjSmh5+bmMDw8jOvr6yggxcXFygkU5AwqcYeHh+qYhoWEhARDgURCoeOvYJgaiHbK+g5IRUWFquMU1C/6+vpwf38Pq9WKcDgMm81mOBAtFPoeWaa0Xd0UJYsSpmmISk5bWxtaW1s/jb16gVxcXIAcQ+Nze3u7cg71l3iNvVS+KCInLlMCaWlpUb2ARAwGg0pYKlMUCwsLygWxSpbWIbR2ZWUF3d3duL29RVVVleo71Iv0/pHUimfEd9M4hG7+8fERaWlpqu7/JKh33N3dISsr6yeXMeS3pgJiiALMLipABMi3Csj7EI7vQ5g9tHFPh9ULqrjfvWz4fckSfXgpwOblPi9Zfi8bAfJ72sfcWYAIEGYKMEtHHCJAmCnALB1xiABhpgCzdMQhAoSZAszSEYcIEGYKMEtHHCJAmCnALB1xiABhpgCzdMQhAoSZAszSEYcwA/IXhpr/ON427icAAAAASUVORK5CYII=\n"
  },
  {
    "path": "test/resources/select/third-option.html",
    "content": "<select>\n  <option>first</option>\n  <option>second</option>\n  <option selected>third</option>\n</select>\n"
  },
  {
    "path": "test/resources/sheet/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABa0lEQVR4Xu3VwQkAQAjEQO2/aA+uijzGCkLC4t7MjcsYWEEyLT6IIK0egsR6CCJIzUCMxw8RJGYghmMhgsQMxHAsRJCYgRiOhQgSMxDDsRBBYgZiOBYiSMxADMdCBIkZiOFYiCAxAzEcCxEkZiCGYyGCxAzEcCxEkJiBGI6FCBIzEMOxEEFiBmI4FiJIzEAMx0IEiRmI4ViIIDEDMRwLESRmIIZjIYLEDMRwLESQmIEYjoUIEjMQw7EQQWIGYjgWIkjMQAzHQgSJGYjhWIggMQMxHAsRJGYghmMhgsQMxHAsRJCYgRiOhQgSMxDDsRBBYgZiOBYiSMxADMdCBIkZiOFYiCAxAzEcCxEkZiCGYyGCxAzEcCxEkJiBGI6FCBIzEMOxEEFiBmI4FiJIzEAMx0IEiRmI4ViIIDEDMRwLESRmIIZjIYLEDMRwLESQmIEYjoUIEjMQw7EQQWIGYjgWIkjMQAzHQgSJGYjhPBWOx51YKJcYAAAAAElFTkSuQmCC\n"
  },
  {
    "path": "test/resources/sheet/node.html",
    "content": "<link rel=\"stylesheet\" href=\"/base/test/resources/sheet/sheet.css\" />\n"
  },
  {
    "path": "test/resources/sheet/sheet.css",
    "content": "#dom-node {\n  background-color: red;\n}\n"
  },
  {
    "path": "test/resources/sheet/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 100px !important;\n}\n\n#root {\n  border: none !important;\n}\n"
  },
  {
    "path": "test/resources/small/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAJCAYAAADEiInQAAAAQElEQVRIie3WsQ0AMQzDQI3+O3IgfREgK0QFi5uAkOEA1Y4AbaIBN4h2GGRMgOaLBriQQQYZc07W+wdDqQtZ9ANeMk+9LbUR+gAAAABJRU5ErkJggg==\n"
  },
  {
    "path": "test/resources/small/image-jpeg",
    "content": "data:image/jpeg;base64,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"
  },
  {
    "path": "test/resources/small/image-jpeg-low",
    "content": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCAAJAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDRnurdZ5Fa5tgQxBB1J1I59O30qP7Xa/8AP1a/+DR63aKfLT7P8P8AIfPU/mZhfa7X/n6tf/Bo9H2u1/5+rX/waPW7RRy0+z+9f5D9pV/nZhfa7X/n6tf/AAaPR9rtf+fq1/8ABo9btFHLT7P71/kHtKv87ML7Xa/8/Vr/AODR6Ptdr/z9Wv8A4NHrdoo5afZ/ev8AIPaVf52YX2u1/wCfq1/8Gj0fa7X/AJ+rX/waPW7RRy0+z+9f5B7Sr/OzC+12v/P1a/8Ag0ej7Xa/8/Vr/wCDR63aKOWn2f3r/IPaVf52VNOkjlgZo5I5BuxlLgzDoO5/lRVuilp0Ju3uf//Z"
  },
  {
    "path": "test/resources/small/node.html",
    "content": "<div class=\"red\"></div>\n<div class=\"green\"></div>\n<div class=\"blue\"></div>\n"
  },
  {
    "path": "test/resources/small/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: auto;\n}\n\n.red {\n  background-color: red;\n}\n\n.green {\n  background-color: green;\n}\n\n.blue {\n  background-color: blue;\n}\n\n.red,\n.green,\n.blue {\n  border: 1px solid lightgrey;\n  height: 3px;\n}\n"
  },
  {
    "path": "test/resources/style/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAA+ElEQVR4nO3RwQmAQAADweu/af3nq7AiM5AGNucAAAAAAAAAAAAAz1znXH9Y3fE1dUiHjDqkQ0Yd0iGjDumQUYd0yKhDOmTUIR0y6pAOGXVIh4w6pENGHdIhow7pkFGHdMioQzpk1CEdMuqQDhl1SIeMOqRDRh3SIaMO6ZBRh3TIqEM6ZNQhHTLqkA4ZdUiHjDqkQ0Yd0iGjDumQUYd0yKhDOmTUIR0y6pAOGXVIh4w6pENGHdIhow7pkFGHdMioQzpk1CEdMuqQDhl1SIeMOqRDRh3SIaMO6ZBRh3TIqEM6ZNQhHTLqkA4ZdUiHAAAAAAAAAAAAwEfcyBN1ls/XAjAAAAAASUVORK5CYII="
  },
  {
    "path": "test/resources/style/image-include-style",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAXJJREFUeF7t3LENwDAMxEBp/6FlJFNcQU9AkHio897MTY8xsAVhWvwgBbF6FATrUZCCaAYwnm5IQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcnbl+lIOiFASK8aEUpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00IKghnAcFpIQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgPsePHnRi+YEEAAAAASUVORK5CYII="
  },
  {
    "path": "test/resources/style/node.html",
    "content": "<div class=\"child\"></div>\n"
  },
  {
    "path": "test/resources/style/style.css",
    "content": "#dom-node {\n  width: 100px;\n  height: 100px;\n  background-color: blue;\n}\n\n.child {\n  width: 100%;\n  height: 50%;\n  background-color: red;\n}\n"
  },
  {
    "path": "test/resources/svg-color/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB8CAYAAACi9XTEAAAAAXNSR0IArs4c6QAAAqBJREFUeF7t2DEOAkEQA8G7/z8aJPjABB30jBoRriyvi014nz6nF3hP367LPQEf/xEEHPDxBY5frxcc8PEFjl+vFxzw8QWOX68XHPB/gc/v28eywPvM/sMYv+CALbT/HgG7PPA2AeOTugIDdnngbQLGJ3UFBuzywNsEjE/qCgzY5YG3CRif1BUYsMsDbxMwPqkrMGCXB94mYHxSV2DALg+8TcD4pK7AgF0eeJuA8UldgQG7PPA2AeOTugIDdnngbQLGJ3UFBuzywNsEjE/qCgzY5YG3CRif1BUYsMsDbxMwPqkrMGCXB94mYHxSV2DALg+8TcD4pK7AgF0eeJuA8UldgQG7PPA2AeOTugIDdnngbQLGJ3UFBuzywNsEjE/qCgzY5YG3CRif1BUYsMsDbxMwPqkrMGCXB94mYHxSV2DALg+8TcD4pK7AgF0eeJuA8UldgQG7PPA2AeOTugIDdnngbQLGJ3UFBuzywNsEjE/qCgzY5YG3CRif1BUYsMsDbxMwPqkrMGCXB94mYHxSV2DALg+8TcD4pK7AgF0eeJuA8UldgQG7PPA2AeOTugIDdnngbQLGJ3UFBuzywNsEjE/qCgzY5YG3CRif1BUYsMsDbxMwPqkrMGCXB94mYHxSV2DALg+8TcD4pK7AgF0eeJuA8UldgQG7PPA2AeOTugIDdnngbQLGJ3UFBuzywNsEjE/qCgzY5YG3CRif1BUYsMsDbxMwPqkrMGCXB94mYHxSV2DALg+8TcD4pK7AgF0eeJuA8UldgQG7PPA2AeOTugJxYNf1ajNd4J0e7NzOBQLe6TZuHfB4qp0HA97pNm4d8HiqnQcD3uk2bh3weKqdBwPe6TZuHfB4qp0HA97pNm4d8HiqnQcD3uk2bh3weKqdB7/P2Mh9XPMukgAAAABJRU5ErkJggg==\n"
  },
  {
    "path": "test/resources/svg-color/node.html",
    "content": "<svg\n  width=\"120\"\n  height=\"120\"\n  viewBox=\"0 0 120 120\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n>\n  <rect class=\"rect\" x=\"10\" y=\"10\" fill=\"red\" width=\"100\" height=\"100\" />\n  <foreignObject\n    x=\"20\"\n    y=\"20\"\n    width=\"120\"\n    height=\"120\"\n    requiredExtensions=\"http://www.w3.org/1999/xhtml\"\n  >\n    <span\n      style=\"display: inline-block; width: 32px; height: 32px; background: red\"\n    />\n  </foreignObject>\n</svg>\n"
  },
  {
    "path": "test/resources/svg-color/style.css",
    "content": "#dom-node {\n  width: 120px;\n  overflow: hidden;\n}\n\n.rect {\n  fill: black;\n}\n"
  },
  {
    "path": "test/resources/svg-image/image",
    "content": "data:image/png;base64,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\n"
  },
  {
    "path": "test/resources/svg-image/node.html",
    "content": "<svg\n  width=\"200\"\n  height=\"200\"\n  viewBox=\"0 0 200 200\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n>\n  <image\n    height=\"200\"\n    width=\"200\"\n    href=\"/base/test/resources/svg-image/svg-image.png\"\n  />\n</svg>\n"
  },
  {
    "path": "test/resources/svg-image/style.css",
    "content": "#dom-node {\n  height: 200px;\n  width: 200px;\n  background-color: #fff;\n}\n"
  },
  {
    "path": "test/resources/svg-ns/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAipJREFUeF7tnbFtQkEYxu7tlhWyQoZiBUYIuxEFKSnSgc/SrzxT81mHzVFAwXFf6756jDFwfAc51jrGnOjEB3m0KMicd0BB5rR4nKQgBRlmYNhxuiEFGWZg2HG6IQUZZmDYcbohBRlmYNhxuiEFGWZg2HG6If81yNv7R1/hb4j7eb2sLd/2FmRDjbUWDlKIPSF+KAXZ6xPTtge5XS/98vhElr+fMAV5Qp7x1IIYVgGzIECeMS2IYRUwCwLkGdOCGFYBsyBAnjEtiGEVMAsC5BnTghhWAbMgQJ4xLYhhFTALAuQZ04IYVgGzIECeMS2IYRUwCwLkGdOCGFYBsyBAnjEtiGEVMAsC5BnTghhWAbMgQJ4xLYhhFTALAuQZ04IYVgGzIECeMS2IYRUwCwLkGdOCGFYBsyBAnjEtiGEVMAsC5BnTghhWAbMgQJ4xLYhhFTALAuQZ04IYVgGzIECeMS2IYRUwCwLkGdOCGFYBsyBAnjEtiGEVMAsC5BnTghhWAbMgQJ4xLYhhFTALAuQZ04IYVgGzIECeMS2IYRUwCwLkGdOCGFYBsyBAnjEtiGEVMAsC5BnTghhWAbMgQJ4xLYhhFTALAuQZ04IYVgGzIECeMS2IYRUwCwLkGdOCGFYBsyBAnjEtiGEVMAsC5BnTghhWAbMgQJ4xLYhhFTALAuQZ04IYVgGzIECeMdWDGIc+E3P7f+GeSZ7xWgtiWAXMggB5xvQ3iAGP+ZqBL6cNY8qpfgubAAAAAElFTkSuQmCC\n"
  },
  {
    "path": "test/resources/svg-ns/node.html",
    "content": "<div id=\"root\">\n  <svg xmlns=\"http://www.w3.org/1999/xhtml\" height=\"94px\" width=\"94px\">\n    <path\n      d=\"M10 10 H 90 V 90 H 10 L 10 10\"\n      transform=\"translate(1,1)\"\n      pointer-events=\"visibleStroke\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      fill=\"none\"\n      stroke=\"#456\"\n      stroke-width=\"4\"\n      shape-rendering=\"crispEdges\"\n    />\n  </svg>\n</div>\n"
  },
  {
    "path": "test/resources/svg-ns/style.css",
    "content": "#dom-node {\n  width: 100px;\n  overflow: hidden;\n}\n\n#root {\n  border: 1px solid red;\n  position: relative;\n  height: 100px;\n}\n\nsvg {\n  position: absolute;\n  left: 5px;\n  top: 5px;\n}\n"
  },
  {
    "path": "test/resources/svg-rect/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB8CAYAAACi9XTEAAABWElEQVR4nO3RgQnAMAACwey/dLuExRLv4QYQz5EkSZIkSZJu6+FX4rUH4eAp8dqDcPCUeO1BOHhKvPYgHDwlXnsQDp4Srz0IB0+J1x6Eg6fEaw/CwVPitQfh4Cnx2oNw8JR47UE4eEq89iAcPCVeexAOnhKvPQgHT4nXHoSDp8RrD8LBU+K1B+HgKfHag3DwlHjtQTh4Srz2IBw8JV57EA6eEq89CAdPidcehIOnxGsPwsFT4rUH4eAp8dqDcPCUeO1BOHhKvPYgHDwlXnsQDp4Srz0IB0+J1x6Eg6fEaw/CwVPitQfh4Cnx2oNw8JR47UE4eEq89iAcPCVeexAOnhKvPQgHT4nXHoSDp8RrD8LBU+K1B+HgKfHag3DwlHjtQTh4Srz2IBw8JV57EA6eEq89CAdPidcehIOnxGsPwsFT4rUH4eAp8dqD+PhgSZIkSZIkSZIkrfUCfAHrK3AZDRwAAAAASUVORK5CYII="
  },
  {
    "path": "test/resources/svg-rect/node.html",
    "content": "<svg\n  width=\"120\"\n  height=\"120\"\n  viewBox=\"0 0 120 120\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n>\n  <rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" />\n</svg>\n"
  },
  {
    "path": "test/resources/svg-rect/style.css",
    "content": "#dom-node {\n  width: 120px;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "test/resources/svg-use-tag/image",
    "content": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAwpJREFUeF7tmPGNzFEYRe90QAWUoAN0QAXogApQAR2gAjpAB3RABzpY+TZvZCLDnkl+bkb2vGT+mdzMfXPOvt/3ZncXyUVcZ0NgN0J2ye5sdnSNN3LpQiHn8xegkPNxcbkTIuRekudJXib5lORxkkdJPid5cWbf57/fzlVCBv6bg2/5JMntJWiEjCzXhgT+JuTtOgnv1kmY0zAn40eSG+uEKGRDGX96ZA3sj0nuJJkTMdBHxAj6muTV2oMnZGMZx4SMhPdJbq5ZMbNj3tuvL2uWjJz57XI/ybzn2ojA4SPr4ZoX35O8XidhTsvv69uS8jTJrXWKPmy0n2v/MYdC5hY1j6eBOyfjmIw9sJkjk3+w8iPQtQGBY0N9rrZ3wWc7QwCkUyNEyLM1J2aW7Af69CjkVNogT4TM4J5TM4+zuX3tl0IA4FMjCjmV2D/OHxMyv87ntV9zm5qr7TyyDof3XH3n5dqQwFX/Otmwyo8iBBRCKBUzCinCJlUKIZSKGYUUYZMqhRBKxYxCirBJlUIIpWJGIUXYpEohhFIxo5AibFKlEEKpmFFIETapUgihVMwopAibVCmEUCpmFFKETaoUQigVMwopwiZVCiGUihmFFGGTKoUQSsWMQoqwSZVCCKViRiFF2KRKIYRSMaOQImxSpRBCqZhRSBE2qVIIoVTMKKQIm1QphFAqZhRShE2qFEIoFTMKKcImVQohlIoZhRRhkyqFEErFjEKKsEmVQgilYkYhRdikSiGEUjGjkCJsUqUQQqmYUUgRNqlSCKFUzCikCJtUKYRQKmYUUoRNqhRCKBUzCinCJlUKIZSKGYUUYZMqhRBKxYxCirBJlUIIpWJGIUXYpEohhFIxo5AibFKlEEKpmFFIETapUgihVMwopAibVCmEUCpmFFKETaoUQigVMwopwiZVCiGUihmFFGGTKoUQSsWMQoqwSZVCCKViRiFF2KRKIYRSMaOQImxSpRBCqZhRSBE2qVIIoVTMKKQIm1QphFAqZhRShE2qFEIoFTMKKcImVb+EkLCZDoGfbnm/rNO8R/AAAAAASUVORK5CYII=\n"
  },
  {
    "path": "test/resources/svg-use-tag/node.html",
    "content": "<div id=\"root\">\n  <div>\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n      class=\"icon\"\n    >\n      <use xlink:href=\"#icon-home\"></use>\n    </svg>\n  </div>\n</div>\n<div style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n  <svg\n    style=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n    version=\"1.1\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n  >\n    <defs>\n      <symbol id=\"icon-home\" viewBox=\"0 0 26 28\">\n        <title>home</title>\n        <path\n          d=\"M22 15.5v7.5c0 0.547-0.453 1-1 1h-6v-6h-4v6h-6c-0.547 0-1-0.453-1-1v-7.5c0-0.031 0.016-0.063 0.016-0.094l8.984-7.406 8.984 7.406c0.016 0.031 0.016 0.063 0.016 0.094zM25.484 14.422l-0.969 1.156c-0.078 0.094-0.203 0.156-0.328 0.172h-0.047c-0.125 0-0.234-0.031-0.328-0.109l-10.813-9.016-10.813 9.016c-0.109 0.078-0.234 0.125-0.375 0.109-0.125-0.016-0.25-0.078-0.328-0.172l-0.969-1.156c-0.172-0.203-0.141-0.531 0.063-0.703l11.234-9.359c0.656-0.547 1.719-0.547 2.375 0l3.813 3.187v-3.047c0-0.281 0.219-0.5 0.5-0.5h3c0.281 0 0.5 0.219 0.5 0.5v6.375l3.422 2.844c0.203 0.172 0.234 0.5 0.063 0.703z\"\n        ></path>\n      </symbol>\n    </defs>\n  </svg>\n</div>\n"
  },
  {
    "path": "test/resources/svg-use-tag/style.css",
    "content": "#dom-node {\n  width: 100px;\n  overflow: hidden;\n}\n\n#root {\n  border: 1px solid red;\n  position: relative;\n  height: 100px;\n}\n\nsvg {\n  width: 100%;\n  height: 100%;\n}\n\n.icon {\n  display: inline-block;\n  width: 0.9285714285714285em;\n  height: 1em;\n  stroke-width: 0;\n  stroke: currentColor;\n  fill: currentColor;\n  vertical-align: middle;\n  top: -1px;\n  position: relative;\n}\n"
  },
  {
    "path": "test/resources/text/node.html",
    "content": "<div>\n  SOME TEXT\n  <div>SOME MORE TEXT</div>\n</div>\n"
  },
  {
    "path": "test/resources/text/style.css",
    "content": "#dom-node {\n  background-color: white;\n  font-family: sans-serif;\n  font-size: 20px;\n}\n"
  },
  {
    "path": "test/resources/textarea/node.html",
    "content": "<textarea id=\"input\"></textarea>\n"
  },
  {
    "path": "test/resources/textarea/style.css",
    "content": "#dom-node {\n  width: 400px;\n  height: 200px;\n  background-color: white;\n  padding: 1em;\n}\ntextarea {\n  height: 100%;\n  width: 100%;\n  font-family: monospace;\n  font-size: 20px;\n  border: 1px solid grey;\n  padding: 1em;\n}\n"
  },
  {
    "path": "test/resources/video/image",
    "content": "data:image/png;base64,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\n"
  },
  {
    "path": "test/resources/video/image-poster",
    "content": "data:image/png;base64,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\n"
  },
  {
    "path": "test/resources/video/node.html",
    "content": "<video controls autoplay=\"false\">\n  <source src=\"/base/test/resources/video/flower.webm\" type=\"video/webm\" />\n  <source src=\"/base/test/resources/video/flower.mp4\" type=\"video/mp4\" />\n</video>\n"
  },
  {
    "path": "test/resources/video/poster.html",
    "content": "<video\n  controls\n  poster=\"/base/test/resources/video/poster.png\"\n  autoplay=\"false\"\n></video>\n"
  },
  {
    "path": "test/resources/video/style.css",
    "content": "#dom-node {\n  width: 240px;\n  height: 160px;\n}\n\nvideo {\n  width: 100%;\n  height: 100%;\n}\n"
  },
  {
    "path": "test/resources/webp/node.html",
    "content": "<div>\n  <img src=\"/base/test/resources/webp/image.webp\" />\n</div>\n"
  },
  {
    "path": "test/resources/webp/style.css",
    "content": "#dom-node {\n  width: 300px;\n  height: 300px;\n  background-color: white;\n}\n"
  },
  {
    "path": "test/spec/basic.spec.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport * as htmlToImage from '../../src'\nimport { delay } from '../../src/util'\nimport {\n  clean,\n  bootstrap,\n  check,\n  renderAndCheck,\n  assertTextRendered,\n} from './helper'\nimport './setup'\n\nbeforeAll(() => {\n  process.env.devicePixelRatio = '1'\n  jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000\n})\n\nafterAll(() => {\n  delete process.env.devicePixelRatio\n  clean()\n})\n\ndescribe('basic usage', () => {\n  it('should render to svg', (done) => {\n    bootstrap('small/node.html', 'small/style.css', 'small/image')\n      .then(htmlToImage.toSvg)\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render to png', (done) => {\n    bootstrap('small/node.html', 'small/style.css', 'small/image')\n      .then(htmlToImage.toPng)\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render to blob', (done) => {\n    bootstrap('small/node.html', 'small/style.css', 'small/image')\n      .then(htmlToImage.toBlob)\n      .then((blob) => global.URL.createObjectURL(blob!))\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render to jpeg', (done) => {\n    bootstrap('small/node.html', 'small/style.css', 'small/image-jpeg')\n      .then((node) => htmlToImage.toJpeg(node))\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should use quality parameter when rendering to jpeg', (done) => {\n    bootstrap('small/node.html', 'small/style.css', 'small/image-jpeg-low')\n      .then((node) => htmlToImage.toJpeg(node, { quality: 0.5 }))\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should convert an element to an array of pixels', (done) => {\n    bootstrap('pixeldata/node.html', 'pixeldata/style.css')\n      .then((node) =>\n        // eslint-disable-next-line promise/no-nesting\n        htmlToImage.toPixelData(node).then((pixels) => ({ node, pixels })),\n      )\n      .then(({ node, pixels }) => {\n        for (let y = 0; y < node.scrollHeight; y += 1) {\n          for (let x = 0; x < node.scrollWidth; x += 1) {\n            const rgba = [0, 0, 0, 0]\n\n            if (y < 10) {\n              rgba[0] = 255\n            } else if (y < 20) {\n              rgba[1] = 255\n            } else {\n              rgba[2] = 255\n            }\n\n            if (x < 10) {\n              rgba[3] = 255\n            } else if (x < 20) {\n              rgba[3] = 0.4 * 255\n            } else {\n              rgba[3] = 0.2 * 255\n            }\n\n            const offset = 4 * y * node.scrollHeight + 4 * x\n\n            const target: number[] = []\n            pixels.slice(offset, offset + 4).forEach((i) => target.push(i))\n            expect(target).toEqual(rgba)\n          }\n        }\n      })\n      .then(done)\n      .catch(done)\n  })\n\n  it('should handle border', (done) => {\n    bootstrap('border/node.html', 'border/style.css', 'border/image')\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render bigger node', (done) => {\n    bootstrap('bigger/node.html', 'bigger/style.css', 'bigger/image')\n      .then((parent) => {\n        const child = parent.querySelector('.dom-child-node') as HTMLDivElement\n        for (let i = 0; i < 10; i += 1) {\n          parent.appendChild(child.cloneNode(true))\n        }\n        return parent\n      })\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should handle \"#\" in colors and attributes', (done) => {\n    bootstrap('hash/node.html', 'hash/style.css', 'small/image')\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render whole node when its scrolled', (done) => {\n    bootstrap('scroll/node.html', 'scroll/style.css', 'scroll/image')\n      .then((node) => node.querySelector('#scrolled') as HTMLDivElement)\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render with external stylesheet', (done) => {\n    bootstrap('sheet/node.html', 'sheet/style.css', 'sheet/image')\n      .then(delay(1000))\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render text nodes', (done) => {\n    bootstrap('text/node.html', 'text/style.css')\n      .then(assertTextRendered(['SOME TEXT', 'SOME MORE TEXT']))\n      .then(done)\n      .catch(done)\n  })\n\n  it('should preserve content of ::before and ::after pseudo elements', (done) => {\n    bootstrap('pseudo/node.html', 'pseudo/style.css')\n      .then(\n        assertTextRendered([\n          'JUSTBEFORE',\n          'BOTHBEFORE',\n          'JUSTAFTER',\n          'BOTHAFTER',\n        ]),\n      )\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render web fonts', (done) => {\n    bootstrap('fonts/node.html', 'fonts/style.css')\n      .then(delay(1000))\n      .then(assertTextRendered(['apper']))\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render images', (done) => {\n    bootstrap('images/node.html', 'images/style.css')\n      .then(delay(500))\n      .then(assertTextRendered(['PNG', 'JPG']))\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render webp images', (done) => {\n    bootstrap('webp/node.html', 'webp/style.css')\n      .then(delay(500))\n      .then(assertTextRendered(['PNG']))\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render background images', (done) => {\n    bootstrap('css-bg/node.html', 'css-bg/style.css')\n      .then(assertTextRendered(['JPG']))\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render user input from <input>', (done) => {\n    const text = 'USER INPUT'\n    bootstrap('input/node.html', 'input/style.css')\n      .then(() => {\n        const input = document.getElementById('input') as HTMLInputElement\n        input.value = text\n      })\n      .then(assertTextRendered([text]) as any)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render user input from <textarea>', (done) => {\n    const text = `USER\\nINPUT`\n\n    bootstrap('textarea/node.html', 'textarea/style.css')\n      .then(() => {\n        const input = document.getElementById('input') as HTMLInputElement\n        input.value = text\n      })\n      .then(assertTextRendered([text]) as any)\n      .then(done)\n      .catch(done)\n  })\n\n  xit('should render content from <canvas>', (done) => {\n    const text = 'AB2哈'\n    bootstrap('canvas/node.html', 'canvas/style.css')\n      .then((node) => {\n        const canvas = node.querySelector('#content') as HTMLCanvasElement\n        const ctx = canvas.getContext('2d')!\n        ctx.fillStyle = '#ffffff'\n        ctx.fillRect(0, 0, canvas.width, canvas.height)\n        ctx.fillStyle = '#000000'\n        ctx.font = '40px serif'\n        ctx.fillText(text, 40, 40)\n      })\n      .then(assertTextRendered([text]) as any)\n      .then(done)\n      .catch(done)\n  })\n})\n"
  },
  {
    "path": "test/spec/canvas.sepc.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport './setup'\nimport { bootstrap, renderAndCheck } from './helper'\n\ndescribe('work with canvas element', () => {\n  xit('should render canvas element', (done) => {\n    bootstrap('canvas/node.html', 'canvas/style.css', 'canvas/image')\n      .then((node) => {\n        const canvas = node.querySelector('#content') as HTMLCanvasElement\n        const ctx = canvas.getContext('2d')!\n        ctx.fillStyle = '#ffffff'\n        ctx.fillRect(0, 0, canvas.width, canvas.height)\n        ctx.fillStyle = '#000000'\n        ctx.font = '40px serif'\n        ctx.fillText('AB2哈', 40, 40)\n        return node\n      })\n      // .then(logDataUrl)\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n})\n"
  },
  {
    "path": "test/spec/embed.spec.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport * as embeding from '../../src/embed-resources'\n\ndescribe('embeding', () => {\n  describe('parseURLs', () => {\n    it('should parse urls', () => {\n      expect(embeding.parseURLs('url(\"http://acme.com/file\")')).toEqual([\n        'http://acme.com/file',\n      ])\n\n      expect(embeding.parseURLs(\"url(foo.com), url('bar.org')\")).toEqual([\n        'foo.com',\n        'bar.org',\n      ])\n    })\n\n    it('should ignore data urls', () => {\n      expect(embeding.parseURLs('url(foo.com), url(data:AAA)')).toEqual([\n        'foo.com',\n      ])\n    })\n  })\n\n  describe('embed', () => {\n    it('should embed url', (done) => {\n      embeding\n        .embed(\n          'url(http://acme.com/image.png), url(foo.com)',\n          'http://acme.com/image.png',\n          null,\n          {},\n          () => Promise.resolve('AAA'),\n        )\n        .then((result) => {\n          expect(result).toEqual('url(data:image/png;base64,AAA), url(foo.com)')\n        })\n        .then(done)\n        .catch(done)\n    })\n\n    it('should resolve urls if base url given', (done) => {\n      embeding\n        .embed(\n          'url(images/image.png)',\n          'images/image.png',\n          'http://acme.com/',\n          {},\n          (url) =>\n            Promise.resolve(\n              (\n                {\n                  'http://acme.com/images/image.png': 'AAA',\n                } as any\n              )[url],\n            ),\n        )\n        .then((result) => {\n          expect(result).toEqual('url(data:image/png;base64,AAA)')\n        })\n        .then(done)\n        .catch(done)\n    })\n  })\n})\n"
  },
  {
    "path": "test/spec/helper.ts",
    "content": "import pixelmatch from 'pixelmatch'\nimport { toPng } from '../../src'\nimport { Options } from '../../src/types'\nimport { getPixelRatio } from '../../src/util'\n\nexport function getCaptureNode() {\n  return document.getElementById('dom-node') as HTMLDivElement\n}\n\nexport function getReferenceImage() {\n  return document.getElementById('ref-image') as HTMLImageElement\n}\n\nexport function getCanvasNode() {\n  return document.getElementById('canvas') as HTMLCanvasElement\n}\n\nexport function getStyleNode() {\n  return document.getElementById('style') as HTMLStyleElement\n}\n\nconst BASE_URL = '/base/test/resources/'\nconst ROOT_ID = 'test-root'\n\nexport function clean() {\n  const root = document.getElementById(ROOT_ID)\n  if (root && root.parentNode) {\n    root.parentNode.removeChild(root)\n  }\n}\n\nasync function setup() {\n  const html = await fetchFile('page.html')\n  clean()\n  const root = document.createElement('div') as HTMLDivElement\n  root.id = ROOT_ID\n  root.innerHTML = html\n  document.body.appendChild(root)\n}\n\nexport async function bootstrap(\n  htmlUrl: string,\n  cssUrl?: string,\n  refImageUrl?: string,\n) {\n  await setup()\n\n  const html = await fetchFile(htmlUrl)\n  const captureNode = getCaptureNode()\n  captureNode.innerHTML = html\n\n  if (cssUrl) {\n    const css = await fetchFile(cssUrl)\n    getStyleNode().appendChild(document.createTextNode(css))\n  }\n\n  if (refImageUrl) {\n    const url = await fetchFile(refImageUrl)\n    getReferenceImage().setAttribute('src', url)\n  }\n\n  return captureNode\n}\n\nasync function fetchFile(fileName: string) {\n  const url = BASE_URL + fileName\n  const res = await fetch(url)\n  return res.text()\n}\n\nfunction makeImage(src: string) {\n  // console.log(src)\n  return new Promise<HTMLImageElement>((resolve) => {\n    const image = new Image()\n    image.onload = () => resolve(image)\n    image.src = src\n  })\n}\n\nfunction makeCanvas(\n  img: HTMLImageElement,\n  size?: {\n    width?: number\n    height?: number\n  },\n) {\n  const canvas = getCanvasNode()\n  const context = canvas.getContext('2d')!\n\n  const width = (size && size.width) || img.width\n  const height = (size && size.height) || img.height\n  const ratio = getPixelRatio()\n  canvas.width = width * ratio\n  canvas.height = height * ratio\n  canvas.style.width = `${width}`\n  canvas.style.height = `${height}`\n\n  context.imageSmoothingEnabled = false\n  context.drawImage(img, 0, 0)\n  return { canvas, context, width, height }\n}\n\nfunction drawImg(\n  img: HTMLImageElement,\n  size?: {\n    width?: number\n    height?: number\n  },\n) {\n  const { context, width, height } = makeCanvas(img, size)\n  return context.getImageData(0, 0, width, height)\n}\n\nexport async function drawDataUrl(\n  dataUrl: string,\n  size?: {\n    width?: number\n    height?: number\n  },\n) {\n  return Promise.resolve(dataUrl)\n    .then(makeImage)\n    .then((image) => drawImg(image, size))\n}\n\nexport async function check(dataUrl: string) {\n  return Promise.resolve(dataUrl)\n    .then(drawDataUrl)\n    .then((imgData) => compareToRefImage(imgData))\n}\n\nexport async function logDataUrl(node: HTMLDivElement = getCaptureNode()) {\n  return toPng(node)\n    .then(makeImage)\n    .then(makeCanvas)\n    .then(({ canvas }) => {\n      // eslint-disable-next-line\n      console.log(canvas.toDataURL())\n      return node\n    })\n}\n\nexport async function renderAndCheck(\n  node: HTMLDivElement = getCaptureNode(),\n  options: Options = {},\n) {\n  return toPng(node, options).then(check)\n}\n\nexport function compareToRefImage(sourceData: ImageData, threshold = 0.1) {\n  const ref = getReferenceImage()\n  const refData = drawImg(ref)\n  expect(\n    pixelmatch(sourceData.data, refData.data, null, ref.width, ref.height, {\n      threshold,\n    }),\n  ).toBeLessThan(100)\n}\n\nexport async function getSvgDocument(dataUrl: string): Promise<XMLDocument> {\n  return window\n    .fetch(dataUrl)\n    .then((res) => res.text())\n    .then((str) => new window.DOMParser().parseFromString(str, 'text/xml'))\n}\n\nconst PASS_TEXT_MATCH = true\n\nexport function assertTextRendered(lines: string[], options?: Options) {\n  return (node: HTMLDivElement = getCaptureNode()) =>\n    PASS_TEXT_MATCH\n      ? expect(true).toBe(true)\n      : recognizeImage(node, options).then((text) => {\n          expect(lines.every((line) => text.includes(line))).toBe(true)\n        })\n}\n\nexport async function recognizeImage(node: HTMLDivElement, options?: Options) {\n  return toPng(node, options)\n    .then(drawDataUrl)\n    .then(() => recognize(getCanvasNode().toDataURL()))\n}\n\n// see: https://ocr.space/OCRAPI\nasync function recognize(dataUrl: string) {\n  const data = new FormData()\n  data.append('base64Image', dataUrl)\n\n  // You may only perform this action upto maximum 180 number of times within\n  // 3600 seconds.\n  // data.append('apikey', 'aa8c3d7de088957')\n  data.append('apikey', 'K89675126388957')\n\n  return window\n    .fetch('https://api.ocr.space/parse/image', {\n      method: 'post',\n      body: data,\n    })\n    .then((res) => res.json())\n    .then((data) => {\n      const result: string[] = []\n      if (!data.IsErroredOnProcessing) {\n        // console.log(JSON.stringify(data.ParsedResults))\n        data.ParsedResults.forEach(({ ParsedText }: any) => {\n          if (ParsedText) {\n            result.push(ParsedText)\n          }\n        })\n      }\n      const text = result.join('\\n').trim().replace('\\r\\n', '\\n')\n      // console.log(`recognized text: ${text}`)\n      return text\n    })\n    .catch(() => {\n      // console.log(`text recognize error: ${err}`)\n      return ''\n    })\n}\n"
  },
  {
    "path": "test/spec/on-image-error-handler.spec.ts",
    "content": "import { embedImages } from '../../src/embed-images'\n\ndescribe('Error Handling in resourceToDataURL', () => {\n  it('should call the onImageErrorHandler when an error occurs', async () => {\n    const handlers = {\n      onError: () => {},\n    }\n    spyOn(handlers, 'onError')\n    const options = { onImageErrorHandler: handlers.onError }\n    const node = document.createElement('img')\n    node.src = 'invalid_url'\n\n    // Assuming resourceToDataURL is the function being tested\n    await embedImages(node, options).then(() => {\n      expect(handlers.onError).toHaveBeenCalled()\n    })\n  })\n\n  it('should reject with an error if no onImageErrorHandler is provided', async () => {\n    const options = {}\n    const node = document.createElement('img')\n    node.src = 'invalid_url'\n    await embedImages(node, options).catch((error) => {\n      expect(() => {\n        throw error\n      }).toThrow()\n    })\n  })\n})\n"
  },
  {
    "path": "test/spec/options.spec.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport './setup'\nimport {\n  bootstrap,\n  check,\n  drawDataUrl,\n  // renderAndCheck,\n  getSvgDocument,\n  compareToRefImage,\n  assertTextRendered,\n} from './helper'\nimport { toPng, toSvg } from '../../src'\n\ndescribe('work with options', () => {\n  it('should apply width and height options to node copy being rendered', (done) => {\n    bootstrap(\n      'dimensions/node.html',\n      'dimensions/style.css',\n      'dimensions/image',\n    )\n      .then((node) =>\n        toPng(node, {\n          width: 200,\n          height: 200,\n        }),\n      )\n      .then((dataUrl) => drawDataUrl(dataUrl, { width: 200, height: 200 }))\n      .then(compareToRefImage)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render backgroundColor', (done) => {\n    bootstrap('bgcolor/node.html', 'bgcolor/style.css', 'bgcolor/image')\n      .then((node) => {\n        return toPng(node, {\n          backgroundColor: '#ff0000',\n        })\n      })\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render backgroundColor in SVG', (done) => {\n    bootstrap('bgcolor/node.html', 'bgcolor/style.css', 'bgcolor/image')\n      .then((node) => {\n        return toSvg(node, {\n          backgroundColor: '#ff0000',\n        })\n      })\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should apply style text to node copy being rendered', (done) => {\n    bootstrap('style/node.html', 'style/style.css', 'style/image')\n      .then((node) => {\n        return toPng(node, {\n          style: { backgroundColor: 'red', transform: 'scale(0.5)' },\n        })\n      })\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should only clone specified style properties when includeStyleProperties is provided', (done) => {\n    bootstrap('style/node.html', 'style/style.css', 'style/image-include-style')\n      .then((node) => {\n        return toPng(node, {\n          includeStyleProperties: ['width', 'height'],\n        })\n      })\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should combine dimensions and style', (done) => {\n    bootstrap('scale/node.html', 'scale/style.css', 'scale/image')\n      .then((node) => {\n        return toPng(node, {\n          width: 200,\n          height: 200,\n          style: {\n            transform: 'scale(2)',\n            transformOrigin: 'top left',\n          },\n        })\n      })\n      .then((dataUrl) => drawDataUrl(dataUrl, { width: 200, height: 200 }))\n      .then(compareToRefImage)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should use node filter', (done) => {\n    bootstrap('filter/node.html', 'filter/style.css', 'filter/image')\n      .then((node) =>\n        toPng(node, {\n          filter(node) {\n            if (node.classList) {\n              return !node.classList.contains('omit')\n            }\n            return true\n          },\n        }),\n      )\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should not apply node filter to root node', (done) => {\n    bootstrap('filter/node.html', 'filter/style.css', 'filter/image')\n      .then((node) =>\n        toPng(node, {\n          filter(node) {\n            if (node.classList) {\n              return node.classList.contains('include')\n            }\n            return false\n          },\n        }),\n      )\n      .then(check)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should only use fontEmbedCss if it is supplied', (done) => {\n    const testCss = `\n        @font-face {\n          name: \"Arial\";\n          src: url(\"data:AAA\") format(\"woff2\");\n        }\n      `\n    bootstrap('fonts/web-fonts/empty.html', 'fonts/web-fonts/remote.css')\n      .then((node) => toSvg(node, { fontEmbedCSS: testCss }))\n      .then(getSvgDocument)\n      .then((doc) => {\n        const styles = Array.from(doc.getElementsByTagName('style'))\n        expect(styles).toHaveSize(1)\n        expect(styles[0].textContent).toEqual(testCss)\n      })\n      .then(done)\n      .catch(done)\n  })\n\n  it('should embed only the preferred font', (done) => {\n    bootstrap('fonts/web-fonts/empty.html', 'fonts/web-fonts/remote.css')\n      .then((node) => toSvg(node, { preferredFontFormat: 'woff2' }))\n      .then(getSvgDocument)\n      .then((doc) => {\n        const [style] = Array.from(doc.getElementsByTagName('style'))\n        expect(style.textContent).toMatch(/url\\([^)]+\\) format\\(\"woff2\"\\)/)\n        expect(style.textContent).not.toMatch(/url\\([^)]+\\) format\\(\"woff\"\\)/)\n      })\n      .then(done)\n      .catch(done)\n  })\n\n  // it('should use the placeholder image when fetching an image fails', (done) => {\n  //   bootstrap(\n  //     'placeholder/node.html',\n  //     'placeholder/style.css',\n  //     'placeholder/image',\n  //   )\n  //     .then((node) => {\n  //       renderAndCheck(node, {\n  //         imagePlaceholder:\n  //           'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASIAAACuCAMAAAClZfCTAAAAe1BMVEX///8AAADLy8t6enqxsbGvr6/6+vo2Njbd3d3Z2dn29vZ0dHT7+/szMzPc3Nx9fX3AwMDq6urT09M7Ozu2trYsLCydnZ0fHx9RUVFCQkI1NTWSkpIkJCS9vb1sbGyEhIRYWFhLS0tlZWUPDw/t7e2Pj4+kpKQYGBhWVlZG4Un2AAAHU0lEQVR4nO2d2WKiMBRAExBFwaq4VBwrVtva///CyYKCstwAiQW858GhaJQcyHIThhCKABD6S/dWYCE5BNae6SE0cEO6IkgOKxq6AVNkETKgS/evD6d9uEs6IMSSiog/o/bwrw+pXQxtOvNJoogpG3FlyJUBHcmClSgixLnuRPgF48SbaUVkwi4tLG2MIat2Jtc/7hQxeTssbbyM7VLF6UGRKILjZx9Suxg/VMoZRWTopS6y14NVNt59ZZNVxDROb1XVy+HQ6WMhylPES9v0Jds2d5pTFecr4lW693JtG6ti8hr0AkWEvC1frW1jQdhb3v5CRTKEM3lI7aI4lC9RxIMU2zd2TK3Ct4tD1DJF11C3/5QOdJQrEnFb73uS41FpJwdS1P+47S4eywNUxErbus+lbUDXQKOkoCi3y9kTVAIJJUWibeth3DYpaccS1BSBVVonUWyKVBX1L27LjcfyUFfEZwD6E7fxeEyxW1xBUZ96klUmxSop6kvcVm1qtaIiMSZZ+ZBaRmZcsZyqirpf2ipPPFdX1O0ZgMexewXqKFLscrWQWl3gWorYyehk3MbisRqXf01FvGu661hpG+/qBQi1FXUtbqtfOdRXRMhbh+4lYU1M7ti9Ak0UdSduU47H8mimSAzZtb5tGzYbOG2oqAt3bg0a3jbVWFHxFF07aD5lqkGRiNtaOt/mV4zH8tChSJyqVo5JOjoucD2KRNvWup7kuEk7lqBLkeiataonqe2AtCnSdtI0oe+y1qhIU9HXgs7KUasiLQ2IBvQ2sXoVtePOLc0dNd2Kmndmm6K9u69fUdOQqOGP6w8aDShqGFg3wsTQgxFFjYZnGmBmAMuQor+YATA1DGpKUf2h4roYG0w3p6juhEM9DE7JmFT0vBkAo8XaqKJak581MDs9bFgRP/x9YPL7CQn2Zk+DcUXdBxWBoCIQVASCikBQEQgqAkFFIKgIBBWBoCIQVASCikBQEQgqAkFFIKgIBBWBoCIQVASCikBQEQgqAtGv6GPgOM5A3sIyHvh379w2J5vP0IunB1c8geOIFM5CvOvEc7jBKdxu4mnWeTIdJ1LM07/nOOLLnMFtUx/6Fe0vtmevqcjBhqbmqyf09ksLOt1sPPoj/jivbc/zDuI9mWxBhSli02izucR/hN+3bzrvbe9Aqbw9Z30RyT9E8k/227/0n9YM6Vc0PfDXw4W/3ilyPiMv3ryc+OuKiivnMks+c6fIke8fd+KtbZLxd/H/4D355aNTKvlK/qqmrEgMKIqzz1/vFJ0HYyoLzTz+9yCEFCqiG7HvSx5gWpFQ7cv37xSJomzRL12ZkV9n5iqaZRSN2XZctOz3dIKLTXzfl9LoB9smrlDk0rj2WUf8NaOIHMUvMUVJcnEVeXutGdKvaDSNomgrz2da0Yyd7c1UbB6idIK1XCZBnPnrmglc0fhaXjxRrrKKbKEolClEmaTh8Xg6fy60ZsiQokh+Z1oRtTebSObkIGsXshBa3g8LlyE/9MM3LaEoiOtpsi1QdBT/LH958jfRdNJoPp9/0w+tGTJV0CQpRSvqHQ7eu7h+fuLrYy9yXVwXxc8+kVnOKjpn6yKR4hTqyMcNU9W1ZENv946FUbLjS1a0ARU9mEJFkaxT/knPmRbtR34qW107bW/R1neKVuzK/3B53St6MV/yPP+j3wvyQeUnL0eLf0heOGlFw/POIotI7iPbw5x/jOt6/2UpTnHdP/q04t9IWjStGdKvKPSS7R9ZlTqEfK/lnuNW/DNYst3xZbE8iw+J3F0VyVZ7OGP7w7hdOyXVcshSjLz4HvStTC6uS3kCAqr1vjiM0UBQEQgqAkFFIKgIBBWBoCIQVASCikBQEQgqAkFFIKgIBBWBoCIQVASCikBQEQgqAkFFIKgIBBWBoCIQVASCD8QAwceqgODDeUDwEU8g+KAwEHzcHAg+tBAEH30Jgg9QBcHH8ILgw5xB8JHgIPhgeRBcngAEF7kAwaVSQHDBHRBctgkEF/8CwSXkQHAhQhBczhIEF0UFwaV1QXCBZhBc5hsEF4sHqaPI7OSnWWpMD1dX5LZgXLEJLBio1lGpqojHY9UOqX1UjNsqKlrRsBN9xXLc8PogCRUqKep6GUuoUtoqKPJnrRi71wOrMGaKAzjqiroSj6miHLepKmKNZSvHFZvgqHVe1BR1LB5TRa0LrKTIaeHYvR7GU7hwKChyOxmPqcLiNqCKBRVN/vI+j2fAB05LKxFIkWKV1mmApqhcUX/6iuWU9iTLFPF2rKXzY7rxS9q2EkX9iMdUKY7bChW14V6q51I0ZVqgaNineEwVHrflZDpfUd/iMVVy47Y8RSpdzr6SE0hkFfFxxR7GY6pMMmOSGUVdHrvXw+MMwIMid/dq7VgeA7pLVcV3inofj6lyF7elFTl/fN99m3CTuC1R1P57qZ7L7c6tqyK/C/dSPRd+5xYPUWNFlacoXwI50MEVBdWm3l4JHsoHTNEv3VuBheQQWHum57awBFLEf5wMSlHVvwaOAAAAAElFTkSuQmCC',\n  //       })\n  //     })\n  //     .then(done)\n  //     .catch(done)\n  // })\n\n  it('should support cache busting', (done) => {\n    bootstrap('images/node.html', 'images/style.css')\n      .then(assertTextRendered(['PNG', 'JPG'], { cacheBust: true }))\n      .then(done)\n      .catch(done)\n  })\n})\n"
  },
  {
    "path": "test/spec/select.sepc.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport './setup'\nimport { bootstrap, renderAndCheck } from './helper'\n\ndescribe('work with select element', () => {\n  ;['first', 'second', 'third'].forEach((text) => {\n    it(`should capture ${text} selected option`, (done) => {\n      bootstrap(\n        `select/${text}-option.html`,\n        'select/style.css',\n        `select/${text}`,\n      )\n        .then(renderAndCheck)\n        .then(done)\n        .catch(done)\n    })\n  })\n})\n"
  },
  {
    "path": "test/spec/setup.ts",
    "content": "import { clean } from './helper'\n\nbeforeAll(() => {\n  process.env.devicePixelRatio = '1'\n  jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000\n})\n\nafterAll(() => {\n  delete process.env.devicePixelRatio\n  clean()\n})\n"
  },
  {
    "path": "test/spec/special.spec.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport '../spec/setup'\nimport { toPng } from '../../src'\nimport { delay } from '../../src/util'\nimport { assertTextRendered, bootstrap, renderAndCheck } from '../spec/helper'\n\ndescribe('special cases', () => {\n  xit('should not crash when loading external stylesheet causes error', (done) => {\n    bootstrap('ext-css/node.html', 'ext-css/style.css')\n      .then(delay(1000))\n      .then((node) => {\n        toPng(node)\n      })\n      .then(done)\n      .catch(done)\n  })\n\n  xit('should render content from shadow node of custom element', (done) => {\n    const link = document.createElement('link')\n    const script = document.createElement('script')\n    script.src = 'https://unpkg.com/mathlive/dist/mathlive.min.js'\n    link.rel = 'stylesheet'\n    link.crossOrigin = 'anonymous'\n    link.href = 'https://unpkg.com/mathlive/dist/mathlive-fonts.css'\n    const tasks = [\n      new Promise((resolve, reject) => {\n        script.onload = resolve\n        script.onerror = reject\n      }),\n      new Promise((resolve, reject) => {\n        link.onload = resolve\n        link.onerror = reject\n      }),\n    ]\n    document.head.append(script, link)\n\n    Promise.all(tasks).then(() =>\n      // eslint-disable-next-line promise/no-nesting\n      bootstrap(\n        'custom-element/node.html',\n        'custom-element/style.css',\n        'custom-element/image',\n      )\n        .then(delay(1000))\n        .then(renderAndCheck)\n        .then(() => {\n          link.remove()\n          script.remove()\n          done()\n        })\n        .catch(done),\n    )\n  })\n\n  it('should caputre lazy loading images', (done) => {\n    bootstrap('images/loading.html', 'images/style.css')\n      .then(assertTextRendered(['PNG', 'JPG']))\n      .then(done)\n      .catch(done)\n  })\n})\n"
  },
  {
    "path": "test/spec/svg.spec.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport '../spec/setup'\nimport { toSvg } from '../../src'\nimport { bootstrap, renderAndCheck, getSvgDocument } from '../spec/helper'\n\ndescribe('work with svg element', () => {\n  it('should render nested svg with broken namespace', (done) => {\n    bootstrap('svg-ns/node.html', 'svg-ns/style.css', 'svg-ns/image')\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render svg `<rect>` with width and heigth', (done) => {\n    bootstrap('svg-rect/node.html', 'svg-rect/style.css', 'svg-rect/image')\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render svg `<rect>` with applied css styles', (done) => {\n    bootstrap('svg-color/node.html', 'svg-color/style.css', 'svg-color/image')\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should include a viewBox attribute', (done) => {\n    bootstrap('small/node.html', 'small/style.css', 'small/image')\n      .then(toSvg)\n      .then(getSvgDocument)\n      .then((doc) => {\n        const width = doc.documentElement.getAttribute('width')\n        const height = doc.documentElement.getAttribute('height')\n        const viewBox = doc.documentElement.getAttribute('viewBox')\n        expect(viewBox).toEqual(`0 0 ${width} ${height}`)\n      })\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render svg `<image>` with href', (done) => {\n    bootstrap('svg-image/node.html', 'svg-image/style.css', 'svg-image/image')\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render SVG use tags', function (done) {\n    bootstrap(\n      'svg-use-tag/node.html',\n      'svg-use-tag/style.css',\n      'svg-use-tag/image',\n    )\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n})\n"
  },
  {
    "path": "test/spec/video.spec.ts",
    "content": "/* eslint-disable promise/no-callback-in-promise */\n\nimport './setup'\nimport { bootstrap, renderAndCheck } from './helper'\nimport { delay } from '../../src/util'\n\ndescribe('work with video element', () => {\n  it('should render video element', (done) => {\n    bootstrap('video/node.html', 'video/style.css', 'video/image')\n      .then(delay(1000))\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n\n  it('should render video element with poster', (done) => {\n    bootstrap('video/poster.html', 'video/style.css', 'video/image-poster')\n      .then(delay(1000))\n      .then(renderAndCheck)\n      .then(done)\n      .catch(done)\n  })\n})\n"
  },
  {
    "path": "test/spec/webfont.spec.ts",
    "content": "import * as htmlToImage from '../../src'\nimport { getSvgDocument } from './helper'\n\ndescribe('font embedding', () => {\n  describe('should embed only used fonts', () => {\n    it('should embed 1 font when use 1', async () => {\n      const root = document.createElement('div')\n      document.body.append(root)\n      try {\n        root.innerHTML = `\n          <style>\n              @font-face { \n                  font-family: 'Font 0';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n              @font-face { \n                  font-family: 'Font 1';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n              @font-face { \n                  font-family: 'Font 2';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n          </style>\n          <p style=\"font-family: 'Font 1'\">Hello world</p>\n        `\n        const svg = await htmlToImage.toSvg(root)\n        const doc = await getSvgDocument(svg)\n        const [style] = Array.from(doc.getElementsByTagName('style'))\n        expect(style.textContent).toContain('Font 1')\n        expect(style.textContent).not.toContain('Font 0')\n        expect(style.textContent).not.toContain('Font 2')\n      } finally {\n        root.remove()\n      }\n    })\n    it('should embed 2 fonts when use 2', async () => {\n      const root = document.createElement('div')\n      document.body.append(root)\n      try {\n        root.innerHTML = `\n          <style>\n              @font-face { \n                  font-family: 'Font 0';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n              @font-face { \n                  font-family: 'Font 1';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n              @font-face { \n                  font-family: 'Font 2';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n          </style>\n          <p style=\"font-family: 'Font 0'\">Hello world</p>\n          <p style=\"font-family: 'Font 2'\">Hello world</p>\n        `\n        const svg = await htmlToImage.toSvg(root)\n        const doc = await getSvgDocument(svg)\n        const [style] = Array.from(doc.getElementsByTagName('style'))\n        expect(style.textContent).toContain('Font 0')\n        expect(style.textContent).toContain('Font 2')\n        expect(style.textContent).not.toContain('Font 1')\n      } finally {\n        root.remove()\n      }\n    })\n    it('should embed font used by deeply nested child', async () => {\n      const root = document.createElement('div')\n      document.body.append(root)\n      try {\n        root.innerHTML = `\n          <style>\n              @font-face { \n                  font-family: 'Font 0';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n              @font-face { \n                  font-family: 'Font 1';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n              @font-face { \n                  font-family: 'Font 2';\n                  src: url('https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2');\n              }\n          </style>\n          <div>\n            <div>\n                <div>\n                    <div style=\"font-family: 'Font 1'\">Hello world</div>\n                </div>\n            </div>\n          </div>\n        `\n        const svg = await htmlToImage.toSvg(root)\n        const doc = await getSvgDocument(svg)\n        const [style] = Array.from(doc.getElementsByTagName('style'))\n        expect(style.textContent).toContain('Font 1')\n        expect(style.textContent).not.toContain('Font 0')\n        expect(style.textContent).not.toContain('Font 2')\n      } finally {\n        root.remove()\n      }\n    })\n  })\n})\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n \"extends\": \"@bubkoo/tsconfig\",\n  \"include\": [\n    \"src/**/*.ts\"\n  ]\n}\n"
  }
]