From 681303a09c5b95e1d350e3029b846870b5c14c1d Mon Sep 17 00:00:00 2001 From: nirtamir2 Date: Sun, 19 Sep 2021 18:41:53 +0300 Subject: [PATCH] feat: add TypeScript declarations to `@svgr/core` (#555) --- __fixtures__/simple-existing/index..js | 2 +- package.json | 4 +- packages/core/package.json | 1 + packages/core/src/index.d.ts | 96 +++++++++++++++++++++ packages/core/src/index.errors.ts | 10 +++ packages/core/src/index.types.ts | 15 ++++ yarn.lock | 115 +++++++++++++++++++++++-- 7 files changed, 233 insertions(+), 10 deletions(-) create mode 100644 packages/core/src/index.d.ts create mode 100644 packages/core/src/index.errors.ts create mode 100644 packages/core/src/index.types.ts diff --git a/__fixtures__/simple-existing/index..js b/__fixtures__/simple-existing/index..js index e2a362ff..edaa3199 100644 --- a/__fixtures__/simple-existing/index..js +++ b/__fixtures__/simple-existing/index..js @@ -1 +1 @@ -export { default as File. } from './File.' \ No newline at end of file +export { default as File } from './File' \ No newline at end of file diff --git a/package.json b/package.json index 6ae5904f..4e5b9f63 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ ], "scripts": { "build": "lerna run build", - "ci": "yarn build && yarn lint && yarn test --ci --coverage && codecov", + "ci": "yarn build && yarn lint && yarn check-dts && yarn test --ci --coverage && codecov", + "check-dts": "check-dts", "dev": "lerna run build --parallel -- --watch", "format": "prettier --write \"**/*.{js,json,md}\"", "lint": "eslint .", @@ -24,6 +25,7 @@ "babel-eslint": "^10.0.1", "babel-jest": "^27.1.1", "babel-loader": "^8.2.2", + "check-dts": "^0.4.4", "codecov": "^3.8.3", "conventional-github-releaser": "^3.1.5", "eslint": "^7.32.0", diff --git a/packages/core/package.json b/packages/core/package.json index 04459460..450eb9da 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -18,6 +18,7 @@ "engines": { "node": ">=10" }, + "types": "src", "homepage": "https://react-svgr.com", "funding": { "type": "github", diff --git a/packages/core/src/index.d.ts b/packages/core/src/index.d.ts new file mode 100644 index 00000000..858bbde9 --- /dev/null +++ b/packages/core/src/index.d.ts @@ -0,0 +1,96 @@ +export interface TemplateOptions extends SvgrOpts {} + +export interface TemplateData { + imports?: string[] + interfaces?: string[] + componentName?: string + props?: string[] + jsx?: string + exports?: string[] +} + +export type TemplateFunc = ( + templateOptions: { template: unknown }, + opts: TemplateOptions, + data: TemplateData, +) => string + +export interface SvgrOpts { + /** Specify a custom config file. */ + configFile?: string + /** Replace SVG width and height with 1em to make SVG inherit text size. */ + icon?: boolean + /** Custom extension for generated files (default "js"). */ + ext?: string + /** Modify all SVG nodes with uppercase and use react-native-svg template. */ + native?: boolean | { expo: boolean } + /** Generate .tsx files with TypeScript bindings. */ + typescript?: boolean + /** Keep width and height attributes from the root SVG tag. */ + dimensions?: boolean + /** Forward all properties on the React component to the SVG tag. */ + expandProps?: 'start' | 'end' | false + /** Use Prettier to format JavaScript code output. */ + prettier?: boolean + /** Specify prettier config. */ + prettierConfig?: Record + /** Use SVGO to optimize SVG code before transforming into a React component. Default: true. */ + svgo?: boolean + /** Specify SVGO config. https://gist.github.com/pladaria/69321af86ce165c2c1fc1c718b098dd0 */ + svgoConfig?: Record + /** Forward the ref to the root SVG tag if true. */ + ref?: boolean + /** Wrap the exported component in React.memo if true. */ + memo?: boolean + /** + * Replace an attribute value by another. Intended for changing an Icon + * color to currentColor to inherit from text color. + * + * Specify dynamic property using curly braces: { '#000': "{props.color}" } + */ + replaceAttrValues?: Record + /** + * Add props to the SVG tag. + * + * Specify dynamic property using curly braces: { focusable: "{true}" }. + * Particularly useful with a custom template. + */ + svgProps?: Record + /** + * Add title tag via title property. If titleProp is set to true and no + * title is provided (title={undefined}) at render time, this will fallback + * to an existing title element in the svg if it exists. + */ + titleProp?: boolean + /** + * Specify a template file (CLI) or a template function (API) to use. + * For an example of template, see the default one. + * https://github.com/gregberge/svgr/blob/main/packages/babel-plugin-transform-svg-component/src/index.js + */ + template?: TemplateFunc + /** Output files into a directory. */ + outDir?: string + /** + * Specify a template function (API) to change default index.js output + * (when --out-dir is used). + * + * https://github.com/gregberge/svgr/blob/main/packages/cli/src/dirCommand.js#L39 + */ + indexTemplate?: (filePaths: string[]) => string + /** When used with --out-dir, it ignores already existing files. */ + ignoreExisting?: boolean + /** + * Specify a custom filename case. Possible values: pascal for PascalCase, + * kebab for kebab-case or camel for camelCase. + */ + filenameCase?: 'kebab' | 'camel' | 'pascal' +} + +type ConvertT = { + (svgCode: string, opts?: SvgrOpts, state?: TemplateData): Promise + sync: (svgCode: string, opts?: SvgrOpts, state?: TemplateData) => void +} + +declare const convert: ConvertT + +export default convert diff --git a/packages/core/src/index.errors.ts b/packages/core/src/index.errors.ts new file mode 100644 index 00000000..fb2a3d15 --- /dev/null +++ b/packages/core/src/index.errors.ts @@ -0,0 +1,10 @@ +import svgr from '.' + +// THROWS Argument of type 'null' is not assignable to parameter of type 'string'. +svgr(null) + +// THROWS Argument of type 'undefined' is not assignable to parameter of type 'string'. +svgr(undefined) + +// THROWS Expected 1-3 arguments, but got 0. +svgr() diff --git a/packages/core/src/index.types.ts b/packages/core/src/index.types.ts new file mode 100644 index 00000000..f9adebfc --- /dev/null +++ b/packages/core/src/index.types.ts @@ -0,0 +1,15 @@ +import svgr from '.' + +const svgCode = ` + + + +` + +svgr(svgCode) +svgr(svgCode, { icon: false }, { componentName: 'MyComponent' }) +svgr(svgCode, { icon: false, memo: true }) +svgr(svgCode, undefined, { componentName: 'MyComponent' }) +svgr.sync(svgCode, { replaceAttrValues: { '#000': '{props.color}' } }) diff --git a/yarn.lock b/yarn.lock index 5c8b3949..a614bb62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3076,7 +3076,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: +base64-js@^1.0.2, 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== @@ -3128,7 +3128,21 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bn.js@^4.0.0, bn.js@^4.1.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -3297,6 +3311,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -3510,6 +3532,18 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +check-dts@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/check-dts/-/check-dts-0.4.4.tgz#c75962cdad0ae5a521763527e0b51913f3f502d0" + integrity sha512-ZhpZ3k9uPqCNinDtnwRBQaYV8YeHsho4A6YV9P5u20KIxLMftRjAyWwKNGquP5+HfsEJpzYXQ930MfCnvBwlkg== + dependencies: + ci-job-number "^1.2.2" + colorette "^1.2.1" + globby "^11.0.2" + ora "^5.3.0" + typescript "^4.1.3" + vfile-location "^3.2.0" + chokidar@^2.1.5: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -3569,6 +3603,11 @@ ci-info@^3.1.1: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +ci-job-number@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/ci-job-number/-/ci-job-number-1.2.2.tgz#f4e5918fcaeeda95b604f214be7d7d4a961fe0c0" + integrity sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -3606,7 +3645,7 @@ cli-cursor@^2.1.0: cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" @@ -3616,6 +3655,11 @@ cli-spinners@^1.1.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.5.0: + version "2.6.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -3746,7 +3790,7 @@ color@^3.0.0: color-convert "^1.9.3" color-string "^1.6.0" -colorette@^1.3.0: +colorette@^1.2.1, colorette@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== @@ -5906,7 +5950,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globby@^11.0.1, globby@^11.0.2: +globby@^11.0.1: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== @@ -5918,6 +5962,18 @@ globby@^11.0.1, globby@^11.0.2: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.2: + version "11.0.3" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + got@^8.0.0: version "8.3.2" resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" @@ -6282,7 +6338,7 @@ icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= -ieee754@^1.1.4: +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6657,6 +6713,11 @@ is-html@^1.1.0: dependencies: html-tags "^1.0.0" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -6794,6 +6855,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-url@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" @@ -7758,6 +7824,14 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8764,6 +8838,21 @@ ora@^2.1.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" +ora@^5.3.0: + version "5.4.0" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz#42eda4855835b9cd14d33864c97a3c95a3f56bf4" + integrity sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -10017,7 +10106,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -10302,7 +10391,7 @@ restore-cursor@^2.0.0: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -11602,6 +11691,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^4.1.3: + version "4.2.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== + uglify-js@^3.1.4: version "3.14.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" @@ -11894,6 +11988,11 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"