{"id":18976897,"url":"https://github.com/a11ywatch/sidecar","last_synced_at":"2025-04-19T17:18:48.294Z","repository":{"id":41146993,"uuid":"508468305","full_name":"a11ywatch/sidecar","owner":"a11ywatch","description":"A11yWatch lite javascript sidecar and client","archived":false,"fork":false,"pushed_at":"2024-03-24T05:55:35.000Z","size":1931,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-16T12:18:59.268Z","etag":null,"topics":["a11ywatch","sidecar"],"latest_commit_sha":null,"homepage":"https://a11ywatch.com/api-info","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/a11ywatch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["a11ywatch"]}},"created_at":"2022-06-28T22:06:51.000Z","updated_at":"2024-07-20T17:47:30.000Z","dependencies_parsed_at":"2024-03-07T13:46:27.733Z","dependency_job_id":"6b0b7fea-82f0-4dac-a626-669d6057f6c3","html_url":"https://github.com/a11ywatch/sidecar","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a11ywatch%2Fsidecar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a11ywatch%2Fsidecar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a11ywatch%2Fsidecar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a11ywatch%2Fsidecar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/a11ywatch","download_url":"https://codeload.github.com/a11ywatch/sidecar/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249746599,"owners_count":21319662,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a11ywatch","sidecar"],"created_at":"2024-11-08T15:26:49.760Z","updated_at":"2025-04-19T17:18:48.276Z","avatar_url":"https://github.com/a11ywatch.png","language":"TypeScript","funding_links":["https://github.com/sponsors/a11ywatch"],"categories":[],"sub_categories":[],"readme":"# sidecar\n\nA11yWatch Lite native javascript [sidecar](https://learn.microsoft.com/en-us/azure/architecture/patterns/sidecar)\n\n## Getting started\n\nMake sure to have either [nodejs](https://nodejs.org/en/) or [bun](https://bun.sh/) installed.\n[Protoc](https://grpc.io/docs/protoc-installation/#install-pre-compiled-binaries-any-os) is required to install the crawler, depending on the\nOS an automatic installation is performed.\n\n### nodejs\n\nnode - v14.0 and up, pref node ^v18.\n\n1. `yarn add @a11ywatch/a11ywatch`.\n1. `npx playwright install`\n\n### bun\n\n1. `npx playwright install` # we need pre-install scripts\n1. `bun install @a11ywatch/a11ywatch`.\n\nIn order to build `@a11ywatch/crawler` \u003e= 0.5.0, you need the `protoc` Protocol Buffers compiler, along with Protocol Buffers resource files.\n\n#### Ubuntu\n\n```bash\nsudo apt update \u0026\u0026 sudo apt upgrade -y\nsudo apt install -y protobuf-compiler libprotobuf-dev\n```\n\n#### Alpine Linux\n\n```sh\nsudo apk add protoc protobuf-dev\n```\n\n#### macOS\n\nAssuming [Homebrew](https://brew.sh/) is already installed. (If not, see instructions for installing Homebrew on [the Homebrew website](https://brew.sh/).)\n\n```zsh\nbrew install protobuf\n```\n\n#### optional\n\nUse the packages exported methods, use a [client](https://github.com/a11ywatch/a11ywatch/tree/main/clients), or your own handling of request like curl/fetch.\n\n1. optional: start `mongodb` on port 27017.\n1. optional: start `redis` on 6379.\n1. optional: add `scripts` to .gitignore (auto generated javascript page fixes) or `A11YWATCH_NO_STORE=false` to disable storage.\n1. optional: add `DISABLE_HTTP=true` env variable to prevent http server startup (disables OpenAPI \u0026 GraphQL)\n\n## Usage\n\n```ts\nimport { scan, multiPageScan, crawlList } from \"@a11ywatch/a11ywatch\";\n\n// single page website scan.\nawait scan({ url: \"https://a11ywatch.com\" });\n\n// all pages\nawait multiPageScan({ url: \"https://a11ywatch.com\" });\n\n// all pages and subdomains\nawait multiPageScan({\n  url: \"https://a11ywatch.com\",\n  subdomains: true,\n});\n\n// all pages and tld extensions\nawait multiPageScan({ url: \"https://a11ywatch.com\", tld: true });\n\n// all pages, subdomains, and tld extensions\nawait multiPageScan({\n  url: \"https://a11ywatch.com\",\n  subdomains: true,\n  tld: true,\n});\n\n// multi page scan with callback on each result asynchronously\nconst callback = ({ data }) =\u003e {\n  console.log(data);\n};\nawait multiPageScan(\n  {\n    url: \"https://a11ywatch.com\",\n  },\n  callback\n);\n\n// crawl a list of static urls - does not perform site wide scans\nconst pages = await crawlList({\n  pages: [\n    \"https://a11ywatch.com\",\n    \"https://newegg.com\",\n    \"https://bun.sh\",\n    \"https://nodejs.org\",\n  ],\n  userId: 0,\n});\n```\n\nYou can also drill in to the specific modules like `@a11ywatch/pagemind` (accessibility service) and etc.\n\n```ts\nimport { detectImage } from \"@a11ywatch/mav/ai/detectImage\";\n\n// prediect an image from a base64. You can also pass in a url as the url key.\nawait detectImage({\n  imageBase64:\n    \"data:image/jpeg;base64,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\",\n  height: 50,\n  width: 50,\n});\n```\n\n## Jest\n\nHere is an example of using A11yWatch with [jest](https://jestjs.io/).\n\n```ts\ndescribe(\"accessibility suite\", () =\u003e {\n  // can scan a single website url\n  test(\"passes web accessibility test for home page\", async () =\u003e {\n    const { scan } = await import(\"@a11ywatch/a11ywatch\");\n\n    const results = await scan({ url: \"https://a11ywatch.com\" });\n\n    // expect to have no issues\n    expect(results.data.issues.length).toBe(0);\n  });\n\n  // can scan an entire website\n  test(\"passes web accessibility test entire website\", async () =\u003e {\n    const { multiPageScan } = await import(\"@a11ywatch/a11ywatch\");\n\n    await multiPageScan(\n      {\n        url: \"https://jeffmendez.com\",\n        userId: data.id,\n      },\n      ({ data }) =\u003e {\n        const issuesCount = data.issues.filter(\n          (issue) =\u003e issue.type === \"error\"\n        ).length;\n        console.info(`${data.url}: ${data.issues.length}`);\n        expect(issuesCount).toBeLessThan(4);\n      }\n    );\n  });\n});\n```\n\n## Docker\n\nYou can run the suite with docker by running:\n\n```\ndocker run -p 3280:3280 \\\n  -v ${PWD}:/a11ywatch/conf \\\n  -e SUPER_MODE=true \\\n  a11ywatch/a11ywatch\n```\n\nExample docker compose configuration:\n\n```yml\nversion: \"3.9\"\nservices:\n  a11ywatch:\n    image: a11ywatch/a11ywatch\n    ports:\n      - 3280:3280\n```\n\nValidate scan:\n\n```sh\ncurl --location --request POST 'http://localhost:3280/api/crawl' \\\n--header 'Transfer-Encoding: chunked' \\\n--header 'Content-Type: application/json' \\\n--header 'Authorization: $A11YWATCH_TOKEN' \\\n--data-raw '{\n    \"websiteUrl\": \"https://a11ywatch.com\",\n    \"subdomains\": false,\n    \"tld\": false,\n    \"robots\": false\n}'\n```\n\n## Packages exposed\n\nThe following packages can be imported to use directly to extend [A11yWatch Lite](https://github.com/a11ywatch/a11ywatch).\n\n1. [`@a11ywatch/core`](https://github.com/a11ywatch/a11ywatch-core)\n1. [`@a11ywatch/mav`](https://github.com/a11ywatch/mav)\n1. [`@a11ywatch/pagemind`](https://github.com/a11ywatch/pagemind)\n1. [`@a11ywatch/crawler`](https://github.com/a11ywatch/crawler)\n1. [`@a11ywatch/elastic-cdn`](https://github.com/a11ywatch/elastic-cdn)\n1. [`@a11ywatch/client`](https://gitlab.com/j-mendez/a11ywatch-clients/-/tree/main/typescript_api_client)\n\n## Examples\n\nView the [bun example](./examples/bun/) or [nodejs example](./examples/nodejs/) for a getting started point.\n\n## Environmental variables\n\nYou can update the env variables below to adjust the gRPC server ports and other application features.\n\n```\n# grpc configs\nGRPC_HOST_PAGEMIND=127.0.0.1:50052\nGRPC_HOST_MAV=127.0.0.1:50053\nGRPC_HOST_CRAWLER=127.0.0.1:50055\n# store js scripts for CDN\nSCRIPTS_ENABLED=false\n# disabling AI may drastically improve performance across certain pages\nAI_DISABLED=false\n# disable core http server API\nDISABLE_HTTP=true\n# unlock all features\nSUPER_MODE=true\n# prevent auto starting suite - must use initApplication manually when ready\nA11YWATCH_AUTO_START=true\n# disable storing scripts\nA11YWATCH_NO_STORE=true\n# disable db install if already started locally\nDISABLE_POSTINSTALL=true\n# do not store data and use memory db\nA11YWATCH_MEMORY_ONLY=true\n# enable screen recording to a directory\nPAGEMIND_RECORD=true\n# set the chrome host\nCHROME_HOST=\n```\n\n## Pipelines\n\nWe use [dagger](https://docs.dagger.io/) to build pipelines for builds, test, and deploys.\n\n```\n# deps check\ndagger do deps\n# build img\ndagger do build\n# push img locally\n# make sure to have localhost listening - `docker run -d -p 2222:5000 --restart=always --name localregistry registry:2`\ndagger do push\n# now you can run `docker run localhost:2222/a11ywatch:latest`\n```\n\n## Client\n\nWe bundled the client for a one stop install for javascript at `@a11ywatch/a11ywatch/client`.\n\n```ts\nimport { setAPIToken, setA11yWatchURL, crawlWebsite, scanWebsite } from \"@a11ywatch/a11ywatch/client\"\n\n// set at runtime to a new token - if you use the env variable below it is also set without the method\nsetAPIToken(process.env.A11YWATCH_TOKEN)\nsetA11yWatchURL(\"https://api.a11ywatch.com\")\n\n// single page audit\nconst audit = await scanWebsite({ url: \"https://mywebsite.com\" })\nconsole.log(audit)\n\n// stream multi page full website audit results\nawait crawlWebsite({ url: \"https://mywebsite.com\" }, (audit) =\u003e { \n  console.log(audit)\n})\n```\n\n## Help\n\nWhen on node v18 and above the flag `--no-experimental-fetch` is required ex: `node --no-experimental-fetch server.js`.\n\nIf you run into issues with modules not loading try deleting all of the `node_modules` and running `npm install` again.\nUpon switching node versions certain modules need to be re-installed for the native compilation to work.\n\nThe project starts a valid [A11yWatch Lite](https://github.com/a11ywatch/a11ywatch) instance.\n\n## LICENSE\n\ncheck the license file in the root of the project.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa11ywatch%2Fsidecar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fa11ywatch%2Fsidecar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa11ywatch%2Fsidecar/lists"}