Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
e1b756d
chore(editor-config): add editorconfig and vscode extension recommend…
rcpthongta Sep 17, 2026
4f3d328
chore(editor-config): configure cspell and add extension recommendation
rcpthongta Sep 17, 2026
8972a2b
merge: 'chore/configure-editor' into 'develop'
rcpthongta Sep 17, 2026
c5c981e
chore(project): initialize package.json and npmrc configuration
rcpthongta Sep 17, 2026
ff3a145
chore(deps-dev): add '@types/node'
rcpthongta Sep 17, 2026
1b5303a
chore(git): ignore node_modules directory
rcpthongta Sep 17, 2026
231d2a4
merge: 'chore/initialize-node-project' into 'develop'
rcpthongta Sep 17, 2026
a3927fb
merge: 'develop' into 'chore/configure-editor'
rcpthongta Sep 17, 2026
39f9672
chore(git): ignore vscode user files while keeping shared configs
rcpthongta Sep 17, 2026
a13103e
merge: 'chore/configure-editor' into 'develop'
rcpthongta Sep 17, 2026
dbd6b89
chore(deps-dev): add typescript, tsup, and rimraf
rcpthongta Sep 17, 2026
c4a1647
chore(build): configure typescript and tsup build pipeline
rcpthongta Sep 17, 2026
2a91590
chore(pkg): configure module exports and package distribution fields
rcpthongta Sep 17, 2026
f73b004
chore(scripts): add build scripts for js and types
rcpthongta Sep 17, 2026
eefcaa4
feat(index): initialize source entry point
rcpthongta Sep 17, 2026
1474512
chore(git): ignore build output directory
rcpthongta Sep 17, 2026
e80ed0d
chore(editor-config): configure workspace typescript and add ts error…
rcpthongta Sep 17, 2026
d08f3f2
merge: 'chore/configure-typescript' into 'develop'
rcpthongta Sep 17, 2026
4539074
chore(deps-dev): add eslint, prettier, and related plugins
rcpthongta Sep 17, 2026
82b1e1a
chore(lint): configure eslint and prettier formatting rules
rcpthongta Sep 17, 2026
d4c2276
chore(scripts): add lint and lint:fix scripts
rcpthongta Sep 17, 2026
2c85b2f
chore(editorconfig): enable trim trailing whitespace for code files
rcpthongta Sep 17, 2026
55f8918
chore(editor-config): configure eslint formatting and add extension r…
rcpthongta Sep 17, 2026
bd19401
style(tsc): format include array and normalize line endings
rcpthongta Sep 17, 2026
d385147
merge: 'chore/configure-linter' into 'develop'
rcpthongta Sep 17, 2026
82313f2
feat(has-text): add hasText utility function
rcpthongta Sep 17, 2026
9f3a610
merge: 'feat/has-text' into 'develop'
rcpthongta Sep 17, 2026
617f228
chore(deps-dev): add vitest and '@vitest/coverage-v8'
rcpthongta Sep 17, 2026
4231cfe
test(config): configure vitest test runner, benchmarks, and coverage
rcpthongta Sep 17, 2026
514ea43
chore(tsc): exclude spec files from build tsconfig
rcpthongta Sep 17, 2026
ecf4729
chore(scripts): add test and benchmark scripts
rcpthongta Sep 17, 2026
d7dfd42
chore(git): ignore test coverage directory
rcpthongta Sep 17, 2026
babac4d
merge: 'chore/configure-testing' into 'develop'
rcpthongta Sep 17, 2026
139e6c0
merge: 'develop' into 'feat/has-text'
rcpthongta Sep 17, 2026
f1ffa1d
chore(deps-dev): downgrade vitest and coverage to v4.1.10
rcpthongta Sep 17, 2026
0a16b73
merge: 'chore/configure-testing' into 'develop'
rcpthongta Sep 17, 2026
d7c5a26
merge: 'develop' into 'feat/has-text'
rcpthongta Sep 17, 2026
0ce7a94
test(has-text): add unit tests for non-whitespace string check
rcpthongta Sep 17, 2026
0f8d650
perf(has-text): add performance benchmarks for non-whitespace check
rcpthongta Sep 17, 2026
e80806d
merge: 'feat/has-text' into 'develop'
rcpthongta Sep 17, 2026
f727d8e
chore(deps-dev): add husky, lint-staged, and commitlint tooling
rcpthongta Sep 17, 2026
1d7098b
chore(git-hooks): configure husky hooks, commitlint, and lint-staged
rcpthongta Sep 17, 2026
a6960f1
chore(scripts): add git hook helper scripts
rcpthongta Sep 17, 2026
61f4ab9
merge: 'chore/configure-git-hooks' into 'develop'
rcpthongta Sep 17, 2026
bc0aa14
chore(scripts): update prepush script to run test and build
rcpthongta Sep 17, 2026
71c6984
merge: 'chore/configure-git-hooks' into 'develop'
rcpthongta Sep 17, 2026
9da22be
ci(github): add github workflows for linting and test coverage
rcpthongta Sep 17, 2026
232bf47
merge: 'ci/configure-workflow' into 'develop'
rcpthongta Sep 17, 2026
ff72cf7
chore(deps-dev): upgrade vitest and coverage to v5.0.1
rcpthongta Sep 21, 2026
0f07e0a
perf(has-text): refactor benchmarks to use vitest test context runner
rcpthongta Sep 21, 2026
979f28f
chore(lint): disable sonarjs assertion rule for benchmark files
rcpthongta Sep 21, 2026
4bc8398
merge: 'chore/upgrade-vitest-v5' into 'develop'
rcpthongta Sep 21, 2026
8b80b49
feat(has-length): add non-empty string check utility
rcpthongta Sep 21, 2026
c0c02a5
test(has-length): add unit tests for non-empty string check
rcpthongta Sep 21, 2026
20cd0b0
perf(has-length): add performance benchmarks for non-empty check
rcpthongta Sep 21, 2026
d2e62fb
merge: 'feat/has-length' into 'develop'
rcpthongta Sep 21, 2026
8241d79
test(has-text): refactor test cases to use test instead of it
rcpthongta Sep 21, 2026
7831a15
perf(has-text): migrate benchmarks to vitest test context
rcpthongta Sep 21, 2026
fac41d8
merge: 'feat/has-text' into 'develop'
rcpthongta Sep 21, 2026
5275abb
feat(default-if-blank): add fallback utility for blank strings
rcpthongta Sep 21, 2026
61f1412
test(default-if-blank): add unit tests for fallback blank string check
rcpthongta Sep 21, 2026
7e96f89
perf(default-if-blank): add performance benchmarks for fallback check
rcpthongta Sep 21, 2026
e8be1e9
merge: 'feat/default-if-blank' into 'develop'
rcpthongta Sep 21, 2026
692b7c2
feat(default-if-empty): add fallback utility for empty strings
rcpthongta Sep 21, 2026
ac02bcf
test(default-if-empty): add unit tests for fallback empty string check
rcpthongta Sep 21, 2026
db311f4
perf(default-if-empty): add performance benchmarks for fallback check
rcpthongta Sep 21, 2026
45bdb27
merge: 'feat/default-if-empty' into 'develop'
rcpthongta Sep 21, 2026
ab016a5
feat(constants): add EMPTY string constant
rcpthongta Sep 21, 2026
9a45966
feat(capitalize): add string first-character capitalization utility
rcpthongta Sep 21, 2026
69c246d
test(capitalize): add unit tests for string capitalization
rcpthongta Sep 21, 2026
acb1866
perf(capitalize): add performance benchmarks for string capitalization
rcpthongta Sep 21, 2026
a290aaf
merge: 'feat/capitalize' into 'develop'
rcpthongta Sep 21, 2026
0596d74
feat(uncapitalize): add string first-character lowercase utility
rcpthongta Sep 21, 2026
6ce699c
test(uncapitalize): add unit tests for string uncapitalization
rcpthongta Sep 21, 2026
66e9205
perf(uncapitalize): add performance benchmarks for string uncapitaliz…
rcpthongta Sep 21, 2026
7c29a1b
chore(editor-config): add uncapitalize to cspell words list
rcpthongta Sep 21, 2026
5f82985
merge: 'feat/uncapitalize' into 'develop'
rcpthongta Sep 21, 2026
4ff64ea
feat(constants): add WORD_REGEX unicode word boundary pattern
rcpthongta Sep 22, 2026
4e94a31
feat(camel-case): add camelCase string conversion utility
rcpthongta Sep 22, 2026
5324dfb
test(camel-case): add unit tests for camelCase string conversion
rcpthongta Sep 22, 2026
286bad5
perf(camel-case): add performance benchmarks for camelCase conversion
rcpthongta Sep 22, 2026
66ddc7b
merge: 'feat/camel-case' into 'develop'
rcpthongta Sep 22, 2026
3c65e33
feat(pascal-case): add PascalCase string conversion utility
rcpthongta Sep 22, 2026
09168d5
test(pascal-case): add unit tests for PascalCase string conversion
rcpthongta Sep 22, 2026
97eb18c
perf(pascal-case): add performance benchmarks for PascalCase conversion
rcpthongta Sep 22, 2026
2a1a6cc
merge: 'feat/pascal-case' into 'develop'
rcpthongta Sep 22, 2026
b17a193
feat(constants): add HYPHEN string constant
rcpthongta Sep 22, 2026
5331aed
feat(kebab-case): add kebab-case string conversion utility
rcpthongta Sep 22, 2026
d34c2ed
test(kebab-case): add unit tests for kebab-case string conversion
rcpthongta Sep 22, 2026
f24d0ef
perf(kebab-case): add performance benchmarks for kebab-case conversion
rcpthongta Sep 22, 2026
2b3d6c6
merge: 'feat/kebab-case' into 'develop'
rcpthongta Sep 22, 2026
25b0211
feat(constants): add UNDERSCORE string constant
rcpthongta Sep 22, 2026
1bb8a36
feat(snake-case): add snake_case string conversion utility
rcpthongta Sep 22, 2026
a5eeca9
test(snake-case): add unit tests for snake_case string conversion
rcpthongta Sep 22, 2026
23bb872
perf(snake-case): add performance benchmarks for snake_case conversion
rcpthongta Sep 22, 2026
2831448
merge: 'feat/snake-case' into 'develop'
rcpthongta Sep 22, 2026
5ec821e
feat(constant-case): add CONSTANT_CASE string conversion utility
rcpthongta Sep 22, 2026
3651f10
test(constant-case): add unit tests for CONSTANT_CASE conversion
rcpthongta Sep 22, 2026
140c508
perf(constant-case): add performance benchmarks for CONSTANT_CASE con…
rcpthongta Sep 22, 2026
9f82776
merge: 'feat/constant-case' into 'develop'
rcpthongta Sep 22, 2026
2c3cfdd
feat(constants): add whitespace normalization regex patterns
rcpthongta Sep 22, 2026
0e367a5
feat(constants): add SPACE string constant
rcpthongta Sep 22, 2026
4c73130
feat(collapse-whitespace): add whitespace normalization utility
rcpthongta Sep 22, 2026
749a99e
test(collapse-whitespace): add unit tests for whitespace normalization
rcpthongta Sep 22, 2026
a2be50f
perf(collapse-whitespace): add performance benchmarks for whitespace …
rcpthongta Sep 22, 2026
8e9a838
merge: 'feat/collapse-whitespace' into 'develop'
rcpthongta Sep 22, 2026
0600ae9
feat(constants): add diacritics and non-alphanumeric regex patterns
rcpthongta Sep 23, 2026
f6fa36c
feat(constants): add DOLLAR_SIGN string constant
rcpthongta Sep 23, 2026
9012053
feat(slugify): add URL-friendly string slugify utility
rcpthongta Sep 23, 2026
9916d99
test(slugify): add unit tests for slugify utility
rcpthongta Sep 23, 2026
f5ba0b6
perf(slugify): add performance benchmarks for string slugify
rcpthongta Sep 23, 2026
fca025d
merge: 'feat/slugify' into 'develop'
rcpthongta Sep 23, 2026
f737768
feat(constants): add FORMAT_PLACEHOLDER_REGEX placeholder pattern
rcpthongta Sep 23, 2026
5724b49
feat(constants): add DOT, LEFT_BRACE, and RIGHT_BRACE string constants
rcpthongta Sep 23, 2026
514be7c
feat(format): add string template formatting utilities
rcpthongta Sep 23, 2026
3a76181
test(format): add unit tests for string template formatting
rcpthongta Sep 23, 2026
b664a73
perf(format): add performance benchmarks for template formatting
rcpthongta Sep 23, 2026
2783157
merge: 'feat/format' into 'develop'
rcpthongta Sep 23, 2026
1c511f6
feat(constants): add UNICODE_DIGIT and UNICODE_LETTER regex patterns
rcpthongta Sep 23, 2026
dab2c89
feat(constants): add ASTERISK and HASH string constants
rcpthongta Sep 23, 2026
96d7d56
feat(types): add CharacterSegmentMode boundary type
rcpthongta Sep 23, 2026
91f7b82
feat(mask): add pattern-based string masking utility
rcpthongta Sep 23, 2026
3e53f8a
test(mask): add unit tests for string masking utility
rcpthongta Sep 23, 2026
6a16276
perf(mask): add performance benchmarks for pattern string masking
rcpthongta Sep 23, 2026
1bf08c5
merge: 'feat/mask' into 'develop'
rcpthongta Sep 23, 2026
0c8cfa8
feat(redact): add sensitive string redaction utility
rcpthongta Sep 23, 2026
35cbf29
test(redact): add unit tests for sensitive string redaction
rcpthongta Sep 23, 2026
d689596
perf(redact): add performance benchmarks for string redaction
rcpthongta Sep 23, 2026
c0ae728
merge: 'feat/redact' into 'develop'
rcpthongta Sep 23, 2026
a8388dc
chore(pkg): rename package to @rcpthongta/string-utils
rcpthongta Sep 23, 2026
7444b7a
merge: 'chore/update-package-name' into 'develop'
rcpthongta Sep 23, 2026
8a36a55
docs(license): add MIT license
rcpthongta Sep 23, 2026
8856d89
docs(security): add security policy and reporting guidelines
rcpthongta Sep 23, 2026
fc55503
docs(contributing): add development and contribution guidelines
rcpthongta Sep 23, 2026
98abc39
docs(changelog): initialize changelog for v1.0.0 release
rcpthongta Sep 23, 2026
017c21d
chore(github): add bug report issue template
rcpthongta Sep 23, 2026
8449cb9
chore(github): add feature request issue template
rcpthongta Sep 23, 2026
9103092
merge: 'chore/add-repository-docs' into 'develop'
rcpthongta Sep 23, 2026
b8a8e23
docs(readme): add comprehensive documentation, quick start, and guides
rcpthongta Sep 23, 2026
856334a
merge: 'docs/readme' into 'develop'
rcpthongta Sep 23, 2026
31c79bc
chore(release): bump package version to v1.0.0
rcpthongta Sep 23, 2026
4a035e6
ci(release): add npm publish workflow with provenance
rcpthongta Sep 23, 2026
4caf51d
chore(pkg): include CHANGELOG.md in published package files
rcpthongta Sep 23, 2026
87e065a
chore(build): exclude benchmark files from build tsconfig
rcpthongta Sep 23, 2026
00de7cf
merge: 'chore/exclude-benchmarks-from-build' into 'develop'
rcpthongta Sep 23, 2026
f478a9b
merge: 'ci/configure-release-workflow' into 'develop'
rcpthongta Sep 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
root = true

[*]

charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true

[*.{cjs,js,json,json5,jsonc,jsonl,mjs,ts,yml}]

trim_trailing_whitespace = true

[.*rc]

trim_trailing_whitespace = true

[*.md]

trim_trailing_whitespace = false
66 changes: 66 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Bug Report
description: Report a bug or unexpected behavior.
labels:
- bug
body:
- type: textarea
id: description
attributes:
label: Description
description: A clear and concise description of the bug.
validations:
required: true

- type: textarea
id: reproduction
attributes:
label: Steps to Reproduce
description: Provide a minimal code example or steps to reproduce the issue.
placeholder: |
import { capitalize } from "@rcpthongta/string-utils";

capitalize("hello"); // expected "Hello", got ""
validations:
required: true

- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What did you expect to happen?
validations:
required: true

- type: textarea
id: actual
attributes:
label: Actual Behavior
description: What actually happened?
validations:
required: true

- type: input
id: version
attributes:
label: Package Version
description: Which version of `@rcpthongta/string-utils` are you using?
placeholder: 1.0.0
validations:
required: true

- type: input
id: node-version
attributes:
label: Node.js Version
description: Output of `node --version`.
placeholder: v22.0.0
validations:
required: true

- type: textarea
id: additional
attributes:
label: Additional Context
description: Any other relevant information, logs, or screenshots.
validations:
required: false
48 changes: 48 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: Feature Request
description: Suggest a new utility or enhancement.
labels:
- enhancement
body:
- type: textarea
id: description
attributes:
label: Description
description: A clear and concise description of the feature you would like.
validations:
required: true

- type: textarea
id: use-case
attributes:
label: Use Case
description: Describe the problem or use case this feature would address.
validations:
required: true

- type: textarea
id: proposed-api
attributes:
label: Proposed API
description: If applicable, show how you envision the API would look.
placeholder: |
import { truncate } from "@rcpthongta/string-utils";

truncate("Hello, World!", 5); // "Hello..."
validations:
required: false

- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Any alternative solutions or workarounds you have considered.
validations:
required: false

- type: textarea
id: additional
attributes:
label: Additional Context
description: Any other relevant information or references.
validations:
required: false
17 changes: 17 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Continuous Integration
on:
push:
branches:
- develop
- main
pull_request:
branches:
- main
permissions:
contents: read
jobs:
lint:
uses: ./.github/workflows/linter.yml
test:
needs: lint
uses: ./.github/workflows/test.yml
21 changes: 21 additions & 0 deletions .github/workflows/linter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Linter
on:
workflow_call: {}
permissions:
contents: read
jobs:
lint:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
- name: Run script command
run: npm run lint
29 changes: 29 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Release
on:
push:
tags:
- "v*"
permissions:
contents: read
id-token: write
jobs:
publish:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
registry-url: https://registry.npmjs.org
- name: Install dependencies
run: npm ci
- name: Build package
run: npm run build
- name: Publish to npm
run: npm publish --provenance --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
21 changes: 21 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Test
on:
workflow_call: {}
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
- name: Run script command
run: npm run test:coverage
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Dependencies directory

node_modules/*

# Compiled output directory

dist/*

# Test directory

coverage/*

# Text editor directory and files • Visual Studio Code

.vscode/*
!.vscode/extensions.json
!.vscode/launch.json
!.vscode/settings.json
!.vscode/tasks.json
1 change: 1 addition & 0 deletions .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
npx --no -- commitlint --edit "$1"
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
npm run precommit
1 change: 1 addition & 0 deletions .husky/pre-push
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
npm run prepush
3 changes: 3 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
engine-strict = true
fund = false
update-notifier = false
8 changes: 8 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"recommendations": [
"dbaeumer.vscode-eslint",
"editorconfig.editorconfig",
"streetsidesoftware.code-spell-checker",
"yoavbls.pretty-ts-errors"
]
}
28 changes: 28 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"[javascript][json][json5][jsonc][jsonl][markdown][typescript][yaml]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"cSpell.allowCompoundWords": true,
"cSpell.ignoreRegExpList": ["/[\\u0E00-\\u0E7F]/g"],
"cSpell.language": "en,en-US",
"cSpell.words": [
"rcpthongta",
"uncapitalize"
],
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"editor.formatOnSave": true,
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"json",
"json5",
"jsonc",
"jsonl",
"markdown",
"typescript",
"yaml"
],
"typescript.tsdk": "node_modules\\typescript\\lib"
}
49 changes: 49 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/)
and this project adheres to [Semantic Versioning](https://semver.org/).

## [1.0.0] - 2026-09-23

### Added

- **String Inspection**
- `hasText` — check if a string contains non-whitespace characters
- `hasLength` — check if a string contains one or more characters
- `defaultIfBlank` — return a fallback when a string is blank
- `defaultIfEmpty` — return a fallback when a string is empty

- **Case Conversion**
- `capitalize` — uppercase the first character
- `uncapitalize` — lowercase the first character
- `camelCase` — convert a string to camelCase
- `pascalCase` — convert a string to PascalCase
- `kebabCase` — convert a string to kebab-case
- `snakeCase` — convert a string to snake_case
- `constantCase` — convert a string to CONSTANT_CASE

- **String Transformation**
- `collapseWhitespace` — normalize consecutive whitespace to single spaces
- `slugify` — convert a string to a URL-friendly slug
- `format` — format strings using templates and placeholders
- `mask` — mask portions of a string using a pattern
- `redact` — redact sensitive string content

- **Constants & Patterns**
- Reusable string constants such as `EMPTY`, `SPACE`, `HYPHEN`, `UNDERSCORE`, `DOT`, `ASTERISK`, and `HASH`
- Unicode-aware regular expression patterns for words, digits, letters, and diacritics

- **Package Distribution**
- ESM, CJS, and IIFE builds powered by tsup
- TypeScript type declarations
- Dual `import` / `require` package exports

- **Development & CI**
- Vitest for unit tests, benchmarks, and coverage
- ESLint and Prettier for code quality and formatting
- Husky, lint-staged, and commitlint for Git hooks and commit validation
- GitHub Actions workflows for linting and test coverage

[1.0.0]: https://github.com/rcpthongta/string-utils/releases/tag/v1.0.0
Loading
Loading