diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..1eba150 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + ci: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + + - run: pnpm install --frozen-lockfile + + - run: pnpm run lint + - run: pnpm run check-types + - run: pnpm run test + - run: pnpm run build diff --git a/eslint.config.js b/eslint.config.js index 6b406d5..d11f387 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,24 +1,14 @@ import baseConfig from "@vllnt/eslint-config/nodejs"; -import tsparser from "@typescript-eslint/parser"; -import { fileURLToPath } from "node:url"; -import { dirname, resolve } from "node:path"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); export default [ { - ignores: ["node_modules/**", "dist/**", "eslint.config.js", "*.config.*"], + ignores: [ + "node_modules/**", + "dist/**", + "eslint.config.js", + "*.config.*", + "tests/**", + ], }, ...baseConfig, - { - files: ["src/**/*.ts"], - languageOptions: { - parser: tsparser, - parserOptions: { - project: resolve(__dirname, "./tsconfig.json"), - tsconfigRootDir: __dirname, - }, - }, - }, ]; diff --git a/package.json b/package.json index ae189af..eeaa803 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@vllnt/logger", - "version": "1.0.0", + "version": "0.1.0", "type": "module", "description": "Structured logging for the @vllnt ecosystem", "license": "MIT", @@ -48,10 +48,13 @@ "@types/node": "^22.15.3", "@vllnt/eslint-config": "^1.0.0", "@vllnt/typescript": "^1.0.0", + "eslint": "^9.39.4", + "prettier": "^3.8.1", "tsup": "^8.4.0", "typescript": "^5.9.3", "vitest": "^3.1.1" }, + "packageManager": "pnpm@10.28.2", "pnpm": { "onlyBuiltDependencies": [ "esbuild" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6bf33f..b7d79ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,10 +13,16 @@ importers: version: 22.19.15 '@vllnt/eslint-config': specifier: ^1.0.0 - version: 1.0.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(convex@1.32.0)(eslint@9.39.3)(prettier@3.8.1)(turbo@2.8.14)(typescript@5.9.3) + version: 1.0.0(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(convex@1.32.0)(eslint@9.39.4)(prettier@3.8.1)(turbo@2.8.14)(typescript@5.9.3) '@vllnt/typescript': specifier: ^1.0.0 version: 1.0.0 + eslint: + specifier: ^9.39.4 + version: 9.39.4 + prettier: + specifier: ^3.8.1 + version: 3.8.1 tsup: specifier: ^8.4.0 version: 8.5.1(postcss@8.5.8)(typescript@5.9.3) @@ -427,8 +433,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': @@ -439,14 +445,18 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.4': - resolution: {integrity: sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.3': resolution: {integrity: sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1282,8 +1292,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.3: - resolution: {integrity: sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2507,10 +2517,10 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@boundaries/elements@1.2.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint@9.39.3)': + '@boundaries/elements@1.2.0(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)': dependencies: eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4) handlebars: 4.7.8 is-core-module: 2.16.1 micromatch: 4.0.8 @@ -2521,9 +2531,9 @@ snapshots: - eslint-import-resolver-webpack - supports-color - '@convex-dev/eslint-plugin@1.1.1(convex@1.32.0)(eslint@9.39.3)(typescript@5.9.3)': + '@convex-dev/eslint-plugin@1.1.1(convex@1.32.0)(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.49.0(eslint@9.39.3)(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.4)(typescript@5.9.3) convex: 1.32.0 transitivePeerDependencies: - eslint @@ -2686,14 +2696,14 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.3)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': dependencies: - eslint: 9.39.3 + eslint: 9.39.4 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 @@ -2709,7 +2719,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.4': + '@eslint/eslintrc@3.3.5': dependencies: ajv: 6.14.0 debug: 4.4.3 @@ -2725,6 +2735,8 @@ snapshots: '@eslint/js@9.39.3': {} + '@eslint/js@9.39.4': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.4.1': @@ -2870,15 +2882,15 @@ snapshots: dependencies: undici-types: 6.21.0 - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint@9.39.3)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.1(eslint@9.39.3)(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@9.39.4)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.3)(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.4)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.56.1 - eslint: 9.39.3 + eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -2886,14 +2898,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3)': + '@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.56.1 '@typescript-eslint/types': 8.56.1 '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.56.1 debug: 4.4.3 - eslint: 9.39.3 + eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2934,13 +2946,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.56.1(eslint@9.39.3)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.56.1(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.56.1 '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3)(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.4)(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.3 + eslint: 9.39.4 ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -2980,24 +2992,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.49.0(eslint@9.39.3)(typescript@5.9.3)': + '@typescript-eslint/utils@8.49.0(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/types': 8.49.0 '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) - eslint: 9.39.3 + eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.1(eslint@9.39.3)(typescript@5.9.3)': + '@typescript-eslint/utils@8.56.1(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@typescript-eslint/scope-manager': 8.56.1 '@typescript-eslint/types': 8.56.1 '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - eslint: 9.39.3 + eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -3054,27 +3066,27 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vllnt/eslint-config@1.0.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(convex@1.32.0)(eslint@9.39.3)(prettier@3.8.1)(turbo@2.8.14)(typescript@5.9.3)': + '@vllnt/eslint-config@1.0.0(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(convex@1.32.0)(eslint@9.39.4)(prettier@3.8.1)(turbo@2.8.14)(typescript@5.9.3)': dependencies: - '@convex-dev/eslint-plugin': 1.1.1(convex@1.32.0)(eslint@9.39.3)(typescript@5.9.3) + '@convex-dev/eslint-plugin': 1.1.1(convex@1.32.0)(eslint@9.39.4)(typescript@5.9.3) '@eslint/js': 9.39.3 '@next/eslint-plugin-next': 16.1.6 - eslint: 9.39.3 - eslint-config-prettier: 10.1.8(eslint@9.39.3) - eslint-plugin-boundaries: 5.4.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint@9.39.3) - eslint-plugin-css-modules: 2.12.0(eslint@9.39.3) - eslint-plugin-functional: 9.0.4(eslint@9.39.3)(typescript@5.9.3) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.3) - eslint-plugin-perfectionist: 5.6.0(eslint@9.39.3)(typescript@5.9.3) - eslint-plugin-prettier: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.3))(eslint@9.39.3)(prettier@3.8.1) - eslint-plugin-react: 7.37.5(eslint@9.39.3) - eslint-plugin-react-hooks: 7.0.1(eslint@9.39.3) - eslint-plugin-simple-import-sort: 12.1.1(eslint@9.39.3) - eslint-plugin-turbo: 2.8.14(eslint@9.39.3)(turbo@2.8.14) - eslint-plugin-unicorn: 62.0.0(eslint@9.39.3) + eslint: 9.39.4 + eslint-config-prettier: 10.1.8(eslint@9.39.4) + eslint-plugin-boundaries: 5.4.0(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4) + eslint-plugin-css-modules: 2.12.0(eslint@9.39.4) + eslint-plugin-functional: 9.0.4(eslint@9.39.4)(typescript@5.9.3) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4) + eslint-plugin-perfectionist: 5.6.0(eslint@9.39.4)(typescript@5.9.3) + eslint-plugin-prettier: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint@9.39.4)(prettier@3.8.1) + eslint-plugin-react: 7.37.5(eslint@9.39.4) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.4) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.39.4) + eslint-plugin-turbo: 2.8.14(eslint@9.39.4)(turbo@2.8.14) + eslint-plugin-unicorn: 62.0.0(eslint@9.39.4) eslint-plugin-write-good-comments: 0.2.0 prettier: 3.8.1 - typescript-eslint: 8.56.1(eslint@9.39.3)(typescript@5.9.3) + typescript-eslint: 8.56.1(eslint@9.39.4)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -3542,9 +3554,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.3): + eslint-config-prettier@10.1.8(eslint@9.39.4): dependencies: - eslint: 9.39.3 + eslint: 9.39.4 eslint-import-resolver-node@0.3.9: dependencies: @@ -3554,23 +3566,23 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@9.39.3)(typescript@5.9.3) - eslint: 9.39.3 + '@typescript-eslint/parser': 8.56.1(eslint@9.39.4)(typescript@5.9.3) + eslint: 9.39.4 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@5.4.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint@9.39.3): + eslint-plugin-boundaries@5.4.0(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4): dependencies: - '@boundaries/elements': 1.2.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint@9.39.3) + '@boundaries/elements': 1.2.0(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4) chalk: 4.1.2 - eslint: 9.39.3 + eslint: 9.39.4 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -3578,19 +3590,19 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-css-modules@2.12.0(eslint@9.39.3): + eslint-plugin-css-modules@2.12.0(eslint@9.39.4): dependencies: - eslint: 9.39.3 + eslint: 9.39.4 gonzales-pe: 4.3.0 lodash: 4.17.23 - eslint-plugin-functional@9.0.4(eslint@9.39.3)(typescript@5.9.3): + eslint-plugin-functional@9.0.4(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3)(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.4)(typescript@5.9.3) deepmerge-ts: 7.1.5 escape-string-regexp: 5.0.0 - eslint: 9.39.3 - is-immutable-type: 5.0.1(eslint@9.39.3)(typescript@5.9.3) + eslint: 9.39.4 + is-immutable-type: 5.0.1(eslint@9.39.4)(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) optionalDependencies: @@ -3598,7 +3610,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.3): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -3608,7 +3620,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.3 + eslint: 9.39.4 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -3617,36 +3629,36 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@5.6.0(eslint@9.39.3)(typescript@5.9.3): + eslint-plugin-perfectionist@5.6.0(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3)(typescript@5.9.3) - eslint: 9.39.3 + '@typescript-eslint/utils': 8.56.1(eslint@9.39.4)(typescript@5.9.3) + eslint: 9.39.4 natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.3))(eslint@9.39.3)(prettier@3.8.1): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint@9.39.4)(prettier@3.8.1): dependencies: - eslint: 9.39.3 + eslint: 9.39.4 prettier: 3.8.1 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.3) + eslint-config-prettier: 10.1.8(eslint@9.39.4) - eslint-plugin-react-hooks@7.0.1(eslint@9.39.3): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.4): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.0 - eslint: 9.39.3 + eslint: 9.39.4 hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.3): + eslint-plugin-react@7.37.5(eslint@9.39.4): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -3654,7 +3666,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.2 - eslint: 9.39.3 + eslint: 9.39.4 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -3668,26 +3680,26 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.3): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.4): dependencies: - eslint: 9.39.3 + eslint: 9.39.4 - eslint-plugin-turbo@2.8.14(eslint@9.39.3)(turbo@2.8.14): + eslint-plugin-turbo@2.8.14(eslint@9.39.4)(turbo@2.8.14): dependencies: dotenv: 16.0.3 - eslint: 9.39.3 + eslint: 9.39.4 turbo: 2.8.14 - eslint-plugin-unicorn@62.0.0(eslint@9.39.3): + eslint-plugin-unicorn@62.0.0(eslint@9.39.4): dependencies: '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@eslint/plugin-kit': 0.4.1 change-case: 5.4.4 ci-info: 4.4.0 clean-regexp: 1.0.0 core-js-compat: 3.48.0 - eslint: 9.39.3 + eslint: 9.39.4 esquery: 1.7.0 find-up-simple: 1.0.1 globals: 16.5.0 @@ -3716,15 +3728,15 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.3: + eslint@9.39.4: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.4 - '@eslint/js': 9.39.3 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 @@ -4020,10 +4032,10 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@5.0.1(eslint@9.39.3)(typescript@5.9.3): + is-immutable-type@5.0.1(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.3)(typescript@5.9.3) - eslint: 9.39.3 + '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.4)(typescript@5.9.3) + eslint: 9.39.4 ts-api-utils: 2.4.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) typescript: 5.9.3 @@ -4739,13 +4751,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.56.1(eslint@9.39.3)(typescript@5.9.3): + typescript-eslint@8.56.1(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3)(typescript@5.9.3))(eslint@9.39.3)(typescript@5.9.3) - '@typescript-eslint/parser': 8.56.1(eslint@9.39.3)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@9.39.4)(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3)(typescript@5.9.3) - eslint: 9.39.3 + '@typescript-eslint/utils': 8.56.1(eslint@9.39.4)(typescript@5.9.3) + eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: - supports-color diff --git a/src/backend.ts b/src/backend.ts index 250130d..d5a1e3d 100644 --- a/src/backend.ts +++ b/src/backend.ts @@ -2,15 +2,15 @@ * @vllnt/logger — Backend preset. * * Pre-configured logger for Node.js backends. - * Reads LOG_LEVEL from process.env lazily (no module-level side effects). + * Reads LOG_LEVEL from process.env on each call (no module-level side effects). */ import { consoleOutput, createExtendedLogger, - parseLogLevel, type ExtendedLogger, type LogLevel, + parseLogLevel, } from "./core.js"; const HAS_PROCESS = typeof process !== "undefined"; diff --git a/src/convex.ts b/src/convex.ts index f57d2b5..3430619 100644 --- a/src/convex.ts +++ b/src/convex.ts @@ -1,7 +1,7 @@ /** * @vllnt/logger — Convex-safe logger. * - * Imports ONLY from core.ts (no process.env, no crypto). + * Imports from core.ts (no process.env, no crypto). * Works in Convex queries, mutations, and actions. */ @@ -14,7 +14,7 @@ import { /** * Create a logger for Convex functions. - * Level must be passed explicitly (Convex has no process.env in queries/mutations). + * Pass level explicitly (Convex has no process.env in queries/mutations). * Defaults to "info". */ export function createConvexLogger( diff --git a/src/core.ts b/src/core.ts index 151bc6a..128d340 100644 --- a/src/core.ts +++ b/src/core.ts @@ -52,9 +52,9 @@ export type LoggerConfig = { const LOG_LEVEL_PRIORITY: Record = { debug: 0, + error: 3, info: 1, warn: 2, - error: 3, }; function shouldLog(level: LogLevel, configuredLevel: LogLevel): boolean { @@ -119,70 +119,73 @@ export function createLogger(scope: string, config: LoggerConfig): Logger { }; } -/** - * Create an extended logger with timing helpers. - * - * @remarks Caught errors are logged with `error.message` verbatim. - * Callers handling sensitive errors should sanitize before throwing. - */ -export function createExtendedLogger( - scope: string, - config: LoggerConfig, -): ExtendedLogger { - const base = createLogger(scope, config); +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} - const withTiming = async ( +function createWithTiming(base: Logger): ExtendedLogger["withTiming"] { + return async ( label: string, execute: () => Promise, extraData?: LogData, ): Promise => { const start = Date.now(); base.info(`${label}.start`, extraData); - try { const result = await execute(); - const durationMs = Date.now() - start; - base.info(`${label}.complete`, { ...extraData, durationMs }); + base.info(`${label}.complete`, { + ...extraData, + durationMs: Date.now() - start, + }); return result; } catch (error) { - const durationMs = Date.now() - start; base.error(`${label}.error`, { ...extraData, - durationMs, - error: error instanceof Error ? error.message : String(error), + durationMs: Date.now() - start, + error: formatError(error), }); throw error; } }; +} - const withTimingSync = ( - label: string, - execute: () => T, - extraData?: LogData, - ): T => { +function createWithTimingSync(base: Logger): ExtendedLogger["withTimingSync"] { + return (label: string, execute: () => T, extraData?: LogData): T => { const start = Date.now(); base.info(`${label}.start`, extraData); - try { const result = execute(); - const durationMs = Date.now() - start; - base.info(`${label}.complete`, { ...extraData, durationMs }); + base.info(`${label}.complete`, { + ...extraData, + durationMs: Date.now() - start, + }); return result; } catch (error) { - const durationMs = Date.now() - start; base.error(`${label}.error`, { ...extraData, - durationMs, - error: error instanceof Error ? error.message : String(error), + durationMs: Date.now() - start, + error: formatError(error), }); throw error; } }; +} +/** + * Create an extended logger with timing helpers. + * + * @remarks Caught errors use `error.message` verbatim. + * Callers handling sensitive errors should sanitize before throwing. + */ +export function createExtendedLogger( + scope: string, + config: LoggerConfig, +): ExtendedLogger { + const base = createLogger(scope, config); return { ...base, - withTiming, - withTimingSync, + withTiming: createWithTiming(base), + withTimingSync: createWithTimingSync(base), }; } @@ -195,7 +198,7 @@ export function consoleOutput(entry: LogEntry): void { try { message = JSON.stringify(entry); } catch { - message = `[logger:serialize-error] event=${String(entry.event)} level=${String(entry.level)}`; + message = `[logger:serialize-error] event=${entry.event} level=${entry.level}`; } switch (entry.level) { @@ -212,23 +215,20 @@ export function consoleOutput(entry: LogEntry): void { console.warn(message); break; default: - console.log(message); + console.info(message); break; } } -/** - * Compose multiple outputs into a single LogOutput. - * Each output is isolated — if one throws, others still execute. - */ +/** Compose outputs into a single LogOutput. Each output runs in isolation. */ export function composeOutputs(...outputs: LogOutput[]): LogOutput { return (entry: LogEntry): void => { - for (const output of outputs) { + outputs.forEach((output) => { try { output(entry); } catch { // Isolated — other outputs continue } - } + }); }; } diff --git a/src/index.ts b/src/index.ts index 3b7f156..38aaa37 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,20 +4,19 @@ * Core exports + backend preset. */ +export { createBackendLogger } from "./backend.js"; export { composeOutputs, consoleOutput, createExtendedLogger, createLogger, - formatLogEntry, - parseLogLevel, type ExtendedLogger, + formatLogEntry, type LogData, type LogEntry, type Logger, type LoggerConfig, type LogLevel, type LogOutput, + parseLogLevel, } from "./core.js"; - -export { createBackendLogger } from "./backend.js";