{"id":18327207,"url":"https://github.com/dalikewara/vascommkit","last_synced_at":"2025-10-10T21:46:29.510Z","repository":{"id":57398852,"uuid":"121355503","full_name":"dalikewara/vascommkit","owner":"dalikewara","description":"A free toolkit for your needed","archived":false,"fork":false,"pushed_at":"2022-08-29T19:05:11.000Z","size":1675,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-21T09:34:00.092Z","etag":null,"topics":["date","helper","javascript","kit","tool","toolkit","vascomm"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/dalikewara.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"dalikewara","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2018-02-13T08:08:57.000Z","updated_at":"2022-02-17T14:34:15.000Z","dependencies_parsed_at":"2022-09-11T04:31:27.432Z","dependency_job_id":null,"html_url":"https://github.com/dalikewara/vascommkit","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/dalikewara/vascommkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalikewara%2Fvascommkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalikewara%2Fvascommkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalikewara%2Fvascommkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalikewara%2Fvascommkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dalikewara","download_url":"https://codeload.github.com/dalikewara/vascommkit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalikewara%2Fvascommkit/sbom","scorecard":{"id":317762,"data":{"date":"2025-08-11","repo":{"name":"github.com/dalikewara/vascommkit","commit":"240595dbb2825e4598037a99d3970add23c7b578"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}}]},"last_synced_at":"2025-08-18T00:37:50.847Z","repository_id":57398852,"created_at":"2025-08-18T00:37:50.847Z","updated_at":"2025-08-18T00:37:50.847Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279005427,"owners_count":26083883,"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","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["date","helper","javascript","kit","tool","toolkit","vascomm"],"created_at":"2024-11-05T19:09:57.352Z","updated_at":"2025-10-10T21:46:29.495Z","avatar_url":"https://github.com/dalikewara.png","language":"JavaScript","funding_links":["https://github.com/sponsors/dalikewara"],"categories":[],"sub_categories":[],"readme":"# A free toolkit for your needed\n\n**Indonesian** : Toolkit sehari-hari untuk mempermudah pekerjaan. Toolkit ini akan terus update seiring dengan temuan kasus-kasus baru yang perlu di sederhanakan.\n\n**English** : A daily toolkit to help you work. This toolkit will continue to update along with new cases that need to be simplified.\n\n### Installation\n  Node.js\n\n      npm install vascommkit --save\n\n  Bower\n\n      bower install vascommkit --save\n\n### Update to the latest version (1.1.12)\n  Node.js\n\n      npm update vascommkit --save\n\n  Bower\n\n      bower update vascommkit --save\n\n### Initialization\n  Node.js\n\n      const vascommkit = require('vascommkit');\n\n  Bower\n\n      \u003cscript src=\"bower_components/vascommkit/dist/vascommkit.min.js\"\u003e\u003c/script\u003e\n      \u003cscript\u003e\n        console.log(vascommkit);\n      \u003c/script\u003e\n\n### Features\n- `lps` (Left Padding Space).\n- `lpz` (Left Padding Zero).\n- `rps` (Right Padding Space).\n- `rpz` (Right Padding Zero).\n- `looper` Loop a lot of data without lossing your CPU. Based on interval.\n- `soa` Some job to manipulate SOA data.\n  - `getVal` get value by tagname.\n- `time` Manipulate date \u0026 time.\n  - `daysInMonth` get total days in current month \u0026 year.\n  - `day` get current day.\n  - `month` get current month.\n  - `year` get current year.\n  - `hour` get current hour.\n  - `minute` get current minute.\n  - `second` get current second.\n  - `now` get current datetime | *YYYY-MM-DD HH:mm:ss*.\n  - `date` get current date | *YYYY-MM-DD*.\n  - `time` get current time | *HH:mm:ss*.\n  - `custom` get current datetime with custom format.\n  - `add` add specified time to datetime.\n  - `isExpired` check datetime expired.\n  - `secondsToTime` convert seconds to time string format | *HH:mm:ss*.\n  - `dateDiff` *Date diff* from 2 dates.\n  - `timeDiff` *Time diff* from 2 times.\n- `fake` Generate massive amounts of fake data based on `faker`. This function returned the data as an object array. So, you can easily manage it.\n- `string` Manipulate string data.\n  - `camelCase` converts the given string to `camelCase`.\n  - `snakeCase` converts the given string to `snakeCase`.\n  - `titleCase` converts the given string to `titleCase`.\n  - `studlyCase` converts the given string to `studlyCase`.\n  - `basename` returns the base(class) name of the given namespace.\n  - `endsWith` determines if the given string ends with the given value.\n  - `startsWith` determines if the given string begins with the given value.\n  - `after` returns everything after the given value in a string.\n  - `before` returns everything before the given value in a string.\n  - `start` adds a single instance of the given value to a string if it does not already start with the value.\n  - `finish` adds a single instance of the given value to a string if it does not already end with the value.\n  - `contains` determines if the given string contains the given value (case sensitive).\n  - `limit` truncates the given string at the specified length.\n  - `random` generates a random string of the specified length.\n  - `randomNumeric` generates a random numeric string of the specified length.\n  - `slug` generates a URL friendly \"slug\" from the given string.\n- `cemtex` Cemtex file format is a format used by banks to allow for batch transactions.\n  - `string` Generate a cemtex string from the given data. You can make your custom standard bank format.\n  - `generate` Generate a cemtex file from the given data. You can make your custom standard bank format.\n- `array` Manipulate array data.\n  - `collapse` collapses an array of arrays into a single array.\n  - `except` removes the given key / value pairs from an array.\n  - `only` returns only the specified key / value pairs from the given array.\n  - `first` returns the first element in the given array.\n  - `last` returns the last element in the given array.\n\n### Changelog\nSee [https://github.com/dalikewara/vascommkit/blob/master/Changelog.md](https://github.com/dalikewara/vascommkit/blob/master/Changelog.md)\n\n### Credits\nCopyright \u0026copy; 2018 [Dali Kewara](https://www.dalikewara.com) and team:\n  - [Teguh Wahyu Santoso](https://teguh.ws/)\n\n### License\n[MIT License](https://github.com/dalikewara/vascommkit/blob/master/LICENSE)\n\n### Notes\n- *Most `string` \u0026 `array` functions implemented from Laravel's Helpers.*\n- *Sorry for bad english.*\n\n\u003cbr\u003e\u003chr\u003e\u003cbr\u003e\n\n## Examples\n- `lps` **function (n, val)**\n\n        const lps = vascommkit.lps(5, 200);\n\n        console.log(lps); // output `  200`\n\n  - *integer* **n**\n  - *string* **val**\n  - *return* string\n\u003cbr\u003e\u003cbr\u003e\n- `lpz` **function (n, val)**\n\n        const lpz = vascommkit.lpz(5, 200);\n\n        console.log(lpz); // output `00200`\n\n  - *integer* **n**\n  - *string* **val**\n  - *return* string\n\u003cbr\u003e\u003cbr\u003e\n- `rps` **function (n, val)**\n\n        const rps = vascommkit.rps(5, 200);\n\n        console.log(lps); // output `200  `\n\n  - *integer* **n**\n  - *string* **val**\n  - *return* string\n\u003cbr\u003e\u003cbr\u003e\n- `rpz` **function (n, val)**\n\n        const rpz = vascommkit.rpz(5, 200);\n\n        console.log(lps); // output `20000`\n\n  - *integer* **n**\n  - *string* **val**\n  - *return* string\n\u003cbr\u003e\u003cbr\u003e\n- `looper` **function (start, end, callback, end[optional])**\n\n        vascommkit.looper(0, 100, function (num) {\n          console.log(num);\n        }, function () {\n          console.log('done');\n        });\n\n  - *integer* **start**\n  - *integer* **end**\n  - *function* **callback**\n  - *function* **end**\n  - *return* mixed\n\u003cbr\u003e\u003cbr\u003e\n- `soa` object {}\n  - `getVal` **function (tag, xml)**\n\n        const getSOAValue = vascommkit.soa.getVal('name', '\u003cname xmlns:q0=\"https://www.dalikewara.com\"\u003eLinus Torvald\u003c/name\u003e');\n\n        console.log(getSOAValue); // output 'Linus Torvald'\n\n    - *string* **tag**\n    - *string* **xml**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n- `time` object {}\n  - `daysInMonth` **function (options[optional])**\n\n          const daysInMonth = vascommkit.time.daysInMonth();\n\n          console.log(daysInMonth);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `day` **function (options[optional])**\n\n         const day = vascommkit.time.day();\n\n         console.log(day);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `month` **function (options[optional])**\n\n        const month = vascommkit.time.month();\n\n        console.log(month);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `year` **function (options[optional])**\n\n        const year = vascommkit.time.year();\n\n        console.log(year);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `hour` **function (options[optional])**\n\n        const hour = vascommkit.time.hour();\n\n        console.log(hour);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `minute` **function (options[optional])**\n\n        const minute = vascommkit.time.minute();\n\n        console.log(minute);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `second` **function (options[optional])**\n\n        const second = vascommkit.time.second();\n\n        console.log(second);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `now` **function (options[optional])**\n\n        const now = vascommkit.time.now();\n\n        console.log(now);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `date` **function (options[optional])**\n\n        const date = vascommkit.time.date();\n\n        console.log(date);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `time` **function (options[optional])**\n\n        const time = vascommkit.time.time();\n\n        console.log(time);\n\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `custom` **function (format, options[optional])**\n\n        const custom = vascommkit.time.custom('DD-MM-YYYY');\n\n        console.log(custom);\n\n    - *string* **format**\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `add` **function (date, len, prefix, options[optional])**\n\n        const add = vascommkit.time.add('2018-02-13 13:00:00', '40', 'minutes');\n\n        console.log(add);\n\n    - *string* **date**\n    - *string* **len**\n    - *string* **prefix** | verb(s)\n    - *object* **options**\n      - *string* timezone\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `isExpired` **function (date, params[optional], options[optional])**\n\n        const isExpired = vascommkit.time.isExpired('2018-02-13 13:00:00');\n\n        console.log(isExpired);\n\n    - *string* **date**\n    - *object* **params**\n      - *string* len\n      - *string* prefix | verb(s)\n    - *object* **options**\n      - *string* timezone\n    - *return* true | false\n\u003cbr\u003e\u003cbr\u003e\n  - `secondsToTime` **function (seconds)**\n\n        const secondsToTime = vascommkit.time.secondsToTime(35111);\n\n        console.log(secondsToTime);\n\n    - *integer* **seconds**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `dateDiff` **function (start, end, prefix)**\n\n        const dateDiff = vascommkit.time.dateDiff('2018-04-05', '2018-04-10', 'day');\n\n        console.log(dateDiff);\n\n    - *string* **start**\n    - *string* **end**\n    - *string* **prefix**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `timeDiff` **function (start, end, prefix)**\n\n        const timeDiff = vascommkit.time.timeDiff('09:45:00', '10:00:00');\n\n        console.log(timeDiff);\n\n    - *string* **start**\n    - *string* **end**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n- `fake` **function (len, keys[optional], local[optional])**\n\n        const len = 100;\n        const keys = {\n          name: 'firstName|lastName|findName',\n          internet: 'userName|password',\n          address: 'city'\n        };\n        const data = vascommkit.fake(len, keys);\n\n        console.log(data);\n\n        // output\n        // [ { firstName: 'Jeffrey',\n        //    lastName: 'Hills',\n        //    findName: 'Boris Collier II',\n        //    userName: 'Stella_Emard',\n        //    password: '6239pKNeKTDvfON',\n        //    city: 'Stehrside' },\n        //  { firstName: 'Reuben',\n        //    lastName: 'Armstrong',\n        //    findName: 'Elenor Nolan',\n        //    userName: 'Reta.Kulas',\n        //    password: 'rouYSPvYpX1elsA',\n        //    city: 'Gleichnerport' }, ... ]\n\n   If you want to make your own key, use this format `expectedKey@originalKey` with `@` separator. See following example:\n\n        const len = 1;\n        const keys = {\n          name: 'firstName'\n        };\n        const data = vascommkit.fake(len, keys);\n\n        console.log(data);\n\n        // output\n        // [{ firstName: 'Jeffrey' }]\n\n\n\n        const keys2 = {\n          name: 'myname@firstName'\n        };\n        const data2 = vascommkit.fake(len, keys2);\n\n        console.log(data2);\n\n        // output\n        // [{ myname: 'Jeffrey' }]\n\n  - *integer* **len**\n  - *object* **keys**\n    - *string* name\n      - *firstName* | *lastName* | *findName* | *jobTitle* | *prefix* | *suffix* | *title* | *jobDescriptor* | *jobArea* | *jobType*\n    - *string* internet\n      - *avatar* | *email* | *exampleEmail* | *userName* | *protocol* | *url* | *domainName* | *domainSuffix* | *domainWord* | *ip* | *ipv6* | *userAgent* | *color* | *mac* | *password*\n    - *string* address\n      - *zipCode* | *city* | *cityPrefix* | *citySuffix* | *streetName* | *streetAddress* | *streetSuffix* | *streetPrefix*  | *secondaryAddress* | *county* | *country* | *countryCode* | *state* | *stateAbbr* | *latitude* | *longitude*\n    - *string* commerce\n      - *color* | *department* | *productName* | *price* | *productAdjective* | *productMaterial* | *product*\n    - *string* company\n      - *suffixes* | *companyName* | *companySuffix* | *catchPhrase* | *bs* | *catchPhraseAdjective* | *catchPhraseDescriptor* | *catchPhraseNoun* | *bsAdjective* | *bsBuzz* | *bsNoun*\n    - *string* database\n     - *column* | *type* | *collation* | *engine*\n    - *string* date\n      - *past* | *future* | *between* | *recent* | *soon* | *month* | *weekday*\n    - *string* fake\n    - *string* finance\n      - *account* | *accountName* | *mask* | *amount* | *transactionType* | *currencyCode* | *currencyName* | *currencySymbol* | *bitcoinAddress* | *ethereumAddress* | *iban* | *bic*\n    - *string* hacker\n      - *abbreviation* | *adjective* | *noun* | *verb* | *ingverb* | *phrase*\n    - *string* helpers\n      - *randomize* | *slugify* | *replaceSymbolWithNumber* | *replaceSymbols* | *shuffle* | *mustache* | *createCard* | *contextualCard* | *userCard* | *createTransaction*\n    - *string* image\n      - *image* | *avatar* | *imageUrl* | *abstract* | *animals* | *business* | *cats* | *city* | *food* | *nightlife* | *fashion* | *people* | *nature* | *sports* | *technics* | *transport* | *dataUri*\n    - *string* lorem\n      - *word* | *words* | *sentence* | *slug* | *sentences* | *paragraph* | *paragraphs* | *text* | *lines*\n    - *string* phone\n      - *phoneNumber* | *phoneNumberFormat* | *phoneFormats*\n    - *string* random\n      - *number* | *arrayElement* | *objectElement* | *uuid* | *boolean* | *word* | *words* | *image* | *locale* | *alphaNumeric* | *hexaDecimal*\n    - *string* system\n      - *fileName*  *commonFileName* | *mimeType* | *commonFileType* | *commonFileExt* | *fileType* | *fileExt* | *directoryPath* | *filePath* | *semver*\n  - *string* local | default 'id_ID'\n    - *az* | *cz* | *de* | *de_AT* | *de_CH* | *en* | *en_AU* ... More see -\u003e [https://github.com/Marak/Faker.js](https://github.com/Marak/Faker.js)\n  - *return* array\n\u003cbr\u003e\u003cbr\u003e\n- `string` object {}\n  - `camelCase` **function (str)**\n\n        conts str = vascommkit.string.camelCase('foo bar');\n\n        console.log(str); // output 'fooBar'\n\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `snakeCase` **function (str)**\n\n        conts str = vascommkit.string.snakeCase('foo Bar');\n\n        console.log(str); // output 'foo_bar'\n\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `titleCase` **function (str)**\n\n        conts str = vascommkit.string.titleCase('foo Bar');\n\n        console.log(str); // output 'Foo Bar'\n\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `studlyCase` **function (str)**\n\n        conts str = vascommkit.string.studlyCase('foo Bar');\n\n        console.log(str); // output 'FooBar'\n\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `basename` **function (ns, str)**\n\n        conts str = vascommkit.string.basename('/', 'Foo/Bar');\n\n        console.log(str); // output 'Bar'\n\n    - *char* **ns** | `/`, `-`, `+`, etc...\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `endsWith` **function (e, str)**\n\n        conts str = vascommkit.string.endsWith('John', 'Smith John');\n\n        console.log(str); // output true\n\n    - *string* **e**\n    - *string* **str**\n    - *return* true | false\n\u003cbr\u003e\u003cbr\u003e\n  - `startsWith` **function (e, str)**\n\n        conts str = vascommkit.string.startsWith('Smith', 'Smith John');\n\n        console.log(str); // output true\n\n    - *string* **e**\n    - *string* **str**\n    - *return* true | false\n\u003cbr\u003e\u003cbr\u003e\n  - `after` **function (e, str)**\n\n        conts str = vascommkit.string.after('Smith', 'Smith John');\n\n        console.log(str); // output ' John'\n\n    - *string* **e**\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `before` **function (e, str)**\n\n        conts str = vascommkit.string.before('John', 'Smith John');\n\n        console.log(str); // output 'Smith '\n\n    - *string* **e**\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `finish` **function (e, str)**\n\n        conts str = vascommkit.string.finish('John', 'Smith John');\n        conts str2 = vascommkit.string.finish('Alex', 'Smith John');\n\n        console.log(str); // output 'Smith John'\n        console.log(str2); // output 'Smith JohnAlex'\n\n    - *string* **e**\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `start` **function (e, str)**\n\n        conts str = vascommkit.string.start('Smith', 'Smith John');\n        conts str2 = vascommkit.string.start('Alex', 'Smith John');\n\n        console.log(str); // output 'Smith John'\n        console.log(str2); // output 'AlexSmith John'\n\n    - *string* **e**\n    - *string* **str**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `contains` **function (e, str)**\n\n        conts str = vascommkit.string.contains('John', 'Smith John');\n\n        console.log(str); // output true\n\n    - *string* **e**\n    - *string* **str**\n    - *return* true | false\n\u003cbr\u003e\u003cbr\u003e\n  - `limit` **function (n, str, prefix[optional])**\n\n        conts str = vascommkit.string.limit(12, 'Lorem ipsum dolor sit amet');\n        conts str2 = vascommkit.string.limit(12, 'Lorem ipsum dolor sit amet', 'readmore...');\n\n        console.log(str); // output 'Lorem ipsum ...'\n        console.log(str2); // output 'Lorem ipsum readmore...'\n\n    - *integer* **n**\n    - *string* **str**\n    - *string* **prefix**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `random` **function (n)**\n\n        conts str = vascommkit.string.random(3);\n\n        console.log(str); // output '8FE'\n\n    - *integer* **n**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `randomNumeric` **function (n)**\n\n        conts str = vascommkit.string.randomNumeric(6);\n\n        console.log(str); // output '152043'\n\n    - *integer* **n**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `slug` **function (str, prefix[optional])**\n\n        conts str = vascommkit.string.slug('Smith John');\n        conts str2 = vascommkit.string.slug('Smith John', '+');\n\n        console.log(str); // output 'smith-john'\n        console.log(str2); // output 'smith+john'\n\n    - *string* **str**\n    - *char* **prefix** | `-`, `+`, etc... | default is `-`\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n- `cemtex` object {}\n  - `string` **function (params, options[optional]|callback, callback)**\n\n    Here is basic example:\n        \n        vascommkit.cemtex.string({\n          header: {\n            keys: {\n              key1: { type: 'rps', length: 8 },\n              key2: { type: 'lpz', length: 9 }\n            },\n            data: { key1: 'Header1', key2: 'Header2' }\n          },\n          detail: {\n            keys: {\n              key1: { type: 'rps', length: 10 },\n              key2: { type: 'lpz', length: 12 }\n            },\n            data: [\n              { key1: 'Detail1 A', key2: 'Detail2 A' },\n              { key1: 'Detail1 B', key2: 'Detail2 B' }\n            ],\n          },\n          footer: {\n            keys: {\n              key1: { type: 'rps', length: 9 },\n              key2: { type: 'lpz', length: 11 }\n            },\n            data: { key1: 'Footer1', key2: 'Footer2' }\n          }\n        }, function (err, result) {\n          if (err) {\n            console.log(err);\n          } else {\n            console.log(result);\n          }\n        });\n\n        // output result\n        // Header1 0090                                                                                                                                                    Detail1 A 000000012345                                                                                                                                          Detail1 B 000000067890                                                                                                                                          Footer1  0002                                                                                                                                                   \n\n    Example above returned a single line cemtex string. The default `charLength` of each `params` is 160. So it has 160 header, 160 detail (per 1 row), and 160 footer chars length. If we do split, it looks like this:\n\n        // header\n        'Header1 0090                                                                                                                                                    ' // 160\n\n        // detail\n        'Detail1 A 000000012345                                                                                                                                          ' // 160\n        'Detail1 B 000000067890                                                                                                                                          ' // 160\n\n        // footer\n        'Footer1  0002                                                                                                                                                   ' // 160\n\n    Each `params` (header, detail, footer) has 2 required properties: `keys` \u0026 `data`. It should be the same object. If `keys` has key 'name', so `data` should be contains 'name'. But don't worry, in most cases, you can ignore \u0026 not follow this conditions.\n\n        header: {\n\n          // Configuration of the main data. 'type' \u0026 'length' always required.\n          keys: {\n            name: { type: 'lps', length: 15}, // So, the main data 'data.name' is lps (Left Padding Space) and it has max 15 length.\n            phone: { type: 'lpz', length: 15} // So, the main data 'data.phone' is lpz (Left Padding Zero) and it has max 15 length.\n          },\n\n          // The main data.\n          data: { \n            name: 'John Smith', // `data.name` = '     John Smith'\n            phone: '12345', // `data.phone` = '000000000012345'\n          }\n\n        }\n\n        // Header = '     John Smith000000000012345'\n\n    Specifically for `params` 'detail', property `data` is an array, not object, but stil have the same structure.\n\n        detail: {\n\n          // Configuration of the main data. 'type' \u0026 'length' always required.\n          keys: {\n            name: { type: 'lps', length: 15}, // So, the main data 'data.name' is lps (Left Padding Space) and it has max 15 length.\n            phone: { type: 'lpz', length: 15} // So, the main data 'data.phone' is lpz (Left Padding Zero) and it has max 15 length.\n          },\n\n          // The main data.\n          data: [\n            { \n              name: 'John Smith', // `data.name` = '     John Smith'\n              phone: '12345', // `data.phone` = '000000000012345'\n            },\n            { \n              name: 'Matthew Alex', // `data.name` = '   Matthew Alex'\n              phone: '987654321', // `data.phone` = '0000987654321'\n            }\n          ]\n\n        }\n\n        // Detail = '     John Smith000000000012345   Matthew Alex0000987654321'\n\n\n    Here more example... Remember that `params` (header, detail, footer) are optional.\n\n        // Without header\n        vascommkit.cemtex.string({\n          detail: {\n            keys: {\n              key1: { type: 'rps', length: 10 },\n              key2: { type: 'lpz', length: 12 }\n            },\n            data: [\n              { key1: 'Detail1 A', key2: 'Detail2 A' },\n              { key1: 'Detail1 B', key2: 'Detail2 B' }\n            ],\n          },\n          footer: {\n            keys: {\n              key1: { type: 'rps', length: 9 },\n              key2: { type: 'lpz', length: 11 }\n            },\n            data: { key1: 'Footer1', key2: 'Footer2' }\n          }\n        }, function (err, result) {\n          if (err) {\n            console.log(err);\n          } else {\n            console.log(result);\n          }\n        });\n\n        // output result\n        // Detail1 A 000000012345                                                                                                                                          Detail1 B 000000067890                                                                                                                                          Footer1  0002                                                                                                                                                   \n        \n        \n        // With an option.\n        vascommkit.cemtex.string({\n          header: {\n            keys: {\n              key1: { type: 'rps', length: 8 },\n              key2: { type: 'lpz', length: 9 }\n            },\n            data: { key1: 'Header1', key2: 'Header2' }\n          },\n          detail: {\n            keys: {\n              key1: { type: 'rps', length: 10 },\n              key2: { type: 'lpz', length: 12 }\n            },\n            data: [\n              { key1: 'Detail1 A', key2: 'Detail2 A' },\n              { key1: 'Detail1 B', key2: 'Detail2 B' }\n            ],\n          },\n          footer: {\n            keys: {\n              key1: { type: 'rps', length: 9 },\n              key2: { type: 'lpz', length: 11 }\n            },\n            data: { key1: 'Footer1', key2: 'Footer2' }\n          }\n        }, {\n          charLength: '40'\n        }, function (err, result) {\n          if (err) {\n            console.log(err);\n          } else {\n            console.log(result);\n          }\n        });\n\n        // output result\n        // Header1 00Header2                       Detail1 A 000Detail2 A                  Detail1 B 000Detail2 B                  Footer1  0000Footer2                    \n        \n        \n        \n        // This all configurations is valid.\n        {\n          header: {\n            keys: {\n              key1: { type: 'rps', length: 8 },\n              key2: { type: 'lpz', length: 9, default: '0' }\n            },\n            data: { key1: 'Header1' }\n          },\n          detail: {\n            keys: {\n              key1: { type: 'rps', length: 10 },\n              key2: { type: 'lpz', length: 12 } // default is ' '\n            },\n            data: [\n              { key1: 'Detail1 A', key2: 'Detail2 A' },\n              { key1: 'Detail1 B' }\n            ],\n          },\n          footer: {\n            keys: {\n              key1: { type: 'rps', length: 9 },\n              key2: { type: 'lpz', length: 11 }\n            },\n            data: { key1: 'Footer1', key2: 'Footer2' }\n          }\n        }\n        \n        \n        {\n          header: {\n            keys: {\n              key1: { type: 'rps', length: 8 },\n              key2: { type: 'lpz', length: 9, from: 'key1' }\n            },\n            data: { key1: 'Header1' }\n          },\n          detail: {\n            keys: {\n              key1: { type: 'rps', length: 10 },\n              key2: { type: 'lpz', length: 12, from: 'key1' }\n            },\n            data: [\n              { key1: 'Detail1 A', key2: 'Detail2 A' },\n              { key1: 'Detail1 B' }\n            ],\n          }\n        }\n        \n        \n        {\n          header: {\n            keys: {\n              key1: { type: 'rps', length: 8 },\n              key2: { type: 'lpz', length: 9, default: 'key1' }\n            },\n            data: { key2: 'Header1' }\n          },\n          detail: {\n            keys: {\n              key1: { type: 'rps', length: 10 },\n              key2: { type: 'lpz', length: 12, from: 'key1' }\n            },\n            data: [\n              { key2: 'Detail2 A' },\n              { }\n            ],\n          }\n        }\n        \n        \n        {\n          detail: {\n            keys: {\n              amount: { type: 'lpz', length: 10 },\n              key2: { type: 'lpz', length: 12 }\n            },\n            data: [\n              { amount: '1000', key2: 'Detail2 A' },\n              { amount: '1200' }\n            ],\n          },\n          footer: {\n            keys: {\n              key1: { type: 'rps', length: 9 },\n              key2: { type: 'lpz', length: 11, countFromDetail: 'amount' }\n            },\n            data: { key1: 'Footer1', key2: 'Footer2' } // key2 = 2200\n          }\n        }\n\n    - *object* **params**\n      - *object* header | optional\n        - *object* keys | required\n          - *type* | required | 'lps', 'lpz', 'rps', \u0026 'rpz' | default is `lps`\n          - *length* | required\n          - *default* | optional | default value if key not found or it has null value.\n          - *decimal* | optional | true or false | default is `true`\n          - *from* | optional | get value based on `params` property `keys`.\n        - *object* data | required\n      - *object* detail | optional\n        - *object* keys | required\n          - *type* | required | 'lps', 'lpz', 'rps', \u0026 'rpz' | default is `lps`\n          - *length* | required\n          - *default* | optional | default value if key not found or it has null value.\n          - *decimal* | optional | true or false | default is `true`\n          - *from* | optional | get value based on `params` property `keys`.\n        - *array* data | required\n      - *object* footer | optional\n        - *object* keys | required\n          - *type* | required | 'lps', 'lpz', 'rps', \u0026 'rpz' | default is `lps`\n          - *length* | required\n          - *default* | optional | default value if key not found or it has null value.\n          - *decimal* | optional | true or false | default is `true`\n          - *from* | optional | get value based on `params` property `keys`.\n          - *countFromDetail* | optional | count amount from specified `detail` data key.\n        - *object* data | required\n    - *object* **options** | make it as callback[function] if you dont want to pass an option.\n      - *boolean* enter | true (row string `\\n`) or false (single string) | default is `false`\n      - *char* default | `0`, `_`, etc... | default is ' '\n      - *integer* charLength | default is `160`\n    - *function* **callback**\n    - *return* string\n\u003cbr\u003e\u003cbr\u003e\n  - `generate` **function (fullpath, params, options[optional]|callback, callback)**\n\n        vascommkit.cemtex.generate(__dirname + '/test.ctx', {\n          header: {\n            keys: {\n              key1: { type: 'rps', length: 8 },\n              key2: { type: 'lpz', length: 9 }\n            },\n            data: { key1: 'Header1', key2: 'Header2' }\n          },\n          detail: {\n            keys: {\n              key1: { type: 'rps', length: 10 },\n              key2: { type: 'lpz', length: 12 }\n            },\n            data: [\n              { key1: 'Detail1 A', key2: 'Detail2 A' },\n              { key1: 'Detail1 B', key2: 'Detail2 B' }\n            ],\n          },\n          footer: {\n            keys: {\n              key1: { type: 'rps', length: 9 },\n              key2: { type: 'lpz', length: 11 }\n            },\n            data: { key1: 'Footer1', key2: 'Footer2' }\n          }\n        }, function (err, result) {\n          if (err) {\n            console.log(err);\n          } else {\n            console.log(result);\n          }\n        });\n\n    - *string* **fullpath**\n    - **params, options, callback** follow the `cemtex.string` instructions.\n\u003cbr\u003e\u003cbr\u003e\n- `array` object {}\n  - `collapse` **function (array)**\n\n        const array = [\n          [1, 2, 3],\n          [4, 5, 6],\n          7,\n          8,\n          9,\n          10\n        ];\n        const n = vascommkit.array.collapse(array);\n\n        console.log(n); // output [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\n    - *array* **array**\n    - *return* array\n\u003cbr\u003e\u003cbr\u003e\n  - `except` **function (array, keys)**\n\n        var array = ['hello', 'world'];\n        var keys = 'world';\n        var n = vascommkit.array.except(array, keys);\n\n        console.log(n); // output ['hello']\n\n        var array = ['hello', 'world', 'yeah'];\n        var keys = ['world', 'yeah'];\n        var n = vascommkit.array.except(array, keys);\n\n        console.log(n); // output ['hello']\n\n    - *array* **array**\n    - *array|string* **keys**\n    - *return* array\n\u003cbr\u003e\u003cbr\u003e\n  - `only` **function (array, keys)**\n\n        var array = ['php', 'js', 'pyhton'];\n        var keys = 'js';\n        var n = vascommkit.array.only(array, keys);\n\n        console.log(n); // output ['js']\n\n        var array = ['php', 'js', 'pyhton'];\n        var keys = ['js', 'php', 'ruby'];\n        var n = vascommkit.array.only(array, keys);\n\n        console.log(n); // output ['js', 'php']\n\n    - *array* **array**\n    - *array|string* **keys**\n    - *return* array\n\u003cbr\u003e\u003cbr\u003e\n  - `first` **function (array)**\n\n        var array = ['js', 'php', 'python'];\n        var n = vascommkit.array.first(array);\n\n        console.log(n); // js\n\n    - *array* **array**\n    - *return* array\n\u003cbr\u003e\u003cbr\u003e\n  - `last` **function (array)**\n\n        var array = ['js', 'php', 'python'];\n        var n = vascommkit.array.last(array);\n\n        console.log(n); // python\n\n    - *array* **array**\n    - *return* array\n\u003cbr\u003e\u003cbr\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalikewara%2Fvascommkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdalikewara%2Fvascommkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalikewara%2Fvascommkit/lists"}