{"id":16760312,"url":"https://github.com/ryanve/ssv","last_synced_at":"2025-04-10T17:37:13.195Z","repository":{"id":10788006,"uuid":"66987659","full_name":"ryanve/ssv","owner":"ryanve","description":"Space Separated Values. JavaScript library for spaced data. Fun and fast for classnames and beyond :two_hearts:","archived":false,"fork":false,"pushed_at":"2023-07-18T21:27:33.000Z","size":210,"stargazers_count":7,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-02T18:56:27.631Z","etag":null,"topics":["blink-182","classes","classlist","classname","classnames","css-classes","data","fleek","javascript","library","opensource","set-theory","spaced","spaces","ssv","strings","values"],"latest_commit_sha":null,"homepage":"https://ryanve.dev/ssv","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"upl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ryanve.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"github":"ryanve"}},"created_at":"2016-08-31T00:27:02.000Z","updated_at":"2024-07-13T18:21:15.000Z","dependencies_parsed_at":"2024-01-18T00:31:14.168Z","dependency_job_id":"6a05fbaa-0eb0-40b2-9743-630ca4961308","html_url":"https://github.com/ryanve/ssv","commit_stats":{"total_commits":145,"total_committers":3,"mean_commits":"48.333333333333336","dds":"0.020689655172413834","last_synced_commit":"def37c7cfe4ed4633d3b54e7790b7f12beca5a0b"},"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fssv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fssv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fssv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fssv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryanve","download_url":"https://codeload.github.com/ryanve/ssv/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248262040,"owners_count":21074236,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blink-182","classes","classlist","classname","classnames","css-classes","data","fleek","javascript","library","opensource","set-theory","spaced","spaces","ssv","strings","values"],"created_at":"2024-10-13T04:23:05.972Z","updated_at":"2025-04-10T17:37:13.173Z","avatar_url":"https://github.com/ryanve.png","language":"JavaScript","funding_links":["https://github.com/sponsors/ryanve"],"categories":[],"sub_categories":[],"readme":"# ssv\n\n- [Opensource](LICENSE.txt) JavaScript for space separated values\n- Uses [simple methods](#methods) you can [explore online](https://ryanve.github.io/ssv/)\n- [Coded](ssv.js) universally for [websites](#download) or [Node.js](#package)\n- Compresses `\u003c600B`\n- [Fully tested](test.js)\n\n### [download](https://raw.githubusercontent.com/ryanve/ssv/master/ssv.js)\n\n```js\n\u003cscript src=\"ssv.js\"\u003e\u003c/script\u003e\n```\n\n### [package](https://www.npmjs.com/package/ssv)\n\n```\nnpm install ssv\n```\n\n```js\nconst ssv = require(\"ssv\")\n```\n\n## methods\n\n- [`ssv.all`](#all)\n- [`ssv.and`](#and)\n- [`ssv.any`](#any)\n- [`ssv.at`](#at)\n- [`ssv.blank`](#blank)\n- [`ssv.count`](#count)\n- [`ssv.edit`](#edit)\n- [`ssv.gum`](#gum)\n- [`ssv.jam`](#jam)\n- [`ssv.not`](#not)\n- [`ssv.or`](#or)\n- [`ssv.say`](#say)\n- [`ssv.split`](#split)\n- [`ssv.state`](#state)\n- [`ssv.xor`](#xor)\n- [`ssv.yolo`](#yolo)\n\n### `all`\n\nTest if SSV contains **all** search values\n\n```js\nssv.all(SSV=\"\", search=\"\")\n```\n\n```js\nssv.all(\"mark tom travis\", \"scott\") // false\nssv.all(\"mark tom travis\", \"mark tom\") // true\nssv.all(\"mark tom travis\", \"mark scott\") // false\n```\n\n### `and`\n\n- Get unique values present both in `left` **and** `right`\n- Ideal for intersecting\n\n```js\nssv.and(left=\"\", right=\"\")\n```\n\n```js\nssv.and(\"\", \"mark\") // \"\"\nssv.and(\"mark matt travis\", \"tom scott\") // \"\"\nssv.and(\"mark tom tom\", \"mark tom travis\") // \"mark tom\"\n```\n\n```js\nlet many = [\"mark tom\", \"mark travis\", \"mark matt\"]\nmany.reduce(ssv.and) // \"mark\"\n```\n\n### `any`\n\nTest if SSV contains **any** search values\n\n```js\nssv.any(SSV=\"\", search=\"\")\n```\n\n```js\nssv.any(\"mark tom travis\", \"matt\") // false\nssv.any(\"mark tom travis\", \"mark\") // true\nssv.any(\"mark tom travis\", \"mark scott\") // true\nssv.any(\"mark tom travis\", \"mark travis\") // true\n```\n\n### `at`\n\nGet the value at `index`\n\n```js\nssv.at(SSV=\"\", index)\n```\n\n```js\nssv.at(\"mark tom travis\", 0) // \"mark\"\nssv.at(\"mark tom travis\", 1) // \"tom\"\nssv.at(\"mark tom travis\", -1) // \"travis\"\nssv.at(\"mark tom travis\", -2) // \"tom\"\nssv.at(\"mark tom travis\", 5) // \"\"\n```\n\n### `blank`\n\nTest if SSV is blank\n\n```js\nssv.blank(SSV=\"\")\n```\n\n```js\nssv.blank(\"travis\") // false\nssv.blank(\"      \") // true\nssv.blank(\"\") // true\nssv.blank(0) // false\nssv.blank() // true\n```\n\n### `count`\n\nCount SSV values\n\n```js\nssv.count(SSV=\"\")\n```\n\n```js\nssv.count(\"matt matt matt\") // 3\nssv.count(\"mark      tom \") // 2\n```\n\n### `edit`\n\n- Edit an SSV string via an object or string\n- Optimal for batch editing CSS classes\n- Keys for falsey values are removed\n- Keys for truthy values are added\n- Removals process before adds\n- Result is compact and unique\n- Like [`ssv.or`](#or) if `boss` is string\n- [`ssv.state`](#state) uses [`ssv.edit`](#edit)\n\n```js\nssv.edit(SSV=\"\", boss={})\n```\n\n```js\nssv.edit(\"mark tom travis\", {\n  \"matt\": true,\n  \"tom scott\": false\n}) // \"mark travis matt\"\n\nssv.edit(\"mark\", {\n  \"mark travis\": true,\n  \"travis\": false\n}) // \"mark travis\"\n```\n\n```js\nssv.edit(\"mark tom scott\", Object.assign(\n  { scott: false },\n  { travis: true }\n)) // \"mark tom travis\"\n```\n\n```js\nlet bosses = [/* objects or strings */]\nbosses.reduce(ssv.edit, \"\") // forward\nbosses.reduceRight(ssv.edit, \"\") // backward\n```\n\n### `gum`\n\nConcatenate with compact space\n\n```js\nssv.gum(left=\"\", right=\"\")\n```\n\n```js\nssv.gum(\"mark tom\", \"scott travis\") // \"mark tom scott travis\"\nssv.gum(\"mark tom\", \"tom   travis\") // \"mark tom tom travis\"\n```\n\n```js\nlet many = [\"tom tom\", null, \"travis travis\", \"\"]\nmany.reduce(ssv.gum) // \"tom tom travis travis\"\n```\n\n### `jam`\n\nCompact excess space\n\n```js\nssv.jam(SSV)\n```\n\n```js\nssv.jam(\"  mark  travis   matt \") // \"mark travis matt\"\nssv.jam(\"  matt      \") // \"matt\"\nssv.jam(\"  0     182 \") // \"0 182\"\nssv.jam(-182) // \"-182\"\nssv.jam(182) // \"182\"\nssv.jam(\" \") // \"\"\nssv.jam(0) // \"0\"\nssv.jam() // \"\"\n```\n\n### `not`\n\n- Get values in `left` that are **not** in `right`\n- Ideal for removing values or diffing\n\n```js\nssv.not(left=\"\", right=\"\")\n```\n\n```js\nssv.not(\"mark tom travis\", \"tom\") // \"mark travis\"\nssv.not(\"mark tom tom\", \"mark matt\") // \"tom tom\"\nssv.not(\"matt matt matt\", \"\") // \"matt matt matt\"\nssv.not(\"mark mark\", \"tom tom\") // \"mark mark\"\nssv.not(\"mark tom tom tom\", \"tom\") // \"mark\"\n```\n\n```js\nlet many = [\"mark tom\", \"mark travis\", \"mark matt\"]\nmany.reduce(ssv.not) // \"tom\"\n```\n\n### `or`\n\n- Get unique values found in `left` **or** `right` **or** both\n- Ideal for adding values or unioning\n\n```js\nssv.or(left=\"\", right=\"\")\n```\n\n```js\nssv.or(\"mark tom \", \"travis tom\") // \"mark tom travis\"\nssv.or(\"mark tom tom\", \"travis tom\") // \"mark tom travis\"\nssv.or(\"matt mark\", \"matt\") // \"matt mark\"\n```\n\n```js\nlet many = [\"mark tom\", \"mark travis\", \"mark matt\"]\nmany.reduce(ssv.or) // \"mark tom travis matt\"\n```\n\n### `say`\n\nSimply stringify unknown\n\n```js\nssv.say(unknown=\"\")\n```\n\n```js\nssv.say(undefined) // \"\"\nssv.say(null) // \"\"\nssv.say(0) // \"0\"\nssv.say(NaN) // \"NaN\"\nssv.say(182) // \"182\"\nssv.say(\"tom\") // \"tom\"\nssv.say(true) // \"true\"\nssv.say(false) // \"false\"\nssv.say(new Number(182), \"182\")\nssv.say(new String(\"tom\"), \"tom\")\nssv.say(new Boolean(true), \"true\")\n```\n\n- Used internally when expecting strings\n- Not intended for arrays or plain objects\n- Join arrays instead like `[].join(\" \")`\n- Plain objects may use [`ssv.edit`](#edit) or [`ssv.state`](#state)\n\n### `split`\n\nSplit SSV into dense array\n\n```js\nssv.split(SSV)\n```\n\n```js\nssv.split(\"mark tom travis\") // [\"mark\", \"tom\", \"travis\"]\nssv.split(\"     mark  tom \") // [\"mark\", \"tom\"]\nssv.split(\"0 0  182       \") // [\"0\", \"0\", \"182\"]\nssv.split(0) // [\"0\"]\nssv.split(\" \") // []\nssv.split(\"\") // []\nssv.split() // []\n```\n\n### `state`\n\n- Get unique compact SSV string from state object or string\n- Shorthand for [`ssv.edit(\"\", state)`](#edit)\n- Like [`ssv.yolo(state)`](#yolo) if string\n- Optimal for conditional CSS classes\n\n```js\nssv.state(state={})\n```\n\n```js\nssv.state(\"mark  tom  \") // \"mark tom\"\nssv.state({\n  \"mark travis\": true,\n  \"matt\": true,\n  \"tom scott\": false\n}) // \"mark travis matt\"\n\nssv.state({\n  \"mark\": true,\n  \"mark travis\": true,\n  \"travis\": false\n}) // \"mark mark travis\"\n```\n\n```js\nlet states = [/* objects or strings */]\nssv.yolo(states.map(ssv.state).join(\" \"))\n```\n\n### `xor`\n\n- Get unique values found in either `left` **or** `right` but **not** both\n- Ideal for toggling values\n\n```js\nssv.xor(left=\"\", right=\"\")\n```\n\n```js\nssv.xor(\"\", \"mark mark\") // \"mark\"\nssv.xor(\"mark tom\", \"mark\") // \"tom\"\nssv.xor(\"mark tom\", \"travis\") // \"mark tom travis\"\nssv.xor(\"mark tom\", \"travis tom\") // \"mark travis\"\nssv.xor(\"mark tom travis\", \"tom matt\") // \"mark travis matt\"\nssv.xor(\"mark tom tom\", \"mark mark\") // \"tom\"\nssv.xor(\"mark mark\", \"tom tom\") // \"mark tom\"\n```\n\n```js\nlet many = [\"mark tom\", \"mark travis\", \"mark matt\"]\nmany.reduce(ssv.xor) // \"tom travis mark matt\"\nmany.reduceRight(ssv.xor) // \"matt travis mark tom\"\n```\n\n### `yolo`\n\n- Get unique SSV values\n- Hella fast unique loop\n- Be unique because yolo\n- Case sensitive\n\n```js\nssv.yolo(SSV=\"\")\n```\n\n```js\nssv.yolo(\"tom tom travis\") // \"tom travis\"\nssv.yolo(\"Na na na na   \") // \"Na na\"\nssv.yolo(\"Na na na na\".toLowerCase()) // \"na\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanve%2Fssv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryanve%2Fssv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanve%2Fssv/lists"}