Compare commits

...

10 Commits

Author SHA1 Message Date
cac1349c95 🎉 Initial commit 2026-02-02 13:38:42 +01:00
Thomas Müller
15c8ef7616 🔧 Track .vscode/settings.json for workspace settings 2025-04-29 13:45:02 +02:00
Thomas Müller
0c08a2d395 Scaffolded src/index.ts entry point for library code 2025-04-29 13:43:53 +02:00
Thomas Müller
1dc94c0dd1 👷 Added GitHub Actions workflow for CI/CD 2025-04-29 13:43:47 +02:00
Thomas Müller
25353662ec 🧪 Added Vitest configuration with coverage 2025-04-29 13:43:40 +02:00
Thomas Müller
f6bbcd8b2e 📝 Scaffolded README.md structure 2025-04-29 13:43:20 +02:00
Thomas Müller
45c0bb6423 🔧 Added .npmignore to exclude non-dist files from npm package 2025-04-29 13:43:15 +02:00
Thomas Müller
142989aa2b 📝 Added commit message template 2025-04-29 13:43:11 +02:00
Thomas Müller
4f65d22efe 📄 Added MIT LICENSE 2025-04-29 13:43:07 +02:00
Thomas Müller
02a33c7b44 🔧 Added sort-package-json configuration 2025-04-29 13:42:39 +02:00
17 changed files with 7684 additions and 63 deletions
+21 -21
View File
@@ -1,21 +1,21 @@
// .eslintrc.cjs // .eslintrc.cjs
module.exports = { module.exports = {
root: true, root: true,
parser: '@typescript-eslint/parser', parser: "@typescript-eslint/parser",
plugins: [ plugins: [
'@typescript-eslint', "@typescript-eslint",
'import', "import",
'unused-imports', "unused-imports",
'simple-import-sort', "simple-import-sort",
], ],
extends: [ extends: [
'eslint:recommended', "eslint:recommended",
'plugin:@typescript-eslint/recommended', "plugin:@typescript-eslint/recommended",
'plugin:@typescript-eslint/strict-type-checked', "plugin:@typescript-eslint/strict-type-checked",
'plugin:@typescript-eslint/stylistic-type-checked', "plugin:@typescript-eslint/stylistic-type-checked",
'plugin:import/recommended', "plugin:import/recommended",
'plugin:import/typescript', "plugin:import/typescript",
'plugin:prettier/recommended', "plugin:prettier/recommended",
], ],
env: { env: {
es2022: true, es2022: true,
@@ -23,15 +23,15 @@ module.exports = {
browser: true, browser: true,
}, },
rules: { rules: {
'prettier/prettier': 'error', "prettier/prettier": "error",
'import/order': 'off', "import/order": "off",
'simple-import-sort/imports': 'error', "simple-import-sort/imports": "error",
'simple-import-sort/exports': 'error', "simple-import-sort/exports": "error",
'unused-imports/no-unused-imports': 'error', "unused-imports/no-unused-imports": "error",
'@typescript-eslint/no-unused-vars': [ "@typescript-eslint/no-unused-vars": [
'error', "error",
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, { argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
], ],
}, },
ignorePatterns: ['dist', 'node_modules', 'public'], ignorePatterns: ["dist", "node_modules", "public"],
}; };
+49
View File
@@ -0,0 +1,49 @@
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm"
- run: npm ci
- run: npm run build
- run: npm run check
- run: npm run test:ci
- run: npm run check:outdated
- run: npm run check:cspell
- run: npm run check:tsc
- run: npm run check:eslint
- run: npm run check:prettier
- run: npm run check:package
- name: Upload coverage
uses: actions/upload-artifact@v4
with:
name: coverage
path: coverage
publish:
if: startsWith(github.ref, 'refs/tags/')
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
registry-url: "https://registry.npmjs.org/"
- run: npm ci
- run: npm run build
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Vendored
+2
View File
@@ -15,6 +15,8 @@ dist-ssr
# Editor directories and files # Editor directories and files
.vscode/* .vscode/*
!.vscode/extensions.json !.vscode/extensions.json
!.vscode/settings.json
!.vscode/tasks.json
.idea .idea
.DS_Store .DS_Store
*.suo *.suo
+15
View File
@@ -0,0 +1,15 @@
dist/
node_modules/
coverage/
public/
*.log
*.tsbuildinfo
src/
.vscode/
.editorconfig
.eslintrc.cjs
cspell.json
lefthook.yml
.sortpackagerc.json
LICENSE
commit-message-template
+9
View File
@@ -0,0 +1,9 @@
{
"semi": true,
"singleQuote": false,
"trailingComma": "all",
"printWidth": 80,
"tabWidth": 4,
"endOfLine": "lf",
"arrowParens": "always"
}
+3
View File
@@ -0,0 +1,3 @@
{
"$schema": "https://json.schemastore.org/sort-package-json.json"
}
+9
View File
@@ -0,0 +1,9 @@
{
"recommendations": [
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"streetsidesoftware.code-spell-checker",
"vitest.explorer",
"ms-vscode.vscode-typescript-next"
]
}
+21
View File
@@ -0,0 +1,21 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[mdx]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}
}
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 tmu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+25
View File
@@ -1 +1,26 @@
# tiny-pattern-ts # tiny-pattern-ts
Pattern matching for TypeScript/ESM environments (F#-style, not regex).
## Development
- **Build:** `npm run build`
- **Test:** `npm run test`, `npm run test:ci`
- **Checks:** `npm run check`, `npm run fix`
## VSCode integration
- Debugging
- Running tests
## Workflows
- Version updates
- Changelog automation
- Publishing
## Contribution guidelines
- Commit signing (GPG)
- How to set up commit message template
- Reference to commit-message-template
+23
View File
@@ -0,0 +1,23 @@
# If applied, this commit will... (Max 50 char)
# Explain why this change is being made (Max 72 Char) [WHAT and WHY vs HOW]
# Provide links or keys to any relevant tickets, articles or other resources
Resolves #...
# --- COMMIT END ---
# Remember to
# Use the imperative mood in the subject line
# Capitalize the subject line
# Do not end the subject line with a period
# Separate subject from body with a blank line
# Use the body to explain what and why vs. how
# Can use multiple lines with "-" for bullet points in body
+1 -1
View File
@@ -40,7 +40,7 @@
# #
# - script: "hello.go" # - script: "hello.go"
# runner: go run # runner: go run
commands: commands:
typecheck: typecheck:
run: npm run check:tsc run: npm run check:tsc
spell: spell:
+7355
View File
File diff suppressed because it is too large Load Diff
+58 -3
View File
@@ -2,14 +2,69 @@
"name": "tiny-pattern-ts", "name": "tiny-pattern-ts",
"private": true, "private": true,
"version": "0.0.0", "version": "0.0.0",
"description": "Pattern matching for TypeScript/ESM environments (F#-style, not regex)",
"keywords": [
"pattern-matching",
"pattern",
"match",
"algebraic-data-types",
"adt",
"typescript"
],
"license": "MIT",
"type": "module", "type": "module",
"sideEffects": false,
"publishConfig": {
"access": "public"
},
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/tmueller/tiny-pattern-ts.git"
},
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "tsc && vite build", "build": "vite build && tsc --emitDeclarationOnly",
"preview": "vite preview" "clean": "rimraf dist",
"clean:build": "rimraf dist",
"test": "npm run check:tsc && npm run test:unit",
"test:unit": "vitest run",
"test:ci": "vitest run --coverage --reporter=dot --reporter=lcov --run",
"check": "npm run check:eslint && npm run check:prettier && npm run check:cspell && npm run check:tsc && npm run check:package && npm run check:outdated",
"check:eslint": "eslint . --ext .ts,.tsx,.js,.jsx",
"check:prettier": "prettier --check .",
"check:cspell": "cspell .",
"check:tsc": "tsc --noEmit",
"check:package": "sort-package-json --check",
"check:outdated": "check-outdated",
"fix": "npm run fix:eslint && npm run fix:prettier && npm run fix:package",
"fix:eslint": "eslint . --ext .ts,.tsx,.js,.jsx --fix",
"fix:prettier": "prettier --write .",
"fix:package": "sort-package-json --write",
"use:git-commit-message": "cp commit-message-template .git/COMMIT_EDITMSG || true"
}, },
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^8.31.1",
"@typescript-eslint/parser": "^8.31.1",
"changesets": "^1.0.2",
"check-outdated": "^2.13.0",
"cspell": "^8.19.3",
"eslint": "^9.25.1",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unused-imports": "^4.1.4",
"lefthook": "^1.11.12",
"prettier": "^3.5.3",
"sort-package-json": "^3.1.0",
"tslib": "^2.8.1",
"type-fest": "^4.40.1",
"typescript": "~5.7.2", "typescript": "~5.7.2",
"vite": "^6.3.1" "vite": "^6.3.1",
"vitest": "^2.1.9"
} }
} }
+1
View File
@@ -0,0 +1 @@
export {};
+31 -9
View File
@@ -1,24 +1,46 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "ES2020", "target": "ES2022",
"useDefineForClassFields": true, "useDefineForClassFields": true,
"module": "ESNext", "module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"], "lib": [
"ES2022",
"DOM"
],
"skipLibCheck": true, "skipLibCheck": true,
/* Bundler mode */ /* Bundler mode */
"moduleResolution": "bundler", "moduleResolution": "Node",
"allowImportingTsExtensions": true, "allowImportingTsExtensions": true,
"isolatedModules": true, "isolatedModules": true,
"moduleDetection": "force", "moduleDetection": "force",
"noEmit": true, "noEmit": false,
/* Linting */ /* Linting */
"strict": true, "strict": true,
"noImplicitAny": true,
"noImplicitThis": true,
"alwaysStrict": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"forceConsistentCasingInFileNames": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true,
"noUncheckedSideEffectImports": true "declaration": true,
"declarationMap": true,
"outDir": "dist",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"composite": false,
"types": [
"vitest"
]
}, },
"include": ["src"] "include": [
"src"
]
} }
+11
View File
@@ -0,0 +1,11 @@
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
coverage: {
reporter: ["text", "html", "lcov"],
include: ["src/**/*.ts"],
exclude: ["src/**/*.test.ts", "test/**"],
},
},
});