diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 53e5725..7938765 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,95 +1,73 @@ name: build on: - push: - paths-ignore: - - "**.md" - - "**.bbcode" - - LICENSE - branches: [main, dev] - - pull_request: - paths-ignore: - - "**.md" - - "**.bbcode" - - LICENSE - branches: [main] + push: + paths-ignore: + - "**.md" + - "**.bbcode" + - LICENSE + branches: [main, dev] + pull_request: + paths-ignore: + - "**.md" + - "**.bbcode" + - LICENSE + branches: [main] jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - - name: Install build dependencies (apt) - run: | - sudo apt install libx11-dev libxcursor-dev libpng-dev - continue-on-error: false - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - uses: actions/cache@v2 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - uses: actions/setup-node@v1 - with: - node-version: "12.x" - - run: yarn install - - run: yarn render - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - - name: Cache pip dependencies - uses: actions/cache@v2 - with: - # This path is specific to Ubuntu - path: ~/.cache/pip - # Look to see if there is a cache hit for the corresponding requirements file - key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} - restore-keys: | - ${{ runner.os }}-pip- - ${{ runner.os }}- - - - name: Install pip dependencies - run: | - python -m pip install --upgrade pip - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - continue-on-error: false - - - name: Generating `GoogleDot` Cursor Theme - run: python build.py - - - name: Compressing Artifacts - run: | - tar -cvzf logs.tar.gz build.log - tar -cvzf bitmaps.tar.gz bitmaps - tar -cvzf GoogleDot.tar.gz themes - - - name: Uploading `GoogleDot` Build Log artifact - uses: actions/upload-artifact@v2 - with: - name: logs - path: logs.tar.gz - - - name: Uploading `bitmaps` artifact - uses: actions/upload-artifact@v2 - with: - name: bitmaps - path: bitmaps.tar.gz - - - name: Uploading `GoogleDot` Theme artifact - uses: actions/upload-artifact@v2 - with: - name: GoogleDot - path: GoogleDot.tar.gz + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install build dependencies (apt) + run: sudo apt install -y libx11-dev libxcursor-dev libpng-dev + continue-on-error: false + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: Caching yarn packages + uses: actions/cache@v2 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Set Up NodeJS 12.x + uses: actions/setup-node@v1 + with: + node-version: "12.x" + - name: Caching pip packages + uses: actions/cache@v2 + id: pip-cache # use this to check for `cache-hit` (`steps.pip-cache.outputs.cache-hit != 'true'`) + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/setup.py') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: Generating `GoogleDot` Cursor Theme + run: make + continue-on-error: false + + - name: Compressing UNIX theme + run: tar -cvzf GoogleDot.tar.gz themes/GoogleDot + + - name: Uploading `bitmaps` artifact + uses: actions/upload-artifact@v2 + with: + name: bitmaps + path: bitmaps/* + - name: Uploading `GoogleDot` UNIX Theme artifact + uses: actions/upload-artifact@v2 + with: + name: GoogleDot + path: GoogleDot.tar.gz + - name: Uploading `GoogleDot` Windows Theme artifact + uses: actions/upload-artifact@v2 + with: + name: GoogleDot_Windows + path: themes/GoogleDot_Windows/* diff --git a/.gitignore b/.gitignore index 0c12ae6..991c5b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ ########## Custom bitmaps themes +builder/files.txt ########## Python @@ -252,4 +253,4 @@ dist .yarn/unplugged .yarn/build-state.yml .yarn/install-state.gz -.pnp.* \ No newline at end of file +.pnp.* diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a7652e..5054963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [unreleased] +## [v1.0.1] - 17 Feb 2021 + +### Added + +- Figma file added inside **README.md** +- Organized build & bitmaps source code +- Add **Make** compatibility +- Only build options added in `Makefile` +- Relinked few svg files for Windows cursors purpose +- New build docs + +### Changed + +- Fixed some linting problems of builder using `pylint` +- Reduced Package Size +- Customize sizes from `make` +- CI workflow `build` compatibility with `make` commands + ## [v1.0.0] - 27 Oct 2020 ### Added -- Initial release 🎊 -- Logo and badges -- CI/CD Pipelines +- Initial release 🎊 +- Logo and badges +- CI/CD Pipelines -[unreleased]: https://github.com/ful1e5/Google_Cursor/compare/v1.0.0...main +[unreleased]: https://github.com/ful1e5/Google_Cursor/compare/v1.0.1...main +[v1.0.1]: https://github.com/ful1e5/Google_Cursor/compare/v1.0.0...v1.0.1 [v1.0.0]: https://github.com/ful1e5/Google_Cursor/tree/v1.0.0 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2d64842 --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +theme := GoogleDot +src := ./themes/$(theme) + +local := ~/.icons +local_dest := $(local)/$(theme) + +root := /usr/share/icons +root_dest := $(root)/$(theme) + +all: clean render build + +unix: clean render bitmaps + @cd builder && make build_unix + +windows: clean render bitmaps + @cd builder && make build_windows + +.PHONY: all + +clean: + @rm -rf bitmaps themes + +render: bitmapper svg + @cd bitmapper && $(MAKE) + +build: bitmaps + @cd builder && $(MAKE) + +.ONESHELL: +SHELL:=/bin/bash + + +install: $(src) + @if [[ $EUID -ne 0 ]]; then + @echo "> Installing '$(theme)' cursors inside $(local)/..." + @mkdir -p $(local) + @cp -r $(src) $(local_dest) && echo "> Installed!" + @else + @echo "> Installing '$(theme)' cursors inside $(root)/..." + @mkdir -p $(root) + @sudo cp -r $(src) $(root_dest) && echo "> Installed!" + @fi + +uninstall: + @if [[ $EUID -ne 0 ]]; then + @echo "> Removing '$(local_dest)'..." + @rm -rf $(local_dest) + @else + @echo "> Removing '$(root_dest)'..." + @sudo rm -rf $(root_dest) + @fi + +reinstall: uninstall install diff --git a/README.md b/README.md index 6cba4ae..51e50c9 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,8 @@ - Puppeteer version + Puppeteer version + @@ -100,7 +101,7 @@ Cursor theme inspired on **google material design** for `Windows` and `Linux` wi #### Preview: -> Detailed Cursors Informations inside [src/svgs/README.md](https://github.com/ful1e5/Google_Cursor/blob/main/src/svg/README.md) +> Check Figma file [here](https://www.figma.com/file/i7nfGDWCTWlNJlnhmvHDfh/Google-Cursor?node-id=0%3A1) @@ -110,7 +111,6 @@ Cursor theme inspired on **google material design** for `Windows` and `Linux` wi GoogleDot Cursors 🍭

- ### Manual Install #### Linux/X11 @@ -126,7 +126,6 @@ mv GoogleDot ~/.icons/ sudo mv GoogleDot /usr/share/icons/ ``` - #### Windows 1. unzip `GoogleDot_Windows.zip` file @@ -139,18 +138,19 @@ sudo mv GoogleDot /usr/share/icons/ # Dependencies -## Runtime Dependencies +## External Libraries -- libxcursor-dev -- libx11-dev -- libpng-dev (<=1.6) +- libxcursor +- libx11 +- libpng (<=1.6) -#### Install Runtime Dependencies +#### Install External Libraries ##### macOS ```bash -brew cask install xquartz libpng +brew install --cask xquartz +brew install libpng ``` ##### Debain/ubuntu @@ -168,26 +168,46 @@ sudo pacman -S libx11 libxcursor libpng ##### Fedora/Fedora Silverblue/CentOS/RHEL ```bash -sudo dnf install libx11-devel libxcursor-devel libpng-devel +sudo dnf install libX11-devel libXcursor-devel libpng-devel ``` ## Build Dependencies -- [nodejs](https://nodejs.org/en/) (<=12.x.x) -- [yarn](https://classic.yarnpkg.com/en/docs/install/) -- [python](https://www.python.org/downloads/) (<=3.6) -- [pip3](https://pip.pypa.io/en/stable/installing/) +- [gcc](https://gcc.gnu.org/install/) +- [make](https://www.gnu.org/software/make/) +- [nodejs](https://nodejs.org/en/) (<=12.x.x) +- [yarn](https://classic.yarnpkg.com/en/docs/install/) +- [python](https://www.python.org/downloads/) (<=3.8) +- [pip3](https://pip.pypa.io/en/stable/installing/) ### Node Packages -- [puppeteer](https://www.npmjs.com/package/puppeteer) -- [pngjs](https://www.npmjs.com/package/pngjs) -- [pixelmatch](https://www.npmjs.com/package/pixelmatch) +- [puppeteer](https://www.npmjs.com/package/puppeteer) +- [pngjs](https://www.npmjs.com/package/pngjs) +- [pixelmatch](https://www.npmjs.com/package/pixelmatch) ### PyPi Packages -- [clickgen](https://pypi.org/project/clickgen/s) -- [Pillow](https://pypi.org/project/Pillow/) +- [clickgen](https://pypi.org/project/clickgen/s) + +## Build Dependencies + +- [gcc](https://gcc.gnu.org/install/) +- [make](https://www.gnu.org/software/make/) +- [nodejs](https://nodejs.org/en/) (<=12.x.x) +- [yarn](https://classic.yarnpkg.com/en/docs/install/) +- [python](https://www.python.org/downloads/) (<=3.8) +- [pip3](https://pip.pypa.io/en/stable/installing/) + +### Node Packages + +- [puppeteer](https://www.npmjs.com/package/puppeteer) +- [pngjs](https://www.npmjs.com/package/pngjs) +- [pixelmatch](https://www.npmjs.com/package/pixelmatch) + +### PyPi Packages + +- [clickgen](https://pypi.org/project/clickgen/s) ## Build From Scratch @@ -197,50 +217,44 @@ GitHub Actions is automatically runs on every `push`(on **main** and **dev** bra ### Manual Build -#### Setup python environment - ```bash -python3 -m pip install --upgrade pip # Update pip to latest -python3 -m pip3 install virtualenv # Install python virtual environment -virtualenv venv # Create new virtualenv named `venv` -source venv/bin/activate # Activate virtualenv - -# For Deactivate virtualenv -deactivate +make ``` -#### Compile From Source - -> Make sure your [python environment](#setup-python-environment) setup and `virtualenv` is **active**. +#### Build `XCursor` theme ```bash -yarn install # Install all Node Packages -yarn py_install # Install all PyPi Packages -yarn compile # Compile the cursor theme +make unix ``` -After build `bitmaps` and `themes` directory are generated at project **root**. +#### Customize `XCursor` size -### Install Build Theme +```bash +make unix X_SIZES=22 # Only built '22px' pixel-size. +make unix X_SIZES=22 24 32 # Multiple sizes are provided with ' '(Space) +``` -All builded cursor themes are available inside `themes` directory. +#### Install `XCursor` theme + +```bash +make install # install as user + # OR +sudo make install # install as root +``` -#### Linux +#### Build `Windows` theme ```bash -cd ./themes -rm -rf ~/.icons/GoogleDot && cp GoogleDot ~/.icons/ # installing Theme to local user(recommend) +make windows ``` -#### Windows +#### Customize `Windows Cursor` size -1. unzip `GoogleDot_Windows.zip` file -2. Open the `settings` app. -3. **Goto** `Devices` -> `Mouse` -> `Additional Mouse Options`. -4. **Goto** the `pointers` tab. -5. Replace each cursor in the currently applied cursor set with the corresponding cursor in the `GoogleDot_Windows` folder. -6. Click "**save as**" and type in the desired name. -7. Click "**apply**" and "**ok**". +```bash +make windows WIN_SIZE=96 # Supports only one pixel-size +``` + +> For installation follow [these](#windows) steps. @@ -279,4 +293,4 @@ Give a **★** or Follow on [GitHub](https://github.com/ful1e5),That's work as *

I'm Using Katana -

\ No newline at end of file +

diff --git a/bitmapper/Makefile b/bitmapper/Makefile new file mode 100644 index 0000000..bcb0df7 --- /dev/null +++ b/bitmapper/Makefile @@ -0,0 +1,18 @@ +all: install render + +.PHONY: all + +install: node_modules package.json + @yarn install + +render: + @yarn render + +watch: + @yarn watch + +node_modules: + @mkdir -p $@ + +clean: + @rm -rf node_modules yarn.lock diff --git a/bitmapper/package.json b/bitmapper/package.json new file mode 100644 index 0000000..ea0355d --- /dev/null +++ b/bitmapper/package.json @@ -0,0 +1,32 @@ +{ + "name": "google_cursor", + "version": "1.0.1", + "description": "🍭 Cursor theme inspired on Google", + "main": "index.js", + "repository": "git@github.com:ful1e5/Google_Cursor.git", + "author": "Kaiz Khatri", + "license": "GPL-3.0", + "private": true, + "scripts": { + "clean": "rm -rf bitmaps themes", + "dev": "nodemon src/index.ts", + "watch": "nodemon --inspect src/index.ts", + "py_install": "pip install -r requirements.txt", + "render": "npx ts-node src/index.ts", + "build": "python build.py", + "compile": "yarn clean && yarn render && yarn build" + }, + "devDependencies": { + "@types/pixelmatch": "^5.2.2", + "@types/pngjs": "^3.4.2", + "@types/puppeteer": "^5.4.2", + "nodemon": "^2.0.7", + "ts-node": "^9.1.1", + "typescript": "^4.1.3" + }, + "dependencies": { + "pixelmatch": "^5.2.1", + "pngjs": "^6.0.0", + "puppeteer": "^5.5.0" + } +} diff --git a/bitmapper/src/config.ts b/bitmapper/src/config.ts new file mode 100644 index 0000000..6ab4744 --- /dev/null +++ b/bitmapper/src/config.ts @@ -0,0 +1,23 @@ +import path from "path"; +import { readdirSync, existsSync } from "fs"; + +// Directory resolve +const projectRoot = path.resolve(__dirname, "../../"); + +const outDir = path.resolve(projectRoot, "bitmaps"); +const staticSvgDir = path.resolve(projectRoot, "svg", "static"); +const animatedSvgDir = path.resolve(projectRoot, "svg", "animated"); + +// Generate a svg list +if (!existsSync(staticSvgDir) || !existsSync(animatedSvgDir)) { + throw new Error("svg directory not found"); +} + +const staticCursors = readdirSync(staticSvgDir).map((f) => + path.resolve(staticSvgDir, f) +); +const animatedCursors = readdirSync(animatedSvgDir).map((f) => + path.resolve(animatedSvgDir, f) +); + +export { staticCursors, animatedCursors, outDir }; diff --git a/bitmapper/src/index.ts b/bitmapper/src/index.ts new file mode 100644 index 0000000..d51f0f5 --- /dev/null +++ b/bitmapper/src/index.ts @@ -0,0 +1,127 @@ +import fs from "fs"; +import path from "path"; +import puppeteer, { ElementHandle, Page } from "puppeteer"; + +import { animatedCursors, outDir, staticCursors } from "./config"; +import { frameNumber } from "./utils/frameNumber"; +import { matchImages } from "./utils/matchImages"; +import { toHTML } from "./utils/toHTML"; + +const getSVGElement = async (page: Page) => { + const svg = await page.$("#container svg"); + + if (!svg) { + throw new Error("svg element not found!"); + } + return svg; +}; + +const screenshot = async (element: ElementHandle): Promise => { + return element.screenshot({ + omitBackground: true, + encoding: "binary", + }); +}; + +const stopAnimation = async (page: Page) => { + // @ts-ignore + await page._client.send("Animation.setPlaybackRate", { + playbackRate: 0, + }); +}; + +const resumeAnimation = async (page: Page, playbackRate: number = 0.1) => { + // @ts-ignore + await page._client.send("Animation.setPlaybackRate", { + playbackRate, + }); +}; + +const saveFrameImage = (key: string, frame: Buffer) => { + const out_path = path.resolve(outDir, key); + fs.writeFileSync(out_path, frame, { encoding: "binary" }); +}; + +const main = async () => { + const browser = await puppeteer.launch({ + ignoreDefaultArgs: ["--single-process", "--no-sandbox"], + headless: true, + }); + + if (!fs.existsSync(outDir)) { + fs.mkdirSync(outDir); + } else { + throw new Error(`out directory '${outDir}' already exists.`); + } + + for (const svgFilePath of staticCursors) { + const svgData = fs.readFileSync(svgFilePath, "utf-8"); + if (!svgData) { + throw new Error(`${svgFilePath} File Read error`); + } + + const page = await browser.newPage(); + const html = toHTML(svgData); + + await page.setContent(html); + const svg = await getSVGElement(page); + + const key = `${path.basename(svgFilePath, ".svg")}.png`; + const out = path.join(outDir, key); + + console.log("Saving", key, "..."); + await svg.screenshot({ omitBackground: true, path: out }); + await page.close(); + } + + for (const svgFilePath of animatedCursors) { + const svgData = fs.readFileSync(svgFilePath, "utf8"); + if (!svgData) { + throw new Error(`${svgFilePath} File Read error`); + } + + const page = await browser.newPage(); + const html = toHTML(svgData); + + await page.setContent(html); + const svg = await getSVGElement(page); + await stopAnimation(page); + + let index = 1; + const frameLimit = 300; + let breakRendering = false; + let prevImg: Buffer; + + // Rendering frames till `imgN` matched to `imgN-1` (When Animation is done) + while (!breakRendering) { + if (index > frameLimit) { + throw new Error("Reached the frame limit."); + } + + resumeAnimation(page); + const img = await screenshot(svg); + stopAnimation(page); + + if (index > 1) { + // @ts-ignore + const diff = matchImages(prevImg, img); + if (diff <= 100) { + breakRendering = !breakRendering; + } + } + const frame = frameNumber(index, 3); + const key = `${path.basename(svgFilePath, ".svg")}-${frame}.png`; + + console.log("Saving", key, "..."); + saveFrameImage(key, img); + + prevImg = img; + ++index; + } + + await page.close(); + } + await browser.close(); +}; + +main(); diff --git a/bitmapper/src/utils/frameNumber.ts b/bitmapper/src/utils/frameNumber.ts new file mode 100644 index 0000000..76d1165 --- /dev/null +++ b/bitmapper/src/utils/frameNumber.ts @@ -0,0 +1,7 @@ +export const frameNumber = (index: number, padding: number) => { + let result = "" + index; + while (result.length < padding) { + result = "0" + result; + } + return result; +}; diff --git a/bitmapper/src/utils/matchImages.ts b/bitmapper/src/utils/matchImages.ts new file mode 100644 index 0000000..e1a2844 --- /dev/null +++ b/bitmapper/src/utils/matchImages.ts @@ -0,0 +1,11 @@ +import Pixelmatch from "pixelmatch"; +import { PNG } from "pngjs"; + +export const matchImages = (img1: Buffer, img2: Buffer): number => { + const { data: img1Data, width, height } = PNG.sync.read(img1); + const { data: imgNData } = PNG.sync.read(img2); + + return Pixelmatch(img1Data, imgNData, null, width, height, { + threshold: 0.001, + }); +}; diff --git a/src/utils/htmlTemplate.ts b/bitmapper/src/utils/toHTML.ts similarity index 68% rename from src/utils/htmlTemplate.ts rename to bitmapper/src/utils/toHTML.ts index 05ea0cb..36fbbf4 100644 --- a/src/utils/htmlTemplate.ts +++ b/bitmapper/src/utils/toHTML.ts @@ -4,7 +4,7 @@ export const template = ` - Eggy Render Template + Render Template @@ -15,5 +15,5 @@ export const template = ` `; -export const generateRenderTemplate = (svg: string) => - template.replace("", svg); +export const toHTML = (svgData: string): string => + template.replace("", svgData); diff --git a/bitmapper/tsconfig.json b/bitmapper/tsconfig.json new file mode 100644 index 0000000..9bb0cc5 --- /dev/null +++ b/bitmapper/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "strict": true, + "noUnusedLocals": true, + "strictNullChecks": true, + "esModuleInterop": true, + "target": "ES2015", + "module": "commonjs", + "lib": ["es2015", "dom"], + "noUnusedParameters": true + } +} diff --git a/yarn.lock b/bitmapper/yarn.lock similarity index 78% rename from yarn.lock rename to bitmapper/yarn.lock index 866df31..df97966 100644 --- a/yarn.lock +++ b/bitmapper/yarn.lock @@ -2,27 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -36,9 +15,9 @@ defer-to-connect "^1.0.1" "@types/node@*": - version "14.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.2.tgz#d25295f9e4ca5989a2c610754dc02a9721235eeb" - integrity sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg== + version "14.14.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" + integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== "@types/pixelmatch@^5.2.2": version "5.2.2" @@ -54,10 +33,10 @@ dependencies: "@types/node" "*" -"@types/puppeteer@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-3.0.2.tgz#20085220593b560c7332b6d46aecaf81ae263540" - integrity sha512-JRuHPSbHZBadOxxFwpyZPeRlpPTTeMbQneMdpFd8LXdyNfFSiX950CGewdm69g/ipzEAXAmMyFF1WOWJOL/nKw== +"@types/puppeteer@^5.4.2": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.2.tgz#80f3a1f54dedbbf750779716de81401549062072" + integrity sha512-yjbHoKjZFOGqA6bIEI2dfBE5UPqU0YGWzP+ipDVP1iGzmlhksVKTBVZfT3Aj3wnvmcJ2PQ9zcncwOwyavmafBw== dependencies: "@types/node" "*" @@ -95,13 +74,6 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -122,27 +94,20 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bl@^4.0.3: version "4.0.3" @@ -193,17 +158,12 @@ buffer-from@^1.0.0: integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer@^5.2.1, buffer@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + base64-js "^1.3.1" + ieee754 "^1.1.13" cacheable-request@^6.0.0: version "6.1.0" @@ -223,15 +183,6 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@^2.0.0, chalk@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -241,9 +192,9 @@ chalk@^3.0.0: supports-color "^7.1.0" chokidar@^3.2.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" - integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -253,7 +204,7 @@ chokidar@^3.2.2: normalize-path "~3.0.0" readdirp "~3.5.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.1" chownr@^1.1.1: version "1.1.4" @@ -277,13 +228,6 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -291,21 +235,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -323,15 +257,20 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" @@ -343,9 +282,9 @@ debug@^2.2.0: ms "2.0.0" debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" @@ -366,10 +305,10 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -devtools-protocol@0.0.799653: - version "0.0.799653" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.799653.tgz#86fc95ce5bf4fdf4b77a58047ba9d2301078f119" - integrity sha512-t1CcaZbvm8pOlikqrsIM9GOa7Ipp07+4h/q9u0JXBWjPCjHdBl9KkddX87Vv9vBHoBGtwV79sYQNGnQM6iS5gg== +devtools-protocol@0.0.818844: + version "0.0.818844" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" + integrity sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg== diff@^4.0.1: version "4.0.2" @@ -410,16 +349,6 @@ escape-goat@^2.0.0: resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - extract-zip@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -463,15 +392,10 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fsevents@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" + integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== get-stream@^4.1.0: version "4.1.0" @@ -494,7 +418,7 @@ glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.3: +glob@^7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -507,11 +431,11 @@ glob@^7.1.1, glob@^7.1.3: path-is-absolute "^1.0.0" global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" + integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== dependencies: - ini "^1.3.5" + ini "1.3.7" got@^9.6.0: version "9.6.0" @@ -550,13 +474,6 @@ has-yarn@^2.1.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -570,10 +487,10 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-by-default@^1.0.1: version "1.0.1" @@ -603,10 +520,15 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +ini@1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== is-binary-path@~2.1.0: version "2.1.0" @@ -622,13 +544,6 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== - dependencies: - has "^1.0.3" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -689,19 +604,6 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" @@ -762,7 +664,7 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -772,27 +674,30 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nodemon@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.6.tgz#1abe1937b463aaf62f0d52e2b7eaadf28cc2240d" - integrity sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +nodemon@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.7.tgz#6f030a0a0ebe3ea1ba2a38f71bf9bab4841ced32" + integrity sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== dependencies: chokidar "^3.2.2" debug "^3.2.6" @@ -873,11 +778,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -907,10 +807,10 @@ pngjs@^4.0.1: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe" integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg== -pngjs@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" - integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== +pngjs@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" + integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== prepend-http@^2.0.0: version "2.0.0" @@ -941,21 +841,22 @@ pump@^3.0.0: once "^1.3.1" pupa@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.0.tgz#9e4ec587952b5e4f2c06fe577b0e7db97e8ef721" - integrity sha512-Pj8EhJzFiPwnf4dEXpuUWwH8M/Yl4vpl4cN2RX1i3R77DWvbY5ZPKni7CCKkOYxz+XKt2fieemsV+WTZbIlYzg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== dependencies: escape-goat "^2.0.0" -puppeteer@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.3.1.tgz#324e190d89f25ac33dba539f57b82a18553f8646" - integrity sha512-YTM1RaBeYrj6n7IlRXRYLqJHF+GM7tasbvrNFx6w1S16G76NrPq7oYFKLDO+BQsXNtS8kW2GxWCXjIMPvfDyaQ== +puppeteer@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.5.0.tgz#331a7edd212ca06b4a556156435f58cbae08af00" + integrity sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg== dependencies: debug "^4.1.0" - devtools-protocol "0.0.799653" + devtools-protocol "0.0.818844" extract-zip "^2.0.0" https-proxy-agent "^4.0.0" + node-fetch "^2.6.1" pkg-dir "^4.2.0" progress "^2.0.1" proxy-from-env "^1.0.0" @@ -991,9 +892,9 @@ readdirp@~3.5.0: picomatch "^2.2.1" registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: rc "^1.2.8" @@ -1004,14 +905,6 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -resolve@^1.3.2: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== - dependencies: - is-core-module "^2.0.0" - path-parse "^1.0.6" - responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -1038,7 +931,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -semver@^5.3.0, semver@^5.7.1: +semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -1066,11 +959,6 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -1115,7 +1003,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -1130,19 +1018,19 @@ supports-color@^7.1.0: has-flag "^4.0.0" tar-fs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5" - integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" - tar-stream "^2.0.0" + tar-stream "^2.1.4" -tar-stream@^2.0.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa" - integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw== +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" end-of-stream "^1.4.1" @@ -1151,9 +1039,9 @@ tar-stream@^2.0.0: readable-stream "^3.1.1" term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== through@^2.3.8: version "2.3.8" @@ -1179,48 +1067,18 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -ts-node@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" - integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== dependencies: arg "^4.1.0" + create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.17" yn "3.1.1" -tslib@^1.13.0, tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslint@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.13.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -1233,10 +1091,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5" - integrity sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg== +typescript@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== unbzip2-stream@^1.3.3: version "1.4.3" @@ -1314,9 +1172,9 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^7.2.3: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== xdg-basedir@^4.0.0: version "4.0.0" diff --git a/build.py b/build.py deleted file mode 100644 index 2382e1a..0000000 --- a/build.py +++ /dev/null @@ -1,16 +0,0 @@ -import log -from clickgen import build_cursor_theme - -from config import name, sizes, delay, bitmaps_dir, temp_folder -from helper import init_build, pack_it - - -def build() -> None: - init_build() - build_cursor_theme(name, image_dir=bitmaps_dir, - cursor_sizes=sizes, out_path=temp_folder, hotspots=None, archive=False, delay=delay) - pack_it() - - -if __name__ == "__main__": - build() diff --git a/builder/Makefile b/builder/Makefile new file mode 100644 index 0000000..4ee31b6 --- /dev/null +++ b/builder/Makefile @@ -0,0 +1,35 @@ + +all: clean setup build + +.PHONY: all + +.ONESHELL: +SHELL:=/bin/bash + +X_SIZES ?=22 24 28 32 40 48 56 64 72 80 88 96 +WIN_CANVAS_SIZE ?= 32 +WIN_SIZE ?= 24 + +clean: + @rm -rf gbpkg.egg-info build dist + @find -iname "*.pyc" -delete + + # Removing setup.py package files if installed + @if [ -f "files.txt" ]; then + @xargs rm -rf < files.txt + @rm -rf files.txt + @fi + +setup: setup.py + @test -d venv || python3 -m venv venv + @. venv/bin/activate; python3 setup.py install --record files.txt + +build: setup build.py + @. venv/bin/activate; python3 build.py --xsizes $(X_SIZES) --win-size $(WIN_SIZE) --win-canvas-size $(WIN_CANVAS_SIZE) + +build_unix: setup build.py + @. venv/bin/activate; python3 build.py unix --xsizes $(X_SIZES) + +build_windows: setup build.py + @. venv/bin/activate; python3 build.py windows --win-size $(WIN_SIZE) --win-canvas-size $(WIN_CANVAS_SIZE) + diff --git a/builder/build.py b/builder/build.py new file mode 100644 index 0000000..376e787 --- /dev/null +++ b/builder/build.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse +from pathlib import Path + +from gbpkg.configure import get_config +from gbpkg.generator import xbuild, wbuild, build + +parser = argparse.ArgumentParser( + prog="google_dot_builder", + description="'GoogleDot' cursor build python script.", +) + +# Positional Args. +parser.add_argument( + "platform", + choices=("windows", "unix", "all"), + default="all", + const="all", + nargs="?", + help="Set package type, Which you want to build. (default: '%(default)s')", +) + + +# Optional Args. +parser.add_argument( + "-p", + "--png-dir", + dest="png_dir", + metavar="PNG", + type=str, + default="../bitmaps", + help="To change pngs directory. (default: %(default)s)", +) + +parser.add_argument( + "-o", + "--out-dir", + dest="out_dir", + metavar="OUT", + type=str, + default="../themes", + help="To change output directory. (default: %(default)s)", +) + + +parser.add_argument( + "-xs", + "--xsizes", + dest="xsizes", + metavar="INT", + nargs="+", + default=[ + 22, + 24, + 28, + 32, + 40, + 48, + 56, + 64, + 72, + 80, + 88, + 96, + ], + type=int, + help="Set pixel-size for xcursor. (default: %(default)s)", +) + + +parser.add_argument( + "-ws", + "--win-size", + dest="win_size", + metavar="INT", + default=24, + type=int, + help="Set pixel-size for Windows cursors. (default: %(default)s)", +) + + +parser.add_argument( + "-wcs", + "--win-canvas-size", + dest="win_canvas_size", + metavar="INT", + default=32, + type=int, + help="Set pixel-size for Windows cursor's canvas. (default: %(default)s)", +) + +# Preparing build +args = parser.parse_args() + +bitmaps_dir = Path(args.png_dir) + +x_out_dir = Path(args.out_dir) / "GoogleDot" +win_out_dir = Path(args.out_dir) / "GoogleDot_Windows" + +config = get_config( + bitmaps_dir, + x_sizes=args.xsizes, + win_canvas_size=args.win_canvas_size, + win_size=args.win_size, +) + +if args.platform == "unix": + xbuild(config, x_out_dir) +elif args.platform == "windows": + wbuild(config, win_out_dir) +else: + build(config, x_out_dir, win_out_dir) diff --git a/builder/gbpkg/__init__.py b/builder/gbpkg/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/builder/gbpkg/configure.py b/builder/gbpkg/configure.py new file mode 100644 index 0000000..f818382 --- /dev/null +++ b/builder/gbpkg/configure.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from typing import Any, Dict, Tuple, TypeVar + +from clickgen.util import PNGProvider + +from gbpkg.constants import WIN_CURSORS_CFG, WIN_DELAY, X_CURSORS_CFG, X_DELAY + + +X = TypeVar("X") + + +def to_tuple(x: X) -> Tuple[X, X]: + return (x, x) + + +def get_config(bitmaps_dir, **kwargs) -> Dict[str, Any]: + """Return configuration of `GoogleDot` pointers. + + ``` + Args: + + :bitmaps_dir: (str | Path) Path to .png file's directory. + + + Keywords Args: + + :x_sizes: (List[int]) List of pixel-sizes for xcursors. + + :win_canvas_size: (int) Windows cursor's canvas pixel-size. + + :win_size: (int) Pixel-size for Windows cursor. + + ``` + + Example: + + ```python + get_config( + "./bitmaps", + x_sizes=[(24, 24), (32, 32)], + win_canvas_size=(32, 32), + win_size=(24, 24), + ) + ``` + """ + + w_size = to_tuple(kwargs.pop("win_size")) + w_canvas_size = to_tuple(kwargs.pop("win_canvas_size")) + raw_x_sizes = kwargs.pop("x_sizes") + + x_sizes = [] + for size in raw_x_sizes: + x_sizes.append(to_tuple(size)) + + png_provider = PNGProvider(bitmaps_dir) + config: Dict[str, Any] = {} + + for key, item in X_CURSORS_CFG.items(): + x_hot: int = int(item.get("xhot", 0)) + y_hot: int = int(item.get("yhot", 0)) + hotspot: Tuple[int, int] = (x_hot, y_hot) + + delay: int = int(item.get("delay", X_DELAY)) + png = png_provider.get(key) + if not png: + raise FileNotFoundError(f"{key} not found") + + data = { + "png": png, + "x_sizes": x_sizes, + "hotspot": hotspot, + "delay": delay, + } + + win_data = WIN_CURSORS_CFG.get(key) + + if win_data: + win_key: str = str(win_data.get("to")) + + position: str = str(win_data.get("position", "center")) + win_delay: int = int(win_data.get("delay", WIN_DELAY)) + + canvas_size = win_data.get("canvas_size", w_canvas_size) + win_size = win_data.get("size", w_size) + + # Because provided cursor size is bigger than cursor's canvas. + # Also, "position" settings will not effect on cursor because the + # cursor's canvas and cursor sizes are equals. + if (win_size[0] > canvas_size[0]) | (win_size[1] > canvas_size[1]): + canvas_size = win_size + + config[key] = { + **data, + "win_key": win_key, + "position": position, + "canvas_size": canvas_size, + "win_size": win_size, + "win_delay": win_delay, + } + else: + config[key] = data + + return config diff --git a/builder/gbpkg/constants.py b/builder/gbpkg/constants.py new file mode 100644 index 0000000..0c727c9 --- /dev/null +++ b/builder/gbpkg/constants.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from typing import Dict + +# Info +THEME_NAME = "GoogleDot" +COMMENT = "Cursor theme inspired on Google" +AUTHOR = "Kaiz Khatri" +URL = "https://github.com/ful1e5/Google_Cursor" + +# XCursor +X_DELAY: int = 10 + + +# Windows Cursor +WIN_DELAY = 1 + +X_CURSORS_CFG: Dict[str, Dict[str, int]] = { + ########## + # Static # + ########## + "all-scroll.png": {"xhot": 100, "yhot": 100}, + "bottom_left_corner.png": {"xhot": 100, "yhot": 100}, + "bottom_right_corner.png": {"xhot": 100, "yhot": 100}, + "bottom_tee.png": {"xhot": 100, "yhot": 100}, + "context-menu.png": {"xhot": 100, "yhot": 100}, + "copy.png": {"xhot": 100, "yhot": 100}, + "cross.png": {"xhot": 100, "yhot": 100}, + "dnd_no_drop.png": {"xhot": 100, "yhot": 100}, + "dotbox.png": {"xhot": 100, "yhot": 100}, + "hand1.png": {"xhot": 100, "yhot": 100}, + "hand2.png": {"xhot": 100, "yhot": 100}, + "left_ptr.png": {"xhot": 100, "yhot": 100}, + "left_tee.png": {"xhot": 100, "yhot": 100}, + "link.png": {"xhot": 100, "yhot": 100}, + "ll_angle.png": {"xhot": 100, "yhot": 100}, + "lr_angle.png": {"xhot": 100, "yhot": 100}, + "move.png": {"xhot": 100, "yhot": 100}, + "pencil.png": {"xhot": 100, "yhot": 100}, + "plus.png": {"xhot": 100, "yhot": 100}, + "question_arrow.png": {"xhot": 100, "yhot": 100}, + "right_ptr.png": {"xhot": 100, "yhot": 100}, + "right_tee.png": {"xhot": 100, "yhot": 100}, + "sb_down_arrow.png": {"xhot": 100, "yhot": 100}, + "sb_h_double_arrow.png": {"xhot": 100, "yhot": 100}, + "sb_left_arrow.png": {"xhot": 100, "yhot": 100}, + "sb_right_arrow.png": {"xhot": 100, "yhot": 100}, + "sb_up_arrow.png": {"xhot": 100, "yhot": 100}, + "sb_v_double_arrow.png": {"xhot": 100, "yhot": 100}, + "top_tee.png": {"xhot": 100, "yhot": 100}, + "ul_angle.png": {"xhot": 100, "yhot": 100}, + "ur_angle.png": {"xhot": 100, "yhot": 100}, + "vertical-text.png": {"xhot": 100, "yhot": 100}, + "wayland-cursor.png": {"xhot": 100, "yhot": 100}, + "X_cursor.png": {"xhot": 100, "yhot": 100}, + "xterm.png": {"xhot": 100, "yhot": 89}, + "zoom-in.png": {"xhot": 100, "yhot": 100}, + "zoom-out.png": {"xhot": 100, "yhot": 100}, + ############ + # Animated # + ############ + # Note: Animated cursors don't need an extension and frame numbers. + "left_ptr_watch": {"xhot": 100, "yhot": 100}, + "wait": {"xhot": 100, "yhot": 100}, +} + +WIN_CURSORS_CFG: Dict[str, Dict[str, str]] = { + ########## + # Static # + ########## + "right_ptr.png": {"to": "Alternate", "position": "top_right"}, + "cross.png": {"to": "Cross"}, + "left_ptr.png": {"to": "Default", "position": "top_left"}, + "bottom_right_corner.png": {"to": "Diagonal_1"}, + "bottom_left_corner.png": {"to": "Diagonal_2"}, + "pencil.png": {"to": "Handwriting"}, + "question_arrow.png": {"to": "Help", "position.png": "top_left"}, + "sb_h_double_arrow.png": {"to": "Horizontal"}, + "xterm.png": {"to": "IBeam", "position": "top_left"}, + "hand2.png": {"to": "Link", "position": "top_left"}, + "hand1.png": {"to": "Move"}, + "dnd_no_drop.png": {"to": "Unavailiable", "position": "top_left"}, + "sb_v_double_arrow.png": {"to": "Vertical"}, + ############ + # Animated # + ############ + # Note: Animated cursors don't need frame numbers. + "left_ptr_watch": {"to": "Work", "position": "top_left"}, + "wait": {"to": "Busy"}, +} diff --git a/builder/gbpkg/generator.py b/builder/gbpkg/generator.py new file mode 100644 index 0000000..c5fd773 --- /dev/null +++ b/builder/gbpkg/generator.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pathlib import Path +from typing import Any, Dict + +from clickgen.builders import WindowsCursor, XCursor +from clickgen.core import CursorAlias +from clickgen.packagers import WindowsPackager, XPackager + +from gbpkg.constants import AUTHOR, COMMENT, THEME_NAME, URL +from gbpkg.symlinks import add_missing_xcursor + + +def xbuild( + config: Dict[str, Dict[str, Any]], + x_out_dir: Path, +) -> None: + """Build `GoogleDot` cursor theme for only `X11`(UNIX) platform. + + ``` + :config: (Dict) `GoogleDot` configuration. + + :x_out_dir: (Path) Path to the output directory, + Where the `X11` cursor theme package will generate. + It also creates a directory if not exists. + ``` + """ + + for _, item in config.items(): + png = item["png"] + hotspot = item["hotspot"] + x_sizes = item["x_sizes"] + delay = item["delay"] + + with CursorAlias.from_bitmap(png, hotspot) as alias: + x_cfg = alias.create(x_sizes, delay) + print(f"Building '{x_cfg.stem}' XCursor...") + XCursor.create(x_cfg, x_out_dir) + + add_missing_xcursor(x_out_dir / "cursors") + XPackager(x_out_dir, THEME_NAME, COMMENT) + + +def wbuild(config: Dict[str, Dict[str, Any]], win_out_dir: Path) -> None: + """Build `GoogleDot` cursor theme for only `Windows` platforms. + + ``` + :config: (Dict) `GoogleDot` configuration. + + :win_out_dir: (Path) Path to the output directory, + Where the `Windows` cursor theme package will generate. + It also creates a directory if not exists. + ``` + """ + + for _, item in config.items(): + png = item["png"] + hotspot = item["hotspot"] + x_sizes = item["x_sizes"] + delay = item["delay"] + + with CursorAlias.from_bitmap(png, hotspot) as alias: + alias.create(x_sizes, delay) + + if item.get("win_key"): + position = item["position"] + win_size = item["win_size"] + win_key = item["win_key"] + canvas_size = item["canvas_size"] + win_delay = item["win_delay"] + + win_cfg = alias.reproduce( + win_size, canvas_size, position, delay=win_delay + ).rename(win_key) + print(f"Building '{win_cfg.stem}' Windows Cursor...") + WindowsCursor.create(win_cfg, win_out_dir) + + WindowsPackager(win_out_dir, THEME_NAME, COMMENT, AUTHOR, URL) + + +def build( + config: Dict[str, Dict[str, Any]], x_out_dir: Path, win_out_dir: Path +) -> None: + """Build `GoogleDot` cursor theme for `X11` & `Windows` platforms. + + ``` + :config: (Dict) `GoogleDot` configuration. + + :x_out_dir: (Path) Path to the output directory, + Where the `X11` cursor theme package will generate. + It also creates a directory if not exists. + + :win_out_dir: (Path) Path to the output directory, + Where the `Windows` cursor theme package will generate. + It also creates a directory if not exists. + ``` + """ + + def win_build(item: Dict[str, Any], alias: CursorAlias) -> None: + position = item["position"] + win_size = item["win_size"] + win_key = item["win_key"] + canvas_size = item["canvas_size"] + win_delay = item["win_delay"] + + win_cfg = alias.reproduce( + win_size, canvas_size, position, delay=win_delay + ).rename(win_key) + print(f"Building '{win_cfg.stem}' Windows Cursor...") + WindowsCursor.create(win_cfg, win_out_dir) + + for _, item in config.items(): + png = item["png"] + hotspot = item["hotspot"] + x_sizes = item["x_sizes"] + delay = item["delay"] + + with CursorAlias.from_bitmap(png, hotspot) as alias: + x_cfg = alias.create(x_sizes, delay) + print(f"Building '{x_cfg.stem}' XCursor...") + XCursor.create(x_cfg, x_out_dir) + + if item.get("win_key"): + win_build(item, alias) + + add_missing_xcursor(x_out_dir / "cursors") + XPackager(x_out_dir, THEME_NAME, COMMENT) + + WindowsPackager(win_out_dir, THEME_NAME, COMMENT, AUTHOR, URL) diff --git a/builder/gbpkg/symlinks.py b/builder/gbpkg/symlinks.py new file mode 100644 index 0000000..e00a340 --- /dev/null +++ b/builder/gbpkg/symlinks.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +from typing import Dict, List, Union + +from clickgen.util import chdir + + +def add_missing_xcursor(directory) -> None: + """Add missing `XCursor` to the Unix cursor package. + + :directory: (Path|str) directory where XCursors are available. + """ + + symlinks: List[Dict[str, Union[str, List[str]]]] = [ + {"src": "all-scroll", "links": ["fleur", "size_all"]}, + { + "src": "bottom_left_corner", + "links": [ + "fcf1c3c7cd4491d801f1e1c78f100000", + "sw-resize", + "ne-resize", + "size_bdiag", + "nesw-resize", + "top_right_corner", + "fd_double_arrow", + ], + }, + { + "src": "bottom_right_corner", + "links": [ + "c7088f0f3e6c8088236ef8e1e3e70000", + "top_left_corner", + "se-resize", + "nw-resize", + "size_fdiag", + "nwse-resize", + "bd_double_arrow", + ], + }, + { + "src": "copy", + "links": [ + "1081e37283d90000800003c07f3ef6bf", + "6407b0e94181790501fd1e167b474872", + "b66166c04f8c3109214a4fbd64a50fc8", + "dnd-copy", + ], + }, + { + "src": "cross", + "links": [ + "cross_reverse", + "diamond_cross", + "tcross", + "color-picker", + # crosshair + "crosshair", + ], + }, + # { + # "src": "crossed_circle", + # "links": [ + # "03b6e0fcb3499374a867c041f52298f0", + # "not-allowed", + # "forbidden", + # "circle", + # ], + # }, + { + "src": "dnd_no_drop", + "links": [ + "no-drop", + # crossed_circle symlinks + "crossed_circle", + "03b6e0fcb3499374a867c041f52298f0", + "not-allowed", + "forbidden", + "circle", + ], + }, + {"src": "dotbox", "links": ["dot_box_mask", "draped_box", "icon", "target"]}, + {"src": "hand1", "links": ["grab", "openhand"]}, + { + "src": "hand2", + "links": [ + "9d800788f1b08800ae810202380a0822", + "e29285e634086352946a0e7090d73106", + "pointer", + "pointing_hand", + ], + }, + { + "src": "left_ptr", + "links": [ + "arrow", + "default", + # center_ptr symlinks + "center_ptr", + ], + }, + { + "src": "left_ptr_watch", + "links": [ + "00000000000000020006000e7e9ffc3f", + "08e8e1c95fe2fc01f976f1e063a24ccd", + "3ecb610c1bf2410f44200f48c40d3599", + "progress", + ], + }, + # {"src": "left_side", "links": ["w-resize", "right_side", "e-resize"]}, + { + "src": "link", + "links": [ + "3085a0e285430894940527032f8b26df", + "640fb0e74195791501fd1ed57b41487f", + "a2a266d0498c3104214a47bd64ab0fc8", + "alias", + "dnd-link", + ], + }, + { + "src": "move", + "links": [ + "4498f0e0c1937ffe01fd06f973665830", + "9081237383d90e509aa00f00170e968f", + "fcf21c00b30f7e3f83fe0dfd12e71cff", + "grabbing", + "pointer_move", + "dnd-move", + "closedhand", + "dnd-none", + ], + }, + {"src": "pencil", "links": ["draft"]}, + {"src": "plus", "links": ["cell"]}, + { + "src": "question_arrow", + "links": [ + "5c6cd98b3f3ebcb1f9c7f1c204630408", + "d9ce0ab605698f320427677b458ad60b", + "help", + "left_ptr_help", + "whats_this", + "dnd-ask", + ], + }, + {"src": "right_ptr", "links": ["draft_large", "draft_small"]}, # required + {"src": "sb_down_arrow", "links": ["down-arrow"]}, + { + "src": "sb_h_double_arrow", + "links": [ + "028006030e0e7ebffc7f7070c0600140", + "14fef782d02440884392942c1120523", + "col-resize", + "ew-resize", + "h_double_arrow", + "size-hor", + "size_hor", + "split_h", + # left_side symlinks + "left_side", + "w-resize", + "right_side", + "e-resize", + ], + }, + {"src": "sb_left_arrow", "links": ["left-arrow"]}, + {"src": "sb_right_arrow", "links": ["right-arrow"]}, + {"src": "sb_up_arrow", "links": ["up-arrow"]}, + { + "src": "sb_v_double_arrow", + "links": [ + "00008160000006810000408080010102", + "2870a09082c103050810ffdffffe0204", + "double_arrow", + "ns-resize", + "row-resize", + "size-ver", + "size_ver", + "split_v", + "v_double_arrow", + # top_side symlinks + "top_side", + "s-resize", + "n-resize", + "bottom_side", + ], + }, + # {"src": "top_side", "links": ["s-resize", "n-resize", "bottom_side"]}, + {"src": "wait", "links": ["watch"]}, + {"src": "X_cursor", "links": ["pirate", "x-cursor"]}, + {"src": "xterm", "links": ["ibeam", "text"]}, + ] + + with chdir(directory): + for item in symlinks: + src = item.get("src") + for link in item.get("links"): + print(f"Creating symlink {src} -> {link}") + os.symlink(src, link) diff --git a/builder/setup.py b/builder/setup.py new file mode 100644 index 0000000..2ddf303 --- /dev/null +++ b/builder/setup.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from setuptools import setup + +setup( + name="gbpkg", + version="1.0.1", + description="Generate 'GoogleDot' cursor theme from PNGs file", + url="https://github.com/ful1e5/Google_Cursor", + packages=["gbpkg"], + package_dir={"gbpkg": "gbpkg"}, + author="Kaiz Khatri", + author_email="kaizmandhu@gamil.com", + install_requires=["clickgen==1.1.8"], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + ], + python_requires=">=3.8", + zip_safe=True, +) diff --git a/config.py b/config.py deleted file mode 100644 index fe475cb..0000000 --- a/config.py +++ /dev/null @@ -1,46 +0,0 @@ -import tempfile -import json - -# Build Config -delay = 50 -name = "GoogleDot" -sizes = [22, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96] - -bitmaps_dir = "./bitmaps" -package_dir = "./themes" -temp_folder = tempfile.mkdtemp() - -# Cleanup Configs -x11_out = name -win_out = name + "-Windows" - -# getting author name -with open("./package.json") as f: - data = json.loads(f.read()) - author = data["author"] - -# Windows Cursors Config -windows_cursors = { - "left_ptr_watch.ani": "AppStarting.ani", - "left_ptr.cur": "Arrow.cur", - "crosshair.cur": "Cross.cur", - "hand2.cur": "Hand.cur", - "pencil.cur": "Handwriting.cur", - "dnd-ask.cur": "Help.cur", - "xterm.cur": "IBeam.cur", - "circle.cur": "NO.cur", - "all-scroll.cur": "SizeAll.cur", - "bd_double_arrow.cur": "SizeNWSE.cur", - "sb_v_double_arrow.cur": "SizeNS.cur", - "fd_double_arrow.cur": "SizeNESW.cur", - "sb_h_double_arrow.cur": "SizeWE.cur", - "sb_up_arrow.cur": "UpArrow.cur", - "wait.ani": "Wait.ani", -} - -# Windows install.inf file content -with open("./scripts/windows.inf") as f: - data = f.read() - window_install_inf_content = data.replace( - "", name + " Cursors" - ).replace("", author) diff --git a/helper.py b/helper.py deleted file mode 100644 index cc88968..0000000 --- a/helper.py +++ /dev/null @@ -1,71 +0,0 @@ -import shutil -import json -import sys - -from config import ( - name, - temp_folder, - bitmaps_dir, - win_out, - x11_out, - window_install_inf_content, - windows_cursors, - package_dir, -) -from os import path, listdir, rename, remove - - -x11_out_dir = path.join(package_dir, x11_out) -win_out_dir = path.join(package_dir, win_out) - - -def window_bundle() -> None: - # Remove & Rename cursors - # If Key found => Rename else Remove - for cursor in listdir(win_out_dir): - old_path = path.join(win_out_dir, cursor) - - try: - new_path = path.join(win_out_dir, windows_cursors[cursor]) - rename(old_path, new_path) - except KeyError: - remove(old_path) - - # creating install.inf file - install_inf_path = path.join(win_out_dir, "install.inf") - with open(install_inf_path, "w") as file: - file.write(window_install_inf_content) - - -def init_build() -> None: - """ - Print build version. - Remove previously built packages && Check Bitmaps. - """ - with open("./package.json", "r") as package_file: - data = json.loads(package_file.read()) - version = data["version"] - print("⚡ GoogleDot Builder v%s" % version) - - # cleanup old packages - if path.exists(package_dir): - shutil.rmtree(package_dir) - - # Checking Bitmaps directory - if not path.exists(bitmaps_dir): - print( - "⚠ BITMAPS NOT FOUND.\n\n`yarn install && yarn render` to Generates Bitmaps" - ) - sys.exit(1) - - -def pack_it() -> None: - """ - Create Crisp 📦 Packages for Windows & X11 Cursor Theme. - """ - # Rename directory - shutil.move(path.join(temp_folder, name, "x11"), x11_out_dir) - shutil.move(path.join(temp_folder, name, "win"), win_out_dir) - - # create install.inf file in Windows Theme - window_bundle() diff --git a/log.py b/log.py deleted file mode 100644 index 0e8767e..0000000 --- a/log.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python - -import logging - -logging.basicConfig( - filename="build.log", - filemode="w", - format="%(name)s - %(levelname)s - %(message)s", - level=logging.DEBUG, -) diff --git a/nodemon.json b/nodemon.json deleted file mode 100644 index cde9605..0000000 --- a/nodemon.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "restartable": "rs", - "ignore": [".git", "node_modules/**/node_modules"], - "verbose": true, - "execMap": { - "ts": "node --require ts-node/register" - }, - "watch": ["src/"], - "env": { - "NODE_ENV": "development" - }, - "ext": "js,json,ts" -} diff --git a/package.json b/package.json deleted file mode 100644 index a1e9bef..0000000 --- a/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "google_cursor", - "version": "1.0.0", - "description": "🍭 Cursor theme inspired on Google", - "main": "index.js", - "repository": "git@github.com:ful1e5/Google_Cursor.git", - "author": "Kaiz Khatri", - "license": "GPL-3.0", - "private": true, - "scripts": { - "clean": "rm -rf bitmaps themes", - "dev": "nodemon src/index.ts", - "watch": "nodemon --inspect src/index.ts", - "py_install": "pip install -r requirements.txt", - "render": "npx ts-node src/index.ts", - "build": "python build.py", - "compile": "yarn clean && yarn render && yarn build" - }, - "devDependencies": { - "@types/pixelmatch": "^5.2.2", - "@types/pngjs": "^3.4.2", - "@types/puppeteer": "^3.0.2", - "nodemon": "^2.0.6", - "ts-node": "^9.0.0", - "tslint": "^6.1.3", - "typescript": "^4.0.3" - }, - "dependencies": { - "pixelmatch": "^5.2.1", - "pngjs": "^5.0.0", - "puppeteer": "^5.3.1" - } -} diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index dbfa3c9..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -clickgen==1.1.7 -Pillow<=8.0.1 diff --git a/scripts/windows.inf b/scripts/windows.inf deleted file mode 100644 index 0586241..0000000 --- a/scripts/windows.inf +++ /dev/null @@ -1,52 +0,0 @@ -[Version] -signature="$CHICAGO$" - By Kaiz Khatri -https://github.com/ful1e5/apple_cursor - -[DefaultInstall] -CopyFiles = Scheme.Cur -AddReg = Scheme.Reg - -[DestinationDirs] -Scheme.Cur = 10,"%CUR_DIR%" - -[Scheme.Reg] -HKCU,"Control Panel\Cursors\Schemes","%SCHEME_NAME%",,"%10%\%CUR_DIR%\%pointer%,%10%\%CUR_DIR%\%help%,%10%\%CUR_DIR%\%work%,%10%\%CUR_DIR%\%busy%,%10%\%CUR_DIR%\%Cross%,%10%\%CUR_DIR%\%Text%,%10%\%CUR_DIR%\%Hand%,%10%\%CUR_DIR%\%Unavailiable%,%10%\%CUR_DIR%\%Vert%,%10%\%CUR_DIR%\%Horz%,%10%\%CUR_DIR%\%Dgn1%,%10%\%CUR_DIR%\%Dgn2%,%10%\%CUR_DIR%\%move%,%10%\%CUR_DIR%\%alternate%,%10%\%CUR_DIR%\%link%" - -; -- Installed files - -[Scheme.Cur] -"Arrow.cur" -"Help.cur" -"AppStarting.ani" -"Wait.ani" -"Cross.cur" -"IBeam.cur" -"Handwriting.cur" -"NO.cur" -"SizeNS.cur" -"SizeWE.cur" -"SizeNWSE.cur" -"SizeNESW.cur" -"SizeAll.cur" -"UpArrow.cur" -"Hand.cur" - -[Strings] -CUR_DIR = "Cursors\" -SCHEME_NAME = "" -pointer = "Arrow.cur" -help = "Help.cur" -work = "AppStarting.ani" -busy = "Wait.ani" -cross = "Cross.cur" -text = "IBeam.cur" -hand = "Handwriting.cur" -unavailiable = "NO.cur" -vert = "SizeNS.cur" -horz = "SizeWE.cur" -dgn1 = "SizeNWSE.cur" -dgn2 = "SizeNESW.cur" -move = "SizeAll.cur" -alternate = "UpArrow.cur" -link = "Hand.cur" \ No newline at end of file diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index 843b7b5..0000000 --- a/src/config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { resolve } from "path"; -import { readdirSync, existsSync } from "fs"; - -// Source Directory -const svgsDir = resolve(__dirname, "svg"); -if (!existsSync(svgsDir)) { - console.log("Source .svg files not found"); -} - -const staticCursorsDir = resolve(svgsDir, "static"); -const animatedCursorsDir = resolve(svgsDir, "animated"); - -// Out Directory -const bitmapsDir = resolve(__dirname, "../", "bitmaps"); - -// Cursors -const staticCursors = readdirSync(staticCursorsDir).map((f) => - resolve(staticCursorsDir, f) -); -const animatedCursors = readdirSync(animatedCursorsDir).map((f) => - resolve(animatedCursorsDir, f) -); - -// Animated Config -const animatedClip = { - x: 4, - y: 4, - width: 200, - height: 200, -}; -export { staticCursors, animatedCursors, bitmapsDir, animatedClip }; diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 5007114..0000000 --- a/src/index.ts +++ /dev/null @@ -1,124 +0,0 @@ -import fs from "fs"; -import path from "path"; -import puppeteer from "puppeteer"; - -import { generateRenderTemplate } from "./utils/htmlTemplate"; -import { - staticCursors, - bitmapsDir, - animatedCursors, - animatedClip, -} from "./config"; -import { matchImages } from "./utils/matchImages"; -import { saveFrames, Frames } from "./utils/saveFrames"; -import { getFrameName } from "./utils/getFrameName"; - -const main = async () => { - const browser = await puppeteer.launch({ - ignoreDefaultArgs: [" --single-process ", "--no-sandbox"], - headless: true, - }); - - if (!fs.existsSync(bitmapsDir)) { - fs.mkdirSync(bitmapsDir); - } - - try { - console.log("📸 Rendering Static Cursors..."); - - for (let svgPath of staticCursors) { - const buffer = fs.readFileSync(path.resolve(svgPath), "utf8"); - if (!buffer) throw new Error(`${svgPath} File Read error`); - - // Generating HTML Template - const data = buffer.toString(); - const template = generateRenderTemplate(data); - - // config - const bitmapName = `${path.basename(svgPath, ".svg")}.png`; - const out = path.resolve(bitmapsDir, bitmapName); - - // Render - const page = await browser.newPage(); - await page.setContent(template); - - await page.waitForSelector("#container"); - const svgElement = await page.$("#container svg"); - if (!svgElement) throw new Error("svg element not found"); - await svgElement.screenshot({ omitBackground: true, path: out }); - - await page.close(); - } - - console.log("🎥 Rendering Animated Cursors..."); - - for (let svgPath of animatedCursors) { - const buffer = fs.readFileSync(svgPath, "utf8"); - if (!buffer) throw new Error(`${svgPath} File Read error`); - - // Generating HTML Template - const data = buffer.toString(); - const template = generateRenderTemplate(data); - - const page = await browser.newPage(); - await page.setContent(template, { waitUntil: "networkidle2" }); - - await page.waitForSelector("#container"); - const svgElement = await page.$("#container svg"); - if (!svgElement) throw new Error("svg element not found"); - - // Render Config - let index = 1; - let breakRendering = false; - const frames: Frames = {}; - const firstKey = getFrameName(index, svgPath); - - console.log("Rendering", path.basename(svgPath), "..."); - console.log(firstKey); - - // 1st Frame - frames[firstKey] = { - buffer: await svgElement.screenshot({ - omitBackground: true, - clip: animatedClip, - encoding: "binary", - }), - }; - - // Pushing frames until it match to 1st frame - index++; - while (!breakRendering) { - const newFrame = await svgElement.screenshot({ - omitBackground: true, - clip: animatedClip, - encoding: "binary", - }); - const key = getFrameName(index, svgPath); - console.log(key); - const diff = matchImages({ - img1Buff: frames[firstKey].buffer, - img2Buff: newFrame, - }); - - if (!(diff < 700)) { - frames[key] = { buffer: newFrame }; - } else { - breakRendering = true; - } - index++; - } - - saveFrames(frames); - - await page.close(); - } - - console.log(`\nBitmaps stored at ${bitmapsDir}\n\n🎉 Render Done.`); - process.exit(0); - } catch (error) { - console.error(error); - process.exit(1); - } -}; - -main(); diff --git a/src/svg/README.md b/src/svg/README.md deleted file mode 100644 index e3d6153..0000000 --- a/src/svg/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Cursor Source Info - -## Symbolic Cursors - -| Preview | Source | Symbolic links | Windows Cursor name | -| :-------------------------------------------------------: | :---------------------: | :-------------------------------------------------------------: | :--------------------------: | -| | all_scroll.svg | `None` | `SizeAll.cur` | -| | bottom_left_corner.svg | `fd_double_arrow.svg` `top_right_corner.svg` | `SizeNESW.cur` | -| | bottom_right_corner.svg | `bd_double_arrow.svg` `top_left_corner.svg` | `SizeNWSE.cur` | -| | bottom_tee.svg | `None` | | -| | center_ptr.svg | `None` | | -| | circle.svg | `crossed_circle.svg` `dnd_no_drop.svg` | `NO.cur` | -| | context_menu.svg | `None` | | -| | copy.svg | `dnd_copy.svg` | | -| | cross.svg | `tcross.svg` | | -| | crosshair.svg | `None` | `Cross.cur` | -| | dotbox.svg | `None` | | -| | hand1.svg | `None` | | -| | hand2.svg | `None` | `Hand.cur` | -| | left_ptr.svg | `None` | `Arrow.cur` | -| | left_side.svg | `right_side.svg` | | -| | left_tee.svg | `None` | | -| | link.svg | `dnd_link.svg` | | -| | ll_angle.svg | `None` | | -| | lr_angle.svg | `None` | | -| | move.svg | `dnd_move.svg` `dnd_none.svg` `grabbing.svg` `pointer_move.svg` | | -| | pencil.svg | `None` | `Handwriting.cur` | -| | plus.svg | `None` | | -| | question_arrow.svg | `dnd_ask.svg` | `Help.cur` | -| | right_ptr.svg | `None` | | -| | right_tee.svg | `None` | | -| | sb_down_arrow.svg | `None` | | -| | sb_h_double_arrow.svg | `None` | `SizeWE.cur` | -| | sb_left_arrow.svg | `None` | | -| | sb_right_arrow.svg | `None` | | -| | sb_up_arrow.svg | `None` | `UpArrow.cur` | -| | sb_v_double_arrow.svg | `None` | `SizeNS.cur` | -| | top_side.svg | `bottom_side.svg` | | -| | top_tee.svg | `None` | | -| | ul_angle.svg | `None` | | -| | ur_angle.svg | `None` | | -| | vertical_text.svg | `None` | | -| | wait.svg | `left_ptr_watch.svg` | `AppStarting.ani` `Wait.ani` | -| | wayland_cursor.svg | `None` | | -| | x_cursor.svg | `None` | | -| | xterm.svg | `None` | `IBeam.cur` | -| | zoom_in.svg | `None` | | -| | zoom_out.svg | `None` | | - - - - diff --git a/src/svg/animated/wait.svg b/src/svg/animated/wait.svg deleted file mode 100644 index fb03daa..0000000 --- a/src/svg/animated/wait.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/svg/static/bd_double_arrow.svg b/src/svg/static/bd_double_arrow.svg deleted file mode 120000 index a3a3e2d..0000000 --- a/src/svg/static/bd_double_arrow.svg +++ /dev/null @@ -1 +0,0 @@ -bottom_right_corner.svg \ No newline at end of file diff --git a/src/svg/static/bottom_left_corner.svg b/src/svg/static/bottom_left_corner.svg deleted file mode 100644 index ecc4ea4..0000000 --- a/src/svg/static/bottom_left_corner.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/bottom_right_corner.svg b/src/svg/static/bottom_right_corner.svg deleted file mode 100644 index 47603fa..0000000 --- a/src/svg/static/bottom_right_corner.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/bottom_side.svg b/src/svg/static/bottom_side.svg deleted file mode 120000 index 9c7bb92..0000000 --- a/src/svg/static/bottom_side.svg +++ /dev/null @@ -1 +0,0 @@ -top_side.svg \ No newline at end of file diff --git a/src/svg/static/bottom_tee.svg b/src/svg/static/bottom_tee.svg deleted file mode 100644 index f6dc412..0000000 --- a/src/svg/static/bottom_tee.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/center_ptr.svg b/src/svg/static/center_ptr.svg deleted file mode 100644 index 304f6ef..0000000 --- a/src/svg/static/center_ptr.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/svg/static/circle.svg b/src/svg/static/circle.svg deleted file mode 100644 index 9392cf4..0000000 --- a/src/svg/static/circle.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/context_menu.svg b/src/svg/static/context_menu.svg deleted file mode 100644 index 43e14f9..0000000 --- a/src/svg/static/context_menu.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/copy.svg b/src/svg/static/copy.svg deleted file mode 100644 index 1387ec4..0000000 --- a/src/svg/static/copy.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/cross.svg b/src/svg/static/cross.svg deleted file mode 100644 index d894d8d..0000000 --- a/src/svg/static/cross.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/svg/static/crossed_circle.svg b/src/svg/static/crossed_circle.svg deleted file mode 100644 index 8535691..0000000 --- a/src/svg/static/crossed_circle.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/svg/static/crosshair.svg b/src/svg/static/crosshair.svg deleted file mode 100644 index 09f696f..0000000 --- a/src/svg/static/crosshair.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/svg/static/dnd_ask.svg b/src/svg/static/dnd_ask.svg deleted file mode 120000 index 14c57d2..0000000 --- a/src/svg/static/dnd_ask.svg +++ /dev/null @@ -1 +0,0 @@ -question_arrow.svg \ No newline at end of file diff --git a/src/svg/static/dnd_copy.svg b/src/svg/static/dnd_copy.svg deleted file mode 120000 index 4b1d7e7..0000000 --- a/src/svg/static/dnd_copy.svg +++ /dev/null @@ -1 +0,0 @@ -copy.svg \ No newline at end of file diff --git a/src/svg/static/dnd_link.svg b/src/svg/static/dnd_link.svg deleted file mode 120000 index 4abb12d..0000000 --- a/src/svg/static/dnd_link.svg +++ /dev/null @@ -1 +0,0 @@ -link.svg \ No newline at end of file diff --git a/src/svg/static/dnd_move.svg b/src/svg/static/dnd_move.svg deleted file mode 120000 index 37362fe..0000000 --- a/src/svg/static/dnd_move.svg +++ /dev/null @@ -1 +0,0 @@ -move.svg \ No newline at end of file diff --git a/src/svg/static/dnd_no_drop.svg b/src/svg/static/dnd_no_drop.svg deleted file mode 100644 index f636fbe..0000000 --- a/src/svg/static/dnd_no_drop.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/dnd_none.svg b/src/svg/static/dnd_none.svg deleted file mode 120000 index 37362fe..0000000 --- a/src/svg/static/dnd_none.svg +++ /dev/null @@ -1 +0,0 @@ -move.svg \ No newline at end of file diff --git a/src/svg/static/dotbox.svg b/src/svg/static/dotbox.svg deleted file mode 100644 index 32e58c9..0000000 --- a/src/svg/static/dotbox.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/fd_double_arrow.svg b/src/svg/static/fd_double_arrow.svg deleted file mode 120000 index acc15d0..0000000 --- a/src/svg/static/fd_double_arrow.svg +++ /dev/null @@ -1 +0,0 @@ -bottom_left_corner.svg \ No newline at end of file diff --git a/src/svg/static/grabbing.svg b/src/svg/static/grabbing.svg deleted file mode 120000 index 37362fe..0000000 --- a/src/svg/static/grabbing.svg +++ /dev/null @@ -1 +0,0 @@ -move.svg \ No newline at end of file diff --git a/src/svg/static/hand1.svg b/src/svg/static/hand1.svg deleted file mode 100644 index 1b65ca7..0000000 --- a/src/svg/static/hand1.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/hand2.svg b/src/svg/static/hand2.svg deleted file mode 100644 index 172f354..0000000 --- a/src/svg/static/hand2.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/left_ptr.svg b/src/svg/static/left_ptr.svg deleted file mode 100644 index bf8f500..0000000 --- a/src/svg/static/left_ptr.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/left_side.svg b/src/svg/static/left_side.svg deleted file mode 100644 index 0982847..0000000 --- a/src/svg/static/left_side.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/svg/static/left_tee.svg b/src/svg/static/left_tee.svg deleted file mode 100644 index c14a78d..0000000 --- a/src/svg/static/left_tee.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/link.svg b/src/svg/static/link.svg deleted file mode 100644 index cb2e097..0000000 --- a/src/svg/static/link.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/ll_angle.svg b/src/svg/static/ll_angle.svg deleted file mode 100644 index 78fc6a3..0000000 --- a/src/svg/static/ll_angle.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/lr_angle.svg b/src/svg/static/lr_angle.svg deleted file mode 100644 index 7184991..0000000 --- a/src/svg/static/lr_angle.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/move.svg b/src/svg/static/move.svg deleted file mode 100644 index 2cff4c2..0000000 --- a/src/svg/static/move.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/pencil.svg b/src/svg/static/pencil.svg deleted file mode 100644 index baa6c99..0000000 --- a/src/svg/static/pencil.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/plus.svg b/src/svg/static/plus.svg deleted file mode 100644 index 10d4426..0000000 --- a/src/svg/static/plus.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/pointer_move.svg b/src/svg/static/pointer_move.svg deleted file mode 120000 index 37362fe..0000000 --- a/src/svg/static/pointer_move.svg +++ /dev/null @@ -1 +0,0 @@ -move.svg \ No newline at end of file diff --git a/src/svg/static/question_arrow.svg b/src/svg/static/question_arrow.svg deleted file mode 100644 index 272e764..0000000 --- a/src/svg/static/question_arrow.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/right_ptr.svg b/src/svg/static/right_ptr.svg deleted file mode 100644 index 8dcbe1e..0000000 --- a/src/svg/static/right_ptr.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/svg/static/right_side.svg b/src/svg/static/right_side.svg deleted file mode 120000 index 36e195a..0000000 --- a/src/svg/static/right_side.svg +++ /dev/null @@ -1 +0,0 @@ -left_side.svg \ No newline at end of file diff --git a/src/svg/static/right_tee.svg b/src/svg/static/right_tee.svg deleted file mode 100644 index 8ba22f7..0000000 --- a/src/svg/static/right_tee.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/sb_down_arrow.svg b/src/svg/static/sb_down_arrow.svg deleted file mode 100644 index 8f96717..0000000 --- a/src/svg/static/sb_down_arrow.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/sb_h_double_arrow.svg b/src/svg/static/sb_h_double_arrow.svg deleted file mode 100644 index 1a2f351..0000000 --- a/src/svg/static/sb_h_double_arrow.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/sb_left_arrow.svg b/src/svg/static/sb_left_arrow.svg deleted file mode 100644 index 6491106..0000000 --- a/src/svg/static/sb_left_arrow.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/sb_right_arrow.svg b/src/svg/static/sb_right_arrow.svg deleted file mode 100644 index 47f3f56..0000000 --- a/src/svg/static/sb_right_arrow.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/sb_up_arrow.svg b/src/svg/static/sb_up_arrow.svg deleted file mode 100644 index 627e252..0000000 --- a/src/svg/static/sb_up_arrow.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/sb_v_double_arrow.svg b/src/svg/static/sb_v_double_arrow.svg deleted file mode 100644 index 0b3757f..0000000 --- a/src/svg/static/sb_v_double_arrow.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/top_left_corner.svg b/src/svg/static/top_left_corner.svg deleted file mode 120000 index a3a3e2d..0000000 --- a/src/svg/static/top_left_corner.svg +++ /dev/null @@ -1 +0,0 @@ -bottom_right_corner.svg \ No newline at end of file diff --git a/src/svg/static/top_right_corner.svg b/src/svg/static/top_right_corner.svg deleted file mode 120000 index acc15d0..0000000 --- a/src/svg/static/top_right_corner.svg +++ /dev/null @@ -1 +0,0 @@ -bottom_left_corner.svg \ No newline at end of file diff --git a/src/svg/static/top_side.svg b/src/svg/static/top_side.svg deleted file mode 100644 index b8666bc..0000000 --- a/src/svg/static/top_side.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/svg/static/top_tee.svg b/src/svg/static/top_tee.svg deleted file mode 100644 index ffd9248..0000000 --- a/src/svg/static/top_tee.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/ul_angle.svg b/src/svg/static/ul_angle.svg deleted file mode 100644 index 60b1912..0000000 --- a/src/svg/static/ul_angle.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/ur_angle.svg b/src/svg/static/ur_angle.svg deleted file mode 100644 index fdb9b82..0000000 --- a/src/svg/static/ur_angle.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/vertical_text.svg b/src/svg/static/vertical_text.svg deleted file mode 100644 index afc487f..0000000 --- a/src/svg/static/vertical_text.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/svg/static/wayland_cursor.svg b/src/svg/static/wayland_cursor.svg deleted file mode 100644 index 3114d5d..0000000 --- a/src/svg/static/wayland_cursor.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/svg/static/x_cursor.svg b/src/svg/static/x_cursor.svg deleted file mode 100644 index 45fa0a6..0000000 --- a/src/svg/static/x_cursor.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/svg/static/xterm.svg b/src/svg/static/xterm.svg deleted file mode 100644 index 73d7b47..0000000 --- a/src/svg/static/xterm.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/svg/static/zoom_in.svg b/src/svg/static/zoom_in.svg deleted file mode 100644 index 6a37c6d..0000000 --- a/src/svg/static/zoom_in.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/svg/static/zoom_out.svg b/src/svg/static/zoom_out.svg deleted file mode 100644 index da679da..0000000 --- a/src/svg/static/zoom_out.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/utils/getFrameName.ts b/src/utils/getFrameName.ts deleted file mode 100644 index 5b3dfff..0000000 --- a/src/utils/getFrameName.ts +++ /dev/null @@ -1,14 +0,0 @@ -import path from "path"; - -export const frameNumber = (index: number, endIndex: number) => { - let result = "" + index; - while (result.length < endIndex) { - result = "0" + result; - } - return result; -}; - -export const getFrameName = (index: number, fileName: string) => { - const frame = frameNumber(index, 2); - return `${path.basename(fileName, ".svg")}-${frame}.png`; -}; diff --git a/src/utils/matchImages.ts b/src/utils/matchImages.ts deleted file mode 100644 index aceffa8..0000000 --- a/src/utils/matchImages.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PNG } from "pngjs"; -import pixelmatch from "pixelmatch"; - -interface MatchImagesArgs { - img1Buff: Buffer; - img2Buff: Buffer; -} - -export const matchImages = ({ img1Buff, img2Buff }: MatchImagesArgs) => { - const img1 = PNG.sync.read(img1Buff); - const img2 = PNG.sync.read(img2Buff); - const { width, height } = img1; - - const diff = new PNG({ width, height }); - - return pixelmatch(img1.data, img2.data, diff.data, width, height, { - threshold: 0.25, - }); -}; diff --git a/src/utils/saveFrames.ts b/src/utils/saveFrames.ts deleted file mode 100644 index f3be527..0000000 --- a/src/utils/saveFrames.ts +++ /dev/null @@ -1,16 +0,0 @@ -import fs from "fs"; -import path from "path"; -import { bitmapsDir } from "../config"; - -export interface Frames { - [fileName: string]: { - buffer: Buffer; - }; -} - -export const saveFrames = (frames: Frames) => { - for (let [fileName, { buffer }] of Object.entries(frames)) { - const out_path = path.resolve(bitmapsDir, fileName); - fs.writeFileSync(out_path, buffer, { encoding: "binary" }); - } -}; diff --git a/src/svg/animated/left_ptr_watch.svg b/svg/animated/left_ptr_watch.svg similarity index 100% rename from src/svg/animated/left_ptr_watch.svg rename to svg/animated/left_ptr_watch.svg diff --git a/svg/animated/wait.svg b/svg/animated/wait.svg new file mode 100644 index 0000000..9e14168 --- /dev/null +++ b/svg/animated/wait.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/X_cursor.svg b/svg/static/X_cursor.svg new file mode 100644 index 0000000..055e57e --- /dev/null +++ b/svg/static/X_cursor.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/svg/static/all_scroll.svg b/svg/static/all-scroll.svg similarity index 100% rename from src/svg/static/all_scroll.svg rename to svg/static/all-scroll.svg diff --git a/svg/static/bottom_left_corner.svg b/svg/static/bottom_left_corner.svg new file mode 100644 index 0000000..6c36adf --- /dev/null +++ b/svg/static/bottom_left_corner.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/bottom_right_corner.svg b/svg/static/bottom_right_corner.svg new file mode 100644 index 0000000..1b7f868 --- /dev/null +++ b/svg/static/bottom_right_corner.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/bottom_tee.svg b/svg/static/bottom_tee.svg new file mode 100644 index 0000000..9c4fb6a --- /dev/null +++ b/svg/static/bottom_tee.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/context-menu.svg b/svg/static/context-menu.svg new file mode 100644 index 0000000..816edb3 --- /dev/null +++ b/svg/static/context-menu.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/copy.svg b/svg/static/copy.svg new file mode 100644 index 0000000..09ab8f4 --- /dev/null +++ b/svg/static/copy.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/cross.svg b/svg/static/cross.svg new file mode 100644 index 0000000..a584ef2 --- /dev/null +++ b/svg/static/cross.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/dnd_no_drop.svg b/svg/static/dnd_no_drop.svg new file mode 100644 index 0000000..f1ea5b3 --- /dev/null +++ b/svg/static/dnd_no_drop.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/dotbox.svg b/svg/static/dotbox.svg new file mode 100644 index 0000000..3420bb1 --- /dev/null +++ b/svg/static/dotbox.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/hand1.svg b/svg/static/hand1.svg new file mode 100644 index 0000000..7386e1d --- /dev/null +++ b/svg/static/hand1.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/hand2.svg b/svg/static/hand2.svg new file mode 100644 index 0000000..bbada2f --- /dev/null +++ b/svg/static/hand2.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/left_ptr.svg b/svg/static/left_ptr.svg new file mode 100644 index 0000000..a00f8ed --- /dev/null +++ b/svg/static/left_ptr.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/left_tee.svg b/svg/static/left_tee.svg new file mode 100644 index 0000000..8b397e7 --- /dev/null +++ b/svg/static/left_tee.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/link.svg b/svg/static/link.svg new file mode 100644 index 0000000..872bbd7 --- /dev/null +++ b/svg/static/link.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/ll_angle.svg b/svg/static/ll_angle.svg new file mode 100644 index 0000000..723060c --- /dev/null +++ b/svg/static/ll_angle.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/lr_angle.svg b/svg/static/lr_angle.svg new file mode 100644 index 0000000..b7c2803 --- /dev/null +++ b/svg/static/lr_angle.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/move.svg b/svg/static/move.svg new file mode 100644 index 0000000..6dc9c12 --- /dev/null +++ b/svg/static/move.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/svg/static/tcross.svg b/svg/static/pencil.svg similarity index 100% rename from src/svg/static/tcross.svg rename to svg/static/pencil.svg diff --git a/svg/static/plus.svg b/svg/static/plus.svg new file mode 100644 index 0000000..5b7e06d --- /dev/null +++ b/svg/static/plus.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/question_arrow.svg b/svg/static/question_arrow.svg new file mode 100644 index 0000000..5a3d143 --- /dev/null +++ b/svg/static/question_arrow.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/right_ptr.svg b/svg/static/right_ptr.svg new file mode 120000 index 0000000..e94216c --- /dev/null +++ b/svg/static/right_ptr.svg @@ -0,0 +1 @@ +left_ptr.svg \ No newline at end of file diff --git a/svg/static/right_tee.svg b/svg/static/right_tee.svg new file mode 100644 index 0000000..cc12c73 --- /dev/null +++ b/svg/static/right_tee.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/sb_down_arrow.svg b/svg/static/sb_down_arrow.svg new file mode 100644 index 0000000..b060888 --- /dev/null +++ b/svg/static/sb_down_arrow.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/sb_h_double_arrow.svg b/svg/static/sb_h_double_arrow.svg new file mode 100644 index 0000000..0f7fcda --- /dev/null +++ b/svg/static/sb_h_double_arrow.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/sb_left_arrow.svg b/svg/static/sb_left_arrow.svg new file mode 100644 index 0000000..e295161 --- /dev/null +++ b/svg/static/sb_left_arrow.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/sb_right_arrow.svg b/svg/static/sb_right_arrow.svg new file mode 100644 index 0000000..e6577ba --- /dev/null +++ b/svg/static/sb_right_arrow.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/sb_up_arrow.svg b/svg/static/sb_up_arrow.svg new file mode 100644 index 0000000..9102a76 --- /dev/null +++ b/svg/static/sb_up_arrow.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/sb_v_double_arrow.svg b/svg/static/sb_v_double_arrow.svg new file mode 100644 index 0000000..348711c --- /dev/null +++ b/svg/static/sb_v_double_arrow.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/top_tee.svg b/svg/static/top_tee.svg new file mode 100644 index 0000000..6e18b7d --- /dev/null +++ b/svg/static/top_tee.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/ul_angle.svg b/svg/static/ul_angle.svg new file mode 100644 index 0000000..2933bae --- /dev/null +++ b/svg/static/ul_angle.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/ur_angle.svg b/svg/static/ur_angle.svg new file mode 100644 index 0000000..f7811c8 --- /dev/null +++ b/svg/static/ur_angle.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/vertical-text.svg b/svg/static/vertical-text.svg new file mode 100644 index 0000000..3d5f002 --- /dev/null +++ b/svg/static/vertical-text.svg @@ -0,0 +1,19 @@ + + + + + + + diff --git a/svg/static/wayland-cursor.svg b/svg/static/wayland-cursor.svg new file mode 100644 index 0000000..4bdfce9 --- /dev/null +++ b/svg/static/wayland-cursor.svg @@ -0,0 +1,19 @@ + + + + + + + diff --git a/svg/static/xterm.svg b/svg/static/xterm.svg new file mode 100644 index 0000000..d2d933d --- /dev/null +++ b/svg/static/xterm.svg @@ -0,0 +1,19 @@ + + + + + + + diff --git a/svg/static/zoom-in.svg b/svg/static/zoom-in.svg new file mode 100644 index 0000000..6181608 --- /dev/null +++ b/svg/static/zoom-in.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/static/zoom-out.svg b/svg/static/zoom-out.svg new file mode 100644 index 0000000..e9c39b3 --- /dev/null +++ b/svg/static/zoom-out.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index a26a563..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "es2017", - "module": "commonjs", - "lib": ["es2015", "dom"], - "outDir": "dist", - "typeRoots": ["node_modules/@types"], - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "resolveJsonModule": true, - "noFallthroughCasesInSwitch": true, - "esModuleInterop": true - }, - "include": ["src/**/*", "node_modules/@types/puppeteer/index.d.ts"], - "exclude": ["node_modules", "**/*.test.ts"] -}