{"id":15150537,"url":"https://github.com/wellwelwel/node-and-vite-helpers","last_synced_at":"2026-01-20T15:33:09.684Z","repository":{"id":64630744,"uuid":"577025371","full_name":"wellwelwel/node-and-vite-helpers","owner":"wellwelwel","description":"🌱 A personal compilation with helpers for NodeJS and Vite","archived":false,"fork":false,"pushed_at":"2023-05-06T01:22:39.000Z","size":116,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-02T14:13:34.093Z","etag":null,"topics":["classname","head","helpers","input","node","react","reactjs","sanitizer","utils","vite","xss"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wellwelwel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-11T18:39:28.000Z","updated_at":"2023-09-13T11:33:53.000Z","dependencies_parsed_at":"2024-09-26T14:23:15.455Z","dependency_job_id":null,"html_url":"https://github.com/wellwelwel/node-and-vite-helpers","commit_stats":{"total_commits":109,"total_committers":1,"mean_commits":109.0,"dds":0.0,"last_synced_commit":"ea3409b26dead94106d4ad80a3cce03c5c16e0f6"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wellwelwel/node-and-vite-helpers","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellwelwel%2Fnode-and-vite-helpers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellwelwel%2Fnode-and-vite-helpers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellwelwel%2Fnode-and-vite-helpers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellwelwel%2Fnode-and-vite-helpers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wellwelwel","download_url":"https://codeload.github.com/wellwelwel/node-and-vite-helpers/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wellwelwel%2Fnode-and-vite-helpers/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28606142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T14:45:23.139Z","status":"ssl_error","status_checked_at":"2026-01-20T14:44:16.929Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["classname","head","helpers","input","node","react","reactjs","sanitizer","utils","vite","xss"],"created_at":"2024-09-26T14:21:29.969Z","updated_at":"2026-01-20T15:33:09.667Z","avatar_url":"https://github.com/wellwelwel.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch2 align=\"center\"\u003eHelpers to Node and Vite\u003c/h2\u003e\n\u003cp align=\"center\"\u003e🌱 A \u003cb\u003epersonal\u003c/b\u003e compilation with helpers for NodeJS and Vite\u003c/p\u003e\n\n### Install\n\n```shell\n   npm i node-and-vite-helpers\n```\n\n\u003chr /\u003e\n\n### 💡 Helpers\n\n-  #### [selectors](./src/selectors.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails open\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   \u003c!-- prettier-ignore --\u003e\n      ```javascript\n      import { s, sAll, sEl, sElAll } from 'node-and-vite-helpers';\n      // import { s, sAll, sEl, sElAll } from 'node-and-vite-helpers/selectors';\n\n      s('#id');                     // document.querySelector('#id');\n      sAll('.class');               // document.querySelectorAll('.class');\n      sEl(element, '.child');       // element.querySelector('.child');\n      sElAll(element, '.childs');   // element.querySelectorAll('.childs');\n      ```\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [setTime](./src/set-time.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/nodejs.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails open\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   \u003c!-- prettier-ignore --\u003e\n      ```javascript\n      import { setTime } from 'node-and-vite-helpers';\n      // import { setTime } from 'node-and-vite-helpers/set-time';\n\n      setTime(1000);    // 1000\n      setTime('1000');  // 1000\n\n      setTime('1s');    // 1000\n      setTime('1m');    // 60000\n      setTime('1h');    // 3600000\n      setTime('1d');    // 86400000\n      ```\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [doClass](./src/do-class.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/nodejs.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails open\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   \u003c!-- prettier-ignore --\u003e\n      ```javascript\n      import { cx } from 'node-and-vite-helpers';\n      // import { cx } from 'node-and-vite-helpers/do-class';\n\n      cx('c1', 'c2 c3');            // 'c1 c2 c3'\n      cx(validCond \u0026\u0026 'active');    // 'active'\n      cx(invalidCond \u0026\u0026 'active');  // ''\n      ```\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [head](./src/head.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails open\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   ```javascript\n   import { head } from 'node-and-vite-helpers';\n   // import * as head from 'node-and-vite-helpers/head';\n\n   import favicon from '../favicon.svg';\n\n   /**\n    * These functions check if an element already exists in head\n    * If exists, update element atribute, otherwise creates the element in head\n    **/\n   head.title('Home');\n   head.meta('theme-color', '#6c46bf');\n   head.link('canonical', 'https://site.com/');\n   head.favicon(favicon);\n   head.faviconBase64('data:image/png;base64,iVBO0KGN...ErkJg==');\n   ```\n\n   ```javascript\n   /**\n    * This function creates any custom element in head\n    * Interesting to use for advanced properties, SEO, etc.\n    **/\n\n   const gtag = 'XXXXXXXXXX';\n\n   head.createElement({\n      element: 'script',\n      attributes: [\n         {\n            name: 'src',\n            value: `https://www.googletagmanager.com/gtag/js?id=G-${gtag}`,\n         },\n         {\n            name: 'async',\n         },\n      ],\n   });\n\n   head.createElement({\n      element: 'script',\n      textContext: `\n         window.dataLayer = window.dataLayer || []\n         function gtag() {\n            dataLayer.push(arguments)\n         }\n         gtag('js', new Date())\n         gtag('config', 'G-${gtag}')\n      `,\n   });\n   ```\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [dates](./src/dates.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/nodejs.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails open\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   ```javascript\n   import { dates } from 'node-and-vite-helpers';\n   // import * as dates from 'node-and-vite-helpers/dates';\n\n   // defaults 🔓\n   dates.set.locale('pt-BR');\n   dates.set.timeZone('America/Sao_Paulo');\n   ```\n\n   ```javascript\n   // Preparing examples 🤹\n   const dateA = new Date('2023-01-02T05:06:42.041Z');\n   const dateB = new Date('2023-01-04T04:10:35.208Z');\n   const christmasEve = new Date('2023-12-24 00:00');\n   ```\n\n   ```javascript\n   /**\n    * @return string\n    */\n\n   dates.toYodaString(dateA);\n   // 2023-01-02 02:06:42\n\n   dates.toLocaleString(dateA);\n   // 02/01/2023 02:06:42\n   ```\n\n   ```javascript\n   /**\n    * @return Date\n    */\n\n   dates.toLocaleDate(dateA);\n   // 2023-01-02T02:06:42.000Z\n\n   dates.pastDate(dateA, 1);\n   // 2023-01-01T02:06:42.000Z\n\n   dates.futureDate(dateA, 1);\n   // 2023-01-03T02:06:42.000Z\n\n   dates.getBusinessDate(christmasEve, 1);\n   // 2023-12-26T00:00:00.000Z\n\n   dates.getBusinessDate(christmasEve, 2));\n   // 2023-12-27T00:00:00.000Z\n   ```\n\n   ```javascript\n   /**\n    * @return object\n    */\n\n   dates.parse(dateA);\n   // { year: 2023, month: 1, day: 2, hours: 2, minutes: 6, seconds: 42 }\n\n   dates.diff(dateA, dateB);\n   // { situation: 'remaining', years: 0, months: 0, days: 1, hours: 23, minutes: 3, seconds: 53 }\n   ```\n\n   ```javascript\n   /**\n    * @return boolean\n    */\n\n   dates.isHoliday(date);\n   dates.isWeekend(date);\n   dates.isWeek(date);\n   dates.isBusinessDay(date);\n   dates.isEqual(date, compareDate);\n   dates.isSmaller(date, compareDate);\n   dates.isBigger(date, compareDate);\n   dates.isSmallerOrEqual(date, compareDate);\n   dates.isBiggerOrEqual(date, compareDate);\n   dates.isBetween(startDate, date, endDate);\n   ```\n\n-  You can set custom **holidays**:\n   \u003c!-- prettier-ignore --\u003e\n      ```javascript\n      const holidays = {\n         1: [ 1, 2 ],\n         // ...\n         12: [ 25, 31 ],\n      };\n\n      dates.set.holidays(holidays);\n      ```\n\n   -  You can see the default holidays in [defaultHolidays](./src/dates.ts#L10)\n\n-  You can customize `timeZone` by overwriting the default params:\n\n   ```javascript\n   dates.toYodaString(dateA, { timeZone: 'UTC' }));\n   // 2023-01-02 05:06:42\n\n   dates.toLocaleString(dateA, { locale: 'en-US', timeZone: 'America/New_York' }));\n   // 1/2/2023, 12:06:42 AM\n   ```\n\n-  Both `locale` and `timeZone` options have typing suggestions 📝\n-  This module assumes that you know the **time zone** from origin dates 🎓\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [input](./src/input.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/nodejs.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails open\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   ```javascript\n   import { striptags, entities, xss } from 'node-and-vite-helpers';\n   // import { striptags, entities, xss } from 'node-and-vite-helpers/input';\n   ```\n\n   ```javascript\n   striptags('\u003cdiv\u003e🤔...\u003c/div\u003e'); // 🤔...\n\n   xss('\u003cdiv\u003e🤔...\u003c/div\u003e'); // \u0026#129300;...\n   xss('\u0026lt;div\u0026gt;\u0026#129300;\u0026lt;/div\u0026gt;'); // \u0026#129300;...\n\n   entities.decode('\u0026#129300;...'); // 🤔...\n   ```\n\n   ```javascript\n   // I: Trying broke decode xss 😈 //\n\n   const input = '\u0026lt;div\u0026gt;👮\u0026lt;/div\u0026gt;';\n   const filteredInput = xss(input);\n\n   entities.decode(filteredInput); // 👮\n   ```\n\n   ```javascript\n   // II: Trying broke decode xss 👿 //\n\n   const input = '\u0026amp;lt;div\u0026amp;gt;👮\u0026amp;lt;/div\u0026amp;gt;';\n   const filteredInput = xss(input);\n\n   entities.decode(filteredInput); // 👮\n   ```\n\n   ```javascript\n   // Unsafe!\n\n   entities.encode('\u003cdiv\u003e🤔...\u003c/div\u003e');\n   // \u0026lt;div\u0026gt;\u0026#129300;...\u0026lt;/div\u0026gt;\n   // ❌ Be careful, consider using xss(string)\n\n   entities.decode('\u0026lt;div\u0026gt;🤔.../div\u0026gt;', false);\n   // \u003cdiv\u003e🤔...\u003c/div\u003e\n   // ❗️ Be careful, consider using entities.decode(string);\n   ```\n\n   👮🏻‍♂️ Use carefully:\n\n   -  The decoding depth of the `xss()` goes up to two stages.\n   -  The decoding for display `entities.decode()` has one stage and re-run `striptags` before returning the result.\n   -  This means that even if someone insert more layers in a xss attack, it will display the xss content as text and not execute it.\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [tokenGenerate](./src/token-generate.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/nodejs.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails\u003e\n   \u003csummary\u003eSee an example\u003c/summary\u003e\n\n   ```javascript\n   import { tokenGenerate } from 'node-and-vite-helpers';\n   // import { tokenGenerate } from 'node-and-vite-helpers/token-generate';\n\n   tokenGenerate(8); // '45832c3f', 'fa3fe988', '749ecfaa', ...\n   ```\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [empty](./src/empty.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/nodejs.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   \u003c!-- prettier-ignore --\u003e\n      ```javascript\n      import { isEmpty, notEmpty } from 'node-and-vite-helpers';\n      // import { isEmpty, notEmpty } from 'node-and-vite-helpers/empty';\n\n      isEmpty('');            // true\n      isEmpty('   ');         // true\n      isEmpty('anything');    // false\n\n      notEmpty('');           // false\n      notEmpty('   ');        // false\n      notEmpty('anything');   // true\n      ```\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n-  #### [forceArray](./src/force-array.ts)\n\n   \u003e \u003cimg src=\"./.github/assets/readme/nodejs.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/vite.svg\" \u003e\n   \u003e \u003cimg src=\"./.github/assets/readme/react.svg\" \u003e\n\n   \u003cdetails\u003e\n   \u003csummary\u003eSee some examples\u003c/summary\u003e\n\n   \u003c!-- prettier-ignore --\u003e\n      ```javascript\n      import { forceArray } from 'node-and-vite-helpers';\n      // import { forceArray } from 'node-and-vite-helpers/force-array';\n\n      forceArray('string');         // [ 'string' ]\n      forceArray(1);                // [ 1 ]\n      forceArray(true);             // [ true ]\n      forceArray(false);            // [ false ]\n      forceArray({});               // [ {} ]\n      forceArray(/* any */);        // [ /* any */ ]\n\n      forceArray([ /* items */ ]);  // [ /* items */ ]\n      ```\n\n   \u003c/details\u003e\n\n\u003chr /\u003e\n\n### Credits\n\n| Contributors | GitHub                                                                             |\n| ------------ | ---------------------------------------------------------------------------------- |\n| Author       | [![wellwelwel](./.github/assets/readme/author.svg)](https://github.com/wellwelwel) |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwellwelwel%2Fnode-and-vite-helpers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwellwelwel%2Fnode-and-vite-helpers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwellwelwel%2Fnode-and-vite-helpers/lists"}