{"_id":"@art-suite/art-core-strings","_rev":"5-ca1e71b3712bf7bb0cab35bf8d6de6ec","name":"@art-suite/art-core-strings","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@art-suite/art-core-strings","version":"0.1.0","author":{"name":"Shane Brinkman-Davis Delamore"},"license":"ISC","_id":"@art-suite/art-core-strings@0.1.0","maintainers":[{"name":"shanebdavis","email":"shanebdavis@gmail.com"}],"homepage":"https://github.com/art-suite/art-suite-foundations","bugs":{"url":"https://github.com/art-suite/art-suite-foundations/issues"},"dist":{"shasum":"dfda2313ffe22785908dd42493ff1538de8c52e7","tarball":"https://registry.npmjs.org/@art-suite/art-core-strings/-/art-core-strings-0.1.0.tgz","fileCount":26,"integrity":"sha512-P/HYzpOMsE6kOMfwH3py+nnRjPJurdvsUm9JnxvX9O7PN0tg75nXrv3d2G/5K+cjnMe63OmoKL2+k5kN1OIJjA==","signatures":[{"sig":"MEUCIEiS1v4Nzs0S9338OpGwBF8qE/w7ZZA+bYcW5VrKoysaAiEAi2m+X7JL5cAy7ACy3c3zN9D1lfIbwp6PtqwPCpGbwVM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103923},"jest":{"verbose":true,"testEnvironment":"node","collectCoverageFrom":["build/**/*.js","!build/test/**/*.js"],"testPathIgnorePatterns":["/node_modules/","<rootDir>/test"],"coveragePathIgnorePatterns":["/index.js$","/namespace.js$"]},"main":"./build","watch":{"build":{"quiet":false,"patterns":["source"],"extensions":["caf","coffee"]}},"gitHead":"15b29bf6c51aa887ad289cd2ec242ca36b55ac5c","scripts":{"nn":"nn build/* ","test":"jest","build":"rsync -av --exclude='*.caf' --exclude='*.coffee' ./source/ ./build/\ncoffee -m --output build --compile source &\nCOFFEE_PID=$!\ncaf -m -c source -o build --require coffee-script/register&\nCAF_PID=$!\nwait $COFFEE_PID || exit 1\nwait $CAF_PID || exit 1\nnpm run nn","clean":"rm -rf build/*","test-watch":"jest --watch","build-clean":"# BUILD CLEAN START\n#   - building into: build-temp\n#\nrm -rf ./__build-old__\nrsync -av --exclude='*.caf' --exclude='*.coffee' ./source/ ./build-temp/\ncoffee -m --output build-temp --compile source &\nCOFFEE_PID=$!\ncaf -m -c source -o build-temp --require coffee-script/register&\nCAF_PID=$!\nwait $COFFEE_PID || exit 1\nwait $CAF_PID || exit 1\nnpm run nn\n\nnn build-temp/*\n\n# BUILD CLEAN FINIALIZING\n#  - replace old build in:   build\n#  - with new build from:    build-temp\n#\nmv build __build-old__\nmv build-temp build\nrm -rf ./__build-old__","build-watch":"nodemon -e js,ts,jsx,tsx,caf,coffee,json -w \"source/**\" -x npm run build"},"_npmUser":{"name":"shanebdavis","email":"shanebdavis@gmail.com"},"repository":{"url":"git+https://github.com/art-suite/art-suite-foundations.git","type":"git"},"_npmVersion":"10.9.0","description":"The Standard Library for JavaScript that aught to be.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"caffeine-script-runtime":"^1.14.0","neptune-namespaces-runtime":"^3.2.14"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^7.2.0","art-testbench":"^3.2.17","art-build-configurator":"^1.30.4","@art-suite/standard-package-builder":"^1.2.7"},"_npmOperationalInternal":{"tmp":"tmp/art-core-strings_0.1.0_1746741113746_0.08230402290715855","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@art-suite/art-core-strings","version":"0.1.1","author":{"name":"Shane Brinkman-Davis Delamore"},"license":"ISC","_id":"@art-suite/art-core-strings@0.1.1","maintainers":[{"name":"shanebdavis","email":"shanebdavis@gmail.com"}],"homepage":"https://github.com/art-suite/art-suite-foundations","bugs":{"url":"https://github.com/art-suite/art-suite-foundations/issues"},"dist":{"shasum":"2addafbebe37c82ad5982e8b4edd4d8e940446b8","tarball":"https://registry.npmjs.org/@art-suite/art-core-strings/-/art-core-strings-0.1.1.tgz","fileCount":26,"integrity":"sha512-JU3IWujJxCOoK/9MWyICDZN51z+N/+4J4A34gugHfoo7gi/Ws+1z6qsrb0D6Ai169+lD9Si48XfmMXag234xEQ==","signatures":[{"sig":"MEUCIBF+YS5Oeay2giHFj1zzlk3T7OOwNyap8iPWbI9sztXFAiEAiO0PWBjTHNKPUfu4jfgoxfIrwrNTB52wsnILa3bhHrs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103662},"jest":{"verbose":true,"testEnvironment":"node","collectCoverageFrom":["build/**/*.js","!build/test/**/*.js"],"testPathIgnorePatterns":["/node_modules/","<rootDir>/test"],"coveragePathIgnorePatterns":["/index.js$","/namespace.js$"]},"main":"./build","watch":{"build":{"quiet":false,"patterns":["source"],"extensions":["caf","coffee"]}},"exports":{".":{"import":"./index.mjs","require":"./build/index.js"}},"gitHead":"bedd81435373af9778e14146163a6077d4fdcc81","scripts":{"nn":"nn build/* ","test":"jest","build":"rsync -av --exclude='*.caf' ./source/ ./build/\ncaf -m -c source -o build\nnpm run nn","clean":"rm -rf build/*","test-watch":"jest --watch","build-clean":"# BUILD CLEAN START\n#   - building into: build-temp\n#\nrm -rf ./__build-old__\nrsync -av --exclude='*.caf' ./source/ ./build-temp/\ncaf -m -c source -o build-temp\nnpm run nn\n\nnn build-temp/*\n\n# BUILD CLEAN FINIALIZING\n#  - replace old build in:   build\n#  - with new build from:    build-temp\n#\nmv build __build-old__\nmv build-temp build\nrm -rf ./__build-old__","build-watch":"nodemon -e js,ts,jsx,tsx,caf,coffee,json -w \"source/**\" -x npm run build"},"_npmUser":{"name":"shanebdavis","email":"shanebdavis@gmail.com"},"repository":{"url":"git+https://github.com/art-suite/art-suite-foundations.git","type":"git"},"_npmVersion":"10.9.0","description":"The Standard Library for JavaScript that aught to be.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"caffeine-script-runtime":"^1.14.0","neptune-namespaces-runtime":"^3.2.14"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^7.2.0","art-testbench":"^3.2.17","art-build-configurator":"^1.30.4","@art-suite/standard-package-builder":"^1.2.7"},"_npmOperationalInternal":{"tmp":"tmp/art-core-strings_0.1.1_1746783863742_0.48343188376276114","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@art-suite/art-core-strings","version":"0.1.2","author":{"name":"Shane Brinkman-Davis Delamore"},"license":"ISC","_id":"@art-suite/art-core-strings@0.1.2","maintainers":[{"name":"shanebdavis","email":"shanebdavis@gmail.com"}],"homepage":"https://github.com/art-suite/art-suite-foundations","bugs":{"url":"https://github.com/art-suite/art-suite-foundations/issues"},"dist":{"shasum":"479774b0a08ebf6eb195be59b81272f5d9c57155","tarball":"https://registry.npmjs.org/@art-suite/art-core-strings/-/art-core-strings-0.1.2.tgz","fileCount":26,"integrity":"sha512-Dsbr7j456KOvYIJdy3eZGbe29ztNyeDtDxxQJqr97XHz6GwQRR4ZCnjkLFhck99iSiyZs6ILhWh3HhYoaJEP0Q==","signatures":[{"sig":"MEQCIHBaYRluZo9E7i+8UxjqgLDrki76VX56NIFXLV8WCUU2AiBe8z4O+Ke/J+W8jslCg6WQQKYHwwUhue5rCt7rHFyDAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103662},"jest":{"verbose":true,"testEnvironment":"node","collectCoverageFrom":["build/**/*.js","!build/test/**/*.js"],"testPathIgnorePatterns":["/node_modules/","<rootDir>/test"],"coveragePathIgnorePatterns":["/index.js$","/namespace.js$"]},"main":"./build","watch":{"build":{"quiet":false,"patterns":["source"],"extensions":["caf","coffee"]}},"exports":{".":{"import":"./index.mjs","require":"./build/index.js"}},"gitHead":"a94165479e2a1bce1798e54eabcb679c47599240","scripts":{"nn":"nn build/* ","test":"jest","build":"rsync -av --exclude='*.caf' ./source/ ./build/\ncaf -m -c source -o build\nnpm run nn","clean":"rm -rf build/*","test-watch":"jest --watch","build-clean":"# BUILD CLEAN START\n#   - building into: build-temp\n#\nrm -rf ./__build-old__\nrsync -av --exclude='*.caf' ./source/ ./build-temp/\ncaf -m -c source -o build-temp\nnpm run nn\n\nnn build-temp/*\n\n# BUILD CLEAN FINIALIZING\n#  - replace old build in:   build\n#  - with new build from:    build-temp\n#\nmv build __build-old__\nmv build-temp build\nrm -rf ./__build-old__","build-watch":"nodemon -e js,ts,jsx,tsx,caf,coffee,json -w \"source/**\" -x npm run build"},"_npmUser":{"name":"shanebdavis","email":"shanebdavis@gmail.com"},"repository":{"url":"git+https://github.com/art-suite/art-suite-foundations.git","type":"git"},"_npmVersion":"10.9.0","description":"The Standard Library for JavaScript that aught to be.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"caffeine-script-runtime":"^1.14.0","neptune-namespaces-runtime":"^3.2.14"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^7.2.0","art-testbench":"^3.2.17","art-build-configurator":"^1.30.4","@art-suite/standard-package-builder":"^1.2.7"},"_npmOperationalInternal":{"tmp":"tmp/art-core-strings_0.1.2_1746786913740_0.2917830457685273","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@art-suite/art-core-strings","version":"0.1.3","author":{"name":"Shane Brinkman-Davis Delamore"},"license":"ISC","_id":"@art-suite/art-core-strings@0.1.3","maintainers":[{"name":"shanebdavis","email":"shanebdavis@gmail.com"}],"homepage":"https://github.com/art-suite/art-suite-foundations","bugs":{"url":"https://github.com/art-suite/art-suite-foundations/issues"},"dist":{"shasum":"eb880d13aefa3314ba038ba800aeb4ab04546fd3","tarball":"https://registry.npmjs.org/@art-suite/art-core-strings/-/art-core-strings-0.1.3.tgz","fileCount":26,"integrity":"sha512-WVvak7VQjnkTfIK2YmgQ0N33yyvQgSFM0UoyCZ04zyKlsKOZGcjpqWPWQzZXL00OWqcNFx5yTofN1DIWnJfWJg==","signatures":[{"sig":"MEUCIQCV057YdXjFx3XZudJCpOJl+zlX8Zng6EfFO8lC38fxyQIgJxC7HEZGBbFnfD0ynEuuDYBis+hZ9lGQA8DcdAq58bg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103693},"jest":{"verbose":true,"testEnvironment":"node","collectCoverageFrom":["build/**/*.js","!build/test/**/*.js"],"testPathIgnorePatterns":["/node_modules/","<rootDir>/test"],"coveragePathIgnorePatterns":["/index.js$","/namespace.js$"]},"main":"./build","watch":{"build":{"quiet":false,"patterns":["source"],"extensions":["caf","coffee"]}},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs","require":"./build/index.js"}},"gitHead":"a94165479e2a1bce1798e54eabcb679c47599240","scripts":{"nn":"nn build/* ","test":"jest","build":"rsync -av --exclude='*.caf' ./source/ ./build/\ncaf -m -c source -o build\nnpm run nn","clean":"rm -rf build/*","test-watch":"jest --watch","build-clean":"# BUILD CLEAN START\n#   - building into: build-temp\n#\nrm -rf ./__build-old__\nrsync -av --exclude='*.caf' ./source/ ./build-temp/\ncaf -m -c source -o build-temp\nnpm run nn\n\nnn build-temp/*\n\n# BUILD CLEAN FINIALIZING\n#  - replace old build in:   build\n#  - with new build from:    build-temp\n#\nmv build __build-old__\nmv build-temp build\nrm -rf ./__build-old__","build-watch":"nodemon -e js,ts,jsx,tsx,caf,coffee,json -w \"source/**\" -x npm run build"},"_npmUser":{"name":"shanebdavis","email":"shanebdavis@gmail.com"},"repository":{"url":"git+https://github.com/art-suite/art-suite-foundations.git","type":"git"},"_npmVersion":"10.9.0","description":"The Standard Library for JavaScript that aught to be.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"caffeine-script-runtime":"^1.14.0","neptune-namespaces-runtime":"^3.2.14"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^7.2.0","art-testbench":"^3.2.17","art-build-configurator":"^1.30.4","@art-suite/standard-package-builder":"^1.2.7"},"_npmOperationalInternal":{"tmp":"tmp/art-core-strings_0.1.3_1746787422001_0.6598174754865602","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"author":{"name":"Shane Brinkman-Davis Delamore"},"bugs":{"url":"https://github.com/art-suite/art-suite-foundations/issues"},"dependencies":{"caffeine-script-runtime":"^1.14.0","neptune-namespaces-runtime":"^3.2.15"},"description":"The Standard Library for JavaScript that aught to be.","devDependencies":{"@art-suite/standard-package-builder":"^1.2.8","art-build-configurator":"^1.30.5","art-testbench":"^3.2.18","mocha":"^7.2.0"},"exports":{".":{"import":"./index.mjs","require":"./build/index.js","types":"./index.d.ts"}},"homepage":"https://github.com/art-suite/art-suite-foundations","jest":{"collectCoverageFrom":["build/**/*.js","!build/test/**/*.js"],"coveragePathIgnorePatterns":["/index.js$","/namespace.js$"],"testEnvironment":"node","testPathIgnorePatterns":["/node_modules/","<rootDir>/test"],"verbose":true},"license":"ISC","main":"./build","name":"@art-suite/art-core-strings","repository":{"type":"git","url":"git+https://github.com/art-suite/art-suite-foundations.git"},"scripts":{"build":"rsync -av --exclude='*.caf' ./source/ ./build/\ncaf -m -c source -o build\nnpm run nn","build-clean":"# BUILD CLEAN START\n#   - building into: build-temp\n#\nrm -rf ./__build-old__\nrsync -av --exclude='*.caf' ./source/ ./build-temp/\ncaf -m -c source -o build-temp\nnpm run nn\n\nnn build-temp/*\n\n# BUILD CLEAN FINIALIZING\n#  - replace old build in:   build\n#  - with new build from:    build-temp\n#\nmv build __build-old__\nmv build-temp build\nrm -rf ./__build-old__","build-watch":"nodemon -e js,ts,jsx,tsx,caf,coffee,json -w \"source/**\" -x npm run build","clean":"rm -rf build/*","nn":"nn build/* ","test":"jest","test-watch":"jest --watch"},"version":"0.1.4","watch":{"build":{"extensions":["caf","coffee"],"patterns":["source"],"quiet":false}},"gitHead":"3140bf828cabdf379d7c25fc877c26c1608c2409","_id":"@art-suite/art-core-strings@0.1.4","_nodeVersion":"24.10.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-cGY3R7pBHcC393qqEX4+fJ5V7owaXEtdpCr2h7HcKahpjEo89HSiGlF6q6U4kaZ4Iq46HcGcITzHO0mOzhrBvQ==","shasum":"8d1d0ac077e699fb57250f3a6be7cb36eafe7b56","tarball":"https://registry.npmjs.org/@art-suite/art-core-strings/-/art-core-strings-0.1.4.tgz","fileCount":26,"unpackedSize":103693,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCVxeZXXTg+e6G3UiJhuv9vDdimxbNjxI17LizM/VdP/AIhAKn70d3Tu0zEZtmRSw+xHnnyHBhQTGnTFRHfRS+wtahO"}]},"_npmUser":{"name":"shanebdavis","email":"shanebdavis@gmail.com"},"directories":{},"maintainers":[{"name":"shanebdavis","email":"shanebdavis@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/art-core-strings_0.1.4_1762507601246_0.6992165988319157"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-08T21:51:53.685Z","modified":"2025-11-07T09:26:41.635Z","0.1.0":"2025-05-08T21:51:53.931Z","0.1.1":"2025-05-09T09:44:23.936Z","0.1.2":"2025-05-09T10:35:13.912Z","0.1.3":"2025-05-09T10:43:42.218Z","0.1.4":"2025-11-07T09:26:41.438Z"},"bugs":{"url":"https://github.com/art-suite/art-suite-foundations/issues"},"author":{"name":"Shane Brinkman-Davis Delamore"},"license":"ISC","homepage":"https://github.com/art-suite/art-suite-foundations","repository":{"type":"git","url":"git+https://github.com/art-suite/art-suite-foundations.git"},"description":"The Standard Library for JavaScript that aught to be.","maintainers":[{"name":"shanebdavis","email":"shanebdavis@gmail.com"}],"readme":"# @art-suite/art-core-strings\n\nA powerful and extensive utility library for string manipulation, parsing, generation, and regular expressions.\n\n## Features\n\n- Robust string manipulation: padding, replacing, joining, shortening, escaping.\n- Random string generation, including cryptographically secure options.\n- URL parsing, manipulation, and generation utilities.\n- Comprehensive set of pre-defined regular expressions for common patterns (URLs, emails, colors, etc.).\n- JSON stringification utilities.\n- Pluralization and singularization of English words.\n- TypeScript definitions for complete type safety.\n\n## Installation\n\n```bash\nnpm install @art-suite/art-core-strings\n```\n\n## API Overview\n\n### String Manipulation & Utilities\n\n- **`compactFlattenJoin(array: any[], joiner?: string): string`**: Flattens and compacts an array, then joins its elements into a string.\n- **`replaceLast(source: string, find: string, replace: string): string`**: Replaces the last occurrence of a substring.\n- **`getPadding(length: number, character?: string): string`**: Generates a padding string of a specified length.\n- **`pad(str: string, length: number, character?: string, alignLeft?: boolean): string`**: Pads a string to a certain length.\n- **`escapeJavascriptString(str: string): string`**: Escapes a string for safe use within JavaScript single or double quotes.\n- **`allIndexes(source: string, find: string): number[]`**: Finds all indexes of a substring.\n- **`eachMatch(str: string, regex: RegExp, callback: (match: RegExpExecArray) => void): void`**: Iterates over all matches of a regex in a string.\n- **`humanFriendlyShorten(str: string, maxLength?: number, separator?: string): string`**: Shortens a string in a human-friendly way, typically by adding an ellipsis.\n- **`stripTrailingWhitespace(str: string): string`**: Removes trailing whitespace from a string.\n\n### Random String Generation\n\n- **`base62Characters: string`**: A string containing all base62 characters (`0-9a-zA-Z`).\n- **`randomString(length: number, characters?: string): string`**: Generates a random string of a specified length from a given set of characters.\n- **`cryptoRandomString(length: number, characters?: string): string`**: Generates a cryptographically random string.\n- **`randomBase62Character(): string`**: Returns a single random base62 character.\n\n### JSON Utilities\n\n- **`jsStringify(value: any, indent?: number | string, includeFunctions?: boolean, includeUndefined?: boolean): string`**: Extended JSON.stringify with options for functions and undefined.\n- **`consistentJsonStringify(obj: any): string`**: Stringifies an object with keys sorted for consistent output.\n\n### URL Utilities\n\n- **`sameOrigin(url1: string, url2: string): boolean`**: Checks if two URLs have the same origin.\n- **`parseQuery(queryString: string): Record<string, string | string[]>`**: Parses a URL query string into an object.\n- **`generateQuery(params: Record<string, any>): string`**: Generates a URL query string from an object.\n- **`urlJoin(...parts: string[]): string`**: Joins URL parts intelligently.\n- **`urlResolve(...parts: string[]): string`**: Resolves URL parts similar to `path.resolve` but for URLs.\n- **`appendQuery(url: string, query: string | Record<string, any>): string`**: Appends a query string or params to a URL.\n- **`parseUrl(url: string): object`**: Parses a URL into its components (protocol, host, path, query, etc.).\n- **`findUrlOrigin(url: string): string | undefined`**: Extracts the origin (protocol + host + port) from a URL.\n- **`normalizeUrl(url: string): string`**: Normalizes a URL string (e.g., sorts query params, decodes, etc.).\n\n### Pluralization\n\n- **`plural(word: string, count?: number): string`**: Returns the plural form of a word. Can provide count for conditional pluralization.\n- **`singular(word: string): string`**: Returns the singular form of a word.\n- **`isSingular(word: string): boolean`**: Checks if a word is singular.\n- **`isPlural(word: string): boolean`**: Checks if a word is plural.\n- **`addPluralizeRule(singular: string | RegExp, plural: string | ((match: string, count: number) => string)): void`**: Adds a custom pluralization/singularization rule.\n- **`pluralize(word: string, count?: number, inclusive?: boolean): string`**: More comprehensive pluralization function (alias or more featureful version of `plural`).\n\n### Regular Expressions\n\nThis library provides a wide array of pre-defined `RegExp` objects for common matching tasks. Below are some key categories (refer to `index.d.ts` for the full list and exact names if aliased, e.g. `someRegexp` vs `someRegex`).\n\n- **General**: `escapeRegExp`, `numberRegExp`, `wordsRegExp`, `exactlyOneWordRegExp`, `isoDateRegExp`.\n- **URL Structure**: `urlProtocolRegExp`, `domainRegExp`, `urlPathRegExp`, `urlQueryRegExp`, `urlQueryParamsRegExp`, `findLegalUrlCharacterRegExp`, `findUrlPortRegExp`, `findUrlFragmentRegExp`.\n- **URL Finding**: `findUrlRegExp`, `urlRegExp`, `findUrlWithOptionalProtocolRegExp`, `urlWithOptionalProtocolRegExp`, `findAllUrlsRegExp`, `findAllUrlsWithOptionalProtocolRegExp`, `findSourceReferenceUrlRegExp`.\n- **Email**: `emailRegExp`, `findEmailRegExp`, `findEmailLocalRegExp`.\n- **Color**: `hex16ColorRegExp`, `hex256ColorRegExp`, `hex16GreyColorRegExp`, `hex256GreyColorRegExp`, `rgbColorRegExp`, `rgbaColorRegExp`, `findColorRegExp`, `colorRegExp`.\n\n_(Note: Many RegExp exports have aliases like `...Regexp` or `...Regex`. The primary documented form is usually `...RegExp`.)_\n\n## Examples\n\n### String Manipulation\n\n```typescript\nimport {\n  pad,\n  compactFlattenJoin,\n  humanFriendlyShorten,\n} from \"@art-suite/art-core-strings\";\n\nconsole.log(pad(\"test\", 10, \"_\", false)); // \"______test\"\nconsole.log(\n  compactFlattenJoin([\"hello\", null, [\"world\", undefined, \"!\"]], \" \")\n); // \"hello world !\"\nconsole.log(\n  humanFriendlyShorten(\"This is a very long string that needs shortening\", 20)\n); // \"This is a very long...\"\n```\n\n### URL Utilities\n\n```typescript\nimport {\n  parseUrl,\n  generateQuery,\n  appendQuery,\n} from \"@art-suite/art-core-strings\";\n\nconst myUrl = \"http://example.com/path?foo=bar#hash\";\nconst parsed = parseUrl(myUrl);\nconsole.log(parsed.host); // \"example.com\"\n\nconst params = { a: 1, b: \"test\" };\nconsole.log(generateQuery(params)); // \"a=1&b=test\"\nconsole.log(appendQuery(\"http://example.com\", params)); // \"http://example.com?a=1&b=test\"\n```\n\n### Regular Expressions\n\n```typescript\nimport { emailRegExp, urlRegExp } from \"@art-suite/art-core-strings\";\n\nconsole.log(emailRegExp.test(\"test@example.com\")); // true\nconsole.log(urlRegExp.test(\"http://example.com\")); // true\n```\n\n### Pluralization\n\n```typescript\nimport { plural, singular } from \"@art-suite/art-core-strings\";\n\nconsole.log(plural(\"cat\")); // \"cats\"\nconsole.log(plural(\"box\")); // \"boxes\"\nconsole.log(singular(\"apples\")); // \"apple\"\nconsole.log(plural(\"mouse\", 2)); // \"mice\"\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}